diff --git a/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts b/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts index d684443399..ecbb9205a0 100644 --- a/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts +++ b/packages/core/client/src/modules/popup/__e2e__/schemaInitializer.test.ts @@ -57,6 +57,7 @@ test.describe('add blocks to the popup', () => { await page.getByRole('menuitem', { name: 'Details right' }).hover(); await page.getByRole('menuitem', { name: 'Associated records' }).last().hover(); await page.getByRole('menuitem', { name: 'Roles' }).click(); + await page.mouse.move(300, 0); await page.getByLabel('schema-initializer-Grid-details:configureFields-roles').hover(); await page.getByRole('menuitem', { name: 'Role UID' }).click(); await page.mouse.move(300, 0); diff --git a/packages/core/client/src/modules/popup/__e2e__/subPage.test.ts b/packages/core/client/src/modules/popup/__e2e__/subPage.test.ts index 4d48df81f3..e0bfad2db1 100644 --- a/packages/core/client/src/modules/popup/__e2e__/subPage.test.ts +++ b/packages/core/client/src/modules/popup/__e2e__/subPage.test.ts @@ -71,7 +71,7 @@ test.describe('sub page', () => { expect(page.url()).not.toContain('/popups/'); // 确认是否回到了主页面 - await page.getByText('Users单层子页面Configure').hover(); + // await page.getByText('Users单层子页面Configure').hover(); await expect( page.getByRole('button', { name: 'designer-schema-settings-CardItem-blockSettings:table-users' }), ).toBeVisible(); diff --git a/packages/core/client/src/schema-component/antd/action/Action.tsx b/packages/core/client/src/schema-component/antd/action/Action.tsx index 38b6802b4d..bacd353998 100644 --- a/packages/core/client/src/schema-component/antd/action/Action.tsx +++ b/packages/core/client/src/schema-component/antd/action/Action.tsx @@ -57,7 +57,7 @@ import { useAllDataBlocks } from '../page/AllDataBlocksProvider'; const useA = () => { return { - async run() { }, + async run() {}, }; }; @@ -139,23 +139,26 @@ export const Action: ComposedAction = withDynamicSchemaProps( ); const handleClick = useMemo(() => { - return onClick && (async (e, callback) => { - await onClick?.(e, callback); + return ( + onClick && + (async (e, callback) => { + await onClick?.(e, callback); - // 执行完 onClick 之后,刷新数据区块 - const blocksToRefresh = fieldSchema['x-action-settings']?.onSuccess?.blocksToRefresh || [] - if (blocksToRefresh.length > 0) { - getAllDataBlocks().forEach((block) => { - if (blocksToRefresh.includes(block.uid)) { - try { - block.service?.refresh(); - } catch (error) { - console.error('Failed to refresh block:', block.uid, error); + // 执行完 onClick 之后,刷新数据区块 + const blocksToRefresh = fieldSchema['x-action-settings']?.onSuccess?.blocksToRefresh || []; + if (blocksToRefresh.length > 0) { + getAllDataBlocks().forEach((block) => { + if (blocksToRefresh.includes(block.uid)) { + try { + block.service?.refresh(); + } catch (error) { + console.error('Failed to refresh block:', block.uid, error); + } } - } - }); - } - }); + }); + } + }) + ); }, [onClick, fieldSchema, getAllDataBlocks]); return ( diff --git a/packages/core/client/src/schema-settings/SchemaSettings.tsx b/packages/core/client/src/schema-settings/SchemaSettings.tsx index c4154f68b4..bf44536334 100644 --- a/packages/core/client/src/schema-settings/SchemaSettings.tsx +++ b/packages/core/client/src/schema-settings/SchemaSettings.tsx @@ -365,8 +365,8 @@ export const SchemaSettingsFormItemTemplate = function FormItemTemplate(props) { required: true, default: collection ? `${compile(collection?.title || collection?.name)}_${t( - componentTitle[componentName] || componentName, - )}` + componentTitle[componentName] || componentName, + )}` : t(componentTitle[componentName] || componentName), 'x-decorator': 'FormItem', 'x-component': 'Input', @@ -567,7 +567,7 @@ export const SchemaSettingsRemove: FC = (props) => { export interface SchemaSettingsSelectItemProps extends Omit, - Omit { + Omit { value?: SelectWithTitleProps['defaultValue']; optionRender?: (option: any, info: { index: number }) => React.ReactNode; } @@ -900,26 +900,32 @@ export const SchemaSettingsModalItem: FC = (props) > - + - + 576px - @media (min-width: 576px) { - min-width: 520px; - } + // screen > 576px + @media (min-width: 576px) { + min-width: 520px; + } - // screen <= 576px - @media (max-width: 576px) { - min-width: 320px; - } - `} + // screen <= 576px + @media (max-width: 576px) { + min-width: 320px; + } + `} > @@ -984,13 +990,13 @@ export const SchemaSettingsDefaultSortingRules = function DefaultSortingRules(pr const sort = defaultSort?.map((item: string) => { return item.startsWith('-') ? { - field: item.substring(1), - direction: 'desc', - } + field: item.substring(1), + direction: 'desc', + } : { - field: item, - direction: 'asc', - }; + field: item, + direction: 'asc', + }; }); const sortFields = useSortFields(props.name || collection?.name); diff --git a/packages/core/client/src/schema-settings/VariableInput/hooks/index.ts b/packages/core/client/src/schema-settings/VariableInput/hooks/index.ts index ec9cd6da7f..88bb03b409 100644 --- a/packages/core/client/src/schema-settings/VariableInput/hooks/index.ts +++ b/packages/core/client/src/schema-settings/VariableInput/hooks/index.ts @@ -15,3 +15,4 @@ export * from './useURLSearchParamsVariable'; export * from './useUserVariable'; export * from './useVariableOptions'; export * from './usePopupVariable'; +export * from './useContextAssociationFields'; diff --git a/packages/core/client/src/schema-settings/VariableInput/hooks/useContextAssociationFields.tsx b/packages/core/client/src/schema-settings/VariableInput/hooks/useContextAssociationFields.tsx index 7ea69f241b..892c0e242c 100644 --- a/packages/core/client/src/schema-settings/VariableInput/hooks/useContextAssociationFields.tsx +++ b/packages/core/client/src/schema-settings/VariableInput/hooks/useContextAssociationFields.tsx @@ -46,7 +46,9 @@ const getChildren = ( return { key: option.name, value: option.name, + name: option.name, label: compile(option.title), + title: compile(option.title), disabled: disabled, isLeaf: true, depth, @@ -59,7 +61,9 @@ const getChildren = ( return { key: option.name, value: option.name, + name: option.name, label: compile(option.title), + title: compile(option.title), disabled: disabled, isLeaf: true, field: option, @@ -77,10 +81,10 @@ export const useContextAssociationFields = ({ contextCollectionName, collectionField, }: { - schema: any; + schema?: any; maxDepth?: number; contextCollectionName: string; - collectionField: CollectionFieldOptions_deprecated; + collectionField?: CollectionFieldOptions_deprecated; }) => { const { t } = useTranslation(); const compile = useCompile(); @@ -101,10 +105,17 @@ export const useContextAssociationFields = ({ const children = getChildren( getFilterOptions(collectionName).filter((v) => { - const isAssociationField = ['hasOne', 'hasMany', 'belongsTo', 'belongsToMany', 'belongsToArray'].includes( - v.type, - ); - return isAssociationField; + if (collectionField) { + const isAssociationField = [ + 'hasOne', + 'hasMany', + 'belongsTo', + 'belongsToMany', + 'belongsToArray', + ].includes(v.type); + return isAssociationField; + } + return true; }), { schema, diff --git a/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx b/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx index 0d5b099677..6bdc3c1623 100644 --- a/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx +++ b/packages/plugins/@nocobase/plugin-action-bulk-update/src/client/BulkUpdateAction.Settings.tsx @@ -78,7 +78,7 @@ function AfterSuccess() { return ( { + const { params } = useCurrentPopupContext(); + const recordData = useCollectionRecordData(); + const tableBlockContextBasicValue = useTableBlockContext(); + if (recordData) { + return false; + } + + const popupTableBlockContext = getStoredPopupContext(params?.popupuid)?.tableBlockContext; + return !isEmpty(popupTableBlockContext) || !isEmpty(tableBlockContextBasicValue); +}; + export const useCustomRequestVariableOptions = () => { const collection = useCollection_deprecated(); const { t } = useTranslation(); @@ -33,6 +50,8 @@ export const useCustomRequestVariableOptions = () => { return [compile(fieldsOptions), compile(userFieldOptions)]; }, [fieldsOptions, userFieldOptions]); const environmentVariables = useGlobalVariable('$env'); + const contextVariable = useContextAssociationFields({ maxDepth: 2, contextCollectionName: collection.name }); + const shouldShowTableSelectVariable = useIsShowTableSelectRecord(); return useMemo(() => { return [ environmentVariables, @@ -61,6 +80,7 @@ export const useCustomRequestVariableOptions = () => { title: 'API token', children: null, }, + shouldShowTableSelectVariable && { ...contextVariable, name: '$nSelectedRecord', title: contextVariable.label }, ].filter(Boolean); - }, [recordData, t, fields, blockType, userFields]); + }, [recordData, t, fields, blockType, userFields, shouldShowTableSelectVariable]); }; diff --git a/packages/plugins/@nocobase/plugin-action-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts b/packages/plugins/@nocobase/plugin-action-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts index a1580495e9..93739c9c74 100644 --- a/packages/plugins/@nocobase/plugin-action-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts +++ b/packages/plugins/@nocobase/plugin-action-custom-request/src/client/hooks/useCustomizeRequestActionProps.ts @@ -16,6 +16,8 @@ import { useCompile, useDataSourceKey, useNavigateNoUpdate, + useBlockRequestContext, + useContextVariable, } from '@nocobase/client'; import { isURL } from '@nocobase/utils/client'; import { App } from 'antd'; @@ -25,18 +27,21 @@ export const useCustomizeRequestActionProps = () => { const apiClient = useAPIClient(); const navigate = useNavigateNoUpdate(); const actionSchema = useFieldSchema(); + const { field } = useBlockRequestContext(); const compile = useCompile(); const form = useForm(); const { name: blockType } = useBlockContext() || {}; - // const { getPrimaryKey } = useCollection_deprecated(); const recordData = useCollectionRecordData(); const fieldSchema = useFieldSchema(); const actionField = useField(); const { setVisible } = useActionContext(); const { modal, message } = App.useApp(); const dataSourceKey = useDataSourceKey(); + const { ctx } = useContextVariable(); + return { async onClick(e?, callBack?) { + const selectedRecord = field.data?.selectedRowData ? field.data?.selectedRowData : ctx; const { skipValidator, onSuccess } = actionSchema?.['x-action-settings'] ?? {}; const { manualClose, redirecting, redirectTo, successMessage, actionAfterSuccess } = onSuccess || {}; const xAction = actionSchema?.['x-action']; @@ -58,12 +63,11 @@ export const useCustomizeRequestActionProps = () => { method: 'POST', data: { currentRecord: { - // id: record[getPrimaryKey()], - // appends: result.params[0]?.appends, dataSourceKey, data: currentRecordData, }, $nForm: blockType === 'form' ? form.values : undefined, + $nSelectedRecord: selectedRecord, }, responseType: fieldSchema['x-response-type'] === 'stream' ? 'blob' : 'json', }); diff --git a/packages/plugins/@nocobase/plugin-action-custom-request/src/server/actions/send.ts b/packages/plugins/@nocobase/plugin-action-custom-request/src/server/actions/send.ts index 8cb73835be..bf1ba18fa6 100644 --- a/packages/plugins/@nocobase/plugin-action-custom-request/src/server/actions/send.ts +++ b/packages/plugins/@nocobase/plugin-action-custom-request/src/server/actions/send.ts @@ -73,6 +73,7 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next) data: {}, }, $nForm, + $nSelectedRecord, } = values; // root role has all permissions @@ -154,6 +155,7 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next) $nToken: ctx.getBearerToken(), $nForm, $env: ctx.app.environment.getVariables(), + $nSelectedRecord, }; const axiosRequestConfig = {