react-glide-table 2.2.0 → 2.3.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/README.md +58 -37
- package/dist/compound.cjs +589 -145
- package/dist/compound.d.cts +2 -2
- package/dist/compound.d.ts +2 -2
- package/dist/compound.js +493 -49
- package/dist/core.cjs +509 -141
- package/dist/core.d.cts +54 -10
- package/dist/core.d.ts +54 -10
- package/dist/core.js +396 -29
- package/dist/index.cjs +618 -172
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +494 -49
- package/dist/{types-Iot4g4sq.d.cts → types-DdeVn-9s.d.cts} +33 -2
- package/dist/{types-Iot4g4sq.d.ts → types-DdeVn-9s.d.ts} +33 -2
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -83,6 +83,7 @@ __export(src_exports, {
|
|
|
83
83
|
previousSearchIndex: () => previousSearchIndex,
|
|
84
84
|
resolveCellRenderer: () => resolveCellRenderer,
|
|
85
85
|
resolveColumnFreezeSide: () => resolveColumnFreezeSide,
|
|
86
|
+
resolveColumnLayoutWidths: () => resolveColumnLayoutWidths,
|
|
86
87
|
resolveDataTableLabels: () => resolveDataTableLabels,
|
|
87
88
|
resolveDropEdge: () => resolveDropEdge,
|
|
88
89
|
resolveHeaderFreezeOffset: () => resolveHeaderFreezeOffset,
|
|
@@ -136,7 +137,7 @@ var DEFAULT_TREE_QTY_FIELD = "qty";
|
|
|
136
137
|
// src/core/useGlideTable.ts
|
|
137
138
|
var import_react_table = require("@tanstack/react-table");
|
|
138
139
|
var import_react_virtual = require("@tanstack/react-virtual");
|
|
139
|
-
var
|
|
140
|
+
var import_react6 = require("react");
|
|
140
141
|
|
|
141
142
|
// src/components/ui/table/constants.ts
|
|
142
143
|
var CELL_ALIGN_CLASS = {
|
|
@@ -538,7 +539,7 @@ function withCellUpdate(context, commitValue) {
|
|
|
538
539
|
}
|
|
539
540
|
|
|
540
541
|
// src/components/ui/table/features/cell-selection/useCellSelection.ts
|
|
541
|
-
var
|
|
542
|
+
var import_react3 = require("react");
|
|
542
543
|
|
|
543
544
|
// src/components/ui/table/features/cell-selection/cellSelection.ts
|
|
544
545
|
var INITIAL_DRAG_STATE = {
|
|
@@ -846,6 +847,219 @@ function hasCellSelectionEdges(style) {
|
|
|
846
847
|
}
|
|
847
848
|
|
|
848
849
|
// src/components/ui/table/features/cell-selection/copyData.ts
|
|
850
|
+
var import_react2 = require("react");
|
|
851
|
+
function isReactNodeIterable(node) {
|
|
852
|
+
return typeof node === "object" && node !== null && !(0, import_react2.isValidElement)(node) && Symbol.iterator in node;
|
|
853
|
+
}
|
|
854
|
+
function getElementTypeName(type) {
|
|
855
|
+
if (typeof type === "string") return type;
|
|
856
|
+
if (typeof type === "function") {
|
|
857
|
+
const fn = type;
|
|
858
|
+
return fn.displayName || fn.name || "";
|
|
859
|
+
}
|
|
860
|
+
if (typeof type === "object" && type !== null) {
|
|
861
|
+
const component = type;
|
|
862
|
+
return component.displayName || component.render?.displayName || component.render?.name || "";
|
|
863
|
+
}
|
|
864
|
+
return "";
|
|
865
|
+
}
|
|
866
|
+
function isButtonReactElement(node) {
|
|
867
|
+
const typeName = getElementTypeName(node.type);
|
|
868
|
+
if (typeName === "button" || /button/i.test(typeName)) return true;
|
|
869
|
+
const props = node.props;
|
|
870
|
+
if (props.role === "button") return true;
|
|
871
|
+
if (typeName === "input" && props.type === "button") return true;
|
|
872
|
+
return false;
|
|
873
|
+
}
|
|
874
|
+
function isImageReactElement(node) {
|
|
875
|
+
const typeName = getElementTypeName(node.type);
|
|
876
|
+
return typeName === "img" || typeName === "image" || /image/i.test(typeName);
|
|
877
|
+
}
|
|
878
|
+
var IMAGE_URL_PROP_KEYS = ["src", "url", "href", "imageUrl", "srcUrl"];
|
|
879
|
+
function isLikelyUrl(value) {
|
|
880
|
+
const trimmed = value.trim();
|
|
881
|
+
if (!trimmed) return false;
|
|
882
|
+
if (/^(https?:|blob:|data:|\/\/)/i.test(trimmed)) return true;
|
|
883
|
+
if (trimmed.startsWith("/") && trimmed.includes("/")) return true;
|
|
884
|
+
return false;
|
|
885
|
+
}
|
|
886
|
+
function pickUrlFromUnknown(value) {
|
|
887
|
+
if (typeof value === "string") {
|
|
888
|
+
return isLikelyUrl(value) ? value.trim() : "";
|
|
889
|
+
}
|
|
890
|
+
if (Array.isArray(value)) {
|
|
891
|
+
return value.map((item) => pickUrlFromUnknown(item)).filter((item) => item.length > 0).join(", ");
|
|
892
|
+
}
|
|
893
|
+
if (value && typeof value === "object") {
|
|
894
|
+
const record = value;
|
|
895
|
+
for (const key of IMAGE_URL_PROP_KEYS) {
|
|
896
|
+
const candidate = record[key];
|
|
897
|
+
if (typeof candidate === "string" && candidate.trim()) {
|
|
898
|
+
return candidate.trim();
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
return "";
|
|
903
|
+
}
|
|
904
|
+
function imageElementText(node) {
|
|
905
|
+
const props = node.props;
|
|
906
|
+
for (const key of IMAGE_URL_PROP_KEYS) {
|
|
907
|
+
const candidate = props[key];
|
|
908
|
+
if (typeof candidate === "string" && candidate.trim()) {
|
|
909
|
+
return candidate.trim();
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
return "";
|
|
913
|
+
}
|
|
914
|
+
function reactNodeContainsImage(node) {
|
|
915
|
+
if ((0, import_react2.isValidElement)(node)) {
|
|
916
|
+
if (isImageReactElement(node)) return true;
|
|
917
|
+
return reactNodeContainsImage(node.props.children);
|
|
918
|
+
}
|
|
919
|
+
if (isReactNodeIterable(node)) {
|
|
920
|
+
for (const child of node) {
|
|
921
|
+
if (reactNodeContainsImage(child)) return true;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
return false;
|
|
925
|
+
}
|
|
926
|
+
function readImgUrl(img) {
|
|
927
|
+
const attr = img.getAttribute("src")?.trim() ?? "";
|
|
928
|
+
if (attr) return attr;
|
|
929
|
+
if (img instanceof HTMLImageElement) {
|
|
930
|
+
const current = img.currentSrc?.trim() ?? "";
|
|
931
|
+
if (current && current !== img.baseURI) return current;
|
|
932
|
+
}
|
|
933
|
+
return "";
|
|
934
|
+
}
|
|
935
|
+
function readDomImageUrls(rowIndex, colIndex, root) {
|
|
936
|
+
const scope = root ?? (typeof document === "undefined" ? null : document);
|
|
937
|
+
if (!scope) return "";
|
|
938
|
+
const cells = scope.querySelectorAll(
|
|
939
|
+
`[data-row-index="${rowIndex}"][data-col-index="${colIndex}"]`
|
|
940
|
+
);
|
|
941
|
+
for (const cell of cells) {
|
|
942
|
+
const urls = Array.from(cell.querySelectorAll("img")).flatMap((img) => {
|
|
943
|
+
const url = readImgUrl(img);
|
|
944
|
+
return url ? [url] : [];
|
|
945
|
+
});
|
|
946
|
+
if (urls.length > 0) return urls.join(", ");
|
|
947
|
+
}
|
|
948
|
+
return "";
|
|
949
|
+
}
|
|
950
|
+
function reactNodeToText(node) {
|
|
951
|
+
if (node == null || typeof node === "boolean") return "";
|
|
952
|
+
if (typeof node === "string" || typeof node === "number" || typeof node === "bigint") {
|
|
953
|
+
return String(node);
|
|
954
|
+
}
|
|
955
|
+
if (isReactNodeIterable(node)) {
|
|
956
|
+
let text = "";
|
|
957
|
+
for (const child of node) {
|
|
958
|
+
text += reactNodeToText(child);
|
|
959
|
+
}
|
|
960
|
+
return text;
|
|
961
|
+
}
|
|
962
|
+
if ((0, import_react2.isValidElement)(node)) {
|
|
963
|
+
if (isButtonReactElement(node)) return "";
|
|
964
|
+
const props = node.props;
|
|
965
|
+
const childText = reactNodeToText(props.children);
|
|
966
|
+
if (childText) return childText;
|
|
967
|
+
const fromImage = imageElementText(node);
|
|
968
|
+
if (fromImage) return fromImage;
|
|
969
|
+
if (isImageReactElement(node)) return "";
|
|
970
|
+
if (typeof props.alt === "string" && props.alt) return props.alt;
|
|
971
|
+
if (typeof props.title === "string" && props.title) return props.title;
|
|
972
|
+
return "";
|
|
973
|
+
}
|
|
974
|
+
return "";
|
|
975
|
+
}
|
|
976
|
+
function sanitizeClipboardCell(text) {
|
|
977
|
+
return text.replace(/\s+/g, " ").trim();
|
|
978
|
+
}
|
|
979
|
+
function createCopyRenderRow(rowData, index) {
|
|
980
|
+
return {
|
|
981
|
+
id: getOriginalRowId(rowData) || String(index),
|
|
982
|
+
index,
|
|
983
|
+
original: rowData,
|
|
984
|
+
getIsCellDragSelected: () => false
|
|
985
|
+
};
|
|
986
|
+
}
|
|
987
|
+
function buildVisibleRowLookup(visibleRows) {
|
|
988
|
+
const lookup = /* @__PURE__ */ new Map();
|
|
989
|
+
for (const row of visibleRows) {
|
|
990
|
+
lookup.set(row.original, row);
|
|
991
|
+
}
|
|
992
|
+
return lookup;
|
|
993
|
+
}
|
|
994
|
+
function resolveCopyColumnId(cell) {
|
|
995
|
+
if (cell.column.id) return cell.column.id;
|
|
996
|
+
const columnDef = cell.column.columnDef;
|
|
997
|
+
if (columnDef.id) return columnDef.id;
|
|
998
|
+
if (columnDef.accessorKey != null && columnDef.accessorKey !== "") {
|
|
999
|
+
return String(columnDef.accessorKey);
|
|
1000
|
+
}
|
|
1001
|
+
return "";
|
|
1002
|
+
}
|
|
1003
|
+
function isPrimitiveCopyValue(value) {
|
|
1004
|
+
return value == null || typeof value !== "object";
|
|
1005
|
+
}
|
|
1006
|
+
function extractRenderedCopyText(node, value, cellPosition, root) {
|
|
1007
|
+
const rendered = sanitizeClipboardCell(reactNodeToText(node));
|
|
1008
|
+
if (reactNodeContainsImage(node)) {
|
|
1009
|
+
const fromDom = cellPosition != null ? sanitizeClipboardCell(
|
|
1010
|
+
readDomImageUrls(cellPosition.rowIndex, cellPosition.colIndex, root)
|
|
1011
|
+
) : "";
|
|
1012
|
+
if (fromDom) return fromDom;
|
|
1013
|
+
if (rendered && isLikelyUrl(rendered)) return rendered;
|
|
1014
|
+
return sanitizeClipboardCell(pickUrlFromUnknown(value));
|
|
1015
|
+
}
|
|
1016
|
+
return rendered;
|
|
1017
|
+
}
|
|
1018
|
+
function formatCopyCellText(rowData, columnDef, columnId, visibleRow, fallbackIndex, sourceCell, cellPosition, options) {
|
|
1019
|
+
const meta = columnDef.meta;
|
|
1020
|
+
const value = sourceCell ? sourceCell.getValue() : readRowColumnValue(rowData, columnDef);
|
|
1021
|
+
const cellRender = meta?.cellRender;
|
|
1022
|
+
if (typeof cellRender === "function") {
|
|
1023
|
+
try {
|
|
1024
|
+
const row = visibleRow ?? createCopyRenderRow(rowData, fallbackIndex);
|
|
1025
|
+
const node = cellRender({
|
|
1026
|
+
value,
|
|
1027
|
+
row,
|
|
1028
|
+
index: row.index,
|
|
1029
|
+
columnId,
|
|
1030
|
+
cellProps: meta?.cellProps,
|
|
1031
|
+
update: () => {
|
|
1032
|
+
}
|
|
1033
|
+
});
|
|
1034
|
+
return extractRenderedCopyText(node, value, cellPosition, options?.root);
|
|
1035
|
+
} catch {
|
|
1036
|
+
return formatCellValue(value);
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
if (options?.registry && meta?.kind && isPrimitiveCopyValue(value)) {
|
|
1040
|
+
try {
|
|
1041
|
+
const row = visibleRow ?? createCopyRenderRow(rowData, fallbackIndex);
|
|
1042
|
+
const ctx = {
|
|
1043
|
+
value,
|
|
1044
|
+
row,
|
|
1045
|
+
index: row.index,
|
|
1046
|
+
columnId,
|
|
1047
|
+
cellProps: meta.cellProps,
|
|
1048
|
+
update: () => {
|
|
1049
|
+
}
|
|
1050
|
+
};
|
|
1051
|
+
const renderer = resolveCellRenderer(options.registry, meta.kind, ctx);
|
|
1052
|
+
if (renderer) {
|
|
1053
|
+
const node = renderer.render(ctx);
|
|
1054
|
+
const rendered = extractRenderedCopyText(node, value, cellPosition, options.root);
|
|
1055
|
+
if (rendered) return rendered;
|
|
1056
|
+
}
|
|
1057
|
+
} catch {
|
|
1058
|
+
return formatCellValue(value);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
return formatCellValue(value);
|
|
1062
|
+
}
|
|
849
1063
|
function formatPrimitive(value) {
|
|
850
1064
|
if (value === null || value === void 0) return "";
|
|
851
1065
|
if (typeof value === "string") return value;
|
|
@@ -951,37 +1165,47 @@ function collectCopyRowEntries(visibleRows, bounds, mode = "visible") {
|
|
|
951
1165
|
function collectCopyRows(visibleRows, bounds, mode = "visible") {
|
|
952
1166
|
return collectCopyRowEntries(visibleRows, bounds, mode).map((entry) => entry.row);
|
|
953
1167
|
}
|
|
954
|
-
function serializeCopyRowsToTSV(copyRows, visibleRows, bounds, depths) {
|
|
1168
|
+
function serializeCopyRowsToTSV(copyRows, visibleRows, bounds, depths, options) {
|
|
955
1169
|
if (copyRows.length === 0) return "";
|
|
956
1170
|
const { startCol, endCol } = bounds;
|
|
957
1171
|
const columnCells = visibleRows[0]?.getVisibleCells().slice(startCol, endCol + 1) ?? [];
|
|
958
1172
|
if (columnCells.length === 0) return "";
|
|
959
1173
|
const resolvedDepths = depths && depths.length === copyRows.length ? depths : copyRows.map((row) => getRowDepth(row));
|
|
960
1174
|
const minDepth = Math.min(...resolvedDepths);
|
|
1175
|
+
const visibleRowByOriginal = buildVisibleRowLookup(visibleRows);
|
|
961
1176
|
return copyRows.map((rowData, index) => {
|
|
962
1177
|
const relativeDepth = Math.max(0, (resolvedDepths[index] ?? 0) - minDepth);
|
|
963
|
-
const
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
1178
|
+
const visibleRow = visibleRowByOriginal.get(rowData);
|
|
1179
|
+
const matchingCells = visibleRow?.getVisibleCells().slice(startCol, endCol + 1);
|
|
1180
|
+
const line = columnCells.map((templateCell, colOffset) => {
|
|
1181
|
+
const sourceCell = matchingCells?.[colOffset];
|
|
1182
|
+
const column = sourceCell?.column ?? templateCell.column;
|
|
1183
|
+
return formatCopyCellText(
|
|
1184
|
+
rowData,
|
|
1185
|
+
column.columnDef,
|
|
1186
|
+
resolveCopyColumnId(sourceCell ?? templateCell),
|
|
1187
|
+
visibleRow,
|
|
1188
|
+
visibleRow?.index ?? index,
|
|
1189
|
+
sourceCell,
|
|
1190
|
+
visibleRow != null ? { rowIndex: visibleRow.index, colIndex: startCol + colOffset } : void 0,
|
|
1191
|
+
options
|
|
1192
|
+
);
|
|
1193
|
+
}).join(" ");
|
|
971
1194
|
return `${" ".repeat(relativeDepth)}${line}`;
|
|
972
1195
|
}).join("\n");
|
|
973
1196
|
}
|
|
974
|
-
function serializeSelectionToTSV(visibleRows, bounds, mode = "visible") {
|
|
1197
|
+
function serializeSelectionToTSV(visibleRows, bounds, mode = "visible", options) {
|
|
975
1198
|
const entries = collectCopyRowEntries(visibleRows, bounds, mode);
|
|
976
1199
|
return serializeCopyRowsToTSV(
|
|
977
1200
|
entries.map((entry) => entry.row),
|
|
978
1201
|
visibleRows,
|
|
979
1202
|
bounds,
|
|
980
|
-
entries.map((entry) => entry.depth)
|
|
1203
|
+
entries.map((entry) => entry.depth),
|
|
1204
|
+
options
|
|
981
1205
|
);
|
|
982
1206
|
}
|
|
983
|
-
async function writeSelectionToClipboard(visibleRows, bounds, mode = "visible") {
|
|
984
|
-
const text = serializeSelectionToTSV(visibleRows, bounds, mode);
|
|
1207
|
+
async function writeSelectionToClipboard(visibleRows, bounds, mode = "visible", options) {
|
|
1208
|
+
const text = serializeSelectionToTSV(visibleRows, bounds, mode, options);
|
|
985
1209
|
if (!text) return false;
|
|
986
1210
|
try {
|
|
987
1211
|
await navigator.clipboard.writeText(text);
|
|
@@ -1142,17 +1366,19 @@ function useCellSelection({
|
|
|
1142
1366
|
onDataChange,
|
|
1143
1367
|
onBatchChange,
|
|
1144
1368
|
onRowsPaste,
|
|
1145
|
-
onCellNavigate
|
|
1369
|
+
onCellNavigate,
|
|
1370
|
+
cellRendererRegistry,
|
|
1371
|
+
rootRef
|
|
1146
1372
|
}) {
|
|
1147
|
-
const [dragState, setDragState] = (0,
|
|
1148
|
-
const pendingPasteModeRef = (0,
|
|
1149
|
-
const dragStateRef = (0,
|
|
1150
|
-
const onCellNavigateRef = (0,
|
|
1373
|
+
const [dragState, setDragState] = (0, import_react3.useState)(INITIAL_DRAG_STATE);
|
|
1374
|
+
const pendingPasteModeRef = (0, import_react3.useRef)(null);
|
|
1375
|
+
const dragStateRef = (0, import_react3.useRef)(dragState);
|
|
1376
|
+
const onCellNavigateRef = (0, import_react3.useRef)(onCellNavigate);
|
|
1151
1377
|
dragStateRef.current = dragState;
|
|
1152
1378
|
onCellNavigateRef.current = onCellNavigate;
|
|
1153
1379
|
const cellSelectionBounds = getCellSelectionBounds(dragState.start, dragState.end);
|
|
1154
1380
|
const activeSelectionBounds = enabled ? getActiveSelectionBounds(dragState, cellSelectionBounds) : null;
|
|
1155
|
-
const handleCellMouseDown = (0,
|
|
1381
|
+
const handleCellMouseDown = (0, import_react3.useCallback)(
|
|
1156
1382
|
(rowIndex, colIndex, options) => {
|
|
1157
1383
|
if (!enabled) return;
|
|
1158
1384
|
setDragState((prev) => {
|
|
@@ -1178,7 +1404,7 @@ function useCellSelection({
|
|
|
1178
1404
|
},
|
|
1179
1405
|
[enabled]
|
|
1180
1406
|
);
|
|
1181
|
-
const handleCellMouseEnter = (0,
|
|
1407
|
+
const handleCellMouseEnter = (0, import_react3.useCallback)(
|
|
1182
1408
|
(rowIndex, colIndex) => {
|
|
1183
1409
|
if (!enabled) return;
|
|
1184
1410
|
setDragState((prev) => {
|
|
@@ -1193,7 +1419,7 @@ function useCellSelection({
|
|
|
1193
1419
|
},
|
|
1194
1420
|
[enabled]
|
|
1195
1421
|
);
|
|
1196
|
-
const handleFillHandleMouseDown = (0,
|
|
1422
|
+
const handleFillHandleMouseDown = (0, import_react3.useCallback)(
|
|
1197
1423
|
(rowIndex, colIndex) => {
|
|
1198
1424
|
if (!enabled) return;
|
|
1199
1425
|
setDragState((prev) => {
|
|
@@ -1210,12 +1436,12 @@ function useCellSelection({
|
|
|
1210
1436
|
},
|
|
1211
1437
|
[enabled]
|
|
1212
1438
|
);
|
|
1213
|
-
(0,
|
|
1439
|
+
(0, import_react3.useEffect)(() => {
|
|
1214
1440
|
if (!enabled) {
|
|
1215
1441
|
setDragState(INITIAL_DRAG_STATE);
|
|
1216
1442
|
}
|
|
1217
1443
|
}, [enabled]);
|
|
1218
|
-
(0,
|
|
1444
|
+
(0, import_react3.useEffect)(() => {
|
|
1219
1445
|
if (!enabled) return;
|
|
1220
1446
|
const handleKeyDown = (e) => {
|
|
1221
1447
|
if (e.ctrlKey || e.metaKey || e.altKey) return;
|
|
@@ -1262,19 +1488,32 @@ function useCellSelection({
|
|
|
1262
1488
|
window.addEventListener("keydown", handleKeyDown);
|
|
1263
1489
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
1264
1490
|
}, [columnCount, enabled, rows]);
|
|
1265
|
-
const copySelection = (0,
|
|
1491
|
+
const copySelection = (0, import_react3.useCallback)(
|
|
1266
1492
|
async (options) => {
|
|
1267
1493
|
if (!enabled || !activeSelectionBounds) return false;
|
|
1268
1494
|
const mode = options?.includeDescendants && enableSubtreeCopy ? "subtree" : "visible";
|
|
1269
|
-
return writeSelectionToClipboard(rows, activeSelectionBounds, mode
|
|
1495
|
+
return writeSelectionToClipboard(rows, activeSelectionBounds, mode, {
|
|
1496
|
+
registry: cellRendererRegistry,
|
|
1497
|
+
root: rootRef?.current
|
|
1498
|
+
});
|
|
1270
1499
|
},
|
|
1271
|
-
[
|
|
1500
|
+
[
|
|
1501
|
+
activeSelectionBounds,
|
|
1502
|
+
cellRendererRegistry,
|
|
1503
|
+
enableSubtreeCopy,
|
|
1504
|
+
enabled,
|
|
1505
|
+
rootRef,
|
|
1506
|
+
rows
|
|
1507
|
+
]
|
|
1272
1508
|
);
|
|
1273
|
-
(0,
|
|
1509
|
+
(0, import_react3.useEffect)(() => {
|
|
1274
1510
|
if (!enabled) return;
|
|
1275
1511
|
const handleKeyDown = (e) => {
|
|
1276
1512
|
if (!activeSelectionBounds) return;
|
|
1277
1513
|
if (!(e.ctrlKey || e.metaKey)) return;
|
|
1514
|
+
if (isEditablePasteTarget(e.target) || isEditablePasteTarget(document.activeElement)) {
|
|
1515
|
+
return;
|
|
1516
|
+
}
|
|
1278
1517
|
const isSubtreeShortcut = enableSubtreeCopy && e.shiftKey && e.key.toLowerCase() === "c";
|
|
1279
1518
|
const isVisibleCopyShortcut = !e.shiftKey && e.key.toLowerCase() === "c";
|
|
1280
1519
|
if (!isSubtreeShortcut && !isVisibleCopyShortcut) return;
|
|
@@ -1284,7 +1523,7 @@ function useCellSelection({
|
|
|
1284
1523
|
window.addEventListener("keydown", handleKeyDown);
|
|
1285
1524
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
1286
1525
|
}, [activeSelectionBounds, copySelection, enableSubtreeCopy, enabled]);
|
|
1287
|
-
const emitRowsPaste = (0,
|
|
1526
|
+
const emitRowsPaste = (0, import_react3.useCallback)(
|
|
1288
1527
|
(text, mode) => {
|
|
1289
1528
|
if (!onRowsPaste || !activeSelectionBounds) return false;
|
|
1290
1529
|
const payload = buildRowsPastePayload(
|
|
@@ -1301,7 +1540,7 @@ function useCellSelection({
|
|
|
1301
1540
|
},
|
|
1302
1541
|
[activeSelectionBounds, onRowsPaste, rows]
|
|
1303
1542
|
);
|
|
1304
|
-
(0,
|
|
1543
|
+
(0, import_react3.useEffect)(() => {
|
|
1305
1544
|
if (!enabled || !onRowsPaste) return;
|
|
1306
1545
|
const pasteHandledRef = { current: false };
|
|
1307
1546
|
const ignoreNextPasteRef = { current: false };
|
|
@@ -1369,7 +1608,7 @@ function useCellSelection({
|
|
|
1369
1608
|
enabled,
|
|
1370
1609
|
onRowsPaste
|
|
1371
1610
|
]);
|
|
1372
|
-
(0,
|
|
1611
|
+
(0, import_react3.useEffect)(() => {
|
|
1373
1612
|
if (!enabled) return;
|
|
1374
1613
|
const handleMouseUp = () => {
|
|
1375
1614
|
setDragState((prev) => {
|
|
@@ -1818,7 +2057,7 @@ function collectAncestorKeysToExpand(corpusRow, expandedRows) {
|
|
|
1818
2057
|
}
|
|
1819
2058
|
|
|
1820
2059
|
// src/components/ui/table/features/inline-search/useInlineSearch.ts
|
|
1821
|
-
var
|
|
2060
|
+
var import_react4 = require("react");
|
|
1822
2061
|
var EMPTY_MATCH_KEYS = /* @__PURE__ */ new Set();
|
|
1823
2062
|
function useInlineSearch({
|
|
1824
2063
|
enabled = false,
|
|
@@ -1835,46 +2074,46 @@ function useInlineSearch({
|
|
|
1835
2074
|
onNavigateToResult,
|
|
1836
2075
|
rootRef
|
|
1837
2076
|
}) {
|
|
1838
|
-
const searchInputId = (0,
|
|
1839
|
-
const searchInputRef = (0,
|
|
1840
|
-
const [internalShowSearch, setInternalShowSearch] = (0,
|
|
1841
|
-
const [internalSearchValue, setInternalSearchValue] = (0,
|
|
1842
|
-
const [internalResults, setInternalResults] = (0,
|
|
2077
|
+
const searchInputId = (0, import_react4.useId)();
|
|
2078
|
+
const searchInputRef = (0, import_react4.useRef)(null);
|
|
2079
|
+
const [internalShowSearch, setInternalShowSearch] = (0, import_react4.useState)(false);
|
|
2080
|
+
const [internalSearchValue, setInternalSearchValue] = (0, import_react4.useState)("");
|
|
2081
|
+
const [internalResults, setInternalResults] = (0, import_react4.useState)(
|
|
1843
2082
|
[]
|
|
1844
2083
|
);
|
|
1845
|
-
const [searchStatus, setSearchStatus] = (0,
|
|
1846
|
-
const searchStatusRef = (0,
|
|
2084
|
+
const [searchStatus, setSearchStatus] = (0, import_react4.useState)();
|
|
2085
|
+
const searchStatusRef = (0, import_react4.useRef)(searchStatus);
|
|
1847
2086
|
searchStatusRef.current = searchStatus;
|
|
1848
|
-
const abortControllerRef = (0,
|
|
1849
|
-
const searchHandleRef = (0,
|
|
1850
|
-
const initialStartRowRef = (0,
|
|
2087
|
+
const abortControllerRef = (0, import_react4.useRef)(null);
|
|
2088
|
+
const searchHandleRef = (0, import_react4.useRef)(void 0);
|
|
2089
|
+
const initialStartRowRef = (0, import_react4.useRef)(initialStartRow);
|
|
1851
2090
|
initialStartRowRef.current = initialStartRow;
|
|
1852
|
-
const getCellValueRef = (0,
|
|
2091
|
+
const getCellValueRef = (0, import_react4.useRef)(getCellValue);
|
|
1853
2092
|
getCellValueRef.current = getCellValue;
|
|
1854
2093
|
const showSearch = controlledShowSearch ?? internalShowSearch;
|
|
1855
2094
|
const searchValue = controlledSearchValue ?? internalSearchValue;
|
|
1856
2095
|
const searchResults = controlledSearchResults ?? internalResults;
|
|
1857
|
-
const setSearchValue = (0,
|
|
2096
|
+
const setSearchValue = (0, import_react4.useCallback)(
|
|
1858
2097
|
(value) => {
|
|
1859
2098
|
setInternalSearchValue(value);
|
|
1860
2099
|
onSearchValueChange?.(value);
|
|
1861
2100
|
},
|
|
1862
2101
|
[onSearchValueChange]
|
|
1863
2102
|
);
|
|
1864
|
-
const cancelSearch = (0,
|
|
2103
|
+
const cancelSearch = (0, import_react4.useCallback)(() => {
|
|
1865
2104
|
if (searchHandleRef.current !== void 0) {
|
|
1866
2105
|
window.cancelAnimationFrame(searchHandleRef.current);
|
|
1867
2106
|
searchHandleRef.current = void 0;
|
|
1868
2107
|
}
|
|
1869
2108
|
abortControllerRef.current?.abort();
|
|
1870
2109
|
}, []);
|
|
1871
|
-
const emitResultsChanged = (0,
|
|
2110
|
+
const emitResultsChanged = (0, import_react4.useCallback)(
|
|
1872
2111
|
(results, navIndex) => {
|
|
1873
2112
|
onSearchResultsChanged?.(results, navIndex);
|
|
1874
2113
|
},
|
|
1875
2114
|
[onSearchResultsChanged]
|
|
1876
2115
|
);
|
|
1877
|
-
const navigateToIndex = (0,
|
|
2116
|
+
const navigateToIndex = (0, import_react4.useCallback)(
|
|
1878
2117
|
(results, navIndex) => {
|
|
1879
2118
|
if (onSearchResultsChanged) return;
|
|
1880
2119
|
if (navIndex < 0 || navIndex >= results.length) return;
|
|
@@ -1884,7 +2123,7 @@ function useInlineSearch({
|
|
|
1884
2123
|
},
|
|
1885
2124
|
[onNavigateToResult, onSearchResultsChanged]
|
|
1886
2125
|
);
|
|
1887
|
-
const beginSearch = (0,
|
|
2126
|
+
const beginSearch = (0, import_react4.useCallback)(
|
|
1888
2127
|
(query) => {
|
|
1889
2128
|
if (controlledSearchResults !== void 0) return;
|
|
1890
2129
|
const totalRows = rowCount;
|
|
@@ -1956,12 +2195,12 @@ function useInlineSearch({
|
|
|
1956
2195
|
rowCount
|
|
1957
2196
|
]
|
|
1958
2197
|
);
|
|
1959
|
-
const openSearch = (0,
|
|
2198
|
+
const openSearch = (0, import_react4.useCallback)(() => {
|
|
1960
2199
|
if (controlledShowSearch === void 0) {
|
|
1961
2200
|
setInternalShowSearch(true);
|
|
1962
2201
|
}
|
|
1963
2202
|
}, [controlledShowSearch]);
|
|
1964
|
-
const closeSearch = (0,
|
|
2203
|
+
const closeSearch = (0, import_react4.useCallback)(() => {
|
|
1965
2204
|
if (controlledShowSearch === void 0) {
|
|
1966
2205
|
setInternalShowSearch(false);
|
|
1967
2206
|
}
|
|
@@ -1976,7 +2215,7 @@ function useInlineSearch({
|
|
|
1976
2215
|
emitResultsChanged,
|
|
1977
2216
|
onSearchClose
|
|
1978
2217
|
]);
|
|
1979
|
-
const goToNext = (0,
|
|
2218
|
+
const goToNext = (0, import_react4.useCallback)(() => {
|
|
1980
2219
|
if (!searchStatus || searchStatus.results === 0) return;
|
|
1981
2220
|
const newIndex = nextSearchIndex(
|
|
1982
2221
|
searchStatus.selectedIndex,
|
|
@@ -1986,7 +2225,7 @@ function useInlineSearch({
|
|
|
1986
2225
|
emitResultsChanged(searchResults, newIndex);
|
|
1987
2226
|
navigateToIndex(searchResults, newIndex);
|
|
1988
2227
|
}, [emitResultsChanged, navigateToIndex, searchResults, searchStatus]);
|
|
1989
|
-
const goToPrevious = (0,
|
|
2228
|
+
const goToPrevious = (0, import_react4.useCallback)(() => {
|
|
1990
2229
|
if (!searchStatus || searchStatus.results === 0) return;
|
|
1991
2230
|
const newIndex = previousSearchIndex(
|
|
1992
2231
|
searchStatus.selectedIndex,
|
|
@@ -1996,7 +2235,7 @@ function useInlineSearch({
|
|
|
1996
2235
|
emitResultsChanged(searchResults, newIndex);
|
|
1997
2236
|
navigateToIndex(searchResults, newIndex);
|
|
1998
2237
|
}, [emitResultsChanged, navigateToIndex, searchResults, searchStatus]);
|
|
1999
|
-
(0,
|
|
2238
|
+
(0, import_react4.useEffect)(() => {
|
|
2000
2239
|
if (controlledSearchResults === void 0) return;
|
|
2001
2240
|
if (controlledSearchResults.length > 0) {
|
|
2002
2241
|
setSearchStatus((current) => ({
|
|
@@ -2008,7 +2247,7 @@ function useInlineSearch({
|
|
|
2008
2247
|
setSearchStatus(void 0);
|
|
2009
2248
|
}
|
|
2010
2249
|
}, [controlledSearchResults, rowCount]);
|
|
2011
|
-
(0,
|
|
2250
|
+
(0, import_react4.useEffect)(() => {
|
|
2012
2251
|
if (!enabled) return;
|
|
2013
2252
|
setSearchStatus(void 0);
|
|
2014
2253
|
setInternalResults([]);
|
|
@@ -2021,7 +2260,7 @@ function useInlineSearch({
|
|
|
2021
2260
|
cancelSearch();
|
|
2022
2261
|
}
|
|
2023
2262
|
}, [enabled, showSearch]);
|
|
2024
|
-
(0,
|
|
2263
|
+
(0, import_react4.useEffect)(() => {
|
|
2025
2264
|
if (!enabled || !showSearch) return;
|
|
2026
2265
|
if (controlledSearchResults !== void 0) return;
|
|
2027
2266
|
if (searchValue.trim() === "") {
|
|
@@ -2041,7 +2280,7 @@ function useInlineSearch({
|
|
|
2041
2280
|
searchValue,
|
|
2042
2281
|
showSearch
|
|
2043
2282
|
]);
|
|
2044
|
-
(0,
|
|
2283
|
+
(0, import_react4.useEffect)(() => {
|
|
2045
2284
|
if (!enabled) return;
|
|
2046
2285
|
const handleKeyDown = (event) => {
|
|
2047
2286
|
if (!(event.ctrlKey || event.metaKey)) return;
|
|
@@ -2068,12 +2307,12 @@ function useInlineSearch({
|
|
|
2068
2307
|
window.addEventListener("keydown", handleKeyDown, true);
|
|
2069
2308
|
return () => window.removeEventListener("keydown", handleKeyDown, true);
|
|
2070
2309
|
}, [controlledShowSearch, enabled, rootRef, showSearch]);
|
|
2071
|
-
(0,
|
|
2072
|
-
const searchMatchKeys = (0,
|
|
2310
|
+
(0, import_react4.useEffect)(() => () => cancelSearch(), [cancelSearch]);
|
|
2311
|
+
const searchMatchKeys = (0, import_react4.useMemo)(
|
|
2073
2312
|
() => buildSearchMatchKeys(searchResults),
|
|
2074
2313
|
[searchResults]
|
|
2075
2314
|
);
|
|
2076
|
-
const activeMatch = (0,
|
|
2315
|
+
const activeMatch = (0, import_react4.useMemo)(() => {
|
|
2077
2316
|
if (!searchStatus || searchStatus.selectedIndex < 0) return null;
|
|
2078
2317
|
return searchResults[searchStatus.selectedIndex] ?? null;
|
|
2079
2318
|
}, [searchResults, searchStatus]);
|
|
@@ -2116,7 +2355,7 @@ function useInlineSearch({
|
|
|
2116
2355
|
}
|
|
2117
2356
|
|
|
2118
2357
|
// src/components/ui/table/features/row-expand/row-expand.ts
|
|
2119
|
-
var
|
|
2358
|
+
var import_react5 = require("react");
|
|
2120
2359
|
function getFieldValue(row, key) {
|
|
2121
2360
|
return row[key];
|
|
2122
2361
|
}
|
|
@@ -2146,12 +2385,12 @@ var useConvertTreeData = ({
|
|
|
2146
2385
|
expandedRows,
|
|
2147
2386
|
onExpandedRowsChange
|
|
2148
2387
|
}) => {
|
|
2149
|
-
const onExpandedRowsChangeRef = (0,
|
|
2150
|
-
const hasInitializedRef = (0,
|
|
2151
|
-
(0,
|
|
2388
|
+
const onExpandedRowsChangeRef = (0, import_react5.useRef)(onExpandedRowsChange);
|
|
2389
|
+
const hasInitializedRef = (0, import_react5.useRef)(false);
|
|
2390
|
+
(0, import_react5.useEffect)(() => {
|
|
2152
2391
|
onExpandedRowsChangeRef.current = onExpandedRowsChange;
|
|
2153
2392
|
}, [onExpandedRowsChange]);
|
|
2154
|
-
(0,
|
|
2393
|
+
(0, import_react5.useEffect)(() => {
|
|
2155
2394
|
if (!data || data.length === 0) {
|
|
2156
2395
|
hasInitializedRef.current = false;
|
|
2157
2396
|
return;
|
|
@@ -2161,7 +2400,7 @@ var useConvertTreeData = ({
|
|
|
2161
2400
|
onExpandedRowsChangeRef.current?.(new Set(ids));
|
|
2162
2401
|
hasInitializedRef.current = true;
|
|
2163
2402
|
}, [enabled, data, toggleField]);
|
|
2164
|
-
const processedData = (0,
|
|
2403
|
+
const processedData = (0, import_react5.useMemo)(() => {
|
|
2165
2404
|
if (!enabled || !data || data.length === 0) return [];
|
|
2166
2405
|
const flattenedData = [];
|
|
2167
2406
|
const flattenItems = (items) => {
|
|
@@ -2225,7 +2464,7 @@ var useConvertTreeData = ({
|
|
|
2225
2464
|
});
|
|
2226
2465
|
return rootItems;
|
|
2227
2466
|
}, [enabled, data, toggleField, childField, flattenField]);
|
|
2228
|
-
const flattenTree = (0,
|
|
2467
|
+
const flattenTree = (0, import_react5.useMemo)(() => {
|
|
2229
2468
|
if (!enabled) return [];
|
|
2230
2469
|
const flatten = (nodes, result = [], level = 0) => {
|
|
2231
2470
|
nodes.forEach((node, index) => {
|
|
@@ -2275,7 +2514,7 @@ var useConvertTreeData = ({
|
|
|
2275
2514
|
preventExpand,
|
|
2276
2515
|
expandedRows
|
|
2277
2516
|
]);
|
|
2278
|
-
const sortedData = (0,
|
|
2517
|
+
const sortedData = (0, import_react5.useMemo)(() => {
|
|
2279
2518
|
if (!enabled) {
|
|
2280
2519
|
return data ?? [];
|
|
2281
2520
|
}
|
|
@@ -2502,7 +2741,7 @@ function useGlideTable(options) {
|
|
|
2502
2741
|
searchResults,
|
|
2503
2742
|
onSearchResultsChanged
|
|
2504
2743
|
} = options;
|
|
2505
|
-
const labels = (0,
|
|
2744
|
+
const labels = (0, import_react6.useMemo)(() => {
|
|
2506
2745
|
const resolved = resolveDataTableLabels(labelsProp);
|
|
2507
2746
|
return {
|
|
2508
2747
|
...resolved,
|
|
@@ -2513,17 +2752,21 @@ function useGlideTable(options) {
|
|
|
2513
2752
|
}, [labelsProp, emptyText, loadingText, selectionLabel]);
|
|
2514
2753
|
const enableExpand = Boolean(toggleField);
|
|
2515
2754
|
const resolvedEnableSubtreeCopy = enableSubtreeCopy ?? enableExpand;
|
|
2516
|
-
const [internalRowSelection, setInternalRowSelection] = (0,
|
|
2517
|
-
const [internalColumnSizing, setInternalColumnSizing] = (0,
|
|
2518
|
-
const [internalColumnOrder, setInternalColumnOrder] = (0,
|
|
2519
|
-
const [internalExpandedRows, setInternalExpandedRows] = (0,
|
|
2755
|
+
const [internalRowSelection, setInternalRowSelection] = (0, import_react6.useState)({});
|
|
2756
|
+
const [internalColumnSizing, setInternalColumnSizing] = (0, import_react6.useState)({});
|
|
2757
|
+
const [internalColumnOrder, setInternalColumnOrder] = (0, import_react6.useState)([]);
|
|
2758
|
+
const [internalExpandedRows, setInternalExpandedRows] = (0, import_react6.useState)(
|
|
2520
2759
|
() => /* @__PURE__ */ new Set()
|
|
2521
2760
|
);
|
|
2522
|
-
const [hoveredRowIndex, setHoveredRowIndex] = (0,
|
|
2523
|
-
const scrollRef = (0,
|
|
2524
|
-
const rootRef = (0,
|
|
2761
|
+
const [hoveredRowIndex, setHoveredRowIndex] = (0, import_react6.useState)(null);
|
|
2762
|
+
const scrollRef = (0, import_react6.useRef)(null);
|
|
2763
|
+
const rootRef = (0, import_react6.useRef)(null);
|
|
2764
|
+
const cellRendererRegistry = (0, import_react6.useMemo)(
|
|
2765
|
+
() => createCellRendererRegistry(cellRenderers),
|
|
2766
|
+
[cellRenderers]
|
|
2767
|
+
);
|
|
2525
2768
|
const shouldVirtualize = enableVirtualization && !enableRowSpan;
|
|
2526
|
-
(0,
|
|
2769
|
+
(0, import_react6.useEffect)(() => {
|
|
2527
2770
|
if (enableVirtualization && enableRowSpan) {
|
|
2528
2771
|
console.warn(
|
|
2529
2772
|
"[useGlideTable] enableRowSpan is on; virtualization is disabled to preserve cell merges."
|
|
@@ -2537,11 +2780,11 @@ function useGlideTable(options) {
|
|
|
2537
2780
|
);
|
|
2538
2781
|
const columnSizing = controlledColumnSizing ?? internalColumnSizing;
|
|
2539
2782
|
const columnOrder = controlledColumnOrder ?? internalColumnOrder;
|
|
2540
|
-
const tableColumns = (0,
|
|
2783
|
+
const tableColumns = (0, import_react6.useMemo)(() => {
|
|
2541
2784
|
if (!enableColumnReorder) return columns;
|
|
2542
2785
|
return applyLeafColumnOrder(columns, columnOrder);
|
|
2543
2786
|
}, [columnOrder, columns, enableColumnReorder]);
|
|
2544
|
-
const setColumnOrder = (0,
|
|
2787
|
+
const setColumnOrder = (0, import_react6.useCallback)(
|
|
2545
2788
|
(next) => {
|
|
2546
2789
|
if (onColumnOrderChange) {
|
|
2547
2790
|
onColumnOrderChange(next);
|
|
@@ -2552,7 +2795,7 @@ function useGlideTable(options) {
|
|
|
2552
2795
|
[onColumnOrderChange]
|
|
2553
2796
|
);
|
|
2554
2797
|
const expandedRows = controlledExpandedRows ?? internalExpandedRows;
|
|
2555
|
-
const handleExpandedRowsChange = (0,
|
|
2798
|
+
const handleExpandedRowsChange = (0, import_react6.useCallback)(
|
|
2556
2799
|
(next) => {
|
|
2557
2800
|
if (onExpandedRowsChange) {
|
|
2558
2801
|
onExpandedRowsChange(next);
|
|
@@ -2613,13 +2856,13 @@ function useGlideTable(options) {
|
|
|
2613
2856
|
getCoreRowModel: (0, import_react_table.getCoreRowModel)(),
|
|
2614
2857
|
getRowId: getRowId ? (originalRow, index) => getRowId(originalRow, index) : (_originalRow, index) => String(index)
|
|
2615
2858
|
});
|
|
2616
|
-
const rowSpanColumnKeys = (0,
|
|
2859
|
+
const rowSpanColumnKeys = (0, import_react6.useMemo)(() => {
|
|
2617
2860
|
if (!enableRowSpan) return [];
|
|
2618
2861
|
return collectRowSpanColumns(columns);
|
|
2619
2862
|
}, [enableRowSpan, columns]);
|
|
2620
2863
|
const primaryRowSpanKey = rowSpanColumnKeys[0]?.rowSpanKey;
|
|
2621
2864
|
const primaryRowSpanColumnId = rowSpanColumnKeys[0]?.columnId;
|
|
2622
|
-
const columnRowSpanMap = (0,
|
|
2865
|
+
const columnRowSpanMap = (0, import_react6.useMemo)(
|
|
2623
2866
|
() => buildColumnRowSpanMap(tableData, rowSpanColumnKeys),
|
|
2624
2867
|
[tableData, rowSpanColumnKeys]
|
|
2625
2868
|
);
|
|
@@ -2628,7 +2871,7 @@ function useGlideTable(options) {
|
|
|
2628
2871
|
const rows = table.getRowModel().rows;
|
|
2629
2872
|
const columnCount = table.getAllLeafColumns().length || 1;
|
|
2630
2873
|
const visibleLeafColumns = table.getVisibleLeafColumns();
|
|
2631
|
-
const columnFreezeOffsets = (0,
|
|
2874
|
+
const columnFreezeOffsets = (0, import_react6.useMemo)(() => {
|
|
2632
2875
|
if (!enableColumnFreeze) return EMPTY_COLUMN_FREEZE_OFFSETS;
|
|
2633
2876
|
return buildColumnFreezeOffsets(
|
|
2634
2877
|
visibleLeafColumns.map((column) => ({
|
|
@@ -2648,14 +2891,14 @@ function useGlideTable(options) {
|
|
|
2648
2891
|
const totalSize = rowVirtualizer.getTotalSize();
|
|
2649
2892
|
const paddingTop = virtualRows.length > 0 ? virtualRows[0]?.start ?? 0 : 0;
|
|
2650
2893
|
const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows[virtualRows.length - 1]?.end ?? 0) : 0;
|
|
2651
|
-
const selectedRowIndices = (0,
|
|
2894
|
+
const selectedRowIndices = (0, import_react6.useMemo)(() => {
|
|
2652
2895
|
const indices = /* @__PURE__ */ new Set();
|
|
2653
2896
|
for (const selectedRow of selectedRows) {
|
|
2654
2897
|
indices.add(selectedRow.index);
|
|
2655
2898
|
}
|
|
2656
2899
|
return indices;
|
|
2657
2900
|
}, [selectedRows]);
|
|
2658
|
-
const scrollCellIntoView = (0,
|
|
2901
|
+
const scrollCellIntoView = (0, import_react6.useCallback)(
|
|
2659
2902
|
(rowIndex, colIndex, options2) => {
|
|
2660
2903
|
const align = options2?.align ?? "nearest";
|
|
2661
2904
|
const blockAlign = align === "center" ? "center" : "nearest";
|
|
@@ -2682,7 +2925,7 @@ function useGlideTable(options) {
|
|
|
2682
2925
|
},
|
|
2683
2926
|
[rowVirtualizer, shouldVirtualize]
|
|
2684
2927
|
);
|
|
2685
|
-
const handleCellNavigate = (0,
|
|
2928
|
+
const handleCellNavigate = (0, import_react6.useCallback)(
|
|
2686
2929
|
(position) => {
|
|
2687
2930
|
scrollCellIntoView(position.row, position.col, { align: "nearest" });
|
|
2688
2931
|
},
|
|
@@ -2705,7 +2948,9 @@ function useGlideTable(options) {
|
|
|
2705
2948
|
onDataChange,
|
|
2706
2949
|
onBatchChange,
|
|
2707
2950
|
onRowsPaste,
|
|
2708
|
-
onCellNavigate: handleCellNavigate
|
|
2951
|
+
onCellNavigate: handleCellNavigate,
|
|
2952
|
+
cellRendererRegistry,
|
|
2953
|
+
rootRef
|
|
2709
2954
|
});
|
|
2710
2955
|
const {
|
|
2711
2956
|
editingCell,
|
|
@@ -2715,11 +2960,7 @@ function useGlideTable(options) {
|
|
|
2715
2960
|
commitEdit,
|
|
2716
2961
|
cancelEdit
|
|
2717
2962
|
} = useCellEdit({ data: tableData, rows, onDataChange, onCellChange });
|
|
2718
|
-
const
|
|
2719
|
-
() => createCellRendererRegistry(cellRenderers),
|
|
2720
|
-
[cellRenderers]
|
|
2721
|
-
);
|
|
2722
|
-
const commitRenderedCellValue = (0, import_react5.useCallback)(
|
|
2963
|
+
const commitRenderedCellValue = (0, import_react6.useCallback)(
|
|
2723
2964
|
(rowId, columnId, value) => commitCellValue({
|
|
2724
2965
|
data: tableData,
|
|
2725
2966
|
rows,
|
|
@@ -2731,11 +2972,11 @@ function useGlideTable(options) {
|
|
|
2731
2972
|
}),
|
|
2732
2973
|
[onCellChange, onDataChange, rows, tableData]
|
|
2733
2974
|
);
|
|
2734
|
-
const getCellContext = (0,
|
|
2975
|
+
const getCellContext = (0, import_react6.useCallback)(
|
|
2735
2976
|
(cell) => withCellUpdate(cell.getContext(), commitRenderedCellValue),
|
|
2736
2977
|
[commitRenderedCellValue]
|
|
2737
2978
|
);
|
|
2738
|
-
const handleCellMouseDownWithCommit = (0,
|
|
2979
|
+
const handleCellMouseDownWithCommit = (0, import_react6.useCallback)(
|
|
2739
2980
|
(rowIndex, colIndex, options2) => {
|
|
2740
2981
|
const isSameEditingCell = editingCell?.rowIndex === rowIndex && editingCell?.colIndex === colIndex;
|
|
2741
2982
|
if (editingCell && !isSameEditingCell && !commitEdit()) {
|
|
@@ -2745,7 +2986,7 @@ function useGlideTable(options) {
|
|
|
2745
2986
|
},
|
|
2746
2987
|
[commitEdit, editingCell, handleCellMouseDown]
|
|
2747
2988
|
);
|
|
2748
|
-
const navigateToSearchResult = (0,
|
|
2989
|
+
const navigateToSearchResult = (0, import_react6.useCallback)(
|
|
2749
2990
|
(item) => {
|
|
2750
2991
|
const [colIndex, rowIndex] = item;
|
|
2751
2992
|
handleCellMouseDownWithCommit(rowIndex, colIndex);
|
|
@@ -2753,7 +2994,7 @@ function useGlideTable(options) {
|
|
|
2753
2994
|
},
|
|
2754
2995
|
[handleCellMouseDownWithCommit, scrollCellIntoView]
|
|
2755
2996
|
);
|
|
2756
|
-
const resolveSearchRowId = (0,
|
|
2997
|
+
const resolveSearchRowId = (0, import_react6.useCallback)(
|
|
2757
2998
|
(row, index) => {
|
|
2758
2999
|
if (getRowId) return getRowId(row, index);
|
|
2759
3000
|
if (enableExpand) {
|
|
@@ -2777,7 +3018,7 @@ function useGlideTable(options) {
|
|
|
2777
3018
|
},
|
|
2778
3019
|
[enableExpand, getRowId, toggleField]
|
|
2779
3020
|
);
|
|
2780
|
-
const searchCorpus = (0,
|
|
3021
|
+
const searchCorpus = (0, import_react6.useMemo)(() => {
|
|
2781
3022
|
if (!enableInlineSearch) return [];
|
|
2782
3023
|
if (enableExpand && toggleField) {
|
|
2783
3024
|
return buildTreeSearchCorpus(tableData, {
|
|
@@ -2793,16 +3034,16 @@ function useGlideTable(options) {
|
|
|
2793
3034
|
tableData,
|
|
2794
3035
|
toggleField
|
|
2795
3036
|
]);
|
|
2796
|
-
const searchCorpusRef = (0,
|
|
3037
|
+
const searchCorpusRef = (0, import_react6.useRef)(searchCorpus);
|
|
2797
3038
|
searchCorpusRef.current = searchCorpus;
|
|
2798
|
-
const visibleRowIndexById = (0,
|
|
3039
|
+
const visibleRowIndexById = (0, import_react6.useMemo)(() => {
|
|
2799
3040
|
const map = /* @__PURE__ */ new Map();
|
|
2800
3041
|
for (const row of rows) {
|
|
2801
3042
|
map.set(resolveSearchRowId(row.original, row.index), row.index);
|
|
2802
3043
|
}
|
|
2803
3044
|
return map;
|
|
2804
3045
|
}, [resolveSearchRowId, rows]);
|
|
2805
|
-
const getSearchCellValue = (0,
|
|
3046
|
+
const getSearchCellValue = (0, import_react6.useCallback)(
|
|
2806
3047
|
(rowIndex, colIndex) => {
|
|
2807
3048
|
const corpusRow = searchCorpusRef.current[rowIndex];
|
|
2808
3049
|
const column = visibleLeafColumns[colIndex];
|
|
@@ -2825,14 +3066,14 @@ function useGlideTable(options) {
|
|
|
2825
3066
|
},
|
|
2826
3067
|
[rows, visibleLeafColumns, visibleRowIndexById]
|
|
2827
3068
|
);
|
|
2828
|
-
const pendingSearchNavRef = (0,
|
|
2829
|
-
const focusSearchResult = (0,
|
|
3069
|
+
const pendingSearchNavRef = (0, import_react6.useRef)(null);
|
|
3070
|
+
const focusSearchResult = (0, import_react6.useCallback)(
|
|
2830
3071
|
(colIndex, visibleRowIndex) => {
|
|
2831
3072
|
navigateToSearchResult([colIndex, visibleRowIndex]);
|
|
2832
3073
|
},
|
|
2833
3074
|
[navigateToSearchResult]
|
|
2834
3075
|
);
|
|
2835
|
-
const navigateToCorpusSearchResult = (0,
|
|
3076
|
+
const navigateToCorpusSearchResult = (0, import_react6.useCallback)(
|
|
2836
3077
|
(item) => {
|
|
2837
3078
|
const [colIndex, corpusRowIndex] = item;
|
|
2838
3079
|
const corpusRow = searchCorpusRef.current[corpusRowIndex];
|
|
@@ -2865,7 +3106,7 @@ function useGlideTable(options) {
|
|
|
2865
3106
|
visibleRowIndexById
|
|
2866
3107
|
]
|
|
2867
3108
|
);
|
|
2868
|
-
(0,
|
|
3109
|
+
(0, import_react6.useEffect)(() => {
|
|
2869
3110
|
const pending = pendingSearchNavRef.current;
|
|
2870
3111
|
if (!pending) return;
|
|
2871
3112
|
const visibleRowIndex = visibleRowIndexById.get(pending.rowId);
|
|
@@ -2889,7 +3130,7 @@ function useGlideTable(options) {
|
|
|
2889
3130
|
onNavigateToResult: navigateToCorpusSearchResult,
|
|
2890
3131
|
rootRef
|
|
2891
3132
|
});
|
|
2892
|
-
const visibleSearchMatchKeys = (0,
|
|
3133
|
+
const visibleSearchMatchKeys = (0, import_react6.useMemo)(() => {
|
|
2893
3134
|
if (!enableInlineSearch) return EMPTY_SEARCH_MATCH_KEYS;
|
|
2894
3135
|
return mapSearchResultsToVisibleKeys(
|
|
2895
3136
|
inlineSearch.searchResults,
|
|
@@ -2902,7 +3143,7 @@ function useGlideTable(options) {
|
|
|
2902
3143
|
searchCorpus,
|
|
2903
3144
|
visibleRowIndexById
|
|
2904
3145
|
]);
|
|
2905
|
-
const visibleActiveMatch = (0,
|
|
3146
|
+
const visibleActiveMatch = (0, import_react6.useMemo)(() => {
|
|
2906
3147
|
if (!enableInlineSearch || !inlineSearch.activeMatch) return null;
|
|
2907
3148
|
return mapSearchResultToVisibleItem(
|
|
2908
3149
|
inlineSearch.activeMatch,
|
|
@@ -2915,13 +3156,13 @@ function useGlideTable(options) {
|
|
|
2915
3156
|
searchCorpus,
|
|
2916
3157
|
visibleRowIndexById
|
|
2917
3158
|
]);
|
|
2918
|
-
const clearHover = (0,
|
|
3159
|
+
const clearHover = (0, import_react6.useCallback)(() => {
|
|
2919
3160
|
setHoveredRowIndex(null);
|
|
2920
3161
|
}, []);
|
|
2921
|
-
const handleRowHover = (0,
|
|
3162
|
+
const handleRowHover = (0, import_react6.useCallback)((rowIndex, _rowData) => {
|
|
2922
3163
|
setHoveredRowIndex(rowIndex);
|
|
2923
3164
|
}, []);
|
|
2924
|
-
const handleToggleSelect = (0,
|
|
3165
|
+
const handleToggleSelect = (0, import_react6.useCallback)(
|
|
2925
3166
|
(row) => {
|
|
2926
3167
|
if (!row.getCanSelect()) return;
|
|
2927
3168
|
if (preserveRowSelection && row.getIsSelected()) {
|
|
@@ -2931,14 +3172,14 @@ function useGlideTable(options) {
|
|
|
2931
3172
|
},
|
|
2932
3173
|
[preserveRowSelection]
|
|
2933
3174
|
);
|
|
2934
|
-
const handleToggleExpand = (0,
|
|
3175
|
+
const handleToggleExpand = (0, import_react6.useCallback)(
|
|
2935
3176
|
(rowKey) => {
|
|
2936
3177
|
if (preventExpand) return;
|
|
2937
3178
|
handleExpandedRowsChange(toggleExpandedRowId(rowKey, expandedRows));
|
|
2938
3179
|
},
|
|
2939
3180
|
[preventExpand, handleExpandedRowsChange, expandedRows]
|
|
2940
3181
|
);
|
|
2941
|
-
const rowContextValue = (0,
|
|
3182
|
+
const rowContextValue = (0, import_react6.useMemo)(() => {
|
|
2942
3183
|
return {
|
|
2943
3184
|
rowSpan: {
|
|
2944
3185
|
enableRowSpan,
|
|
@@ -3037,12 +3278,12 @@ function useGlideTable(options) {
|
|
|
3037
3278
|
visibleSearchMatchKeys,
|
|
3038
3279
|
visibleActiveMatch
|
|
3039
3280
|
]);
|
|
3040
|
-
const copySelectionRef = (0,
|
|
3041
|
-
(0,
|
|
3281
|
+
const copySelectionRef = (0, import_react6.useRef)(copySelection);
|
|
3282
|
+
(0, import_react6.useEffect)(() => {
|
|
3042
3283
|
copySelectionRef.current = copySelection;
|
|
3043
3284
|
}, [copySelection]);
|
|
3044
|
-
const stableCopySelection = (0,
|
|
3045
|
-
(0,
|
|
3285
|
+
const stableCopySelection = (0, import_react6.useCallback)((options2) => copySelectionRef.current(options2), []);
|
|
3286
|
+
(0, import_react6.useEffect)(() => {
|
|
3046
3287
|
onCopyActionsReady?.({ copySelection: stableCopySelection });
|
|
3047
3288
|
}, [onCopyActionsReady, stableCopySelection]);
|
|
3048
3289
|
return {
|
|
@@ -3091,16 +3332,18 @@ function useGlideTable(options) {
|
|
|
3091
3332
|
}
|
|
3092
3333
|
|
|
3093
3334
|
// src/components/ui/table/features/cell-render/ResolvedTableCell.tsx
|
|
3094
|
-
var
|
|
3335
|
+
var import_react8 = require("react");
|
|
3095
3336
|
|
|
3096
3337
|
// src/components/ui/table/DataTableContext.tsx
|
|
3097
|
-
var
|
|
3338
|
+
var import_react7 = require("react");
|
|
3098
3339
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
3099
|
-
var DataTableContext = (0,
|
|
3340
|
+
var DataTableContext = (0, import_react7.createContext)(null);
|
|
3100
3341
|
function useDataTableRowContext() {
|
|
3101
|
-
const context = (0,
|
|
3342
|
+
const context = (0, import_react7.use)(DataTableContext);
|
|
3102
3343
|
if (!context) {
|
|
3103
|
-
throw new Error(
|
|
3344
|
+
throw new Error(
|
|
3345
|
+
"useDataTableRowContext must be used within a DataTableContextProvider"
|
|
3346
|
+
);
|
|
3104
3347
|
}
|
|
3105
3348
|
return context;
|
|
3106
3349
|
}
|
|
@@ -3120,7 +3363,7 @@ function ResolvedTableCell({
|
|
|
3120
3363
|
const meta = column.columnDef.meta;
|
|
3121
3364
|
const value = getValue();
|
|
3122
3365
|
const columnId = column.id;
|
|
3123
|
-
const update = (0,
|
|
3366
|
+
const update = (0, import_react8.useCallback)(
|
|
3124
3367
|
(next) => {
|
|
3125
3368
|
cellRender.commitValue(row.id, columnId, next);
|
|
3126
3369
|
},
|
|
@@ -3145,20 +3388,144 @@ function ResolvedTableCell({
|
|
|
3145
3388
|
}
|
|
3146
3389
|
|
|
3147
3390
|
// src/components/ui/table/features/column-resize/columnResize.ts
|
|
3391
|
+
function clamp(value, min, max) {
|
|
3392
|
+
return Math.min(Math.max(value, min), max);
|
|
3393
|
+
}
|
|
3394
|
+
function floorOf(column) {
|
|
3395
|
+
return column.minWidth ?? 0;
|
|
3396
|
+
}
|
|
3397
|
+
function ceilOf(column) {
|
|
3398
|
+
return column.maxWidth ?? Number.POSITIVE_INFINITY;
|
|
3399
|
+
}
|
|
3400
|
+
function preferOf(column) {
|
|
3401
|
+
const floor = floorOf(column);
|
|
3402
|
+
const ceil = ceilOf(column);
|
|
3403
|
+
const preferred = column.maxWidth ?? column.minWidth ?? 0;
|
|
3404
|
+
return clamp(preferred, floor, Number.isFinite(ceil) ? ceil : preferred);
|
|
3405
|
+
}
|
|
3406
|
+
function resolveColumnLayoutWidths(containerWidth, columns) {
|
|
3407
|
+
const widths = /* @__PURE__ */ new Map();
|
|
3408
|
+
const fixed = [];
|
|
3409
|
+
const bounded = [];
|
|
3410
|
+
let flexCount = 0;
|
|
3411
|
+
for (const column of columns) {
|
|
3412
|
+
if (column.width != null) {
|
|
3413
|
+
fixed.push(column);
|
|
3414
|
+
} else if (column.minWidth != null || column.maxWidth != null) {
|
|
3415
|
+
bounded.push(column);
|
|
3416
|
+
} else {
|
|
3417
|
+
flexCount += 1;
|
|
3418
|
+
}
|
|
3419
|
+
}
|
|
3420
|
+
let used = 0;
|
|
3421
|
+
for (const column of fixed) {
|
|
3422
|
+
let size = column.width;
|
|
3423
|
+
if (column.minWidth != null) size = Math.max(size, column.minWidth);
|
|
3424
|
+
if (column.maxWidth != null) size = Math.min(size, column.maxWidth);
|
|
3425
|
+
widths.set(column.id, size);
|
|
3426
|
+
used += size;
|
|
3427
|
+
}
|
|
3428
|
+
if (bounded.length === 0) {
|
|
3429
|
+
return widths;
|
|
3430
|
+
}
|
|
3431
|
+
const boundedSizes = /* @__PURE__ */ new Map();
|
|
3432
|
+
let preferredSum = 0;
|
|
3433
|
+
let floorSum = 0;
|
|
3434
|
+
for (const column of bounded) {
|
|
3435
|
+
const preferred = preferOf(column);
|
|
3436
|
+
boundedSizes.set(column.id, preferred);
|
|
3437
|
+
preferredSum += preferred;
|
|
3438
|
+
floorSum += floorOf(column);
|
|
3439
|
+
}
|
|
3440
|
+
if (containerWidth > 0) {
|
|
3441
|
+
const remaining = Math.max(0, containerWidth - used);
|
|
3442
|
+
if (remaining >= preferredSum) {
|
|
3443
|
+
} else if (remaining >= floorSum) {
|
|
3444
|
+
let deficit = preferredSum - remaining;
|
|
3445
|
+
const open = bounded.map((column) => ({
|
|
3446
|
+
id: column.id,
|
|
3447
|
+
current: boundedSizes.get(column.id),
|
|
3448
|
+
floor: floorOf(column)
|
|
3449
|
+
}));
|
|
3450
|
+
while (deficit >= 1) {
|
|
3451
|
+
const shrinkable = open.filter((entry) => entry.current > entry.floor);
|
|
3452
|
+
if (shrinkable.length === 0) break;
|
|
3453
|
+
const portion = Math.floor(deficit / shrinkable.length);
|
|
3454
|
+
const rem = deficit % shrinkable.length;
|
|
3455
|
+
let consumed = 0;
|
|
3456
|
+
for (let index = 0; index < shrinkable.length; index += 1) {
|
|
3457
|
+
const entry = shrinkable[index];
|
|
3458
|
+
const reduce = Math.min(
|
|
3459
|
+
entry.current - entry.floor,
|
|
3460
|
+
portion + (index < rem ? 1 : 0)
|
|
3461
|
+
);
|
|
3462
|
+
entry.current -= reduce;
|
|
3463
|
+
consumed += reduce;
|
|
3464
|
+
}
|
|
3465
|
+
if (consumed === 0) break;
|
|
3466
|
+
deficit -= consumed;
|
|
3467
|
+
}
|
|
3468
|
+
for (const entry of open) {
|
|
3469
|
+
boundedSizes.set(entry.id, entry.current);
|
|
3470
|
+
}
|
|
3471
|
+
} else {
|
|
3472
|
+
for (const column of bounded) {
|
|
3473
|
+
boundedSizes.set(column.id, floorOf(column));
|
|
3474
|
+
}
|
|
3475
|
+
}
|
|
3476
|
+
}
|
|
3477
|
+
for (const [id, size] of boundedSizes) {
|
|
3478
|
+
widths.set(id, Math.round(size));
|
|
3479
|
+
}
|
|
3480
|
+
return widths;
|
|
3481
|
+
}
|
|
3148
3482
|
function getColumnSizeStyle(size, options) {
|
|
3149
|
-
const {
|
|
3150
|
-
|
|
3483
|
+
const {
|
|
3484
|
+
force = false,
|
|
3485
|
+
lockMax = false,
|
|
3486
|
+
minWidth,
|
|
3487
|
+
maxWidth,
|
|
3488
|
+
layoutWidth
|
|
3489
|
+
} = options ?? {};
|
|
3490
|
+
if (lockMax) {
|
|
3491
|
+
return {
|
|
3492
|
+
width: size,
|
|
3493
|
+
minWidth: size,
|
|
3494
|
+
maxWidth: size
|
|
3495
|
+
};
|
|
3496
|
+
}
|
|
3497
|
+
if (layoutWidth != null) {
|
|
3498
|
+
return {
|
|
3499
|
+
width: layoutWidth,
|
|
3500
|
+
minWidth: layoutWidth,
|
|
3501
|
+
maxWidth: layoutWidth
|
|
3502
|
+
};
|
|
3503
|
+
}
|
|
3504
|
+
const resolvedSize = size;
|
|
3505
|
+
const hasExplicitSize = force || size !== DATA_TABLE_COLUMN_SIZE;
|
|
3506
|
+
if (!hasExplicitSize && minWidth == null && maxWidth == null) {
|
|
3151
3507
|
return void 0;
|
|
3152
3508
|
}
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
minWidth
|
|
3156
|
-
|
|
3157
|
-
|
|
3509
|
+
const style = {};
|
|
3510
|
+
if (hasExplicitSize) {
|
|
3511
|
+
const used = minWidth != null || maxWidth != null ? clamp(
|
|
3512
|
+
resolvedSize,
|
|
3513
|
+
minWidth ?? Number.NEGATIVE_INFINITY,
|
|
3514
|
+
maxWidth ?? Number.POSITIVE_INFINITY
|
|
3515
|
+
) : resolvedSize;
|
|
3516
|
+
style.width = used;
|
|
3517
|
+
style.minWidth = minWidth ?? used;
|
|
3518
|
+
} else if (minWidth != null) {
|
|
3519
|
+
style.minWidth = minWidth;
|
|
3520
|
+
}
|
|
3521
|
+
if (maxWidth != null) {
|
|
3522
|
+
style.maxWidth = maxWidth;
|
|
3523
|
+
}
|
|
3524
|
+
return style;
|
|
3158
3525
|
}
|
|
3159
3526
|
|
|
3160
3527
|
// src/components/ui/table/features/column-reorder/useColumnReorder.ts
|
|
3161
|
-
var
|
|
3528
|
+
var import_react9 = require("react");
|
|
3162
3529
|
function hitTestReorderHeader(table, clientX, clientY) {
|
|
3163
3530
|
const headers = Array.from(
|
|
3164
3531
|
table.querySelectorAll(
|
|
@@ -3206,19 +3573,19 @@ function readTargetIds(table, columnId) {
|
|
|
3206
3573
|
}
|
|
3207
3574
|
function useColumnReorder(options) {
|
|
3208
3575
|
const { enabled, columnOrder, onColumnOrderChange } = options;
|
|
3209
|
-
const sessionRef = (0,
|
|
3210
|
-
const columnOrderRef = (0,
|
|
3211
|
-
const onColumnOrderChangeRef = (0,
|
|
3212
|
-
const [draggingColumnId, setDraggingColumnId] = (0,
|
|
3213
|
-
const [dropTarget, setDropTarget] = (0,
|
|
3576
|
+
const sessionRef = (0, import_react9.useRef)(null);
|
|
3577
|
+
const columnOrderRef = (0, import_react9.useRef)(columnOrder);
|
|
3578
|
+
const onColumnOrderChangeRef = (0, import_react9.useRef)(onColumnOrderChange);
|
|
3579
|
+
const [draggingColumnId, setDraggingColumnId] = (0, import_react9.useState)(null);
|
|
3580
|
+
const [dropTarget, setDropTarget] = (0, import_react9.useState)(
|
|
3214
3581
|
null
|
|
3215
3582
|
);
|
|
3216
|
-
const dropTargetRef = (0,
|
|
3217
|
-
const previousUserSelectRef = (0,
|
|
3583
|
+
const dropTargetRef = (0, import_react9.useRef)(dropTarget);
|
|
3584
|
+
const previousUserSelectRef = (0, import_react9.useRef)(null);
|
|
3218
3585
|
columnOrderRef.current = columnOrder;
|
|
3219
3586
|
onColumnOrderChangeRef.current = onColumnOrderChange;
|
|
3220
3587
|
dropTargetRef.current = dropTarget;
|
|
3221
|
-
const resetDrag = (0,
|
|
3588
|
+
const resetDrag = (0, import_react9.useCallback)(() => {
|
|
3222
3589
|
sessionRef.current = null;
|
|
3223
3590
|
setDraggingColumnId(null);
|
|
3224
3591
|
setDropTarget(null);
|
|
@@ -3234,15 +3601,15 @@ function useColumnReorder(options) {
|
|
|
3234
3601
|
}
|
|
3235
3602
|
document.body.style.removeProperty("user-select");
|
|
3236
3603
|
}, []);
|
|
3237
|
-
(0,
|
|
3604
|
+
(0, import_react9.useEffect)(() => {
|
|
3238
3605
|
if (!enabled) resetDrag();
|
|
3239
3606
|
}, [enabled, resetDrag]);
|
|
3240
|
-
(0,
|
|
3607
|
+
(0, import_react9.useEffect)(() => {
|
|
3241
3608
|
return () => {
|
|
3242
3609
|
resetDrag();
|
|
3243
3610
|
};
|
|
3244
3611
|
}, [resetDrag]);
|
|
3245
|
-
const onHeaderPointerDown = (0,
|
|
3612
|
+
const onHeaderPointerDown = (0, import_react9.useCallback)(
|
|
3246
3613
|
(event, meta) => {
|
|
3247
3614
|
if (!enabled || !meta.canDrag) return;
|
|
3248
3615
|
if (event.button !== 0) return;
|
|
@@ -3265,7 +3632,7 @@ function useColumnReorder(options) {
|
|
|
3265
3632
|
},
|
|
3266
3633
|
[enabled]
|
|
3267
3634
|
);
|
|
3268
|
-
(0,
|
|
3635
|
+
(0, import_react9.useEffect)(() => {
|
|
3269
3636
|
if (!enabled) return;
|
|
3270
3637
|
const onPointerMove = (event) => {
|
|
3271
3638
|
const session = sessionRef.current;
|
|
@@ -3367,11 +3734,11 @@ function useColumnReorder(options) {
|
|
|
3367
3734
|
|
|
3368
3735
|
// src/components/ui/table/components/DataTable/DataTable.tsx
|
|
3369
3736
|
var import_react_table3 = require("@tanstack/react-table");
|
|
3370
|
-
var
|
|
3737
|
+
var import_react11 = require("react");
|
|
3371
3738
|
|
|
3372
3739
|
// src/components/ui/table/components/DataTable/DataTableRow.tsx
|
|
3373
3740
|
var import_react_table2 = require("@tanstack/react-table");
|
|
3374
|
-
var
|
|
3741
|
+
var import_react10 = require("react");
|
|
3375
3742
|
|
|
3376
3743
|
// src/components/ui/table/components/icons.tsx
|
|
3377
3744
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
@@ -3533,6 +3900,12 @@ function isInteractiveMouseTarget(target) {
|
|
|
3533
3900
|
].join(",");
|
|
3534
3901
|
return target.closest(interactiveSelector) !== null;
|
|
3535
3902
|
}
|
|
3903
|
+
function blurActiveElementOutside(container) {
|
|
3904
|
+
const active = document.activeElement;
|
|
3905
|
+
if (!(active instanceof HTMLElement) || active === document.body) return;
|
|
3906
|
+
if (container instanceof Node && container.contains(active)) return;
|
|
3907
|
+
active.blur();
|
|
3908
|
+
}
|
|
3536
3909
|
function resolveExpandCellIndex(cells, toggleField) {
|
|
3537
3910
|
if (!toggleField) return 0;
|
|
3538
3911
|
const matchedIndex = cells.findIndex(
|
|
@@ -3565,7 +3938,7 @@ function DataTableRow({
|
|
|
3565
3938
|
columnFreeze,
|
|
3566
3939
|
inlineSearch
|
|
3567
3940
|
} = useDataTableRowContext();
|
|
3568
|
-
const { enableColumnResize } = columnResize;
|
|
3941
|
+
const { enableColumnResize, layoutWidths } = columnResize;
|
|
3569
3942
|
const { enableColumnFreeze, offsets: freezeOffsets } = columnFreeze;
|
|
3570
3943
|
const {
|
|
3571
3944
|
enabled: enableInlineSearch,
|
|
@@ -3669,9 +4042,9 @@ function DataTableRow({
|
|
|
3669
4042
|
const expandKey = toggleField && rowData[toggleField] !== null && rowData[toggleField] !== void 0 ? String(rowData[toggleField]) : null;
|
|
3670
4043
|
const isExpanded = expandKey !== null && Boolean(expandedRows?.has(expandKey));
|
|
3671
4044
|
const rowLevel = typeof rowData.level === "number" ? rowData.level : 0;
|
|
3672
|
-
const editInputRef = (0,
|
|
4045
|
+
const editInputRef = (0, import_react10.useRef)(null);
|
|
3673
4046
|
const isRowEditing = editingCell?.rowIndex === rowIndex;
|
|
3674
|
-
(0,
|
|
4047
|
+
(0, import_react10.useEffect)(() => {
|
|
3675
4048
|
if (!isRowEditing) return;
|
|
3676
4049
|
editInputRef.current?.focus();
|
|
3677
4050
|
editInputRef.current?.select();
|
|
@@ -3758,7 +4131,10 @@ function DataTableRow({
|
|
|
3758
4131
|
const hasSelectionEdges = hasCellSelectionEdges(selectionEdgeStyle);
|
|
3759
4132
|
const sizeStyle = getColumnSizeStyle(cell.column.getSize(), {
|
|
3760
4133
|
force: enableColumnResize,
|
|
3761
|
-
lockMax: enableColumnResize
|
|
4134
|
+
lockMax: enableColumnResize,
|
|
4135
|
+
minWidth: meta?.minWidth,
|
|
4136
|
+
maxWidth: meta?.maxWidth,
|
|
4137
|
+
layoutWidth: layoutWidths?.get(columnId)
|
|
3762
4138
|
});
|
|
3763
4139
|
const freezeOffset = enableColumnFreeze ? freezeOffsets.get(columnId) : void 0;
|
|
3764
4140
|
const freezeStyle = getColumnFreezeStyle(freezeOffset);
|
|
@@ -3798,6 +4174,7 @@ function DataTableRow({
|
|
|
3798
4174
|
if (!enableCellSelection) return;
|
|
3799
4175
|
if (isInteractiveMouseTarget(event.target)) return;
|
|
3800
4176
|
event.preventDefault();
|
|
4177
|
+
blurActiveElementOutside(event.currentTarget);
|
|
3801
4178
|
onCellMouseDown(
|
|
3802
4179
|
resolveCellRowIndex(event.clientY, event.currentTarget),
|
|
3803
4180
|
cellIndex,
|
|
@@ -3961,6 +4338,7 @@ function DataTableRow({
|
|
|
3961
4338
|
onMouseDown: (event) => {
|
|
3962
4339
|
event.stopPropagation();
|
|
3963
4340
|
event.preventDefault();
|
|
4341
|
+
blurActiveElementOutside(event.currentTarget);
|
|
3964
4342
|
onFillHandleMouseDown(rowIndex, cellIndex);
|
|
3965
4343
|
}
|
|
3966
4344
|
}
|
|
@@ -4290,17 +4668,74 @@ function DataTable({
|
|
|
4290
4668
|
const RowSlot = slots?.Row ?? DataTableRow;
|
|
4291
4669
|
const PendingSlot = slots?.Pending ?? DefaultPending;
|
|
4292
4670
|
const EmptySlot = slots?.Empty ?? DefaultEmpty;
|
|
4293
|
-
const freezeOffsets = rowContextValue.columnFreeze.offsets;
|
|
4294
4671
|
const headerGroups = getMergedHeaderGroups(table.getHeaderGroups());
|
|
4295
4672
|
const leafColumnIds = table.getVisibleLeafColumns().map((column) => column.id);
|
|
4673
|
+
const columnLayoutMetaSignature = table.getVisibleLeafColumns().map((column) => {
|
|
4674
|
+
const meta = column.columnDef.meta;
|
|
4675
|
+
return `${column.id}:${meta?.width ?? ""}:${meta?.minWidth ?? ""}:${meta?.maxWidth ?? ""}`;
|
|
4676
|
+
}).join("|");
|
|
4296
4677
|
const { isReordering, draggingColumnId, dropTarget, onHeaderPointerDown } = useColumnReorder({
|
|
4297
4678
|
enabled: enableColumnReorder,
|
|
4298
4679
|
columnOrder: leafColumnIds,
|
|
4299
4680
|
onColumnOrderChange: setColumnOrder
|
|
4300
4681
|
});
|
|
4301
|
-
const
|
|
4302
|
-
|
|
4303
|
-
|
|
4682
|
+
const [containerWidth, setContainerWidth] = (0, import_react11.useState)(0);
|
|
4683
|
+
(0, import_react11.useEffect)(() => {
|
|
4684
|
+
if (enableColumnResize || isPending) return;
|
|
4685
|
+
const element = scrollRef.current;
|
|
4686
|
+
if (!element) return;
|
|
4687
|
+
const updateWidth = () => {
|
|
4688
|
+
setContainerWidth(Math.floor(element.clientWidth));
|
|
4689
|
+
};
|
|
4690
|
+
updateWidth();
|
|
4691
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
4692
|
+
const observer = new ResizeObserver(() => {
|
|
4693
|
+
updateWidth();
|
|
4694
|
+
});
|
|
4695
|
+
observer.observe(element);
|
|
4696
|
+
return () => observer.disconnect();
|
|
4697
|
+
}, [enableColumnResize, isPending, scrollRef, rows.length, leafColumnIds.join("|")]);
|
|
4698
|
+
const layoutWidths = (0, import_react11.useMemo)(() => {
|
|
4699
|
+
if (enableColumnResize) return void 0;
|
|
4700
|
+
const columns = table.getVisibleLeafColumns().map((column) => ({
|
|
4701
|
+
id: column.id,
|
|
4702
|
+
width: column.columnDef.meta?.width,
|
|
4703
|
+
minWidth: column.columnDef.meta?.minWidth,
|
|
4704
|
+
maxWidth: column.columnDef.meta?.maxWidth
|
|
4705
|
+
}));
|
|
4706
|
+
return resolveColumnLayoutWidths(containerWidth, columns);
|
|
4707
|
+
}, [enableColumnResize, containerWidth, table, columnLayoutMetaSignature]);
|
|
4708
|
+
const freezeOffsets = (0, import_react11.useMemo)(() => {
|
|
4709
|
+
if (!enableColumnFreeze || enableColumnResize || !layoutWidths) {
|
|
4710
|
+
return rowContextValue.columnFreeze.offsets;
|
|
4711
|
+
}
|
|
4712
|
+
const columns = table.getVisibleLeafColumns().map((column) => ({
|
|
4713
|
+
id: column.id,
|
|
4714
|
+
size: layoutWidths.get(column.id) ?? column.getSize(),
|
|
4715
|
+
side: resolveColumnFreezeSide(column.columnDef.meta?.frozen)
|
|
4716
|
+
}));
|
|
4717
|
+
return buildColumnFreezeOffsets(columns);
|
|
4718
|
+
}, [
|
|
4719
|
+
enableColumnFreeze,
|
|
4720
|
+
enableColumnResize,
|
|
4721
|
+
layoutWidths,
|
|
4722
|
+
rowContextValue.columnFreeze.offsets,
|
|
4723
|
+
table
|
|
4724
|
+
]);
|
|
4725
|
+
const contextValue = (0, import_react11.useMemo)(
|
|
4726
|
+
() => ({
|
|
4727
|
+
...rowContextValue,
|
|
4728
|
+
classNames,
|
|
4729
|
+
columnFreeze: {
|
|
4730
|
+
...rowContextValue.columnFreeze,
|
|
4731
|
+
offsets: freezeOffsets
|
|
4732
|
+
},
|
|
4733
|
+
columnResize: {
|
|
4734
|
+
...rowContextValue.columnResize,
|
|
4735
|
+
layoutWidths
|
|
4736
|
+
}
|
|
4737
|
+
}),
|
|
4738
|
+
[rowContextValue, classNames, freezeOffsets, layoutWidths]
|
|
4304
4739
|
);
|
|
4305
4740
|
if (isPending) {
|
|
4306
4741
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
@@ -4379,7 +4814,10 @@ function DataTable({
|
|
|
4379
4814
|
const canResize = enableColumnResize && header.column.getCanResize();
|
|
4380
4815
|
const sizeStyle = getColumnSizeStyle(header.getSize(), {
|
|
4381
4816
|
force: enableColumnResize,
|
|
4382
|
-
lockMax: enableColumnResize
|
|
4817
|
+
lockMax: enableColumnResize,
|
|
4818
|
+
minWidth: header.column.columnDef.meta?.minWidth,
|
|
4819
|
+
maxWidth: header.column.columnDef.meta?.maxWidth,
|
|
4820
|
+
layoutWidth: layoutWidths?.get(header.column.id)
|
|
4383
4821
|
});
|
|
4384
4822
|
const freezeOffset = enableColumnFreeze ? resolveHeaderFreezeOffset(header.column, freezeOffsets) : void 0;
|
|
4385
4823
|
const freezeStyle = getColumnFreezeStyle(freezeOffset, {
|
|
@@ -4392,7 +4830,9 @@ function DataTable({
|
|
|
4392
4830
|
};
|
|
4393
4831
|
const isPlaceholder = header.isPlaceholder;
|
|
4394
4832
|
const leafColumns = header.column.getLeafColumns();
|
|
4395
|
-
const leafIds = leafColumns.map(
|
|
4833
|
+
const leafIds = leafColumns.map(
|
|
4834
|
+
(leafColumn) => leafColumn.id
|
|
4835
|
+
);
|
|
4396
4836
|
const isLeafHeader = !isPlaceholder && header.subHeaders.length === 0;
|
|
4397
4837
|
const canDrag = enableColumnReorder && !isPlaceholder && leafIds.length > 0 && leafColumns.every(
|
|
4398
4838
|
(leafColumn) => isColumnReorderable(leafColumn.columnDef.meta)
|
|
@@ -4548,7 +4988,7 @@ function DataTable({
|
|
|
4548
4988
|
}
|
|
4549
4989
|
|
|
4550
4990
|
// src/components/ui/table/components/Table/Table.tsx
|
|
4551
|
-
var
|
|
4991
|
+
var import_react14 = require("react");
|
|
4552
4992
|
|
|
4553
4993
|
// src/components/ui/table/components/Table/buildColumnDef.tsx
|
|
4554
4994
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
@@ -4585,6 +5025,8 @@ function buildColumnDef(props, sort, onSort) {
|
|
|
4585
5025
|
width,
|
|
4586
5026
|
minWidth,
|
|
4587
5027
|
maxWidth,
|
|
5028
|
+
minResizeWidth,
|
|
5029
|
+
maxResizeWidth,
|
|
4588
5030
|
resizable,
|
|
4589
5031
|
reorderable,
|
|
4590
5032
|
frozen,
|
|
@@ -4605,8 +5047,8 @@ function buildColumnDef(props, sort, onSort) {
|
|
|
4605
5047
|
id: field,
|
|
4606
5048
|
...!virtual ? { accessorKey: field } : {},
|
|
4607
5049
|
size: width ?? DATA_TABLE_COLUMN_SIZE,
|
|
4608
|
-
...
|
|
4609
|
-
...
|
|
5050
|
+
...minResizeWidth != null ? { minSize: minResizeWidth } : {},
|
|
5051
|
+
...maxResizeWidth != null ? { maxSize: maxResizeWidth } : {},
|
|
4610
5052
|
...resizable === false ? { enableResizing: false } : {},
|
|
4611
5053
|
header: sortable ? () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
4612
5054
|
SortableHeader,
|
|
@@ -4635,6 +5077,9 @@ function buildColumnDef(props, sort, onSort) {
|
|
|
4635
5077
|
cellRender: render,
|
|
4636
5078
|
frozen,
|
|
4637
5079
|
reorderable,
|
|
5080
|
+
width,
|
|
5081
|
+
minWidth,
|
|
5082
|
+
maxWidth,
|
|
4638
5083
|
className,
|
|
4639
5084
|
headerClassName
|
|
4640
5085
|
}
|
|
@@ -4680,10 +5125,10 @@ function countLeafColumns(nodes) {
|
|
|
4680
5125
|
}
|
|
4681
5126
|
|
|
4682
5127
|
// src/components/ui/table/components/Table/parseTableChildren.ts
|
|
4683
|
-
var
|
|
5128
|
+
var import_react13 = require("react");
|
|
4684
5129
|
|
|
4685
5130
|
// src/components/ui/table/components/Table/tableChildTypes.ts
|
|
4686
|
-
var
|
|
5131
|
+
var import_react12 = require("react");
|
|
4687
5132
|
var TABLE_HEADER_DISPLAY_NAME = "Table.Header";
|
|
4688
5133
|
var TABLE_BODY_DISPLAY_NAME = "Table.Body";
|
|
4689
5134
|
var TABLE_COLUMN_DISPLAY_NAME = "Table.Column";
|
|
@@ -4696,19 +5141,19 @@ function getComponentDisplayName(type) {
|
|
|
4696
5141
|
return void 0;
|
|
4697
5142
|
}
|
|
4698
5143
|
function isTableHeaderElement(child) {
|
|
4699
|
-
return (0,
|
|
5144
|
+
return (0, import_react12.isValidElement)(child) && getComponentDisplayName(child.type) === TABLE_HEADER_DISPLAY_NAME;
|
|
4700
5145
|
}
|
|
4701
5146
|
function isTableBodyElement(child) {
|
|
4702
|
-
return (0,
|
|
5147
|
+
return (0, import_react12.isValidElement)(child) && getComponentDisplayName(child.type) === TABLE_BODY_DISPLAY_NAME;
|
|
4703
5148
|
}
|
|
4704
5149
|
function isTableColumnElement(child) {
|
|
4705
|
-
return (0,
|
|
5150
|
+
return (0, import_react12.isValidElement)(child) && getComponentDisplayName(child.type) === TABLE_COLUMN_DISPLAY_NAME;
|
|
4706
5151
|
}
|
|
4707
5152
|
function isTableColumnGroupElement(child) {
|
|
4708
|
-
return (0,
|
|
5153
|
+
return (0, import_react12.isValidElement)(child) && getComponentDisplayName(child.type) === TABLE_COLUMN_GROUP_DISPLAY_NAME;
|
|
4709
5154
|
}
|
|
4710
5155
|
function isTablePaginationElement(child) {
|
|
4711
|
-
return (0,
|
|
5156
|
+
return (0, import_react12.isValidElement)(child) && getComponentDisplayName(child.type) === TABLE_PAGINATION_DISPLAY_NAME;
|
|
4712
5157
|
}
|
|
4713
5158
|
|
|
4714
5159
|
// src/components/ui/table/components/Table/parseTableChildren.ts
|
|
@@ -4718,7 +5163,7 @@ function parseTableChildren(children) {
|
|
|
4718
5163
|
body: null,
|
|
4719
5164
|
pagination: null
|
|
4720
5165
|
};
|
|
4721
|
-
for (const child of
|
|
5166
|
+
for (const child of import_react13.Children.toArray(children)) {
|
|
4722
5167
|
if (isTableHeaderElement(child)) {
|
|
4723
5168
|
slots.header = child;
|
|
4724
5169
|
continue;
|
|
@@ -4735,7 +5180,7 @@ function parseTableChildren(children) {
|
|
|
4735
5180
|
}
|
|
4736
5181
|
function walkColumnTreeNodes(children) {
|
|
4737
5182
|
const result = [];
|
|
4738
|
-
for (const child of
|
|
5183
|
+
for (const child of import_react13.Children.toArray(children)) {
|
|
4739
5184
|
if (isTableColumnElement(child)) {
|
|
4740
5185
|
result.push({
|
|
4741
5186
|
type: "leaf",
|
|
@@ -4752,7 +5197,7 @@ function walkColumnTreeNodes(children) {
|
|
|
4752
5197
|
});
|
|
4753
5198
|
continue;
|
|
4754
5199
|
}
|
|
4755
|
-
if ((0,
|
|
5200
|
+
if ((0, import_react13.isValidElement)(child)) {
|
|
4756
5201
|
const nested = child.props.children;
|
|
4757
5202
|
if (nested != null) {
|
|
4758
5203
|
result.push(...walkColumnTreeNodes(nested));
|
|
@@ -4878,12 +5323,12 @@ function TableRoot({
|
|
|
4878
5323
|
filteredCount,
|
|
4879
5324
|
...dataTableProps
|
|
4880
5325
|
}) {
|
|
4881
|
-
const { header, pagination: paginationElement } = (0,
|
|
5326
|
+
const { header, pagination: paginationElement } = (0, import_react14.useMemo)(
|
|
4882
5327
|
() => parseTableChildren(children),
|
|
4883
5328
|
[children]
|
|
4884
5329
|
);
|
|
4885
|
-
const [sort, setSort] = (0,
|
|
4886
|
-
const handleSort = (0,
|
|
5330
|
+
const [sort, setSort] = (0, import_react14.useState)(null);
|
|
5331
|
+
const handleSort = (0, import_react14.useCallback)((field) => {
|
|
4887
5332
|
setSort((previous) => {
|
|
4888
5333
|
if (previous?.field !== field) {
|
|
4889
5334
|
return { field, direction: "asc" };
|
|
@@ -4894,8 +5339,8 @@ function TableRoot({
|
|
|
4894
5339
|
return null;
|
|
4895
5340
|
});
|
|
4896
5341
|
}, []);
|
|
4897
|
-
const columnTree = (0,
|
|
4898
|
-
const columns = (0,
|
|
5342
|
+
const columnTree = (0, import_react14.useMemo)(() => extractColumnTree(header), [header]);
|
|
5343
|
+
const columns = (0, import_react14.useMemo)(
|
|
4899
5344
|
() => buildColumnDefsFromTree(columnTree, sort, handleSort),
|
|
4900
5345
|
[columnTree, sort, handleSort]
|
|
4901
5346
|
);
|
|
@@ -4903,7 +5348,7 @@ function TableRoot({
|
|
|
4903
5348
|
const pageSize = paginationProps?.pageSize ?? 10;
|
|
4904
5349
|
const page = paginationProps?.page ?? 1;
|
|
4905
5350
|
const resolvedTotalCount = paginationProps?.totalCount ?? totalCount ?? data.length;
|
|
4906
|
-
const tableData = (0,
|
|
5351
|
+
const tableData = (0, import_react14.useMemo)(() => {
|
|
4907
5352
|
const sortedData = sortTableData(data, sort);
|
|
4908
5353
|
if (!paginationProps) return sortedData;
|
|
4909
5354
|
return paginateTableData(sortedData, page, pageSize);
|
|
@@ -5031,6 +5476,7 @@ var Table = Object.assign(TableRoot, {
|
|
|
5031
5476
|
previousSearchIndex,
|
|
5032
5477
|
resolveCellRenderer,
|
|
5033
5478
|
resolveColumnFreezeSide,
|
|
5479
|
+
resolveColumnLayoutWidths,
|
|
5034
5480
|
resolveDataTableLabels,
|
|
5035
5481
|
resolveDropEdge,
|
|
5036
5482
|
resolveHeaderFreezeOffset,
|