mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 13:39:24 +08:00
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:
parent
0214bb915e
commit
2ec128c63f
@ -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',
|
||||||
|
@ -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,
|
||||||
|
@ -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'],
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user