@fangxinyan/lumina 0.1.5 → 0.2.0
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/dist/{Accordion-GSBY5T5U.css → Accordion-3TQPKNN3.css} +8 -1
- package/dist/Accordion.cjs +2 -2
- package/dist/Accordion.d.cts +12 -0
- package/dist/Accordion.d.ts +12 -0
- package/dist/Accordion.js +1 -1
- package/dist/{Alert-LSKBYDRI.css → Alert-JJ7GB3UU.css} +11 -0
- package/dist/Alert.cjs +2 -2
- package/dist/Alert.d.cts +4 -0
- package/dist/Alert.d.ts +4 -0
- package/dist/Alert.js +1 -1
- package/dist/{Avatar-OXDSG5Q6.css → Avatar-R5A4AFKZ.css} +4 -0
- package/dist/Avatar.cjs +2 -2
- package/dist/Avatar.d.cts +2 -0
- package/dist/Avatar.d.ts +2 -0
- package/dist/Avatar.js +1 -1
- package/dist/{Button-5UI7QXGU.css → Button-SDQD25AG.css} +2 -0
- package/dist/Button.cjs +3 -3
- package/dist/Button.d.cts +2 -0
- package/dist/Button.d.ts +2 -0
- package/dist/Button.js +1 -1
- package/dist/Calendar.cjs +2 -2
- package/dist/Calendar.d.cts +8 -0
- package/dist/Calendar.d.ts +8 -0
- package/dist/Calendar.js +1 -1
- package/dist/{Card-2CHHFD4Y.css → Card-RG7ECXL2.css} +11 -0
- package/dist/Card.cjs +3 -3
- package/dist/Card.d.cts +2 -0
- package/dist/Card.d.ts +2 -0
- package/dist/Card.js +1 -1
- package/dist/{Divider-Z37INS5E.css → Divider-OEE4Q2KS.css} +31 -0
- package/dist/Divider.cjs +2 -2
- package/dist/Divider.d.cts +7 -0
- package/dist/Divider.d.ts +7 -0
- package/dist/Divider.js +1 -1
- package/dist/Drawer-IPGB4CXH.css +101 -0
- package/dist/Drawer.cjs +13 -0
- package/dist/Drawer.cjs.map +1 -0
- package/dist/Drawer.d.cts +45 -0
- package/dist/Drawer.d.ts +45 -0
- package/dist/Drawer.js +4 -0
- package/dist/Drawer.js.map +1 -0
- package/dist/{Empty-VM23UNLQ.css → Empty-NQ72W3D7.css} +22 -0
- package/dist/Empty.cjs +4 -4
- package/dist/Empty.d.cts +42 -2
- package/dist/Empty.d.ts +42 -2
- package/dist/Empty.js +1 -1
- package/dist/Input-33CAH4O6.css +134 -0
- package/dist/Input.cjs +3 -3
- package/dist/Input.d.cts +17 -1
- package/dist/Input.d.ts +17 -1
- package/dist/Input.js +1 -1
- package/dist/Modal-N4YVLEWW.css +72 -0
- package/dist/Modal.cjs +3 -7
- package/dist/Modal.d.cts +37 -8
- package/dist/Modal.d.ts +37 -8
- package/dist/Modal.js +2 -2
- package/dist/{Pagination-6FFOI4NM.css → Pagination-YIRYJUXP.css} +33 -0
- package/dist/Pagination.cjs +5 -2
- package/dist/Pagination.d.cts +14 -0
- package/dist/Pagination.d.ts +14 -0
- package/dist/Pagination.js +4 -1
- package/dist/Select.cjs +3 -3
- package/dist/Select.js +2 -2
- package/dist/{Slider-RE4HZQKF.css → Slider-X4PVA65R.css} +51 -2
- package/dist/Slider.cjs +2 -2
- package/dist/Slider.d.cts +20 -5
- package/dist/Slider.d.ts +20 -5
- package/dist/Slider.js +1 -1
- package/dist/Switch-36KJNDXM.css +92 -0
- package/dist/Switch.cjs +2 -2
- package/dist/Switch.d.cts +4 -0
- package/dist/Switch.d.ts +4 -0
- package/dist/Switch.js +1 -1
- package/dist/Table-ADVN6LXP.css +295 -0
- package/dist/Table.cjs +7 -3
- package/dist/Table.d.cts +103 -7
- package/dist/Table.d.ts +103 -7
- package/dist/Table.js +5 -1
- package/dist/{Tabs-A27TSZOP.css → Tabs-RHK6XAFF.css} +7 -0
- package/dist/Tabs.cjs +3 -3
- package/dist/Tabs.d.cts +2 -0
- package/dist/Tabs.d.ts +2 -0
- package/dist/Tabs.js +1 -1
- package/dist/{Tag-EYOY3UWG.css → Tag-FGDY3W7E.css} +2 -0
- package/dist/Tag.cjs +3 -3
- package/dist/Tag.d.cts +5 -0
- package/dist/Tag.d.ts +5 -0
- package/dist/Tag.js +1 -1
- package/dist/chunk-437LB2V4.js +111 -0
- package/dist/chunk-437LB2V4.js.map +1 -0
- package/dist/chunk-4MR4GVTD.js +73 -0
- package/dist/chunk-4MR4GVTD.js.map +1 -0
- package/dist/{chunk-OXYFB2ZI.js → chunk-4U4OY5RA.js} +11 -5
- package/dist/chunk-4U4OY5RA.js.map +1 -0
- package/dist/chunk-55NTFU7Y.js +476 -0
- package/dist/chunk-55NTFU7Y.js.map +1 -0
- package/dist/{chunk-5EYI27B6.js → chunk-77BVQNAQ.js} +5 -3
- package/dist/chunk-77BVQNAQ.js.map +1 -0
- package/dist/chunk-AEJJGUEN.cjs +127 -0
- package/dist/chunk-AEJJGUEN.cjs.map +1 -0
- package/dist/{chunk-3QWHDCHJ.js → chunk-AJZKESHB.js} +13 -4
- package/dist/chunk-AJZKESHB.js.map +1 -0
- package/dist/{chunk-NZPJ7BUB.cjs → chunk-AXMEZGEG.cjs} +13 -4
- package/dist/chunk-AXMEZGEG.cjs.map +1 -0
- package/dist/{chunk-HTP6UEVR.js → chunk-BBPNQ44M.js} +22 -6
- package/dist/chunk-BBPNQ44M.js.map +1 -0
- package/dist/chunk-CCBHZYE6.cjs +150 -0
- package/dist/chunk-CCBHZYE6.cjs.map +1 -0
- package/dist/{chunk-KGYLUZOU.cjs → chunk-EPFYIR63.cjs} +5 -5
- package/dist/{chunk-KGYLUZOU.cjs.map → chunk-EPFYIR63.cjs.map} +1 -1
- package/dist/chunk-F7HW2PYR.cjs +119 -0
- package/dist/chunk-F7HW2PYR.cjs.map +1 -0
- package/dist/chunk-GIVMKGZN.js +39 -0
- package/dist/chunk-GIVMKGZN.js.map +1 -0
- package/dist/{chunk-FMG3ZPGK.js → chunk-H6FCIJOP.js} +5 -3
- package/dist/chunk-H6FCIJOP.js.map +1 -0
- package/dist/{chunk-ALFDP5WX.cjs → chunk-IDM6JJLP.cjs} +22 -6
- package/dist/chunk-IDM6JJLP.cjs.map +1 -0
- package/dist/chunk-IFERLHCL.cjs +499 -0
- package/dist/chunk-IFERLHCL.cjs.map +1 -0
- package/dist/chunk-IWVKITPN.js +102 -0
- package/dist/chunk-IWVKITPN.js.map +1 -0
- package/dist/{chunk-I2ERCHFV.cjs → chunk-JKLQOB2F.cjs} +11 -5
- package/dist/chunk-JKLQOB2F.cjs.map +1 -0
- package/dist/{chunk-IGHLSNXT.cjs → chunk-K7PVJLW4.cjs} +51 -4
- package/dist/chunk-K7PVJLW4.cjs.map +1 -0
- package/dist/chunk-LDENBYRC.cjs +210 -0
- package/dist/chunk-LDENBYRC.cjs.map +1 -0
- package/dist/chunk-LSLYY5FN.js +125 -0
- package/dist/chunk-LSLYY5FN.js.map +1 -0
- package/dist/chunk-NSUD5B22.js +187 -0
- package/dist/chunk-NSUD5B22.js.map +1 -0
- package/dist/{chunk-AAMYURWQ.cjs → chunk-OPTTHURA.cjs} +5 -3
- package/dist/chunk-OPTTHURA.cjs.map +1 -0
- package/dist/{chunk-F3NHM4GX.js → chunk-OYGFMXAA.js} +13 -4
- package/dist/chunk-OYGFMXAA.js.map +1 -0
- package/dist/chunk-PBBHUUXU.cjs +133 -0
- package/dist/chunk-PBBHUUXU.cjs.map +1 -0
- package/dist/chunk-RDLPX7RK.cjs +95 -0
- package/dist/chunk-RDLPX7RK.cjs.map +1 -0
- package/dist/{chunk-XFRP2MBR.js → chunk-TYQ5CN2C.js} +51 -4
- package/dist/chunk-TYQ5CN2C.js.map +1 -0
- package/dist/{chunk-7CKHWCEA.cjs → chunk-TZSWDH5T.cjs} +5 -3
- package/dist/chunk-TZSWDH5T.cjs.map +1 -0
- package/dist/{chunk-VMHNKD3N.cjs → chunk-URF6RBW6.cjs} +13 -4
- package/dist/chunk-URF6RBW6.cjs.map +1 -0
- package/dist/{chunk-G3UWXSNQ.js → chunk-V34OPWKZ.js} +5 -4
- package/dist/chunk-V34OPWKZ.js.map +1 -0
- package/dist/{chunk-ITGCHU3Y.cjs → chunk-VICGQC6G.cjs} +5 -4
- package/dist/chunk-VICGQC6G.cjs.map +1 -0
- package/dist/chunk-YEOARJKR.cjs +40 -0
- package/dist/chunk-YEOARJKR.cjs.map +1 -0
- package/dist/chunk-Z5X5AMLA.cjs +41 -0
- package/dist/chunk-Z5X5AMLA.cjs.map +1 -0
- package/dist/chunk-Z7P6QGMT.js +115 -0
- package/dist/chunk-Z7P6QGMT.js.map +1 -0
- package/dist/{chunk-OYH6A7IQ.js → chunk-ZVCMXDTP.js} +3 -3
- package/dist/{chunk-OYH6A7IQ.js.map → chunk-ZVCMXDTP.js.map} +1 -1
- package/dist/chunk-ZWP4LSS3.js +38 -0
- package/dist/chunk-ZWP4LSS3.js.map +1 -0
- package/dist/index.cjs +57 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/index.js +19 -18
- package/dist/index.js.map +1 -1
- package/dist/styles.css +566 -50
- package/package.json +1 -1
- package/dist/Input-Z526ARZP.css +0 -66
- package/dist/Modal-AYKNIWWQ.css +0 -79
- package/dist/Switch-NP7KKJOX.css +0 -44
- package/dist/Table-ZDPGWLH3.css +0 -139
- package/dist/chunk-2VA2HSL4.cjs +0 -121
- package/dist/chunk-2VA2HSL4.cjs.map +0 -1
- package/dist/chunk-2W2AJUZW.js +0 -118
- package/dist/chunk-2W2AJUZW.js.map +0 -1
- package/dist/chunk-3QWHDCHJ.js.map +0 -1
- package/dist/chunk-4AA22BOG.js +0 -63
- package/dist/chunk-4AA22BOG.js.map +0 -1
- package/dist/chunk-5EYI27B6.js.map +0 -1
- package/dist/chunk-77NP67ML.cjs +0 -70
- package/dist/chunk-77NP67ML.cjs.map +0 -1
- package/dist/chunk-7CKHWCEA.cjs.map +0 -1
- package/dist/chunk-7NM5BRUX.js +0 -91
- package/dist/chunk-7NM5BRUX.js.map +0 -1
- package/dist/chunk-7UJI437T.js +0 -49
- package/dist/chunk-7UJI437T.js.map +0 -1
- package/dist/chunk-AAMYURWQ.cjs.map +0 -1
- package/dist/chunk-ALFDP5WX.cjs.map +0 -1
- package/dist/chunk-F3NHM4GX.js.map +0 -1
- package/dist/chunk-FMG3ZPGK.js.map +0 -1
- package/dist/chunk-G3UWXSNQ.js.map +0 -1
- package/dist/chunk-HTP6UEVR.js.map +0 -1
- package/dist/chunk-I2ERCHFV.cjs.map +0 -1
- package/dist/chunk-IBZAGURN.cjs +0 -71
- package/dist/chunk-IBZAGURN.cjs.map +0 -1
- package/dist/chunk-IGHLSNXT.cjs.map +0 -1
- package/dist/chunk-ITGCHU3Y.cjs.map +0 -1
- package/dist/chunk-JNFCTYJT.cjs +0 -31
- package/dist/chunk-JNFCTYJT.cjs.map +0 -1
- package/dist/chunk-JWFVSBVX.cjs +0 -30
- package/dist/chunk-JWFVSBVX.cjs.map +0 -1
- package/dist/chunk-K67KIKX4.cjs +0 -67
- package/dist/chunk-K67KIKX4.cjs.map +0 -1
- package/dist/chunk-KF4MCHZL.cjs +0 -105
- package/dist/chunk-KF4MCHZL.cjs.map +0 -1
- package/dist/chunk-M6OTFXZA.js +0 -48
- package/dist/chunk-M6OTFXZA.js.map +0 -1
- package/dist/chunk-NWJW5KLN.js +0 -29
- package/dist/chunk-NWJW5KLN.js.map +0 -1
- package/dist/chunk-NZPJ7BUB.cjs.map +0 -1
- package/dist/chunk-OXYFB2ZI.js.map +0 -1
- package/dist/chunk-Q33V7MSK.js +0 -79
- package/dist/chunk-Q33V7MSK.js.map +0 -1
- package/dist/chunk-QT7SJITQ.cjs +0 -114
- package/dist/chunk-QT7SJITQ.cjs.map +0 -1
- package/dist/chunk-VMHNKD3N.cjs.map +0 -1
- package/dist/chunk-VXITDXLW.js +0 -28
- package/dist/chunk-VXITDXLW.js.map +0 -1
- package/dist/chunk-XFRP2MBR.js.map +0 -1
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkK7PVJLW4_cjs = require('./chunk-K7PVJLW4.cjs');
|
|
4
|
+
var chunkC5TGQ7CV_cjs = require('./chunk-C5TGQ7CV.cjs');
|
|
5
|
+
var chunkRZ2E3XEU_cjs = require('./chunk-RZ2E3XEU.cjs');
|
|
6
|
+
var chunkYVO7XO4W_cjs = require('./chunk-YVO7XO4W.cjs');
|
|
7
|
+
require('./tokens-HWQ7KWPG.css');
|
|
8
|
+
require('./shared-NJHRNLRH.css');
|
|
9
|
+
require('./Table-ADVN6LXP.css');
|
|
10
|
+
var React = require('react');
|
|
11
|
+
var reactDom = require('react-dom');
|
|
12
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
13
|
+
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
Object.keys(e).forEach(function (k) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return e[k]; }
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
n.default = e;
|
|
29
|
+
return Object.freeze(n);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
33
|
+
|
|
34
|
+
function Table({
|
|
35
|
+
columns,
|
|
36
|
+
data,
|
|
37
|
+
rowKey,
|
|
38
|
+
variant,
|
|
39
|
+
hoverable = true,
|
|
40
|
+
striped,
|
|
41
|
+
sortKey,
|
|
42
|
+
sortDir = "asc",
|
|
43
|
+
onSort,
|
|
44
|
+
rowSelection,
|
|
45
|
+
selectable,
|
|
46
|
+
selected = [],
|
|
47
|
+
onSelect,
|
|
48
|
+
expandable,
|
|
49
|
+
pagination,
|
|
50
|
+
scroll,
|
|
51
|
+
onRowClick,
|
|
52
|
+
empty = "\u6682\u65E0\u6570\u636E",
|
|
53
|
+
className = ""
|
|
54
|
+
}) {
|
|
55
|
+
const keyOf = React__namespace.useCallback(
|
|
56
|
+
(row, i) => {
|
|
57
|
+
if (typeof rowKey === "function") return rowKey(row);
|
|
58
|
+
if (rowKey) return row[rowKey];
|
|
59
|
+
return i;
|
|
60
|
+
},
|
|
61
|
+
[rowKey]
|
|
62
|
+
);
|
|
63
|
+
const selectionMode = rowSelection ? "new" : selectable ? "legacy" : "off";
|
|
64
|
+
const selectionType = rowSelection?.type ?? "checkbox";
|
|
65
|
+
const [innerSel, setInnerSel] = React__namespace.useState(
|
|
66
|
+
rowSelection?.defaultSelectedRowKeys ?? []
|
|
67
|
+
);
|
|
68
|
+
const selControlledNew = rowSelection?.selectedRowKeys !== void 0;
|
|
69
|
+
const selectedKeys = selectionMode === "new" ? selControlledNew ? rowSelection.selectedRowKeys : innerSel : selectionMode === "legacy" ? selected : [];
|
|
70
|
+
const commitSelected = (next, rows) => {
|
|
71
|
+
if (selectionMode === "new") {
|
|
72
|
+
if (!selControlledNew) setInnerSel(next);
|
|
73
|
+
rowSelection.onChange?.(next, rows);
|
|
74
|
+
} else if (selectionMode === "legacy") {
|
|
75
|
+
onSelect?.(next);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const [innerFilters, setInnerFilters] = React__namespace.useState(
|
|
79
|
+
() => {
|
|
80
|
+
const out = {};
|
|
81
|
+
for (const c of columns) {
|
|
82
|
+
if (c.defaultFilteredValue && c.defaultFilteredValue.length) {
|
|
83
|
+
out[c.key] = c.defaultFilteredValue;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
const activeFilters = React__namespace.useMemo(() => {
|
|
90
|
+
const out = {};
|
|
91
|
+
for (const c of columns) {
|
|
92
|
+
if (!c.filters?.length) continue;
|
|
93
|
+
if (c.filteredValue !== void 0) {
|
|
94
|
+
if (c.filteredValue.length) out[c.key] = c.filteredValue;
|
|
95
|
+
} else if (innerFilters[c.key]?.length) {
|
|
96
|
+
out[c.key] = innerFilters[c.key];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}, [columns, innerFilters]);
|
|
101
|
+
const setColumnFilter = (col, values) => {
|
|
102
|
+
if (col.filteredValue !== void 0) return;
|
|
103
|
+
setInnerFilters((prev) => {
|
|
104
|
+
const next = { ...prev };
|
|
105
|
+
if (values.length === 0) delete next[col.key];
|
|
106
|
+
else next[col.key] = values;
|
|
107
|
+
return next;
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
const filteredData = React__namespace.useMemo(() => {
|
|
111
|
+
const entries = Object.entries(activeFilters);
|
|
112
|
+
if (entries.length === 0) return data;
|
|
113
|
+
return data.filter((row) => {
|
|
114
|
+
for (const [colKey, vals] of entries) {
|
|
115
|
+
const col = columns.find((c) => c.key === colKey);
|
|
116
|
+
if (!col) continue;
|
|
117
|
+
const match = vals.some((v2) => {
|
|
118
|
+
if (col.onFilter) return col.onFilter(v2, row);
|
|
119
|
+
if (col.dataIndex != null) {
|
|
120
|
+
const cell = row[col.dataIndex];
|
|
121
|
+
return cell === v2 || String(cell) === String(v2);
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
});
|
|
125
|
+
if (!match) return false;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
});
|
|
129
|
+
}, [data, columns, activeFilters]);
|
|
130
|
+
const pagEnabled = pagination !== false && pagination !== void 0;
|
|
131
|
+
const pagCfg = pagEnabled ? pagination : {};
|
|
132
|
+
const [innerPage, setInnerPage] = React__namespace.useState(
|
|
133
|
+
pagCfg.defaultCurrent ?? 1
|
|
134
|
+
);
|
|
135
|
+
const [innerPageSize, setInnerPageSize] = React__namespace.useState(
|
|
136
|
+
pagCfg.defaultPageSize ?? pagCfg.pageSize ?? 10
|
|
137
|
+
);
|
|
138
|
+
const pageControlled = pagCfg.current !== void 0;
|
|
139
|
+
const curPage = pageControlled ? pagCfg.current : innerPage;
|
|
140
|
+
const curPageSize = pagCfg.pageSize ?? innerPageSize;
|
|
141
|
+
const totalCount = pagCfg.total ?? filteredData.length;
|
|
142
|
+
React__namespace.useEffect(() => {
|
|
143
|
+
if (pagCfg.pageSize !== void 0 && pagCfg.pageSize !== innerPageSize) {
|
|
144
|
+
setInnerPageSize(pagCfg.pageSize);
|
|
145
|
+
}
|
|
146
|
+
}, [pagCfg.pageSize]);
|
|
147
|
+
React__namespace.useEffect(() => {
|
|
148
|
+
if (!pagEnabled) return;
|
|
149
|
+
const pages = Math.max(1, Math.ceil(filteredData.length / curPageSize));
|
|
150
|
+
if (!pageControlled && curPage > pages) setInnerPage(pages);
|
|
151
|
+
}, [filteredData.length, curPageSize, pagEnabled]);
|
|
152
|
+
const pagedData = React__namespace.useMemo(() => {
|
|
153
|
+
if (!pagEnabled) return filteredData;
|
|
154
|
+
if (pagCfg.total !== void 0 && pageControlled) {
|
|
155
|
+
return filteredData;
|
|
156
|
+
}
|
|
157
|
+
const start = (curPage - 1) * curPageSize;
|
|
158
|
+
return filteredData.slice(start, start + curPageSize);
|
|
159
|
+
}, [pagEnabled, filteredData, curPage, curPageSize, pagCfg.total, pageControlled]);
|
|
160
|
+
const onPageChange = (p) => {
|
|
161
|
+
if (!pageControlled) setInnerPage(p);
|
|
162
|
+
pagCfg.onChange?.(p, curPageSize);
|
|
163
|
+
};
|
|
164
|
+
const [innerExpanded, setInnerExpanded] = React__namespace.useState(
|
|
165
|
+
expandable?.defaultExpandedRowKeys ?? []
|
|
166
|
+
);
|
|
167
|
+
const expandControlled = expandable?.expandedRowKeys !== void 0;
|
|
168
|
+
const expandedKeys = expandControlled ? expandable.expandedRowKeys : innerExpanded;
|
|
169
|
+
const hasExpandable = !!expandable?.expandedRowRender;
|
|
170
|
+
const toggleExpand = (row, k) => {
|
|
171
|
+
const isOpen = expandedKeys.includes(k);
|
|
172
|
+
const next = isOpen ? expandedKeys.filter((x) => x !== k) : [...expandedKeys, k];
|
|
173
|
+
if (!expandControlled) setInnerExpanded(next);
|
|
174
|
+
expandable?.onExpand?.(!isOpen, row);
|
|
175
|
+
};
|
|
176
|
+
const v = variant ?? (striped ? "striped" : "default");
|
|
177
|
+
const rowsToRender = pagedData;
|
|
178
|
+
const selectableKeysOnPage = rowsToRender.map((r, i) => ({ row: r, k: keyOf(r, i) })).filter(({ row }) => {
|
|
179
|
+
if (selectionMode !== "new") return true;
|
|
180
|
+
const props = rowSelection?.getCheckboxProps?.(row);
|
|
181
|
+
return !props?.disabled;
|
|
182
|
+
});
|
|
183
|
+
const allSelectedOnPage = selectionMode !== "off" && selectableKeysOnPage.length > 0 && selectableKeysOnPage.every(({ k }) => selectedKeys.includes(k));
|
|
184
|
+
const someSelectedOnPage = selectionMode !== "off" && selectableKeysOnPage.some(({ k }) => selectedKeys.includes(k)) && !allSelectedOnPage;
|
|
185
|
+
const toggleRow = (row, k) => {
|
|
186
|
+
if (selectionMode === "new") {
|
|
187
|
+
const props = rowSelection?.getCheckboxProps?.(row);
|
|
188
|
+
if (props?.disabled) return;
|
|
189
|
+
let next;
|
|
190
|
+
if (selectionType === "radio") {
|
|
191
|
+
next = [k];
|
|
192
|
+
} else {
|
|
193
|
+
next = selectedKeys.includes(k) ? selectedKeys.filter((x) => x !== k) : [...selectedKeys, k];
|
|
194
|
+
}
|
|
195
|
+
const nextRows = data.filter((r, i) => next.includes(keyOf(r, i)));
|
|
196
|
+
commitSelected(next, nextRows);
|
|
197
|
+
} else if (selectionMode === "legacy") {
|
|
198
|
+
const next = selectedKeys.includes(k) ? selectedKeys.filter((x) => x !== k) : [...selectedKeys, k];
|
|
199
|
+
commitSelected(next, []);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
const toggleAll = () => {
|
|
203
|
+
if (selectionMode === "off") return;
|
|
204
|
+
if (selectionType === "radio") return;
|
|
205
|
+
if (allSelectedOnPage) {
|
|
206
|
+
const pageKeys = new Set(selectableKeysOnPage.map(({ k }) => k));
|
|
207
|
+
const next = selectedKeys.filter((k) => !pageKeys.has(k));
|
|
208
|
+
const nextRows = data.filter((r, i) => next.includes(keyOf(r, i)));
|
|
209
|
+
commitSelected(next, nextRows);
|
|
210
|
+
} else {
|
|
211
|
+
const set = new Set(selectedKeys);
|
|
212
|
+
selectableKeysOnPage.forEach(({ k }) => set.add(k));
|
|
213
|
+
const next = Array.from(set);
|
|
214
|
+
const nextRows = data.filter((r, i) => next.includes(keyOf(r, i)));
|
|
215
|
+
commitSelected(next, nextRows);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const showSelCol = selectionMode !== "off";
|
|
219
|
+
const showExpandCol = hasExpandable;
|
|
220
|
+
const extraColCount = (showSelCol ? 1 : 0) + (showExpandCol ? 1 : 0);
|
|
221
|
+
const totalColCount = columns.length + extraColCount;
|
|
222
|
+
const wrapStyle = {};
|
|
223
|
+
const innerTableStyle = {};
|
|
224
|
+
let wrapClass = "table-wrap";
|
|
225
|
+
if (scroll?.y != null) {
|
|
226
|
+
wrapStyle.maxHeight = scroll.y;
|
|
227
|
+
wrapStyle.overflowY = "auto";
|
|
228
|
+
wrapClass += " scroll-y";
|
|
229
|
+
}
|
|
230
|
+
if (scroll?.x != null) {
|
|
231
|
+
wrapStyle.overflowX = "auto";
|
|
232
|
+
innerTableStyle.minWidth = scroll.x;
|
|
233
|
+
wrapClass += " scroll-x";
|
|
234
|
+
}
|
|
235
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${wrapClass} ${className}`, style: wrapStyle, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
237
|
+
"table",
|
|
238
|
+
{
|
|
239
|
+
className: `table ${v} ${hoverable ? "hoverable" : ""} ${scroll?.y != null ? "sticky-head" : ""}`,
|
|
240
|
+
style: innerTableStyle,
|
|
241
|
+
children: [
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
|
|
243
|
+
showExpandCol && /* @__PURE__ */ jsxRuntime.jsx("th", { className: "row-expand", style: { width: 40 } }),
|
|
244
|
+
showSelCol && /* @__PURE__ */ jsxRuntime.jsx("th", { className: "row-check", style: { width: 44 }, children: selectionType === "checkbox" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
245
|
+
chunkC5TGQ7CV_cjs.Checkbox,
|
|
246
|
+
{
|
|
247
|
+
checked: allSelectedOnPage,
|
|
248
|
+
indeterminate: someSelectedOnPage,
|
|
249
|
+
onChange: toggleAll
|
|
250
|
+
}
|
|
251
|
+
) }),
|
|
252
|
+
columns.map((c) => {
|
|
253
|
+
const sorted = sortKey === c.key;
|
|
254
|
+
const hasFilters = !!c.filters?.length;
|
|
255
|
+
const filterActive = !!activeFilters[c.key]?.length;
|
|
256
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
257
|
+
"th",
|
|
258
|
+
{
|
|
259
|
+
className: `${c.sortable ? "sortable" : ""} ${sorted ? "sorted" : ""} ${hasFilters ? "filterable" : ""}`,
|
|
260
|
+
style: { width: c.width, textAlign: c.align ?? "left" },
|
|
261
|
+
onClick: () => c.sortable && onSort?.(c.key),
|
|
262
|
+
children: [
|
|
263
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "th-label", children: c.title }),
|
|
264
|
+
c.sortable && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sort-ind", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
265
|
+
chunkYVO7XO4W_cjs.Icon,
|
|
266
|
+
{
|
|
267
|
+
name: sorted ? sortDir === "asc" ? "chevUp" : "chevDown" : "chevDown",
|
|
268
|
+
size: 10
|
|
269
|
+
}
|
|
270
|
+
) }),
|
|
271
|
+
hasFilters && /* @__PURE__ */ jsxRuntime.jsx(
|
|
272
|
+
ColumnFilterButton,
|
|
273
|
+
{
|
|
274
|
+
column: c,
|
|
275
|
+
activeValues: activeFilters[c.key] ?? [],
|
|
276
|
+
onApply: (values) => setColumnFilter(c, values),
|
|
277
|
+
active: filterActive
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
]
|
|
281
|
+
},
|
|
282
|
+
c.key
|
|
283
|
+
);
|
|
284
|
+
})
|
|
285
|
+
] }) }),
|
|
286
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rowsToRender.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColCount, className: "table-empty", children: empty }) }) : rowsToRender.map((row, i) => {
|
|
287
|
+
const k = keyOf(row, i);
|
|
288
|
+
const isSel = selectedKeys.includes(k);
|
|
289
|
+
const selProps = rowSelection?.getCheckboxProps?.(row);
|
|
290
|
+
const canExpand = hasExpandable && (expandable?.rowExpandable?.(row) ?? true);
|
|
291
|
+
const isExpanded = canExpand && expandedKeys.includes(k);
|
|
292
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
|
293
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
294
|
+
"tr",
|
|
295
|
+
{
|
|
296
|
+
className: `${onRowClick ? "clickable" : ""} ${isSel ? "selected" : ""}`,
|
|
297
|
+
onClick: onRowClick ? () => onRowClick(row, i) : void 0,
|
|
298
|
+
children: [
|
|
299
|
+
showExpandCol && /* @__PURE__ */ jsxRuntime.jsx(
|
|
300
|
+
"td",
|
|
301
|
+
{
|
|
302
|
+
className: "row-expand",
|
|
303
|
+
onClick: (e) => {
|
|
304
|
+
e.stopPropagation();
|
|
305
|
+
if (canExpand) toggleExpand(row, k);
|
|
306
|
+
},
|
|
307
|
+
children: canExpand && /* @__PURE__ */ jsxRuntime.jsx(
|
|
308
|
+
"button",
|
|
309
|
+
{
|
|
310
|
+
type: "button",
|
|
311
|
+
className: `expand-btn ${isExpanded ? "open" : ""}`,
|
|
312
|
+
"aria-expanded": isExpanded,
|
|
313
|
+
"aria-label": isExpanded ? "Collapse row" : "Expand row",
|
|
314
|
+
onClick: (e) => {
|
|
315
|
+
e.stopPropagation();
|
|
316
|
+
toggleExpand(row, k);
|
|
317
|
+
},
|
|
318
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkYVO7XO4W_cjs.Icon, { name: "chevRight", size: 12 })
|
|
319
|
+
}
|
|
320
|
+
)
|
|
321
|
+
}
|
|
322
|
+
),
|
|
323
|
+
showSelCol && /* @__PURE__ */ jsxRuntime.jsx(
|
|
324
|
+
"td",
|
|
325
|
+
{
|
|
326
|
+
className: "row-check",
|
|
327
|
+
onClick: (e) => {
|
|
328
|
+
e.stopPropagation();
|
|
329
|
+
toggleRow(row, k);
|
|
330
|
+
},
|
|
331
|
+
children: selectionType === "radio" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
332
|
+
"button",
|
|
333
|
+
{
|
|
334
|
+
type: "button",
|
|
335
|
+
role: "radio",
|
|
336
|
+
"aria-checked": isSel,
|
|
337
|
+
disabled: selProps?.disabled,
|
|
338
|
+
className: `radio-dot ${isSel ? "checked" : ""}`,
|
|
339
|
+
onClick: (e) => {
|
|
340
|
+
e.stopPropagation();
|
|
341
|
+
toggleRow(row, k);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
345
|
+
chunkC5TGQ7CV_cjs.Checkbox,
|
|
346
|
+
{
|
|
347
|
+
checked: isSel,
|
|
348
|
+
disabled: selProps?.disabled,
|
|
349
|
+
onChange: () => toggleRow(row, k)
|
|
350
|
+
}
|
|
351
|
+
)
|
|
352
|
+
}
|
|
353
|
+
),
|
|
354
|
+
columns.map((c) => {
|
|
355
|
+
const val = c.dataIndex ? row[c.dataIndex] : void 0;
|
|
356
|
+
return /* @__PURE__ */ jsxRuntime.jsx("td", { style: { textAlign: c.align ?? "left" }, children: c.render ? c.render(val, row, i) : val }, c.key);
|
|
357
|
+
})
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
),
|
|
361
|
+
isExpanded && expandable?.expandedRowRender && /* @__PURE__ */ jsxRuntime.jsx("tr", { className: "expanded-row", children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColCount, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "expanded-panel", children: expandable.expandedRowRender(row, i) }) }) })
|
|
362
|
+
] }, k);
|
|
363
|
+
}) })
|
|
364
|
+
]
|
|
365
|
+
}
|
|
366
|
+
) }),
|
|
367
|
+
pagEnabled && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-pagination", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
368
|
+
chunkK7PVJLW4_cjs.Pagination,
|
|
369
|
+
{
|
|
370
|
+
total: totalCount,
|
|
371
|
+
pageSize: curPageSize,
|
|
372
|
+
page: curPage,
|
|
373
|
+
onChange: onPageChange
|
|
374
|
+
}
|
|
375
|
+
) })
|
|
376
|
+
] });
|
|
377
|
+
}
|
|
378
|
+
function ColumnFilterButton({
|
|
379
|
+
column,
|
|
380
|
+
activeValues,
|
|
381
|
+
onApply,
|
|
382
|
+
active
|
|
383
|
+
}) {
|
|
384
|
+
const [open, setOpen] = React__namespace.useState(false);
|
|
385
|
+
const [draft, setDraft] = React__namespace.useState(activeValues);
|
|
386
|
+
const panelRef = React__namespace.useRef(null);
|
|
387
|
+
const { triggerRef, floatingStyle } = chunkRZ2E3XEU_cjs.useFloating({
|
|
388
|
+
open,
|
|
389
|
+
placement: "bottom",
|
|
390
|
+
panelWidth: 200,
|
|
391
|
+
panelHeight: Math.min(260, (column.filters?.length ?? 0) * 32 + 80),
|
|
392
|
+
alignCross: "end"
|
|
393
|
+
});
|
|
394
|
+
React__namespace.useEffect(() => {
|
|
395
|
+
if (open) setDraft(activeValues);
|
|
396
|
+
}, [open, activeValues]);
|
|
397
|
+
React__namespace.useEffect(() => {
|
|
398
|
+
if (!open) return;
|
|
399
|
+
const h = (e) => {
|
|
400
|
+
const t = e.target;
|
|
401
|
+
if (triggerRef.current?.contains(t)) return;
|
|
402
|
+
if (panelRef.current?.contains(t)) return;
|
|
403
|
+
setOpen(false);
|
|
404
|
+
};
|
|
405
|
+
document.addEventListener("mousedown", h);
|
|
406
|
+
return () => document.removeEventListener("mousedown", h);
|
|
407
|
+
}, [open]);
|
|
408
|
+
const toggle = (v) => setDraft((d) => d.includes(v) ? d.filter((x) => x !== v) : [...d, v]);
|
|
409
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
410
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
411
|
+
"button",
|
|
412
|
+
{
|
|
413
|
+
ref: triggerRef,
|
|
414
|
+
type: "button",
|
|
415
|
+
className: `filter-ind ${active ? "active" : ""}`,
|
|
416
|
+
"aria-label": "Filter column",
|
|
417
|
+
onClick: (e) => {
|
|
418
|
+
e.stopPropagation();
|
|
419
|
+
setOpen((o) => !o);
|
|
420
|
+
},
|
|
421
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkYVO7XO4W_cjs.Icon, { name: "filter", size: 10 })
|
|
422
|
+
}
|
|
423
|
+
),
|
|
424
|
+
open && typeof document !== "undefined" && reactDom.createPortal(
|
|
425
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
426
|
+
"div",
|
|
427
|
+
{
|
|
428
|
+
ref: panelRef,
|
|
429
|
+
className: "table-filter-panel",
|
|
430
|
+
style: floatingStyle,
|
|
431
|
+
onClick: (e) => e.stopPropagation(),
|
|
432
|
+
children: [
|
|
433
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-filter-options", children: (column.filters ?? []).map((f) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "table-filter-item", children: [
|
|
434
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
435
|
+
chunkC5TGQ7CV_cjs.Checkbox,
|
|
436
|
+
{
|
|
437
|
+
checked: draft.includes(f.value),
|
|
438
|
+
onChange: () => toggle(f.value)
|
|
439
|
+
}
|
|
440
|
+
),
|
|
441
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: f.text })
|
|
442
|
+
] }, String(f.value))) }),
|
|
443
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "table-filter-actions", children: [
|
|
444
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
445
|
+
"button",
|
|
446
|
+
{
|
|
447
|
+
type: "button",
|
|
448
|
+
className: "tf-btn ghost",
|
|
449
|
+
onClick: () => {
|
|
450
|
+
setDraft([]);
|
|
451
|
+
onApply([]);
|
|
452
|
+
setOpen(false);
|
|
453
|
+
},
|
|
454
|
+
children: "\u91CD\u7F6E"
|
|
455
|
+
}
|
|
456
|
+
),
|
|
457
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
458
|
+
"button",
|
|
459
|
+
{
|
|
460
|
+
type: "button",
|
|
461
|
+
className: "tf-btn primary",
|
|
462
|
+
onClick: () => {
|
|
463
|
+
onApply(draft);
|
|
464
|
+
setOpen(false);
|
|
465
|
+
},
|
|
466
|
+
children: "\u786E\u5B9A"
|
|
467
|
+
}
|
|
468
|
+
)
|
|
469
|
+
] })
|
|
470
|
+
]
|
|
471
|
+
}
|
|
472
|
+
),
|
|
473
|
+
document.body
|
|
474
|
+
)
|
|
475
|
+
] });
|
|
476
|
+
}
|
|
477
|
+
function TablePro({
|
|
478
|
+
toolbar,
|
|
479
|
+
actions,
|
|
480
|
+
footer,
|
|
481
|
+
title,
|
|
482
|
+
className = "",
|
|
483
|
+
...tableProps
|
|
484
|
+
}) {
|
|
485
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `table-card ${className}`, children: [
|
|
486
|
+
(title || toolbar || actions) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "table-toolbar", children: [
|
|
487
|
+
title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-title", children: title }),
|
|
488
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-toolbar-main", children: toolbar }),
|
|
489
|
+
actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-toolbar-actions", children: actions })
|
|
490
|
+
] }),
|
|
491
|
+
/* @__PURE__ */ jsxRuntime.jsx(Table, { ...tableProps, className: "joined" }),
|
|
492
|
+
footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "table-footer", children: footer })
|
|
493
|
+
] });
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
exports.Table = Table;
|
|
497
|
+
exports.TablePro = TablePro;
|
|
498
|
+
//# sourceMappingURL=chunk-IFERLHCL.cjs.map
|
|
499
|
+
//# sourceMappingURL=chunk-IFERLHCL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Table/Table.tsx"],"names":["React","v","jsxs","Fragment","jsx","Checkbox","Icon","Pagination","useFloating","createPortal"],"mappings":"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","file":"chunk-IFERLHCL.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Table.css\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Icon } from \"../Icon\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Pagination } from \"../Pagination\";\nimport { useFloating } from \"../../utils/useFloating\";\n\nexport type RowKey = string | number;\n\nexport interface TableColumnFilterItem {\n text: React.ReactNode;\n value: string | number;\n}\n\nexport interface TableColumn<Row = any> {\n key: string;\n title: React.ReactNode;\n /** Data key to read from row, or custom render. */\n dataIndex?: keyof Row;\n render?: (value: any, row: Row, index: number) => React.ReactNode;\n width?: number | string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n /** Filter options shown in header dropdown. Requires `onFilter` (or data index match). */\n filters?: TableColumnFilterItem[];\n /**\n * Predicate to decide whether a row matches a given filter value.\n * If omitted, falls back to strict equality on `row[dataIndex]`.\n */\n onFilter?: (value: string | number, row: Row) => boolean;\n /**\n * Default active filter values. When `filteredValue` is controlled externally via\n * `Table.filteredValue`, prefer managing it at the table level.\n */\n defaultFilteredValue?: (string | number)[];\n /** Controlled filter selection — when provided, makes the column's filter controlled. */\n filteredValue?: (string | number)[];\n}\n\nexport type TableVariant = \"default\" | \"striped\" | \"embossed\" | \"cards\";\n\nexport interface PaginationConfig {\n /** Current page (1-indexed). Makes pagination controlled. */\n current?: number;\n /** Uncontrolled initial page. */\n defaultCurrent?: number;\n /** Items per page. */\n pageSize?: number;\n /** Default items per page (uncontrolled). */\n defaultPageSize?: number;\n /** Total item count. Defaults to `data.length` when omitted. */\n total?: number;\n /** Fired when user picks a page or changes page size. */\n onChange?: (page: number, pageSize: number) => void;\n /** Reserved for future: jump-to-page input. */\n showQuickJumper?: boolean;\n /** Reserved for future: page size dropdown. */\n showSizeChanger?: boolean;\n /** Reserved for future: selectable page sizes. */\n pageSizeOptions?: number[];\n}\n\nexport interface RowSelectionConfig<Row = any> {\n /** \"checkbox\" (default) allows multi-select; \"radio\" allows only one row at a time. */\n type?: \"checkbox\" | \"radio\";\n /** Controlled list of selected row keys. */\n selectedRowKeys?: RowKey[];\n /** Uncontrolled initial selection. */\n defaultSelectedRowKeys?: RowKey[];\n /** Fired on selection change; receives the new keys and matching rows. */\n onChange?: (selectedRowKeys: RowKey[], selectedRows: Row[]) => void;\n /** Per-row switch toggling checkbox disabled state. */\n getCheckboxProps?: (row: Row) => { disabled?: boolean };\n}\n\nexport interface ExpandableConfig<Row = any> {\n /** Controlled expanded row keys. */\n expandedRowKeys?: RowKey[];\n /** Uncontrolled initial expanded row keys. */\n defaultExpandedRowKeys?: RowKey[];\n /** Fired when a row expands / collapses. */\n onExpand?: (expanded: boolean, row: Row) => void;\n /** Render function for the expanded panel. When omitted, no expand UI renders. */\n expandedRowRender?: (row: Row, index: number) => React.ReactNode;\n /** Decide whether a given row can be expanded. */\n rowExpandable?: (row: Row) => boolean;\n}\n\nexport interface TableScrollConfig {\n /** Horizontal scroll: min-width of the inner table. */\n x?: number | string;\n /** Vertical scroll: max body height (with sticky header). */\n y?: number | string;\n}\n\nexport interface TableProps<Row = any> {\n columns: TableColumn<Row>[];\n data: Row[];\n rowKey?: keyof Row | ((row: Row) => RowKey);\n /** Visual variant. */\n variant?: TableVariant;\n /** Hoverable rows. */\n hoverable?: boolean;\n /** Striped rows (shortcut for variant=\"striped\"). */\n striped?: boolean;\n\n /** Sort state — controlled. */\n sortKey?: string;\n sortDir?: \"asc\" | \"desc\";\n onSort?: (key: string) => void;\n\n /**\n * Row selection config — preferred API (antd-style).\n * When provided, takes precedence over `selectable` / `selected` / `onSelect`.\n */\n rowSelection?: RowSelectionConfig<Row>;\n\n /**\n * @deprecated Use `rowSelection` instead. Kept for backwards compatibility.\n */\n selectable?: boolean;\n /**\n * @deprecated Use `rowSelection.selectedRowKeys` instead.\n */\n selected?: RowKey[];\n /**\n * @deprecated Use `rowSelection.onChange` instead.\n */\n onSelect?: (keys: RowKey[]) => void;\n\n /** Expandable row config. */\n expandable?: ExpandableConfig<Row>;\n\n /**\n * Pagination config — `false` disables pagination; otherwise renders a bottom\n * pagination bar and slices the data accordingly.\n */\n pagination?: false | PaginationConfig;\n\n /** Horizontal / vertical scroll config. */\n scroll?: TableScrollConfig;\n\n /** Called when user clicks a row. */\n onRowClick?: (row: Row, index: number) => void;\n /** Empty state. */\n empty?: React.ReactNode;\n className?: string;\n}\n\n/** `Table` — neumorphic data table with sorting, selection and visual variants. */\nexport function Table<Row extends Record<string, any> = any>({\n columns,\n data,\n rowKey,\n variant,\n hoverable = true,\n striped,\n sortKey,\n sortDir = \"asc\",\n onSort,\n rowSelection,\n selectable,\n selected = [],\n onSelect,\n expandable,\n pagination,\n scroll,\n onRowClick,\n empty = \"暂无数据\",\n className = \"\",\n}: TableProps<Row>) {\n const keyOf = React.useCallback(\n (row: Row, i: number): RowKey => {\n if (typeof rowKey === \"function\") return rowKey(row);\n if (rowKey) return row[rowKey] as any;\n return i;\n },\n [rowKey]\n );\n\n // ---------- Selection (rowSelection OR legacy selectable) ----------\n const selectionMode = rowSelection ? \"new\" : selectable ? \"legacy\" : \"off\";\n const selectionType = rowSelection?.type ?? \"checkbox\";\n\n const [innerSel, setInnerSel] = React.useState<RowKey[]>(\n rowSelection?.defaultSelectedRowKeys ?? []\n );\n const selControlledNew = rowSelection?.selectedRowKeys !== undefined;\n const selectedKeys: RowKey[] =\n selectionMode === \"new\"\n ? selControlledNew\n ? rowSelection!.selectedRowKeys!\n : innerSel\n : selectionMode === \"legacy\"\n ? selected\n : [];\n\n const commitSelected = (next: RowKey[], rows: Row[]) => {\n if (selectionMode === \"new\") {\n if (!selControlledNew) setInnerSel(next);\n rowSelection!.onChange?.(next, rows);\n } else if (selectionMode === \"legacy\") {\n onSelect?.(next);\n }\n };\n\n // ---------- Filters ----------\n // Per-column active filter values (internal state for uncontrolled columns).\n const [innerFilters, setInnerFilters] = React.useState<Record<string, (string | number)[]>>(\n () => {\n const out: Record<string, (string | number)[]> = {};\n for (const c of columns) {\n if (c.defaultFilteredValue && c.defaultFilteredValue.length) {\n out[c.key] = c.defaultFilteredValue;\n }\n }\n return out;\n }\n );\n const activeFilters: Record<string, (string | number)[]> = React.useMemo(() => {\n const out: Record<string, (string | number)[]> = {};\n for (const c of columns) {\n if (!c.filters?.length) continue;\n if (c.filteredValue !== undefined) {\n if (c.filteredValue.length) out[c.key] = c.filteredValue;\n } else if (innerFilters[c.key]?.length) {\n out[c.key] = innerFilters[c.key];\n }\n }\n return out;\n }, [columns, innerFilters]);\n\n const setColumnFilter = (col: TableColumn<Row>, values: (string | number)[]) => {\n if (col.filteredValue !== undefined) return; // controlled — parent must handle\n setInnerFilters((prev) => {\n const next = { ...prev };\n if (values.length === 0) delete next[col.key];\n else next[col.key] = values;\n return next;\n });\n };\n\n const filteredData = React.useMemo(() => {\n const entries = Object.entries(activeFilters);\n if (entries.length === 0) return data;\n return data.filter((row) => {\n for (const [colKey, vals] of entries) {\n const col = columns.find((c) => c.key === colKey);\n if (!col) continue;\n const match = vals.some((v) => {\n if (col.onFilter) return col.onFilter(v, row);\n if (col.dataIndex != null) {\n const cell = (row as any)[col.dataIndex];\n return cell === v || String(cell) === String(v);\n }\n return false;\n });\n if (!match) return false;\n }\n return true;\n });\n }, [data, columns, activeFilters]);\n\n // ---------- Pagination ----------\n const pagEnabled = pagination !== false && pagination !== undefined;\n const pagCfg: PaginationConfig = pagEnabled ? pagination! : {};\n const [innerPage, setInnerPage] = React.useState<number>(\n pagCfg.defaultCurrent ?? 1\n );\n const [innerPageSize, setInnerPageSize] = React.useState<number>(\n pagCfg.defaultPageSize ?? pagCfg.pageSize ?? 10\n );\n const pageControlled = pagCfg.current !== undefined;\n const curPage = pageControlled ? pagCfg.current! : innerPage;\n const curPageSize = pagCfg.pageSize ?? innerPageSize;\n const totalCount = pagCfg.total ?? filteredData.length;\n // Keep internal state in sync when caller changes pageSize uncontrolled->new.\n React.useEffect(() => {\n if (pagCfg.pageSize !== undefined && pagCfg.pageSize !== innerPageSize) {\n setInnerPageSize(pagCfg.pageSize);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pagCfg.pageSize]);\n\n // Reset to page 1 if filters pushed us past the last page\n React.useEffect(() => {\n if (!pagEnabled) return;\n const pages = Math.max(1, Math.ceil(filteredData.length / curPageSize));\n if (!pageControlled && curPage > pages) setInnerPage(pages);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filteredData.length, curPageSize, pagEnabled]);\n\n const pagedData = React.useMemo(() => {\n if (!pagEnabled) return filteredData;\n // If caller passes a pre-sliced page (total != data length and current is\n // controlled), trust them and don't re-slice.\n if (pagCfg.total !== undefined && pageControlled) {\n return filteredData;\n }\n const start = (curPage - 1) * curPageSize;\n return filteredData.slice(start, start + curPageSize);\n }, [pagEnabled, filteredData, curPage, curPageSize, pagCfg.total, pageControlled]);\n\n const onPageChange = (p: number) => {\n if (!pageControlled) setInnerPage(p);\n pagCfg.onChange?.(p, curPageSize);\n };\n\n // ---------- Expandable ----------\n const [innerExpanded, setInnerExpanded] = React.useState<RowKey[]>(\n expandable?.defaultExpandedRowKeys ?? []\n );\n const expandControlled = expandable?.expandedRowKeys !== undefined;\n const expandedKeys: RowKey[] = expandControlled\n ? expandable!.expandedRowKeys!\n : innerExpanded;\n const hasExpandable = !!expandable?.expandedRowRender;\n\n const toggleExpand = (row: Row, k: RowKey) => {\n const isOpen = expandedKeys.includes(k);\n const next = isOpen ? expandedKeys.filter((x) => x !== k) : [...expandedKeys, k];\n if (!expandControlled) setInnerExpanded(next);\n expandable?.onExpand?.(!isOpen, row);\n };\n\n // ---------- Derived bits ----------\n const v: TableVariant = variant ?? (striped ? \"striped\" : \"default\");\n const rowsToRender = pagedData;\n\n const selectableKeysOnPage = rowsToRender\n .map((r, i) => ({ row: r, k: keyOf(r, i) }))\n .filter(({ row }) => {\n if (selectionMode !== \"new\") return true;\n const props = rowSelection?.getCheckboxProps?.(row);\n return !props?.disabled;\n });\n\n const allSelectedOnPage =\n selectionMode !== \"off\" &&\n selectableKeysOnPage.length > 0 &&\n selectableKeysOnPage.every(({ k }) => selectedKeys.includes(k));\n const someSelectedOnPage =\n selectionMode !== \"off\" &&\n selectableKeysOnPage.some(({ k }) => selectedKeys.includes(k)) &&\n !allSelectedOnPage;\n\n const toggleRow = (row: Row, k: RowKey) => {\n if (selectionMode === \"new\") {\n const props = rowSelection?.getCheckboxProps?.(row);\n if (props?.disabled) return;\n let next: RowKey[];\n if (selectionType === \"radio\") {\n next = [k];\n } else {\n next = selectedKeys.includes(k)\n ? selectedKeys.filter((x) => x !== k)\n : [...selectedKeys, k];\n }\n const nextRows = data.filter((r, i) => next.includes(keyOf(r, i)));\n commitSelected(next, nextRows);\n } else if (selectionMode === \"legacy\") {\n const next = selectedKeys.includes(k)\n ? selectedKeys.filter((x) => x !== k)\n : [...selectedKeys, k];\n commitSelected(next, []);\n }\n };\n const toggleAll = () => {\n if (selectionMode === \"off\") return;\n if (selectionType === \"radio\") return; // radio doesn't support bulk toggle\n if (allSelectedOnPage) {\n // Deselect keys that appear on the current page\n const pageKeys = new Set(selectableKeysOnPage.map(({ k }) => k));\n const next = selectedKeys.filter((k) => !pageKeys.has(k));\n const nextRows = data.filter((r, i) => next.includes(keyOf(r, i)));\n commitSelected(next, nextRows);\n } else {\n // Select union of existing selection + page's selectable keys\n const set = new Set(selectedKeys);\n selectableKeysOnPage.forEach(({ k }) => set.add(k));\n const next = Array.from(set);\n const nextRows = data.filter((r, i) => next.includes(keyOf(r, i)));\n commitSelected(next, nextRows);\n }\n };\n\n const showSelCol = selectionMode !== \"off\";\n const showExpandCol = hasExpandable;\n const extraColCount = (showSelCol ? 1 : 0) + (showExpandCol ? 1 : 0);\n const totalColCount = columns.length + extraColCount;\n\n // ---------- Wrapper styling for scroll ----------\n const wrapStyle: React.CSSProperties = {};\n const innerTableStyle: React.CSSProperties = {};\n let wrapClass = \"table-wrap\";\n if (scroll?.y != null) {\n wrapStyle.maxHeight = scroll.y;\n wrapStyle.overflowY = \"auto\";\n wrapClass += \" scroll-y\";\n }\n if (scroll?.x != null) {\n wrapStyle.overflowX = \"auto\";\n innerTableStyle.minWidth = scroll.x;\n wrapClass += \" scroll-x\";\n }\n\n // ---------- Render ----------\n return (\n <>\n <div className={`${wrapClass} ${className}`} style={wrapStyle}>\n <table\n className={`table ${v} ${hoverable ? \"hoverable\" : \"\"} ${scroll?.y != null ? \"sticky-head\" : \"\"}`}\n style={innerTableStyle}\n >\n <thead>\n <tr>\n {showExpandCol && <th className=\"row-expand\" style={{ width: 40 }} />}\n {showSelCol && (\n <th className=\"row-check\" style={{ width: 44 }}>\n {selectionType === \"checkbox\" && (\n <Checkbox\n checked={allSelectedOnPage}\n indeterminate={someSelectedOnPage}\n onChange={toggleAll}\n />\n )}\n </th>\n )}\n {columns.map((c) => {\n const sorted = sortKey === c.key;\n const hasFilters = !!c.filters?.length;\n const filterActive = !!activeFilters[c.key]?.length;\n return (\n <th\n key={c.key}\n className={`${c.sortable ? \"sortable\" : \"\"} ${sorted ? \"sorted\" : \"\"} ${hasFilters ? \"filterable\" : \"\"}`}\n style={{ width: c.width, textAlign: c.align ?? \"left\" }}\n onClick={() => c.sortable && onSort?.(c.key)}\n >\n <span className=\"th-label\">{c.title}</span>\n {c.sortable && (\n <span className=\"sort-ind\">\n <Icon\n name={sorted ? (sortDir === \"asc\" ? \"chevUp\" : \"chevDown\") : \"chevDown\"}\n size={10}\n />\n </span>\n )}\n {hasFilters && (\n <ColumnFilterButton\n column={c}\n activeValues={activeFilters[c.key] ?? []}\n onApply={(values) => setColumnFilter(c, values)}\n active={filterActive}\n />\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rowsToRender.length === 0 ? (\n <tr>\n <td colSpan={totalColCount} className=\"table-empty\">\n {empty}\n </td>\n </tr>\n ) : (\n rowsToRender.map((row, i) => {\n const k = keyOf(row, i);\n const isSel = selectedKeys.includes(k);\n const selProps = rowSelection?.getCheckboxProps?.(row);\n const canExpand =\n hasExpandable && (expandable?.rowExpandable?.(row) ?? true);\n const isExpanded = canExpand && expandedKeys.includes(k);\n return (\n <React.Fragment key={k}>\n <tr\n className={`${onRowClick ? \"clickable\" : \"\"} ${isSel ? \"selected\" : \"\"}`}\n onClick={onRowClick ? () => onRowClick(row, i) : undefined}\n >\n {showExpandCol && (\n <td\n className=\"row-expand\"\n onClick={(e) => {\n e.stopPropagation();\n if (canExpand) toggleExpand(row, k);\n }}\n >\n {canExpand && (\n <button\n type=\"button\"\n className={`expand-btn ${isExpanded ? \"open\" : \"\"}`}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(row, k);\n }}\n >\n <Icon name=\"chevRight\" size={12} />\n </button>\n )}\n </td>\n )}\n {showSelCol && (\n <td\n className=\"row-check\"\n onClick={(e) => {\n e.stopPropagation();\n toggleRow(row, k);\n }}\n >\n {selectionType === \"radio\" ? (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSel}\n disabled={selProps?.disabled}\n className={`radio-dot ${isSel ? \"checked\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleRow(row, k);\n }}\n />\n ) : (\n <Checkbox\n checked={isSel}\n disabled={selProps?.disabled}\n onChange={() => toggleRow(row, k)}\n />\n )}\n </td>\n )}\n {columns.map((c) => {\n const val = c.dataIndex ? row[c.dataIndex] : undefined;\n return (\n <td key={c.key} style={{ textAlign: c.align ?? \"left\" }}>\n {c.render ? c.render(val, row, i) : (val as React.ReactNode)}\n </td>\n );\n })}\n </tr>\n {isExpanded && expandable?.expandedRowRender && (\n <tr className=\"expanded-row\">\n <td colSpan={totalColCount}>\n <div className=\"expanded-panel\">\n {expandable.expandedRowRender(row, i)}\n </div>\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n {pagEnabled && (\n <div className=\"table-pagination\">\n <Pagination\n total={totalCount}\n pageSize={curPageSize}\n page={curPage}\n onChange={onPageChange}\n />\n </div>\n )}\n </>\n );\n}\n\n/* ============ Column filter button (header popover) ============ */\n\ninterface ColumnFilterButtonProps<Row> {\n column: TableColumn<Row>;\n activeValues: (string | number)[];\n onApply: (values: (string | number)[]) => void;\n active: boolean;\n}\n\nfunction ColumnFilterButton<Row>({\n column,\n activeValues,\n onApply,\n active,\n}: ColumnFilterButtonProps<Row>) {\n const [open, setOpen] = React.useState(false);\n const [draft, setDraft] = React.useState<(string | number)[]>(activeValues);\n const panelRef = React.useRef<HTMLDivElement>(null);\n\n const { triggerRef, floatingStyle } = useFloating<HTMLButtonElement>({\n open,\n placement: \"bottom\",\n panelWidth: 200,\n panelHeight: Math.min(260, (column.filters?.length ?? 0) * 32 + 80),\n alignCross: \"end\",\n });\n\n React.useEffect(() => {\n if (open) setDraft(activeValues);\n }, [open, activeValues]);\n\n React.useEffect(() => {\n if (!open) return;\n const h = (e: MouseEvent) => {\n const t = e.target as Node;\n if (triggerRef.current?.contains(t)) return;\n if (panelRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", h);\n return () => document.removeEventListener(\"mousedown\", h);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const toggle = (v: string | number) =>\n setDraft((d) => (d.includes(v) ? d.filter((x) => x !== v) : [...d, v]));\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n className={`filter-ind ${active ? \"active\" : \"\"}`}\n aria-label=\"Filter column\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen((o) => !o);\n }}\n >\n <Icon name=\"filter\" size={10} />\n </button>\n {open &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={panelRef}\n className=\"table-filter-panel\"\n style={floatingStyle}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"table-filter-options\">\n {(column.filters ?? []).map((f) => (\n <label key={String(f.value)} className=\"table-filter-item\">\n <Checkbox\n checked={draft.includes(f.value)}\n onChange={() => toggle(f.value)}\n />\n <span>{f.text}</span>\n </label>\n ))}\n </div>\n <div className=\"table-filter-actions\">\n <button\n type=\"button\"\n className=\"tf-btn ghost\"\n onClick={() => {\n setDraft([]);\n onApply([]);\n setOpen(false);\n }}\n >\n 重置\n </button>\n <button\n type=\"button\"\n className=\"tf-btn primary\"\n onClick={() => {\n onApply(draft);\n setOpen(false);\n }}\n >\n 确定\n </button>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n}\n\n/* ============ TablePro ============ */\n\nexport interface TableProProps<Row = any> extends TableProps<Row> {\n /** Toolbar slot — search input, filter, etc. */\n toolbar?: React.ReactNode;\n /** Right-aligned actions slot in toolbar. */\n actions?: React.ReactNode;\n /** Footer slot — usually <Pagination />. Optional now that `pagination` is built-in. */\n footer?: React.ReactNode;\n /** Title shown above the toolbar. */\n title?: React.ReactNode;\n}\n\n/**\n * `TablePro` — full-featured table card with toolbar, sortable/selectable rows,\n * variants, and a footer slot for pagination.\n *\n * Prefer the built-in `pagination` prop over rendering a `<Pagination />` in the\n * `footer` slot; `footer` still works for custom footers.\n */\nexport function TablePro<Row extends Record<string, any> = any>({\n toolbar,\n actions,\n footer,\n title,\n className = \"\",\n ...tableProps\n}: TableProProps<Row>) {\n return (\n <div className={`table-card ${className}`}>\n {(title || toolbar || actions) && (\n <div className=\"table-toolbar\">\n {title && <div className=\"table-title\">{title}</div>}\n <div className=\"table-toolbar-main\">{toolbar}</div>\n {actions && <div className=\"table-toolbar-actions\">{actions}</div>}\n </div>\n )}\n <Table {...tableProps} className=\"joined\" />\n {footer && <div className=\"table-footer\">{footer}</div>}\n </div>\n );\n}\n"]}
|