@trackunit/react-table 1.24.7 → 1.24.8
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/index.cjs.js +48 -12
- package/index.esm.js +50 -14
- package/package.json +5 -5
package/index.cjs.js
CHANGED
|
@@ -464,14 +464,7 @@ const ColumnFilterItem = ({ name, onToggle, toggled, disabled, index, moveColumn
|
|
|
464
464
|
*/
|
|
465
465
|
const ColumnFilter = ({ columns, setColumnOrder, defaultColumnOrder = [], columnOrder, onUserEvent, setColumnSize, }) => {
|
|
466
466
|
const [t] = useTranslation();
|
|
467
|
-
const initialSetupRef = react.useRef(false);
|
|
468
467
|
const [searchText, setSearchText] = react.useState("");
|
|
469
|
-
react.useEffect(() => {
|
|
470
|
-
if (!initialSetupRef.current && defaultColumnOrder.length > 0) {
|
|
471
|
-
setColumnOrder(defaultColumnOrder);
|
|
472
|
-
initialSetupRef.current = true;
|
|
473
|
-
}
|
|
474
|
-
}, [columnOrder, defaultColumnOrder, setColumnOrder]);
|
|
475
468
|
const resetColumnState = react.useCallback(() => {
|
|
476
469
|
const sizes = {};
|
|
477
470
|
columns.forEach(column => {
|
|
@@ -500,7 +493,7 @@ const ColumnFilter = ({ columns, setColumnOrder, defaultColumnOrder = [], column
|
|
|
500
493
|
});
|
|
501
494
|
}
|
|
502
495
|
return columnOrder && columnOrder.length > 0
|
|
503
|
-
? filteredColumns.
|
|
496
|
+
? filteredColumns.toSorted((a, b) => columnOrder.indexOf(a.id) - columnOrder.indexOf(b.id))
|
|
504
497
|
: filteredColumns;
|
|
505
498
|
}, [columnOrder, columns, searchText]);
|
|
506
499
|
const visibleColumnsCount = react.useMemo(() => {
|
|
@@ -1395,6 +1388,7 @@ const useColumnHelper = () => {
|
|
|
1395
1388
|
}, []);
|
|
1396
1389
|
};
|
|
1397
1390
|
|
|
1391
|
+
const VISIBLE_ONLY_COLUMN_VISIBILITY_KEY = "__trackunitVisibleOnlyColumnVisibility";
|
|
1398
1392
|
const computeMergedPinning = (initialPinning, columnConfigPinning) => {
|
|
1399
1393
|
const leftPinning = initialPinning?.left;
|
|
1400
1394
|
const mergedLeft = leftPinning !== undefined && leftPinning.length > 0 ? [...leftPinning] : [...(columnConfigPinning.left ?? [])];
|
|
@@ -1453,6 +1447,7 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1453
1447
|
const updatedInitialColumnVisibility = react.useMemo(() => {
|
|
1454
1448
|
const columnsList = JSON.parse(stableColumns);
|
|
1455
1449
|
const initialStateColumnVisibility = initialState?.columnVisibility;
|
|
1450
|
+
const shouldHideColumnsMissingFromInitialVisibility = initialStateColumnVisibility?.[VISIBLE_ONLY_COLUMN_VISIBILITY_KEY] === true;
|
|
1456
1451
|
const resultFromInitialState = initialStateColumnVisibility
|
|
1457
1452
|
? Object.fromEntries(columnsList
|
|
1458
1453
|
.map((column) => {
|
|
@@ -1465,13 +1460,15 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1465
1460
|
: {};
|
|
1466
1461
|
columnsList.forEach((column) => {
|
|
1467
1462
|
if (column.id && resultFromInitialState[column.id] === undefined) {
|
|
1468
|
-
resultFromInitialState[column.id] =
|
|
1463
|
+
resultFromInitialState[column.id] = shouldHideColumnsMissingFromInitialVisibility
|
|
1464
|
+
? false
|
|
1465
|
+
: column.meta?.hiddenByDefault !== true;
|
|
1469
1466
|
}
|
|
1470
1467
|
});
|
|
1471
1468
|
return resultFromInitialState;
|
|
1472
1469
|
}, [stableColumns, initialState?.columnVisibility]);
|
|
1473
1470
|
const updatedInitialColumnOrder = react.useMemo(() => {
|
|
1474
|
-
const resultFromInitialState = initialState?.columnOrder
|
|
1471
|
+
const resultFromInitialState = initialState?.columnOrder ? [...initialState.columnOrder] : [];
|
|
1475
1472
|
JSON.parse(stableColumns).forEach((column) => {
|
|
1476
1473
|
if (column.id && !resultFromInitialState.includes(column.id)) {
|
|
1477
1474
|
resultFromInitialState.push(column.id);
|
|
@@ -1497,6 +1494,18 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1497
1494
|
});
|
|
1498
1495
|
return pinningState;
|
|
1499
1496
|
}, [stableColumns]);
|
|
1497
|
+
const defaultColumnSizingById = react.useMemo(() => {
|
|
1498
|
+
const columnsList = JSON.parse(stableColumns);
|
|
1499
|
+
const defaultColumnSize = reactTableProps.defaultColumn?.size ?? reactTable.defaultColumnSizing.size;
|
|
1500
|
+
return Object.fromEntries(columnsList
|
|
1501
|
+
.map((column) => {
|
|
1502
|
+
if (column.id === undefined) {
|
|
1503
|
+
return null;
|
|
1504
|
+
}
|
|
1505
|
+
return [column.id, column.size ?? defaultColumnSize];
|
|
1506
|
+
})
|
|
1507
|
+
.filter(sharedUtils.nonNullable));
|
|
1508
|
+
}, [stableColumns, reactTableProps.defaultColumn?.size]);
|
|
1500
1509
|
const [columnState, setColumnState] = react.useState(() => ({
|
|
1501
1510
|
columnVisibility: reactTableProps.state?.columnVisibility || updatedInitialColumnVisibility,
|
|
1502
1511
|
columnOrder: reactTableProps.state?.columnOrder || updatedInitialColumnOrder,
|
|
@@ -1515,6 +1524,26 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1515
1524
|
}));
|
|
1516
1525
|
}
|
|
1517
1526
|
}, [initialState, updatedInitialColumnOrder, stableUpdatedInitialColumnPinning, updatedInitialColumnVisibility]);
|
|
1527
|
+
react.useEffect(() => {
|
|
1528
|
+
if (initialState && sharedUtils.objectKeys(initialState).length > 0) {
|
|
1529
|
+
return;
|
|
1530
|
+
}
|
|
1531
|
+
setColumnState(prev => {
|
|
1532
|
+
const missingColumnOrder = updatedInitialColumnOrder.filter(columnId => !prev.columnOrder.includes(columnId));
|
|
1533
|
+
const missingColumnVisibility = Object.fromEntries(Object.entries(updatedInitialColumnVisibility).filter(([columnId]) => prev.columnVisibility[columnId] === undefined));
|
|
1534
|
+
if (missingColumnOrder.length === 0 && sharedUtils.objectKeys(missingColumnVisibility).length === 0) {
|
|
1535
|
+
return prev;
|
|
1536
|
+
}
|
|
1537
|
+
return {
|
|
1538
|
+
...prev,
|
|
1539
|
+
columnOrder: [...prev.columnOrder, ...missingColumnOrder],
|
|
1540
|
+
columnVisibility: {
|
|
1541
|
+
...prev.columnVisibility,
|
|
1542
|
+
...missingColumnVisibility,
|
|
1543
|
+
},
|
|
1544
|
+
};
|
|
1545
|
+
});
|
|
1546
|
+
}, [initialState, updatedInitialColumnOrder, updatedInitialColumnVisibility]);
|
|
1518
1547
|
react.useEffect(() => {
|
|
1519
1548
|
setColumnState(prev => ({
|
|
1520
1549
|
...prev,
|
|
@@ -1527,6 +1556,13 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1527
1556
|
...reactTableProps.state,
|
|
1528
1557
|
};
|
|
1529
1558
|
}, [columnState, reactTableProps.state]);
|
|
1559
|
+
const stateForTableStateChange = react.useMemo(() => {
|
|
1560
|
+
const columnSizing = Object.fromEntries(Object.entries(state.columnSizing).filter(([columnId, size]) => defaultColumnSizingById[columnId] !== size));
|
|
1561
|
+
return {
|
|
1562
|
+
...state,
|
|
1563
|
+
columnSizing,
|
|
1564
|
+
};
|
|
1565
|
+
}, [defaultColumnSizingById, state]);
|
|
1530
1566
|
const table = reactTable.useReactTable({
|
|
1531
1567
|
manualSorting: true,
|
|
1532
1568
|
enableSortingRemoval: true,
|
|
@@ -1574,9 +1610,9 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1574
1610
|
});
|
|
1575
1611
|
react.useEffect(() => {
|
|
1576
1612
|
if (onTableStateChange) {
|
|
1577
|
-
onTableStateChange(
|
|
1613
|
+
onTableStateChange(stateForTableStateChange);
|
|
1578
1614
|
}
|
|
1579
|
-
}, [onTableStateChange,
|
|
1615
|
+
}, [onTableStateChange, stateForTableStateChange]);
|
|
1580
1616
|
return react.useMemo(() => {
|
|
1581
1617
|
return { table };
|
|
1582
1618
|
}, [table]);
|
package/index.esm.js
CHANGED
|
@@ -2,14 +2,14 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import { registerTranslations, useNamespaceTranslation, NamespaceTrans } from '@trackunit/i18n-library-translation';
|
|
3
3
|
import { MenuItem, Icon, Button, Tooltip, useOverflowItems, MoreMenu, MenuList, Spacer, cvaInteractableItem, Text, Popover, PopoverTrigger, IconButton, PopoverContent, useBidirectionalScroll, noPagination, Card, Spinner, EmptyState } from '@trackunit/react-components';
|
|
4
4
|
import { objectValues, nonNullable, objectKeys, objectEntries } from '@trackunit/shared-utils';
|
|
5
|
-
import { useMemo, Children, cloneElement, useRef, useState,
|
|
5
|
+
import { useMemo, Children, cloneElement, useRef, useState, useCallback, useEffect, createElement } from 'react';
|
|
6
6
|
import { cvaMerge } from '@trackunit/css-class-variance-utilities';
|
|
7
7
|
import { Link } from '@tanstack/react-router';
|
|
8
8
|
import { cvaLabel, ToggleSwitch, Search, RadioGroup, RadioItem, Checkbox } from '@trackunit/react-form-components';
|
|
9
9
|
import update from 'immutability-helper';
|
|
10
10
|
import { useDrop, useDrag, DndProvider } from 'react-dnd';
|
|
11
11
|
import { HTML5Backend } from 'react-dnd-html5-backend';
|
|
12
|
-
import { flexRender, createColumnHelper, useReactTable, getCoreRowModel, getSortedRowModel } from '@tanstack/react-table';
|
|
12
|
+
import { flexRender, createColumnHelper, defaultColumnSizing, useReactTable, getCoreRowModel, getSortedRowModel } from '@tanstack/react-table';
|
|
13
13
|
export { createColumnHelper } from '@tanstack/react-table';
|
|
14
14
|
import { TableRoot, Thead, Tr, Th, ResizeHandle, Tbody, Td } from '@trackunit/react-table-base-components';
|
|
15
15
|
import { twMerge } from 'tailwind-merge';
|
|
@@ -463,14 +463,7 @@ const ColumnFilterItem = ({ name, onToggle, toggled, disabled, index, moveColumn
|
|
|
463
463
|
*/
|
|
464
464
|
const ColumnFilter = ({ columns, setColumnOrder, defaultColumnOrder = [], columnOrder, onUserEvent, setColumnSize, }) => {
|
|
465
465
|
const [t] = useTranslation();
|
|
466
|
-
const initialSetupRef = useRef(false);
|
|
467
466
|
const [searchText, setSearchText] = useState("");
|
|
468
|
-
useEffect(() => {
|
|
469
|
-
if (!initialSetupRef.current && defaultColumnOrder.length > 0) {
|
|
470
|
-
setColumnOrder(defaultColumnOrder);
|
|
471
|
-
initialSetupRef.current = true;
|
|
472
|
-
}
|
|
473
|
-
}, [columnOrder, defaultColumnOrder, setColumnOrder]);
|
|
474
467
|
const resetColumnState = useCallback(() => {
|
|
475
468
|
const sizes = {};
|
|
476
469
|
columns.forEach(column => {
|
|
@@ -499,7 +492,7 @@ const ColumnFilter = ({ columns, setColumnOrder, defaultColumnOrder = [], column
|
|
|
499
492
|
});
|
|
500
493
|
}
|
|
501
494
|
return columnOrder && columnOrder.length > 0
|
|
502
|
-
? filteredColumns.
|
|
495
|
+
? filteredColumns.toSorted((a, b) => columnOrder.indexOf(a.id) - columnOrder.indexOf(b.id))
|
|
503
496
|
: filteredColumns;
|
|
504
497
|
}, [columnOrder, columns, searchText]);
|
|
505
498
|
const visibleColumnsCount = useMemo(() => {
|
|
@@ -1394,6 +1387,7 @@ const useColumnHelper = () => {
|
|
|
1394
1387
|
}, []);
|
|
1395
1388
|
};
|
|
1396
1389
|
|
|
1390
|
+
const VISIBLE_ONLY_COLUMN_VISIBILITY_KEY = "__trackunitVisibleOnlyColumnVisibility";
|
|
1397
1391
|
const computeMergedPinning = (initialPinning, columnConfigPinning) => {
|
|
1398
1392
|
const leftPinning = initialPinning?.left;
|
|
1399
1393
|
const mergedLeft = leftPinning !== undefined && leftPinning.length > 0 ? [...leftPinning] : [...(columnConfigPinning.left ?? [])];
|
|
@@ -1452,6 +1446,7 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1452
1446
|
const updatedInitialColumnVisibility = useMemo(() => {
|
|
1453
1447
|
const columnsList = JSON.parse(stableColumns);
|
|
1454
1448
|
const initialStateColumnVisibility = initialState?.columnVisibility;
|
|
1449
|
+
const shouldHideColumnsMissingFromInitialVisibility = initialStateColumnVisibility?.[VISIBLE_ONLY_COLUMN_VISIBILITY_KEY] === true;
|
|
1455
1450
|
const resultFromInitialState = initialStateColumnVisibility
|
|
1456
1451
|
? Object.fromEntries(columnsList
|
|
1457
1452
|
.map((column) => {
|
|
@@ -1464,13 +1459,15 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1464
1459
|
: {};
|
|
1465
1460
|
columnsList.forEach((column) => {
|
|
1466
1461
|
if (column.id && resultFromInitialState[column.id] === undefined) {
|
|
1467
|
-
resultFromInitialState[column.id] =
|
|
1462
|
+
resultFromInitialState[column.id] = shouldHideColumnsMissingFromInitialVisibility
|
|
1463
|
+
? false
|
|
1464
|
+
: column.meta?.hiddenByDefault !== true;
|
|
1468
1465
|
}
|
|
1469
1466
|
});
|
|
1470
1467
|
return resultFromInitialState;
|
|
1471
1468
|
}, [stableColumns, initialState?.columnVisibility]);
|
|
1472
1469
|
const updatedInitialColumnOrder = useMemo(() => {
|
|
1473
|
-
const resultFromInitialState = initialState?.columnOrder
|
|
1470
|
+
const resultFromInitialState = initialState?.columnOrder ? [...initialState.columnOrder] : [];
|
|
1474
1471
|
JSON.parse(stableColumns).forEach((column) => {
|
|
1475
1472
|
if (column.id && !resultFromInitialState.includes(column.id)) {
|
|
1476
1473
|
resultFromInitialState.push(column.id);
|
|
@@ -1496,6 +1493,18 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1496
1493
|
});
|
|
1497
1494
|
return pinningState;
|
|
1498
1495
|
}, [stableColumns]);
|
|
1496
|
+
const defaultColumnSizingById = useMemo(() => {
|
|
1497
|
+
const columnsList = JSON.parse(stableColumns);
|
|
1498
|
+
const defaultColumnSize = reactTableProps.defaultColumn?.size ?? defaultColumnSizing.size;
|
|
1499
|
+
return Object.fromEntries(columnsList
|
|
1500
|
+
.map((column) => {
|
|
1501
|
+
if (column.id === undefined) {
|
|
1502
|
+
return null;
|
|
1503
|
+
}
|
|
1504
|
+
return [column.id, column.size ?? defaultColumnSize];
|
|
1505
|
+
})
|
|
1506
|
+
.filter(nonNullable));
|
|
1507
|
+
}, [stableColumns, reactTableProps.defaultColumn?.size]);
|
|
1499
1508
|
const [columnState, setColumnState] = useState(() => ({
|
|
1500
1509
|
columnVisibility: reactTableProps.state?.columnVisibility || updatedInitialColumnVisibility,
|
|
1501
1510
|
columnOrder: reactTableProps.state?.columnOrder || updatedInitialColumnOrder,
|
|
@@ -1514,6 +1523,26 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1514
1523
|
}));
|
|
1515
1524
|
}
|
|
1516
1525
|
}, [initialState, updatedInitialColumnOrder, stableUpdatedInitialColumnPinning, updatedInitialColumnVisibility]);
|
|
1526
|
+
useEffect(() => {
|
|
1527
|
+
if (initialState && objectKeys(initialState).length > 0) {
|
|
1528
|
+
return;
|
|
1529
|
+
}
|
|
1530
|
+
setColumnState(prev => {
|
|
1531
|
+
const missingColumnOrder = updatedInitialColumnOrder.filter(columnId => !prev.columnOrder.includes(columnId));
|
|
1532
|
+
const missingColumnVisibility = Object.fromEntries(Object.entries(updatedInitialColumnVisibility).filter(([columnId]) => prev.columnVisibility[columnId] === undefined));
|
|
1533
|
+
if (missingColumnOrder.length === 0 && objectKeys(missingColumnVisibility).length === 0) {
|
|
1534
|
+
return prev;
|
|
1535
|
+
}
|
|
1536
|
+
return {
|
|
1537
|
+
...prev,
|
|
1538
|
+
columnOrder: [...prev.columnOrder, ...missingColumnOrder],
|
|
1539
|
+
columnVisibility: {
|
|
1540
|
+
...prev.columnVisibility,
|
|
1541
|
+
...missingColumnVisibility,
|
|
1542
|
+
},
|
|
1543
|
+
};
|
|
1544
|
+
});
|
|
1545
|
+
}, [initialState, updatedInitialColumnOrder, updatedInitialColumnVisibility]);
|
|
1517
1546
|
useEffect(() => {
|
|
1518
1547
|
setColumnState(prev => ({
|
|
1519
1548
|
...prev,
|
|
@@ -1526,6 +1555,13 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1526
1555
|
...reactTableProps.state,
|
|
1527
1556
|
};
|
|
1528
1557
|
}, [columnState, reactTableProps.state]);
|
|
1558
|
+
const stateForTableStateChange = useMemo(() => {
|
|
1559
|
+
const columnSizing = Object.fromEntries(Object.entries(state.columnSizing).filter(([columnId, size]) => defaultColumnSizingById[columnId] !== size));
|
|
1560
|
+
return {
|
|
1561
|
+
...state,
|
|
1562
|
+
columnSizing,
|
|
1563
|
+
};
|
|
1564
|
+
}, [defaultColumnSizingById, state]);
|
|
1529
1565
|
const table = useReactTable({
|
|
1530
1566
|
manualSorting: true,
|
|
1531
1567
|
enableSortingRemoval: true,
|
|
@@ -1573,9 +1609,9 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
1573
1609
|
});
|
|
1574
1610
|
useEffect(() => {
|
|
1575
1611
|
if (onTableStateChange) {
|
|
1576
|
-
onTableStateChange(
|
|
1612
|
+
onTableStateChange(stateForTableStateChange);
|
|
1577
1613
|
}
|
|
1578
|
-
}, [onTableStateChange,
|
|
1614
|
+
}, [onTableStateChange, stateForTableStateChange]);
|
|
1579
1615
|
return useMemo(() => {
|
|
1580
1616
|
return { table };
|
|
1581
1617
|
}, [table]);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/react-table",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.8",
|
|
4
4
|
"repository": "https://github.com/Trackunit/manager",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"engines": {
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"react-dnd": "16.0.1",
|
|
12
12
|
"react-dnd-html5-backend": "16.0.1",
|
|
13
13
|
"tailwind-merge": "^2.0.0",
|
|
14
|
-
"@trackunit/react-components": "1.24.
|
|
14
|
+
"@trackunit/react-components": "1.24.5",
|
|
15
15
|
"@trackunit/shared-utils": "1.15.2",
|
|
16
16
|
"@trackunit/css-class-variance-utilities": "1.13.2",
|
|
17
17
|
"@trackunit/ui-icons": "1.13.2",
|
|
18
|
-
"@trackunit/react-table-base-components": "1.24.
|
|
19
|
-
"@trackunit/react-form-components": "1.25.
|
|
20
|
-
"@trackunit/i18n-library-translation": "1.21.
|
|
18
|
+
"@trackunit/react-table-base-components": "1.24.7",
|
|
19
|
+
"@trackunit/react-form-components": "1.25.7",
|
|
20
|
+
"@trackunit/i18n-library-translation": "1.21.5",
|
|
21
21
|
"@trackunit/iris-app-runtime-core-api": "1.16.2"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|