@bsol-oss/react-datatable5 12.0.0-beta.88 → 12.0.0-beta.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +11 -3
- package/dist/index.js +250 -99
- package/dist/index.mjs +250 -100
- package/dist/types/components/DataTable/controls/DensityFeature.d.ts +3 -3
- package/dist/types/components/DataTable/controls/SelectAllRowsToggle.d.ts +1 -1
- package/dist/types/components/DataTable/display/TableBody.d.ts +1 -1
- package/dist/types/components/DataTable/display/TableCards.d.ts +3 -3
- package/dist/types/components/DataTable/display/TableHeader.d.ts +1 -1
- package/dist/types/components/DataTable/utils/selectors.d.ts +53 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -582,12 +582,104 @@ const Pagination = () => {
|
|
|
582
582
|
}, children: jsxs(HStack, { children: [jsx(PaginationPrevTrigger, {}), jsx(PaginationItems, {}), jsx(PaginationNextTrigger, {})] }) }));
|
|
583
583
|
};
|
|
584
584
|
|
|
585
|
+
/**
|
|
586
|
+
* Custom selector utilities to replace TanStack table selector primitives.
|
|
587
|
+
* These work directly with rowSelection state instead of using table's built-in selectors.
|
|
588
|
+
*/
|
|
589
|
+
/**
|
|
590
|
+
* Get all selected rows from the table based on rowSelection state
|
|
591
|
+
*/
|
|
592
|
+
function getSelectedRows(table, rowSelection) {
|
|
593
|
+
const selectedRowIds = Object.keys(rowSelection).filter((id) => rowSelection[id] === true);
|
|
594
|
+
return table
|
|
595
|
+
.getRowModel()
|
|
596
|
+
.rows.filter((row) => selectedRowIds.includes(row.id));
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Get the count of selected rows
|
|
600
|
+
*/
|
|
601
|
+
function getSelectedRowCount(table, rowSelection) {
|
|
602
|
+
return getSelectedRows(table, rowSelection).length;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Check if a specific row is selected
|
|
606
|
+
*/
|
|
607
|
+
function isRowSelected(rowId, rowSelection) {
|
|
608
|
+
return rowSelection[rowId] === true;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Check if all rows in the table are selected
|
|
612
|
+
*/
|
|
613
|
+
function areAllRowsSelected(table, rowSelection) {
|
|
614
|
+
const rows = table.getRowModel().rows;
|
|
615
|
+
if (rows.length === 0)
|
|
616
|
+
return false;
|
|
617
|
+
return rows.every((row) => isRowSelected(row.id, rowSelection));
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Check if all rows on the current page are selected
|
|
621
|
+
*/
|
|
622
|
+
function areAllPageRowsSelected(table, rowSelection) {
|
|
623
|
+
const pageRows = table.getRowModel().rows;
|
|
624
|
+
if (pageRows.length === 0)
|
|
625
|
+
return false;
|
|
626
|
+
return pageRows.every((row) => isRowSelected(row.id, rowSelection));
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Create a toggle handler for a specific row
|
|
630
|
+
*/
|
|
631
|
+
function createRowToggleHandler(row, rowSelection, setRowSelection) {
|
|
632
|
+
return () => {
|
|
633
|
+
setRowSelection((old) => {
|
|
634
|
+
const newSelection = { ...old };
|
|
635
|
+
if (newSelection[row.id]) {
|
|
636
|
+
delete newSelection[row.id];
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
newSelection[row.id] = true;
|
|
640
|
+
}
|
|
641
|
+
return newSelection;
|
|
642
|
+
});
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Create a toggle handler for all rows
|
|
647
|
+
*/
|
|
648
|
+
function createToggleAllRowsHandler(table, rowSelection, setRowSelection) {
|
|
649
|
+
return () => {
|
|
650
|
+
const allSelected = areAllRowsSelected(table, rowSelection);
|
|
651
|
+
if (allSelected) {
|
|
652
|
+
// Deselect all
|
|
653
|
+
setRowSelection({});
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
// Select all
|
|
657
|
+
const newSelection = {};
|
|
658
|
+
table.getRowModel().rows.forEach((row) => {
|
|
659
|
+
newSelection[row.id] = true;
|
|
660
|
+
});
|
|
661
|
+
setRowSelection(newSelection);
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Reset row selection (clear all selections)
|
|
667
|
+
*/
|
|
668
|
+
function resetRowSelection(setRowSelection) {
|
|
669
|
+
setRowSelection({});
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Check if a row can be selected (always true for now, can be extended)
|
|
673
|
+
*/
|
|
674
|
+
function canRowSelect(row) {
|
|
675
|
+
return row.getCanSelect?.() ?? true;
|
|
676
|
+
}
|
|
677
|
+
|
|
585
678
|
const ResetSelectionButton = () => {
|
|
586
|
-
const {
|
|
587
|
-
const { tableLabel } = useDataTableContext();
|
|
679
|
+
const { tableLabel, setRowSelection } = useDataTableContext();
|
|
588
680
|
const { resetSelection } = tableLabel;
|
|
589
681
|
return (jsx(Button$1, { onClick: () => {
|
|
590
|
-
|
|
682
|
+
resetRowSelection(setRowSelection);
|
|
591
683
|
}, children: resetSelection }));
|
|
592
684
|
};
|
|
593
685
|
|
|
@@ -2663,20 +2755,20 @@ const GlobalFilter = () => {
|
|
|
2663
2755
|
} }) }) }));
|
|
2664
2756
|
};
|
|
2665
2757
|
|
|
2666
|
-
const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText =
|
|
2667
|
-
const { table } = useDataTableContext();
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
table.getToggleAllRowsSelectedHandler()(event);
|
|
2672
|
-
}, children: [table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, table.getIsAllRowsSelected() ? clearAllText : selectAllText] }))] }));
|
|
2758
|
+
const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText = '', clearAllText = '', }) => {
|
|
2759
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2760
|
+
const allRowsSelected = areAllRowsSelected(table, rowSelection);
|
|
2761
|
+
const toggleHandler = createToggleAllRowsHandler(table, rowSelection, setRowSelection);
|
|
2762
|
+
return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { variant: 'ghost', "aria-label": allRowsSelected ? clearAllText : selectAllText, onClick: toggleHandler, children: allRowsSelected ? clearAllIcon : selectAllIcon })), !!selectAllText !== false && (jsxs(Button$1, { variant: 'ghost', onClick: toggleHandler, children: [allRowsSelected ? clearAllIcon : selectAllIcon, allRowsSelected ? clearAllText : selectAllText] }))] }));
|
|
2673
2763
|
};
|
|
2674
2764
|
|
|
2675
2765
|
const TableSelector = () => {
|
|
2676
|
-
const { table } = useDataTableContext();
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2766
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2767
|
+
const selectedCount = getSelectedRowCount(table, rowSelection);
|
|
2768
|
+
const allPageRowsSelected = areAllPageRowsSelected(table, rowSelection);
|
|
2769
|
+
return (jsxs(Fragment, { children: [selectedCount > 0 && (jsxs(Button$1, { onClick: () => { }, variant: 'ghost', display: 'flex', gap: "0.25rem", children: [jsx(Box, { fontSize: 'sm', children: `${selectedCount}` }), jsx(IoMdCheckbox, {})] })), !allPageRowsSelected && jsx(SelectAllRowsToggle, {}), selectedCount > 0 && (jsx(IconButton, { variant: 'ghost', onClick: () => {
|
|
2770
|
+
resetRowSelection(setRowSelection);
|
|
2771
|
+
}, "aria-label": 'reset selection', children: jsx(MdClear, {}) }))] }));
|
|
2680
2772
|
};
|
|
2681
2773
|
|
|
2682
2774
|
const TableFilterTags = () => {
|
|
@@ -2873,7 +2965,7 @@ const Checkbox = React.forwardRef(function Checkbox(props, ref) {
|
|
|
2873
2965
|
});
|
|
2874
2966
|
|
|
2875
2967
|
const TableBody = ({ showSelector = false, canResize = true, }) => {
|
|
2876
|
-
|
|
2968
|
+
'use no memo';
|
|
2877
2969
|
const { table } = useDataTableContext();
|
|
2878
2970
|
const SELECTION_BOX_WIDTH = 20;
|
|
2879
2971
|
const [hoveredRow, setHoveredRow] = useState(-1);
|
|
@@ -2884,9 +2976,9 @@ const TableBody = ({ showSelector = false, canResize = true, }) => {
|
|
|
2884
2976
|
const tdProps = cell.column.getIsPinned()
|
|
2885
2977
|
? {
|
|
2886
2978
|
left: showSelector
|
|
2887
|
-
? `${cell.column.getStart(
|
|
2888
|
-
: `${cell.column.getStart(
|
|
2889
|
-
position:
|
|
2979
|
+
? `${cell.column.getStart('left') + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
2980
|
+
: `${cell.column.getStart('left')}px`,
|
|
2981
|
+
position: 'relative',
|
|
2890
2982
|
}
|
|
2891
2983
|
: {};
|
|
2892
2984
|
return tdProps;
|
|
@@ -2897,37 +2989,40 @@ const TableBody = ({ showSelector = false, canResize = true, }) => {
|
|
|
2897
2989
|
}
|
|
2898
2990
|
if (hoveredRow === index) {
|
|
2899
2991
|
return {
|
|
2900
|
-
opacity:
|
|
2992
|
+
opacity: '1',
|
|
2901
2993
|
};
|
|
2902
2994
|
}
|
|
2903
2995
|
return {
|
|
2904
|
-
opacity:
|
|
2996
|
+
opacity: '0.8',
|
|
2905
2997
|
};
|
|
2906
2998
|
};
|
|
2907
2999
|
return (jsx(Table$1.Body, { children: table.getRowModel().rows.map((row, index) => {
|
|
2908
|
-
return (jsxs(Table$1.Row, { display:
|
|
3000
|
+
return (jsxs(Table$1.Row, { display: 'flex', zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), ...getTrProps({ hoveredRow, index }), children: [showSelector && (jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow })), row.getVisibleCells().map((cell, index) => {
|
|
2909
3001
|
return (jsx(Table$1.Cell, { padding: `${table.getDensityValue()}px`,
|
|
2910
3002
|
// styling resize and pinning start
|
|
2911
|
-
flex: `${canResize ?
|
|
3003
|
+
flex: `${canResize ? '0' : '1'} 0 ${cell.column.getSize()}px`,
|
|
2912
3004
|
// this is to avoid the cell from being too wide
|
|
2913
3005
|
minWidth: `0`, color: {
|
|
2914
|
-
base:
|
|
2915
|
-
_dark:
|
|
3006
|
+
base: 'colorPalette.900',
|
|
3007
|
+
_dark: 'colorPalette.100',
|
|
2916
3008
|
},
|
|
2917
|
-
bg: { base:
|
|
3009
|
+
bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, ...getTdProps(cell), children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-rowcell-${cell.id}-${index}`));
|
|
2918
3010
|
})] }, `chakra-table-row-${row.id}`));
|
|
2919
3011
|
}) }));
|
|
2920
3012
|
};
|
|
2921
|
-
const TableRowSelector = ({ row
|
|
2922
|
-
const { table } = useDataTableContext();
|
|
3013
|
+
const TableRowSelector = ({ row }) => {
|
|
3014
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2923
3015
|
const SELECTION_BOX_WIDTH = 20;
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
3016
|
+
const isSelected = isRowSelected(row.id, rowSelection);
|
|
3017
|
+
const canSelect = canRowSelect(row);
|
|
3018
|
+
const toggleHandler = createRowToggleHandler(row, rowSelection, setRowSelection);
|
|
3019
|
+
return (jsx(Table$1.Cell, { padding: `${table.getDensityValue()}px`, display: 'grid', color: {
|
|
3020
|
+
base: 'colorPalette.900',
|
|
3021
|
+
_dark: 'colorPalette.100',
|
|
2927
3022
|
},
|
|
2928
|
-
bg: { base:
|
|
2929
|
-
disabled: !
|
|
2930
|
-
onCheckedChange:
|
|
3023
|
+
bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, justifyItems: 'center', alignItems: 'center', children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, checked: isSelected,
|
|
3024
|
+
disabled: !canSelect,
|
|
3025
|
+
onCheckedChange: toggleHandler }) }));
|
|
2931
3026
|
};
|
|
2932
3027
|
|
|
2933
3028
|
const TableCardContainer = ({ children, variant = "", gap = "1rem", gridTemplateColumns = "repeat(auto-fit, minmax(20rem, 1fr))", direction = "row", ...props }) => {
|
|
@@ -2941,16 +3036,16 @@ const DefaultCardTitle = () => {
|
|
|
2941
3036
|
return jsx(Fragment, {});
|
|
2942
3037
|
};
|
|
2943
3038
|
const TableCards = ({ isSelectable = false, showDisplayNameOnly = false, renderTitle = DefaultCardTitle, cardBodyProps = {}, }) => {
|
|
2944
|
-
const { table } = useDataTableContext();
|
|
3039
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2945
3040
|
return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
|
|
2946
|
-
return (jsx(Card.Root, { flex:
|
|
2947
|
-
disabled: !row
|
|
3041
|
+
return (jsx(Card.Root, { flex: '1 0 20rem', children: jsxs(Card.Body, { display: 'flex', flexFlow: 'column', gap: '0.5rem', ...cardBodyProps, children: [isSelectable && (jsx(Checkbox, { isChecked: isRowSelected(row.id, rowSelection),
|
|
3042
|
+
disabled: !canRowSelect(row),
|
|
2948
3043
|
// indeterminate: row.getIsSomeSelected(),
|
|
2949
|
-
onChange: row
|
|
2950
|
-
return (jsxs(Fragment, { children: [jsxs(Box, { children: [showDisplayNameOnly && (jsx(Text, { fontWeight:
|
|
3044
|
+
onChange: createRowToggleHandler(row, rowSelection, setRowSelection) })), renderTitle(row), jsx(Grid, { templateColumns: 'auto 1fr', gap: '1rem', children: row.getVisibleCells().map((cell) => {
|
|
3045
|
+
return (jsxs(Fragment, { children: [jsxs(Box, { children: [showDisplayNameOnly && (jsx(Text, { fontWeight: 'bold', children: cell.column.columnDef.meta?.displayName ??
|
|
2951
3046
|
cell.column.id })), !showDisplayNameOnly && (jsx(Fragment, { children: flexRender(cell.column.columnDef.header,
|
|
2952
3047
|
// @ts-expect-error Assuming the CellContext interface is the same as HeaderContext
|
|
2953
|
-
cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsx(Box, { justifySelf:
|
|
3048
|
+
cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsx(Box, { justifySelf: 'end', children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`)] }));
|
|
2954
3049
|
}) })] }) }, `chakra-table-card-${row.id}`));
|
|
2955
3050
|
}) }));
|
|
2956
3051
|
};
|
|
@@ -2963,7 +3058,7 @@ const TableComponent = ({ render = () => {
|
|
|
2963
3058
|
};
|
|
2964
3059
|
|
|
2965
3060
|
const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
|
|
2966
|
-
const table = useDataTableContext()
|
|
3061
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2967
3062
|
const SELECTION_BOX_WIDTH = 20;
|
|
2968
3063
|
const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
|
|
2969
3064
|
const handleRowHover = (isHovered) => {
|
|
@@ -2973,7 +3068,7 @@ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
|
|
|
2973
3068
|
if (alwaysShowSelector) {
|
|
2974
3069
|
return true;
|
|
2975
3070
|
}
|
|
2976
|
-
if (table
|
|
3071
|
+
if (areAllRowsSelected(table, rowSelection)) {
|
|
2977
3072
|
return true;
|
|
2978
3073
|
}
|
|
2979
3074
|
if (hoveredCheckBox) {
|
|
@@ -2981,22 +3076,22 @@ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
|
|
|
2981
3076
|
}
|
|
2982
3077
|
return false;
|
|
2983
3078
|
};
|
|
2984
|
-
return (jsx(Table$1.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxs(Table$1.Row, { display:
|
|
2985
|
-
// indeterminate: table
|
|
2986
|
-
onChange: table
|
|
3079
|
+
return (jsx(Table$1.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxs(Table$1.Row, { display: 'flex', children: [showSelector && (jsxs(Table$1.Header, { padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: 'grid', children: [isCheckBoxVisible() && (jsx(Box, { margin: '0rem', display: 'grid', justifyItems: 'center', alignItems: 'center', children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: areAllRowsSelected(table, rowSelection),
|
|
3080
|
+
// indeterminate: areSomeRowsSelected(table, rowSelection),
|
|
3081
|
+
onChange: createToggleAllRowsHandler(table, rowSelection, setRowSelection) }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: '0rem', display: 'grid', justifyItems: 'center', alignItems: 'center', width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] })), footerGroup.headers.map((header) => (jsx(Table$1.Cell, { padding: '0', columnSpan: `${header.colSpan}`,
|
|
2987
3082
|
// styling resize and pinning start
|
|
2988
|
-
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display:
|
|
3083
|
+
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: 'grid', children: jsx(MenuRoot$1, { children: jsx(MenuTrigger$1, { asChild: true, children: jsx(Box, { padding: `${table.getDensityValue()}px`, display: 'flex', alignItems: 'center', justifyContent: 'start', borderRadius: '0rem', children: jsxs(Flex, { gap: "0.5rem", alignItems: 'center', children: [header.isPlaceholder
|
|
2989
3084
|
? null
|
|
2990
|
-
: flexRender(header.column.columnDef.footer, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && jsx(Fragment, {}), header.column.getIsSorted() ===
|
|
3085
|
+
: flexRender(header.column.columnDef.footer, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && jsx(Fragment, {}), header.column.getIsSorted() === 'asc' && (jsx(BiUpArrow, {})), header.column.getIsSorted() === 'desc' && (jsx(BiDownArrow, {}))] })) })] }) }) }) }) }, `chakra-table-footer-${header.column.id}-${footerGroup.id}`)))] }, `chakra-table-footergroup-${footerGroup.id}`))) }));
|
|
2991
3086
|
};
|
|
2992
3087
|
|
|
2993
3088
|
// Default text values
|
|
2994
3089
|
const DEFAULT_HEADER_TEXTS = {
|
|
2995
|
-
pinColumn:
|
|
2996
|
-
cancelPin:
|
|
2997
|
-
sortAscending:
|
|
2998
|
-
sortDescending:
|
|
2999
|
-
clearSorting:
|
|
3090
|
+
pinColumn: 'Pin Column',
|
|
3091
|
+
cancelPin: 'Cancel Pin',
|
|
3092
|
+
sortAscending: 'Sort Ascending',
|
|
3093
|
+
sortDescending: 'Sort Descending',
|
|
3094
|
+
clearSorting: 'Clear Sorting',
|
|
3000
3095
|
};
|
|
3001
3096
|
/**
|
|
3002
3097
|
* TableHeader component with configurable text strings.
|
|
@@ -3029,7 +3124,7 @@ const DEFAULT_HEADER_TEXTS = {
|
|
|
3029
3124
|
* ];
|
|
3030
3125
|
*/
|
|
3031
3126
|
const TableHeader = ({ canResize = true, showSelector = false, isSticky = true, tableHeaderProps = {}, tableRowProps = {}, defaultTexts = {}, }) => {
|
|
3032
|
-
const { table } = useDataTableContext();
|
|
3127
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
3033
3128
|
const SELECTION_BOX_WIDTH = 20;
|
|
3034
3129
|
// Merge default texts with provided defaults
|
|
3035
3130
|
const mergedDefaultTexts = { ...DEFAULT_HEADER_TEXTS, ...defaultTexts };
|
|
@@ -3042,58 +3137,105 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
|
|
|
3042
3137
|
const thProps = header.column.getIsPinned()
|
|
3043
3138
|
? {
|
|
3044
3139
|
left: showSelector
|
|
3045
|
-
? `${header.getStart(
|
|
3046
|
-
: `${header.getStart(
|
|
3047
|
-
position:
|
|
3140
|
+
? `${header.getStart('left') + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
3141
|
+
: `${header.getStart('left')}px`,
|
|
3142
|
+
position: 'sticky',
|
|
3048
3143
|
zIndex: 100 + 1,
|
|
3049
3144
|
}
|
|
3050
3145
|
: {};
|
|
3051
3146
|
return thProps;
|
|
3052
3147
|
};
|
|
3053
3148
|
const stickyProps = {
|
|
3054
|
-
position:
|
|
3149
|
+
position: 'sticky',
|
|
3055
3150
|
top: 0,
|
|
3056
3151
|
};
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3152
|
+
const handleAutoSize = (header, event) => {
|
|
3153
|
+
const headerElement = event.currentTarget.closest('th');
|
|
3154
|
+
if (!headerElement)
|
|
3155
|
+
return;
|
|
3156
|
+
// Find the table container
|
|
3157
|
+
const tableContainer = headerElement.closest('[role="table"]') ||
|
|
3158
|
+
headerElement.closest('table') ||
|
|
3159
|
+
headerElement.closest('div');
|
|
3160
|
+
if (!tableContainer)
|
|
3161
|
+
return;
|
|
3162
|
+
// Calculate the actual column index accounting for selector column
|
|
3163
|
+
const columnIndex = header.index;
|
|
3164
|
+
const actualColumnIndex = showSelector ? columnIndex + 1 : columnIndex;
|
|
3165
|
+
// Get all rows (header and body) - Chakra UI Table uses flex layout
|
|
3166
|
+
const rows = Array.from(tableContainer.querySelectorAll('[role="row"], tr'));
|
|
3167
|
+
let maxWidth = 0;
|
|
3168
|
+
// Measure all cells in this column
|
|
3169
|
+
rows.forEach((row) => {
|
|
3170
|
+
// Get all cells in the row (td, th, or Chakra Table.Cell/Table.ColumnHeader)
|
|
3171
|
+
const cells = Array.from(row.children);
|
|
3172
|
+
const cell = cells[actualColumnIndex];
|
|
3173
|
+
if (cell) {
|
|
3174
|
+
// Create a temporary clone to measure content without constraints
|
|
3175
|
+
const clone = cell.cloneNode(true);
|
|
3176
|
+
clone.style.position = 'absolute';
|
|
3177
|
+
clone.style.visibility = 'hidden';
|
|
3178
|
+
clone.style.width = 'auto';
|
|
3179
|
+
clone.style.maxWidth = 'none';
|
|
3180
|
+
clone.style.whiteSpace = 'nowrap';
|
|
3181
|
+
clone.style.flex = 'none';
|
|
3182
|
+
document.body.appendChild(clone);
|
|
3183
|
+
const width = clone.scrollWidth;
|
|
3184
|
+
maxWidth = Math.max(maxWidth, width);
|
|
3185
|
+
document.body.removeChild(clone);
|
|
3186
|
+
}
|
|
3187
|
+
});
|
|
3188
|
+
// Add padding for better UX (density padding + some extra space)
|
|
3189
|
+
const padding = table.getDensityValue() * 2 + 4;
|
|
3190
|
+
const minSize = header.column.columnDef.minSize || 10;
|
|
3191
|
+
const finalWidth = Math.max(maxWidth + padding, minSize);
|
|
3192
|
+
// Set the column size - setSize exists on column but may not be fully typed in @tanstack/react-table
|
|
3193
|
+
console.log('finalWidth', finalWidth);
|
|
3194
|
+
table.setColumnSizing((current) => ({
|
|
3195
|
+
...current,
|
|
3196
|
+
[header.id]: finalWidth,
|
|
3197
|
+
}));
|
|
3198
|
+
};
|
|
3199
|
+
return (jsx(Table$1.Header, { ...(isSticky ? stickyProps : {}), bgColor: 'transparent', ...tableHeaderProps, children: table.getHeaderGroups().map((headerGroup) => (jsxs(Table$1.Row, { display: 'flex', bgColor: 'transparent', ...tableRowProps, children: [showSelector && (jsx(Table$1.ColumnHeader, { padding: `${table.getDensityValue()}px`, display: 'grid', color: {
|
|
3200
|
+
base: 'colorPalette.900',
|
|
3201
|
+
_dark: 'colorPalette.100',
|
|
3060
3202
|
},
|
|
3061
|
-
bg: { base:
|
|
3062
|
-
// indeterminate: table
|
|
3063
|
-
onChange: table
|
|
3203
|
+
bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, justifyItems: 'center', alignItems: 'center', children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, checked: areAllRowsSelected(table, rowSelection),
|
|
3204
|
+
// indeterminate: areSomeRowsSelected(table, rowSelection),
|
|
3205
|
+
onChange: createToggleAllRowsHandler(table, rowSelection, setRowSelection) }) })), headerGroup.headers.map((header) => {
|
|
3064
3206
|
const resizeProps = {
|
|
3065
3207
|
onMouseDown: header.getResizeHandler(),
|
|
3066
3208
|
onTouchStart: header.getResizeHandler(),
|
|
3067
|
-
cursor:
|
|
3209
|
+
cursor: 'col-resize',
|
|
3068
3210
|
};
|
|
3069
3211
|
return (jsxs(Table$1.ColumnHeader, { padding: 0, columnSpan: `${header.colSpan}`,
|
|
3070
3212
|
// styling resize and pinning start
|
|
3071
|
-
flex: `${canResize ?
|
|
3072
|
-
base:
|
|
3073
|
-
_dark:
|
|
3213
|
+
flex: `${canResize ? '0' : '1'} 0 ${header.column.getSize()}px`, display: 'grid', gridTemplateColumns: '1fr auto', zIndex: 1500 + header.index, color: {
|
|
3214
|
+
base: 'colorPalette.800',
|
|
3215
|
+
_dark: 'colorPalette.200',
|
|
3074
3216
|
},
|
|
3075
|
-
bg: { base:
|
|
3076
|
-
base:
|
|
3077
|
-
_dark:
|
|
3217
|
+
bg: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, ...getThProps(header), children: [jsxs(MenuRoot, { children: [jsx(MenuTrigger, { asChild: true, children: jsx(Flex, { padding: `${table.getDensityValue()}px`, alignItems: 'center', justifyContent: 'start', borderRadius: '0rem', overflow: 'auto', color: {
|
|
3218
|
+
base: 'colorPalette.800',
|
|
3219
|
+
_dark: 'colorPalette.200',
|
|
3078
3220
|
_hover: {
|
|
3079
|
-
base:
|
|
3080
|
-
_dark:
|
|
3221
|
+
base: 'colorPalette.700',
|
|
3222
|
+
_dark: 'colorPalette.300',
|
|
3081
3223
|
},
|
|
3082
3224
|
},
|
|
3083
3225
|
bg: {
|
|
3084
|
-
base:
|
|
3085
|
-
_dark:
|
|
3226
|
+
base: 'colorPalette.100',
|
|
3227
|
+
_dark: 'colorPalette.900',
|
|
3086
3228
|
_hover: {
|
|
3087
|
-
base:
|
|
3088
|
-
_dark:
|
|
3229
|
+
base: 'colorPalette.200',
|
|
3230
|
+
_dark: 'colorPalette.800',
|
|
3089
3231
|
},
|
|
3090
|
-
}, children: jsxs(Flex, { gap: "0.5rem", alignItems:
|
|
3232
|
+
}, children: jsxs(Flex, { gap: "0.5rem", alignItems: 'center', children: [header.isPlaceholder
|
|
3091
3233
|
? null
|
|
3092
|
-
: flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && jsx(Fragment, {}), header.column.getIsSorted() ===
|
|
3093
|
-
header.column.pin(
|
|
3094
|
-
}, children: [jsx(MdPushPin, {}), getHeaderText(header,
|
|
3234
|
+
: flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && jsx(Fragment, {}), header.column.getIsSorted() === 'asc' && (jsx(BiUpArrow, {})), header.column.getIsSorted() === 'desc' && (jsx(BiDownArrow, {}))] })) }), jsx(Box, { children: header.column.getIsFiltered() && jsx(MdFilterListAlt, {}) })] }) }) }), jsxs(MenuContent, { children: [!header.column.getIsPinned() && (jsx(MenuItem, { asChild: true, value: "pin-column", children: jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3235
|
+
header.column.pin('left');
|
|
3236
|
+
}, children: [jsx(MdPushPin, {}), getHeaderText(header, 'pinColumn')] }) })), header.column.getIsPinned() && (jsx(MenuItem, { asChild: true, value: "cancel-pin", children: jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3095
3237
|
header.column.pin(false);
|
|
3096
|
-
}, children: [jsx(MdCancel, {}), getHeaderText(header,
|
|
3238
|
+
}, children: [jsx(MdCancel, {}), getHeaderText(header, 'cancelPin')] }) })), header.column.getCanSort() && (jsxs(Fragment, { children: [jsx(MenuItem, { asChild: true, value: "sort-ascend", children: jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3097
3239
|
table.setSorting((state) => {
|
|
3098
3240
|
return [
|
|
3099
3241
|
...state.filter((column) => {
|
|
@@ -3102,7 +3244,7 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
|
|
|
3102
3244
|
{ id: header.id, desc: false },
|
|
3103
3245
|
];
|
|
3104
3246
|
});
|
|
3105
|
-
}, children: [jsx(GrAscend, {}), getHeaderText(header,
|
|
3247
|
+
}, children: [jsx(GrAscend, {}), getHeaderText(header, 'sortAscending')] }) }), jsx(MenuItem, { asChild: true, value: "sort-descend", children: jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3106
3248
|
table.setSorting((state) => {
|
|
3107
3249
|
return [
|
|
3108
3250
|
...state.filter((column) => {
|
|
@@ -3111,14 +3253,16 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
|
|
|
3111
3253
|
{ id: header.id, desc: true },
|
|
3112
3254
|
];
|
|
3113
3255
|
});
|
|
3114
|
-
}, children: [jsx(GrDescend, {}), getHeaderText(header,
|
|
3256
|
+
}, children: [jsx(GrDescend, {}), getHeaderText(header, 'sortDescending')] }) }), header.column.getIsSorted() && (jsx(MenuItem, { asChild: true, value: "clear-sorting", children: jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3115
3257
|
header.column.clearSorting();
|
|
3116
|
-
}, children: [jsx(MdClear, {}), getHeaderText(header,
|
|
3117
|
-
?
|
|
3118
|
-
:
|
|
3258
|
+
}, children: [jsx(MdClear, {}), getHeaderText(header, 'clearSorting')] }) }))] }))] })] }), canResize && (jsx(Box, { borderRight: '0.2rem solid', borderRightColor: header.column.getIsResizing()
|
|
3259
|
+
? 'colorPalette.700'
|
|
3260
|
+
: 'transparent', position: 'relative', right: '0.1rem', width: '2px', height: '100%', userSelect: 'none', style: { touchAction: 'none' }, _hover: {
|
|
3119
3261
|
borderRightColor: header.column.getIsResizing()
|
|
3120
|
-
?
|
|
3121
|
-
:
|
|
3262
|
+
? 'colorPalette.700'
|
|
3263
|
+
: 'colorPalette.400',
|
|
3264
|
+
}, onDoubleClick: (e) => {
|
|
3265
|
+
handleAutoSize(header, e);
|
|
3122
3266
|
}, ...resizeProps }))] }, `chakra-table-header-${header.id}`));
|
|
3123
3267
|
})] }, `chakra-table-headergroup-${headerGroup.id}`))) }));
|
|
3124
3268
|
};
|
|
@@ -7209,7 +7353,7 @@ const DensityFeature = {
|
|
|
7209
7353
|
// define the new feature's initial state
|
|
7210
7354
|
getInitialState: (state) => {
|
|
7211
7355
|
return {
|
|
7212
|
-
density:
|
|
7356
|
+
density: 'sm',
|
|
7213
7357
|
...state,
|
|
7214
7358
|
};
|
|
7215
7359
|
},
|
|
@@ -7217,7 +7361,7 @@ const DensityFeature = {
|
|
|
7217
7361
|
getDefaultOptions: (table) => {
|
|
7218
7362
|
return {
|
|
7219
7363
|
enableDensity: true,
|
|
7220
|
-
onDensityChange: makeStateUpdater(
|
|
7364
|
+
onDensityChange: makeStateUpdater('density', table),
|
|
7221
7365
|
};
|
|
7222
7366
|
},
|
|
7223
7367
|
// if you need to add a default column definition...
|
|
@@ -7237,13 +7381,16 @@ const DensityFeature = {
|
|
|
7237
7381
|
table.setDensity((old) => {
|
|
7238
7382
|
if (value)
|
|
7239
7383
|
return value;
|
|
7240
|
-
if (old ===
|
|
7241
|
-
return
|
|
7384
|
+
if (old === 'xs') {
|
|
7385
|
+
return 'sm';
|
|
7242
7386
|
}
|
|
7243
|
-
if (old ===
|
|
7244
|
-
return
|
|
7387
|
+
if (old === 'sm') {
|
|
7388
|
+
return 'md';
|
|
7245
7389
|
}
|
|
7246
|
-
|
|
7390
|
+
if (old === 'md') {
|
|
7391
|
+
return 'lg';
|
|
7392
|
+
}
|
|
7393
|
+
return 'xs';
|
|
7247
7394
|
});
|
|
7248
7395
|
};
|
|
7249
7396
|
table.getDensityValue = (value) => {
|
|
@@ -7254,13 +7401,16 @@ const DensityFeature = {
|
|
|
7254
7401
|
else {
|
|
7255
7402
|
density = table.getState().density;
|
|
7256
7403
|
}
|
|
7257
|
-
if (density ===
|
|
7258
|
-
return
|
|
7404
|
+
if (density === 'xs') {
|
|
7405
|
+
return 2;
|
|
7259
7406
|
}
|
|
7260
|
-
if (density ===
|
|
7261
|
-
return
|
|
7407
|
+
if (density === 'sm') {
|
|
7408
|
+
return 4;
|
|
7409
|
+
}
|
|
7410
|
+
if (density === 'md') {
|
|
7411
|
+
return 8;
|
|
7262
7412
|
}
|
|
7263
|
-
return
|
|
7413
|
+
return 12;
|
|
7264
7414
|
};
|
|
7265
7415
|
},
|
|
7266
7416
|
// if you need to add row instance APIs...
|
|
@@ -7485,4 +7635,4 @@ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSel
|
|
|
7485
7635
|
}, children: jsx(DataTableServerContext.Provider, { value: { url, query }, children: children }) }));
|
|
7486
7636
|
}
|
|
7487
7637
|
|
|
7488
|
-
export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultForm, DefaultTable, DefaultTableServer, DensityToggleButton, EditSortingButton, EmptyState, ErrorAlert, FilterDialog, FormBody, FormRoot, FormTitle, GlobalFilter, MediaLibraryBrowser, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableDataDisplay, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, buildErrorMessages, buildFieldErrors, buildRequiredErrors, convertToAjvErrorsFormat, createErrorMessage, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
|
|
7638
|
+
export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultForm, DefaultTable, DefaultTableServer, DensityToggleButton, EditSortingButton, EmptyState, ErrorAlert, FilterDialog, FormBody, FormRoot, FormTitle, GlobalFilter, MediaLibraryBrowser, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, SelectAllRowsToggle, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableDataDisplay, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, buildErrorMessages, buildFieldErrors, buildRequiredErrors, convertToAjvErrorsFormat, createErrorMessage, getColumns, getMultiDates, getRangeDates, idPickerSanityCheck, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { OnChangeFn, Updater, RowData, TableFeature } from
|
|
2
|
-
export type DensityState =
|
|
1
|
+
import { OnChangeFn, Updater, RowData, TableFeature } from '@tanstack/react-table';
|
|
2
|
+
export type DensityState = 'xs' | 'sm' | 'md' | 'lg';
|
|
3
3
|
export interface DensityTableState {
|
|
4
4
|
density: DensityState;
|
|
5
5
|
}
|
|
@@ -12,7 +12,7 @@ export interface DensityInstance {
|
|
|
12
12
|
toggleDensity: (value?: DensityState) => void;
|
|
13
13
|
getDensityValue: (value?: DensityState) => number;
|
|
14
14
|
}
|
|
15
|
-
declare module
|
|
15
|
+
declare module '@tanstack/react-table' {
|
|
16
16
|
interface TableState extends DensityTableState {
|
|
17
17
|
}
|
|
18
18
|
interface TableOptionsResolved<TData extends RowData> extends DensityOptions {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { CardBodyProps } from
|
|
2
|
-
import { Row } from
|
|
3
|
-
import { ReactNode } from
|
|
1
|
+
import { CardBodyProps } from '@chakra-ui/react';
|
|
2
|
+
import { Row } from '@tanstack/react-table';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
4
|
export interface TableCardsProps<TData> {
|
|
5
5
|
isSelectable?: boolean;
|
|
6
6
|
showDisplayNameOnly?: boolean;
|