@trackunit/react-table 1.3.21 → 1.3.23
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 +35 -22
- package/index.esm.js +35 -22
- package/package.json +10 -10
- package/src/useTableSelection.d.ts +27 -27
- package/src/useTableSelection.demo.d.ts +3 -3
package/index.cjs.js
CHANGED
|
@@ -501,7 +501,7 @@ const Table = ({ rowHeight = 75, ...props }) => {
|
|
|
501
501
|
maxWidth: header.column.columnDef.maxSize,
|
|
502
502
|
textAlign: header.column.columnDef.meta?.alignment || "left",
|
|
503
503
|
flexGrow: header.column.columnDef.meta?.shouldGrow ? 1 : 0,
|
|
504
|
-
}, tooltipLabel: tooltipLabel, children: [header.isPlaceholder ? null : (jsxRuntime.jsxs("div", { className: `${header.column.getCanSort() ? "cursor-pointer select-none flex" : "flex"} items-center gap-2 py-2 overflow-hidden
|
|
504
|
+
}, tooltipLabel: tooltipLabel, children: [header.isPlaceholder ? null : (jsxRuntime.jsxs("div", { className: `${header.column.getCanSort() ? "cursor-pointer select-none flex pr-3" : "flex"} items-center gap-2 py-2 overflow-hidden w-full`,
|
|
505
505
|
onClick: header.column.getToggleSortingHandler(), children: [jsxRuntime.jsxs("span", { className: "overflow-hidden text-ellipsis whitespace-nowrap", children: [reactTable.flexRender(header.column.columnDef.header, header.getContext()), header.column.columnDef.meta?.subHeader ? (jsxRuntime.jsx(reactComponents.Text, { size: "small", subtle: true, children: header.column.columnDef.meta.subHeader })) : null] }), header.column.getCanSort() ? (jsxRuntime.jsx(reactTableBaseComponents.SortIndicator, { sortingState: header.column.getIsSorted() })) : null] })), !header.column.columnDef.meta?.shouldGrow && header.column.getCanResize() ? (jsxRuntime.jsx(reactTableBaseComponents.ResizeHandle, { isResizing: header.column.getIsResizing(), onMouseDown: header.getResizeHandler(), onTouchStart: header.getResizeHandler() })) : null] }, header.id));
|
|
506
506
|
}) }, headerGroup.id))) }), hasResults ? (jsxRuntime.jsx(reactTableBaseComponents.Tbody, { className: "text-sm font-normal", style: {
|
|
507
507
|
height: `${getTotalSize()}px`,
|
|
@@ -690,19 +690,20 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
690
690
|
* columns,
|
|
691
691
|
* });
|
|
692
692
|
*/
|
|
693
|
-
const useTableSelection = ({ data, defaultSelectedIds, enableRowSelection = true, }) => {
|
|
693
|
+
const useTableSelection = ({ data, idKey, defaultSelectedIds, enableRowSelection = true, }) => {
|
|
694
694
|
const [t] = useTranslation();
|
|
695
695
|
const [rowSelection, setRowSelection] = react.useState({});
|
|
696
696
|
react.useEffect(() => {
|
|
697
697
|
const initialSelection = {};
|
|
698
698
|
defaultSelectedIds?.forEach(id => {
|
|
699
|
-
initialSelection[id] = true;
|
|
699
|
+
initialSelection[String(id)] = true;
|
|
700
700
|
});
|
|
701
701
|
setRowSelection(() => ({ ...initialSelection }));
|
|
702
702
|
}, [defaultSelectedIds]);
|
|
703
703
|
const toggleRowSelectionState = react.useCallback((id) => {
|
|
704
704
|
setRowSelection(prevRowSelection => {
|
|
705
|
-
const
|
|
705
|
+
const stringId = String(id);
|
|
706
|
+
const newSelection = { ...prevRowSelection, [stringId]: !prevRowSelection[stringId] };
|
|
706
707
|
const entries = sharedUtils.objectEntries(newSelection);
|
|
707
708
|
if (entries.length !== 0 && entries.every(([_, selected]) => !selected)) {
|
|
708
709
|
return {};
|
|
@@ -714,35 +715,47 @@ const useTableSelection = ({ data, defaultSelectedIds, enableRowSelection = true
|
|
|
714
715
|
.filter(([_, selected]) => selected)
|
|
715
716
|
.map(([id]) => id), [rowSelection]);
|
|
716
717
|
const columnHelper = react.useMemo(() => reactTable.createColumnHelper(), []);
|
|
717
|
-
const selectionColumn = react.useMemo(() => columnHelper.accessor(row => row
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
718
|
+
const selectionColumn = react.useMemo(() => columnHelper.accessor(row => row[idKey], {
|
|
719
|
+
header: ({ table }) => {
|
|
720
|
+
const hasRowSelection = table.getState().rowSelection !== undefined;
|
|
721
|
+
if (!hasRowSelection) {
|
|
722
|
+
return null;
|
|
723
|
+
}
|
|
724
|
+
return (jsxRuntime.jsx(reactFormComponents.Checkbox, { className: "ml-4",
|
|
725
|
+
checked: table.getIsAllRowsSelected(),
|
|
726
|
+
indeterminate: table.getIsSomeRowsSelected(),
|
|
727
|
+
onChange: table.getToggleAllRowsSelectedHandler(),
|
|
728
|
+
disabled: !data.length }));
|
|
729
|
+
},
|
|
730
|
+
cell: ({ row, table }) => {
|
|
731
|
+
const hasRowSelection = table.getState().rowSelection !== undefined;
|
|
732
|
+
if (!hasRowSelection) {
|
|
733
|
+
return null;
|
|
734
|
+
}
|
|
735
|
+
return (jsxRuntime.jsx(reactFormComponents.Checkbox, { className: "flex justify-center",
|
|
736
|
+
checked: row.getIsSelected(),
|
|
737
|
+
disabled: !row.getCanSelect(),
|
|
738
|
+
indeterminate: row.getIsSomeSelected(),
|
|
739
|
+
onChange: row.getToggleSelectedHandler(),
|
|
740
|
+
stopPropagation: true,
|
|
741
|
+
"aria-label": "rowSelector" }));
|
|
742
|
+
},
|
|
730
743
|
id: "selection",
|
|
731
744
|
enableSorting: false,
|
|
732
745
|
enableResizing: false,
|
|
733
|
-
size:
|
|
746
|
+
size: 70,
|
|
734
747
|
meta: {
|
|
735
748
|
required: true,
|
|
736
|
-
alignment: "
|
|
749
|
+
alignment: "center",
|
|
737
750
|
columnFilterLabel: t("table.selection.label"),
|
|
738
751
|
},
|
|
739
|
-
}), [columnHelper, data.length, t]);
|
|
752
|
+
}), [columnHelper, data.length, idKey, t]);
|
|
740
753
|
const selectionTableState = react.useMemo(() => ({ rowSelection }), [rowSelection]);
|
|
741
754
|
const selectionTableProps = react.useMemo(() => ({
|
|
742
755
|
onRowSelectionChange: setRowSelection,
|
|
743
|
-
getRowId: row => row
|
|
756
|
+
getRowId: row => String(row[idKey]),
|
|
744
757
|
enableRowSelection,
|
|
745
|
-
}), [enableRowSelection]);
|
|
758
|
+
}), [enableRowSelection, idKey]);
|
|
746
759
|
return react.useMemo(() => ({
|
|
747
760
|
toggleRowSelectionState,
|
|
748
761
|
selectionColumn,
|
package/index.esm.js
CHANGED
|
@@ -500,7 +500,7 @@ const Table = ({ rowHeight = 75, ...props }) => {
|
|
|
500
500
|
maxWidth: header.column.columnDef.maxSize,
|
|
501
501
|
textAlign: header.column.columnDef.meta?.alignment || "left",
|
|
502
502
|
flexGrow: header.column.columnDef.meta?.shouldGrow ? 1 : 0,
|
|
503
|
-
}, tooltipLabel: tooltipLabel, children: [header.isPlaceholder ? null : (jsxs("div", { className: `${header.column.getCanSort() ? "cursor-pointer select-none flex" : "flex"} items-center gap-2 py-2 overflow-hidden
|
|
503
|
+
}, tooltipLabel: tooltipLabel, children: [header.isPlaceholder ? null : (jsxs("div", { className: `${header.column.getCanSort() ? "cursor-pointer select-none flex pr-3" : "flex"} items-center gap-2 py-2 overflow-hidden w-full`,
|
|
504
504
|
onClick: header.column.getToggleSortingHandler(), children: [jsxs("span", { className: "overflow-hidden text-ellipsis whitespace-nowrap", children: [flexRender(header.column.columnDef.header, header.getContext()), header.column.columnDef.meta?.subHeader ? (jsx(Text, { size: "small", subtle: true, children: header.column.columnDef.meta.subHeader })) : null] }), header.column.getCanSort() ? (jsx(SortIndicator, { sortingState: header.column.getIsSorted() })) : null] })), !header.column.columnDef.meta?.shouldGrow && header.column.getCanResize() ? (jsx(ResizeHandle, { isResizing: header.column.getIsResizing(), onMouseDown: header.getResizeHandler(), onTouchStart: header.getResizeHandler() })) : null] }, header.id));
|
|
505
505
|
}) }, headerGroup.id))) }), hasResults ? (jsx(Tbody, { className: "text-sm font-normal", style: {
|
|
506
506
|
height: `${getTotalSize()}px`,
|
|
@@ -689,19 +689,20 @@ const useTable = ({ onTableStateChange, initialState, columns, ...reactTableProp
|
|
|
689
689
|
* columns,
|
|
690
690
|
* });
|
|
691
691
|
*/
|
|
692
|
-
const useTableSelection = ({ data, defaultSelectedIds, enableRowSelection = true, }) => {
|
|
692
|
+
const useTableSelection = ({ data, idKey, defaultSelectedIds, enableRowSelection = true, }) => {
|
|
693
693
|
const [t] = useTranslation();
|
|
694
694
|
const [rowSelection, setRowSelection] = useState({});
|
|
695
695
|
useEffect(() => {
|
|
696
696
|
const initialSelection = {};
|
|
697
697
|
defaultSelectedIds?.forEach(id => {
|
|
698
|
-
initialSelection[id] = true;
|
|
698
|
+
initialSelection[String(id)] = true;
|
|
699
699
|
});
|
|
700
700
|
setRowSelection(() => ({ ...initialSelection }));
|
|
701
701
|
}, [defaultSelectedIds]);
|
|
702
702
|
const toggleRowSelectionState = useCallback((id) => {
|
|
703
703
|
setRowSelection(prevRowSelection => {
|
|
704
|
-
const
|
|
704
|
+
const stringId = String(id);
|
|
705
|
+
const newSelection = { ...prevRowSelection, [stringId]: !prevRowSelection[stringId] };
|
|
705
706
|
const entries = objectEntries(newSelection);
|
|
706
707
|
if (entries.length !== 0 && entries.every(([_, selected]) => !selected)) {
|
|
707
708
|
return {};
|
|
@@ -713,35 +714,47 @@ const useTableSelection = ({ data, defaultSelectedIds, enableRowSelection = true
|
|
|
713
714
|
.filter(([_, selected]) => selected)
|
|
714
715
|
.map(([id]) => id), [rowSelection]);
|
|
715
716
|
const columnHelper = useMemo(() => createColumnHelper(), []);
|
|
716
|
-
const selectionColumn = useMemo(() => columnHelper.accessor(row => row
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
717
|
+
const selectionColumn = useMemo(() => columnHelper.accessor(row => row[idKey], {
|
|
718
|
+
header: ({ table }) => {
|
|
719
|
+
const hasRowSelection = table.getState().rowSelection !== undefined;
|
|
720
|
+
if (!hasRowSelection) {
|
|
721
|
+
return null;
|
|
722
|
+
}
|
|
723
|
+
return (jsx(Checkbox, { className: "ml-4",
|
|
724
|
+
checked: table.getIsAllRowsSelected(),
|
|
725
|
+
indeterminate: table.getIsSomeRowsSelected(),
|
|
726
|
+
onChange: table.getToggleAllRowsSelectedHandler(),
|
|
727
|
+
disabled: !data.length }));
|
|
728
|
+
},
|
|
729
|
+
cell: ({ row, table }) => {
|
|
730
|
+
const hasRowSelection = table.getState().rowSelection !== undefined;
|
|
731
|
+
if (!hasRowSelection) {
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
return (jsx(Checkbox, { className: "flex justify-center",
|
|
735
|
+
checked: row.getIsSelected(),
|
|
736
|
+
disabled: !row.getCanSelect(),
|
|
737
|
+
indeterminate: row.getIsSomeSelected(),
|
|
738
|
+
onChange: row.getToggleSelectedHandler(),
|
|
739
|
+
stopPropagation: true,
|
|
740
|
+
"aria-label": "rowSelector" }));
|
|
741
|
+
},
|
|
729
742
|
id: "selection",
|
|
730
743
|
enableSorting: false,
|
|
731
744
|
enableResizing: false,
|
|
732
|
-
size:
|
|
745
|
+
size: 70,
|
|
733
746
|
meta: {
|
|
734
747
|
required: true,
|
|
735
|
-
alignment: "
|
|
748
|
+
alignment: "center",
|
|
736
749
|
columnFilterLabel: t("table.selection.label"),
|
|
737
750
|
},
|
|
738
|
-
}), [columnHelper, data.length, t]);
|
|
751
|
+
}), [columnHelper, data.length, idKey, t]);
|
|
739
752
|
const selectionTableState = useMemo(() => ({ rowSelection }), [rowSelection]);
|
|
740
753
|
const selectionTableProps = useMemo(() => ({
|
|
741
754
|
onRowSelectionChange: setRowSelection,
|
|
742
|
-
getRowId: row => row
|
|
755
|
+
getRowId: row => String(row[idKey]),
|
|
743
756
|
enableRowSelection,
|
|
744
|
-
}), [enableRowSelection]);
|
|
757
|
+
}), [enableRowSelection, idKey]);
|
|
745
758
|
return useMemo(() => ({
|
|
746
759
|
toggleRowSelectionState,
|
|
747
760
|
selectionColumn,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/react-table",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.23",
|
|
4
4
|
"repository": "https://github.com/Trackunit/manager",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"engines": {
|
|
@@ -15,15 +15,15 @@
|
|
|
15
15
|
"jest-fetch-mock": "^3.0.3",
|
|
16
16
|
"@tanstack/react-router": "1.47.1",
|
|
17
17
|
"tailwind-merge": "^2.0.0",
|
|
18
|
-
"@trackunit/react-components": "1.4.
|
|
19
|
-
"@trackunit/shared-utils": "1.5.
|
|
20
|
-
"@trackunit/css-class-variance-utilities": "1.3.
|
|
21
|
-
"@trackunit/ui-icons": "1.3.
|
|
22
|
-
"@trackunit/react-table-base-components": "1.3.
|
|
23
|
-
"@trackunit/react-table-pagination": "1.3.
|
|
24
|
-
"@trackunit/react-form-components": "1.3.
|
|
25
|
-
"@trackunit/i18n-library-translation": "1.3.
|
|
26
|
-
"@trackunit/react-core-contexts-api": "1.4.
|
|
18
|
+
"@trackunit/react-components": "1.4.18",
|
|
19
|
+
"@trackunit/shared-utils": "1.5.18",
|
|
20
|
+
"@trackunit/css-class-variance-utilities": "1.3.18",
|
|
21
|
+
"@trackunit/ui-icons": "1.3.18",
|
|
22
|
+
"@trackunit/react-table-base-components": "1.3.22",
|
|
23
|
+
"@trackunit/react-table-pagination": "1.3.18",
|
|
24
|
+
"@trackunit/react-form-components": "1.3.22",
|
|
25
|
+
"@trackunit/i18n-library-translation": "1.3.19",
|
|
26
|
+
"@trackunit/react-core-contexts-api": "1.4.19"
|
|
27
27
|
},
|
|
28
28
|
"module": "./index.esm.js",
|
|
29
29
|
"main": "./index.cjs.js",
|
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
import { ColumnDef, RowSelectionState } from "@tanstack/react-table";
|
|
2
2
|
import { Dispatch, SetStateAction } from "react";
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
export interface SelectableTableData {
|
|
4
|
+
}
|
|
5
|
+
export interface TableSelectionProps<TData extends SelectableTableData> {
|
|
6
|
+
/**
|
|
7
|
+
* The data that is displayed in the table.
|
|
8
|
+
*/
|
|
9
|
+
data: TData[];
|
|
10
|
+
/**
|
|
11
|
+
* The key in TData that should be used as the unique identifier
|
|
12
|
+
* Example: 'id', 'assetId', 'userId', etc.
|
|
13
|
+
*/
|
|
14
|
+
idKey: keyof TData & string;
|
|
15
|
+
/**
|
|
16
|
+
* An array of ids of the rows that should be selected by default.
|
|
17
|
+
*/
|
|
18
|
+
defaultSelectedIds?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Whether or not to enable row selection.
|
|
21
|
+
*/
|
|
22
|
+
enableRowSelection?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface TableSelectionReturn<TData extends SelectableTableData> {
|
|
7
25
|
/**
|
|
8
26
|
* An array of the ids of the currently selected rows.
|
|
9
27
|
*/
|
|
10
|
-
selectedIds:
|
|
28
|
+
selectedIds: string[];
|
|
11
29
|
/**
|
|
12
30
|
* The current state of row selection.
|
|
13
31
|
* Pass this to the `state` prop of the `useTable` Hook.
|
|
@@ -20,7 +38,7 @@ export interface TableSelectionReturn<TData extends selectableTableData> {
|
|
|
20
38
|
*/
|
|
21
39
|
selectionTableProps: {
|
|
22
40
|
onRowSelectionChange: Dispatch<SetStateAction<RowSelectionState>>;
|
|
23
|
-
getRowId: (row: TData) =>
|
|
41
|
+
getRowId: (row: TData) => string;
|
|
24
42
|
enableRowSelection: boolean;
|
|
25
43
|
};
|
|
26
44
|
/**
|
|
@@ -31,30 +49,12 @@ export interface TableSelectionReturn<TData extends selectableTableData> {
|
|
|
31
49
|
/**
|
|
32
50
|
* A `ColumnDef` object for the selection column, which includes a checkbox in each cell and header.
|
|
33
51
|
*/
|
|
34
|
-
selectionColumn: ColumnDef<TData, string>;
|
|
52
|
+
selectionColumn: ColumnDef<TData, TData[keyof TData & string]>;
|
|
35
53
|
/**
|
|
36
54
|
* A function to toggle the selection state of a single row.
|
|
37
55
|
* This is usefull for example when you want to select a row when clicking on it, instead of the checkbox.
|
|
38
56
|
*/
|
|
39
|
-
toggleRowSelectionState: (id: TData[
|
|
40
|
-
}
|
|
41
|
-
export interface TableSelectionProps<TData extends selectableTableData> {
|
|
42
|
-
/**
|
|
43
|
-
* The data that is displayed in the table.
|
|
44
|
-
* This must have an `id` field, to enable selection.
|
|
45
|
-
* The same data should be passed to the `data` prop of the `useTable` Hook.
|
|
46
|
-
*/
|
|
47
|
-
data: TData[];
|
|
48
|
-
/**
|
|
49
|
-
* An array of ids of the rows that should be selected by default.
|
|
50
|
-
* This is useful when you want to preselect rows, for example when editing an existing entity.
|
|
51
|
-
*/
|
|
52
|
-
defaultSelectedIds?: TData["id"][];
|
|
53
|
-
/**
|
|
54
|
-
* Whether or not to enable row selection.
|
|
55
|
-
* If set to `false`, the selection column will still be displayed, but the checkboxes will be disabled.
|
|
56
|
-
*/
|
|
57
|
-
enableRowSelection?: boolean;
|
|
57
|
+
toggleRowSelectionState: (id: TData[keyof TData]) => void;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
60
|
* `useTableSelection` is a custom hook that provides functionality for row selection in a table.
|
|
@@ -83,4 +83,4 @@ export interface TableSelectionProps<TData extends selectableTableData> {
|
|
|
83
83
|
* columns,
|
|
84
84
|
* });
|
|
85
85
|
*/
|
|
86
|
-
export declare const useTableSelection: <TData extends
|
|
86
|
+
export declare const useTableSelection: <TData extends SelectableTableData>({ data, idKey, defaultSelectedIds, enableRowSelection, }: TableSelectionProps<TData>) => TableSelectionReturn<TData>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export interface UseTableSelectionDemoComponentProps<TData extends
|
|
1
|
+
import { SelectableTableData, TableSelectionProps } from "./useTableSelection";
|
|
2
|
+
export interface UseTableSelectionDemoComponentProps<TData extends SelectableTableData> extends TableSelectionProps<TData> {
|
|
3
3
|
}
|
|
4
4
|
/**
|
|
5
5
|
* The `useTableSelection` Hook provides functionality for row selection in a table.
|
|
@@ -8,4 +8,4 @@ export interface UseTableSelectionDemoComponentProps<TData extends selectableTab
|
|
|
8
8
|
*
|
|
9
9
|
* It Also returns a `selectionColumn` object that can be used as a column definition in a table.
|
|
10
10
|
*/
|
|
11
|
-
export declare const UseTableSelectionDemoComponent: <TData extends
|
|
11
|
+
export declare const UseTableSelectionDemoComponent: <TData extends SelectableTableData>(props: UseTableSelectionDemoComponentProps<TData>) => import("react/jsx-runtime").JSX.Element;
|