feat(client): supports setting the text align in the style configuration item of the field (#5272)
Some checks are pending
Build Docker Image / build-and-push (push) Waiting to run
Build Pro Image / build-and-push (push) Waiting to run
E2E / Build (push) Waiting to run
E2E / Core and plugins (push) Blocked by required conditions
E2E / plugin-workflow (push) Blocked by required conditions
E2E / plugin-workflow-approval (push) Blocked by required conditions
E2E / plugin-data-source-main (push) Blocked by required conditions
E2E / Comment on PR (push) Blocked by required conditions
NocoBase FrontEnd Test / frontend-test (18) (push) Waiting to run

* feat(client): table text align

* refactor: remove useless code

* refactor: extract schemas outside the component

* chore: make e2e tests pass

* test: add e2e tests

* chore: fix build

---------

Co-authored-by: Zeke Zhang <958414905@qq.com>
This commit is contained in:
猫鱼豆腐 2024-09-20 01:24:35 +08:00 committed by GitHub
parent a57ae63b29
commit af0c442268
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 110 additions and 28 deletions

View File

@ -13,7 +13,7 @@ export interface CollectionRecordOptions<DataType = {}, ParentDataType = {}> {
parentRecord?: CollectionRecord<ParentDataType>; parentRecord?: CollectionRecord<ParentDataType>;
} }
export class CollectionRecord<DataType = {}, ParentDataType = {}> { export class CollectionRecord<DataType = any, ParentDataType = {}> {
public data?: DataType; public data?: DataType;
public parentRecord?: CollectionRecord<ParentDataType>; public parentRecord?: CollectionRecord<ParentDataType>;
public isNew?: boolean; public isNew?: boolean;

View File

@ -427,6 +427,7 @@
"Option label": "Option label", "Option label": "Option label",
"Color": "Color", "Color": "Color",
"Background Color": "Background Color", "Background Color": "Background Color",
"Text Align": "Text Align",
"Add option": "Add option", "Add option": "Add option",
"Related collection": "Related collection", "Related collection": "Related collection",
"Allow linking to multiple records": "Allow linking to multiple records", "Allow linking to multiple records": "Allow linking to multiple records",

View File

@ -448,6 +448,7 @@
"Option label": "选项标签", "Option label": "选项标签",
"Color": "颜色", "Color": "颜色",
"Background Color": "背景颜色", "Background Color": "背景颜色",
"Text Align": "文本对齐",
"Add option": "添加选项", "Add option": "添加选项",
"Related collection": "关系表", "Related collection": "关系表",
"Allow linking to multiple records": "允许关联多条记录", "Allow linking to multiple records": "允许关联多条记录",

View File

@ -444,6 +444,7 @@
"Option value": "選項值", "Option value": "選項值",
"Option label": "選項標籤", "Option label": "選項標籤",
"Color": "顏色", "Color": "顏色",
"Text Align": "文本對齊",
"Add option": "新增選項", "Add option": "新增選項",
"Related collection": "關聯表", "Related collection": "關聯表",
"Allow linking to multiple records": "允許關聯多條記錄", "Allow linking to multiple records": "允許關聯多條記錄",

View File

@ -163,11 +163,9 @@ test.describe('edit form block schema settings', () => {
await page.getByLabel('action-Action.Link-Edit record-update-general-table-').click(); await page.getByLabel('action-Action.Link-Edit record-update-general-table-').click();
await page.getByRole('spinbutton').fill(''); await page.getByRole('spinbutton').fill('');
await page.getByRole('spinbutton').fill('10'); await page.getByRole('spinbutton').fill('10');
await expect( await expect(page.getByLabel('block-item-CollectionField-general-form-general.formula-formula')).toHaveText(
page 'formula:11',
.getByLabel('block-item-CollectionField-general-form-general.formula-formula') );
.locator('.nb-read-pretty-input-number'),
).toHaveText('11');
await page.getByLabel('drawer-Action.Container-general-Edit record-mask').click(); await page.getByLabel('drawer-Action.Container-general-Edit record-mask').click();
await expect(page.getByText('Unsaved changes')).toBeVisible(); await expect(page.getByText('Unsaved changes')).toBeVisible();
}); });

View File

@ -7,7 +7,7 @@
* For more information, please refer to: https://www.nocobase.com/agreement. * For more information, please refer to: https://www.nocobase.com/agreement.
*/ */
import { expect, commonFormViewPage, test } from '@nocobase/test/e2e'; import { commonFormViewPage, expect, test } from '@nocobase/test/e2e';
test.describe('field schema settings', () => { test.describe('field schema settings', () => {
test('linkage style color', async ({ page, mockPage, mockRecord }) => { test('linkage style color', async ({ page, mockPage, mockRecord }) => {
@ -60,4 +60,32 @@ test.describe('field schema settings', () => {
.locator('div.ant-formily-item-control-content-component'); .locator('div.ant-formily-item-control-content-component');
await expect(cell).toHaveCSS('background-color', 'rgb(163, 79, 204)'); await expect(cell).toHaveCSS('background-color', 'rgb(163, 79, 204)');
}); });
test('text align', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(commonFormViewPage).waitForInit();
await mockRecord('general', { singleLineText: 'asdfcedg' });
await nocoPage.goto();
await page.getByText('asdfcedg', { exact: true }).hover();
await page.getByLabel('block-item-CollectionField-general-details-general.singleLineText-singleLineText').hover();
await page
.getByLabel('designer-schema-settings-CollectionField-fieldSettings:FormItem-general-general.singleLineText', {
exact: true,
})
.click();
await page.getByRole('menuitem', { name: 'Style' }).click();
await page.getByRole('button', { name: 'plus Add linkage rule' }).click();
await page.getByText('Add property').click();
await page.getByTestId('select-linkage-properties').click();
await page.getByText('Text Align', { exact: true }).click();
await page.getByTestId('select-single').click();
await page.getByRole('option', { name: 'right' }).click();
await page.getByRole('button', { name: 'OK' }).click();
const cell = page
.getByLabel('block-item-CollectionField-general-details-general.singleLineText-singleLineText')
.locator('div.ant-formily-item-control-content-component');
await expect(cell).toHaveCSS('text-align', 'right');
});
}); });

View File

@ -57,4 +57,29 @@ test.describe('view', () => {
const bgColor = await cell.evaluate((el) => getComputedStyle(el.parentElement).backgroundColor); const bgColor = await cell.evaluate((el) => getComputedStyle(el.parentElement).backgroundColor);
expect(bgColor).toContain('163, 79, 204'); expect(bgColor).toContain('163, 79, 204');
}); });
test('text align', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(oneTableBlockWithIntegerAndIDColumn).waitForInit();
await mockRecord('general', { integer: '423' });
await nocoPage.goto();
await page.getByText('integer', { exact: true }).hover();
await page
.getByRole('button', {
name: 'designer-schema-settings-TableV2.Column-fieldSettings:TableColumn-general',
})
.click();
await page.getByRole('menuitem', { name: 'Style' }).click();
await page.getByRole('button', { name: 'plus Add linkage rule' }).click();
await page.getByText('Add property').click();
await page.getByTestId('select-linkage-properties').click();
await page.getByText('Text Align', { exact: true }).click();
await page.getByTestId('select-single').click();
await page.getByRole('option', { name: 'right' }).click();
await page.getByRole('button', { name: 'OK' }).click();
const cell = page.getByRole('button', { name: '423' });
const textAlign = await cell.evaluate((el) => getComputedStyle(el.parentElement).textAlign);
expect(textAlign).toContain('right');
});
}); });

View File

@ -9,10 +9,10 @@
import { isValid } from '@formily/shared'; import { isValid } from '@formily/shared';
import { toFixedByStep } from '@nocobase/utils/client'; import { toFixedByStep } from '@nocobase/utils/client';
import BigNumber from 'bignumber.js';
import { format } from 'd3-format'; import { format } from 'd3-format';
import * as math from 'mathjs'; import * as math from 'mathjs';
import React, { useMemo } from 'react'; import React, { useMemo } from 'react';
import BigNumber from 'bignumber.js';
function countDecimalPlaces(value) { function countDecimalPlaces(value) {
const number = Number(value); const number = Number(value);
@ -175,7 +175,7 @@ export const ReadPretty: React.FC<InputNumberReadPrettyProps> = (props) => {
} }
return ( return (
<div className={'nb-read-pretty-input-number'}> <div>
{addonBefore} {addonBefore}
<span dangerouslySetInnerHTML={{ __html: result }} /> <span dangerouslySetInnerHTML={{ __html: result }} />
{addonAfter} {addonAfter}

View File

@ -344,9 +344,6 @@ const headerClass = css`
const cellClass = css` const cellClass = css`
max-width: 300px; max-width: 300px;
white-space: nowrap; white-space: nowrap;
.nb-read-pretty-input-number {
text-align: right;
}
.ant-color-picker-trigger { .ant-color-picker-trigger {
position: absolute; position: absolute;
top: 50%; top: 50%;

View File

@ -185,9 +185,45 @@ export const FormButtonLinkageRuleAction = observer(
{ displayName: 'FormButtonLinkageRuleAction' }, { displayName: 'FormButtonLinkageRuleAction' },
); );
const colorSchema = {
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'ColorPicker',
'x-component-props': {
defaultValue: '',
},
};
const textAlignSchema = {
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Select',
'x-component-props': {
defaultValue: '',
},
enum: [
{
label: 'left',
value: 'left',
},
{
label: 'right',
value: 'right',
},
{
label: 'center',
value: 'center',
},
],
};
const schemas = new Map();
schemas.set(ActionType.Color, colorSchema);
schemas.set(ActionType.BackgroundColor, colorSchema);
schemas.set(ActionType.TextAlign, textAlignSchema);
export const FormStyleLinkageRuleAction = observer( export const FormStyleLinkageRuleAction = observer(
(props: any) => { (props: any) => {
const { value, options, collectionName } = props; const { options, collectionName } = props;
const { t } = useTranslation(); const { t } = useTranslation();
const compile = useCompile(); const compile = useCompile();
const remove = useContext(RemoveActionContext); const remove = useContext(RemoveActionContext);
@ -197,17 +233,10 @@ export const FormStyleLinkageRuleAction = observer(
compile([ compile([
{ label: t('Color'), value: ActionType.Color, schema: {} }, { label: t('Color'), value: ActionType.Color, schema: {} },
{ label: t('Background Color'), value: ActionType.BackgroundColor, schema: {} }, { label: t('Background Color'), value: ActionType.BackgroundColor, schema: {} },
{ label: t('Text Align'), value: ActionType.TextAlign, schema: {} },
]), ]),
[compile, t], [compile, t],
); );
const schema = {
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'ColorPicker',
'x-component-props': {
defaultValue: '',
},
};
const onChange = useCallback( const onChange = useCallback(
(value) => { (value) => {
@ -228,10 +257,10 @@ export const FormStyleLinkageRuleAction = observer(
onChange={onChange} onChange={onChange}
placeholder={t('action')} placeholder={t('action')}
/> />
{[ActionType.Color, ActionType.BackgroundColor].includes(operator) && ( {[ActionType.Color, ActionType.BackgroundColor, ActionType.TextAlign].includes(operator) && (
<ValueDynamicComponent <ValueDynamicComponent
fieldValue={fieldValue} fieldValue={fieldValue}
schema={schema} schema={schemas.get(operator)}
setValue={setValue} setValue={setValue}
collectionName={collectionName} collectionName={collectionName}
inputModes={['constant']} inputModes={['constant']}

View File

@ -7,9 +7,9 @@
* For more information, please refer to: https://www.nocobase.com/agreement. * For more information, please refer to: https://www.nocobase.com/agreement.
*/ */
import { conditionAnalyses } from '../../schema-component/common/utils/uitls';
import { ActionType } from './type'; import { ActionType } from './type';
import { InputModeType } from './ValueDynamicComponent'; import { InputModeType } from './ValueDynamicComponent';
import { conditionAnalyses } from '../../schema-component/common/utils/uitls';
const getActionValue = (operator, value) => { const getActionValue = (operator, value) => {
const getValueByMode = (value) => { const getValueByMode = (value) => {
const mode = value?.mode as InputModeType; const mode = value?.mode as InputModeType;
@ -18,11 +18,10 @@ const getActionValue = (operator, value) => {
} else return null; } else return null;
}; };
switch (true) { switch (true) {
case [ActionType.Color, ActionType.BackgroundColor].includes(operator): case [ActionType.Color, ActionType.BackgroundColor, ActionType.TextAlign].includes(operator):
return getValueByMode(value); return getValueByMode(value);
default: default:
return null; return null;
break;
} }
}; };

View File

@ -21,6 +21,7 @@ export enum ActionType {
Active = 'enabled', Active = 'enabled',
Color = 'color', Color = 'color',
BackgroundColor = 'backgroundColor', BackgroundColor = 'backgroundColor',
TextAlign = 'textAlign',
} }
export enum LinkageRuleCategory { export enum LinkageRuleCategory {

View File

@ -9,7 +9,7 @@
import { T3879 } from './utils'; import { T3879 } from './utils';
import { test, expect } from '@nocobase/test/e2e'; import { expect, test } from '@nocobase/test/e2e';
// https://nocobase.height.app/T-3529 // https://nocobase.height.app/T-3529
test('formula field calculation', async ({ page, mockPage }) => { test('formula field calculation', async ({ page, mockPage }) => {
@ -29,5 +29,7 @@ test('formula field calculation', async ({ page, mockPage }) => {
.getByLabel('block-item-CollectionField-general-form-general.number2-number2') .getByLabel('block-item-CollectionField-general-form-general.number2-number2')
.getByRole('spinbutton') .getByRole('spinbutton')
.fill('3'); .fill('3');
await expect(await page.locator('.nb-read-pretty-input-number').innerText()).toBe('6'); await expect(page.getByLabel('block-item-CollectionField-general-form-general.formula-formula')).toHaveText(
'formula:6',
);
}); });