@are-visual/virtual-table 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +548 -0
  2. package/index.d.ts +311 -0
  3. package/index.esm.js +1771 -0
  4. package/index.esm.js.map +1 -0
  5. package/middleware/column-resize/index.d.ts +19 -0
  6. package/middleware/column-resize/index.js +130 -0
  7. package/middleware/column-resize/index.js.map +1 -0
  8. package/middleware/column-resize/styles.css +8 -0
  9. package/middleware/column-resize/styles.scss +10 -0
  10. package/middleware/empty/index.d.ts +10 -0
  11. package/middleware/empty/index.js +73 -0
  12. package/middleware/empty/index.js.map +1 -0
  13. package/middleware/expandable/index.d.ts +37 -0
  14. package/middleware/expandable/index.js +239 -0
  15. package/middleware/expandable/index.js.map +1 -0
  16. package/middleware/expandable/styles.css +49 -0
  17. package/middleware/expandable/styles.scss +73 -0
  18. package/middleware/horizontal-scroll-bar/index.d.ts +15 -0
  19. package/middleware/horizontal-scroll-bar/index.js +90 -0
  20. package/middleware/horizontal-scroll-bar/index.js.map +1 -0
  21. package/middleware/horizontal-scroll-bar/styles.css +11 -0
  22. package/middleware/horizontal-scroll-bar/styles.scss +13 -0
  23. package/middleware/loading/index.d.ts +7 -0
  24. package/middleware/loading/index.js +73 -0
  25. package/middleware/loading/index.js.map +1 -0
  26. package/middleware/loading/styles.css +17 -0
  27. package/middleware/loading/styles.scss +27 -0
  28. package/middleware/selection/index.d.ts +47 -0
  29. package/middleware/selection/index.js +282 -0
  30. package/middleware/selection/index.js.map +1 -0
  31. package/middleware/selection/styles.css +13 -0
  32. package/middleware/selection/styles.scss +20 -0
  33. package/middleware/summary/index.d.ts +36 -0
  34. package/middleware/summary/index.js +203 -0
  35. package/middleware/summary/index.js.map +1 -0
  36. package/middleware/summary/styles.css +36 -0
  37. package/middleware/summary/styles.scss +45 -0
  38. package/middleware/utils/getScrollbarSize.d.ts +5 -0
  39. package/middleware/utils/getScrollbarSize.js +15 -0
  40. package/middleware/utils/getScrollbarSize.js.map +1 -0
  41. package/middleware/utils/useControllableValue.d.ts +16 -0
  42. package/middleware/utils/useControllableValue.js +28 -0
  43. package/middleware/utils/useControllableValue.js.map +1 -0
  44. package/package.json +34 -0
  45. package/styles/table.css +142 -0
  46. package/styles/table.scss +186 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../packages/virtual-table/src/middleware/empty/empty-row.tsx","../../../../packages/virtual-table/src/middleware/empty/index.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react'\nimport { useContainerSize } from '@are-visual/virtual-table'\n\nexport interface EmptyRowProps {\n colSpan: number\n children: ReactNode\n}\n\nconst EmptyRow: FC<EmptyRowProps> = (props) => {\n const { colSpan, children } = props\n const { tableWidth } = useContainerSize()\n\n return (\n <tr>\n <td colSpan={colSpan}>\n <div\n style={{\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n top: 0,\n padding: 16,\n width: tableWidth <= 0 ? undefined : tableWidth,\n }}\n >\n {children}\n </div>\n </td>\n </tr>\n )\n}\n\nexport default EmptyRow\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MiddlewareContext, MiddlewareRenderBody, MiddlewareResult } from '@are-visual/virtual-table'\nimport type { ComponentType, ReactNode } from 'react'\nimport { createMiddleware } from '@are-visual/virtual-table'\nimport { cloneElement, createElement, isValidElement, useCallback, useMemo } from 'react'\nimport EmptyRow from './empty-row'\n\nexport interface EmptyOptions {\n children: ReactNode | ComponentType\n visible?: boolean\n}\n\nfunction useTableEmpty<T = any>(ctx: MiddlewareContext<T>, args: EmptyOptions): MiddlewareResult<T> {\n const { children: component, visible = true } = args\n const { dataSource } = ctx\n\n const isNoData = !Array.isArray(dataSource) ? true : dataSource.length === 0\n const showEmpty = isNoData && visible\n\n const node = useMemo(() => {\n if (typeof component === 'function') {\n return createElement(component)\n }\n return component\n }, [component])\n\n const renderBody: MiddlewareRenderBody = useCallback((children, options) => {\n const { columns } = options\n\n if (isValidElement(children)) {\n const childrenProps = children.props as Record<string, unknown>\n return cloneElement(children, childrenProps, [\n ...(Array.isArray(childrenProps.children) ? childrenProps.children : []),\n <EmptyRow key=\"virtual-table-placeholder$\" colSpan={columns.length}>{node}</EmptyRow>,\n ])\n }\n\n return (\n <>\n {children}\n {node}\n </>\n )\n }, [node])\n\n if (!showEmpty) {\n return ctx\n }\n\n return {\n ...ctx,\n renderBody,\n }\n}\n\nexport const tableEmpty = createMiddleware(useTableEmpty)\n"],"names":["EmptyRow","props","colSpan","children","tableWidth","useContainerSize","_jsx","style","boxSizing","position","left","top","padding","width","undefined","useTableEmpty","ctx","args","component","visible","dataSource","isNoData","Array","isArray","length","showEmpty","node","useMemo","createElement","renderBody","useCallback","options","columns","isValidElement","childrenProps","cloneElement","_jsxs","_Fragment","tableEmpty","createMiddleware"],"mappings":";;;;AAQA,MAAMA,QAAQ,GAAuBC,KAAK,IAAI;EAC5C,MAAM;IAAEC,OAAO;AAAEC,IAAAA;AAAU,GAAA,GAAGF,KAAK;EACnC,MAAM;AAAEG,IAAAA;GAAY,GAAGC,gBAAgB,EAAE;EAEzC,OACEC;cACEA,GAAI,CAAA,IAAA,EAAA;AAAAJ,MAAAA,OAAO,EAAEA,OAAO;AAAAC,MAAAA,QAAA,EAClBG,GACE,CAAA,KAAA,EAAA;AAAAC,QAAAA,KAAK,EAAE;AACLC,UAAAA,SAAS,EAAE,YAAY;AACvBC,UAAAA,QAAQ,EAAE,QAAQ;AAClBC,UAAAA,IAAI,EAAE,CAAC;AACPC,UAAAA,GAAG,EAAE,CAAC;AACNC,UAAAA,OAAO,EAAE,EAAE;AACXC,UAAAA,KAAK,EAAET,UAAU,IAAI,CAAC,GAAGU,SAAS,GAAGV;SACtC;AAAAD,QAAAA,QAAA,EAEAA;OAAQ;KAER;AAAA,GAAA,CACF;AAET,CAAC;;AClBD,SAASY,aAAaA,CAAUC,GAAyB,EAAEC,IAAkB,EAAA;EAC3E,MAAM;AAAEd,IAAAA,QAAQ,EAAEe,SAAS;AAAEC,IAAAA,OAAO,GAAG;AAAI,GAAE,GAAGF,IAAI;EACpD,MAAM;AAAEG,IAAAA;AAAY,GAAA,GAAGJ,GAAG;AAE1B,EAAA,MAAMK,QAAQ,GAAG,CAACC,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,GAAG,IAAI,GAAGA,UAAU,CAACI,MAAM,KAAK,CAAC;AAC5E,EAAA,MAAMC,SAAS,GAAGJ,QAAQ,IAAIF,OAAO;AAErC,EAAA,MAAMO,IAAI,GAAGC,OAAO,CAAC,MAAK;AACxB,IAAA,IAAI,OAAOT,SAAS,KAAK,UAAU,EAAE;MACnC,oBAAOU,aAAa,CAACV,SAAS,CAAC;AACjC;AACA,IAAA,OAAOA,SAAS;AAClB,GAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAEf,MAAMW,UAAU,GAAyBC,WAAW,CAAC,CAAC3B,QAAQ,EAAE4B,OAAO,KAAI;IACzE,MAAM;AAAEC,MAAAA;AAAS,KAAA,GAAGD,OAAO;AAE3B,IAAA,iBAAIE,cAAc,CAAC9B,QAAQ,CAAC,EAAE;AAC5B,MAAA,MAAM+B,aAAa,GAAG/B,QAAQ,CAACF,KAAgC;MAC/D,oBAAOkC,YAAY,CAAChC,QAAQ,EAAE+B,aAAa,EAAE,CAC3C,IAAIZ,KAAK,CAACC,OAAO,CAACW,aAAa,CAAC/B,QAAQ,CAAC,GAAG+B,aAAa,CAAC/B,QAAQ,GAAG,EAAE,CAAC,EACxEG,GAAC,CAAAN,QAAQ,EAAkC;QAAAE,OAAO,EAAE8B,OAAO,CAACR,MAAM;AAAGrB,QAAAA,QAAA,EAAAuB;AAAvD,OAAA,EAAA,4BAA4B,CAA2C,CACtF,CAAC;AACJ;IAEA,OACEU,IACG,CAAAC,QAAA,EAAA;AAAAlC,MAAAA,QAAA,EAAA,CAAAA,QAAQ,EACRuB,IAAI;AAAA,KAAA,CACJ;AAEP,GAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAEV,IAAI,CAACD,SAAS,EAAE;AACd,IAAA,OAAOT,GAAG;AACZ;EAEA,OAAO;AACL,IAAA,GAAGA,GAAG;AACNa,IAAAA;GACD;AACH;MAEaS,UAAU,GAAGC,gBAAgB,CAACxB,aAAa;;;;"}
@@ -0,0 +1,37 @@
1
+ import * as _are_visual_virtual_table from '@are-visual/virtual-table';
2
+ import { FixedType, ColumnExtra, ColumnType } from '@are-visual/virtual-table';
3
+ import { ReactNode, Key, MouseEvent } from 'react';
4
+
5
+ type TriggerEventHandler<T> = (record: T, event: MouseEvent<HTMLElement>) => void;
6
+ interface RenderExpandIconProps<T> {
7
+ prefixCls: string;
8
+ expanded: boolean;
9
+ record: T;
10
+ expandable: boolean;
11
+ onExpand: TriggerEventHandler<T>;
12
+ }
13
+ type RowClassName<T> = (record: T, index: number, indent: number) => string;
14
+ type RenderExpandIcon<T> = (props: RenderExpandIconProps<T>) => ReactNode;
15
+ type ExpandedRowRender<T> = (record: T, index: number, indent: number, expanded: boolean) => ReactNode;
16
+ interface ExpandableConfig<T> {
17
+ expandedRowKeys?: readonly Key[];
18
+ defaultExpandedRowKeys?: readonly Key[];
19
+ expandedRowRender?: ExpandedRowRender<T>;
20
+ columnTitle?: ReactNode;
21
+ expandRowByClick?: boolean;
22
+ expandIcon?: RenderExpandIcon<T>;
23
+ onExpand?: (expanded: boolean, record: T) => void;
24
+ onExpandedRowsChange?: (expandedKeys: readonly Key[]) => void;
25
+ defaultExpandAllRows?: boolean;
26
+ showExpandColumn?: boolean;
27
+ expandedRowClassName?: string | RowClassName<T>;
28
+ rowExpandable?: (record: T) => boolean;
29
+ columnWidth?: number | string;
30
+ fixed?: FixedType;
31
+ extraColumnProps?: ColumnExtra;
32
+ }
33
+ declare const EXPANSION_COLUMN_KEY = "VirtualTable.EXPANSION_COLUMN";
34
+ declare function isExpansionColumn<T = any>(column: ColumnType<T>): boolean;
35
+ declare const tableExpandable: <T = any>(options?: ExpandableConfig<T> | undefined) => _are_visual_virtual_table.Middleware<T>;
36
+
37
+ export { EXPANSION_COLUMN_KEY, type ExpandableConfig, type ExpandedRowRender, type RenderExpandIcon, type RenderExpandIconProps, type RowClassName, isExpansionColumn, tableExpandable };
@@ -0,0 +1,239 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useTableRowManager, useContainerSize, createMiddleware, useShallowMemo, useStableFn, isValidFixed } from '@are-visual/virtual-table';
3
+ import { useControllableValue } from '@are-visual/virtual-table/middleware/utils/useControllableValue';
4
+ import clsx from 'clsx';
5
+ import { useRef, useMemo, useCallback } from 'react';
6
+
7
+ const ExpandRow = props => {
8
+ const {
9
+ className,
10
+ style,
11
+ rowIndex,
12
+ isExpanded,
13
+ colSpan,
14
+ children,
15
+ fixed
16
+ } = props;
17
+ const {
18
+ getRowHeightList,
19
+ updateRowHeight
20
+ } = useTableRowManager();
21
+ const {
22
+ tableWidth
23
+ } = useContainerSize();
24
+ const currentNodeHeight = useRef(0);
25
+ return jsx("tr", {
26
+ className: clsx('virtual-table-expanded-row', className),
27
+ style: {
28
+ ...style,
29
+ display: isExpanded ? undefined : 'none'
30
+ },
31
+ ref: node => {
32
+ if (node == null) return;
33
+ const originHeight = getRowHeightList()[rowIndex] ?? 0;
34
+ if (isExpanded) {
35
+ currentNodeHeight.current = node.offsetHeight;
36
+ updateRowHeight(rowIndex, originHeight + currentNodeHeight.current);
37
+ }
38
+ },
39
+ children: jsx("td", {
40
+ colSpan: colSpan,
41
+ children: jsx("div", {
42
+ className: clsx('virtual-table-cell', fixed && 'virtual-table-expanded-row-fixed'),
43
+ style: {
44
+ width: tableWidth <= 0 ? undefined : tableWidth
45
+ },
46
+ children: children
47
+ })
48
+ })
49
+ });
50
+ };
51
+
52
+ const EXPANSION_COLUMN_KEY = 'VirtualTable.EXPANSION_COLUMN';
53
+ function isExpansionColumn(column) {
54
+ return column.key === EXPANSION_COLUMN_KEY;
55
+ }
56
+ function getRowKey(rowData, rowKey) {
57
+ return rowData[rowKey];
58
+ }
59
+ function useTableExpandable(ctx, options) {
60
+ const disablePlugin = options == null;
61
+ const {
62
+ rowKey,
63
+ columns: rawColumns,
64
+ dataSource
65
+ } = ctx;
66
+ const {
67
+ // expandedRowKeys,
68
+ // onExpandedRowsChange,
69
+ defaultExpandedRowKeys,
70
+ expandedRowRender,
71
+ columnTitle,
72
+ expandRowByClick = false,
73
+ expandIcon,
74
+ onExpand,
75
+ defaultExpandAllRows = false,
76
+ // TODO: 未实现
77
+ // indentSize: _indentSize,
78
+ showExpandColumn = true,
79
+ expandedRowClassName,
80
+ rowExpandable,
81
+ columnWidth = 50,
82
+ fixed,
83
+ extraColumnProps
84
+ } = options ?? {};
85
+ const _rowExpandableValue = useMemo(() => {
86
+ return dataSource.map(row => {
87
+ if (!rowExpandable) return false;
88
+ return rowExpandable(row);
89
+ });
90
+ }, [dataSource, rowExpandable]);
91
+ // useShallowMemo 每一次渲染时候都会重新求值,这对于某些开销较大的计算不太友好,
92
+ // 所以使用 useMemo 求值再通过 useShallowMemo 浅比较
93
+ // useMemo 标记 deps 后,若 deps 不变也就不需要重新求值
94
+ // 使用 useShallowMemo 主要是为了防止重新求值后结果不变但地址指针变化,导致不必要的渲染
95
+ const rowExpandableRecord = useShallowMemo(() => _rowExpandableValue);
96
+ // 即使 defaultExpandAllRows 变更之后,此插件也不要响应变化,只使用初始值,所以存储一下
97
+ const defaultExpandAll = useRef(
98
+ // options 中有 expandedRowKeys 则表示受控模式,那么 defaultExpandAllRows 不生效
99
+ 'expandedRowKeys' in (options ?? {}) || 'defaultExpandedRowKeys' in (options ?? {}) ? false : defaultExpandAllRows);
100
+ const defaultExpandKey = useShallowMemo(() => {
101
+ if (defaultExpandAll.current) {
102
+ const expandKeys = dataSource.map((record, index) => {
103
+ if (rowExpandableRecord[index]) {
104
+ const key = record[rowKey];
105
+ return key;
106
+ }
107
+ return null;
108
+ });
109
+ return expandKeys.filter(x => x != null);
110
+ }
111
+ return [];
112
+ });
113
+ const expansionKeys = useRef(new Set(defaultExpandedRowKeys ?? defaultExpandKey));
114
+ const [expansion, setExpansion] = useControllableValue(options ?? {}, {
115
+ trigger: 'onExpandedRowsChange',
116
+ valuePropName: 'expandedRowKeys',
117
+ defaultValue: defaultExpandedRowKeys ?? defaultExpandKey
118
+ });
119
+ const onUpdateExpansion = useStableFn((rowData, shouldExpand) => {
120
+ const key = getRowKey(rowData, rowKey);
121
+ expansionKeys.current.add(key);
122
+ if (shouldExpand == null) {
123
+ if (expansion.includes(key)) {
124
+ setExpansion(expansion.filter(x => x !== key));
125
+ onExpand?.(false, rowData);
126
+ } else {
127
+ setExpansion([...expansion, key]);
128
+ onExpand?.(true, rowData);
129
+ }
130
+ } else if (shouldExpand) {
131
+ setExpansion([...expansion, key]);
132
+ onExpand?.(true, rowData);
133
+ } else {
134
+ setExpansion(expansion.filter(x => x !== key));
135
+ onExpand?.(false, rowData);
136
+ }
137
+ });
138
+ const isFixed = isValidFixed(fixed);
139
+ const renderRow = useCallback((children, args) => {
140
+ const {
141
+ rowData,
142
+ rowIndex,
143
+ columnDescriptor
144
+ } = args;
145
+ const isExpandable = rowExpandableRecord[rowIndex];
146
+ if (isExpandable) {
147
+ const key = getRowKey(rowData, rowKey);
148
+ const isExpanded = expansion.includes(key);
149
+ const isRendered = expansionKeys.current.has(key);
150
+ let className = '';
151
+ if (typeof expandedRowClassName === 'string') {
152
+ className = expandedRowClassName;
153
+ } else if (typeof expandedRowClassName === 'function') {
154
+ className = expandedRowClassName(rowData, rowIndex, 0);
155
+ }
156
+ return jsxs(Fragment, {
157
+ children: [children, isRendered && jsx(ExpandRow, {
158
+ className: className,
159
+ rowIndex: rowIndex,
160
+ isExpanded: isExpanded,
161
+ colSpan: columnDescriptor.length,
162
+ fixed: isFixed,
163
+ children: expandedRowRender?.(rowData, rowIndex, 0, isExpanded)
164
+ })]
165
+ });
166
+ }
167
+ return children;
168
+ }, [isFixed, rowExpandableRecord, rowKey, expansion, expandedRowClassName, expandedRowRender]);
169
+ const columns = useMemo(() => {
170
+ if (!showExpandColumn) {
171
+ return rawColumns;
172
+ }
173
+ return [{
174
+ ...extraColumnProps,
175
+ key: EXPANSION_COLUMN_KEY,
176
+ title: columnTitle,
177
+ width: columnWidth,
178
+ fixed,
179
+ render(_value, record, index) {
180
+ const key = record[rowKey];
181
+ const expandable = rowExpandableRecord[index] ?? false;
182
+ const expanded = expansion.includes(key);
183
+ if (typeof expandIcon === 'function') {
184
+ return expandIcon({
185
+ expandable,
186
+ expanded,
187
+ record,
188
+ prefixCls: 'virtual-table',
189
+ onExpand: (rowData, _e) => {
190
+ onUpdateExpansion(rowData);
191
+ }
192
+ });
193
+ }
194
+ if (!expandable) {
195
+ return null;
196
+ }
197
+ return jsx("button", {
198
+ className: clsx('virtual-table-row-expand-icon', expanded ? 'virtual-table-row-expand-icon-expanded' : 'virtual-table-row-expand-icon-collapsed'),
199
+ type: "button",
200
+ "aria-label": expanded ? '关闭行' : '展开行',
201
+ "aria-expanded": expanded,
202
+ onClick: () => {
203
+ onUpdateExpansion(record, !expanded);
204
+ }
205
+ });
206
+ },
207
+ onHeaderCell() {
208
+ return {
209
+ className: 'virtual-table-expand-column'
210
+ };
211
+ }
212
+ }, ...rawColumns];
213
+ }, [showExpandColumn, columnTitle, columnWidth, fixed, rawColumns, rowKey, rowExpandableRecord, expansion, expandIcon, onUpdateExpansion, extraColumnProps]);
214
+ const onRow = useCallback((record, index) => {
215
+ if (rowExpandableRecord[index]) {
216
+ return {
217
+ onClick: e => {
218
+ e.stopPropagation();
219
+ onUpdateExpansion(record);
220
+ }
221
+ };
222
+ }
223
+ return {};
224
+ }, [rowExpandableRecord, onUpdateExpansion]);
225
+ if (disablePlugin) {
226
+ return ctx;
227
+ }
228
+ return {
229
+ ...ctx,
230
+ columns,
231
+ renderRow,
232
+ onRow: !expandRowByClick ? undefined : onRow
233
+ };
234
+ }
235
+ /* eslint max-len: ["error", { "code": 120 }] */
236
+ const tableExpandable = createMiddleware(useTableExpandable);
237
+
238
+ export { EXPANSION_COLUMN_KEY, isExpansionColumn, tableExpandable };
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../packages/virtual-table/src/middleware/expandable/expand-row.tsx","../../../../packages/virtual-table/src/middleware/expandable/index.tsx"],"sourcesContent":["import type { CSSProperties, FC, ReactNode } from 'react'\nimport { useContainerSize, useTableRowManager } from '@are-visual/virtual-table'\nimport clsx from 'clsx'\nimport { useRef } from 'react'\n\nexport interface ExpandRowProps {\n className?: string\n style?: CSSProperties\n rowIndex: number\n isExpanded?: boolean\n colSpan?: number\n children?: ReactNode\n fixed?: boolean\n}\n\nconst ExpandRow: FC<ExpandRowProps> = (props) => {\n const {\n className,\n style,\n rowIndex,\n isExpanded,\n colSpan,\n children,\n fixed,\n } = props\n\n const { getRowHeightList, updateRowHeight } = useTableRowManager()\n const { tableWidth } = useContainerSize()\n\n const currentNodeHeight = useRef(0)\n\n return (\n <tr\n className={clsx('virtual-table-expanded-row', className)}\n style={{ ...style, display: isExpanded ? undefined : 'none' }}\n ref={(node) => {\n if (node == null) return\n\n const originHeight = getRowHeightList()[rowIndex] ?? 0\n if (isExpanded) {\n currentNodeHeight.current = node.offsetHeight\n updateRowHeight(rowIndex, originHeight + currentNodeHeight.current)\n } else {\n // 关闭后,不需要再次更新 RowHeight,否则计算会出错\n }\n }}\n >\n <td colSpan={colSpan}>\n <div\n className={clsx(\n 'virtual-table-cell',\n fixed && 'virtual-table-expanded-row-fixed',\n )}\n style={{ width: tableWidth <= 0 ? undefined : tableWidth }}\n >\n {children}\n </div>\n </td>\n </tr>\n )\n}\n\nexport default ExpandRow\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n AnyObject,\n ColumnExtra,\n ColumnType,\n FixedType,\n MiddlewareContext,\n MiddlewareRenderRow,\n MiddlewareResult,\n OnRowType,\n} from '@are-visual/virtual-table'\nimport type { Key, MouseEvent, ReactNode } from 'react'\nimport { createMiddleware, isValidFixed, useShallowMemo, useStableFn } from '@are-visual/virtual-table'\nimport { useControllableValue } from '@are-visual/virtual-table/middleware/utils/useControllableValue'\nimport clsx from 'clsx'\nimport { useCallback, useMemo, useRef } from 'react'\nimport ExpandRow from './expand-row'\n\ntype TriggerEventHandler<T> = (record: T, event: MouseEvent<HTMLElement>) => void\nexport interface RenderExpandIconProps<T> {\n prefixCls: string\n expanded: boolean\n record: T\n expandable: boolean\n onExpand: TriggerEventHandler<T>\n}\nexport type RowClassName<T> = (record: T, index: number, indent: number) => string\nexport type RenderExpandIcon<T> = (props: RenderExpandIconProps<T>) => ReactNode\nexport type ExpandedRowRender<T> = (record: T, index: number, indent: number, expanded: boolean) => ReactNode\n\nexport interface ExpandableConfig<T> {\n expandedRowKeys?: readonly Key[]\n defaultExpandedRowKeys?: readonly Key[]\n expandedRowRender?: ExpandedRowRender<T>\n columnTitle?: ReactNode\n expandRowByClick?: boolean\n expandIcon?: RenderExpandIcon<T>\n onExpand?: (expanded: boolean, record: T) => void\n onExpandedRowsChange?: (expandedKeys: readonly Key[]) => void\n defaultExpandAllRows?: boolean\n showExpandColumn?: boolean\n expandedRowClassName?: string | RowClassName<T>\n rowExpandable?: (record: T) => boolean\n columnWidth?: number | string\n fixed?: FixedType\n extraColumnProps?: ColumnExtra\n}\n\nexport const EXPANSION_COLUMN_KEY = 'VirtualTable.EXPANSION_COLUMN'\n\nexport function isExpansionColumn<T = any>(column: ColumnType<T>) {\n return column.key === EXPANSION_COLUMN_KEY\n}\n\nfunction getRowKey<T>(rowData: T, rowKey: (string & {}) | keyof T) {\n return (rowData as AnyObject)[rowKey as string] as Key\n}\n\nfunction useTableExpandable<T = any>(\n ctx: MiddlewareContext<T>,\n options?: ExpandableConfig<T>,\n): MiddlewareResult<T> {\n const disablePlugin = options == null\n\n const { rowKey, columns: rawColumns, dataSource } = ctx\n const {\n // expandedRowKeys,\n // onExpandedRowsChange,\n defaultExpandedRowKeys,\n expandedRowRender,\n columnTitle,\n expandRowByClick = false,\n expandIcon,\n onExpand,\n\n defaultExpandAllRows = false,\n\n // TODO: 未实现\n // indentSize: _indentSize,\n\n showExpandColumn = true,\n expandedRowClassName,\n\n rowExpandable,\n columnWidth = 50,\n fixed,\n extraColumnProps,\n } = options ?? {}\n\n const _rowExpandableValue = useMemo(() => {\n return dataSource.map((row) => {\n if (!rowExpandable) return false\n return rowExpandable(row)\n })\n }, [dataSource, rowExpandable])\n\n // useShallowMemo 每一次渲染时候都会重新求值,这对于某些开销较大的计算不太友好,\n // 所以使用 useMemo 求值再通过 useShallowMemo 浅比较\n // useMemo 标记 deps 后,若 deps 不变也就不需要重新求值\n // 使用 useShallowMemo 主要是为了防止重新求值后结果不变但地址指针变化,导致不必要的渲染\n const rowExpandableRecord = useShallowMemo(() => _rowExpandableValue)\n\n // 即使 defaultExpandAllRows 变更之后,此插件也不要响应变化,只使用初始值,所以存储一下\n const defaultExpandAll = useRef(\n // options 中有 expandedRowKeys 则表示受控模式,那么 defaultExpandAllRows 不生效\n 'expandedRowKeys' in (options ?? {}) || 'defaultExpandedRowKeys' in (options ?? {})\n ? false\n : defaultExpandAllRows,\n )\n const defaultExpandKey = useShallowMemo((): readonly Key[] => {\n if (defaultExpandAll.current) {\n const expandKeys = dataSource.map((record, index): Key | null => {\n if (rowExpandableRecord[index]) {\n const key = (record as AnyObject)[rowKey as string] as string | number\n return key\n }\n return null\n })\n return expandKeys.filter((x) => x != null)\n }\n return []\n })\n\n const expansionKeys = useRef(new Set<Key>(defaultExpandedRowKeys ?? defaultExpandKey))\n const [expansion, setExpansion] = useControllableValue<readonly Key[]>(\n options ?? {},\n {\n trigger: 'onExpandedRowsChange',\n valuePropName: 'expandedRowKeys',\n defaultValue: defaultExpandedRowKeys ?? defaultExpandKey,\n },\n )\n\n const onUpdateExpansion = useStableFn((rowData: T, shouldExpand?: boolean) => {\n const key = getRowKey(rowData, rowKey)\n expansionKeys.current.add(key)\n if (shouldExpand == null) {\n if (expansion.includes(key)) {\n setExpansion(expansion.filter((x) => x !== key))\n onExpand?.(false, rowData)\n } else {\n setExpansion([...expansion, key])\n onExpand?.(true, rowData)\n }\n } else if (shouldExpand) {\n setExpansion([...expansion, key])\n onExpand?.(true, rowData)\n } else {\n setExpansion(expansion.filter((x) => x !== key))\n onExpand?.(false, rowData)\n }\n })\n\n const isFixed = isValidFixed(fixed)\n\n const renderRow: MiddlewareRenderRow = useCallback((children, args) => {\n const { rowData, rowIndex, columnDescriptor } = args\n\n const isExpandable = rowExpandableRecord[rowIndex]\n if (isExpandable) {\n const key = getRowKey(rowData as T, rowKey)\n const isExpanded: boolean | undefined = expansion.includes(key)\n const isRendered = expansionKeys.current.has(key)\n\n let className = ''\n if (typeof expandedRowClassName === 'string') {\n className = expandedRowClassName\n } else if (typeof expandedRowClassName === 'function') {\n className = expandedRowClassName(rowData as T, rowIndex, 0)\n }\n\n return (\n <>\n {children}\n {isRendered && (\n <ExpandRow\n className={className}\n rowIndex={rowIndex}\n isExpanded={isExpanded}\n colSpan={columnDescriptor.length}\n fixed={isFixed}\n >\n {expandedRowRender?.(rowData as T, rowIndex, 0, isExpanded)}\n </ExpandRow>\n )}\n </>\n )\n }\n return children\n }, [\n isFixed,\n rowExpandableRecord,\n rowKey,\n expansion,\n expandedRowClassName,\n expandedRowRender,\n ])\n\n const columns = useMemo((): ColumnType<T>[] => {\n if (!showExpandColumn) {\n return rawColumns\n }\n\n return [\n {\n ...extraColumnProps,\n key: EXPANSION_COLUMN_KEY,\n title: columnTitle,\n width: columnWidth,\n fixed,\n render(_value, record, index) {\n const key = (record as AnyObject)[rowKey as string] as string | number\n\n const expandable = rowExpandableRecord[index] ?? false\n const expanded = expansion.includes(key)\n\n if (typeof expandIcon === 'function') {\n return expandIcon({\n expandable,\n expanded,\n record,\n prefixCls: 'virtual-table',\n onExpand: (rowData: T, _e) => {\n onUpdateExpansion(rowData)\n },\n })\n }\n\n if (!expandable) {\n return null\n }\n\n return (\n <button\n className={clsx(\n 'virtual-table-row-expand-icon',\n expanded\n ? 'virtual-table-row-expand-icon-expanded'\n : 'virtual-table-row-expand-icon-collapsed',\n )}\n type=\"button\"\n aria-label={expanded ? '关闭行' : '展开行'}\n aria-expanded={expanded}\n onClick={() => {\n onUpdateExpansion(record, !expanded)\n }}\n />\n )\n },\n onHeaderCell() {\n return { className: 'virtual-table-expand-column' }\n },\n },\n ...rawColumns,\n ]\n }, [\n showExpandColumn,\n columnTitle,\n columnWidth,\n fixed,\n rawColumns,\n rowKey,\n rowExpandableRecord,\n expansion,\n expandIcon,\n onUpdateExpansion,\n extraColumnProps,\n ])\n\n const onRow: OnRowType<T> = useCallback((record, index) => {\n if (rowExpandableRecord[index]) {\n return {\n onClick: (e) => {\n e.stopPropagation()\n onUpdateExpansion(record)\n },\n }\n }\n return {}\n }, [rowExpandableRecord, onUpdateExpansion])\n\n if (disablePlugin) {\n return ctx\n }\n\n return {\n ...ctx,\n columns,\n renderRow,\n onRow: !expandRowByClick ? undefined : onRow,\n }\n}\n\n/* eslint max-len: [\"error\", { \"code\": 120 }] */\nexport const tableExpandable = createMiddleware(useTableExpandable)\n"],"names":["ExpandRow","props","className","style","rowIndex","isExpanded","colSpan","children","fixed","getRowHeightList","updateRowHeight","useTableRowManager","tableWidth","useContainerSize","currentNodeHeight","useRef","_jsx","clsx","display","undefined","ref","node","originHeight","current","offsetHeight","width","EXPANSION_COLUMN_KEY","isExpansionColumn","column","key","getRowKey","rowData","rowKey","useTableExpandable","ctx","options","disablePlugin","columns","rawColumns","dataSource","defaultExpandedRowKeys","expandedRowRender","columnTitle","expandRowByClick","expandIcon","onExpand","defaultExpandAllRows","showExpandColumn","expandedRowClassName","rowExpandable","columnWidth","extraColumnProps","_rowExpandableValue","useMemo","map","row","rowExpandableRecord","useShallowMemo","defaultExpandAll","defaultExpandKey","expandKeys","record","index","filter","x","expansionKeys","Set","expansion","setExpansion","useControllableValue","trigger","valuePropName","defaultValue","onUpdateExpansion","useStableFn","shouldExpand","add","includes","isFixed","isValidFixed","renderRow","useCallback","args","columnDescriptor","isExpandable","isRendered","has","_jsxs","length","title","render","_value","expandable","expanded","prefixCls","_e","type","onClick","onHeaderCell","onRow","e","stopPropagation","tableExpandable","createMiddleware"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ .virtual-table-expanded-row .virtual-table-cell {
2
+ background-color: var(--virtual-table-expanded-row-background, rgba(0, 0, 0, 0.02));
3
+ }
4
+ .virtual-table-expanded-row > td {
5
+ padding: 0;
6
+ }
7
+ .virtual-table-expanded-row-fixed {
8
+ position: sticky;
9
+ left: 0;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .virtual-table-row-expand-icon {
14
+ position: relative;
15
+ display: inline-flex;
16
+ vertical-align: sub;
17
+ border: 1px solid var(--virtual-table-expanded-icon-border-color, #f0f0f0);
18
+ width: var(--virtual-table-expanded-icon-width, 17px);
19
+ height: var(--virtual-table-expanded-icon-height, 17px);
20
+ background-color: var(--virtual-table-expanded-icon-background, #fff);
21
+ border-radius: var(--virtual-table-expanded-icon-radius, 6px);
22
+ cursor: pointer;
23
+ color: var(--virtual-table-expanded-icon-color, rgba(0, 0, 0, 0.88));
24
+ transition: all 0.3s;
25
+ }
26
+ .virtual-table-row-expand-icon::before, .virtual-table-row-expand-icon::after {
27
+ content: "";
28
+ position: absolute;
29
+ background-color: currentColor;
30
+ }
31
+ .virtual-table-row-expand-icon::before {
32
+ top: 7px;
33
+ left: 3px;
34
+ width: 9px;
35
+ height: 1px;
36
+ }
37
+ .virtual-table-row-expand-icon::after {
38
+ top: 3px;
39
+ left: 7px;
40
+ height: 9px;
41
+ width: 1px;
42
+ }
43
+ .virtual-table-row-expand-icon:hover {
44
+ color: var(--virtual-table-expanded-icon-hover-color, #69b1ff);
45
+ border-color: var(--virtual-table-expanded-icon-hover-border-color, currentColor);
46
+ }
47
+ .virtual-table-row-expand-icon-expanded::after {
48
+ background-color: transparent;
49
+ }
@@ -0,0 +1,73 @@
1
+ $virtual-table-expanded-row-background: var(--virtual-table-expanded-row-background, rgba(0, 0, 0, 0.02));
2
+ $virtual-table-expanded-icon-width: var(--virtual-table-expanded-icon-width, 17px);
3
+ $virtual-table-expanded-icon-height: var(--virtual-table-expanded-icon-height, 17px);
4
+ $virtual-table-expanded-icon-background: var(--virtual-table-expanded-icon-background, #fff);
5
+ $virtual-table-expanded-icon-border-color: var(--virtual-table-expanded-icon-border-color, #f0f0f0);
6
+ $virtual-table-expanded-icon-hover-border-color: var(--virtual-table-expanded-icon-hover-border-color, currentColor);
7
+ $virtual-table-expanded-icon-color: var(--virtual-table-expanded-icon-color, rgba(0, 0, 0, 0.88));
8
+ $virtual-table-expanded-icon-hover-color: var(--virtual-table-expanded-icon-hover-color, #69b1ff);
9
+ $virtual-table-expanded-icon-radius: var(--virtual-table-expanded-icon-radius, 6px);
10
+
11
+ .virtual-table-expanded-row {
12
+ .virtual-table-cell {
13
+ background-color: $virtual-table-expanded-row-background;
14
+ }
15
+
16
+ &>td {
17
+ padding: 0;
18
+ }
19
+
20
+ &-fixed {
21
+ position: sticky;
22
+ left: 0;
23
+ overflow: hidden;
24
+ }
25
+ }
26
+
27
+ .virtual-table-row-expand-icon {
28
+ position: relative;
29
+ display: inline-flex;
30
+ vertical-align: sub;
31
+ border: 1px solid $virtual-table-expanded-icon-border-color;
32
+ width: $virtual-table-expanded-icon-width;
33
+ height: $virtual-table-expanded-icon-height;
34
+ background-color: $virtual-table-expanded-icon-background;
35
+ border-radius: $virtual-table-expanded-icon-radius;
36
+ cursor: pointer;
37
+ color: $virtual-table-expanded-icon-color;
38
+ transition: all 0.3s;
39
+
40
+ &::before,
41
+ &::after {
42
+ content: '';
43
+ position: absolute;
44
+ background-color: currentColor;
45
+ }
46
+
47
+ &::before {
48
+ top: 7px;
49
+ left: 3px;
50
+ width: 9px;
51
+ height: 1px;
52
+ }
53
+
54
+ &::after {
55
+ top: 3px;
56
+ left: 7px;
57
+ height: 9px;
58
+ width: 1px;
59
+ }
60
+
61
+ &:hover {
62
+ color: $virtual-table-expanded-icon-hover-color;
63
+ border-color: $virtual-table-expanded-icon-hover-border-color;
64
+ }
65
+
66
+ &-expanded {
67
+ &::after {
68
+ background-color: transparent;
69
+ }
70
+ }
71
+
72
+ &-collapsed {}
73
+ }
@@ -0,0 +1,15 @@
1
+ import * as _are_visual_virtual_table from '@are-visual/virtual-table';
2
+ import { CSSProperties, RefObject } from 'react';
3
+
4
+ interface ScrollBarProps {
5
+ className?: string;
6
+ style?: CSSProperties;
7
+ bottom?: number | string;
8
+ zIndex?: number;
9
+ bodyRef: RefObject<HTMLTableElement>;
10
+ }
11
+
12
+ type HorizontalScrollBarOptions = ScrollBarProps;
13
+ declare const horizontalScrollBar: <T = any>(options?: ScrollBarProps | undefined) => _are_visual_virtual_table.Middleware<T>;
14
+
15
+ export { type HorizontalScrollBarOptions, horizontalScrollBar };
@@ -0,0 +1,90 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useHorizontalScrollContext, onResize, createMiddleware } from '@are-visual/virtual-table';
3
+ import { getScrollbarSize } from '@are-visual/virtual-table/middleware/utils/getScrollbarSize';
4
+ import clsx from 'clsx';
5
+ import { useRef, useEffect, useState } from 'react';
6
+
7
+ const ScrollBar = props => {
8
+ const {
9
+ className,
10
+ style,
11
+ bottom,
12
+ zIndex,
13
+ bodyRef
14
+ } = props;
15
+ const {
16
+ listen,
17
+ notify
18
+ } = useHorizontalScrollContext();
19
+ const wrapperRef = useRef(null);
20
+ useEffect(() => {
21
+ const node = wrapperRef.current;
22
+ if (node == null) return;
23
+ const key = 'virtual-table-sticky-bottom-scroll';
24
+ const onScroll = () => {
25
+ const nextScrollLeft = node.scrollLeft;
26
+ notify(key, nextScrollLeft, node);
27
+ };
28
+ const dispose = listen(key, scrollLeft => {
29
+ node.scrollLeft = scrollLeft;
30
+ });
31
+ node.addEventListener('scroll', onScroll);
32
+ return () => {
33
+ node.removeEventListener('scroll', onScroll);
34
+ dispose();
35
+ };
36
+ }, [listen, notify]);
37
+ const [width, setWidth] = useState(0);
38
+ useEffect(() => {
39
+ const body = bodyRef.current;
40
+ if (body == null) return;
41
+ return onResize(body, _ref => {
42
+ let {
43
+ width
44
+ } = _ref;
45
+ if (width === 0) return;
46
+ setWidth(width);
47
+ });
48
+ }, [bodyRef]);
49
+ const [size] = useState(getScrollbarSize);
50
+ return jsx("div", {
51
+ className: clsx('virtual-table-sticky-scroll', className),
52
+ style: {
53
+ ...style,
54
+ paddingTop: size.height > 0 ? 0 : 12,
55
+ marginTop: size.height > 0 ? 0 : size.height * -1,
56
+ height: size.height,
57
+ bottom,
58
+ zIndex
59
+ },
60
+ ref: wrapperRef,
61
+ children: jsx("div", {
62
+ className: "virtual-table-sticky-scroll-bar",
63
+ style: {
64
+ width
65
+ }
66
+ })
67
+ });
68
+ };
69
+
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ function useHorizontalScrollBar(ctx, options) {
72
+ const {
73
+ bodyRootRef
74
+ } = ctx;
75
+ return {
76
+ ...ctx,
77
+ renderContent(children) {
78
+ return jsxs(Fragment, {
79
+ children: [children, jsx(ScrollBar, {
80
+ bodyRef: bodyRootRef,
81
+ ...options
82
+ })]
83
+ });
84
+ }
85
+ };
86
+ }
87
+ const horizontalScrollBar = createMiddleware(useHorizontalScrollBar);
88
+
89
+ export { horizontalScrollBar };
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../packages/virtual-table/src/middleware/horizontal-scroll-bar/scroll-bar.tsx","../../../../packages/virtual-table/src/middleware/horizontal-scroll-bar/index.tsx"],"sourcesContent":["import type { CSSProperties, FC, RefObject } from 'react'\nimport { onResize, useHorizontalScrollContext } from '@are-visual/virtual-table'\nimport { getScrollbarSize } from '@are-visual/virtual-table/middleware/utils/getScrollbarSize'\nimport clsx from 'clsx'\nimport { useEffect, useRef, useState } from 'react'\n\nexport interface ScrollBarProps {\n className?: string\n style?: CSSProperties\n bottom?: number | string\n zIndex?: number\n bodyRef: RefObject<HTMLTableElement>\n}\n\nconst ScrollBar: FC<ScrollBarProps> = (props) => {\n const { className, style, bottom, zIndex, bodyRef } = props\n const { listen, notify } = useHorizontalScrollContext()\n\n const wrapperRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n const node = wrapperRef.current\n if (node == null) return\n const key = 'virtual-table-sticky-bottom-scroll'\n const onScroll = () => {\n const nextScrollLeft = node.scrollLeft\n notify(key, nextScrollLeft, node)\n }\n const dispose = listen(key, (scrollLeft) => {\n node.scrollLeft = scrollLeft\n })\n node.addEventListener('scroll', onScroll)\n return () => {\n node.removeEventListener('scroll', onScroll)\n dispose()\n }\n }, [listen, notify])\n\n const [width, setWidth] = useState(0)\n useEffect(() => {\n const body = bodyRef.current\n if (body == null) return\n return onResize(body, ({ width }) => {\n if (width === 0) return\n setWidth(width)\n })\n }, [bodyRef])\n\n const [size] = useState(getScrollbarSize)\n\n return (\n <div\n className={clsx('virtual-table-sticky-scroll', className)}\n style={{\n ...style,\n paddingTop: size.height > 0 ? 0 : 12,\n marginTop: size.height > 0 ? 0 : size.height * -1,\n height: size.height,\n bottom,\n zIndex,\n }}\n ref={wrapperRef}\n >\n <div className=\"virtual-table-sticky-scroll-bar\" style={{ width }}></div>\n </div>\n )\n}\n\nexport default ScrollBar\n","import type { MiddlewareContext, MiddlewareResult } from '@are-visual/virtual-table'\nimport type { ScrollBarProps } from './scroll-bar'\nimport { createMiddleware } from '@are-visual/virtual-table'\nimport ScrollBar from './scroll-bar'\n\nexport type HorizontalScrollBarOptions = ScrollBarProps\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useHorizontalScrollBar<T = any>(\n ctx: MiddlewareContext<T>,\n options?: HorizontalScrollBarOptions,\n): MiddlewareResult<T> {\n const { bodyRootRef } = ctx\n\n return {\n ...ctx,\n renderContent(children) {\n return (\n <>\n {children}\n <ScrollBar\n bodyRef={bodyRootRef}\n {...options}\n />\n </>\n )\n },\n }\n}\n\nexport const horizontalScrollBar = createMiddleware(useHorizontalScrollBar)\n"],"names":["ScrollBar","props","className","style","bottom","zIndex","bodyRef","listen","notify","useHorizontalScrollContext","wrapperRef","useRef","useEffect","node","current","key","onScroll","nextScrollLeft","scrollLeft","dispose","addEventListener","removeEventListener","width","setWidth","useState","body","onResize","_ref","size","getScrollbarSize","_jsx","clsx","paddingTop","height","marginTop","ref","children","useHorizontalScrollBar","ctx","options","bodyRootRef","renderContent","_jsxs","_Fragment","horizontalScrollBar","createMiddleware"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ .virtual-table-sticky-scroll {
2
+ overflow: auto;
3
+ position: sticky;
4
+ bottom: 0;
5
+ z-index: 3;
6
+ box-sizing: border-box;
7
+ }
8
+ .virtual-table-sticky-scroll-bar {
9
+ height: 1px;
10
+ visibility: hidden;
11
+ }
@@ -0,0 +1,13 @@
1
+ .virtual-table-sticky-scroll {
2
+ overflow: auto;
3
+ position: sticky;
4
+ bottom: 0;
5
+ z-index: 3;
6
+ box-sizing: border-box;
7
+
8
+ &-bar {
9
+ // 必须有高度才能出现滚动条
10
+ height: 1px;
11
+ visibility: hidden;
12
+ }
13
+ }
@@ -0,0 +1,7 @@
1
+ import * as _are_visual_virtual_table from '@are-visual/virtual-table';
2
+
3
+ declare const tableLoading: <T = any>(options?: {
4
+ loading?: boolean;
5
+ } | undefined) => _are_visual_virtual_table.Middleware<T>;
6
+
7
+ export { tableLoading };