@bsol-oss/react-datatable5 12.0.0-beta.87 → 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 +13 -5
- package/dist/index.js +258 -161
- package/dist/index.mjs +258 -162
- 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/components/Form/SchemaFormContext.d.ts +1 -1
- package/dist/types/components/Form/components/core/FormRoot.d.ts +2 -2
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -602,12 +602,104 @@ const Pagination = () => {
|
|
|
602
602
|
}, children: jsxRuntime.jsxs(react.HStack, { children: [jsxRuntime.jsx(PaginationPrevTrigger, {}), jsxRuntime.jsx(PaginationItems, {}), jsxRuntime.jsx(PaginationNextTrigger, {})] }) }));
|
|
603
603
|
};
|
|
604
604
|
|
|
605
|
+
/**
|
|
606
|
+
* Custom selector utilities to replace TanStack table selector primitives.
|
|
607
|
+
* These work directly with rowSelection state instead of using table's built-in selectors.
|
|
608
|
+
*/
|
|
609
|
+
/**
|
|
610
|
+
* Get all selected rows from the table based on rowSelection state
|
|
611
|
+
*/
|
|
612
|
+
function getSelectedRows(table, rowSelection) {
|
|
613
|
+
const selectedRowIds = Object.keys(rowSelection).filter((id) => rowSelection[id] === true);
|
|
614
|
+
return table
|
|
615
|
+
.getRowModel()
|
|
616
|
+
.rows.filter((row) => selectedRowIds.includes(row.id));
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Get the count of selected rows
|
|
620
|
+
*/
|
|
621
|
+
function getSelectedRowCount(table, rowSelection) {
|
|
622
|
+
return getSelectedRows(table, rowSelection).length;
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Check if a specific row is selected
|
|
626
|
+
*/
|
|
627
|
+
function isRowSelected(rowId, rowSelection) {
|
|
628
|
+
return rowSelection[rowId] === true;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Check if all rows in the table are selected
|
|
632
|
+
*/
|
|
633
|
+
function areAllRowsSelected(table, rowSelection) {
|
|
634
|
+
const rows = table.getRowModel().rows;
|
|
635
|
+
if (rows.length === 0)
|
|
636
|
+
return false;
|
|
637
|
+
return rows.every((row) => isRowSelected(row.id, rowSelection));
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Check if all rows on the current page are selected
|
|
641
|
+
*/
|
|
642
|
+
function areAllPageRowsSelected(table, rowSelection) {
|
|
643
|
+
const pageRows = table.getRowModel().rows;
|
|
644
|
+
if (pageRows.length === 0)
|
|
645
|
+
return false;
|
|
646
|
+
return pageRows.every((row) => isRowSelected(row.id, rowSelection));
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Create a toggle handler for a specific row
|
|
650
|
+
*/
|
|
651
|
+
function createRowToggleHandler(row, rowSelection, setRowSelection) {
|
|
652
|
+
return () => {
|
|
653
|
+
setRowSelection((old) => {
|
|
654
|
+
const newSelection = { ...old };
|
|
655
|
+
if (newSelection[row.id]) {
|
|
656
|
+
delete newSelection[row.id];
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
newSelection[row.id] = true;
|
|
660
|
+
}
|
|
661
|
+
return newSelection;
|
|
662
|
+
});
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Create a toggle handler for all rows
|
|
667
|
+
*/
|
|
668
|
+
function createToggleAllRowsHandler(table, rowSelection, setRowSelection) {
|
|
669
|
+
return () => {
|
|
670
|
+
const allSelected = areAllRowsSelected(table, rowSelection);
|
|
671
|
+
if (allSelected) {
|
|
672
|
+
// Deselect all
|
|
673
|
+
setRowSelection({});
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
// Select all
|
|
677
|
+
const newSelection = {};
|
|
678
|
+
table.getRowModel().rows.forEach((row) => {
|
|
679
|
+
newSelection[row.id] = true;
|
|
680
|
+
});
|
|
681
|
+
setRowSelection(newSelection);
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Reset row selection (clear all selections)
|
|
687
|
+
*/
|
|
688
|
+
function resetRowSelection(setRowSelection) {
|
|
689
|
+
setRowSelection({});
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Check if a row can be selected (always true for now, can be extended)
|
|
693
|
+
*/
|
|
694
|
+
function canRowSelect(row) {
|
|
695
|
+
return row.getCanSelect?.() ?? true;
|
|
696
|
+
}
|
|
697
|
+
|
|
605
698
|
const ResetSelectionButton = () => {
|
|
606
|
-
const {
|
|
607
|
-
const { tableLabel } = useDataTableContext();
|
|
699
|
+
const { tableLabel, setRowSelection } = useDataTableContext();
|
|
608
700
|
const { resetSelection } = tableLabel;
|
|
609
701
|
return (jsxRuntime.jsx(react.Button, { onClick: () => {
|
|
610
|
-
|
|
702
|
+
resetRowSelection(setRowSelection);
|
|
611
703
|
}, children: resetSelection }));
|
|
612
704
|
};
|
|
613
705
|
|
|
@@ -2683,20 +2775,20 @@ const GlobalFilter = () => {
|
|
|
2683
2775
|
} }) }) }));
|
|
2684
2776
|
};
|
|
2685
2777
|
|
|
2686
|
-
const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText =
|
|
2687
|
-
const { table } = useDataTableContext();
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
table.getToggleAllRowsSelectedHandler()(event);
|
|
2692
|
-
}, children: [table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, table.getIsAllRowsSelected() ? clearAllText : selectAllText] }))] }));
|
|
2778
|
+
const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText = '', clearAllText = '', }) => {
|
|
2779
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2780
|
+
const allRowsSelected = areAllRowsSelected(table, rowSelection);
|
|
2781
|
+
const toggleHandler = createToggleAllRowsHandler(table, rowSelection, setRowSelection);
|
|
2782
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!selectAllText === false && (jsxRuntime.jsx(react.IconButton, { variant: 'ghost', "aria-label": allRowsSelected ? clearAllText : selectAllText, onClick: toggleHandler, children: allRowsSelected ? clearAllIcon : selectAllIcon })), !!selectAllText !== false && (jsxRuntime.jsxs(react.Button, { variant: 'ghost', onClick: toggleHandler, children: [allRowsSelected ? clearAllIcon : selectAllIcon, allRowsSelected ? clearAllText : selectAllText] }))] }));
|
|
2693
2783
|
};
|
|
2694
2784
|
|
|
2695
2785
|
const TableSelector = () => {
|
|
2696
|
-
const { table } = useDataTableContext();
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2786
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2787
|
+
const selectedCount = getSelectedRowCount(table, rowSelection);
|
|
2788
|
+
const allPageRowsSelected = areAllPageRowsSelected(table, rowSelection);
|
|
2789
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [selectedCount > 0 && (jsxRuntime.jsxs(react.Button, { onClick: () => { }, variant: 'ghost', display: 'flex', gap: "0.25rem", children: [jsxRuntime.jsx(react.Box, { fontSize: 'sm', children: `${selectedCount}` }), jsxRuntime.jsx(io.IoMdCheckbox, {})] })), !allPageRowsSelected && jsxRuntime.jsx(SelectAllRowsToggle, {}), selectedCount > 0 && (jsxRuntime.jsx(react.IconButton, { variant: 'ghost', onClick: () => {
|
|
2790
|
+
resetRowSelection(setRowSelection);
|
|
2791
|
+
}, "aria-label": 'reset selection', children: jsxRuntime.jsx(md.MdClear, {}) }))] }));
|
|
2700
2792
|
};
|
|
2701
2793
|
|
|
2702
2794
|
const TableFilterTags = () => {
|
|
@@ -2893,7 +2985,7 @@ const Checkbox = React__namespace.forwardRef(function Checkbox(props, ref) {
|
|
|
2893
2985
|
});
|
|
2894
2986
|
|
|
2895
2987
|
const TableBody = ({ showSelector = false, canResize = true, }) => {
|
|
2896
|
-
|
|
2988
|
+
'use no memo';
|
|
2897
2989
|
const { table } = useDataTableContext();
|
|
2898
2990
|
const SELECTION_BOX_WIDTH = 20;
|
|
2899
2991
|
const [hoveredRow, setHoveredRow] = React.useState(-1);
|
|
@@ -2904,9 +2996,9 @@ const TableBody = ({ showSelector = false, canResize = true, }) => {
|
|
|
2904
2996
|
const tdProps = cell.column.getIsPinned()
|
|
2905
2997
|
? {
|
|
2906
2998
|
left: showSelector
|
|
2907
|
-
? `${cell.column.getStart(
|
|
2908
|
-
: `${cell.column.getStart(
|
|
2909
|
-
position:
|
|
2999
|
+
? `${cell.column.getStart('left') + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
3000
|
+
: `${cell.column.getStart('left')}px`,
|
|
3001
|
+
position: 'relative',
|
|
2910
3002
|
}
|
|
2911
3003
|
: {};
|
|
2912
3004
|
return tdProps;
|
|
@@ -2917,37 +3009,40 @@ const TableBody = ({ showSelector = false, canResize = true, }) => {
|
|
|
2917
3009
|
}
|
|
2918
3010
|
if (hoveredRow === index) {
|
|
2919
3011
|
return {
|
|
2920
|
-
opacity:
|
|
3012
|
+
opacity: '1',
|
|
2921
3013
|
};
|
|
2922
3014
|
}
|
|
2923
3015
|
return {
|
|
2924
|
-
opacity:
|
|
3016
|
+
opacity: '0.8',
|
|
2925
3017
|
};
|
|
2926
3018
|
};
|
|
2927
3019
|
return (jsxRuntime.jsx(react.Table.Body, { children: table.getRowModel().rows.map((row, index) => {
|
|
2928
|
-
return (jsxRuntime.jsxs(react.Table.Row, { display:
|
|
3020
|
+
return (jsxRuntime.jsxs(react.Table.Row, { display: 'flex', zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), ...getTrProps({ hoveredRow, index }), children: [showSelector && (jsxRuntime.jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow })), row.getVisibleCells().map((cell, index) => {
|
|
2929
3021
|
return (jsxRuntime.jsx(react.Table.Cell, { padding: `${table.getDensityValue()}px`,
|
|
2930
3022
|
// styling resize and pinning start
|
|
2931
|
-
flex: `${canResize ?
|
|
3023
|
+
flex: `${canResize ? '0' : '1'} 0 ${cell.column.getSize()}px`,
|
|
2932
3024
|
// this is to avoid the cell from being too wide
|
|
2933
3025
|
minWidth: `0`, color: {
|
|
2934
|
-
base:
|
|
2935
|
-
_dark:
|
|
3026
|
+
base: 'colorPalette.900',
|
|
3027
|
+
_dark: 'colorPalette.100',
|
|
2936
3028
|
},
|
|
2937
|
-
bg: { base:
|
|
3029
|
+
bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, ...getTdProps(cell), children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-rowcell-${cell.id}-${index}`));
|
|
2938
3030
|
})] }, `chakra-table-row-${row.id}`));
|
|
2939
3031
|
}) }));
|
|
2940
3032
|
};
|
|
2941
|
-
const TableRowSelector = ({ row
|
|
2942
|
-
const { table } = useDataTableContext();
|
|
3033
|
+
const TableRowSelector = ({ row }) => {
|
|
3034
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2943
3035
|
const SELECTION_BOX_WIDTH = 20;
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
3036
|
+
const isSelected = isRowSelected(row.id, rowSelection);
|
|
3037
|
+
const canSelect = canRowSelect(row);
|
|
3038
|
+
const toggleHandler = createRowToggleHandler(row, rowSelection, setRowSelection);
|
|
3039
|
+
return (jsxRuntime.jsx(react.Table.Cell, { padding: `${table.getDensityValue()}px`, display: 'grid', color: {
|
|
3040
|
+
base: 'colorPalette.900',
|
|
3041
|
+
_dark: 'colorPalette.100',
|
|
2947
3042
|
},
|
|
2948
|
-
bg: { base:
|
|
2949
|
-
disabled: !
|
|
2950
|
-
onCheckedChange:
|
|
3043
|
+
bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, justifyItems: 'center', alignItems: 'center', children: jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, checked: isSelected,
|
|
3044
|
+
disabled: !canSelect,
|
|
3045
|
+
onCheckedChange: toggleHandler }) }));
|
|
2951
3046
|
};
|
|
2952
3047
|
|
|
2953
3048
|
const TableCardContainer = ({ children, variant = "", gap = "1rem", gridTemplateColumns = "repeat(auto-fit, minmax(20rem, 1fr))", direction = "row", ...props }) => {
|
|
@@ -2961,16 +3056,16 @@ const DefaultCardTitle = () => {
|
|
|
2961
3056
|
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
2962
3057
|
};
|
|
2963
3058
|
const TableCards = ({ isSelectable = false, showDisplayNameOnly = false, renderTitle = DefaultCardTitle, cardBodyProps = {}, }) => {
|
|
2964
|
-
const { table } = useDataTableContext();
|
|
3059
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2965
3060
|
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getRowModel().rows.map((row) => {
|
|
2966
|
-
return (jsxRuntime.jsx(react.Card.Root, { flex:
|
|
2967
|
-
disabled: !row
|
|
3061
|
+
return (jsxRuntime.jsx(react.Card.Root, { flex: '1 0 20rem', children: jsxRuntime.jsxs(react.Card.Body, { display: 'flex', flexFlow: 'column', gap: '0.5rem', ...cardBodyProps, children: [isSelectable && (jsxRuntime.jsx(Checkbox, { isChecked: isRowSelected(row.id, rowSelection),
|
|
3062
|
+
disabled: !canRowSelect(row),
|
|
2968
3063
|
// indeterminate: row.getIsSomeSelected(),
|
|
2969
|
-
onChange: row
|
|
2970
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(react.Box, { children: [showDisplayNameOnly && (jsxRuntime.jsx(react.Text, { fontWeight:
|
|
3064
|
+
onChange: createRowToggleHandler(row, rowSelection, setRowSelection) })), renderTitle(row), jsxRuntime.jsx(react.Grid, { templateColumns: 'auto 1fr', gap: '1rem', children: row.getVisibleCells().map((cell) => {
|
|
3065
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(react.Box, { children: [showDisplayNameOnly && (jsxRuntime.jsx(react.Text, { fontWeight: 'bold', children: cell.column.columnDef.meta?.displayName ??
|
|
2971
3066
|
cell.column.id })), !showDisplayNameOnly && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: reactTable.flexRender(cell.column.columnDef.header,
|
|
2972
3067
|
// @ts-expect-error Assuming the CellContext interface is the same as HeaderContext
|
|
2973
|
-
cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsxRuntime.jsx(react.Box, { justifySelf:
|
|
3068
|
+
cell.getContext()) }))] }, `chakra-table-cardcolumnid-${row.id}`), jsxRuntime.jsx(react.Box, { justifySelf: 'end', children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, `chakra-table-cardcolumn-${row.id}`)] }));
|
|
2974
3069
|
}) })] }) }, `chakra-table-card-${row.id}`));
|
|
2975
3070
|
}) }));
|
|
2976
3071
|
};
|
|
@@ -2983,7 +3078,7 @@ const TableComponent = ({ render = () => {
|
|
|
2983
3078
|
};
|
|
2984
3079
|
|
|
2985
3080
|
const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
|
|
2986
|
-
const table = useDataTableContext()
|
|
3081
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
2987
3082
|
const SELECTION_BOX_WIDTH = 20;
|
|
2988
3083
|
const [hoveredCheckBox, setHoveredCheckBox] = React.useState(false);
|
|
2989
3084
|
const handleRowHover = (isHovered) => {
|
|
@@ -2993,7 +3088,7 @@ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
|
|
|
2993
3088
|
if (alwaysShowSelector) {
|
|
2994
3089
|
return true;
|
|
2995
3090
|
}
|
|
2996
|
-
if (table
|
|
3091
|
+
if (areAllRowsSelected(table, rowSelection)) {
|
|
2997
3092
|
return true;
|
|
2998
3093
|
}
|
|
2999
3094
|
if (hoveredCheckBox) {
|
|
@@ -3001,22 +3096,22 @@ const TableFooter = ({ showSelector = false, alwaysShowSelector = true, }) => {
|
|
|
3001
3096
|
}
|
|
3002
3097
|
return false;
|
|
3003
3098
|
};
|
|
3004
|
-
return (jsxRuntime.jsx(react.Table.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display:
|
|
3005
|
-
// indeterminate: table
|
|
3006
|
-
onChange: table
|
|
3099
|
+
return (jsxRuntime.jsx(react.Table.Footer, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: 'flex', children: [showSelector && (jsxRuntime.jsxs(react.Table.Header, { padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: 'grid', children: [isCheckBoxVisible() && (jsxRuntime.jsx(react.Box, { margin: '0rem', display: 'grid', justifyItems: 'center', alignItems: 'center', children: jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: areAllRowsSelected(table, rowSelection),
|
|
3100
|
+
// indeterminate: areSomeRowsSelected(table, rowSelection),
|
|
3101
|
+
onChange: createToggleAllRowsHandler(table, rowSelection, setRowSelection) }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react.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) => (jsxRuntime.jsx(react.Table.Cell, { padding: '0', columnSpan: `${header.colSpan}`,
|
|
3007
3102
|
// styling resize and pinning start
|
|
3008
|
-
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display:
|
|
3103
|
+
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, display: 'grid', children: jsxRuntime.jsx(react.MenuRoot, { children: jsxRuntime.jsx(react.MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Box, { padding: `${table.getDensityValue()}px`, display: 'flex', alignItems: 'center', justifyContent: 'start', borderRadius: '0rem', children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: 'center', children: [header.isPlaceholder
|
|
3009
3104
|
? null
|
|
3010
|
-
: reactTable.flexRender(header.column.columnDef.footer, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && jsxRuntime.jsx(jsxRuntime.Fragment, {}), header.column.getIsSorted() ===
|
|
3105
|
+
: reactTable.flexRender(header.column.columnDef.footer, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && jsxRuntime.jsx(jsxRuntime.Fragment, {}), header.column.getIsSorted() === 'asc' && (jsxRuntime.jsx(bi.BiUpArrow, {})), header.column.getIsSorted() === 'desc' && (jsxRuntime.jsx(bi.BiDownArrow, {}))] })) })] }) }) }) }) }, `chakra-table-footer-${header.column.id}-${footerGroup.id}`)))] }, `chakra-table-footergroup-${footerGroup.id}`))) }));
|
|
3011
3106
|
};
|
|
3012
3107
|
|
|
3013
3108
|
// Default text values
|
|
3014
3109
|
const DEFAULT_HEADER_TEXTS = {
|
|
3015
|
-
pinColumn:
|
|
3016
|
-
cancelPin:
|
|
3017
|
-
sortAscending:
|
|
3018
|
-
sortDescending:
|
|
3019
|
-
clearSorting:
|
|
3110
|
+
pinColumn: 'Pin Column',
|
|
3111
|
+
cancelPin: 'Cancel Pin',
|
|
3112
|
+
sortAscending: 'Sort Ascending',
|
|
3113
|
+
sortDescending: 'Sort Descending',
|
|
3114
|
+
clearSorting: 'Clear Sorting',
|
|
3020
3115
|
};
|
|
3021
3116
|
/**
|
|
3022
3117
|
* TableHeader component with configurable text strings.
|
|
@@ -3049,7 +3144,7 @@ const DEFAULT_HEADER_TEXTS = {
|
|
|
3049
3144
|
* ];
|
|
3050
3145
|
*/
|
|
3051
3146
|
const TableHeader = ({ canResize = true, showSelector = false, isSticky = true, tableHeaderProps = {}, tableRowProps = {}, defaultTexts = {}, }) => {
|
|
3052
|
-
const { table } = useDataTableContext();
|
|
3147
|
+
const { table, rowSelection, setRowSelection } = useDataTableContext();
|
|
3053
3148
|
const SELECTION_BOX_WIDTH = 20;
|
|
3054
3149
|
// Merge default texts with provided defaults
|
|
3055
3150
|
const mergedDefaultTexts = { ...DEFAULT_HEADER_TEXTS, ...defaultTexts };
|
|
@@ -3062,58 +3157,105 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
|
|
|
3062
3157
|
const thProps = header.column.getIsPinned()
|
|
3063
3158
|
? {
|
|
3064
3159
|
left: showSelector
|
|
3065
|
-
? `${header.getStart(
|
|
3066
|
-
: `${header.getStart(
|
|
3067
|
-
position:
|
|
3160
|
+
? `${header.getStart('left') + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
3161
|
+
: `${header.getStart('left')}px`,
|
|
3162
|
+
position: 'sticky',
|
|
3068
3163
|
zIndex: 100 + 1,
|
|
3069
3164
|
}
|
|
3070
3165
|
: {};
|
|
3071
3166
|
return thProps;
|
|
3072
3167
|
};
|
|
3073
3168
|
const stickyProps = {
|
|
3074
|
-
position:
|
|
3169
|
+
position: 'sticky',
|
|
3075
3170
|
top: 0,
|
|
3076
3171
|
};
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3172
|
+
const handleAutoSize = (header, event) => {
|
|
3173
|
+
const headerElement = event.currentTarget.closest('th');
|
|
3174
|
+
if (!headerElement)
|
|
3175
|
+
return;
|
|
3176
|
+
// Find the table container
|
|
3177
|
+
const tableContainer = headerElement.closest('[role="table"]') ||
|
|
3178
|
+
headerElement.closest('table') ||
|
|
3179
|
+
headerElement.closest('div');
|
|
3180
|
+
if (!tableContainer)
|
|
3181
|
+
return;
|
|
3182
|
+
// Calculate the actual column index accounting for selector column
|
|
3183
|
+
const columnIndex = header.index;
|
|
3184
|
+
const actualColumnIndex = showSelector ? columnIndex + 1 : columnIndex;
|
|
3185
|
+
// Get all rows (header and body) - Chakra UI Table uses flex layout
|
|
3186
|
+
const rows = Array.from(tableContainer.querySelectorAll('[role="row"], tr'));
|
|
3187
|
+
let maxWidth = 0;
|
|
3188
|
+
// Measure all cells in this column
|
|
3189
|
+
rows.forEach((row) => {
|
|
3190
|
+
// Get all cells in the row (td, th, or Chakra Table.Cell/Table.ColumnHeader)
|
|
3191
|
+
const cells = Array.from(row.children);
|
|
3192
|
+
const cell = cells[actualColumnIndex];
|
|
3193
|
+
if (cell) {
|
|
3194
|
+
// Create a temporary clone to measure content without constraints
|
|
3195
|
+
const clone = cell.cloneNode(true);
|
|
3196
|
+
clone.style.position = 'absolute';
|
|
3197
|
+
clone.style.visibility = 'hidden';
|
|
3198
|
+
clone.style.width = 'auto';
|
|
3199
|
+
clone.style.maxWidth = 'none';
|
|
3200
|
+
clone.style.whiteSpace = 'nowrap';
|
|
3201
|
+
clone.style.flex = 'none';
|
|
3202
|
+
document.body.appendChild(clone);
|
|
3203
|
+
const width = clone.scrollWidth;
|
|
3204
|
+
maxWidth = Math.max(maxWidth, width);
|
|
3205
|
+
document.body.removeChild(clone);
|
|
3206
|
+
}
|
|
3207
|
+
});
|
|
3208
|
+
// Add padding for better UX (density padding + some extra space)
|
|
3209
|
+
const padding = table.getDensityValue() * 2 + 4;
|
|
3210
|
+
const minSize = header.column.columnDef.minSize || 10;
|
|
3211
|
+
const finalWidth = Math.max(maxWidth + padding, minSize);
|
|
3212
|
+
// Set the column size - setSize exists on column but may not be fully typed in @tanstack/react-table
|
|
3213
|
+
console.log('finalWidth', finalWidth);
|
|
3214
|
+
table.setColumnSizing((current) => ({
|
|
3215
|
+
...current,
|
|
3216
|
+
[header.id]: finalWidth,
|
|
3217
|
+
}));
|
|
3218
|
+
};
|
|
3219
|
+
return (jsxRuntime.jsx(react.Table.Header, { ...(isSticky ? stickyProps : {}), bgColor: 'transparent', ...tableHeaderProps, children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsxs(react.Table.Row, { display: 'flex', bgColor: 'transparent', ...tableRowProps, children: [showSelector && (jsxRuntime.jsx(react.Table.ColumnHeader, { padding: `${table.getDensityValue()}px`, display: 'grid', color: {
|
|
3220
|
+
base: 'colorPalette.900',
|
|
3221
|
+
_dark: 'colorPalette.100',
|
|
3080
3222
|
},
|
|
3081
|
-
bg: { base:
|
|
3082
|
-
// indeterminate: table
|
|
3083
|
-
onChange: table
|
|
3223
|
+
bg: { base: 'colorPalette.50', _dark: 'colorPalette.950' }, justifyItems: 'center', alignItems: 'center', children: jsxRuntime.jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, checked: areAllRowsSelected(table, rowSelection),
|
|
3224
|
+
// indeterminate: areSomeRowsSelected(table, rowSelection),
|
|
3225
|
+
onChange: createToggleAllRowsHandler(table, rowSelection, setRowSelection) }) })), headerGroup.headers.map((header) => {
|
|
3084
3226
|
const resizeProps = {
|
|
3085
3227
|
onMouseDown: header.getResizeHandler(),
|
|
3086
3228
|
onTouchStart: header.getResizeHandler(),
|
|
3087
|
-
cursor:
|
|
3229
|
+
cursor: 'col-resize',
|
|
3088
3230
|
};
|
|
3089
3231
|
return (jsxRuntime.jsxs(react.Table.ColumnHeader, { padding: 0, columnSpan: `${header.colSpan}`,
|
|
3090
3232
|
// styling resize and pinning start
|
|
3091
|
-
flex: `${canResize ?
|
|
3092
|
-
base:
|
|
3093
|
-
_dark:
|
|
3233
|
+
flex: `${canResize ? '0' : '1'} 0 ${header.column.getSize()}px`, display: 'grid', gridTemplateColumns: '1fr auto', zIndex: 1500 + header.index, color: {
|
|
3234
|
+
base: 'colorPalette.800',
|
|
3235
|
+
_dark: 'colorPalette.200',
|
|
3094
3236
|
},
|
|
3095
|
-
bg: { base:
|
|
3096
|
-
base:
|
|
3097
|
-
_dark:
|
|
3237
|
+
bg: { base: 'colorPalette.100', _dark: 'colorPalette.900' }, ...getThProps(header), children: [jsxRuntime.jsxs(MenuRoot, { children: [jsxRuntime.jsx(MenuTrigger, { asChild: true, children: jsxRuntime.jsx(react.Flex, { padding: `${table.getDensityValue()}px`, alignItems: 'center', justifyContent: 'start', borderRadius: '0rem', overflow: 'auto', color: {
|
|
3238
|
+
base: 'colorPalette.800',
|
|
3239
|
+
_dark: 'colorPalette.200',
|
|
3098
3240
|
_hover: {
|
|
3099
|
-
base:
|
|
3100
|
-
_dark:
|
|
3241
|
+
base: 'colorPalette.700',
|
|
3242
|
+
_dark: 'colorPalette.300',
|
|
3101
3243
|
},
|
|
3102
3244
|
},
|
|
3103
3245
|
bg: {
|
|
3104
|
-
base:
|
|
3105
|
-
_dark:
|
|
3246
|
+
base: 'colorPalette.100',
|
|
3247
|
+
_dark: 'colorPalette.900',
|
|
3106
3248
|
_hover: {
|
|
3107
|
-
base:
|
|
3108
|
-
_dark:
|
|
3249
|
+
base: 'colorPalette.200',
|
|
3250
|
+
_dark: 'colorPalette.800',
|
|
3109
3251
|
},
|
|
3110
|
-
}, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems:
|
|
3252
|
+
}, children: jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: 'center', children: [header.isPlaceholder
|
|
3111
3253
|
? null
|
|
3112
|
-
: reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && jsxRuntime.jsx(jsxRuntime.Fragment, {}), header.column.getIsSorted() ===
|
|
3113
|
-
header.column.pin(
|
|
3114
|
-
}, children: [jsxRuntime.jsx(md.MdPushPin, {}), getHeaderText(header,
|
|
3254
|
+
: reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && jsxRuntime.jsx(jsxRuntime.Fragment, {}), header.column.getIsSorted() === 'asc' && (jsxRuntime.jsx(bi.BiUpArrow, {})), header.column.getIsSorted() === 'desc' && (jsxRuntime.jsx(bi.BiDownArrow, {}))] })) }), jsxRuntime.jsx(react.Box, { children: header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}) })] }) }) }), jsxRuntime.jsxs(MenuContent, { children: [!header.column.getIsPinned() && (jsxRuntime.jsx(MenuItem, { asChild: true, value: "pin-column", children: jsxRuntime.jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3255
|
+
header.column.pin('left');
|
|
3256
|
+
}, children: [jsxRuntime.jsx(md.MdPushPin, {}), getHeaderText(header, 'pinColumn')] }) })), header.column.getIsPinned() && (jsxRuntime.jsx(MenuItem, { asChild: true, value: "cancel-pin", children: jsxRuntime.jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3115
3257
|
header.column.pin(false);
|
|
3116
|
-
}, children: [jsxRuntime.jsx(md.MdCancel, {}), getHeaderText(header,
|
|
3258
|
+
}, children: [jsxRuntime.jsx(md.MdCancel, {}), getHeaderText(header, 'cancelPin')] }) })), header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(MenuItem, { asChild: true, value: "sort-ascend", children: jsxRuntime.jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3117
3259
|
table.setSorting((state) => {
|
|
3118
3260
|
return [
|
|
3119
3261
|
...state.filter((column) => {
|
|
@@ -3122,7 +3264,7 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
|
|
|
3122
3264
|
{ id: header.id, desc: false },
|
|
3123
3265
|
];
|
|
3124
3266
|
});
|
|
3125
|
-
}, children: [jsxRuntime.jsx(gr.GrAscend, {}), getHeaderText(header,
|
|
3267
|
+
}, children: [jsxRuntime.jsx(gr.GrAscend, {}), getHeaderText(header, 'sortAscending')] }) }), jsxRuntime.jsx(MenuItem, { asChild: true, value: "sort-descend", children: jsxRuntime.jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3126
3268
|
table.setSorting((state) => {
|
|
3127
3269
|
return [
|
|
3128
3270
|
...state.filter((column) => {
|
|
@@ -3131,14 +3273,16 @@ const TableHeader = ({ canResize = true, showSelector = false, isSticky = true,
|
|
|
3131
3273
|
{ id: header.id, desc: true },
|
|
3132
3274
|
];
|
|
3133
3275
|
});
|
|
3134
|
-
}, children: [jsxRuntime.jsx(gr.GrDescend, {}), getHeaderText(header,
|
|
3276
|
+
}, children: [jsxRuntime.jsx(gr.GrDescend, {}), getHeaderText(header, 'sortDescending')] }) }), header.column.getIsSorted() && (jsxRuntime.jsx(MenuItem, { asChild: true, value: "clear-sorting", children: jsxRuntime.jsxs(Button, { variant: 'ghost', onClick: () => {
|
|
3135
3277
|
header.column.clearSorting();
|
|
3136
|
-
}, children: [jsxRuntime.jsx(md.MdClear, {}), getHeaderText(header,
|
|
3137
|
-
?
|
|
3138
|
-
:
|
|
3278
|
+
}, children: [jsxRuntime.jsx(md.MdClear, {}), getHeaderText(header, 'clearSorting')] }) }))] }))] })] }), canResize && (jsxRuntime.jsx(react.Box, { borderRight: '0.2rem solid', borderRightColor: header.column.getIsResizing()
|
|
3279
|
+
? 'colorPalette.700'
|
|
3280
|
+
: 'transparent', position: 'relative', right: '0.1rem', width: '2px', height: '100%', userSelect: 'none', style: { touchAction: 'none' }, _hover: {
|
|
3139
3281
|
borderRightColor: header.column.getIsResizing()
|
|
3140
|
-
?
|
|
3141
|
-
:
|
|
3282
|
+
? 'colorPalette.700'
|
|
3283
|
+
: 'colorPalette.400',
|
|
3284
|
+
}, onDoubleClick: (e) => {
|
|
3285
|
+
handleAutoSize(header, e);
|
|
3142
3286
|
}, ...resizeProps }))] }, `chakra-table-header-${header.id}`));
|
|
3143
3287
|
})] }, `chakra-table-headergroup-${headerGroup.id}`))) }));
|
|
3144
3288
|
};
|
|
@@ -3627,7 +3771,7 @@ const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, childre
|
|
|
3627
3771
|
showSubmitButton: true,
|
|
3628
3772
|
showResetButton: true,
|
|
3629
3773
|
showTitle: true,
|
|
3630
|
-
}, requireConfirmation = false, dateTimePickerLabels, idPickerLabels, enumPickerLabels, filePickerLabels,
|
|
3774
|
+
}, requireConfirmation = false, dateTimePickerLabels, idPickerLabels, enumPickerLabels, filePickerLabels, insideDialog = false, }) => {
|
|
3631
3775
|
const [isSuccess, setIsSuccess] = React.useState(false);
|
|
3632
3776
|
const [isError, setIsError] = React.useState(false);
|
|
3633
3777
|
const [isSubmiting, setIsSubmiting] = React.useState(false);
|
|
@@ -3718,7 +3862,7 @@ const FormRoot = ({ schema, idMap, setIdMap, form, serverUrl, translate, childre
|
|
|
3718
3862
|
enumPickerLabels,
|
|
3719
3863
|
filePickerLabels,
|
|
3720
3864
|
ajvResolver: ajvResolver(schema),
|
|
3721
|
-
|
|
3865
|
+
insideDialog,
|
|
3722
3866
|
}, children: jsxRuntime.jsx(reactHookForm.FormProvider, { ...form, children: children }) }));
|
|
3723
3867
|
};
|
|
3724
3868
|
|
|
@@ -4179,7 +4323,7 @@ const DateRangePicker = ({ column, schema, prefix, }) => {
|
|
|
4179
4323
|
|
|
4180
4324
|
const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLimit = false, }) => {
|
|
4181
4325
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4182
|
-
const { enumPickerLabels,
|
|
4326
|
+
const { enumPickerLabels, insideDialog } = useSchemaContext();
|
|
4183
4327
|
const formI18n = useFormI18n(column, prefix);
|
|
4184
4328
|
const { required, variant } = schema;
|
|
4185
4329
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
@@ -4248,11 +4392,11 @@ const EnumPicker = ({ column, isMultiple = false, schema, prefix, showTotalAndLi
|
|
|
4248
4392
|
}, children: !!renderDisplay === true
|
|
4249
4393
|
? renderDisplay(enumValue)
|
|
4250
4394
|
: formI18n.t(enumValue) }, enumValue));
|
|
4251
|
-
}) })), jsxRuntime.jsxs(react.Combobox.Root, { collection: collection, value: currentValue, onValueChange: handleValueChange, onInputValueChange: handleInputValueChange, multiple: isMultiple, closeOnSelect: !isMultiple, openOnClick: true, invalid: !!errors[colLabel], width: "100%", positioning:
|
|
4395
|
+
}) })), jsxRuntime.jsxs(react.Combobox.Root, { collection: collection, value: currentValue, onValueChange: handleValueChange, onInputValueChange: handleInputValueChange, multiple: isMultiple, closeOnSelect: !isMultiple, openOnClick: true, invalid: !!errors[colLabel], width: "100%", positioning: insideDialog
|
|
4252
4396
|
? { strategy: 'fixed', hideWhenDetached: true }
|
|
4253
4397
|
: undefined, children: [jsxRuntime.jsxs(react.Combobox.Control, { children: [jsxRuntime.jsx(react.Combobox.Input, { placeholder: enumPickerLabels?.typeToSearch ?? formI18n.t('type_to_search') }), jsxRuntime.jsxs(react.Combobox.IndicatorGroup, { children: [!isMultiple && currentValue.length > 0 && (jsxRuntime.jsx(react.Combobox.ClearTrigger, { onClick: () => {
|
|
4254
4398
|
setValue(colLabel, '');
|
|
4255
|
-
} })), jsxRuntime.jsx(react.Combobox.Trigger, {})] })] }),
|
|
4399
|
+
} })), jsxRuntime.jsx(react.Combobox.Trigger, {})] })] }), insideDialog ? (jsxRuntime.jsx(react.Combobox.Positioner, { children: jsxRuntime.jsxs(react.Combobox.Content, { children: [showTotalAndLimit && (jsxRuntime.jsx(react.Text, { p: 2, fontSize: "sm", color: "fg.muted", children: `${enumPickerLabels?.total ?? formI18n.t('total')}: ${collection.items.length}` })), collection.items.length === 0 ? (jsxRuntime.jsx(react.Combobox.Empty, { children: enumPickerLabels?.emptySearchResult ??
|
|
4256
4400
|
formI18n.t('empty_search_result') })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: collection.items.map((item, index) => (jsxRuntime.jsxs(react.Combobox.Item, { item: item, children: [jsxRuntime.jsx(react.Combobox.ItemText, { children: item.label }), jsxRuntime.jsx(react.Combobox.ItemIndicator, {})] }, item.value ?? `item-${index}`))) }))] }) })) : (jsxRuntime.jsx(react.Portal, { children: jsxRuntime.jsx(react.Combobox.Positioner, { children: jsxRuntime.jsxs(react.Combobox.Content, { children: [showTotalAndLimit && (jsxRuntime.jsx(react.Text, { p: 2, fontSize: "sm", color: "fg.muted", children: `${enumPickerLabels?.total ?? formI18n.t('total')}: ${collection.items.length}` })), collection.items.length === 0 ? (jsxRuntime.jsx(react.Combobox.Empty, { children: enumPickerLabels?.emptySearchResult ??
|
|
4257
4401
|
formI18n.t('empty_search_result') })) : (jsxRuntime.jsx(jsxRuntime.Fragment, { children: collection.items.map((item, index) => (jsxRuntime.jsxs(react.Combobox.Item, { item: item, children: [jsxRuntime.jsx(react.Combobox.ItemText, { children: item.label }), jsxRuntime.jsx(react.Combobox.ItemIndicator, {})] }, item.value ?? `item-${index}`))) }))] }) }) }))] })] }));
|
|
4258
4402
|
};
|
|
@@ -5043,7 +5187,7 @@ const getTableData = async ({ serverUrl, in_table, searching = "", where = [], l
|
|
|
5043
5187
|
|
|
5044
5188
|
const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
5045
5189
|
const { watch, getValues, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
5046
|
-
const { serverUrl, idMap, setIdMap,
|
|
5190
|
+
const { serverUrl, idMap, setIdMap, idPickerLabels, insideDialog } = useSchemaContext();
|
|
5047
5191
|
const formI18n = useFormI18n(column, prefix);
|
|
5048
5192
|
const { required, gridColumn = 'span 12', gridRow = 'span 1', renderDisplay, foreign_key, } = schema;
|
|
5049
5193
|
const isRequired = required?.some((columnId) => columnId === column);
|
|
@@ -5120,60 +5264,6 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
5120
5264
|
enabled: true, // Always enabled for combobox
|
|
5121
5265
|
staleTime: 300000,
|
|
5122
5266
|
});
|
|
5123
|
-
// Query for currently selected items (to display them properly)
|
|
5124
|
-
// This query is needed for side effects (populating idMap) even though the result isn't directly used
|
|
5125
|
-
reactQuery.useQuery({
|
|
5126
|
-
queryKey: [
|
|
5127
|
-
`idpicker-default`,
|
|
5128
|
-
{
|
|
5129
|
-
form: parentSchema.title,
|
|
5130
|
-
column,
|
|
5131
|
-
id: isMultiple ? currentIds : currentId,
|
|
5132
|
-
},
|
|
5133
|
-
],
|
|
5134
|
-
queryFn: async () => {
|
|
5135
|
-
const queryId = currentId;
|
|
5136
|
-
const queryIds = currentIds;
|
|
5137
|
-
if (customQueryFn) {
|
|
5138
|
-
const { data, idMap } = await customQueryFn({
|
|
5139
|
-
searching: '',
|
|
5140
|
-
limit: isMultiple ? queryIds.length : 1,
|
|
5141
|
-
offset: 0,
|
|
5142
|
-
where: [{ id: column_ref, value: isMultiple ? queryIds : queryId }],
|
|
5143
|
-
});
|
|
5144
|
-
setIdMap((state) => {
|
|
5145
|
-
return { ...state, ...idMap };
|
|
5146
|
-
});
|
|
5147
|
-
return data;
|
|
5148
|
-
}
|
|
5149
|
-
if (!queryId && (!queryIds || queryIds.length === 0)) {
|
|
5150
|
-
return { data: [] };
|
|
5151
|
-
}
|
|
5152
|
-
const data = await getTableData({
|
|
5153
|
-
serverUrl,
|
|
5154
|
-
searching: '',
|
|
5155
|
-
in_table: table,
|
|
5156
|
-
where: [{ id: column_ref, value: isMultiple ? queryIds : queryId }],
|
|
5157
|
-
limit: isMultiple ? queryIds.length : 1,
|
|
5158
|
-
offset: 0,
|
|
5159
|
-
});
|
|
5160
|
-
const newMap = Object.fromEntries((data ?? { data: [] }).data.map((item) => {
|
|
5161
|
-
return [
|
|
5162
|
-
item[column_ref],
|
|
5163
|
-
{
|
|
5164
|
-
...item,
|
|
5165
|
-
},
|
|
5166
|
-
];
|
|
5167
|
-
}));
|
|
5168
|
-
setIdMap((state) => {
|
|
5169
|
-
return { ...state, ...newMap };
|
|
5170
|
-
});
|
|
5171
|
-
return data;
|
|
5172
|
-
},
|
|
5173
|
-
enabled: isMultiple
|
|
5174
|
-
? Array.isArray(currentIds) && currentIds.length > 0
|
|
5175
|
-
: !!currentId,
|
|
5176
|
-
});
|
|
5177
5267
|
const { isLoading, isFetching, data, isPending, isError } = query;
|
|
5178
5268
|
const dataList = data?.data ?? [];
|
|
5179
5269
|
// Check if we're currently searching (user typed but debounce hasn't fired yet)
|
|
@@ -5236,11 +5326,11 @@ const IdPicker = ({ column, schema, prefix, isMultiple = false, }) => {
|
|
|
5236
5326
|
}, children: !!renderDisplay === true
|
|
5237
5327
|
? renderDisplay(item)
|
|
5238
5328
|
: item[display_column] }, id));
|
|
5239
|
-
}) })), jsxRuntime.jsxs(react.Combobox.Root, { collection: collection, value: currentValue, onValueChange: handleValueChange, onInputValueChange: handleInputValueChange, multiple: isMultiple, closeOnSelect: !isMultiple, openOnClick: true, invalid: !!errors[colLabel], width: "100%", positioning:
|
|
5329
|
+
}) })), jsxRuntime.jsxs(react.Combobox.Root, { collection: collection, value: currentValue, onValueChange: handleValueChange, onInputValueChange: handleInputValueChange, multiple: isMultiple, closeOnSelect: !isMultiple, openOnClick: true, invalid: !!errors[colLabel], width: "100%", positioning: insideDialog
|
|
5240
5330
|
? { strategy: 'fixed', hideWhenDetached: true }
|
|
5241
5331
|
: undefined, children: [jsxRuntime.jsxs(react.Combobox.Control, { children: [jsxRuntime.jsx(react.Combobox.Input, { placeholder: idPickerLabels?.typeToSearch ?? formI18n.t('type_to_search') }), jsxRuntime.jsxs(react.Combobox.IndicatorGroup, { children: [(isFetching || isLoading || isPending) && jsxRuntime.jsx(react.Spinner, { size: "xs" }), isError && (jsxRuntime.jsx(react.Icon, { color: "fg.error", children: jsxRuntime.jsx(bi.BiError, {}) })), !isMultiple && currentValue.length > 0 && (jsxRuntime.jsx(react.Combobox.ClearTrigger, { onClick: () => {
|
|
5242
5332
|
setValue(colLabel, '');
|
|
5243
|
-
} })), jsxRuntime.jsx(react.Combobox.Trigger, {})] })] }),
|
|
5333
|
+
} })), jsxRuntime.jsx(react.Combobox.Trigger, {})] })] }), insideDialog ? (jsxRuntime.jsx(react.Combobox.Positioner, { children: jsxRuntime.jsx(react.Combobox.Content, { children: isError ? (jsxRuntime.jsx(react.Text, { p: 2, color: "fg.error", fontSize: "sm", children: formI18n.t('loading_failed') })) : isFetching || isLoading || isPending || isSearching ? (
|
|
5244
5334
|
// Show skeleton items to prevent UI shift
|
|
5245
5335
|
jsxRuntime.jsx(jsxRuntime.Fragment, { children: Array.from({ length: 5 }).map((_, index) => (jsxRuntime.jsx(react.Flex, { p: 2, align: "center", gap: 2, children: jsxRuntime.jsx(react.Skeleton, { height: "20px", flex: "1" }) }, `skeleton-${index}`))) })) : collection.items.length === 0 ? (jsxRuntime.jsx(react.Combobox.Empty, { children: searchText
|
|
5246
5336
|
? idPickerLabels?.emptySearchResult ??
|
|
@@ -7283,7 +7373,7 @@ const DensityFeature = {
|
|
|
7283
7373
|
// define the new feature's initial state
|
|
7284
7374
|
getInitialState: (state) => {
|
|
7285
7375
|
return {
|
|
7286
|
-
density:
|
|
7376
|
+
density: 'sm',
|
|
7287
7377
|
...state,
|
|
7288
7378
|
};
|
|
7289
7379
|
},
|
|
@@ -7291,7 +7381,7 @@ const DensityFeature = {
|
|
|
7291
7381
|
getDefaultOptions: (table) => {
|
|
7292
7382
|
return {
|
|
7293
7383
|
enableDensity: true,
|
|
7294
|
-
onDensityChange: reactTable.makeStateUpdater(
|
|
7384
|
+
onDensityChange: reactTable.makeStateUpdater('density', table),
|
|
7295
7385
|
};
|
|
7296
7386
|
},
|
|
7297
7387
|
// if you need to add a default column definition...
|
|
@@ -7311,13 +7401,16 @@ const DensityFeature = {
|
|
|
7311
7401
|
table.setDensity((old) => {
|
|
7312
7402
|
if (value)
|
|
7313
7403
|
return value;
|
|
7314
|
-
if (old ===
|
|
7315
|
-
return
|
|
7404
|
+
if (old === 'xs') {
|
|
7405
|
+
return 'sm';
|
|
7406
|
+
}
|
|
7407
|
+
if (old === 'sm') {
|
|
7408
|
+
return 'md';
|
|
7316
7409
|
}
|
|
7317
|
-
if (old ===
|
|
7318
|
-
return
|
|
7410
|
+
if (old === 'md') {
|
|
7411
|
+
return 'lg';
|
|
7319
7412
|
}
|
|
7320
|
-
return
|
|
7413
|
+
return 'xs';
|
|
7321
7414
|
});
|
|
7322
7415
|
};
|
|
7323
7416
|
table.getDensityValue = (value) => {
|
|
@@ -7328,13 +7421,16 @@ const DensityFeature = {
|
|
|
7328
7421
|
else {
|
|
7329
7422
|
density = table.getState().density;
|
|
7330
7423
|
}
|
|
7331
|
-
if (density ===
|
|
7332
|
-
return
|
|
7424
|
+
if (density === 'xs') {
|
|
7425
|
+
return 2;
|
|
7426
|
+
}
|
|
7427
|
+
if (density === 'sm') {
|
|
7428
|
+
return 4;
|
|
7333
7429
|
}
|
|
7334
|
-
if (density ===
|
|
7335
|
-
return
|
|
7430
|
+
if (density === 'md') {
|
|
7431
|
+
return 8;
|
|
7336
7432
|
}
|
|
7337
|
-
return
|
|
7433
|
+
return 12;
|
|
7338
7434
|
};
|
|
7339
7435
|
},
|
|
7340
7436
|
// if you need to add row instance APIs...
|
|
@@ -7585,6 +7681,7 @@ exports.ResetFilteringButton = ResetFilteringButton;
|
|
|
7585
7681
|
exports.ResetSelectionButton = ResetSelectionButton;
|
|
7586
7682
|
exports.ResetSortingButton = ResetSortingButton;
|
|
7587
7683
|
exports.RowCountText = RowCountText;
|
|
7684
|
+
exports.SelectAllRowsToggle = SelectAllRowsToggle;
|
|
7588
7685
|
exports.Table = Table;
|
|
7589
7686
|
exports.TableBody = TableBody;
|
|
7590
7687
|
exports.TableCardContainer = TableCardContainer;
|