mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-07-02 03:02:19 +08:00
feat(client): adjust toolbar for Table Actions (#4538)
* feat(client): adjust toolbar for Table Actions * chore: ensure backward compatibility * chore: update e2e tests * chore: fix fialed unit tests * Revert "chore: update e2e tests" This reverts commit 0a701716877cd732db2ece8f2bdb6325a8e6179e. * chore: update e2e tests * chore: update e2e tests * chore: don't forget to revert me * chore: update e2e tests * chore: update e2e tests * Revert "chore: don't forget to revert me" This reverts commit 29a51dff28f917fae99d4a88b908aad12c69f5c2. * chore: update timeout and retries in defineConfig * chore: make e2e tests more stable * chore: make e2e tests more stable
This commit is contained in:
parent
6bc3f7a540
commit
773f05dcd2
@ -7,7 +7,7 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import { test, expect } from '@nocobase/test/e2e';
|
||||
import { expect, test } from '@nocobase/test/e2e';
|
||||
import { disassociatePage } from './templatesOfPage';
|
||||
|
||||
test('basic', async ({ page, mockPage, mockRecord }) => {
|
||||
@ -35,7 +35,7 @@ test('basic', async ({ page, mockPage, mockRecord }) => {
|
||||
.hover();
|
||||
await page
|
||||
.getByTestId('drawer-Action.Container-collection1-Edit record')
|
||||
.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-collection2')
|
||||
.getByLabel('designer-schema-initializer-TableV2.Column-fieldSettings:TableColumn-collection2')
|
||||
.hover();
|
||||
await page.getByRole('menuitem', { name: 'Disassociate' }).click();
|
||||
|
||||
|
@ -88,7 +88,7 @@ test.describe('configure actions column', () => {
|
||||
await expectActionsColumnWidth(200);
|
||||
|
||||
await page.getByText('Actions', { exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-users').hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-fieldSettings:TableColumn-users').hover();
|
||||
await page.getByRole('menuitem', { name: 'Column width' }).click();
|
||||
|
||||
await expect(page.getByRole('dialog').getByText('Column width')).toBeVisible();
|
||||
@ -96,7 +96,7 @@ test.describe('configure actions column', () => {
|
||||
// 修改列宽度为 400
|
||||
await page.getByRole('dialog').getByRole('spinbutton').click();
|
||||
await page.getByRole('dialog').getByRole('spinbutton').fill('400');
|
||||
await page.getByTestId('modal-Action.Modal-users-Column width').getByRole('button', { name: 'Submit' }).click();
|
||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||
|
||||
await expectActionsColumnWidth(400);
|
||||
});
|
||||
|
@ -7,9 +7,9 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import { expectSettingsMenu, test, expect } from '@nocobase/test/e2e';
|
||||
import { createTable } from './utils';
|
||||
import { expect, expectSettingsMenu, test } from '@nocobase/test/e2e';
|
||||
import { tableSelectorDataScopeVariable } from './templatesOfBug';
|
||||
import { createTable } from './utils';
|
||||
|
||||
test.describe('table data selector schema settings', () => {
|
||||
test('supported options', async ({ page, mockPage }) => {
|
||||
@ -126,7 +126,10 @@ test.describe('table data selector schema settings', () => {
|
||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||
|
||||
// Table 中显示 singleLineText 字段
|
||||
await page.getByLabel('schema-initializer-TableV2.').hover();
|
||||
await page
|
||||
.getByTestId('drawer-AssociationField.Selector-table-selector-data-scope-variable-Select record')
|
||||
.getByLabel('schema-initializer-TableV2.')
|
||||
.hover();
|
||||
await page.getByRole('menuitem', { name: 'singleLineText' }).click();
|
||||
await page.mouse.move(300, 0);
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import { MenuOutlined } from '@ant-design/icons';
|
||||
import { PlusOutlined } from '@ant-design/icons';
|
||||
import { ISchema, useField, useFieldSchema } from '@formily/react';
|
||||
import _ from 'lodash';
|
||||
import React from 'react';
|
||||
@ -145,147 +145,121 @@ const commonOptions = {
|
||||
Component: (props: any) => {
|
||||
const { getAriaLabel } = useGetAriaLabelOfDesigner();
|
||||
return (
|
||||
<MenuOutlined
|
||||
<PlusOutlined
|
||||
{...props}
|
||||
role="button"
|
||||
aria-label={getAriaLabel('schema-settings')}
|
||||
aria-label={getAriaLabel('schema-initializer')}
|
||||
style={{ cursor: 'pointer' }}
|
||||
/>
|
||||
);
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'itemGroup',
|
||||
name: 'actions',
|
||||
title: '{{t("Configure actions")}}',
|
||||
children: [
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("View")}}',
|
||||
name: 'view',
|
||||
Component: 'ViewActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'view',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
name: 'edit',
|
||||
title: '{{t("Edit")}}',
|
||||
Component: 'UpdateActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'update',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Delete")}}',
|
||||
name: 'delete',
|
||||
Component: 'DestroyActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'destroy',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Disassociate")}}',
|
||||
name: 'disassociate',
|
||||
Component: 'DisassociateActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'disassociate',
|
||||
'x-acl-action': 'destroy',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const props = useDataBlockProps();
|
||||
const collection = useCollection_deprecated();
|
||||
return (
|
||||
!!props?.association &&
|
||||
(collection.template !== 'view' || collection?.writableView) &&
|
||||
collection.template !== 'sql'
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Add child")}}',
|
||||
name: 'addChildren',
|
||||
Component: 'CreateChildInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'create',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const fieldSchema = useFieldSchema();
|
||||
const collection = useCollection_deprecated();
|
||||
const { treeTable } = fieldSchema?.parent?.parent['x-decorator-props'] || {};
|
||||
return collection.tree && treeTable;
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Popup")}}',
|
||||
name: 'popup',
|
||||
Component: 'PopupActionInitializer',
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Update record")}}',
|
||||
name: 'updateRecord',
|
||||
Component: 'UpdateRecordActionInitializer',
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'customRequest',
|
||||
title: '{{t("Custom request")}}',
|
||||
Component: 'CustomRequestInitializer',
|
||||
schema: {
|
||||
'x-action': 'customize:table:request',
|
||||
},
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'divider',
|
||||
type: 'divider',
|
||||
sort: 100,
|
||||
},
|
||||
{
|
||||
name: 'fixed',
|
||||
title: 't("Fixed")',
|
||||
type: 'item',
|
||||
Component: SchemaSettingsFixed,
|
||||
sort: 100,
|
||||
title: '{{t("View")}}',
|
||||
name: 'view',
|
||||
Component: 'ViewActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'view',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
name: 'columnWidth',
|
||||
title: 't("Column width")',
|
||||
Component: Resizable,
|
||||
sort: 100,
|
||||
name: 'edit',
|
||||
title: '{{t("Edit")}}',
|
||||
Component: 'UpdateActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'update',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Delete")}}',
|
||||
name: 'delete',
|
||||
Component: 'DestroyActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'destroy',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Disassociate")}}',
|
||||
name: 'disassociate',
|
||||
Component: 'DisassociateActionInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'disassociate',
|
||||
'x-acl-action': 'destroy',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const props = useDataBlockProps();
|
||||
const collection = useCollection_deprecated();
|
||||
return (
|
||||
!!props?.association &&
|
||||
(collection.template !== 'view' || collection?.writableView) &&
|
||||
collection.template !== 'sql'
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Add child")}}',
|
||||
name: 'addChildren',
|
||||
Component: 'CreateChildInitializer',
|
||||
schema: {
|
||||
'x-component': 'Action.Link',
|
||||
'x-action': 'create',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
},
|
||||
useVisible() {
|
||||
const fieldSchema = useFieldSchema();
|
||||
const collection = useCollection_deprecated();
|
||||
const { treeTable } = fieldSchema?.parent?.parent['x-decorator-props'] || {};
|
||||
return collection.tree && treeTable;
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Popup")}}',
|
||||
name: 'popup',
|
||||
Component: 'PopupActionInitializer',
|
||||
},
|
||||
{
|
||||
type: 'item',
|
||||
title: '{{t("Update record")}}',
|
||||
name: 'updateRecord',
|
||||
Component: 'UpdateRecordActionInitializer',
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'customRequest',
|
||||
title: '{{t("Custom request")}}',
|
||||
Component: 'CustomRequestInitializer',
|
||||
schema: {
|
||||
'x-action': 'customize:table:request',
|
||||
},
|
||||
useVisible() {
|
||||
const collection = useCollection_deprecated();
|
||||
return (collection.template !== 'view' || collection?.writableView) && collection.template !== 'sql';
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
@ -7,9 +7,17 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import React from 'react';
|
||||
import { SchemaToolbar } from '../../../../schema-settings';
|
||||
|
||||
export const TableColumnSchemaToolbar = (props) => {
|
||||
return <SchemaToolbar initializer={false} showBorder={false} showBackground {...props} />;
|
||||
return (
|
||||
<SchemaToolbar
|
||||
initializer={props.initializer || false}
|
||||
showBorder={false}
|
||||
showBackground
|
||||
{..._.omit(props, 'initializer')}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -136,7 +136,7 @@ test.describe('configure actions column', () => {
|
||||
|
||||
// add view & Edit & Delete & Duplicate ------------------------------------------------------------
|
||||
await page.getByText('Actions', { exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-t_unp4scqamw9').hover();
|
||||
await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover();
|
||||
await page.getByRole('menuitem', { name: 'View' }).click();
|
||||
await page.getByRole('menuitem', { name: 'Edit' }).click();
|
||||
await page.getByRole('menuitem', { name: 'Delete' }).click();
|
||||
@ -162,7 +162,7 @@ test.describe('configure actions column', () => {
|
||||
|
||||
// add custom action ------------------------------------------------------------
|
||||
await page.getByText('Actions', { exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-t_unp4scqamw9').hover();
|
||||
await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover();
|
||||
|
||||
await page.getByRole('menuitem', { name: 'Popup' }).click();
|
||||
// 此时二级菜单,不应该关闭,可以继续点击?
|
||||
@ -182,14 +182,14 @@ test.describe('configure actions column', () => {
|
||||
await expect(page.getByRole('columnheader', { name: 'Actions', exact: true })).toHaveJSProperty('offsetWidth', 200);
|
||||
|
||||
await page.getByText('Actions', { exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-t_unp4scqamw9').hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-').hover();
|
||||
await page.getByRole('menuitem', { name: 'Column width' }).click();
|
||||
|
||||
await expect(page.getByRole('dialog').getByText('Column width')).toBeVisible();
|
||||
|
||||
await page.getByRole('dialog').getByRole('spinbutton').click();
|
||||
await page.getByRole('dialog').getByRole('spinbutton').fill('400');
|
||||
await page.getByRole('button', { name: 'Submit' }).click();
|
||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||
|
||||
await expect(page.getByRole('columnheader', { name: 'Actions', exact: true })).toHaveJSProperty('offsetWidth', 400);
|
||||
});
|
||||
|
@ -35,7 +35,7 @@ const addSomeCustomActions = async (page: Page) => {
|
||||
|
||||
// 再增加两个自定义的 actions
|
||||
await page.getByRole('button', { name: 'Actions', exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-general').hover();
|
||||
await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-general').hover();
|
||||
await page.getByRole('menuitem', { name: 'Popup' }).click();
|
||||
await page.getByRole('menuitem', { name: 'Update record' }).click();
|
||||
};
|
||||
@ -393,7 +393,9 @@ test.describe('actions schema settings', () => {
|
||||
const openPopup = async () => {
|
||||
if (!(await page.getByLabel('action-Action.Link-Update record-customize:update-users2-table-0').isVisible())) {
|
||||
await page.getByRole('button', { name: 'Actions', exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-users2').hover();
|
||||
await page
|
||||
.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-users2')
|
||||
.hover();
|
||||
await page.getByRole('menuitem', { name: 'Update record' }).click();
|
||||
}
|
||||
|
||||
@ -476,7 +478,7 @@ test.describe('actions schema settings', () => {
|
||||
|
||||
// 添加 add child 按钮
|
||||
await page.getByRole('button', { name: 'Actions', exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-tree').hover();
|
||||
await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-tree').hover();
|
||||
await page.getByRole('menuitem', { name: 'Add child' }).click();
|
||||
|
||||
await expectSettingsMenu({
|
||||
|
@ -52,8 +52,12 @@ describe('createTableBLockSchemaV2', () => {
|
||||
"x-action-column": "actions",
|
||||
"x-component": "TableV2.Column",
|
||||
"x-decorator": "TableV2.Column.ActionBar",
|
||||
"x-designer": "TableV2.ActionColumnDesigner",
|
||||
"x-initializer": "table:configureItemActions",
|
||||
"x-settings": "fieldSettings:TableColumn",
|
||||
"x-toolbar": "TableColumnSchemaToolbar",
|
||||
"x-toolbar-props": {
|
||||
"initializer": "table:configureItemActions",
|
||||
},
|
||||
},
|
||||
},
|
||||
"type": "array",
|
||||
|
@ -73,8 +73,12 @@ export const createTableBlockUISchema = (options: {
|
||||
'x-action-column': 'actions',
|
||||
'x-decorator': 'TableV2.Column.ActionBar',
|
||||
'x-component': 'TableV2.Column',
|
||||
'x-designer': 'TableV2.ActionColumnDesigner',
|
||||
'x-toolbar': 'TableColumnSchemaToolbar',
|
||||
'x-initializer': 'table:configureItemActions',
|
||||
'x-settings': 'fieldSettings:TableColumn',
|
||||
'x-toolbar-props': {
|
||||
initializer: 'table:configureItemActions',
|
||||
},
|
||||
properties: {
|
||||
[uid()]: {
|
||||
type: 'void',
|
||||
|
@ -13,13 +13,13 @@ import { useTranslation } from 'react-i18next';
|
||||
import { useApp } from '../../../../application';
|
||||
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
|
||||
import { useCollectionManager_deprecated } from '../../../../collection-manager';
|
||||
import { useCollection } from '../../../../data-source';
|
||||
import { useDesignable } from '../../../../schema-component';
|
||||
import { useAssociationFieldContext } from '../../../../schema-component/antd/association-field/hooks';
|
||||
import { useColumnSchema } from '../../../../schema-component/antd/table-v2/Table.Column.Decorator';
|
||||
import { SchemaSettingsDefaultValue } from '../../../../schema-settings/SchemaSettingsDefaultValue';
|
||||
import { useFieldComponentName } from './utils';
|
||||
import { isPatternDisabled } from '../../../../schema-settings/isPatternDisabled';
|
||||
import { useCollection } from '../../../../data-source';
|
||||
import { useFieldComponentName } from './utils';
|
||||
|
||||
export const tableColumnSettings = new SchemaSettings({
|
||||
name: 'fieldSettings:TableColumn',
|
||||
@ -164,7 +164,12 @@ export const tableColumnSettings = new SchemaSettings({
|
||||
name: 'setDefaultValue',
|
||||
useVisible() {
|
||||
const { fieldSchema } = useColumnSchema();
|
||||
return !fieldSchema['x-read-pretty'];
|
||||
|
||||
if (!fieldSchema) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return !fieldSchema?.['x-read-pretty'];
|
||||
},
|
||||
Component: SchemaSettingsDefaultValue as any,
|
||||
useComponentProps() {
|
||||
@ -180,6 +185,11 @@ export const tableColumnSettings = new SchemaSettings({
|
||||
useVisible() {
|
||||
const { uiSchema, fieldSchema } = useColumnSchema();
|
||||
const field: any = useField();
|
||||
|
||||
if (!fieldSchema) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const isSubTableColumn = ['QuickEdit', 'FormItem'].includes(fieldSchema['x-decorator']);
|
||||
return isSubTableColumn && !field.readPretty && !uiSchema?.['x-read-pretty'];
|
||||
},
|
||||
@ -192,8 +202,12 @@ export const tableColumnSettings = new SchemaSettings({
|
||||
return {
|
||||
key: 'required',
|
||||
title: t('Required'),
|
||||
checked: fieldSchema.required as boolean,
|
||||
checked: fieldSchema?.required as boolean,
|
||||
onChange: (required) => {
|
||||
if (!fieldSchema) {
|
||||
return console.error('fieldSchema is required');
|
||||
}
|
||||
|
||||
const schema = {
|
||||
['x-uid']: fieldSchema['x-uid'],
|
||||
};
|
||||
@ -217,6 +231,11 @@ export const tableColumnSettings = new SchemaSettings({
|
||||
useVisible() {
|
||||
const { fieldSchema, collectionField } = useColumnSchema();
|
||||
const field: any = useField();
|
||||
|
||||
if (!fieldSchema) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const isSubTableColumn = ['QuickEdit', 'FormItem'].includes(fieldSchema['x-decorator']);
|
||||
return (
|
||||
isSubTableColumn &&
|
||||
@ -231,6 +250,11 @@ export const tableColumnSettings = new SchemaSettings({
|
||||
const { t } = useTranslation();
|
||||
const { dn } = useDesignable();
|
||||
let readOnlyMode = 'editable';
|
||||
|
||||
if (!fieldSchema) {
|
||||
return console.error('fieldSchema is required') as any;
|
||||
}
|
||||
|
||||
if (fieldSchema['x-disabled'] === true) {
|
||||
readOnlyMode = 'readonly';
|
||||
}
|
||||
|
@ -11,13 +11,17 @@ import { DragOutlined } from '@ant-design/icons';
|
||||
import { useFieldSchema } from '@formily/react';
|
||||
import { Space } from 'antd';
|
||||
import React from 'react';
|
||||
import { useSchemaInitializerRender } from '../../../application';
|
||||
import { useSchemaInitializerRender, useSchemaSettingsRender } from '../../../application';
|
||||
import { DragHandler } from '../../../schema-component';
|
||||
import { useGetAriaLabelOfDesigner } from '../../../schema-settings/hooks/useGetAriaLabelOfDesigner';
|
||||
|
||||
export const TableActionColumnDesigner = (props: any) => {
|
||||
const fieldSchema = useFieldSchema();
|
||||
const { render } = useSchemaInitializerRender(fieldSchema['x-initializer'], fieldSchema['x-initializer-props']);
|
||||
const { render: renderInitializers } = useSchemaInitializerRender(
|
||||
fieldSchema['x-initializer'],
|
||||
fieldSchema['x-initializer-props'],
|
||||
);
|
||||
const { render: renderSettings } = useSchemaSettingsRender('fieldSettings:TableColumn');
|
||||
const { getAriaLabel } = useGetAriaLabelOfDesigner();
|
||||
return (
|
||||
<div className={'general-schema-designer'}>
|
||||
@ -26,7 +30,8 @@ export const TableActionColumnDesigner = (props: any) => {
|
||||
<DragHandler>
|
||||
<DragOutlined role="button" aria-label={getAriaLabel('drag-handler')} />
|
||||
</DragHandler>
|
||||
{render()}
|
||||
{renderInitializers()}
|
||||
{renderSettings()}
|
||||
</Space>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -7,8 +7,8 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import React from 'react';
|
||||
import { uid } from '@formily/shared';
|
||||
import React from 'react';
|
||||
import { useSchemaInitializerItem } from '../../application';
|
||||
import { InitializerWithSwitch } from './InitializerWithSwitch';
|
||||
|
||||
@ -18,8 +18,12 @@ export const TableActionColumnInitializer = () => {
|
||||
title: '{{ t("Actions") }}',
|
||||
'x-decorator': 'TableV2.Column.ActionBar',
|
||||
'x-component': 'TableV2.Column',
|
||||
'x-designer': 'TableV2.ActionColumnDesigner',
|
||||
'x-toolbar': 'TableColumnSchemaToolbar',
|
||||
'x-initializer': 'table:configureItemActions',
|
||||
'x-settings': 'fieldSettings:TableColumn',
|
||||
'x-toolbar-props': {
|
||||
initializer: 'table:configureItemActions',
|
||||
},
|
||||
'x-action-column': 'actions',
|
||||
properties: {
|
||||
[uid()]: {
|
||||
|
@ -255,6 +255,9 @@ const InternalSchemaToolbar: FC<SchemaToolbarProps> = (props) => {
|
||||
|
||||
const initializerElement = useMemo(() => {
|
||||
if (initializer === false) return null;
|
||||
if (schemaInitializerExists) {
|
||||
return schemaInitializerRender(initializerProps);
|
||||
}
|
||||
if (gridContext?.InitializerComponent || gridContext?.renderSchemaInitializer) {
|
||||
return gridContext?.InitializerComponent ? (
|
||||
<gridContext.InitializerComponent {...initializerProps} />
|
||||
@ -262,8 +265,6 @@ const InternalSchemaToolbar: FC<SchemaToolbarProps> = (props) => {
|
||||
gridContext.renderSchemaInitializer?.(initializerProps)
|
||||
);
|
||||
}
|
||||
if (!schemaInitializerExists) return null;
|
||||
return schemaInitializerRender(initializerProps);
|
||||
}, [gridContext, initializer, initializerProps, schemaInitializerExists, schemaInitializerRender]);
|
||||
|
||||
const settingsElement = useMemo(() => {
|
||||
|
@ -17,7 +17,7 @@ test.describe('custom request action', () => {
|
||||
|
||||
// 新建一个 custom request action
|
||||
await page.getByRole('button', { name: 'Actions', exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-').hover();
|
||||
await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-').hover();
|
||||
await page.getByRole('menuitem', { name: 'Custom request' }).click();
|
||||
|
||||
// 打开编辑按钮弹窗
|
||||
|
@ -7,13 +7,7 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import {
|
||||
expect,
|
||||
oneEmptyDetailsBlock,
|
||||
oneEmptyTableBlockWithActions,
|
||||
oneEmptyTableBlockWithCustomizeActions,
|
||||
test,
|
||||
} from '@nocobase/test/e2e';
|
||||
import { expect, oneEmptyTableBlockWithCustomizeActions, test } from '@nocobase/test/e2e';
|
||||
|
||||
test.describe('TableActionColumnInitializers & DetailsActionInitializers & ReadPrettyFormActionInitializers should add duplication action', () => {
|
||||
test('duplication action in TableActionColumnInitializers', async ({ page, mockPage, mockRecords }) => {
|
||||
@ -21,7 +15,7 @@ test.describe('TableActionColumnInitializers & DetailsActionInitializers & ReadP
|
||||
await mockRecords('general', 3);
|
||||
await nocoPage.goto();
|
||||
await page.getByRole('button', { name: 'Actions', exact: true }).hover();
|
||||
await page.getByLabel('designer-schema-settings-TableV2.Column-TableV2.ActionColumnDesigner-general').hover();
|
||||
await page.getByLabel('designer-schema-initializer-TableV2.Column-TableV2.ActionColumnDesigner-general').hover();
|
||||
await page.getByRole('menuitem', { name: 'Duplicate' }).click();
|
||||
await expect(page.getByLabel('action-Action.Link-Duplicate-duplicate-general-table-0')).toBeVisible();
|
||||
});
|
||||
|
@ -179,8 +179,12 @@ export const AuditLogs: any = () => {
|
||||
'x-action-column': 'actions',
|
||||
'x-decorator': 'TableV2.Column.ActionBar',
|
||||
'x-component': 'TableV2.Column',
|
||||
'x-designer': 'TableV2.ActionColumnDesigner',
|
||||
'x-toolbar': 'TableColumnSchemaToolbar',
|
||||
'x-initializer': 'table:configureItemActions',
|
||||
'x-settings': 'fieldSettings:TableColumn',
|
||||
'x-toolbar-props': {
|
||||
initializer: 'table:configureItemActions',
|
||||
},
|
||||
properties: {
|
||||
actions: {
|
||||
type: 'void',
|
||||
|
@ -88,8 +88,12 @@ describe('createGanttBlockSchema', () => {
|
||||
"x-action-column": "actions",
|
||||
"x-component": "TableV2.Column",
|
||||
"x-decorator": "TableV2.Column.ActionBar",
|
||||
"x-designer": "TableV2.ActionColumnDesigner",
|
||||
"x-initializer": "table:configureItemActions",
|
||||
"x-settings": "fieldSettings:TableColumn",
|
||||
"x-toolbar": "TableColumnSchemaToolbar",
|
||||
"x-toolbar-props": {
|
||||
"initializer": "table:configureItemActions",
|
||||
},
|
||||
},
|
||||
},
|
||||
"type": "array",
|
||||
|
@ -79,8 +79,12 @@ export const createGanttBlockUISchema = (options: {
|
||||
'x-action-column': 'actions',
|
||||
'x-decorator': 'TableV2.Column.ActionBar',
|
||||
'x-component': 'TableV2.Column',
|
||||
'x-designer': 'TableV2.ActionColumnDesigner',
|
||||
'x-toolbar': 'TableColumnSchemaToolbar',
|
||||
'x-initializer': 'table:configureItemActions',
|
||||
'x-settings': 'fieldSettings:TableColumn',
|
||||
'x-toolbar-props': {
|
||||
initializer: 'table:configureItemActions',
|
||||
},
|
||||
properties: {
|
||||
actions: {
|
||||
type: 'void',
|
||||
|
@ -81,8 +81,11 @@ test('Collection event Add Data Trigger, determines that the trigger node single
|
||||
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
||||
await page.getByRole('menuitemcheckbox', { name: triggerNodeFieldDisplayName }).click();
|
||||
const conditionalRightConstant = faker.lorem.words();
|
||||
await page.waitForTimeout(500);
|
||||
await page.keyboard.type(`=='${conditionalRightConstant}'`, { delay: 50 });
|
||||
await page
|
||||
.getByLabel('block-item-WorkflowVariableTextArea-workflows-Condition expression')
|
||||
.getByLabel('textbox')
|
||||
.press('ControlOrMeta+ArrowRight');
|
||||
await page.keyboard.type(`=='${conditionalRightConstant}'`, { delay: 100 });
|
||||
await expect(conditionNode.conditionExpressionEditBox).toHaveText(
|
||||
`Trigger variables / Trigger data / ${triggerNodeFieldDisplayName}=='${conditionalRightConstant}'`,
|
||||
);
|
||||
@ -315,8 +318,11 @@ test('Collection event Add Data Trigger, determines that the trigger node single
|
||||
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
||||
await page.getByRole('menuitemcheckbox', { name: triggerNodeFieldDisplayName }).click();
|
||||
const conditionalRightConstant = faker.lorem.words();
|
||||
await page.waitForTimeout(500);
|
||||
await page.keyboard.type(`!='${conditionalRightConstant}'`, { delay: 50 });
|
||||
await page
|
||||
.getByLabel('block-item-WorkflowVariableTextArea-workflows-Condition expression')
|
||||
.getByLabel('textbox')
|
||||
.press('ControlOrMeta+ArrowRight');
|
||||
await page.keyboard.type(`!='${conditionalRightConstant}'`, { delay: 100 });
|
||||
await expect(conditionNode.conditionExpressionEditBox).toHaveText(
|
||||
`Trigger variables / Trigger data / ${triggerNodeFieldDisplayName}!='${conditionalRightConstant}'`,
|
||||
);
|
||||
|
@ -9,9 +9,7 @@
|
||||
|
||||
import { faker } from '@faker-js/faker';
|
||||
import {
|
||||
CalculationNode,
|
||||
CollectionTriggerNode,
|
||||
ConditionBranchNode,
|
||||
ConditionYesNode,
|
||||
QueryRecordNode,
|
||||
apiCreateWorkflow,
|
||||
@ -164,8 +162,11 @@ test('Collection event Add Data Trigger, Formula engine, determines that the tri
|
||||
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
||||
await page.getByRole('menuitemcheckbox', { name: triggerNodeFieldDisplayName }).click();
|
||||
const conditionalRightConstant = faker.string.alphanumeric(10);
|
||||
await page.waitForTimeout(500);
|
||||
await page.keyboard.type(`=='${conditionalRightConstant}'`, { delay: 50 });
|
||||
await page
|
||||
.getByLabel('block-item-WorkflowVariableTextArea-workflows-Condition expression')
|
||||
.getByLabel('textbox')
|
||||
.press('ControlOrMeta+ArrowRight');
|
||||
await page.keyboard.type(`=='${conditionalRightConstant}'`, { delay: 100 });
|
||||
await expect(conditionNode.conditionExpressionEditBox).toHaveText(
|
||||
`Trigger variables / Trigger data / ${triggerNodeFieldDisplayName}=='${conditionalRightConstant}'`,
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user