From 9fe1775ca3247069d1e80573ec83b613a8a91942 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Wed, 13 Nov 2024 19:09:02 +0800 Subject: [PATCH] chore: support update field attribute in collection (#5643) --- .../data-source-manager/src/collection.ts | 9 +++++++++ .../core/data-source-manager/src/types.ts | 2 ++ packages/core/database/src/collection.ts | 4 ++++ .../server/models/data-sources-field-model.ts | 18 +++++++++++++++-- .../data-sources-collections-fields.ts | 20 ++++++++++--------- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/packages/core/data-source-manager/src/collection.ts b/packages/core/data-source-manager/src/collection.ts index c3d7a592cb..d4ed2c870d 100644 --- a/packages/core/data-source-manager/src/collection.ts +++ b/packages/core/data-source-manager/src/collection.ts @@ -76,6 +76,15 @@ export class Collection implements ICollection { return this.fields.get(name); } + getFieldByField(field: string): IField { + for (const item of this.fields.values()) { + if (item.options.field === field) { + return item; + } + } + return null; + } + getFields() { return [...this.fields.values()]; } diff --git a/packages/core/data-source-manager/src/types.ts b/packages/core/data-source-manager/src/types.ts index 5a9b7cef85..3609297ea0 100644 --- a/packages/core/data-source-manager/src/types.ts +++ b/packages/core/data-source-manager/src/types.ts @@ -65,6 +65,8 @@ export interface ICollection { getField(name: string): IField; + getFieldByField(field: string): IField; + [key: string]: any; unavailableActions?: () => string[]; diff --git a/packages/core/database/src/collection.ts b/packages/core/database/src/collection.ts index 943417e43f..e6ecd56ed2 100644 --- a/packages/core/database/src/collection.ts +++ b/packages/core/database/src/collection.ts @@ -369,6 +369,10 @@ export class Collection< return this.fields.get(name); } + getFieldByField(field: string): Field { + return this.findField((f) => f.options.field === field); + } + getFields() { return [...this.fields.values()]; } diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/server/models/data-sources-field-model.ts b/packages/plugins/@nocobase/plugin-data-source-manager/src/server/models/data-sources-field-model.ts index c4b3ca74e3..ce81a033f3 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/server/models/data-sources-field-model.ts +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/server/models/data-sources-field-model.ts @@ -20,13 +20,27 @@ export class DataSourcesFieldModel extends MagicAttributeModel { const { app } = loadOptions; const options = this.get(); - const { collectionName, name, dataSourceKey } = options; + const { collectionName, name, dataSourceKey, field } = options; const dataSource = app.dataSourceManager.dataSources.get(dataSourceKey); const collection = dataSource.collectionManager.getCollection(collectionName); - const oldField = collection.getField(name); + + const oldFieldByName = collection.getField(name); + const oldFieldByField = field ? collection.getFieldByField(field) : null; + + const oldField = oldFieldByField || oldFieldByName; const newOptions = mergeOptions(oldField ? oldField.options : {}, options); collection.setField(name, newOptions); + + if (oldFieldByField && !oldFieldByName) { + const filedShouldRemove = collection + .getFields() + .filter((f) => f.options.field === field && f.options.name !== name); + + for (const f of filedShouldRemove) { + collection.removeField(f.options.name); + } + } } unload(loadOptions: LoadOptions) { diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections-fields.ts b/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections-fields.ts index 61a9aff450..eee7934032 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections-fields.ts +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections-fields.ts @@ -67,20 +67,22 @@ export default { }, }); } else { - await mainDb.getRepository('dataSourcesFields').update({ - filter: { - name, - collectionName, - dataSourceKey, - }, - values, - }); + fieldRecord = ( + await mainDb.getRepository('dataSourcesFields').update({ + filter: { + name, + collectionName, + dataSourceKey, + }, + values, + }) + )[0]; } const field = ctx.app.dataSourceManager.dataSources .get(dataSourceKey) .collectionManager.getCollection(collectionName) - .getField(name); + .getField(fieldRecord.get('name')); ctx.body = field.options;