@trackunit/react-table 1.24.6 → 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.
Files changed (3) hide show
  1. package/index.cjs.js +48 -12
  2. package/index.esm.js +50 -14
  3. package/package.json +9 -9
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.sort((a, b) => columnOrder.indexOf(a.id) - columnOrder.indexOf(b.id))
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] = column.meta?.hiddenByDefault !== true;
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(state);
1613
+ onTableStateChange(stateForTableStateChange);
1578
1614
  }
1579
- }, [onTableStateChange, state]);
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, useEffect, useCallback, createElement } from 'react';
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.sort((a, b) => columnOrder.indexOf(a.id) - columnOrder.indexOf(b.id))
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] = column.meta?.hiddenByDefault !== true;
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(state);
1612
+ onTableStateChange(stateForTableStateChange);
1577
1613
  }
1578
- }, [onTableStateChange, state]);
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.6",
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,14 +11,14 @@
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.3",
15
- "@trackunit/shared-utils": "1.15.1",
16
- "@trackunit/css-class-variance-utilities": "1.13.1",
17
- "@trackunit/ui-icons": "1.13.1",
18
- "@trackunit/react-table-base-components": "1.24.5",
19
- "@trackunit/react-form-components": "1.25.5",
20
- "@trackunit/i18n-library-translation": "1.21.3",
21
- "@trackunit/iris-app-runtime-core-api": "1.16.1"
14
+ "@trackunit/react-components": "1.24.5",
15
+ "@trackunit/shared-utils": "1.15.2",
16
+ "@trackunit/css-class-variance-utilities": "1.13.2",
17
+ "@trackunit/ui-icons": "1.13.2",
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
+ "@trackunit/iris-app-runtime-core-api": "1.16.2"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "@tanstack/react-router": "^1.114.29",