diff --git a/packages/core/client/src/schema-component/antd/remote-select/RemoteSelect.tsx b/packages/core/client/src/schema-component/antd/remote-select/RemoteSelect.tsx index b7e59590d8..f88aaf20a0 100644 --- a/packages/core/client/src/schema-component/antd/remote-select/RemoteSelect.tsx +++ b/packages/core/client/src/schema-component/antd/remote-select/RemoteSelect.tsx @@ -23,6 +23,7 @@ export type RemoteSelectProps
= SelectProps
& { mapOptions?: (data: any) => RemoteSelectProps['fieldNames']; targetField?: any; service: ResourceActionOptions
; + dataSource?: string; CustomDropdownRender?: (v: any) => any; optionFilter?: (option: any) => boolean; }; @@ -41,10 +42,11 @@ const InternalRemoteSelect = connect( targetField: _targetField, CustomDropdownRender, optionFilter, + dataSource: propsDataSource, ...others } = props; const dataSource = useDataSourceKey(); - const headers = useDataSourceHeaders(dataSource); + const headers = useDataSourceHeaders(propsDataSource || dataSource); const [open, setOpen] = useState(false); const firstRun = useRef(false); const fieldSchema = useFieldSchema(); diff --git a/packages/core/data-source-manager/src/data-source-manager.ts b/packages/core/data-source-manager/src/data-source-manager.ts index d1826adfe5..f34cfbc9ab 100644 --- a/packages/core/data-source-manager/src/data-source-manager.ts +++ b/packages/core/data-source-manager/src/data-source-manager.ts @@ -17,6 +17,10 @@ export class DataSourceManager { this.middlewares = []; } + get(dataSourceKey: string) { + return this.dataSources.get(dataSourceKey); + } + async add(dataSource: DataSource, options: any = {}) { await dataSource.load(options); this.dataSources.set(dataSource.name, dataSource); diff --git a/packages/plugins/@nocobase/plugin-custom-request/src/client/components/CustomRequestActionDesigner.tsx b/packages/plugins/@nocobase/plugin-custom-request/src/client/components/CustomRequestActionDesigner.tsx index c0d24954b4..77e537ed61 100644 --- a/packages/plugins/@nocobase/plugin-custom-request/src/client/components/CustomRequestActionDesigner.tsx +++ b/packages/plugins/@nocobase/plugin-custom-request/src/client/components/CustomRequestActionDesigner.tsx @@ -6,6 +6,7 @@ import { SchemaSettingsActionModalItem, actionSettingsItems, useCollection_deprecated, + useDataSourceKey, useRequest, } from '@nocobase/client'; import { App } from 'antd'; @@ -19,6 +20,7 @@ import { CustomRequestACLSchema, CustomRequestConfigurationFieldsSchema } from ' export function CustomRequestSettingsItem() { const { t } = useTranslation(); const { name } = useCollection_deprecated(); + const dataSourceKey = useDataSourceKey(); const fieldSchema = useFieldSchema(); const customRequestsResource = useCustomRequestsResource(); const { message } = App.useApp(); @@ -45,6 +47,7 @@ export function CustomRequestSettingsItem() { options: { ...requestSettings, collectionName: name, + dataSourceKey, }, }, filterKeys: ['key'], diff --git a/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomRequestVariableOptions.ts b/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomRequestVariableOptions.ts index 8cb279581b..b692074ce3 100644 --- a/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomRequestVariableOptions.ts +++ b/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomRequestVariableOptions.ts @@ -1,4 +1,9 @@ -import { useCollection_deprecated, useCollectionFilterOptions, useCompile } from '@nocobase/client'; +import { + DEFAULT_DATA_SOURCE_KEY, + useCollection_deprecated, + useCollectionFilterOptions, + useCompile, +} from '@nocobase/client'; import { useMemo } from 'react'; import { useTranslation } from '../locale'; @@ -6,7 +11,7 @@ export const useCustomRequestVariableOptions = () => { const collection = useCollection_deprecated(); const { t } = useTranslation(); const fieldsOptions = useCollectionFilterOptions(collection); - const userFieldOptions = useCollectionFilterOptions('users'); + const userFieldOptions = useCollectionFilterOptions('users', DEFAULT_DATA_SOURCE_KEY); const compile = useCompile(); const [fields, userFields] = useMemo(() => { diff --git a/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts b/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts index 51047563b1..bcdd428af3 100644 --- a/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts +++ b/packages/plugins/@nocobase/plugin-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts @@ -1,15 +1,7 @@ import { useField, useFieldSchema, useForm } from '@formily/react'; -import { - TableFieldResource, - useAPIClient, - useActionContext, - useBlockRequestContext, - useCollection_deprecated, - useCompile, - useRecord, -} from '@nocobase/client'; -import { App } from 'antd'; +import { useAPIClient, useActionContext, useCompile, useDataSourceKey, useRecord } from '@nocobase/client'; import { isURL } from '@nocobase/utils/client'; +import { App } from 'antd'; import { useNavigate } from 'react-router-dom'; export const useCustomizeRequestActionProps = () => { @@ -18,13 +10,13 @@ export const useCustomizeRequestActionProps = () => { const actionSchema = useFieldSchema(); const compile = useCompile(); const form = useForm(); - const { getPrimaryKey } = useCollection_deprecated(); - const { resource, __parent, service } = useBlockRequestContext(); + // const { getPrimaryKey } = useCollection_deprecated(); const record = useRecord(); const fieldSchema = useFieldSchema(); const actionField = useField(); const { setVisible } = useActionContext(); const { modal, message } = App.useApp(); + const dataSourceKey = useDataSourceKey(); return { async onClick(e?, callBack?) { const { skipValidator, onSuccess } = actionSchema?.['x-action-settings'] ?? {}; @@ -33,7 +25,7 @@ export const useCustomizeRequestActionProps = () => { await form.submit(); } - let formValues = {}; + let formValues = { ...record }; if (xAction === 'customize:form:request') { formValues = form.values; } @@ -46,16 +38,14 @@ export const useCustomizeRequestActionProps = () => { method: 'POST', data: { currentRecord: { - id: record[getPrimaryKey()], - appends: service.params[0]?.appends, + // id: record[getPrimaryKey()], + // appends: result.params[0]?.appends, + dataSourceKey, data: formValues, }, }, }); actionField.data.loading = false; - if (!(resource instanceof TableFieldResource)) { - __parent?.service?.refresh?.(); - } // service?.refresh?.(); if (callBack) { callBack?.(); diff --git a/packages/plugins/@nocobase/plugin-custom-request/src/client/schemas/CustomRequestACL.ts b/packages/plugins/@nocobase/plugin-custom-request/src/client/schemas/CustomRequestACL.ts index a15dc7a06f..6b2e10471a 100644 --- a/packages/plugins/@nocobase/plugin-custom-request/src/client/schemas/CustomRequestACL.ts +++ b/packages/plugins/@nocobase/plugin-custom-request/src/client/schemas/CustomRequestACL.ts @@ -1,3 +1,4 @@ +import { DEFAULT_DATA_SOURCE_KEY } from '@nocobase/client'; import { generateNTemplate } from '../locale'; export const CustomRequestACLSchema = { @@ -14,6 +15,7 @@ export const CustomRequestACLSchema = { 'x-component-props': { multiple: true, objectValue: true, + dataSource: DEFAULT_DATA_SOURCE_KEY, service: { resource: 'roles', }, diff --git a/packages/plugins/@nocobase/plugin-custom-request/src/server/actions/send.ts b/packages/plugins/@nocobase/plugin-custom-request/src/server/actions/send.ts index 9569dcbacd..77adc42500 100644 --- a/packages/plugins/@nocobase/plugin-custom-request/src/server/actions/send.ts +++ b/packages/plugins/@nocobase/plugin-custom-request/src/server/actions/send.ts @@ -2,6 +2,7 @@ import { Context, Next } from '@nocobase/actions'; import { parse } from '@nocobase/utils'; import { appendArrayColumn } from '@nocobase/evaluators'; +import Application from '@nocobase/server'; import axios from 'axios'; import CustomRequestPlugin from '../plugin'; @@ -46,7 +47,8 @@ const getCurrentUserAppends = (str: string, user) => { }; export async function send(this: CustomRequestPlugin, ctx: Context, next: Next) { - const { filterByTk, resourceName, values = {} } = ctx.action.params; + const resourceName = ctx.action.resourceName; + const { filterByTk, values = {} } = ctx.action.params; const { currentRecord = { id: 0, @@ -70,7 +72,6 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next) } } } - const repo = ctx.db.getRepository(resourceName); const requestConfig = await repo.findOne({ filter: { @@ -84,13 +85,23 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next) ctx.withoutDataWrapping = true; - const { collectionName, url, headers = [], params = [], data = {}, ...options } = requestConfig.options || {}; + const { + dataSourceKey, + collectionName, + url, + headers = [], + params = [], + data = {}, + ...options + } = requestConfig.options || {}; if (!url) { return ctx.throw(400, ctx.t('Please configure the request settings first', { ns: 'custom-request' })); } let currentRecordValues = {}; if (collectionName && typeof currentRecord.id !== 'undefined') { - const recordRepo = ctx.db.getRepository(collectionName); + const app = ctx.app as Application; + const dataSource = app.dataSourceManager.get(dataSourceKey || currentRecord.dataSourceKey || 'main'); + const recordRepo = dataSource.collectionManager.getRepository(collectionName); currentRecordValues = ( await recordRepo.findOne({