From 200e177079c3d169856ec8674215cf5b715ca1eb Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Tue, 14 Jan 2025 10:50:52 +0800 Subject: [PATCH 01/15] feat: table generator support column scroll not disorder --- packages/drip-table-generator/.eslintrc.js | 7 + .../drip-table-generator/src/context/index.ts | 6 +- .../component-configs/index.tsx | 14 +- .../component-item-config/index.tsx | 14 +- .../global-configs/index.tsx | 13 +- .../src/layouts/attributes-layout/index.tsx | 32 +- .../src/layouts/index.tsx | 14 +- .../components/pagination/index.tsx | 20 +- .../components/table-container/index.less | 7 +- .../components/table-container/index.tsx | 128 ++++---- .../editable-footer/index.tsx | 71 ++-- .../editable-header/index.tsx | 39 +-- .../editable-table/components/cell/cell.tsx | 12 +- .../editable-table/components/cell/common.tsx | 11 +- .../editable-table/components/cell/group.tsx | 26 +- .../editable-table/components/cell/index.tsx | 19 +- .../components/cell/popover.tsx | 89 ++--- .../components/column-header/filter.tsx | 28 +- .../components/column-header/index.less | 1 + .../components/column-header/index.tsx | 256 +++++++-------- .../components/components-selector/index.tsx | 46 +-- .../components/header-list/index.less | 5 + .../components/header-list/index.tsx | 75 ++--- .../components/left-columns/index.less | 36 +++ .../components/left-columns/index.tsx | 88 +++++ .../components/right-columns/index.less | 36 +++ .../components/right-columns/index.tsx | 88 +++++ .../editable-table/components/row/index.tsx | 105 +++--- .../components/row/row-header/index.tsx | 46 +-- .../components/scroll-columns/index.less | 28 ++ .../components/scroll-columns/index.tsx | 88 +++++ .../components/table-section/index.less | 76 +++++ .../components/table-section/index.tsx | 90 ++++++ .../editable-table/index.tsx | 304 +++++++----------- .../src/layouts/table-workstation/index.tsx | 30 +- .../table-workstation/table-preview/index.tsx | 6 +- .../toolbar/components/datasource/index.tsx | 22 +- .../components/templates-manager/index.tsx | 146 ++++----- .../src/layouts/toolbar/index.tsx | 74 ++--- .../drip-table-generator/src/layouts/utils.ts | 10 +- packages/drip-table-generator/src/typing.ts | 15 +- .../src/wrapper/index.tsx | 18 +- 42 files changed, 1364 insertions(+), 875 deletions(-) create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.less create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.tsx diff --git a/packages/drip-table-generator/.eslintrc.js b/packages/drip-table-generator/.eslintrc.js index 95fab6d2c..85dc0dfb5 100644 --- a/packages/drip-table-generator/.eslintrc.js +++ b/packages/drip-table-generator/.eslintrc.js @@ -20,6 +20,13 @@ const javascriptRules = { 'unicorn/no-array-reduce': 'off', 'unicorn/prefer-switch': 'off', 'unicorn/explicit-length-check': 'off', + 'react/jsx-curly-spacing': [ + 'error', + { + when: 'always', + attributes: { when: 'never' }, + }, + ], }; const typescriptRules = { diff --git a/packages/drip-table-generator/src/context/index.ts b/packages/drip-table-generator/src/context/index.ts index ae9c3949a..4ef5122f5 100644 --- a/packages/drip-table-generator/src/context/index.ts +++ b/packages/drip-table-generator/src/context/index.ts @@ -5,11 +5,9 @@ * @modifier : helloqian12138 (johnhello12138@163.com) * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. */ -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import { createContext } from 'react'; -import { DataSourceTypeAbbr } from '../typing'; - export type DripTableGeneratorStates = Omit; export interface DripTableGeneratorContext { @@ -27,7 +25,7 @@ export interface DripTableGeneratorContext { /** * 表格数据,generator 不解析具体数据结构,仅仅透传给 drip-table */ - previewDataSource: DataSourceTypeAbbr>[]; + previewDataSource: DripTableRecordTypeWithSubtable, 'SubtableDataSourceKey'>>[]; /** * 属性栏类型,根据类型展示不同的抽屉 */ diff --git a/packages/drip-table-generator/src/layouts/attributes-layout/component-configs/index.tsx b/packages/drip-table-generator/src/layouts/attributes-layout/component-configs/index.tsx index 074ebab2c..c7875d779 100644 --- a/packages/drip-table-generator/src/layouts/attributes-layout/component-configs/index.tsx +++ b/packages/drip-table-generator/src/layouts/attributes-layout/component-configs/index.tsx @@ -7,7 +7,7 @@ */ import { ExclamationCircleTwoTone } from '@ant-design/icons'; import { Result } from 'antd'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import React from 'react'; @@ -16,10 +16,10 @@ import CustomForm from '@/components/CustomForm'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { getColumnItemConfigs, getComponentsConfigs } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; interface ComponentConfigFormProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { customAttributeComponents: DripTableGeneratorProps['customAttributeComponents']; @@ -32,12 +32,12 @@ interface ComponentConfigFormProps< const errorBoundary = (message?: string) => ( } - title={
{ message }
} + title={
{message}
} /> ); function ComponentConfigForm< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: ComponentConfigFormProps) { const { currentColumnID, currentTableID, previewDataSource } = React.useContext(GeneratorContext); @@ -220,7 +220,7 @@ function ComponentConfigForm< }; return ( - { ({ tableConfigs, setTableColumns }) => { + {({ tableConfigs, setTableColumns }) => { const tableIndex = tableConfigs.findIndex(item => item.tableId === currentTableID); const currentColumn = tableConfigs[tableIndex]?.columns.find(item => item.key === currentColumnID); if (!currentColumn) { @@ -248,7 +248,7 @@ function ComponentConfigForm< }} /> ); - } } + }} ); } diff --git a/packages/drip-table-generator/src/layouts/attributes-layout/component-item-config/index.tsx b/packages/drip-table-generator/src/layouts/attributes-layout/component-item-config/index.tsx index d5f3782b7..97b584013 100644 --- a/packages/drip-table-generator/src/layouts/attributes-layout/component-item-config/index.tsx +++ b/packages/drip-table-generator/src/layouts/attributes-layout/component-item-config/index.tsx @@ -9,7 +9,7 @@ import './index.less'; import { ExclamationCircleTwoTone } from '@ant-design/icons'; import { Result } from 'antd'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import React from 'react'; @@ -18,12 +18,12 @@ import CustomForm from '@/components/CustomForm'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { getColumnItemConfigs, getComponentsConfigs } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import { getColumnItemByPath, updateColumnItemByPath } from '../utils'; interface ComponentItemConfigFormProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { containerType: 'group' | 'popover'; @@ -38,12 +38,12 @@ const errorBoundary = (message?: string) => ( } - title={
{ message }
} + title={
{message}
} /> ); function ComponentItemConfigForm< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: ComponentItemConfigFormProps) { const { currentColumnID, currentComponentPath, currentTableID, previewDataSource } = React.useContext(GeneratorContext); @@ -210,7 +210,7 @@ function ComponentItemConfigForm< }; return ( - { ({ tableConfigs, setTableColumns }) => { + {({ tableConfigs, setTableColumns }) => { const tableIndex = tableConfigs.findIndex(item => item.tableId === currentTableID); const currentColumn = tableConfigs[tableIndex]?.columns.find(item => item.key === currentColumnID); let currentColumnItem; @@ -251,7 +251,7 @@ function ComponentItemConfigForm< }} /> ); - } } + }} ); } diff --git a/packages/drip-table-generator/src/layouts/attributes-layout/global-configs/index.tsx b/packages/drip-table-generator/src/layouts/attributes-layout/global-configs/index.tsx index cebce93f1..1bb439beb 100644 --- a/packages/drip-table-generator/src/layouts/attributes-layout/global-configs/index.tsx +++ b/packages/drip-table-generator/src/layouts/attributes-layout/global-configs/index.tsx @@ -5,7 +5,7 @@ * @modifier : helloqian12138 (johnhello12138@163.com) * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. */ -import { DripTableExtraOptions, DripTableSlotElementSchema } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSlotElementSchema, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import React from 'react'; @@ -13,12 +13,12 @@ import { filterAttributes, filterAttributesByRegExp } from '@/utils'; import CustomForm from '@/components/CustomForm'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps, DTGComponentPropertySchema } from '@/typing'; +import { DripTableGeneratorProps, DTGComponentPropertySchema } from '@/typing'; import { GlobalAttrFormConfigs } from './configs'; interface GlobalConfigFormProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { customAttributeComponents: DripTableGeneratorProps['customAttributeComponents']; @@ -28,7 +28,8 @@ interface GlobalConfigFormProps< } function GlobalConfigForm< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: GlobalConfigFormProps) { const context = React.useContext(GeneratorContext); @@ -373,7 +374,7 @@ function GlobalConfigForm< return ( - { ({ tableConfigs, setTableConfigs }) => { + {({ tableConfigs, setTableConfigs }) => { const currentTableIndex = tableConfigs.findIndex(item => item.tableId === context.currentTableID); return ( ); - } } + }} ); } diff --git a/packages/drip-table-generator/src/layouts/attributes-layout/index.tsx b/packages/drip-table-generator/src/layouts/attributes-layout/index.tsx index 54a623933..2fc8faa63 100644 --- a/packages/drip-table-generator/src/layouts/attributes-layout/index.tsx +++ b/packages/drip-table-generator/src/layouts/attributes-layout/index.tsx @@ -11,12 +11,12 @@ import './index.less'; import { CloseOutlined } from '@ant-design/icons'; import { Button } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { GeneratorContext } from '@/context'; import { TableConfigsContext } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import { getComponentsConfigs } from '../utils'; import ComponentConfigForm from './component-configs'; @@ -25,7 +25,7 @@ import GlobalConfigForm from './global-configs'; import { getColumnItemByPath } from './utils'; function AttributesLayout< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps) { const body = React.useRef(null); @@ -44,7 +44,7 @@ function AttributesLayout< return ( - { ({ currentTableID, currentColumnID, currentComponentPath, drawerType, setState }) => { + {({ currentTableID, currentColumnID, currentComponentPath, drawerType, setState }) => { const currentTable = tableConfigs.find(item => item.tableId === currentTableID); const currentColumn = currentTable?.columns.find(item => item.key === currentColumnID); const isContainerColumn = currentColumn && (currentColumn.component === 'group' || currentColumn.component === 'popover'); @@ -73,31 +73,31 @@ function AttributesLayout< currentComponentID: void 0, })} /> - { drawerType ? drawerTitleMapper[drawerType] : '' } - { drawerType === 'column' + {drawerType ? drawerTitleMapper[drawerType] : ''} + {drawerType === 'column' ? ( 组件 > - { ' ' } - { getComponentName(currentColumn?.component || '') } + {' '} + {getComponentName(currentColumn?.component || '')} ) - : null } - { drawerType === 'column-item' + : null} + {drawerType === 'column-item' ? ( - { currentColumnItem ? `子组件 > ${getComponentName(currentColumnItem?.component)}` : '' } + {currentColumnItem ? `子组件 > ${getComponentName(currentColumnItem?.component)}` : ''} ) - : null } - { drawerType === 'table' + : null} + {drawerType === 'table' ? ( 表格ID: - { currentTableID } + {currentTableID} ) - : null } + : null}
{ @@ -136,7 +136,7 @@ function AttributesLayout<
); - } } + }}
); } diff --git a/packages/drip-table-generator/src/layouts/index.tsx b/packages/drip-table-generator/src/layouts/index.tsx index 3f89d175f..636056bff 100644 --- a/packages/drip-table-generator/src/layouts/index.tsx +++ b/packages/drip-table-generator/src/layouts/index.tsx @@ -9,18 +9,18 @@ import './index.less'; import { Modal } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { GeneratorContext } from '@/context'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '../typing'; +import { DripTableGeneratorProps } from '../typing'; import AttributesLayout from './attributes-layout'; import TableWorkStation from './table-workstation'; import Toolbar from './toolbar'; function GeneratorLayout< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps) { const { drawerType } = React.useContext(GeneratorContext); @@ -29,7 +29,7 @@ function GeneratorLayout< className="jfe-drip-table-generator-layouts-model-container" style={{ ...props.style, width: props.width ?? props.style?.width ?? 1000, height: props.height ?? props.style?.height ?? 640 }} > - { props.showToolbar !== false && } + {props.showToolbar !== false && }
- { props.showAttributeLayout !== false && } + {props.showAttributeLayout !== false && }
), [ @@ -49,7 +49,7 @@ function GeneratorLayout< className="jfe-drip-table-generator-layouts-container" style={{ ...props.style, width: props.width ?? props.style?.width ?? '100%', height: props.height ?? props.style?.height ?? '100%' }} > - { props.showToolbar !== false && } + {props.showToolbar !== false && }
- { props.showAttributeLayout !== false && } + {props.showAttributeLayout !== false && }
) diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/pagination/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/components/pagination/index.tsx index 7a1be9e05..09f923c40 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/pagination/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/pagination/index.tsx @@ -7,29 +7,29 @@ */ import { Pagination, PaginationProps } from 'antd'; -import { DripTableColumnSchema, DripTableExtraOptions, DripTableSchema } from 'drip-table'; +import { DripTableColumnSchema, DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSchema, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { safeEvaluate } from '@/utils/sandbox'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import { parseReactCSS } from './dom'; export type PaginationComponentProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, -CustomColumnSchema extends DripTableColumnSchema = never, -SubtableDataSourceKey extends React.Key = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, + CustomColumnSchema extends DripTableColumnSchema = never, + SubtableDataSourceKey extends React.Key = never, > = DripTableSchema['pagination'] & Omit & { renderPagination: DripTableGeneratorProps['renderPagination']; ext?: DripTableExtraOptions['CustomComponentExtraData']; }; function PaginationComponent< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, -CustomColumnSchema extends DripTableColumnSchema = never, -SubtableDataSourceKey extends React.Key = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, + CustomColumnSchema extends DripTableColumnSchema = never, + SubtableDataSourceKey extends React.Key = never, >(props: PaginationComponentProps) { if (!props) { return null; } const renderShowTotal = (showTotal?: string | boolean) => { diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less index 04c6a014f..9d89fdf82 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less @@ -15,7 +15,12 @@ padding: 0 12px 8px; width: max-content; position: relative; - min-width: 300px; + min-width: 500px; + max-width: 100%; + display: flex; + flex-direction: column; + overflow-x: auto; + overflow: visible; &:hover { border: 1px dashed var(--drip-table-border-color, @border-color); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx index 836b390f0..a8775616c 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx @@ -11,17 +11,17 @@ import './index.less'; import { PicLeftOutlined, SettingOutlined } from '@ant-design/icons'; import { AutoComplete, Button, Dropdown, Tooltip } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { mockId } from '@/utils'; import { DripTableGeneratorContext, GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; export interface TableContainerProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, > { tableConfig: DTGTableConfig; children: React.ReactNode; @@ -57,19 +57,21 @@ function SubTableSetting(props: SubTableSettingProps) { if (dataSource) { fields = Object.keys(dataSource).filter(key => Array.isArray(dataSource[key])); } - } catch {} + } catch { + return []; + } } return fields; }, [context.previewDataSource, context.currentTableID, tableContext.tableConfigs]); return ( - { ({ tableConfigs, updateTableConfig, updateTableConfigs }) => { + {({ tableConfigs, updateTableConfig, updateTableConfigs }) => { const currentTableIndex = tableConfigs.findIndex(item => item.tableId === context.currentTableID); return (
-
{ props.label }
+
{props.label}
); - } } + }} ); } const TableContainer = React.forwardRef(< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: TableContainerProps, ref: React.ForwardedRef) => { const containerRef = React.useRef(null); React.useImperativeHandle(ref, () => ({ @@ -121,9 +123,9 @@ ExtraOptions extends Partial = never, return ( - { ({ currentTableID, drawerType, setState }) => (props.tableTools && props.tableTools.length === 0 + {({ currentTableID, drawerType, setState }) => (props.tableTools && props.tableTools.length === 0 ? ( -
{ props.children }
+
{props.children}
) : (
= never, }); }} > - { currentTableID === props.tableConfig.tableId && ( -
- - 表格ID: - { ' ' } - { props.tableConfig.tableId } - -
- { !props.tableTools || props.tableTools.includes('config') - ? ( - - - - ) - : null } - { !props.tableTools || props.tableTools.includes('subtable') - ? ( - - + {currentTableID === props.tableConfig.tableId && ( +
+ + 表格ID: + {' '} + {props.tableConfig.tableId} + +
+ {!props.tableTools || props.tableTools.includes('config') + ? ( + - - ) - : null } + ) + : null} + {!props.tableTools || props.tableTools.includes('subtable') + ? ( + + + + + + ) + : null} +
-
- ) } - { props.children } + )} + {props.children}
- )) } + ))} ); }); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-footer/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-footer/index.tsx index 667f077cf..39f6b5eec 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-footer/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-footer/index.tsx @@ -11,7 +11,7 @@ import './index.less'; import { DownOutlined, PlusOutlined } from '@ant-design/icons'; import { Button, Input, Select } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions, DripTableSlotElementSchema, DripTableTableInformation } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSlotElementSchema, DripTableTableInformation, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import React from 'react'; @@ -19,12 +19,12 @@ import RichText from '@/components/RichText'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, DTGTableConfigsContext, TableConfigsContext } from '@/context/table-configs'; import { getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import PaginationComponent from '../components/pagination'; interface EditableTableFooterProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { ext: ExtraOptions['CustomComponentExtraData']; @@ -35,7 +35,8 @@ interface EditableTableFooterProps< } function EditableTableFooter< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: EditableTableFooterProps) { const context = React.useContext(GeneratorContext); @@ -56,7 +57,7 @@ function EditableTableFooter< } if (config.type === 'text') { - return

{ config.text }

; + return

{config.text}

; } if (config.type === 'html') { @@ -66,14 +67,14 @@ function EditableTableFooter< if (config.type === 'search') { return (
- { config.searchKeys && ( + {config.searchKeys && ( - ) } + )} ); } - return { `自定义插槽组件渲染函数 tableProps.slots['${config.slot}'] 不存在` }; + return {`自定义插槽组件渲染函数 tableProps.slots['${config.slot}'] 不存在`}; } if (config.type === 'insert-button') { @@ -112,7 +113,7 @@ function EditableTableFooter< icon={config.showIcon && } style={config.insertButtonStyle} > - { config.insertButtonText } + {config.insertButtonText} ); } @@ -120,7 +121,7 @@ function EditableTableFooter< if (config.type === 'display-column-selector') { return ( ); @@ -150,11 +151,13 @@ function EditableTableFooter< newColumns.splice(index, 1, currentCell); setCurrentCellIndex(-1); setCurrentCell(void 0); - const configs = cloneDeep({ ...globalConfigs, + const configs = cloneDeep({ + ...globalConfigs, footer: { ...globalConfigs.footer, elements: newColumns, - } }); + }, + }); setTableConfigs(configs, 0); } } @@ -162,7 +165,7 @@ function EditableTableFooter< return ( - { ({ tableConfigs, setTableConfigs }) => { + {({ tableConfigs, setTableConfigs }) => { const globalConfigs = tableConfigs[0].configs; const paginationInFooter = typeof globalConfigs.pagination === 'object' && globalConfigs.pagination.position?.startsWith('bottom'); const tableInfo = { @@ -178,24 +181,24 @@ function EditableTableFooter< }; return (
- { paginationInFooter && typeof globalConfigs.pagination === 'object' && ( - { - const configs = { ...globalConfigs }; - if (typeof configs.pagination === 'object') { - configs.pagination.pageSize = size; - } - setTableConfigs(configs, 0); - props.onPageChange?.(current, size, tableInfo); - }} - onChange={(page, pageSize) => props.onPageChange?.(page, pageSize, tableInfo)} - /> - ) } + {paginationInFooter && typeof globalConfigs.pagination === 'object' && ( + { + const configs = { ...globalConfigs }; + if (typeof configs.pagination === 'object') { + configs.pagination.pageSize = size; + } + setTableConfigs(configs, 0); + props.onPageChange?.(current, size, tableInfo); + }} + onChange={(page, pageSize) => props.onPageChange?.(page, pageSize, tableInfo)} + /> + )}
{ typeof globalConfigs.footer === 'object' @@ -217,14 +220,14 @@ function EditableTableFooter< })} style={{ width: Number(element.span) ? `${(Number(element.span) * 100) / 24}%` : void 0, ...element.style }} > - { renderColumnContent(element) } + {renderColumnContent(element)}
)) }
); - } } + }} ); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-header/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-header/index.tsx index 55f117ce4..837b2d268 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-header/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-header/index.tsx @@ -11,7 +11,7 @@ import './index.less'; import { DownOutlined, PlusOutlined } from '@ant-design/icons'; import { Button, Input, Select } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions, DripTableSlotElementSchema, DripTableTableInformation } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSlotElementSchema, DripTableTableInformation, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import React from 'react'; @@ -19,12 +19,12 @@ import RichText from '@/components/RichText'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, DTGTableConfigsContext, TableConfigsContext } from '@/context/table-configs'; import { getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import PaginationComponent from '../components/pagination'; interface EditableTableHeaderProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { ext: ExtraOptions['CustomComponentExtraData']; @@ -35,7 +35,8 @@ interface EditableTableHeaderProps< } function EditableTableHeader< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: EditableTableHeaderProps) { const context = React.useContext(GeneratorContext); @@ -56,7 +57,7 @@ function EditableTableHeader< } if (config.type === 'text') { - return

{ config.text }

; + return

{config.text}

; } if (config.type === 'html') { @@ -66,14 +67,14 @@ function EditableTableHeader< if (config.type === 'search') { return (
- { config.searchKeys && ( + {config.searchKeys && ( - ) } + )} ); } - return { `自定义插槽组件渲染函数 tableProps.slots['${config.slot}'] 不存在` }; + return {`自定义插槽组件渲染函数 tableProps.slots['${config.slot}'] 不存在`}; } if (config.type === 'insert-button') { @@ -112,7 +113,7 @@ function EditableTableHeader< icon={config.showIcon && } style={config.insertButtonStyle} > - { config.insertButtonText } + {config.insertButtonText} ); } @@ -120,7 +121,7 @@ function EditableTableHeader< if (config.type === 'display-column-selector') { return ( ); @@ -150,11 +151,13 @@ function EditableTableHeader< newColumns.splice(index, 1, currentCell); setCurrentCellIndex(-1); setCurrentCell(void 0); - const configs = cloneDeep({ ...globalConfigs, + const configs = cloneDeep({ + ...globalConfigs, header: { ...globalConfigs.header, elements: newColumns, - } }); + }, + }); setTableConfigs(configs, 0); } } @@ -162,7 +165,7 @@ function EditableTableHeader< return ( - { ({ tableConfigs, setTableConfigs }) => { + {({ tableConfigs, setTableConfigs }) => { const globalConfigs = tableConfigs[0].configs; const paginationInHeader = typeof globalConfigs.pagination === 'object' && globalConfigs.pagination.position?.startsWith('top'); const tableInfo = { @@ -178,7 +181,7 @@ function EditableTableHeader< }; return (
- { paginationInHeader && typeof globalConfigs.pagination === 'object' && ( + {paginationInHeader && typeof globalConfigs.pagination === 'object' && ( - ) } + )}
{ typeof globalConfigs.header === 'object' @@ -216,14 +219,14 @@ function EditableTableHeader< })} style={{ width: Number(element.span) ? `${(Number(element.span) * 100) / 24}%` : void 0, ...element.style }} > - { renderColumnContent(element) } + {renderColumnContent(element)}
)) }
); - } } + }} ); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/cell.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/cell.tsx index 504c39d5f..092ffaac4 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/cell.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/cell.tsx @@ -9,23 +9,21 @@ import './index.less'; import { Alert } from 'antd'; import { - DripTableExtraOptions, + DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption, } from 'drip-table'; import React from 'react'; -import { DataSourceTypeAbbr } from '@/typing'; - import CommonCell, { CommonCellProps } from './common'; import GroupCell, { GroupCellProps } from './group'; import PopoverCell, { PopoverCellProps } from './popover'; export type TableCellProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, > = PopoverCellProps | GroupCellProps | CommonCellProps function CellComponent< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: TableCellProps) { if (props.column?.component === 'group') { return } />; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/common.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/common.tsx index 2b62441d9..18fbb209a 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/common.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/common.tsx @@ -13,16 +13,19 @@ import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableProps, + DripTableRecordTypeBase, + DripTableRecordTypeWithSubtable, + ExtractDripTableExtraOption, TABLE_LAYOUT_COLUMN_RENDER_GENERATOR_DO_NOT_USE_IN_PRODUCTION as columnRenderGenerator, } from 'drip-table'; import React from 'react'; import { filterAttributes } from '@/utils'; import { createEvaluator, evaluate, finalizeString, safeEvaluate } from '@/utils/sandbox'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; export interface CommonCellProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { column: DripTableBuiltInColumnSchema; @@ -50,7 +53,7 @@ const generatorComponentSchema = ); function CommonCell< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: CommonCellProps) { if (props.column?.component === 'group' || props.column?.component === 'popover') { @@ -84,7 +87,7 @@ function CommonCell< : () =>
; return ( - { renderCommonCell(null, { type: 'body', key: '$$KEY$$', record: props.record, index: props.rowIndex }, props.rowIndex) } + {renderCommonCell(null, { type: 'body', key: '$$KEY$$', record: props.record, index: props.rowIndex }, props.rowIndex)} ); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/group.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/group.tsx index b13456a58..5f8657c75 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/group.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/group.tsx @@ -14,19 +14,22 @@ import classNames from 'classnames'; import { DripTableBuiltInColumnSchema, DripTableExtraOptions, + DripTableRecordTypeBase, + DripTableRecordTypeWithSubtable, + ExtractDripTableExtraOption, } from 'drip-table'; import React from 'react'; import { GeneratorContext } from '@/context'; import { DTGTableConfig } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import ComponentsSelector from '../components-selector'; import CellComponent from './cell'; import { CommonCellProps } from './common'; export interface GroupCellProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > extends CommonCellProps { column: DripTableBuiltInColumnSchema; @@ -48,7 +51,8 @@ export interface GroupCellProps< const getIndex = (layout: number[], rowIndex: number, colIndex: number) => layout.slice(0, rowIndex).reduce((prev, curr) => prev + curr, 0) + colIndex; function GroupCell< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: GroupCellProps) { const [dropDownIndex, setDropDownIndex] = React.useState([] as (number | 'content' | 'popover')[]); @@ -88,7 +92,7 @@ function GroupCell< onClick={e => e.stopPropagation()} >
- { options.layout.map((colLength, rowIndex) => ( + {options.layout.map((colLength, rowIndex) => ( - { Array.from({ length: colLength }, (v, i) => i).map((col, colIndex) => { + {Array.from({ length: colLength }, (v, i) => i).map((col, colIndex) => { const componentIndex = getIndex(options.layout, rowIndex, colIndex); const itemColumn = options.items[componentIndex] ?? null; const itemColumnSchema = itemColumn && 'component' in itemColumn ? itemColumn : itemColumn?.schema; @@ -123,7 +127,7 @@ function GroupCell< }); }} > - { itemColumnSchema && itemColumnSchema.key === currentComponentID && ( + {itemColumnSchema && itemColumnSchema.key === currentComponentID && (
- ) } - { itemColumnSchema + )} + {itemColumnSchema ? ( 点击添加子组件
- ) } + )} ); - }) } + })} - )) } + ))}
diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/index.tsx index 475b035ef..e30ecd19c 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/index.tsx @@ -11,6 +11,9 @@ import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableProps, + DripTableRecordTypeBase, + DripTableRecordTypeWithSubtable, + ExtractDripTableExtraOption, } from 'drip-table'; import React from 'react'; @@ -18,14 +21,14 @@ import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { getColumnItemByPath, updateColumnItemByPath } from '@/layouts/attributes-layout/utils'; import { getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import CellComponent from './cell'; import { GroupCellProps } from './group'; import { PopoverCellProps } from './popover'; interface TableCellProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { column: DripTableBuiltInColumnSchema; @@ -50,13 +53,13 @@ interface TableCellProps< } function TableCell< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: TableCellProps) { const { tableConfigs } = React.useContext(TableConfigsContext); return ( - { ({ setTableColumns }) => { + {({ setTableColumns }) => { const onChangeColumnItem: PopoverCellProps['onChangeColumnItem'] = (path, schema, tableIndex) => { const newColumns = [...props.tableConfig.columns]; const newColumn = updateColumnItemByPath(newColumns[props.columnIndex], path, schema); @@ -102,7 +105,7 @@ ExtraOptions extends Partial = never, }; return ( - { ({ setState }) => ( + {({ setState }) => ( = never, }); }} /> - ) } + )} ); - } } + }} ); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/popover.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/popover.tsx index 895296c16..8559e07c6 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/popover.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/cell/popover.tsx @@ -15,20 +15,23 @@ import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableProps, + DripTableRecordTypeBase, + DripTableRecordTypeWithSubtable, + ExtractDripTableExtraOption, } from 'drip-table'; import React from 'react'; import { GeneratorContext } from '@/context'; import { DTGTableConfig } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import ComponentsSelector from '../components-selector'; import CellComponent from './cell'; import { CommonCellProps } from './common'; export interface PopoverCellProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never,> extends CommonCellProps { + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never,> extends CommonCellProps { column: DripTableBuiltInColumnSchema; path: (number | 'popover' | 'content')[]; onChangeColumnItem: (path: (number | 'popover' | 'content')[], schema: DripTableBuiltInColumnSchema, tableIndex: number) => void; @@ -45,8 +48,8 @@ ExtraOptions extends Partial = never,> extends CommonCell } function PopoverCell< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never,>(props: PopoverCellProps) { + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never,>(props: PopoverCellProps) { const [dropDown, setDropDown] = React.useState(false); const [popoverDropDown, setPopoverDropDown] = React.useState(false); const { currentComponentID } = React.useContext(GeneratorContext); @@ -113,25 +116,25 @@ ExtraOptions extends Partial = never,>(props: PopoverCell }); }} > - { options.popover.key === currentComponentID && ( - { if (!open) { setPopoverDropDown(false); } }} - dropdownRender={DropdownRender1} - > -
- - { - e.stopPropagation(); - setPopoverDropDown(true); - }} - /> - -
-
- ) } + {options.popover.key === currentComponentID && ( + { if (!open) { setPopoverDropDown(false); } }} + dropdownRender={DropdownRender1} + > +
+ + { + e.stopPropagation(); + setPopoverDropDown(true); + }} + /> + +
+
+ )} = never,>(props: PopoverCell }); }} > - { options.content.key === currentComponentID && ( - { if (!open) { setDropDown(false); } }} - dropdownRender={DropdownRender2} - > -
- - { - e.stopPropagation(); - setDropDown(true); - }} - /> - -
-
- ) } + {options.content.key === currentComponentID && ( + { if (!open) { setDropDown(false); } }} + dropdownRender={DropdownRender2} + > +
+ + { + e.stopPropagation(); + setDropDown(true); + }} + /> + +
+
+ )} >, -ExtraOptions extends Partial = never, ->{ +export interface ColumnHeaderProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +> { tableConfig: DTGTableConfig; renderHeaderCellFilter: DripTableGeneratorProps['renderHeaderCellFilter']; column: DTGTableConfig['columns'][number]; @@ -26,8 +26,8 @@ ExtraOptions extends Partial = never, } export function FilterViewer< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: ColumnHeaderProps) { const tableContext = React.useContext(TableConfigsContext); const [filteredValue, setFilteredValue] = React.useState(props.column.defaultFilteredValue || []); @@ -47,20 +47,20 @@ ExtraOptions extends Partial = never, } return ( - { ({ setState }) => ( + {({ setState }) => ( setFilteredValue(checkedValues as React.Key[])} > - { props.column.filters?.map((item, index) => ( + {props.column.filters?.map((item, index) => ( - { item.text } + {item.text} - )) } + ))} - )} + )} icon={null} cancelText="重置" okText="确认" @@ -87,7 +87,7 @@ ExtraOptions extends Partial = never, > - ) } + )} ); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.less index d6896f5ac..382168054 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.less @@ -23,6 +23,7 @@ min-width: 120px; text-align: center; position: relative; + display: flex; &.large { padding: 0 16px; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.tsx index 03eae39bb..a8db91d10 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/column-header/index.tsx @@ -10,7 +10,7 @@ import './index.less'; import { ArrowLeftOutlined, ArrowRightOutlined, CaretDownOutlined, CaretUpOutlined, CopyOutlined, DeleteOutlined, EllipsisOutlined, QuestionCircleOutlined, SettingOutlined } from '@ant-design/icons'; import { Alert, Button, Dropdown, MenuProps, message, Popconfirm, Popover, Tooltip } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import ClipboardButton from 'react-clipboard.js'; @@ -18,15 +18,16 @@ import { formatNumber } from '@/utils'; import RichText from '@/components/RichText'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import ComponentsSelector from '../components-selector'; import { FilterViewer } from './filter'; -export interface ColumnHeaderProps < -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, ->{ +export interface ColumnHeaderProps< + RecordType extends DripTableRecordTypeWithSubtable>, + + ExtraOptions extends Partial = never, +> { tableConfig: DTGTableConfig; column: DTGTableConfig['columns'][number]; containerWidth: number; @@ -41,8 +42,9 @@ ExtraOptions extends Partial = never, renderHeaderCellFilter: DripTableGeneratorProps['renderHeaderCellFilter']; } function ColumnHeader< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + + ExtraOptions extends Partial = never, >(props: ColumnHeaderProps) { const [selector, setSelector] = React.useState(''); const columnTitle = React.useMemo(() => { @@ -187,7 +189,7 @@ ExtraOptions extends Partial = never, return ( - { ({ currentComponentPath, currentColumnID, currentComponentID, currentTableID, drawerType, setState }) => ( + {({ currentComponentPath, currentColumnID, currentComponentID, currentTableID, drawerType, setState }) => (
= never, onMouseEnter={() => setState({ currentHoverColumnID: props.column.key })} onMouseLeave={() => setState({ currentHoverColumnID: void 0 })} > - { props.tableConfig.tableId === currentTableID && props.column.key === currentColumnID && ( + {props.tableConfig.tableId === currentTableID && props.column.key === currentColumnID && ( - { ({ tableConfigs, setTableColumns }) => ( + {({ tableConfigs, setTableColumns }) => (
e.stopPropagation()}> - { (!props.columnTools || props.columnTools.includes('config')) && ( - -
- ) } + )}
- ) } + )}
0 ? columnTitleWidth : '100%', textAlign: props.column.align, - display: 'inline-block', + display: 'flex', }} > - { props.column.description && ( + {props.column.description && ( }> - ) } + )}
{ columnRightCount > 0 && (
- { props.column.sorter && ( - )}> - { props.column.sortDirections?.length === 1 && props.column.sortDirections[0] === 'ascend' && ( - - ) } - { props.column.sortDirections?.length === 1 && props.column.sortDirections[0] === 'descend' && ( - - ) } - { (!props.column.sortDirections || props.column.sortDirections?.length !== 1) && ( - - - - - ) } - - ) } - { props.column.filters && props.column.filters.length > 0 && ( + {props.column.sorter && ( + )}> + {props.column.sortDirections?.length === 1 && props.column.sortDirections[0] === 'ascend' && ( + + )} + {props.column.sortDirections?.length === 1 && props.column.sortDirections[0] === 'descend' && ( + + )} + {(!props.column.sortDirections || props.column.sortDirections?.length !== 1) && ( + + + + + )} + + )} + {props.column.filters && props.column.filters.length > 0 && ( - ) } + )}
) }
- ) } + )}
); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/components-selector/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/components-selector/index.tsx index 8fb8147b1..d3902d8ef 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/components-selector/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/components-selector/index.tsx @@ -8,20 +8,20 @@ import './index.less'; import { Button, Input, message } from 'antd'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { filterAttributes, mockId } from '@/utils'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { getComponentsConfigs, getGroups, getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableComponentAttrConfig, DripTableGeneratorProps } from '@/typing'; +import { DripTableComponentAttrConfig, DripTableGeneratorProps } from '@/typing'; import Selector from './selector'; interface ComponentsSelectorProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, ->{ + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +> { tableId: string; showTitle?: boolean; showFilter?: boolean; @@ -65,8 +65,8 @@ const getColumnSchemaByComponent = (component: DripTableComponentAttrConfig, tit }; function ComponentsSelector< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: ComponentsSelectorProps) { const [groups, setGroups] = React.useState(getGroups(props.customComponentPanel)); const [components, setComponents] = React.useState(getComponentsConfigs('', props.customComponentPanel, 'ComponentsSelector')); @@ -88,23 +88,23 @@ ExtraOptions extends Partial = never, return ( - { ({ tableConfigs, setTableColumns }) => (props.customColumnAddPanel + {({ tableConfigs, setTableColumns }) => (props.customColumnAddPanel ? props.customColumnAddPanel({ tableConfig: tableConfigs.find(c => c.tableId === props.tableId), components, }) : (
e.stopPropagation()}> - { props.showTitle && ( -
- { setTitle(e.target.value); }} - /> -
- ) } + {props.showTitle && ( +
+ { setTitle(e.target.value); }} + /> +
+ )} = never, setComponentConfig(component); }} /> - { componentConfig?.['ui:type'] === 'popover' && ( + {componentConfig?.['ui:type'] === 'popover' && (
浮窗组件
= never, }} />
- ) } - { componentConfig?.['ui:type'] === 'popover' && ( + )} + {componentConfig?.['ui:type'] === 'popover' && (
单元格内组件
= never, />
- ) } + )}
- )) } + ))}
); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.less index 1aa5a0cb2..2e55cc6b4 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.less @@ -101,3 +101,8 @@ display: none; } } + +.@{prefixCls}-left-fixed-part { + position: sticky; + left: 0; +} diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.tsx index c073c3c0b..cacca9109 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/header-list/index.tsx @@ -10,23 +10,21 @@ import './index.less'; import { PlusOutlined } from '@ant-design/icons'; import { Button, Checkbox, Dropdown } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { ReactSortable } from 'react-sortablejs'; import { filterArray } from '@/utils'; import { DTGTableConfig } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import ColumnHeader from '../column-header'; import ComponentsSelector from '../components-selector'; interface ColumnHeaderListProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, > { - scrollTarget: string; - scrollLeft: number; tableConfig: DTGTableConfig; containerWidth: number; draggable: DripTableGeneratorProps['draggable']; @@ -36,14 +34,13 @@ ExtraOptions extends Partial = never, customColumnAddPanel?: DripTableGeneratorProps['customColumnAddPanel']; onColumnAdded?: DripTableGeneratorProps['onColumnAdded']; onResort: (column: DTGTableConfig['columns']) => void; - onScroll: (scrollLeft: number) => void; onClick: DripTableGeneratorProps['onClick']; renderHeaderCellFilter: DripTableGeneratorProps['renderHeaderCellFilter']; } function ColumnHeaderList< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: ColumnHeaderListProps) { const scrollableRow = React.useRef(null); const [dropdownOpen, setDropdownOpen] = React.useState(false); @@ -55,11 +52,6 @@ ExtraOptions extends Partial = never, leftFixedColumns = filterArray(columnList, item => item.column.fixed === 'left' || (item.column.fixed && item.id < sortableColumns[0].id)); rightFixedColumns = filterArray(columnList, item => item.column.fixed === 'right' || (item.column.fixed && item.id > sortableColumns[0].id)); } - React.useEffect(() => { - if (scrollableRow.current && props.scrollTarget !== '') { - scrollableRow.current.scrollLeft = props.scrollLeft; - } - }, [props.scrollLeft, props.scrollTarget]); const DropdownRender = React.useCallback(() => ( = never, [props.tableConfig.configs.size || 'default']: props.tableConfig.configs.size, })} > - { props.tableConfig.hasSubTable && ( + {props.tableConfig.hasSubTable && (
= never, })} style={{ width: 48, minWidth: 48 }} /> - ) } - { props.tableConfig.configs.rowSelection && ( + )} + {props.tableConfig.configs.rowSelection && (
= never, >
- ) } - { leftFixedColumns.length > 0 - ? leftFixedColumns.map((columnWrapper, index) => ( - - )) - : null } + )} + {leftFixedColumns.length > 0 + ? ( +
+ {leftFixedColumns.map((columnWrapper, index) => ( + + ))} +
+ ) + : null}
= never, overflowX: props.tableConfig.configs.scroll?.x ? 'auto' : void 0, overflowY: 'hidden', }} - onScroll={(e) => { if (!props.scrollTarget) { props.onScroll((e.target as HTMLDivElement).scrollLeft); } }} > = never, }} style={{ display: 'flex' }} > - { sortableColumns.map(columnWrapper => ( + {sortableColumns.map(columnWrapper => ( = never, renderHeaderCellFilter={props.renderHeaderCellFilter} containerWidth={props.containerWidth} /> - )) } + ))}
- { rightFixedColumns.length > 0 + {rightFixedColumns.length > 0 ? rightFixedColumns.map((columnWrapper, index) => ( = never, containerWidth={props.containerWidth} /> )) - : null } + : null}
.@{prefixCls}-row { + display: flex; + width: 100%; + } + + & > .@{prefixCls}-header { + background: #dddddd; + font-weight: bold; + position: sticky; + top: 0; + } +} diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx new file mode 100644 index 000000000..ed9db4490 --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -0,0 +1,88 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ +import './index.less'; + +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; +import React from 'react'; + +import { GeneratorContext } from '@/context'; +import { DTGTableConfig } from '@/context/table-configs'; +import { DripTableGeneratorProps } from '@/typing'; + +import ColumnHeader from '../column-header'; +import TableSection from '../table-section'; + +export interface LeftFixedColumnsProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never +> extends DripTableGeneratorProps { + tableConfig: DTGTableConfig; + previewDataSource: ({ id: number; record: RecordType })[]; + containerWidth: number; + rowHeight: number | undefined; + columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; + ref?: React.RefObject; +} + +export interface LeftFixedColumnsHandler { + getRowHeight: () => number; +} + +function LeftFixedColumnsInner< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never +>( + props: LeftFixedColumnsProps, + ref: React.ForwardedRef, +) { + const context = React.useContext(GeneratorContext); + console.debug(context); + const rowRef = React.createRef(); + React.useImperativeHandle(ref, () => ({ + getRowHeight: () => rowRef.current?.offsetHeight ?? 0, + })); + return ( +
+
+ {props.columnList.map(columnWrapper => ( + + ))} +
+ {props.previewDataSource.map((record, rowIndex) => ( +
+ +
+ ))} +
+ ); +} + +// 使用 forwardRef 包装 +const LeftFixedColumns = React.forwardRef(LeftFixedColumnsInner) as >, + ExtraOptions extends Partial = never>(props: LeftFixedColumnsProps, ref: React.ForwardedRef) => JSX.Element; + +export default LeftFixedColumns; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less new file mode 100644 index 000000000..eca5270e2 --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less @@ -0,0 +1,36 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ + +@import url("../../../../../styles/index.less"); + +@prefixCls: jfe-drip-table-generator-workstation-table; + +.@{prefixCls}-fixed-column { + position: sticky; + z-index: 3; + background: #ffffff; + height: max-content; + + &.right { + right: 0; + border-left: 1px solid rgb(120 120 120); + box-shadow: 0 4px 4px -1px #ffffff, 2px 0 4px -2px rgb(0 0 0 / 85%); + } + + & > .@{prefixCls}-row { + display: flex; + width: 100%; + } + + & > .@{prefixCls}-header { + background: #dddddd; + font-weight: bold; + position: sticky; + top: 0; + } +} diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx new file mode 100644 index 000000000..09fe36dae --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx @@ -0,0 +1,88 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ +import './index.less'; + +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; +import React from 'react'; + +import { GeneratorContext } from '@/context'; +import { DTGTableConfig } from '@/context/table-configs'; +import { DripTableGeneratorProps } from '@/typing'; + +import ColumnHeader from '../column-header'; +import TableSection from '../table-section'; + +export interface RightFixedColumnsProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never +> extends DripTableGeneratorProps { + tableConfig: DTGTableConfig; + previewDataSource: ({ id: number; record: RecordType })[]; + containerWidth: number; + rowHeight: number | undefined; + columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; + ref?: React.RefObject; +} + +export interface RightFixedColumnsHandler { + getRowHeight: () => number; +} + +function RightFixedColumnsInner< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never +>( + props: RightFixedColumnsProps, + ref: React.ForwardedRef, +) { + const context = React.useContext(GeneratorContext); + console.debug(context); + const rowRef = React.createRef(); + React.useImperativeHandle(ref, () => ({ + getRowHeight: () => rowRef.current?.offsetHeight ?? 0, + })); + return ( +
+
+ {props.columnList.map(columnWrapper => ( + + ))} +
+ {props.previewDataSource.map((record, rowIndex) => ( +
+ +
+ ))} +
+ ); +} + +// 使用 forwardRef 包装 +const RightFixedColumns = React.forwardRef(RightFixedColumnsInner) as >, + ExtraOptions extends Partial = never>(props: RightFixedColumnsProps, ref: React.ForwardedRef) => JSX.Element; + +export default RightFixedColumns; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.tsx index c3590f4aa..c8f93152d 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.tsx @@ -10,21 +10,21 @@ import './index.less'; import { PlusSquareOutlined } from '@ant-design/icons'; import { Checkbox } from 'antd'; import classNames from 'classnames'; -import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableProps } from 'drip-table'; +import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableProps, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { filterArray, formatNumber } from '@/utils'; import { GeneratorContext } from '@/context'; import { DTGTableConfig } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import TableCell from '../cell'; import RowHeader from './row-header'; interface TableRowListProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, ->{ + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +> { rowIndex: number; isLastRow?: boolean; scrollTarget: string; @@ -59,8 +59,8 @@ const VerticalAligns = { }; function TableRowList< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: TableRowListProps) { const { currentTableID, currentColumnID, currentHoverColumnID, previewDataSource } = React.useContext(GeneratorContext); const scrollableRow = React.useRef(null); @@ -135,14 +135,14 @@ ExtraOptions extends Partial = never, return ( - { props.tableConfig.configs.rowHeader && ( + {props.tableConfig.configs.rowHeader && ( - ) } + )}
{ @@ -150,44 +150,47 @@ ExtraOptions extends Partial = never, props.onClick?.('row-click', { record: props.record, recordIndex: props.rowIndex }); }} > - { props.tableConfig.hasSubTable && ( -
- { props.hasSubTable && } -
- ) } - { props.tableConfig.configs.rowSelection && ( -
- { - props.renderSelection - ? ( - false} - /> - ) - : - } -
- ) } - { leftFixedColumns.length > 0 - ? leftFixedColumns.map((columnWrapper, index) => - renderTableCell(columnWrapper.column as DripTableBuiltInColumnSchema, columnWrapper.id, { - showRightShadow: index === leftFixedColumns.length - 1, - isLastRow: props.isLastRow, - })) - : null } + {props.tableConfig.hasSubTable && ( +
+ {props.hasSubTable && } +
+ )} + {props.tableConfig.configs.rowSelection && ( +
+ { + props.renderSelection + ? ( + false} + /> + ) + : + } +
+ )} + {leftFixedColumns.length > 0 + ? ( +
+ {leftFixedColumns.map((columnWrapper, index) => + renderTableCell(columnWrapper.column as DripTableBuiltInColumnSchema, columnWrapper.id, { + isLastRow: props.isLastRow, + }))} +
+ ) + : null}
= never, onScroll={(e) => { if (props.scrollTarget === `__row_${props.rowIndex}`) { props.onScroll((e.target as HTMLDivElement).scrollLeft); } }} >
- { sortableColumns.map(columnWrapper => + {sortableColumns.map(columnWrapper => renderTableCell(columnWrapper.column as DripTableBuiltInColumnSchema, columnWrapper.id, { isLastRow: props.isLastRow, - })) } + }))}
- { rightFixedColumns.length > 0 + {rightFixedColumns.length > 0 ? rightFixedColumns.map((columnWrapper, index) => renderTableCell(columnWrapper.column as DripTableBuiltInColumnSchema, columnWrapper.id, { showLeftShadow: !index, isLastRow: props.isLastRow, })) - : null } + : null}
diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx index 7b4e3b621..03266654e 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx @@ -9,7 +9,7 @@ import { DownOutlined, PlusOutlined } from '@ant-design/icons'; import { Button, Input, Select } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions, DripTableSlotElementSchema } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSlotElementSchema, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import React from 'react'; @@ -17,10 +17,10 @@ import RichText from '@/components/RichText'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, DTGTableConfigsContext, TableConfigsContext } from '@/context/table-configs'; import { getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; interface RowHeaderProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { ext: DripTableGeneratorProps['ext']; @@ -29,8 +29,8 @@ interface RowHeaderProps< tableConfig: DTGTableConfig; } function RowHeader< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: RowHeaderProps) { const context = React.useContext(GeneratorContext); const tableConfigsContext = React.useContext(TableConfigsContext); @@ -43,7 +43,7 @@ ExtraOptions extends Partial = never, } if (config.type === 'text') { - return

{ config.text }

; + return

{config.text}

; } if (config.type === 'html') { @@ -53,14 +53,14 @@ ExtraOptions extends Partial = never, if (config.type === 'search') { return (
- { config.searchKeys && ( + {config.searchKeys && ( - ) } + )} = never, /> ); } - return { `自定义插槽组件渲染函数 tableProps.slots['${config.slot}'] 不存在` }; + return {`自定义插槽组件渲染函数 tableProps.slots['${config.slot}'] 不存在`}; } if (config.type === 'insert-button') { @@ -99,7 +99,7 @@ ExtraOptions extends Partial = never, icon={config.showIcon && } style={config.insertButtonStyle} > - { config.insertButtonText } + {config.insertButtonText} ); } @@ -107,7 +107,7 @@ ExtraOptions extends Partial = never, if (config.type === 'display-column-selector') { return ( ); @@ -133,11 +133,13 @@ ExtraOptions extends Partial = never, newColumns.splice(cellIndex, 1, currentCell); setCurrentCellIndex(-1); setCurrentCell(void 0); - const configs = cloneDeep({ ...props.tableConfig.configs, + const configs = cloneDeep({ + ...props.tableConfig.configs, rowHeader: { ...props.tableConfig.configs.rowHeader, elements: newColumns, - } }); + }, + }); setTableConfigs(configs, tableIndex); } } @@ -145,7 +147,7 @@ ExtraOptions extends Partial = never, return ( - { ({ setTableConfigs }) => ( + {({ setTableConfigs }) => (
{ props.configs?.elements?.map((element, index) => ( @@ -161,20 +163,18 @@ ExtraOptions extends Partial = never, dropHeaderCell(element, index, setTableConfigs); }} key={index} - className={classNames( - 'jfe-drip-table-generator-workstation-editable-header-draggable-cell', { - 'jfe-drip-table-generator-workstation-editable-header-text-cell': element.type === 'text', - 'jfe-drip-table-generator-workstation-editable-header-spacer-cell': element.type === 'spacer', - }, - )} + className={classNames('jfe-drip-table-generator-workstation-editable-header-draggable-cell', { + 'jfe-drip-table-generator-workstation-editable-header-text-cell': element.type === 'text', + 'jfe-drip-table-generator-workstation-editable-header-spacer-cell': element.type === 'spacer', + })} style={{ width: Number(element.span) ? `${(Number(element.span) * 100) / 24}%` : void 0, ...element.style }} > - { renderColumnContent(element) } + {renderColumnContent(element)}
)) }
- ) } + )} ); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.less new file mode 100644 index 000000000..d53e05dfe --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.less @@ -0,0 +1,28 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ + +@import url("../../../../../styles/index.less"); + +@prefixCls: jfe-drip-table-generator-workstation-table; + +.@{prefixCls}-scrollable-columns { + width: max-content; + z-index: 2; + + & > .@{prefixCls}-row { + display: flex; + width: 100%; + } + + & > .@{prefixCls}-header { + background: #dddddd; + font-weight: bold; + position: sticky; + top: 0; + } +} diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx new file mode 100644 index 000000000..0ecb1b07d --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -0,0 +1,88 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ +import './index.less'; + +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; +import React from 'react'; + +import { GeneratorContext } from '@/context'; +import { DTGTableConfig } from '@/context/table-configs'; +import { DripTableGeneratorProps } from '@/typing'; + +import ColumnHeader from '../column-header'; +import TableSection from '../table-section'; + +export interface ScrollableColumnsProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never +> extends DripTableGeneratorProps { + tableConfig: DTGTableConfig; + previewDataSource: ({ id: number; record: RecordType })[]; + containerWidth: number; + rowHeight: number | undefined; + columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; + ref?: React.RefObject; +} + +export interface ScrollableColumnsHandler { + getRowHeight: () => number; +} + +function ScrollableColumnsInner< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never +>( + props: ScrollableColumnsProps, + ref: React.ForwardedRef, +) { + const context = React.useContext(GeneratorContext); + console.debug(context); + const rowRef = React.createRef(); + React.useImperativeHandle(ref, () => ({ + getRowHeight: () => rowRef.current?.offsetHeight ?? 0, + })); + return ( +
+
+ {props.columnList.map(columnWrapper => ( + + ))} +
+ {props.previewDataSource.map((record, rowIndex) => ( +
+ +
+ ))} +
+ ); +} + +// 使用 forwardRef 包装 +const ScrollableColumns = React.forwardRef(ScrollableColumnsInner) as >, + ExtraOptions extends Partial = never>(props: ScrollableColumnsProps, ref: React.ForwardedRef) => JSX.Element; + +export default ScrollableColumns; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less new file mode 100644 index 000000000..60e712082 --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less @@ -0,0 +1,76 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ + +@import url("../../../../../styles/index.less"); + +@prefixCls: jfe-drip-table-generator-workstation-table; + +.@{prefixCls}-tr-td { + min-width: 120px; + display: flex; + padding: 12px 8px; + border-left: 1px solid transparent; + word-break: break-word; + + &.cell { + box-sizing: border-box; + flex-shrink: 0; + border-bottom: 1px solid #efefef; + } + + &.small { + padding: 8px; + } + + &.middle { + padding: 12px 8px; + } + + &.large { + padding: 16px 12px; + } + + &.bordered { + border-right: 1px solid #efefef; + } + + &.hovered { + border-left: 1px dashed var(--drip-table-border-color, @border-color); + border-right: 1px dashed var(--drip-table-border-color, @border-color); + } + + &.last-row.hovered { + border-bottom: 1px dashed var(--drip-table-border-color, @border-color); + } + + &.checked { + border-left: 1px solid var(--drip-table-border-color, @border-color); + border-right: 1px solid var(--drip-table-border-color, @border-color); + } + + &.last-row.checked { + border-bottom: 1px solid var(--drip-table-border-color, @border-color); + } + + &.right-shadow { + box-shadow: 0 4px 4px -1px #ffffff, 2px 0 4px -2px rgb(0 0 0 / 85%); + margin-right: 4px; + } + + &.left-shadow { + box-shadow: 0 0 4px -1px #ffffff, -2px 0 4px -2px rgb(0 0 0 / 85%); + margin-left: 4px; + } + + &.operation-col { + width: 48px; + min-width: 48px; + justify-content: center; + align-items: center; + } +} diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.tsx new file mode 100644 index 000000000..a867fa781 --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.tsx @@ -0,0 +1,90 @@ +import './index.less'; + +import classNames from 'classnames'; +import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; +import React from 'react'; + +import { formatNumber } from '@/utils'; +import { GeneratorContext } from '@/context'; +import { DTGTableConfig } from '@/context/table-configs'; +import { DripTableGeneratorProps } from '@/typing'; + +import TableCell from '../cell'; + +export interface TableSectionProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +> extends DripTableGeneratorProps { + tableConfig: DTGTableConfig; + record: { id: number; record: RecordType }; + rowIndex: number; + columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; + containerWidth: number; + isLastRow: boolean; +} + +const VerticalAligns = { + top: 'flex-start', + middle: 'center', + bottom: 'flex-end', + stretch: 'stretch', +}; + +function TableSection< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +>(props: TableSectionProps) { + const { currentTableID, currentColumnID, currentHoverColumnID } = React.useContext(GeneratorContext); + const formatColumnWidth = (column: DripTableBuiltInColumnSchema) => { + if (typeof column.width === 'string' && column.width.endsWith('%')) { + const rawColumnWidth = (Number(column.width.slice(0, -1)) * props.containerWidth) / 100; + return `${rawColumnWidth}px`; + } + return formatNumber(column.width || 200); + }; + return ( + + {props.columnList.map((columnWrapper, colIndex) => ( +
+ +
+ ))} +
+ ); +} + +export default TableSection; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index f17d49053..41c786eb9 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -7,43 +7,52 @@ */ import './index.less'; -import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons'; -import { Button, Empty } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions, DripTableTableInformation } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableTableInformation, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { filterArray, mockId } from '@/utils'; -import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import PaginationComponent from '../components/pagination'; import TableContainer, { TableContainerHandler } from '../components/table-container'; -import ColumnHeaderList from './components/header-list'; -import TableRowList from './components/row'; +import LeftFixedColumns, { LeftFixedColumnsHandler } from './components/left-columns'; +import RightFixedColumns, { RightFixedColumnsHandler } from './components/right-columns'; +import ScrollableColumns, { ScrollableColumnsHandler } from './components/scroll-columns'; export interface EditableTableProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, > extends DripTableGeneratorProps { index: number; tableConfig: DTGTableConfig; - dataSource: RecordType[]; originDataSource?: RecordType[]; parent?: DripTableTableInformation; } function EditableTable< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: EditableTableProps) { - const context = React.useContext(GeneratorContext); - const [checkedRecord, setCheckedRecord] = React.useState(void 0 as number | undefined); - const [previewRecord, setPreviewRecord] = React.useState(void 0 as number | undefined); - const [scrollLeft, setScrollLeft] = React.useState(0); - const [scrollTarget, setScrollTarget] = React.useState(''); + const [previewRecord] = React.useState(void 0 as number | undefined); + const [rowHeight, setRowHeight] = React.useState(void 0 as number | undefined); const containerRef = React.useRef(null); + const leftColumnsRef = React.useRef(null); + const scrollColumnsRef = React.useRef(null); + const rightColumnsRef = React.useRef(null); + + React.useEffect(() => { + console.debug('rowHeight'); + const leftHeight = leftColumnsRef.current?.getRowHeight() ?? 0; + const scrollHeight = scrollColumnsRef.current?.getRowHeight() ?? 0; + const rightHeight = rightColumnsRef.current?.getRowHeight() ?? 0; + console.debug(leftHeight, scrollHeight, rightHeight); + if (leftHeight !== scrollHeight || rightHeight !== scrollHeight || leftHeight !== rightHeight) { + setRowHeight(Math.max(leftHeight, scrollHeight, rightHeight)); + } + }, [props.dataSource, props.schema, props.tableConfig]); + const tableHeight = React.useMemo(() => { if (props.tableConfig.configs.scroll?.y && typeof props.tableConfig.configs.scroll?.y !== 'boolean') { return props.tableConfig.configs.scroll?.y; @@ -66,184 +75,93 @@ ExtraOptions extends Partial = never, } return props.dataSource.map((rec, idx) => ({ id: idx, record: rec })); }, [props.dataSource, props.tableConfig.configs.pagination, previewRecord]); - + const previewDataSource = typeof previewRecord === 'number' ? [dataSourceToUse[previewRecord]] : dataSourceToUse; + const paginationInHeader = props.tableConfig.configs.pagination && props.tableConfig.configs.pagination.position?.startsWith('top'); + const paginationInFooter = props.tableConfig.configs.pagination && props.tableConfig.configs.pagination.position?.startsWith('bottom'); + const subTableInfo = { + uuid: props.tableConfig?.tableId, + schema: { + ...props.tableConfig?.configs, + id: props.tableConfig.tableId ?? mockId(), + columns: props.tableConfig?.columns, + dataSourceKey: props.tableConfig?.dataSourceKey, + } as DripTableTableInformation['schema'], + parent: props.parent, + dataSource: dataSourceToUse.map(item => item.record), + }; + const columnList = React.useMemo(() => props.tableConfig.columns.map((item, index) => ({ id: index, column: item })), [props.tableConfig.columns]); + const sortableColumns = filterArray(columnList, item => !item.column.fixed); + let leftFixedColumns = filterArray(columnList, item => item.column.fixed === 'left'); + let rightFixedColumns = filterArray(columnList, item => item.column.fixed === 'right'); + if (sortableColumns.length > 0) { + leftFixedColumns = filterArray(columnList, item => item.column.fixed === 'left' || (item.column.fixed && item.id < sortableColumns[0].id)); + rightFixedColumns = filterArray(columnList, item => item.column.fixed === 'right' || (item.column.fixed && item.id > sortableColumns[0].id)); + } return ( - { ({ tableConfigs, setTableColumns }) => { - const previewDataSource = typeof previewRecord === 'number' ? [dataSourceToUse[previewRecord]] : dataSourceToUse; - const paginationInHeader = props.tableConfig.configs.pagination && props.tableConfig.configs.pagination.position?.startsWith('top'); - const paginationInFooter = props.tableConfig.configs.pagination && props.tableConfig.configs.pagination.position?.startsWith('bottom'); - const subTableInfo = { - uuid: props.tableConfig?.tableId, - schema: { - ...props.tableConfig?.configs, - id: props.tableConfig.tableId ?? mockId(), - columns: props.tableConfig?.columns, - dataSourceKey: props.tableConfig?.dataSourceKey, - } as DripTableTableInformation['schema'], - parent: props.parent, - dataSource: dataSourceToUse.map(item => item.record), - }; - return ( - - { props.parent?.record && (props.subtableTitle?.(props.parent.record, props.index || 0, subTableInfo) || '') } - { props.parent?.record && props.tableConfig.configs.pagination && paginationInHeader - ? ( - - ) - : null } -
- { props.tableConfig.configs.sticky - ? ( - setTableColumns([...newColumns], props.index)} - onScroll={(left) => { setScrollLeft(left); }} - onClick={props.onClick} - onColumnAdded={props.onColumnAdded} - renderHeaderCellFilter={props.renderHeaderCellFilter} - containerWidth={tableWidth} - /> - ) - : null } -
- { !props.tableConfig.configs.sticky && ( - setTableColumns([...newColumns], props.index)} - onScroll={(left) => { setScrollLeft(left); }} - onClick={props.onClick} - onColumnAdded={props.onColumnAdded} - renderHeaderCellFilter={props.renderHeaderCellFilter} - containerWidth={tableWidth} - /> - ) } - { previewDataSource.map((wrapRecord, rowIndex) => { - const hasSubTable = tableConfigs[props.index + 1] && Object.keys(wrapRecord.record || {}).includes(tableConfigs[props.index + 1]?.dataSourceKey); - const tableInfo: DripTableTableInformation = { - uuid: props.tableConfig?.tableId, - schema: { - ...props.tableConfig?.configs, - id: props.tableConfig.tableId ?? mockId(), - columns: props.tableConfig?.columns, - dataSourceKey: props.tableConfig?.dataSourceKey, - } as DripTableTableInformation['schema'], - dataSource: wrapRecord?.[tableConfigs[props.index + 1]?.dataSourceKey || ''] as RecordType[] || [], - record: wrapRecord.record, - }; - return ( -
{ e.stopPropagation(); setScrollTarget(`__row_${rowIndex}`); }} - onMouseLeave={(e) => { e.stopPropagation(); setScrollTarget(''); }} - onClick={(e) => { - e.stopPropagation(); - if (props.generatorRowSelectable === false) { return; } - setCheckedRecord(checkedRecord === wrapRecord.id ? void 0 : wrapRecord.id); - }} - > - { checkedRecord === wrapRecord.id && props.tableConfig.tableId === context.currentTableID && ( -
-
- ) } - { setScrollLeft(left); }} - onClick={props.onClick} - onColumnItemChanged={props.onColumnItemChanged} - containerWidth={tableWidth} - schemaFunctionPreprocessor={props.schemaFunctionPreprocessor} - /> - { (props.tableConfig.hasSubTable && hasSubTable) - && ( -
- -
- ) } -
- ); - }) } - { previewDataSource.length <= 0 && (props.emptyText ? props.emptyText?.(subTableInfo) : ) } -
-
- { props.parent?.record && props.tableConfig.configs.pagination && paginationInFooter - ? ( - - ) - : null } - { props.parent?.record && (props.subtableFooter?.(props.parent.record, props.index || 0, subTableInfo) || '') } -
- ); - } } + {({ tableConfigs, setTableColumns }) => ( + + {props.parent?.record && (props.subtableTitle?.(props.parent.record, props.index || 0, subTableInfo) || '')} + {props.parent?.record && props.tableConfig.configs.pagination && paginationInHeader + ? ( + + ) + : null} +
+ + {...props} + ref={leftColumnsRef} + tableConfig={props.tableConfig} + columnList={leftFixedColumns} + previewDataSource={previewDataSource as ({ id: number; record: RecordType })[]} + containerWidth={tableWidth} + rowHeight={rowHeight} + /> + + {...props} + ref={scrollColumnsRef} + tableConfig={props.tableConfig} + columnList={sortableColumns} + previewDataSource={previewDataSource} + containerWidth={tableWidth} + rowHeight={rowHeight} + /> + + {...props} + ref={rightColumnsRef} + tableConfig={props.tableConfig} + columnList={rightFixedColumns} + previewDataSource={previewDataSource} + containerWidth={tableWidth} + rowHeight={rowHeight} + /> +
+ {props.parent?.record && props.tableConfig.configs.pagination && paginationInFooter + ? ( + + ) + : null} + {props.parent?.record && (props.subtableFooter?.(props.parent.record, props.index || 0, subTableInfo) || '')} +
+ )}
); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/index.tsx index d8d3ad58d..7d09e6357 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/index.tsx @@ -8,12 +8,12 @@ import './index.less'; import classNames from 'classnames'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { GeneratorContext } from '@/context'; import { TableConfigsContext } from '@/context/table-configs'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import EditableTableFooter from './editable-footer'; import EditableTableHeader from './editable-header'; @@ -21,14 +21,14 @@ import EditableTable from './editable-table'; import PreviewTable from './table-preview'; function TableWorkStation< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps) { const { mode, previewDataSource } = React.useContext(GeneratorContext); const { tableConfigs } = React.useContext(TableConfigsContext); return (
- { mode === 'edit' + {mode === 'edit' ? ( = never, renderPagination={props.renderPagination} onPageChange={props.onPageChange} /> - { tableConfigs.length >= 0 && ( - - ) } + {tableConfigs.length >= 0 && ( + + )} = never, /> ) - : } + : }
); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/table-preview/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/table-preview/index.tsx index 77fd4d39b..0a569076b 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/table-preview/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/table-preview/index.tsx @@ -7,17 +7,17 @@ */ import './index.less'; -import DripTable, { DripTableExtraOptions } from 'drip-table'; +import DripTable, { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { filterAttributes } from '@/utils'; import { GeneratorContext } from '@/context'; import { TableConfigsContext } from '@/context/table-configs'; import { getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; function PreviewTable< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps & { visible: boolean }) { const context = React.useContext(GeneratorContext); diff --git a/packages/drip-table-generator/src/layouts/toolbar/components/datasource/index.tsx b/packages/drip-table-generator/src/layouts/toolbar/components/datasource/index.tsx index 767429188..4271b080e 100644 --- a/packages/drip-table-generator/src/layouts/toolbar/components/datasource/index.tsx +++ b/packages/drip-table-generator/src/layouts/toolbar/components/datasource/index.tsx @@ -6,21 +6,21 @@ * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. */ import { Alert } from 'antd'; -import { DripTableExtraOptions } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import MonacoEditor from 'react-monaco-editor'; import { GeneratorContext } from '@/context'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; export type DataSourceHandler = { formatDataSource: () => void; } -interface DataSourceEditorProps < -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, ->{ +interface DataSourceEditorProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +> { width?: number; height?: number; onDataSourceChange: DripTableGeneratorProps['onDataSourceChange']; @@ -28,8 +28,8 @@ ExtraOptions extends Partial = never, } function DataSourceEditor< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: DataSourceEditorProps, ref: React.ForwardedRef) { const { previewDataSource } = React.useContext(GeneratorContext); const [codeErrorMessage, setCodeErrorMessage] = React.useState(''); @@ -50,7 +50,7 @@ ExtraOptions extends Partial = never, return ( - { ({ setState }) => ( + {({ setState }) => (
= never, } }} /> - { codeErrorMessage && } + {codeErrorMessage && }
- ) } + )}
); diff --git a/packages/drip-table-generator/src/layouts/toolbar/components/templates-manager/index.tsx b/packages/drip-table-generator/src/layouts/toolbar/components/templates-manager/index.tsx index 45d993f71..764386bbf 100644 --- a/packages/drip-table-generator/src/layouts/toolbar/components/templates-manager/index.tsx +++ b/packages/drip-table-generator/src/layouts/toolbar/components/templates-manager/index.tsx @@ -11,7 +11,7 @@ import './index.less'; import { CheckOutlined, ExclamationCircleFilled, MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { AutoComplete, Button, Col, Image, Input, Modal, Row, Select } from 'antd'; import classNames from 'classnames'; -import { DripTableExtraOptions, DripTableSchema } from 'drip-table'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSchema, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { filterAttributes, mockId } from '@/utils'; @@ -20,13 +20,13 @@ import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { defaultComponentIcon } from '@/layouts/table-workstation/editable-table/components/components-selector/configs'; import { generateTableConfigsBySchema, getComponentsConfigs } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableComponentAttrConfig, DripTableGeneratorProps } from '@/typing'; +import { DripTableComponentAttrConfig, DripTableGeneratorProps } from '@/typing'; import { DTGBuiltInTemplates } from '../../templates'; export interface TemplatesManagerProps< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, > { customComponentPanel: DripTableGeneratorProps['customComponentPanel']; mockDataSource: DripTableGeneratorProps['mockDataSource']; @@ -77,8 +77,8 @@ const getColumnSchemaByComponent = (component: DripTableComponentAttrConfig, tit }; function TemplatesManager< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: TemplatesManagerProps) { const { previewDataSource } = React.useContext(GeneratorContext); const [currentTemplate, setCurrentTemplate] = React.useState(''); @@ -144,9 +144,9 @@ ExtraOptions extends Partial = never, return (
- { currentStep === 0 && ( + {currentStep === 0 && (
- { templates.map((iTemplate, key) => ( + {templates.map((iTemplate, key) => (
= never, setSchemaToAdd(iTemplate.schema as DripTableSchema); }} > - { iTemplate.key === currentTemplate && ( -
- -
- ) } + {iTemplate.key === currentTemplate && ( +
+ +
+ )}
-
{ iTemplate.label }
+
{iTemplate.label}
- )) } + ))}
- ) } - { currentStep === 1 && ( + )} + {currentStep === 1 && (
序号 @@ -175,9 +175,9 @@ ExtraOptions extends Partial = never, 字段选择 操作 - { schemaToAdd?.columns.map((iColumn, key) => ( + {schemaToAdd?.columns.map((iColumn, key) => ( - { key + 1 } + {key + 1} updateColumnTitle(e.target.value, key)} /> @@ -193,12 +193,12 @@ ExtraOptions extends Partial = never, } }} > - { components.map((component, componentKey) => ( + {components.map((component, componentKey) => ( - { component.title } + {component.title} - )) } + ))} @@ -228,8 +228,8 @@ ExtraOptions extends Partial = never, /> - )) } - { (schemaToAdd && (schemaToAdd?.columns?.length || 0) <= 0) && ( + ))} + {(schemaToAdd && (schemaToAdd?.columns?.length || 0) <= 0) && ( - ) } + )}
- ) } - { currentTemplate && ( + )} + {currentTemplate && (
- { currentStep === 0 && } - { currentStep === 1 && ( - - ) } - { currentStep === 1 && ( - - { ({ tableConfigs, updateTableConfigs }) => ( - } + {currentStep === 1 && ( + + )} + {currentStep === 1 && ( + + {({ tableConfigs, updateTableConfigs }) => ( + - ) } - - ) } + }} + > + 确认设置 + + )} + + )}
- ) } + )}
); } diff --git a/packages/drip-table-generator/src/layouts/toolbar/index.tsx b/packages/drip-table-generator/src/layouts/toolbar/index.tsx index 184fb5cb2..227ca866f 100644 --- a/packages/drip-table-generator/src/layouts/toolbar/index.tsx +++ b/packages/drip-table-generator/src/layouts/toolbar/index.tsx @@ -9,13 +9,13 @@ import './index.less'; import { ArrowLeftOutlined, CloseOutlined, SaveOutlined } from '@ant-design/icons'; import { Button, message, Tooltip } from 'antd'; -import { DripTableColumnSchema, DripTableExtraOptions } from 'drip-table'; +import { DripTableColumnSchema, DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; import { GeneratorContext } from '@/context'; import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '@/typing'; +import { DripTableGeneratorProps } from '@/typing'; import DataSourceEditor from './components/datasource'; import DropDownButton, { DropDownButtonProps } from './components/dropdown-button'; @@ -62,7 +62,7 @@ function ModeSwitch(props: { style?: React.CSSProperties; disabled?: boolean }) }; return ( - { ({ mode, setState }) => ( + {({ mode, setState }) => ( - ) } + )} ); } function Toolbar< -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps) { const { drawerType, setState } = React.useContext(GeneratorContext); const [operateMenu, setOperateMenu] = React.useState(void 0 as string | undefined); @@ -101,7 +101,7 @@ ExtraOptions extends Partial = never, return ( - { ({ tableConfigs, updateTableConfigs }) => ( + {({ tableConfigs, updateTableConfigs }) => (
= never, if (operateMenu) { setOperateMenu(void 0); } }} > - { props.save && props.savePosition !== 'right' && !operateMenu && ( + {props.save && props.savePosition !== 'right' && !operateMenu && (
- ) } + )}
); } diff --git a/packages/drip-table-generator/src/layouts/utils.ts b/packages/drip-table-generator/src/layouts/utils.ts index 6f0aacb5d..7fbb38735 100644 --- a/packages/drip-table-generator/src/layouts/utils.ts +++ b/packages/drip-table-generator/src/layouts/utils.ts @@ -6,7 +6,7 @@ * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. */ -import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableSchema, ExtractDripTableColumnSchema, ExtractDripTableExtraOption } from 'drip-table'; +import { DripTableBuiltInColumnSchema, DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSchema, ExtractDripTableColumnSchema, ExtractDripTableExtraOption } from 'drip-table'; import cloneDeep from 'lodash/cloneDeep'; import { filterAttributes, mockId } from '@/utils'; @@ -14,10 +14,10 @@ import { DripTableGeneratorContext } from '@/context'; import { DTGTableConfig } from '@/context/table-configs'; import tableComponents from '@/table-components'; -import { DataSourceTypeAbbr, DripTableComponentAttrConfig, DripTableGeneratorProps, DTGComponentPropertySchema } from '../typing'; +import { DripTableComponentAttrConfig, DripTableGeneratorProps, DTGComponentPropertySchema } from '../typing'; export const getGroups = < - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(customComponentPanel?: DripTableGeneratorProps['customComponentPanel']) => { let groups = [ @@ -38,7 +38,7 @@ export const getGroups = < }; export const getComponentsConfigs = < - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >( groupName?: string, @@ -59,7 +59,7 @@ export const getComponentsConfigs = < }; export const getColumnItemConfigs = < -RecordType extends DataSourceTypeAbbr>, +RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(componentType: string, options: { componentsConfigs: DripTableComponentAttrConfig[]; diff --git a/packages/drip-table-generator/src/typing.ts b/packages/drip-table-generator/src/typing.ts index 16f816b44..d8e7bfb7e 100644 --- a/packages/drip-table-generator/src/typing.ts +++ b/packages/drip-table-generator/src/typing.ts @@ -1,4 +1,4 @@ -import { DripTableColumnSchema, DripTableExtraOptions, DripTableProps, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSchema } from 'drip-table'; +import { DripTableColumnSchema, DripTableExtraOptions, DripTableProps, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableSchema, ExtractDripTableExtraOption } from 'drip-table'; import React, { CSSProperties, ReactNode } from 'react'; import { CustomComponentProps } from './components/CustomForm/components'; @@ -134,7 +134,7 @@ export interface DripTableGeneratorPanel { } export interface DTGCustomThemeOptions< -RecordType extends DataSourceTypeAbbr>, +RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, > { /** @@ -166,11 +166,14 @@ ExtraOptions extends Partial = never, export type NonColumnsPartialDTSchemaTypeAbbr = never> = Partial>, 'columns'>> -export type DataSourceTypeAbbr = DripTableRecordTypeWithSubtable; export interface DripTableGeneratorProps< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, -> extends DripTableProps { +> extends Omit, 'onDataSourceChange'> { + /** + * 数据源 + */ + dataSource: RecordType[]; /** * 是否允许列拖拽 */ @@ -278,7 +281,7 @@ export interface DripTableGeneratorProps< preview?: boolean; onExportSchema?: (schema: DripTableSchema) => void; onSchemaChange?: (schema: DripTableSchema) => void; - onDataSourceChange?: (dataSource: DripTableProps['dataSource']) => void; + onDataSourceChange?: (data: RecordType[]) => void; onColumnAdded?: (column: DripTableSchema['columns'][number], schema: DripTableSchema, columnIndex: number) => void; onClose?: (schema?: DripTableSchema) => void; onSave?: (schema: DripTableSchema) => void; diff --git a/packages/drip-table-generator/src/wrapper/index.tsx b/packages/drip-table-generator/src/wrapper/index.tsx index 5aaf6fce3..a46899eca 100644 --- a/packages/drip-table-generator/src/wrapper/index.tsx +++ b/packages/drip-table-generator/src/wrapper/index.tsx @@ -18,7 +18,7 @@ import { DTGTableConfig, DTGTableConfigsContext, TableConfigsContext } from '@/c import GeneratorLayout from '@/layouts'; import { generateTableConfigsBySchema, getSchemaValue } from '@/layouts/utils'; -import { DataSourceTypeAbbr, DripTableGeneratorProps } from '../typing'; +import { DripTableGeneratorProps } from '../typing'; export type GeneratorWrapperHandler = { getState: () => void; @@ -34,17 +34,20 @@ export type GeneratorWrapperHandler = { } const generateStates = < -RecordType extends DataSourceTypeAbbr>, -ExtraOptions extends Partial = never, ->(props: DripTableGeneratorProps): DripTableGeneratorStates => ({ + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +>(props: DripTableGeneratorProps): DripTableGeneratorStates => { + console.debug(props); + return { currentTableID: props.checkedTableId, currentColumnID: props.checkedColumnId, previewDataSource: [...props.dataSource || []], mode: props.defaultMode ?? 'edit', - }); + }; +}; const DripTableGenerator = React.forwardRef(< - RecordType extends DataSourceTypeAbbr>, + RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps, ref: React.ForwardedRef) => { const [generatorStates, setGeneratorStates] = React.useState(generateStates(props)); @@ -151,7 +154,6 @@ const DripTableGenerator = React.forwardRef(< }) as < RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, -> (props: React.PropsWithoutRef> & React.RefAttributes) => -(React.ReactElement | null); +> (props: React.PropsWithoutRef> & React.RefAttributes) => (React.ReactElement | null); export default DripTableGenerator; From 0973bf9bf2ba436972188cec84d8f8ec7979608f Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Tue, 14 Jan 2025 21:33:53 +0800 Subject: [PATCH 02/15] feat: update column rowHeader styles --- .../components/table-container/index.less | 7 +- .../components/table-container/index.tsx | 5 + .../components/add-column/index.less | 48 +++++ .../components/add-column/index.tsx | 84 ++++++++ .../components/left-columns/index.less | 113 ++++++++++- .../components/left-columns/index.tsx | 185 ++++++++++++++++-- .../components/right-columns/index.less | 45 ++++- .../components/right-columns/index.tsx | 64 ++++-- .../editable-table/components/row/index.less | 4 + .../components/row/row-header/index.tsx | 2 +- .../components/scroll-columns/index.less | 39 +++- .../components/scroll-columns/index.tsx | 82 ++++++-- .../components/table-section/index.less | 4 + .../editable-table/index.less | 8 +- .../editable-table/index.tsx | 97 +++++---- .../src/wrapper/index.tsx | 6 +- 16 files changed, 685 insertions(+), 108 deletions(-) create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.less create mode 100644 packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.tsx diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less index 9d89fdf82..1cff117b7 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less @@ -16,23 +16,26 @@ width: max-content; position: relative; min-width: 500px; - max-width: 100%; display: flex; flex-direction: column; overflow-x: auto; overflow: visible; + background-color: #ffffff; &:hover { border: 1px dashed var(--drip-table-border-color, @border-color); } + &.bordered { + border: 1px dashed #efefef; + } + &.disabled { border: 1px solid transparent; } &.checked { border: 1px solid var(--drip-table-border-color, @border-color); - margin-top: 32px; } } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx index a8775616c..acd810794 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx @@ -113,6 +113,7 @@ const TableContainer = React.forwardRef(< ExtraOptions extends Partial = never, >(props: TableContainerProps, ref: React.ForwardedRef) => { const containerRef = React.useRef(null); + const tableContext = React.useContext(TableConfigsContext); React.useImperativeHandle(ref, () => ({ getContainerWidth: () => containerRef.current?.getBoundingClientRect().width ?? 0, })); @@ -121,6 +122,8 @@ const TableContainer = React.forwardRef(< props.tableConfig, ]); + const tableIndex = tableContext.tableConfigs.findIndex(table => table.tableId === props.tableConfig.tableId); + return ( {({ currentTableID, drawerType, setState }) => (props.tableTools && props.tableTools.length === 0 @@ -131,7 +134,9 @@ const TableContainer = React.forwardRef(<
0, })} + style={{ marginTop: currentTableID === props.tableConfig.tableId && tableIndex === 0 ? 32 : void 0 }} ref={containerRef} onClick={(e) => { e.stopPropagation(); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.less new file mode 100644 index 000000000..3e1d0a348 --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.less @@ -0,0 +1,48 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ + +@import url("../../../../../styles/index.less"); + +@prefixCls: jfe-drip-table-generator-workstation-table-header; + +.@{prefixCls}-add-item { + color: #000000d9; + font-weight: 500; + background: #f5f5f5; + border-top: 1px solid transparent; + border-bottom: 1px solid #e0e0e0; + transition: all .3s ease; + height: 48px; + padding: 0 12px; + min-width: 120px; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + + &.small { + height: 35px; + padding: 0 8px; + } + + &.middle, + &.default { + height: 48px; + padding: 0 12px; + } + + &.large { + height: 56px; + padding: 0 16px; + } + + &.sticky { + position: sticky; + top: 0; + } +} diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.tsx new file mode 100644 index 000000000..36357bcf6 --- /dev/null +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/add-column/index.tsx @@ -0,0 +1,84 @@ +/** + * This file is part of the drip-table project. + * @link : https://drip-table.jd.com/ + * @author : helloqian12138 (johnhello12138@163.com) + * @modifier : helloqian12138 (johnhello12138@163.com) + * @copyright: Copyright (c) 2020 JD Network Technology Co., Ltd. + */ +import './index.less'; + +import { PlusOutlined } from '@ant-design/icons'; +import { Button, Dropdown } from 'antd'; +import classNames from 'classnames'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; +import React from 'react'; + +import { DTGTableConfig } from '@/context/table-configs'; +import { DripTableGeneratorProps } from '@/typing'; + +import ComponentsSelector from '../components-selector'; + +interface ColumnHeaderListProps< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +> { + tableConfig: DTGTableConfig; + customComponentPanel?: DripTableGeneratorProps['customComponentPanel']; + customColumnAddPanel?: DripTableGeneratorProps['customColumnAddPanel']; + onColumnAdded?: DripTableGeneratorProps['onColumnAdded']; +} + +function AddColumnComponent< + RecordType extends DripTableRecordTypeWithSubtable>, + ExtraOptions extends Partial = never, +>(props: ColumnHeaderListProps) { + const [dropdownOpen, setDropdownOpen] = React.useState(false); + + const DropdownRender = React.useCallback(() => ( + setDropdownOpen(false)} + onColumnAdded={props.onColumnAdded} + /> + ), [ + dropdownOpen, + props.tableConfig.tableId, + props.customComponentPanel, + props.customColumnAddPanel, + setDropdownOpen, + props.onColumnAdded, + ]); + + return ( +
+ { if (!open) { setDropdownOpen(false); } }} + dropdownRender={DropdownRender} + > +
+ ); +} + +export default AddColumnComponent; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less index 5709f54be..3fab986a4 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less @@ -18,8 +18,11 @@ &.left { left: 0; - border-right: 1px solid rgb(120 120 120); - box-shadow: 0 0 4px -1px #ffffff, -2px 0 4px -2px rgb(0 0 0 / 85%); + } + + &.bordered { + border-right: 1px solid rgb(196 196 196); + box-shadow: 0 0 4px -1px #ffffff, 2px 0 4px -2px rgb(0 0 0 / 85%); } & > .@{prefixCls}-row { @@ -30,7 +33,109 @@ & > .@{prefixCls}-header { background: #dddddd; font-weight: bold; - position: sticky; - top: 0; + + &.sticky { + position: sticky; + top: 0; + z-index: 10; + } + + &.invisible { + .@{prefixCls}-header-item { + opacity: .7; + background: + linear-gradient( + 45deg, + var(--drip-table-background-color, @background-color) 0, + var(--drip-table-background-color, @background-color) 10%, + transparent 10%, + transparent 20%, + var(--drip-table-background-color, @background-color) 20%, + var(--drip-table-background-color, @background-color) 30%, + transparent 30%, + transparent 40%, + var(--drip-table-background-color, @background-color) 40%, + var(--drip-table-background-color, @background-color) 50%, + transparent 50%, + transparent 60%, + var(--drip-table-background-color, @background-color) 60%, + var(--drip-table-background-color, @background-color) 70%, + transparent 70%, + transparent 80%, + var(--drip-table-background-color, @background-color) 80%, + var(--drip-table-background-color, @background-color) 90%, + transparent 90%, + transparent 100% + ); + } + } + } +} + +.@{prefixCls}-header-item { + color: #000000d9; + font-weight: 500; + background: #f5f5f5; + border: 1px solid transparent; + border-bottom: 1px solid #e0e0e0; + transition: all .3s ease; + height: 48px; + padding: 0 12px; + line-height: 48px; + min-width: 120px; + text-align: center; + position: relative; + display: flex; + + &.large { + padding: 0 16px; + height: 56px; + line-height: 56px; + } + + &.middle, + &.default { + padding: 0 12px; + height: 48px; + line-height: 48px; + } + + &.small { + padding: 0 8px; + height: 35px; + line-height: 35px; + } + + &.bordered { + border-right: 1px solid #e0e0e0; + } + + &:hover { + border: 1px dashed var(--drip-table-border-color, @border-color); + border-bottom: 1px solid #e0e0e0; + + &.disabled { + border: 1px solid transparent; + } + } + + &.checked { + border: 1px solid var(--drip-table-border-color, @border-color); + border-bottom: 1px solid #e0e0e0; + + > .@{prefixCls}-tools { + top: 0; + } + } + + &.right-shadow { + box-shadow: 0 0 4px 0 #ffffff, 4px 0 2px -2px rgb(0 0 0 / 32%); + margin-right: 3px; + margin-left: 1px; + } + + &.left-shadow { + box-shadow: 0 0 4px 0 #ffffff, -4px 0 2px -2px rgb(0 0 0 / 32%); + margin-left: 4px; } } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index ed9db4490..b98eb32bd 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -7,13 +7,17 @@ */ import './index.less'; -import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; +import { PlusSquareOutlined } from '@ant-design/icons'; +import { Checkbox } from 'antd'; +import classNames from 'classnames'; +import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, DripTableTableInformation, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; -import { GeneratorContext } from '@/context'; -import { DTGTableConfig } from '@/context/table-configs'; +import { formatNumber, mockId } from '@/utils'; +import { DTGTableConfig, TableConfigsContext } from '@/context/table-configs'; import { DripTableGeneratorProps } from '@/typing'; +import EditableTable from '../..'; import ColumnHeader from '../column-header'; import TableSection from '../table-section'; @@ -27,10 +31,12 @@ export interface LeftFixedColumnsProps< rowHeight: number | undefined; columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; ref?: React.RefObject; + rowHeaderHeights?: number[]; } export interface LeftFixedColumnsHandler { getRowHeight: () => number; + getSubTableHeight: () => number[]; } function LeftFixedColumnsInner< @@ -40,15 +46,89 @@ function LeftFixedColumnsInner< props: LeftFixedColumnsProps, ref: React.ForwardedRef, ) { - const context = React.useContext(GeneratorContext); - console.debug(context); + const { tableConfigs } = React.useContext(TableConfigsContext); + const currentTableIndex = tableConfigs.findIndex(c => c.tableId === props.tableConfig.tableId); const rowRef = React.createRef(); + const containerRef = React.createRef(); + const leftMargins = React.useMemo(() => { + let margin = 0; + if (props.tableConfig.hasSubTable) { + margin += props.tableConfig.configs.bordered ? 49 : 48; + } + if (props.tableConfig.configs.rowSelection) { + margin += props.tableConfig.configs.bordered ? 49 : 48; + } + props.columnList.forEach((columnWrapper, index) => { + const column = columnWrapper.column; + margin += column.width ? formatNumber(String(column.width).replace('px', '').replace('%', '') || 200) as number : 200; + }); + return margin; + }, [props.tableConfig.hasSubTable, props.tableConfig.configs, props.columnList]); React.useImperativeHandle(ref, () => ({ - getRowHeight: () => rowRef.current?.offsetHeight ?? 0, + getRowHeight: () => { + let maxCellHeight = 0; + for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { + if (element.children[0]) { + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight; + if (trueCellHeight > maxCellHeight) { + maxCellHeight = trueCellHeight; + } + } + } + return maxCellHeight; + }, + getSubTableHeight: () => { + const rows = (containerRef.current?.children || []) as HTMLDivElement[]; + const start = props.tableConfig.configs.showHeader ? 1 : 0; + const subTableHeights: number[] = []; + for (let i = start; i < rows.length; i++) { + if (rows[i].className === 'jfe-drip-table-generator-workstation-table-row') { + if (rows[i + 1]?.className === 'subtable') { + subTableHeights.push(rows[i + 1].offsetHeight); + } else { + subTableHeights.push(0); + } + } + } + return subTableHeights; + }, })); return ( -
-
+
0 || props.tableConfig.hasSubTable || props.tableConfig.configs.rowSelection, + })} + ref={containerRef} + style={{ width: leftMargins }} + > +
+ {props.tableConfig.hasSubTable && ( +
+ )} + {props.tableConfig.configs.rowSelection && ( +
+ +
+ )} {props.columnList.map(columnWrapper => ( ))}
- {props.previewDataSource.map((record, rowIndex) => ( -
- -
- ))} + {props.previewDataSource.map((record, rowIndex) => { + const hasSubTable = tableConfigs[currentTableIndex + 1] && Object.keys(record.record || {}).includes(tableConfigs[currentTableIndex + 1]?.dataSourceKey); + const tableInfo: DripTableTableInformation = { + uuid: props.tableConfig?.tableId, + schema: { + ...props.tableConfig?.configs, + id: props.tableConfig.tableId ?? mockId(), + columns: props.tableConfig?.columns, + dataSourceKey: props.tableConfig?.dataSourceKey, + } as DripTableTableInformation['schema'], + dataSource: record?.[tableConfigs[currentTableIndex + 1]?.dataSourceKey || ''] as RecordType[] || [], + record: record.record, + }; + return ( + + {props.tableConfig.configs.rowHeader && ( +
+ )} +
+ + {props.tableConfig.hasSubTable && ( +
+ {hasSubTable && } +
+ )} + {props.tableConfig.configs.rowSelection && ( +
+ { + props.renderSelection + ? ( + false} + /> + ) + : + } +
+ )} + +
+ {(props.tableConfig.hasSubTable && hasSubTable) + && ( +
+ +
+ )} + + ); + })}
); } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less index eca5270e2..7503e183b 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.less @@ -18,8 +18,11 @@ &.right { right: 0; - border-left: 1px solid rgb(120 120 120); - box-shadow: 0 4px 4px -1px #ffffff, 2px 0 4px -2px rgb(0 0 0 / 85%); + } + + &.bordered { + border-right: 1px solid rgb(196 196 196); + box-shadow: 0 0 4px -1px #ffffff, -2px 0 4px -2px rgb(0 0 0 / 85%); } & > .@{prefixCls}-row { @@ -30,7 +33,41 @@ & > .@{prefixCls}-header { background: #dddddd; font-weight: bold; - position: sticky; - top: 0; + + &.sticky { + position: sticky; + top: 0; + z-index: 10; + } + + &.invisible { + .@{prefixCls}-header-item { + opacity: .7; + background: + linear-gradient( + 45deg, + var(--drip-table-background-color, @background-color) 0, + var(--drip-table-background-color, @background-color) 10%, + transparent 10%, + transparent 20%, + var(--drip-table-background-color, @background-color) 20%, + var(--drip-table-background-color, @background-color) 30%, + transparent 30%, + transparent 40%, + var(--drip-table-background-color, @background-color) 40%, + var(--drip-table-background-color, @background-color) 50%, + transparent 50%, + transparent 60%, + var(--drip-table-background-color, @background-color) 60%, + var(--drip-table-background-color, @background-color) 70%, + transparent 70%, + transparent 80%, + var(--drip-table-background-color, @background-color) 80%, + var(--drip-table-background-color, @background-color) 90%, + transparent 90%, + transparent 100% + ); + } + } } } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx index 09fe36dae..c2c70f330 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx @@ -7,10 +7,10 @@ */ import './index.less'; +import classNames from 'classnames'; import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; -import { GeneratorContext } from '@/context'; import { DTGTableConfig } from '@/context/table-configs'; import { DripTableGeneratorProps } from '@/typing'; @@ -27,6 +27,8 @@ export interface RightFixedColumnsProps< rowHeight: number | undefined; columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; ref?: React.RefObject; + subTableHeights?: number[]; + rowHeaderHeights?: number[]; } export interface RightFixedColumnsHandler { @@ -40,15 +42,35 @@ function RightFixedColumnsInner< props: RightFixedColumnsProps, ref: React.ForwardedRef, ) { - const context = React.useContext(GeneratorContext); - console.debug(context); const rowRef = React.createRef(); React.useImperativeHandle(ref, () => ({ - getRowHeight: () => rowRef.current?.offsetHeight ?? 0, + getRowHeight: () => { + let maxCellHeight = 0; + for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { + if (element.children[0]) { + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight; + if (trueCellHeight > maxCellHeight) { + maxCellHeight = trueCellHeight; + } + } + } + return maxCellHeight; + }, })); return ( -
-
+
0 || props.tableConfig.hasSubTable || props.tableConfig.configs.rowSelection, + })} + > +
{props.columnList.map(columnWrapper => ( {props.previewDataSource.map((record, rowIndex) => ( -
- -
+ + {props.tableConfig.configs.rowHeader && ( +
+ )} +
+ +
+ {(props.subTableHeights?.length || 0) > 0 && (props.subTableHeights?.[rowIndex] || 0) > 0 && ( +
+ )} + ))}
); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.less index 8d0c463df..a76aa90bf 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/index.less @@ -71,6 +71,10 @@ min-width: 48px; justify-content: center; align-items: center; + + &.bordered { + min-width: 47px; + } } } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx index 03266654e..74b602676 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/row/row-header/index.tsx @@ -148,7 +148,7 @@ function RowHeader< return ( {({ setTableConfigs }) => ( -
+
{ props.configs?.elements?.map((element, index) => (
.@{prefixCls}-row { @@ -22,7 +23,41 @@ & > .@{prefixCls}-header { background: #dddddd; font-weight: bold; - position: sticky; - top: 0; + + &.sticky { + position: sticky; + top: 0; + z-index: 10; + } + + &.invisible { + .@{prefixCls}-header-item { + opacity: .7; + background: + linear-gradient( + 45deg, + var(--drip-table-background-color, @background-color) 0, + var(--drip-table-background-color, @background-color) 10%, + transparent 10%, + transparent 20%, + var(--drip-table-background-color, @background-color) 20%, + var(--drip-table-background-color, @background-color) 30%, + transparent 30%, + transparent 40%, + var(--drip-table-background-color, @background-color) 40%, + var(--drip-table-background-color, @background-color) 50%, + transparent 50%, + transparent 60%, + var(--drip-table-background-color, @background-color) 60%, + var(--drip-table-background-color, @background-color) 70%, + transparent 70%, + transparent 80%, + var(--drip-table-background-color, @background-color) 80%, + var(--drip-table-background-color, @background-color) 90%, + transparent 90%, + transparent 100% + ); + } + } } } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx index 0ecb1b07d..643f907d3 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -7,14 +7,15 @@ */ import './index.less'; +import classNames from 'classnames'; import { DripTableExtraOptions, DripTableRecordTypeBase, DripTableRecordTypeWithSubtable, ExtractDripTableExtraOption } from 'drip-table'; import React from 'react'; -import { GeneratorContext } from '@/context'; import { DTGTableConfig } from '@/context/table-configs'; import { DripTableGeneratorProps } from '@/typing'; import ColumnHeader from '../column-header'; +import RowHeader from '../row/row-header'; import TableSection from '../table-section'; export interface ScrollableColumnsProps< @@ -27,10 +28,12 @@ export interface ScrollableColumnsProps< rowHeight: number | undefined; columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; ref?: React.RefObject; + subTableHeights?: number[]; } export interface ScrollableColumnsHandler { getRowHeight: () => number; + getRowHeaderHeights: () => number[]; } function ScrollableColumnsInner< @@ -40,15 +43,47 @@ function ScrollableColumnsInner< props: ScrollableColumnsProps, ref: React.ForwardedRef, ) { - const context = React.useContext(GeneratorContext); - console.debug(context); const rowRef = React.createRef(); + const containerRef = React.createRef(); React.useImperativeHandle(ref, () => ({ - getRowHeight: () => rowRef.current?.offsetHeight ?? 0, + getRowHeight: () => { + let maxCellHeight = 0; + for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { + if (element.children[0]) { + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight; + if (trueCellHeight > maxCellHeight) { + maxCellHeight = trueCellHeight; + } + } + } + return maxCellHeight; + }, + getRowHeaderHeights: () => { + const rows = (containerRef.current?.children || []) as HTMLDivElement[]; + const start = props.tableConfig.configs.showHeader ? 1 : 0; + const rowHeaderHeights: number[] = []; + for (let i = start; i < rows.length; i++) { + if (rows[i].className === 'jfe-drip-table-generator-workstation-table-row') { + if (rows[i - 1]?.className === 'rowHeader') { + rowHeaderHeights.push(rows[i - 1].offsetHeight); + } else { + rowHeaderHeights.push(0); + } + } + } + return rowHeaderHeights; + }, })); return ( -
-
+
+
{props.columnList.map(columnWrapper => ( {props.previewDataSource.map((record, rowIndex) => ( -
- -
+ + {props.tableConfig.configs.rowHeader && ( + + )} +
+ +
+ {(props.subTableHeights?.length || 0) > 0 && (props.subTableHeights?.[rowIndex] || 0) > 0 && ( +
+ )} + ))}
); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less index 60e712082..2bc00172c 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/table-section/index.less @@ -72,5 +72,9 @@ min-width: 48px; justify-content: center; align-items: center; + + &.bordered { + min-width: 47px; + } } } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.less index 279f0a524..b8b538228 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.less @@ -25,10 +25,10 @@ position: relative; outline: none; - &:hover { - background-color: #efefef; - border: 1px dashed var(--drip-table-border-color, @border-color); - } + // &:hover { + // background-color: #efefef; + // border: 1px dashed var(--drip-table-border-color, @border-color); + // } &.stripe { background-color: #efefef; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index 41c786eb9..94dbe3e86 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -17,6 +17,7 @@ import { DripTableGeneratorProps } from '@/typing'; import PaginationComponent from '../components/pagination'; import TableContainer, { TableContainerHandler } from '../components/table-container'; +import AddColumnComponent from './components/add-column'; import LeftFixedColumns, { LeftFixedColumnsHandler } from './components/left-columns'; import RightFixedColumns, { RightFixedColumnsHandler } from './components/right-columns'; import ScrollableColumns, { ScrollableColumnsHandler } from './components/scroll-columns'; @@ -35,24 +36,39 @@ function EditableTable< RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: EditableTableProps) { + const context = React.useContext(TableConfigsContext); const [previewRecord] = React.useState(void 0 as number | undefined); const [rowHeight, setRowHeight] = React.useState(void 0 as number | undefined); + const [subTableHeights, setSubTableHeights] = React.useState([] as number[]); + const [rowHeaderHeights, setRowHeaderHeights] = React.useState([] as number[]); const containerRef = React.useRef(null); const leftColumnsRef = React.useRef(null); const scrollColumnsRef = React.useRef(null); const rightColumnsRef = React.useRef(null); React.useEffect(() => { - console.debug('rowHeight'); const leftHeight = leftColumnsRef.current?.getRowHeight() ?? 0; const scrollHeight = scrollColumnsRef.current?.getRowHeight() ?? 0; const rightHeight = rightColumnsRef.current?.getRowHeight() ?? 0; - console.debug(leftHeight, scrollHeight, rightHeight); if (leftHeight !== scrollHeight || rightHeight !== scrollHeight || leftHeight !== rightHeight) { setRowHeight(Math.max(leftHeight, scrollHeight, rightHeight)); } }, [props.dataSource, props.schema, props.tableConfig]); + React.useEffect(() => { + setTimeout(() => { + const leftHeights = leftColumnsRef.current?.getSubTableHeight() ?? []; + setSubTableHeights(leftHeights); + }, 200); + }, [props.dataSource, props.schema, props.tableConfig, context.tableConfigs]); + + React.useEffect(() => { + setTimeout(() => { + const rowHeights = scrollColumnsRef.current?.getRowHeaderHeights() ?? []; + setRowHeaderHeights(rowHeights); + }, 200); + }, [props.dataSource, props.schema, props.tableConfig, context.tableConfigs]); + const tableHeight = React.useMemo(() => { if (props.tableConfig.configs.scroll?.y && typeof props.tableConfig.configs.scroll?.y !== 'boolean') { return props.tableConfig.configs.scroll?.y; @@ -75,6 +91,7 @@ function EditableTable< } return props.dataSource.map((rec, idx) => ({ id: idx, record: rec })); }, [props.dataSource, props.tableConfig.configs.pagination, previewRecord]); + const previewDataSource = typeof previewRecord === 'number' ? [dataSourceToUse[previewRecord]] : dataSourceToUse; const paginationInHeader = props.tableConfig.configs.pagination && props.tableConfig.configs.pagination.position?.startsWith('top'); const paginationInFooter = props.tableConfig.configs.pagination && props.tableConfig.configs.pagination.position?.startsWith('bottom'); @@ -115,39 +132,53 @@ function EditableTable< className={classNames('jfe-drip-table-generator-workstation-table-wrapper', { bordered: props.tableConfig.configs.bordered, })} - style={{ - display: 'flex', - overflow: 'auto', - height: tableHeight, - width: props.tableConfig.configs.scroll?.x ? Number(props.tableConfig.configs.scroll?.x) : void 0, - }} + style={{ display: 'flex' }} > - - {...props} - ref={leftColumnsRef} - tableConfig={props.tableConfig} - columnList={leftFixedColumns} - previewDataSource={previewDataSource as ({ id: number; record: RecordType })[]} - containerWidth={tableWidth} - rowHeight={rowHeight} - /> - - {...props} - ref={scrollColumnsRef} - tableConfig={props.tableConfig} - columnList={sortableColumns} - previewDataSource={previewDataSource} - containerWidth={tableWidth} - rowHeight={rowHeight} - /> - - {...props} - ref={rightColumnsRef} +
+ + {...props} + ref={leftColumnsRef} + tableConfig={props.tableConfig} + columnList={leftFixedColumns} + previewDataSource={previewDataSource as ({ id: number; record: RecordType })[]} + containerWidth={tableWidth} + rowHeight={rowHeight} + rowHeaderHeights={rowHeaderHeights} + /> + + {...props} + ref={scrollColumnsRef} + tableConfig={props.tableConfig} + columnList={sortableColumns} + previewDataSource={previewDataSource} + containerWidth={tableWidth} + rowHeight={rowHeight} + subTableHeights={subTableHeights} + /> + + {...props} + ref={rightColumnsRef} + tableConfig={props.tableConfig} + columnList={rightFixedColumns} + previewDataSource={previewDataSource} + containerWidth={tableWidth} + rowHeight={rowHeight} + subTableHeights={subTableHeights} + rowHeaderHeights={rowHeaderHeights} + /> +
+
{props.parent?.record && props.tableConfig.configs.pagination && paginationInFooter diff --git a/packages/drip-table-generator/src/wrapper/index.tsx b/packages/drip-table-generator/src/wrapper/index.tsx index a46899eca..60466318b 100644 --- a/packages/drip-table-generator/src/wrapper/index.tsx +++ b/packages/drip-table-generator/src/wrapper/index.tsx @@ -37,10 +37,10 @@ const generateStates = < RecordType extends DripTableRecordTypeWithSubtable>, ExtraOptions extends Partial = never, >(props: DripTableGeneratorProps): DripTableGeneratorStates => { - console.debug(props); + const { checkedTableId, checkedColumnId } = props; return { - currentTableID: props.checkedTableId, - currentColumnID: props.checkedColumnId, + currentTableID: checkedTableId, + currentColumnID: checkedColumnId, previewDataSource: [...props.dataSource || []], mode: props.defaultMode ?? 'edit', }; From 59a4ceadd47b14906fffb5daab09e33a7b890af4 Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Tue, 14 Jan 2025 21:37:27 +0800 Subject: [PATCH 03/15] release: drip-table-generator v3.2.2-alpha.0 --- packages/drip-table-generator/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 63f94ee2c..2d3e360ef 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.1-alpha.16", + "version": "3.2.2-alpha.0", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", From c19d9eed686cc2ca389d451f330f00e6b341ac67 Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Tue, 14 Jan 2025 22:02:45 +0800 Subject: [PATCH 04/15] docs: update demo --- docs/drip-table-generator/demo/component-settings.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/drip-table-generator/demo/component-settings.ts b/docs/drip-table-generator/demo/component-settings.ts index 8b7fc243f..79ddb92c1 100644 --- a/docs/drip-table-generator/demo/component-settings.ts +++ b/docs/drip-table-generator/demo/component-settings.ts @@ -1,6 +1,7 @@ -import { DataSourceTypeAbbr, DripTableGeneratorProps } from 'drip-table-generator'; +import { DripTableRecordTypeBase, DripTableRecordTypeWithSubtable } from 'drip-table'; +import { DripTableGeneratorProps } from 'drip-table-generator'; -const CustomGeneratorComponentPanel: DripTableGeneratorProps>['customComponentPanel'] = { +const CustomGeneratorComponentPanel: DripTableGeneratorProps>['customComponentPanel'] = { mode: 'add', configs: [ { From bb79b2faab6d8e23666d2390c14886ccf410a66e Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Wed, 15 Jan 2025 17:45:36 +0800 Subject: [PATCH 05/15] fix: table height changed with scrolly changed --- .../table-workstation/components/table-container/index.less | 2 +- .../table-workstation/components/table-container/index.tsx | 4 +++- .../editable-table/components/scroll-columns/index.tsx | 2 +- .../src/layouts/table-workstation/editable-table/index.tsx | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less index 1cff117b7..947a9cf4e 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.less @@ -12,7 +12,7 @@ .@{prefixCls}-wrapper { border: 1px solid transparent; - padding: 0 12px 8px; + padding: 0 12px; width: max-content; position: relative; min-width: 500px; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx index acd810794..618a006fe 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/components/table-container/index.tsx @@ -136,7 +136,9 @@ const TableContainer = React.forwardRef(< checked: currentTableID === props.tableConfig.tableId, bordered: tableIndex > 0, })} - style={{ marginTop: currentTableID === props.tableConfig.tableId && tableIndex === 0 ? 32 : void 0 }} + style={{ + marginTop: currentTableID === props.tableConfig.tableId && tableIndex === 0 ? 32 : void 0, + }} ref={containerRef} onClick={(e) => { e.stopPropagation(); diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx index 643f907d3..8ff26c784 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -50,7 +50,7 @@ function ScrollableColumnsInner< let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { - const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight; + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; if (trueCellHeight > maxCellHeight) { maxCellHeight = trueCellHeight; } diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index 94dbe3e86..eb9bbd625 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -74,7 +74,7 @@ function EditableTable< return props.tableConfig.configs.scroll?.y; } return '100%'; - }, []); + }, [props.tableConfig.configs.scroll?.y]); const tableWidth = React.useMemo(() => { const defaultWidth = props.tableConfig.columns.length * 200; return containerRef.current?.getContainerWidth?.() || defaultWidth; From 60afbbc7f7c08dd1da4d57e036454d5a48954e06 Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Wed, 15 Jan 2025 17:55:57 +0800 Subject: [PATCH 06/15] release: drip-table-generator v3.2.2-alpha.1 --- packages/drip-table-generator/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 2d3e360ef..15cf92992 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.0", + "version": "3.2.2-alpha.1", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", From bf41c4ae20ecbe25ca1864cc9ce4fb84764eb0eb Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Wed, 15 Jan 2025 22:31:15 +0800 Subject: [PATCH 07/15] fix: table stripe and adding height endless --- .../components/left-columns/index.less | 4 ++++ .../components/left-columns/index.tsx | 15 +++++++++++---- .../components/right-columns/index.less | 4 ++++ .../components/right-columns/index.tsx | 10 ++++++++-- .../components/scroll-columns/index.less | 4 ++++ .../components/scroll-columns/index.tsx | 12 ++++++++++-- 6 files changed, 41 insertions(+), 8 deletions(-) diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less index 3fab986a4..79ecdc8a9 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.less @@ -28,6 +28,10 @@ & > .@{prefixCls}-row { display: flex; width: 100%; + + &.stripe { + background-color: #efefef; + } } & > .@{prefixCls}-header { diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index b98eb32bd..763f7140b 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -69,7 +69,7 @@ function LeftFixedColumnsInner< let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { - const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight; + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; if (trueCellHeight > maxCellHeight) { maxCellHeight = trueCellHeight; } @@ -82,7 +82,9 @@ function LeftFixedColumnsInner< const start = props.tableConfig.configs.showHeader ? 1 : 0; const subTableHeights: number[] = []; for (let i = start; i < rows.length; i++) { - if (rows[i].className === 'jfe-drip-table-generator-workstation-table-row') { + if (rows[i].className === 'jfe-drip-table-generator-workstation-table-row' + || rows[i].className === 'jfe-drip-table-generator-workstation-table-row stripe' + ) { if (rows[i + 1]?.className === 'subtable') { subTableHeights.push(rows[i + 1].offsetHeight); } else { @@ -162,8 +164,13 @@ function LeftFixedColumnsInner< {props.tableConfig.configs.rowHeader && (
)} -
- +
{props.tableConfig.hasSubTable && (
.@{prefixCls}-row { display: flex; width: 100%; + + &.stripe { + background-color: #efefef; + } } & > .@{prefixCls}-header { diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx index c2c70f330..78933e183 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx @@ -48,7 +48,7 @@ function RightFixedColumnsInner< let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { - const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight; + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; if (trueCellHeight > maxCellHeight) { maxCellHeight = trueCellHeight; } @@ -91,7 +91,13 @@ function RightFixedColumnsInner< {props.tableConfig.configs.rowHeader && (
)} -
+
.@{prefixCls}-row { display: flex; width: 100%; + + &.stripe { + background-color: #efefef; + } } & > .@{prefixCls}-header { diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx index 8ff26c784..0d67e36ae 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -63,7 +63,9 @@ function ScrollableColumnsInner< const start = props.tableConfig.configs.showHeader ? 1 : 0; const rowHeaderHeights: number[] = []; for (let i = start; i < rows.length; i++) { - if (rows[i].className === 'jfe-drip-table-generator-workstation-table-row') { + if (rows[i].className === 'jfe-drip-table-generator-workstation-table-row' + || rows[i].className === 'jfe-drip-table-generator-workstation-table-row stripe' + ) { if (rows[i - 1]?.className === 'rowHeader') { rowHeaderHeights.push(rows[i - 1].offsetHeight); } else { @@ -109,7 +111,13 @@ function ScrollableColumnsInner< configs={props.tableConfig.configs.rowHeader} /> )} -
+
Date: Wed, 15 Jan 2025 22:32:29 +0800 Subject: [PATCH 08/15] release: drip-table-generator v3.2.2-alpha.2 --- packages/drip-table-generator/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 15cf92992..d3d1767b5 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.1", + "version": "3.2.2-alpha.2", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", From 475d488a7635eade75ea7e641482b84f1cb217de Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Wed, 15 Jan 2025 23:00:11 +0800 Subject: [PATCH 09/15] fix: table generator column height --- packages/drip-table-generator/package.json | 2 +- .../editable-table/components/left-columns/index.tsx | 3 ++- .../editable-table/components/right-columns/index.tsx | 3 ++- .../editable-table/components/scroll-columns/index.tsx | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index d3d1767b5..f2f96a74f 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.2", + "version": "3.2.2-alpha.3", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index 763f7140b..e1db64c8d 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -66,6 +66,7 @@ function LeftFixedColumnsInner< }, [props.tableConfig.hasSubTable, props.tableConfig.configs, props.columnList]); React.useImperativeHandle(ref, () => ({ getRowHeight: () => { + const rowHeight = rowRef.current?.offsetHeight ?? 0; let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { @@ -75,7 +76,7 @@ function LeftFixedColumnsInner< } } } - return maxCellHeight; + return Math.max(rowHeight, maxCellHeight); }, getSubTableHeight: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx index 78933e183..cdf56442d 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx @@ -45,6 +45,7 @@ function RightFixedColumnsInner< const rowRef = React.createRef(); React.useImperativeHandle(ref, () => ({ getRowHeight: () => { + const rowHeight = rowRef.current?.offsetHeight ?? 0; let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { @@ -54,7 +55,7 @@ function RightFixedColumnsInner< } } } - return maxCellHeight; + return Math.max(rowHeight, maxCellHeight); }, })); return ( diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx index 0d67e36ae..0d255ce21 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -47,6 +47,7 @@ function ScrollableColumnsInner< const containerRef = React.createRef(); React.useImperativeHandle(ref, () => ({ getRowHeight: () => { + const rowHeight = rowRef.current?.offsetHeight ?? 0; let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { @@ -56,7 +57,7 @@ function ScrollableColumnsInner< } } } - return maxCellHeight; + return Math.max(rowHeight, maxCellHeight); }, getRowHeaderHeights: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; From 9699d31f2fd14916d18f665d7650bf0b98c1df4a Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Wed, 15 Jan 2025 23:13:17 +0800 Subject: [PATCH 10/15] fix: table generator column height --- packages/drip-table-generator/package.json | 2 +- .../src/layouts/table-workstation/editable-table/index.tsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index f2f96a74f..687f1bc53 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.3", + "version": "3.2.2-alpha.4", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index eb9bbd625..6e19ee3f4 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -50,7 +50,9 @@ function EditableTable< const leftHeight = leftColumnsRef.current?.getRowHeight() ?? 0; const scrollHeight = scrollColumnsRef.current?.getRowHeight() ?? 0; const rightHeight = rightColumnsRef.current?.getRowHeight() ?? 0; - if (leftHeight !== scrollHeight || rightHeight !== scrollHeight || leftHeight !== rightHeight) { + if ((leftHeight !== scrollHeight || rightHeight !== scrollHeight || leftHeight !== rightHeight) && ( + Math.abs(scrollHeight - leftHeight) > 1 && Math.abs(scrollHeight - rightHeight) > 1 + )) { setRowHeight(Math.max(leftHeight, scrollHeight, rightHeight)); } }, [props.dataSource, props.schema, props.tableConfig]); From 819866f6928b9ef24400defec717d32e6510835e Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Wed, 15 Jan 2025 23:29:26 +0800 Subject: [PATCH 11/15] fix: table generator column height --- packages/drip-table-generator/package.json | 2 +- .../editable-table/components/left-columns/index.tsx | 2 +- .../editable-table/components/right-columns/index.tsx | 2 +- .../editable-table/components/scroll-columns/index.tsx | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 687f1bc53..0f8a3fb0c 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.4", + "version": "3.2.2-alpha.5", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index e1db64c8d..b1370ee20 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -76,7 +76,7 @@ function LeftFixedColumnsInner< } } } - return Math.max(rowHeight, maxCellHeight); + return (rowRef.current?.children.length || 0) <= 0 ? rowHeight : maxCellHeight; }, getSubTableHeight: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx index cdf56442d..41b45f334 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx @@ -55,7 +55,7 @@ function RightFixedColumnsInner< } } } - return Math.max(rowHeight, maxCellHeight); + return (rowRef.current?.children.length || 0) <= 0 ? rowHeight : maxCellHeight; }, })); return ( diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx index 0d255ce21..0d67e36ae 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -47,7 +47,6 @@ function ScrollableColumnsInner< const containerRef = React.createRef(); React.useImperativeHandle(ref, () => ({ getRowHeight: () => { - const rowHeight = rowRef.current?.offsetHeight ?? 0; let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { @@ -57,7 +56,7 @@ function ScrollableColumnsInner< } } } - return Math.max(rowHeight, maxCellHeight); + return maxCellHeight; }, getRowHeaderHeights: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; From 47ba19826c488a788866dcc884debca1aa916a00 Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Thu, 16 Jan 2025 00:48:18 +0800 Subject: [PATCH 12/15] fix: table width and height --- packages/drip-table-generator/package.json | 2 +- .../components/left-columns/index.tsx | 19 ++++--- .../components/right-columns/index.tsx | 3 +- .../editable-table/index.tsx | 56 ++++++++++--------- 4 files changed, 44 insertions(+), 36 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 0f8a3fb0c..114331d2a 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.5", + "version": "3.2.2-alpha.6", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index b1370ee20..50e57513e 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -53,20 +53,23 @@ function LeftFixedColumnsInner< const leftMargins = React.useMemo(() => { let margin = 0; if (props.tableConfig.hasSubTable) { - margin += props.tableConfig.configs.bordered ? 49 : 48; + margin += props.tableConfig.configs.bordered ? 50 : 48; } if (props.tableConfig.configs.rowSelection) { margin += props.tableConfig.configs.bordered ? 49 : 48; } - props.columnList.forEach((columnWrapper, index) => { - const column = columnWrapper.column; - margin += column.width ? formatNumber(String(column.width).replace('px', '').replace('%', '') || 200) as number : 200; - }); + for (let i = 0; i < props.columnList.length; i++) { + const column = props.columnList[i].column; + const width = column.width ? formatNumber(String(column.width).replace('px', '').replace('%', '') || 200) as number : 200; + margin += Math.max(width, 120); + } + if (props.columnList.length > 0 && !props.tableConfig.configs.bordered) { + margin += 3; + } return margin; }, [props.tableConfig.hasSubTable, props.tableConfig.configs, props.columnList]); React.useImperativeHandle(ref, () => ({ getRowHeight: () => { - const rowHeight = rowRef.current?.offsetHeight ?? 0; let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { @@ -76,7 +79,7 @@ function LeftFixedColumnsInner< } } } - return (rowRef.current?.children.length || 0) <= 0 ? rowHeight : maxCellHeight; + return maxCellHeight; }, getSubTableHeight: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; @@ -102,7 +105,7 @@ function LeftFixedColumnsInner< bordered: props.columnList.length > 0 || props.tableConfig.hasSubTable || props.tableConfig.configs.rowSelection, })} ref={containerRef} - style={{ width: leftMargins }} + style={{ width: props.tableConfig.hasSubTable ? leftMargins : void 0 }} >
(); React.useImperativeHandle(ref, () => ({ getRowHeight: () => { - const rowHeight = rowRef.current?.offsetHeight ?? 0; let maxCellHeight = 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { @@ -55,7 +54,7 @@ function RightFixedColumnsInner< } } } - return (rowRef.current?.children.length || 0) <= 0 ? rowHeight : maxCellHeight; + return maxCellHeight; }, })); return ( diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index 6e19ee3f4..1933f4623 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -46,31 +46,6 @@ function EditableTable< const scrollColumnsRef = React.useRef(null); const rightColumnsRef = React.useRef(null); - React.useEffect(() => { - const leftHeight = leftColumnsRef.current?.getRowHeight() ?? 0; - const scrollHeight = scrollColumnsRef.current?.getRowHeight() ?? 0; - const rightHeight = rightColumnsRef.current?.getRowHeight() ?? 0; - if ((leftHeight !== scrollHeight || rightHeight !== scrollHeight || leftHeight !== rightHeight) && ( - Math.abs(scrollHeight - leftHeight) > 1 && Math.abs(scrollHeight - rightHeight) > 1 - )) { - setRowHeight(Math.max(leftHeight, scrollHeight, rightHeight)); - } - }, [props.dataSource, props.schema, props.tableConfig]); - - React.useEffect(() => { - setTimeout(() => { - const leftHeights = leftColumnsRef.current?.getSubTableHeight() ?? []; - setSubTableHeights(leftHeights); - }, 200); - }, [props.dataSource, props.schema, props.tableConfig, context.tableConfigs]); - - React.useEffect(() => { - setTimeout(() => { - const rowHeights = scrollColumnsRef.current?.getRowHeaderHeights() ?? []; - setRowHeaderHeights(rowHeights); - }, 200); - }, [props.dataSource, props.schema, props.tableConfig, context.tableConfigs]); - const tableHeight = React.useMemo(() => { if (props.tableConfig.configs.scroll?.y && typeof props.tableConfig.configs.scroll?.y !== 'boolean') { return props.tableConfig.configs.scroll?.y; @@ -116,6 +91,37 @@ function EditableTable< leftFixedColumns = filterArray(columnList, item => item.column.fixed === 'left' || (item.column.fixed && item.id < sortableColumns[0].id)); rightFixedColumns = filterArray(columnList, item => item.column.fixed === 'right' || (item.column.fixed && item.id > sortableColumns[0].id)); } + + React.useEffect(() => { + const leftHeight = leftColumnsRef.current?.getRowHeight() ?? 0; + const scrollHeight = scrollColumnsRef.current?.getRowHeight() ?? 0; + const rightHeight = rightColumnsRef.current?.getRowHeight() ?? 0; + if (leftFixedColumns.length > 0 && sortableColumns.length > 0 && rightFixedColumns.length > 0 + && ( + Math.abs(scrollHeight - leftHeight) > 1 && Math.abs(scrollHeight - rightHeight) > 1 + )) { + setRowHeight(Math.max(leftHeight, scrollHeight, rightHeight)); + } else if (sortableColumns.length > 0 && rightFixedColumns.length <= 0 && Math.abs(scrollHeight - leftHeight) > 1) { + setRowHeight(Math.max(leftHeight, scrollHeight)); + } else if (sortableColumns.length > 0 && leftFixedColumns.length <= 0 && Math.abs(scrollHeight - rightHeight) > 1) { + setRowHeight(Math.max(rightHeight, scrollHeight)); + } + }, [props.dataSource, props.schema, props.tableConfig, leftFixedColumns, rightFixedColumns, sortableColumns]); + + React.useEffect(() => { + setTimeout(() => { + const leftHeights = leftColumnsRef.current?.getSubTableHeight() ?? []; + setSubTableHeights(leftHeights); + }, 200); + }, [props.dataSource, props.schema, props.tableConfig, context.tableConfigs]); + + React.useEffect(() => { + setTimeout(() => { + const rowHeights = scrollColumnsRef.current?.getRowHeaderHeights() ?? []; + setRowHeaderHeights(rowHeights); + }, 200); + }, [props.dataSource, props.schema, props.tableConfig, context.tableConfigs]); + return ( {({ tableConfigs, setTableColumns }) => ( From 65b01b99c889e89beb4a1ff1ffacce4837796110 Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Thu, 16 Jan 2025 01:51:56 +0800 Subject: [PATCH 13/15] fix: table height sync --- packages/drip-table-generator/package.json | 2 +- .../components/left-columns/index.tsx | 5 ++-- .../components/right-columns/index.tsx | 5 ++-- .../components/scroll-columns/index.tsx | 5 ++-- .../editable-table/index.tsx | 29 ++++++++++--------- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 114331d2a..1725d5f97 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.6", + "version": "3.2.2-alpha.7", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index 50e57513e..b5043f04e 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -35,7 +35,7 @@ export interface LeftFixedColumnsProps< } export interface LeftFixedColumnsHandler { - getRowHeight: () => number; + getRowHeight: () => number[]; getSubTableHeight: () => number[]; } @@ -71,6 +71,7 @@ function LeftFixedColumnsInner< React.useImperativeHandle(ref, () => ({ getRowHeight: () => { let maxCellHeight = 0; + const rowHeight = rowRef.current?.offsetHeight ?? 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; @@ -79,7 +80,7 @@ function LeftFixedColumnsInner< } } } - return maxCellHeight; + return [rowHeight, maxCellHeight]; }, getSubTableHeight: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx index 78933e183..503721292 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/right-columns/index.tsx @@ -32,7 +32,7 @@ export interface RightFixedColumnsProps< } export interface RightFixedColumnsHandler { - getRowHeight: () => number; + getRowHeight: () => number[]; } function RightFixedColumnsInner< @@ -46,6 +46,7 @@ function RightFixedColumnsInner< React.useImperativeHandle(ref, () => ({ getRowHeight: () => { let maxCellHeight = 0; + const rowHeight = rowRef.current?.offsetHeight ?? 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; @@ -54,7 +55,7 @@ function RightFixedColumnsInner< } } } - return maxCellHeight; + return [rowHeight, maxCellHeight]; }, })); return ( diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx index 0d67e36ae..52633f366 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/scroll-columns/index.tsx @@ -32,7 +32,7 @@ export interface ScrollableColumnsProps< } export interface ScrollableColumnsHandler { - getRowHeight: () => number; + getRowHeight: () => number[]; getRowHeaderHeights: () => number[]; } @@ -48,6 +48,7 @@ function ScrollableColumnsInner< React.useImperativeHandle(ref, () => ({ getRowHeight: () => { let maxCellHeight = 0; + const rowHeight = rowRef.current?.offsetHeight ?? 0; for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { if (element.children[0]) { const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; @@ -56,7 +57,7 @@ function ScrollableColumnsInner< } } } - return maxCellHeight; + return [rowHeight, maxCellHeight]; }, getRowHeaderHeights: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index 1933f4623..a7ef1b324 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -45,6 +45,7 @@ function EditableTable< const leftColumnsRef = React.useRef(null); const scrollColumnsRef = React.useRef(null); const rightColumnsRef = React.useRef(null); + const lastRowHeights = React.useRef([]); const tableHeight = React.useMemo(() => { if (props.tableConfig.configs.scroll?.y && typeof props.tableConfig.configs.scroll?.y !== 'boolean') { @@ -93,20 +94,22 @@ function EditableTable< } React.useEffect(() => { - const leftHeight = leftColumnsRef.current?.getRowHeight() ?? 0; - const scrollHeight = scrollColumnsRef.current?.getRowHeight() ?? 0; - const rightHeight = rightColumnsRef.current?.getRowHeight() ?? 0; - if (leftFixedColumns.length > 0 && sortableColumns.length > 0 && rightFixedColumns.length > 0 - && ( - Math.abs(scrollHeight - leftHeight) > 1 && Math.abs(scrollHeight - rightHeight) > 1 - )) { - setRowHeight(Math.max(leftHeight, scrollHeight, rightHeight)); - } else if (sortableColumns.length > 0 && rightFixedColumns.length <= 0 && Math.abs(scrollHeight - leftHeight) > 1) { - setRowHeight(Math.max(leftHeight, scrollHeight)); - } else if (sortableColumns.length > 0 && leftFixedColumns.length <= 0 && Math.abs(scrollHeight - rightHeight) > 1) { - setRowHeight(Math.max(rightHeight, scrollHeight)); + const [leftRowHeight, leftCellHeight] = leftColumnsRef.current?.getRowHeight() ?? [0, 0]; + const [scrollRowHeight, scrollCellHeight] = scrollColumnsRef.current?.getRowHeight() ?? [0, 0]; + const [rightRowHeight, rightCellHeight] = rightColumnsRef.current?.getRowHeight() ?? [0, 0]; + if (lastRowHeights.current.length <= 0) { + if (leftRowHeight !== scrollRowHeight || rightRowHeight !== scrollCellHeight || leftRowHeight !== rightRowHeight) { + setRowHeight(Math.max(leftCellHeight, scrollCellHeight, rightCellHeight) + 1); + lastRowHeights.current = [leftCellHeight, scrollCellHeight, rightCellHeight]; + } + } else { + const [lastLeftHeight, lastScrollHeight, lastRightHeight] = lastRowHeights.current ?? []; + if (lastLeftHeight !== leftCellHeight || lastScrollHeight !== scrollCellHeight || lastRightHeight !== rightCellHeight) { + setRowHeight(Math.max(leftCellHeight, scrollCellHeight, rightCellHeight) + 1); + lastRowHeights.current = [leftCellHeight, scrollCellHeight, rightCellHeight]; + } } - }, [props.dataSource, props.schema, props.tableConfig, leftFixedColumns, rightFixedColumns, sortableColumns]); + }, [props.dataSource, props.schema, props.tableConfig]); React.useEffect(() => { setTimeout(() => { From 79466213a78b7c1f6f55c19ab0c030b385543a0e Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Thu, 16 Jan 2025 02:08:26 +0800 Subject: [PATCH 14/15] fix: table height sync --- packages/drip-table-generator/package.json | 2 +- .../src/layouts/table-workstation/editable-table/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 1725d5f97..88815d5da 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.7", + "version": "3.2.2-alpha.8", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx index a7ef1b324..a2bbb8ea1 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/index.tsx @@ -104,7 +104,7 @@ function EditableTable< } } else { const [lastLeftHeight, lastScrollHeight, lastRightHeight] = lastRowHeights.current ?? []; - if (lastLeftHeight !== leftCellHeight || lastScrollHeight !== scrollCellHeight || lastRightHeight !== rightCellHeight) { + if (lastLeftHeight !== leftCellHeight || Math.abs(lastScrollHeight - scrollCellHeight) > 1 || lastRightHeight !== rightCellHeight) { setRowHeight(Math.max(leftCellHeight, scrollCellHeight, rightCellHeight) + 1); lastRowHeights.current = [leftCellHeight, scrollCellHeight, rightCellHeight]; } From fae5394734e0f25d9c8730f2055586f21d04d4a2 Mon Sep 17 00:00:00 2001 From: helloqian12138 Date: Thu, 16 Jan 2025 22:23:44 +0800 Subject: [PATCH 15/15] fix: table height sync --- packages/drip-table-generator/package.json | 2 +- .../components/left-columns/index.tsx | 48 +++++++++++++------ .../components/right-columns/index.tsx | 47 ++++++++++++------ .../components/scroll-columns/index.tsx | 47 ++++++++++++------ .../editable-table/index.tsx | 26 ++-------- 5 files changed, 101 insertions(+), 69 deletions(-) diff --git a/packages/drip-table-generator/package.json b/packages/drip-table-generator/package.json index 88815d5da..33ad721a2 100755 --- a/packages/drip-table-generator/package.json +++ b/packages/drip-table-generator/package.json @@ -1,6 +1,6 @@ { "name": "drip-table-generator", - "version": "3.2.2-alpha.8", + "version": "3.2.2-alpha.9", "description": "A visualization tool for generating schema of drip-table.", "main": "dist/index.min.js", "module": "lib/index.js", diff --git a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx index b5043f04e..26fe004df 100644 --- a/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx +++ b/packages/drip-table-generator/src/layouts/table-workstation/editable-table/components/left-columns/index.tsx @@ -19,6 +19,8 @@ import { DripTableGeneratorProps } from '@/typing'; import EditableTable from '../..'; import ColumnHeader from '../column-header'; +import { RightFixedColumnsHandler } from '../right-columns'; +import { ScrollableColumnsHandler } from '../scroll-columns'; import TableSection from '../table-section'; export interface LeftFixedColumnsProps< @@ -28,14 +30,14 @@ export interface LeftFixedColumnsProps< tableConfig: DTGTableConfig; previewDataSource: ({ id: number; record: RecordType })[]; containerWidth: number; - rowHeight: number | undefined; + siblings: [React.RefObject, React.RefObject]; columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; ref?: React.RefObject; rowHeaderHeights?: number[]; } export interface LeftFixedColumnsHandler { - getRowHeight: () => number[]; + getRowHeight: () => number; getSubTableHeight: () => number[]; } @@ -48,8 +50,10 @@ function LeftFixedColumnsInner< ) { const { tableConfigs } = React.useContext(TableConfigsContext); const currentTableIndex = tableConfigs.findIndex(c => c.tableId === props.tableConfig.tableId); + const [rowHeight, setRowHeight] = React.useState(void 0 as number | undefined); const rowRef = React.createRef(); const containerRef = React.createRef(); + const leftMargins = React.useMemo(() => { let margin = 0; if (props.tableConfig.hasSubTable) { @@ -68,20 +72,34 @@ function LeftFixedColumnsInner< } return margin; }, [props.tableConfig.hasSubTable, props.tableConfig.configs, props.columnList]); - React.useImperativeHandle(ref, () => ({ - getRowHeight: () => { - let maxCellHeight = 0; - const rowHeight = rowRef.current?.offsetHeight ?? 0; - for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { - if (element.children[0]) { - const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; - if (trueCellHeight > maxCellHeight) { - maxCellHeight = trueCellHeight; - } + + const getCurrentRowHeight = () => { + let maxCellHeight = 0; + const currentRowHeight = rowRef.current?.offsetHeight ?? 0; + for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { + if (element.children[0]) { + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; + if (trueCellHeight > maxCellHeight) { + maxCellHeight = trueCellHeight; } } - return [rowHeight, maxCellHeight]; - }, + } + return currentRowHeight - maxCellHeight === 1 ? currentRowHeight : maxCellHeight; + }; + + React.useEffect(() => { + const currentRowHeight = getCurrentRowHeight(); + const [scrollRef, rightRef] = props.siblings; + const scrollColumnsHeight = scrollRef.current?.getRowHeight() || 0; + const rightFixedColumnsHeight = rightRef.current?.getRowHeight() || 0; + const maxSiblingsHeight = Math.max(scrollColumnsHeight, rightFixedColumnsHeight); + if (maxSiblingsHeight > currentRowHeight) { + setRowHeight(maxSiblingsHeight); + } + }, [props.columnList, props.tableConfig, props.dataSource]); + + React.useImperativeHandle(ref, () => ({ + getRowHeight: getCurrentRowHeight, getSubTableHeight: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; const start = props.tableConfig.configs.showHeader ? 1 : 0; @@ -174,7 +192,7 @@ function LeftFixedColumnsInner< stripe: props.tableConfig.configs.stripe && rowIndex % 2 === 1, })} ref={rowRef} - style={{ height: props.rowHeight }} + style={{ height: rowHeight }} > {props.tableConfig.hasSubTable && (
, React.RefObject]; columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; ref?: React.RefObject; subTableHeights?: number[]; @@ -32,7 +34,7 @@ export interface RightFixedColumnsProps< } export interface RightFixedColumnsHandler { - getRowHeight: () => number[]; + getRowHeight: () => number; } function RightFixedColumnsInner< @@ -43,20 +45,35 @@ function RightFixedColumnsInner< ref: React.ForwardedRef, ) { const rowRef = React.createRef(); - React.useImperativeHandle(ref, () => ({ - getRowHeight: () => { - let maxCellHeight = 0; - const rowHeight = rowRef.current?.offsetHeight ?? 0; - for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { - if (element.children[0]) { - const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; - if (trueCellHeight > maxCellHeight) { - maxCellHeight = trueCellHeight; - } + const [rowHeight, setRowHeight] = React.useState(void 0 as number | undefined); + + const getCurrentRowHeight = () => { + let maxCellHeight = 0; + const currentRowHeight = rowRef.current?.offsetHeight ?? 0; + for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { + if (element.children[0]) { + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; + if (trueCellHeight > maxCellHeight) { + maxCellHeight = trueCellHeight; } } - return [rowHeight, maxCellHeight]; - }, + } + return currentRowHeight - maxCellHeight === 1 ? currentRowHeight : maxCellHeight; + }; + + React.useEffect(() => { + const currentRowHeight = getCurrentRowHeight(); + const [leftRef, scrollRef] = props.siblings; + const leftFixedColumnsHeight = leftRef.current?.getRowHeight() || 0; + const scrollColumnsHeight = scrollRef.current?.getRowHeight() || 0; + const maxSiblingsHeight = Math.max(scrollColumnsHeight, leftFixedColumnsHeight); + if (maxSiblingsHeight > currentRowHeight) { + setRowHeight(maxSiblingsHeight); + } + }, [props.columnList, props.tableConfig, props.dataSource]); + + React.useImperativeHandle(ref, () => ({ + getRowHeight: getCurrentRowHeight, })); return (
, React.RefObject]; columnList: { id: number; column: DTGTableConfig['columns'][number] }[]; ref?: React.RefObject; subTableHeights?: number[]; } export interface ScrollableColumnsHandler { - getRowHeight: () => number[]; + getRowHeight: () => number; getRowHeaderHeights: () => number[]; } @@ -45,20 +47,35 @@ function ScrollableColumnsInner< ) { const rowRef = React.createRef(); const containerRef = React.createRef(); - React.useImperativeHandle(ref, () => ({ - getRowHeight: () => { - let maxCellHeight = 0; - const rowHeight = rowRef.current?.offsetHeight ?? 0; - for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { - if (element.children[0]) { - const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; - if (trueCellHeight > maxCellHeight) { - maxCellHeight = trueCellHeight; - } + const [rowHeight, setRowHeight] = React.useState(void 0 as number | undefined); + + const getCurrentRowHeight = () => { + let maxCellHeight = 0; + const currentRowHeight = rowRef.current?.offsetHeight ?? 0; + for (const element of (rowRef.current?.children || []) as HTMLDivElement[]) { + if (element.children[0]) { + const trueCellHeight = (element.children[0] as HTMLDivElement).offsetHeight + 28; + if (trueCellHeight > maxCellHeight) { + maxCellHeight = trueCellHeight; } } - return [rowHeight, maxCellHeight]; - }, + } + return currentRowHeight - maxCellHeight === 1 ? currentRowHeight : maxCellHeight; + }; + + React.useEffect(() => { + const currentRowHeight = getCurrentRowHeight(); + const [leftRef, rightRef] = props.siblings; + const leftFixedColumnsHeight = leftRef.current?.getRowHeight() || 0; + const rightFixedColumnsHeight = rightRef.current?.getRowHeight() || 0; + const maxSiblingsHeight = Math.max(rightFixedColumnsHeight, leftFixedColumnsHeight); + if (maxSiblingsHeight > currentRowHeight) { + setRowHeight(maxSiblingsHeight); + } + }, [props.columnList, props.tableConfig, props.dataSource]); + + React.useImperativeHandle(ref, () => ({ + getRowHeight: getCurrentRowHeight, getRowHeaderHeights: () => { const rows = (containerRef.current?.children || []) as HTMLDivElement[]; const start = props.tableConfig.configs.showHeader ? 1 : 0; @@ -117,7 +134,7 @@ function ScrollableColumnsInner< stripe: props.tableConfig.configs.stripe && rowIndex % 2 === 1, })} ref={rowRef} - style={{ height: props.rowHeight }} + style={{ height: rowHeight }} > (props: EditableTableProps) { const context = React.useContext(TableConfigsContext); const [previewRecord] = React.useState(void 0 as number | undefined); - const [rowHeight, setRowHeight] = React.useState(void 0 as number | undefined); const [subTableHeights, setSubTableHeights] = React.useState([] as number[]); const [rowHeaderHeights, setRowHeaderHeights] = React.useState([] as number[]); const containerRef = React.useRef(null); const leftColumnsRef = React.useRef(null); const scrollColumnsRef = React.useRef(null); const rightColumnsRef = React.useRef(null); - const lastRowHeights = React.useRef([]); const tableHeight = React.useMemo(() => { if (props.tableConfig.configs.scroll?.y && typeof props.tableConfig.configs.scroll?.y !== 'boolean') { @@ -93,24 +91,6 @@ function EditableTable< rightFixedColumns = filterArray(columnList, item => item.column.fixed === 'right' || (item.column.fixed && item.id > sortableColumns[0].id)); } - React.useEffect(() => { - const [leftRowHeight, leftCellHeight] = leftColumnsRef.current?.getRowHeight() ?? [0, 0]; - const [scrollRowHeight, scrollCellHeight] = scrollColumnsRef.current?.getRowHeight() ?? [0, 0]; - const [rightRowHeight, rightCellHeight] = rightColumnsRef.current?.getRowHeight() ?? [0, 0]; - if (lastRowHeights.current.length <= 0) { - if (leftRowHeight !== scrollRowHeight || rightRowHeight !== scrollCellHeight || leftRowHeight !== rightRowHeight) { - setRowHeight(Math.max(leftCellHeight, scrollCellHeight, rightCellHeight) + 1); - lastRowHeights.current = [leftCellHeight, scrollCellHeight, rightCellHeight]; - } - } else { - const [lastLeftHeight, lastScrollHeight, lastRightHeight] = lastRowHeights.current ?? []; - if (lastLeftHeight !== leftCellHeight || Math.abs(lastScrollHeight - scrollCellHeight) > 1 || lastRightHeight !== rightCellHeight) { - setRowHeight(Math.max(leftCellHeight, scrollCellHeight, rightCellHeight) + 1); - lastRowHeights.current = [leftCellHeight, scrollCellHeight, rightCellHeight]; - } - } - }, [props.dataSource, props.schema, props.tableConfig]); - React.useEffect(() => { setTimeout(() => { const leftHeights = leftColumnsRef.current?.getSubTableHeight() ?? []; @@ -160,8 +140,8 @@ function EditableTable< columnList={leftFixedColumns} previewDataSource={previewDataSource as ({ id: number; record: RecordType })[]} containerWidth={tableWidth} - rowHeight={rowHeight} rowHeaderHeights={rowHeaderHeights} + siblings={[scrollColumnsRef, rightColumnsRef]} /> {...props} @@ -170,8 +150,8 @@ function EditableTable< columnList={sortableColumns} previewDataSource={previewDataSource} containerWidth={tableWidth} - rowHeight={rowHeight} subTableHeights={subTableHeights} + siblings={[leftColumnsRef, rightColumnsRef]} /> {...props} @@ -180,9 +160,9 @@ function EditableTable< columnList={rightFixedColumns} previewDataSource={previewDataSource} containerWidth={tableWidth} - rowHeight={rowHeight} subTableHeights={subTableHeights} rowHeaderHeights={rowHeaderHeights} + siblings={[leftColumnsRef, scrollColumnsRef]} />