diff --git a/fyo/model/doc.ts b/fyo/model/doc.ts index ea16882d..3dd9db93 100644 --- a/fyo/model/doc.ts +++ b/fyo/model/doc.ts @@ -799,6 +799,7 @@ export class Doc extends Observable { static lists: ListsMap = {}; static filters: FiltersMap = {}; + static createFilters: FiltersMap = {}; // Used by the *Create* dropdown option static defaults: DefaultMap = {}; static emptyMessages: EmptyMessageMap = {}; diff --git a/models/baseModels/Invoice/Invoice.ts b/models/baseModels/Invoice/Invoice.ts index c1a78b50..650f50a6 100644 --- a/models/baseModels/Invoice/Invoice.ts +++ b/models/baseModels/Invoice/Invoice.ts @@ -229,4 +229,10 @@ export abstract class Invoice extends Transactional { }), numberSeries: (doc: Doc) => ({ referenceType: doc.schemaName }), }; + + static createFilters: FiltersMap = { + party: (doc: Doc) => ({ + role: doc.isSales ? 'Customer' : 'Supplier', + }), + }; } diff --git a/models/baseModels/InvoiceItem/InvoiceItem.ts b/models/baseModels/InvoiceItem/InvoiceItem.ts index e1564129..6025f9ae 100644 --- a/models/baseModels/InvoiceItem/InvoiceItem.ts +++ b/models/baseModels/InvoiceItem/InvoiceItem.ts @@ -115,4 +115,9 @@ export abstract class InvoiceItem extends Doc { }; }, }; + static createFilters: FiltersMap = { + item: (doc: Doc) => { + return { for: doc.isSales ? 'Sales' : 'Purchases' }; + }, + }; } diff --git a/models/baseModels/Party/Party.ts b/models/baseModels/Party/Party.ts index 932df43d..88591cc7 100644 --- a/models/baseModels/Party/Party.ts +++ b/models/baseModels/Party/Party.ts @@ -89,19 +89,6 @@ export class Party extends Doc { currency: { formula: async () => this.fyo.singles.SystemSettings!.currency as string, }, - address: { - formula: async () => { - const address = this.address as string | undefined; - if (address) { - return (await this.fyo.getValue( - 'Address', - address, - 'addressDisplay' - )) as string; - } - return ''; - }, - }, }; validations: ValidationMap = { diff --git a/schemas/app/PurchaseInvoice.json b/schemas/app/PurchaseInvoice.json index 7ae099f1..78b673e6 100644 --- a/schemas/app/PurchaseInvoice.json +++ b/schemas/app/PurchaseInvoice.json @@ -24,6 +24,7 @@ "label": "Party", "fieldtype": "Link", "target": "Party", + "create": true, "required": true }, { @@ -31,6 +32,7 @@ "label": "Account", "fieldtype": "Link", "target": "Account", + "create": true, "required": true }, { @@ -101,6 +103,7 @@ "label": "Number Series", "fieldtype": "Link", "target": "NumberSeries", + "create": true, "required": true, "default": "PINV-" } diff --git a/schemas/app/PurchaseInvoiceItem.json b/schemas/app/PurchaseInvoiceItem.json index df6eadbc..88f866dd 100644 --- a/schemas/app/PurchaseInvoiceItem.json +++ b/schemas/app/PurchaseInvoiceItem.json @@ -8,6 +8,7 @@ "label": "Item", "fieldtype": "Link", "target": "Item", + "create": true, "required": true }, { @@ -40,6 +41,7 @@ "label": "Account", "fieldtype": "Link", "target": "Account", + "create": true, "required": true, "readOnly": true }, @@ -47,6 +49,7 @@ "fieldname": "tax", "label": "Tax", "fieldtype": "Link", + "create": true, "target": "Tax" }, { diff --git a/schemas/app/SalesInvoice.json b/schemas/app/SalesInvoice.json index 4bbe22ae..ddb0829c 100644 --- a/schemas/app/SalesInvoice.json +++ b/schemas/app/SalesInvoice.json @@ -23,6 +23,7 @@ "label": "Party", "fieldtype": "Link", "target": "Party", + "create": true, "required": true }, { @@ -30,6 +31,7 @@ "label": "Account", "fieldtype": "Link", "target": "Account", + "create": true, "required": true }, { @@ -100,6 +102,7 @@ "label": "Number Series", "fieldtype": "Link", "target": "NumberSeries", + "create": true, "required": true, "default": "SINV-" } diff --git a/schemas/app/SalesInvoiceItem.json b/schemas/app/SalesInvoiceItem.json index 81cec3c6..582fbb53 100644 --- a/schemas/app/SalesInvoiceItem.json +++ b/schemas/app/SalesInvoiceItem.json @@ -8,6 +8,7 @@ "label": "Item", "fieldtype": "Link", "target": "Item", + "create": true, "required": true }, { @@ -41,6 +42,7 @@ "hidden": true, "fieldtype": "Link", "target": "Account", + "create": true, "required": true, "readOnly": true }, @@ -48,6 +50,7 @@ "fieldname": "tax", "label": "Tax", "fieldtype": "Link", + "create": true, "target": "Tax" }, { diff --git a/schemas/app/TaxDetail.json b/schemas/app/TaxDetail.json index d98a1a1e..b286aac3 100644 --- a/schemas/app/TaxDetail.json +++ b/schemas/app/TaxDetail.json @@ -9,6 +9,7 @@ "label": "Tax Account", "fieldtype": "Link", "target": "Account", + "create": true, "required": true }, { diff --git a/schemas/tests/Party.json b/schemas/tests/Party.json index a95fb656..121a7065 100644 --- a/schemas/tests/Party.json +++ b/schemas/tests/Party.json @@ -41,6 +41,7 @@ "fieldname": "defaultAccount", "label": "Default Account", "fieldtype": "Link", + "create": true, "target": "Account" }, { diff --git a/schemas/types.ts b/schemas/types.ts index 113232d1..7954852f 100644 --- a/schemas/types.ts +++ b/schemas/types.ts @@ -49,6 +49,7 @@ export interface OptionField extends BaseField { export interface TargetField extends BaseField { fieldtype: FieldTypeEnum.Table | FieldTypeEnum.Link; target: string; // Name of the table or group of tables to fetch values + create?: boolean; // Whether to show Create in the dropdown } export interface DynamicLinkField extends BaseField { diff --git a/src/components/Controls/Link.vue b/src/components/Controls/Link.vue index d5aafe37..ff012849 100644 --- a/src/components/Controls/Link.vue +++ b/src/components/Controls/Link.vue @@ -77,7 +77,7 @@ export default { .map(({ item }) => item); } - if (this.doc) { + if (this.doc && this.df.create) { options = options.concat(this.getCreateNewOption()); } @@ -119,7 +119,9 @@ export default { async openNewDoc() { const schemaName = this.df.target; const doc = await fyo.doc.getNewDoc(schemaName); - const filters = await this.getFilters(); + + const filters = await this.getCreateFilters(); + const { openQuickEdit } = await import('src/utils/ui'); openQuickEdit({ @@ -135,6 +137,17 @@ export default { this.$router.back(); }); }, + async getCreateFilters() { + const { schemaName, fieldname } = this.df; + const getFilters = fyo.models[schemaName]?.createFilters?.[fieldname]; + const filters = await getFilters?.(this.doc); + + if (filters === undefined) { + return await this.getFilters(); + } + + return filters; + }, async getFilters() { const { schemaName, fieldname } = this.df; const getFilters = fyo.models[schemaName]?.filters?.[fieldname]; diff --git a/src/components/TwoColumnForm.vue b/src/components/TwoColumnForm.vue index 2c53ddac..c22b869b 100644 --- a/src/components/TwoColumnForm.vue +++ b/src/components/TwoColumnForm.vue @@ -36,7 +36,7 @@ @@ -237,9 +237,6 @@ export default { this.inlineEditField = df; if (!this.doc[df.fieldname]) { this.inlineEditDoc = await fyo.doc.getNewDoc(df.target); - this.inlineEditDoc.once('afterSync', async () => { - await this.onChangeCommon(df, this.inlineEditDoc.name); - }); } else { this.inlineEditDoc = this.doc.getLink(df.fieldname); } @@ -251,12 +248,13 @@ export default { fyo.getField(df.target, fieldname) ); }, - async saveInlineEditDoc() { + async saveInlineEditDoc(df) { if (!this.inlineEditDoc) { return; } - await this.$refs.inlineEditForm[0].sync(); + await this.inlineEditDoc.sync(); + await this.onChangeCommon(df, this.inlineEditDoc.name); await this.doc.loadLinks(); if (this.emitChange) {