@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.
- package/README.md +548 -0
- package/index.d.ts +311 -0
- package/index.esm.js +1771 -0
- package/index.esm.js.map +1 -0
- package/middleware/column-resize/index.d.ts +19 -0
- package/middleware/column-resize/index.js +130 -0
- package/middleware/column-resize/index.js.map +1 -0
- package/middleware/column-resize/styles.css +8 -0
- package/middleware/column-resize/styles.scss +10 -0
- package/middleware/empty/index.d.ts +10 -0
- package/middleware/empty/index.js +73 -0
- package/middleware/empty/index.js.map +1 -0
- package/middleware/expandable/index.d.ts +37 -0
- package/middleware/expandable/index.js +239 -0
- package/middleware/expandable/index.js.map +1 -0
- package/middleware/expandable/styles.css +49 -0
- package/middleware/expandable/styles.scss +73 -0
- package/middleware/horizontal-scroll-bar/index.d.ts +15 -0
- package/middleware/horizontal-scroll-bar/index.js +90 -0
- package/middleware/horizontal-scroll-bar/index.js.map +1 -0
- package/middleware/horizontal-scroll-bar/styles.css +11 -0
- package/middleware/horizontal-scroll-bar/styles.scss +13 -0
- package/middleware/loading/index.d.ts +7 -0
- package/middleware/loading/index.js +73 -0
- package/middleware/loading/index.js.map +1 -0
- package/middleware/loading/styles.css +17 -0
- package/middleware/loading/styles.scss +27 -0
- package/middleware/selection/index.d.ts +47 -0
- package/middleware/selection/index.js +282 -0
- package/middleware/selection/index.js.map +1 -0
- package/middleware/selection/styles.css +13 -0
- package/middleware/selection/styles.scss +20 -0
- package/middleware/summary/index.d.ts +36 -0
- package/middleware/summary/index.js +203 -0
- package/middleware/summary/index.js.map +1 -0
- package/middleware/summary/styles.css +36 -0
- package/middleware/summary/styles.scss +45 -0
- package/middleware/utils/getScrollbarSize.d.ts +5 -0
- package/middleware/utils/getScrollbarSize.js +15 -0
- package/middleware/utils/getScrollbarSize.js.map +1 -0
- package/middleware/utils/useControllableValue.d.ts +16 -0
- package/middleware/utils/useControllableValue.js +28 -0
- package/middleware/utils/useControllableValue.js.map +1 -0
- package/package.json +34 -0
- package/styles/table.css +142 -0
- 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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"}
|