diff --git a/packages/core/client/src/flow/actions/columnFixed.tsx b/packages/core/client/src/flow/actions/columnFixed.tsx new file mode 100644 index 00000000000..d853ecefbe6 --- /dev/null +++ b/packages/core/client/src/flow/actions/columnFixed.tsx @@ -0,0 +1,36 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { defineAction, FlowModel } from '@nocobase/flow-engine'; +import { tval } from '@nocobase/utils/client'; + +export const fixed = defineAction({ + title: tval('Fixed'), + name: 'fixed', + uiSchema: (ctx) => { + const t = ctx.t; + return { + fixed: { + 'x-component': 'Select', + 'x-decorator': 'FormItem', + enum: [ + { label: t('Not fixed'), value: 'none' }, + { label: t('Left fixed'), value: 'left' }, + { label: t('Right fixed'), value: 'right' }, + ], + }, + }; + }, + defaultParams: { + fixed: 'none', + }, + handler(ctx, params) { + ctx.model.setProps('fixed', params.fixed); + }, +}); diff --git a/packages/core/client/src/flow/actions/index.ts b/packages/core/client/src/flow/actions/index.ts index b0d344b5c4a..3ecccf9886c 100644 --- a/packages/core/client/src/flow/actions/index.ts +++ b/packages/core/client/src/flow/actions/index.ts @@ -22,6 +22,7 @@ export * from './fieldComponent'; export * from './aclCheck'; export * from './pattern'; export * from './validation'; +export * from './columnFixed'; export { fieldLinkageRules, detailsFieldLinkageRules, diff --git a/packages/core/client/src/flow/models/base/CollectionBlockModel.tsx b/packages/core/client/src/flow/models/base/CollectionBlockModel.tsx index 8f616a64f5a..db0fb189ba5 100644 --- a/packages/core/client/src/flow/models/base/CollectionBlockModel.tsx +++ b/packages/core/client/src/flow/models/base/CollectionBlockModel.tsx @@ -338,7 +338,6 @@ export class CollectionBlockModel extends DataBlockModel extends DataBlockModel, } as any); } - - return cols; + return adjustColumnOrder(cols); } EditableRow = (props) => { diff --git a/packages/core/client/src/flow/models/blocks/table/TableColumnModel.tsx b/packages/core/client/src/flow/models/blocks/table/TableColumnModel.tsx index 4e4b0f65ac6..c8037e4db68 100644 --- a/packages/core/client/src/flow/models/blocks/table/TableColumnModel.tsx +++ b/packages/core/client/src/flow/models/blocks/table/TableColumnModel.tsx @@ -396,5 +396,9 @@ TableColumnModel.registerFlow({ }); }, }, + fixed: { + title: escapeT('Fixed'), + use: 'fixed', + }, }, }); diff --git a/packages/core/client/src/flow/models/blocks/table/TableCustomColumnModel.tsx b/packages/core/client/src/flow/models/blocks/table/TableCustomColumnModel.tsx index 0242b5aa965..50b8db01b12 100644 --- a/packages/core/client/src/flow/models/blocks/table/TableCustomColumnModel.tsx +++ b/packages/core/client/src/flow/models/blocks/table/TableCustomColumnModel.tsx @@ -70,6 +70,10 @@ TableCustomColumnModel.registerFlow({ ctx.model.setProps('width', params.width); }, }, + fixed: { + title: escapeT('Fixed'), + use: 'fixed', + }, }, }); diff --git a/packages/core/client/src/flow/models/blocks/table/utils.ts b/packages/core/client/src/flow/models/blocks/table/utils.ts index 9b6d1dd914b..9b75dd01dd7 100644 --- a/packages/core/client/src/flow/models/blocks/table/utils.ts +++ b/packages/core/client/src/flow/models/blocks/table/utils.ts @@ -16,3 +16,21 @@ export function extractIndex(str) { }); return numbers.join('.'); } + +export function adjustColumnOrder(columns) { + const leftFixedColumns = []; + const normalColumns = []; + const rightFixedColumns = []; + + columns.forEach((column) => { + if (column.fixed === 'left') { + leftFixedColumns.push(column); + } else if (column.fixed === 'right') { + rightFixedColumns.push(column); + } else { + normalColumns.push(column); + } + }); + + return [...leftFixedColumns, ...normalColumns, ...rightFixedColumns]; +} diff --git a/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.tsx b/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.tsx index 7669895dd60..11ae9038ea6 100644 --- a/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.tsx +++ b/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.tsx @@ -447,6 +447,10 @@ SubTableColumnModel.registerFlow({ title: escapeT('Display mode'), use: 'pattern', }, + fixed: { + title: escapeT('Fixed'), + use: 'fixed', + }, }, }); diff --git a/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx b/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx index 1e568d49ba5..42bafe2c48e 100644 --- a/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx +++ b/packages/core/client/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx @@ -17,11 +17,12 @@ import { useFlowEngine, } from '@nocobase/flow-engine'; import React from 'react'; -import { EditFormModel, FormItemModel } from '../../../blocks/form'; +import { FormItemModel } from '../../../blocks/form'; import { AssociationFieldModel } from '../AssociationFieldModel'; import { RecordPickerContent } from '../RecordPickerFieldModel'; import { SubTableColumnModel } from './SubTableColumnModel'; import { SubTableField } from './SubTableField'; +import { adjustColumnOrder } from '../../../blocks/table/utils'; const AddFieldColumn = ({ model }) => { return ( @@ -67,26 +68,28 @@ export class SubTableFieldModel extends AssociationFieldModel { Boolean, ); - return [ - enableIndexColumn && { - key: '__index__', - width: 48, - align: 'center', - fixed: 'left', - render: (props) => { - return props.rowIdx + 1; + return adjustColumnOrder( + [ + enableIndexColumn && { + key: '__index__', + width: 48, + align: 'center', + fixed: 'left', + render: (props) => { + return props.rowIdx + 1; + }, }, - }, - ...baseColumns.concat({ - key: '_empty', - }), - isConfigMode && { - key: 'addColumn', - fixed: 'right', - width: 100, - title: , - }, - ].filter(Boolean) as any; + ...baseColumns.concat({ + key: '_empty', + }), + isConfigMode && { + key: 'addColumn', + fixed: 'right', + width: 100, + title: , + }, + ].filter(Boolean), + ) as any; } render() { diff --git a/packages/core/client/src/flow/models/fields/DisplayAssociationField/DisplaySubTableFieldModel.tsx b/packages/core/client/src/flow/models/fields/DisplayAssociationField/DisplaySubTableFieldModel.tsx index 458f58e2800..f1319ff4ed7 100644 --- a/packages/core/client/src/flow/models/fields/DisplayAssociationField/DisplaySubTableFieldModel.tsx +++ b/packages/core/client/src/flow/models/fields/DisplayAssociationField/DisplaySubTableFieldModel.tsx @@ -13,6 +13,7 @@ import { Table } from 'antd'; import React from 'react'; import { FieldModel } from '../../base'; import { DetailsItemModel } from '../../blocks/details/DetailsItemModel'; +import { adjustColumnOrder } from '../../blocks/table/utils'; const AddFieldColumn = ({ model }) => { return ( @@ -60,26 +61,28 @@ export class DisplaySubTableFieldModel extends FieldModel { return !v.hidden; }); - return [ - enableIndexColumn && { - key: '__index__', - width: 48, - align: 'center', - fixed: 'left', - render: (props, record, index) => { - return index + 1; + return adjustColumnOrder( + [ + enableIndexColumn && { + key: '__index__', + width: 48, + align: 'center', + fixed: 'left', + render: (props, record, index) => { + return index + 1; + }, }, - }, - ...baseColumns.concat({ - key: 'empty', - }), - { - key: 'addColumn', - fixed: 'right', - width: 100, - title: , - }, - ].filter(Boolean) as any; + ...baseColumns.concat({ + key: 'empty', + }), + { + key: 'addColumn', + fixed: 'right', + width: 100, + title: , + }, + ].filter(Boolean), + ) as any; } public render() { return ( diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/client/models/DisplayPreviewFieldModel.tsx b/packages/plugins/@nocobase/plugin-file-manager/src/client/models/DisplayPreviewFieldModel.tsx index b2764ac9366..10d9e27234b 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/client/models/DisplayPreviewFieldModel.tsx +++ b/packages/plugins/@nocobase/plugin-file-manager/src/client/models/DisplayPreviewFieldModel.tsx @@ -230,11 +230,13 @@ const Preview = (props) => { }; export class DisplayPreviewFieldModel extends FieldModel { render(): any { - const { value, titleField } = this.props; - if (titleField && this.context.collectionField?.targetCollection?.template !== 'file') { + const { value, titleField, target } = this.props; + if (titleField && target !== 'file') { return castArray(value).flatMap((v, idx) => { - const content = v?.[titleField] ? ( - + const res = v?.[titleField]; + const result = typeof res === 'object' ? res : v; + const content = result ? ( + ) : ( N/A );