feat: detail block support linkage rule (#4221)

* feat: detail block support linkage rule

* fix: bug

* fix: bug

* test: e2e test
This commit is contained in:
katherinehhh 2024-05-07 09:45:28 +08:00 committed by GitHub
parent 0214bb915e
commit 2ec128c63f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 65 additions and 7 deletions

View File

@ -28,6 +28,7 @@ test.describe('multi data details block schema settings', () => {
}, },
supportedOptions: [ supportedOptions: [
'Edit block title', 'Edit block title',
'Linkage rules',
'Set the data scope', 'Set the data scope',
'Set default sorting rules', 'Set default sorting rules',
'Save as template', 'Save as template',

View File

@ -16,7 +16,11 @@ import { useFormBlockContext } from '../../../../block-provider';
import { useDetailsBlockContext } from '../../../../block-provider/DetailsBlockProvider'; import { useDetailsBlockContext } from '../../../../block-provider/DetailsBlockProvider';
import { useCollection_deprecated, useSortFields } from '../../../../collection-manager'; import { useCollection_deprecated, useSortFields } from '../../../../collection-manager';
import { removeNullCondition, useDesignable } from '../../../../schema-component'; import { removeNullCondition, useDesignable } from '../../../../schema-component';
import { SchemaSettingsBlockTitleItem, SchemaSettingsTemplate } from '../../../../schema-settings'; import {
SchemaSettingsBlockTitleItem,
SchemaSettingsTemplate,
SchemaSettingsLinkageRules,
} from '../../../../schema-settings';
import { SchemaSettingsDataScope } from '../../../../schema-settings/SchemaSettingsDataScope'; import { SchemaSettingsDataScope } from '../../../../schema-settings/SchemaSettingsDataScope';
import { setDataLoadingModeSettingsItem } from './setDataLoadingModeSettingsItem'; import { setDataLoadingModeSettingsItem } from './setDataLoadingModeSettingsItem';
@ -25,6 +29,17 @@ const commonItems: SchemaSettingsItemType[] = [
name: 'title', name: 'title',
Component: SchemaSettingsBlockTitleItem, Component: SchemaSettingsBlockTitleItem,
}, },
{
name: 'linkageRules',
Component: SchemaSettingsLinkageRules,
useComponentProps() {
const { name } = useCollection_deprecated();
return {
collectionName: name,
readPretty: true,
};
},
},
{ {
name: 'dataScope', name: 'dataScope',
Component: SchemaSettingsDataScope, Component: SchemaSettingsDataScope,

View File

@ -24,7 +24,7 @@ test.describe('single details block schema settings', () => {
await page.getByLabel('block-item-CardItem-general-form').hover(); await page.getByLabel('block-item-CardItem-general-form').hover();
await page.getByLabel('designer-schema-settings-CardItem-FormV2.ReadPrettyDesigner-general').hover(); await page.getByLabel('designer-schema-settings-CardItem-FormV2.ReadPrettyDesigner-general').hover();
}, },
supportedOptions: ['Edit block title', 'Save as block template', 'Delete'], supportedOptions: ['Edit block title', 'Linkage rules', 'Save as block template', 'Delete'],
}); });
}); });
}); });

View File

@ -10,7 +10,11 @@
import { useFieldSchema } from '@formily/react'; import { useFieldSchema } from '@formily/react';
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings'; import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
import { useCollection_deprecated } from '../../../../collection-manager'; import { useCollection_deprecated } from '../../../../collection-manager';
import { SchemaSettingsBlockTitleItem, SchemaSettingsFormItemTemplate } from '../../../../schema-settings'; import {
SchemaSettingsBlockTitleItem,
SchemaSettingsFormItemTemplate,
SchemaSettingsLinkageRules,
} from '../../../../schema-settings';
import { SchemaSettingsItemType } from '../../../../application/schema-settings/types'; import { SchemaSettingsItemType } from '../../../../application/schema-settings/types';
const commonItems: SchemaSettingsItemType[] = [ const commonItems: SchemaSettingsItemType[] = [
@ -18,6 +22,17 @@ const commonItems: SchemaSettingsItemType[] = [
name: 'title', name: 'title',
Component: SchemaSettingsBlockTitleItem, Component: SchemaSettingsBlockTitleItem,
}, },
{
name: 'linkageRules',
Component: SchemaSettingsLinkageRules,
useComponentProps() {
const { name } = useCollection_deprecated();
return {
collectionName: name,
readPretty: true,
};
},
},
{ {
name: 'formItemTemplate', name: 'formItemTemplate',
Component: SchemaSettingsFormItemTemplate, Component: SchemaSettingsFormItemTemplate,

View File

@ -107,6 +107,17 @@ export const readPrettyFormSettings = new SchemaSettings({
name: 'title', name: 'title',
Component: SchemaSettingsBlockTitleItem, Component: SchemaSettingsBlockTitleItem,
}, },
{
name: 'linkageRules',
Component: SchemaSettingsLinkageRules,
useComponentProps() {
const { name } = useCollection_deprecated();
return {
collectionName: name,
readPretty: true,
};
},
},
{ {
name: 'formItemTemplate', name: 'formItemTemplate',
Component: SchemaSettingsFormItemTemplate, Component: SchemaSettingsFormItemTemplate,
@ -150,6 +161,17 @@ export const formDetailsSettings = new SchemaSettings({
name: 'title', name: 'title',
Component: SchemaSettingsBlockTitleItem, Component: SchemaSettingsBlockTitleItem,
}, },
{
name: 'linkageRules',
Component: SchemaSettingsLinkageRules,
useComponentProps() {
const { name } = useCollection_deprecated();
return {
collectionName: name,
readPretty: true,
};
},
},
{ {
name: 'dataScope', name: 'dataScope',
Component: SchemaSettingsDataScope, Component: SchemaSettingsDataScope,

View File

@ -11,7 +11,7 @@ import { useTranslation } from 'react-i18next';
import { useCollectionManager_deprecated } from '../../collection-manager'; import { useCollectionManager_deprecated } from '../../collection-manager';
import { ActionType } from './type'; import { ActionType } from './type';
export const useLinkageCollectionFieldOptions = (collectionName: string) => { export const useLinkageCollectionFieldOptions = (collectionName: string, readPretty: boolean) => {
const { getCollectionFields, getInterface } = useCollectionManager_deprecated(); const { getCollectionFields, getInterface } = useCollectionManager_deprecated();
const fields = getCollectionFields(collectionName).filter((v) => { const fields = getCollectionFields(collectionName).filter((v) => {
return !['id', 'createdAt', 'createdBy', 'updatedAt', 'updatedBy'].includes(v.name); return !['id', 'createdAt', 'createdBy', 'updatedAt', 'updatedBy'].includes(v.name);
@ -27,7 +27,12 @@ export const useLinkageCollectionFieldOptions = (collectionName: string) => {
{ label: t('Required'), value: ActionType.Required, selected: false, schema: {} }, { label: t('Required'), value: ActionType.Required, selected: false, schema: {} },
{ label: t('Not required'), value: ActionType.InRequired, selected: false, schema: {} }, { label: t('Not required'), value: ActionType.InRequired, selected: false, schema: {} },
{ label: t('Value'), value: ActionType.Value, selected: false, schema: {} }, { label: t('Value'), value: ActionType.Value, selected: false, schema: {} },
]; ].filter((v) => {
if (readPretty) {
return [ActionType.Visible, ActionType.None].includes(v.value);
}
return v;
});
const field2option = (field, depth) => { const field2option = (field, depth) => {
const fieldInterface = getInterface(field.interface); const fieldInterface = getInterface(field.interface);
if (!fieldInterface) { if (!fieldInterface) {

View File

@ -1253,7 +1253,7 @@ export const SchemaSettingsDefaultSortingRules = function DefaultSortingRules(pr
}; };
export const SchemaSettingsLinkageRules = function LinkageRules(props) { export const SchemaSettingsLinkageRules = function LinkageRules(props) {
const { collectionName } = props; const { collectionName, readPretty } = props;
const fieldSchema = useFieldSchema(); const fieldSchema = useFieldSchema();
const { form } = useFormBlockContext(); const { form } = useFormBlockContext();
const { dn } = useDesignable(); const { dn } = useDesignable();
@ -1280,7 +1280,7 @@ export const SchemaSettingsLinkageRules = function LinkageRules(props) {
defaultValues: gridSchema?.['x-linkage-rules'] || fieldSchema?.['x-linkage-rules'], defaultValues: gridSchema?.['x-linkage-rules'] || fieldSchema?.['x-linkage-rules'],
type, type,
// eslint-disable-next-line react-hooks/rules-of-hooks // eslint-disable-next-line react-hooks/rules-of-hooks
linkageOptions: useLinkageCollectionFieldOptions(collectionName), linkageOptions: useLinkageCollectionFieldOptions(collectionName, readPretty),
collectionName, collectionName,
form, form,
variables, variables,