diff --git a/packages/core/client/src/collection-manager/interfaces/password.ts b/packages/core/client/src/collection-manager/interfaces/password.ts index 799f0ead9c..5216a5a7fc 100644 --- a/packages/core/client/src/collection-manager/interfaces/password.ts +++ b/packages/core/client/src/collection-manager/interfaces/password.ts @@ -16,7 +16,7 @@ export class PasswordFieldInterface extends CollectionFieldInterface { 'x-component': 'Password', }, }; - availableTypes = ['password']; + availableTypes = ['password', 'string']; hasDefaultValue = true; properties = { ...defaultProps, diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/CollectionFields.tsx b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/CollectionFields.tsx index b3920df3d7..27259ea7d8 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/CollectionFields.tsx +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/CollectionFields.tsx @@ -84,6 +84,32 @@ export const CollectionFields = () => { }; const dm = useDataSourceManager(); + + let isProcessing = false; + const queue = []; + + const processQueue = async () => { + if (isProcessing) return; + if (queue.length === 0) return; + + isProcessing = true; + const { value, filterByTk, flag } = queue.shift(); + + try { + await handleFieldChange(value, filterByTk, flag); + } catch (error) { + console.error('Error processing handleFieldChange:', error); + } finally { + isProcessing = false; + processQueue(); + } + }; + + const enqueueChange = (value, filterByTk, flag) => { + queue.push({ value, filterByTk, flag }); + processQueue(); + }; + const handleFieldChange = async (value, filterByTk, flag = true) => { await api.request({ url: `dataSourcesCollections/${dataSourceKey}.${name}/fields:update?filterByTk=${filterByTk}`, @@ -173,7 +199,7 @@ export const CollectionFields = () => { scope={{ useDataSource, useTitleFieldProps, - handleFieldChange, + enqueueChange, useDestroyActionAndRefreshCM, useBulkDestroyActionAndRefreshCM, loadCollections, diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/components/CollectionFieldInterfaceSelect.tsx b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/components/CollectionFieldInterfaceSelect.tsx index 9699e66499..6f80fb5862 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/components/CollectionFieldInterfaceSelect.tsx +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/components/CollectionFieldInterfaceSelect.tsx @@ -1,7 +1,12 @@ import { observer, useForm, useField } from '@formily/react'; import { Select, Tag } from 'antd'; import React, { useEffect, useState } from 'react'; -import { useCompile, useCollectionManager_deprecated, useRecord, useFieldInterfaceOptions } from '@nocobase/client'; +import { + useCompile, + useCollectionManager_deprecated, + useFieldInterfaceOptions, + useCollectionRecord, +} from '@nocobase/client'; const getInterfaceOptions = (data, type) => { const interfaceOptions = []; @@ -26,17 +31,14 @@ const isValueInOptions = (value, options) => { export const CollectionFieldInterfaceSelect = observer( (props: any) => { const { value, handleFieldChange } = props; - const record = useRecord(); + const { data: record } = useCollectionRecord() as any; const { getInterface } = useCollectionManager_deprecated(); const compile = useCompile(); const initOptions = useFieldInterfaceOptions(); const data = getInterfaceOptions(initOptions, record.type); - const form = useForm(); - const field = useField(); const [selectValue, setSelectValue] = useState(value); const [options, setOptions] = useState(data); - const targetRecord = Object.values(form.values)?.[0]?.[field.index]; - const targetType = targetRecord?.type || record.type; + const targetType = record.type; useEffect(() => { //只有一个选项的时候选中该选项 if (options.length === 1 && options[0]?.children?.length === 1) { @@ -71,8 +73,6 @@ export const CollectionFieldInterfaceSelect = observer( useEffect(() => { if (record?.possibleTypes) { - const targetRecord = Object.values(form.values)?.[0]?.[field.index]; - const targetType = targetRecord?.type || record.type; const newOptions = getInterfaceOptions(initOptions, targetType); setOptions(newOptions); } diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/schema/collectionFields.ts b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/schema/collectionFields.ts index ba1d4cbd21..869bc6723d 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/schema/collectionFields.ts +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/client/component/CollectionsManager/schema/collectionFields.ts @@ -142,7 +142,7 @@ export const fieldsTableSchema: ISchema = { type: 'string', 'x-component': 'FieldTitleInput', 'x-component-props': { - handleFieldChange: '{{handleFieldChange}}', + handleFieldChange: '{{enqueueChange}}', }, }, }, @@ -167,7 +167,7 @@ export const fieldsTableSchema: ISchema = { type: { 'x-component': 'FieldType', 'x-component-props': { - handleFieldChange: '{{handleFieldChange}}', + handleFieldChange: '{{enqueueChange}}', }, }, }, @@ -181,7 +181,7 @@ export const fieldsTableSchema: ISchema = { interface: { 'x-component': 'CollectionFieldInterfaceSelect', 'x-component-props': { - handleFieldChange: '{{handleFieldChange}}', + handleFieldChange: '{{enqueueChange}}', }, }, },