react-restyle-components 0.4.39 → 0.4.41
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/lib/index.js +3 -1
- package/lib/src/core-components/index.js +1 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/Accordion.js +15 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionContext.js +6 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionSection.js +39 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/Header.js +39 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/elements.js +94 -57
- package/lib/src/core-components/src/components/Accordion/AccordionSection/hooks/useCurrentAccordionIndex.js +13 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/index.js +3 -1
- package/lib/src/core-components/src/components/Accordion/AccordionSection/types.js +9 -1
- package/lib/src/core-components/src/components/Accordion/Collapsible/Collapsible2.component.js +249 -1
- package/lib/src/core-components/src/components/Action/types.js +8 -1
- package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +45 -1
- package/lib/src/core-components/src/components/AlertBanner/elements.js +120 -45
- package/lib/src/core-components/src/components/AlertBanner/index.js +2 -1
- package/lib/src/core-components/src/components/AlertBanner/types.js +10 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-group-by-multiple-select-multiple-fields-display/auto-complete-filter-group-by-multiple-select-multiple-fields-display.component.js +334 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-multi-fields-display-drag-drop/auto-complete-filter-multi-select-multi-fields-display-drag-drop.component.js +229 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-selected-top-display/auto-complete-filter-multi-select-selected-top-display.component.js +174 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multiple-select-multiple-fields-display/auto-complete-filter-multiple-select-multiple-fields-display.component.js +129 -2
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +55 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.js +308 -2
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +115 -1
- package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +442 -2
- package/lib/src/core-components/src/components/AutoComplete/index.js +8 -1
- package/lib/src/core-components/src/components/Avatar/Avatar.js +148 -14
- package/lib/src/core-components/src/components/Badge/Badge.js +25 -2
- package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +25 -1
- package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +25 -1
- package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +78 -32
- package/lib/src/core-components/src/components/Badge/InnerBadge/index.js +1 -1
- package/lib/src/core-components/src/components/Badge/index.js +1 -1
- package/lib/src/core-components/src/components/Badge/types.js +5 -1
- package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -1
- package/lib/src/core-components/src/components/Breadcrumb/elements.js +166 -94
- package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -1
- package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -1
- package/lib/src/core-components/src/components/Button/button.component.js +18 -1
- package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +4 -1
- package/lib/src/core-components/src/components/Button/index.js +2 -1
- package/lib/src/core-components/src/components/Button/types.js +1 -1
- package/lib/src/core-components/src/components/Chip/Chip.js +64 -1
- package/lib/src/core-components/src/components/Chip/elements.js +148 -48
- package/lib/src/core-components/src/components/Chip/index.js +2 -1
- package/lib/src/core-components/src/components/Chip/types.js +4 -1
- package/lib/src/core-components/src/components/Divider/Divider.js +25 -1
- package/lib/src/core-components/src/components/Divider/elements.js +68 -31
- package/lib/src/core-components/src/components/Divider/index.js +2 -1
- package/lib/src/core-components/src/components/Divider/types.js +4 -1
- package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -1
- package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +24 -17
- package/lib/src/core-components/src/components/DynamicGrid/elements.js +162 -100
- package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -1
- package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -1
- package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -1
- package/lib/src/core-components/src/components/FormField/FormField.js +103 -1
- package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +37 -1
- package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +8 -1
- package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +192 -1
- package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +99 -1
- package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +70 -1
- package/lib/src/core-components/src/components/FormField/components/OtpInput.js +81 -1
- package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +40 -1
- package/lib/src/core-components/src/components/FormField/components/PinInput.js +75 -1
- package/lib/src/core-components/src/components/FormField/components/RadioInput.js +54 -1
- package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +94 -1
- package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +36 -1
- package/lib/src/core-components/src/components/FormField/components/index.js +11 -1
- package/lib/src/core-components/src/components/FormField/css-properties.js +161 -1
- package/lib/src/core-components/src/components/FormField/index.js +2 -1
- package/lib/src/core-components/src/components/Icon/Icon.js +79 -1
- package/lib/src/core-components/src/components/Icon/index.js +2 -1
- package/lib/src/core-components/src/components/Icon/types.js +9 -1
- package/lib/src/core-components/src/components/Loader/loader.component.js +215 -2
- package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -1
- package/lib/src/core-components/src/components/Masonry/elements.js +46 -29
- package/lib/src/core-components/src/components/Masonry/hooks.js +100 -1
- package/lib/src/core-components/src/components/Masonry/index.js +3 -1
- package/lib/src/core-components/src/components/Masonry/types.js +1 -1
- package/lib/src/core-components/src/components/Modal/BasicModal/modal.component.js +116 -1
- package/lib/src/core-components/src/components/Modal/index.js +2 -1
- package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +147 -1
- package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +12 -1
- package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +40 -1
- package/lib/src/core-components/src/components/Picker/index.js +2 -1
- package/lib/src/core-components/src/components/Selection/index.js +4 -1
- package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +49 -1
- package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +58 -1
- package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +43 -1
- package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +87 -1
- package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -1
- package/lib/src/core-components/src/components/Skeleton/elements.js +143 -54
- package/lib/src/core-components/src/components/Skeleton/index.js +2 -1
- package/lib/src/core-components/src/components/Skeleton/types.js +4 -1
- package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -1
- package/lib/src/core-components/src/components/SpeedDial/elements.js +132 -62
- package/lib/src/core-components/src/components/SpeedDial/index.js +2 -1
- package/lib/src/core-components/src/components/SpeedDial/types.js +3 -1
- package/lib/src/core-components/src/components/Stepper2/stepper.component.js +139 -1
- package/lib/src/core-components/src/components/Switch/Switch.js +26 -1
- package/lib/src/core-components/src/components/Switch/elements.js +103 -34
- package/lib/src/core-components/src/components/Switch/index.js +2 -1
- package/lib/src/core-components/src/components/Switch/types.js +3 -1
- package/lib/src/core-components/src/components/Table/Table.js +1357 -1
- package/lib/src/core-components/src/components/Table/columnReorder.d.ts +128 -0
- package/lib/src/core-components/src/components/Table/columnReorder.js +530 -0
- package/lib/src/core-components/src/components/Table/columnResize.d.ts +99 -0
- package/lib/src/core-components/src/components/Table/columnResize.js +399 -0
- package/lib/src/core-components/src/components/Table/elements.d.ts +9 -1
- package/lib/src/core-components/src/components/Table/elements.js +324 -155
- package/lib/src/core-components/src/components/Table/filters.js +555 -30
- package/lib/src/core-components/src/components/Table/hooks.js +536 -2
- package/lib/src/core-components/src/components/Table/index.d.ts +4 -0
- package/lib/src/core-components/src/components/Table/index.js +6 -1
- package/lib/src/core-components/src/components/Table/types.d.ts +58 -0
- package/lib/src/core-components/src/components/Table/types.js +1 -1
- package/lib/src/core-components/src/components/Tabs/tabs.component.js +22 -1
- package/lib/src/core-components/src/components/Tags1/Tags.component.js +118 -1
- package/lib/src/core-components/src/components/Tags1/types.js +20 -1
- package/lib/src/core-components/src/components/Timer1/timer.component.js +76 -1
- package/lib/src/core-components/src/components/Toast/Toast.js +50 -1
- package/lib/src/core-components/src/components/Toast/elements.js +122 -41
- package/lib/src/core-components/src/components/Toast/index.js +2 -1
- package/lib/src/core-components/src/components/Toast/types.js +9 -1
- package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -1
- package/lib/src/core-components/src/components/Tooltip/elements.js +117 -55
- package/lib/src/core-components/src/components/Tooltip/index.js +2 -1
- package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
- package/lib/src/core-components/src/components/Tooltip/utils.js +140 -1
- package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -1
- package/lib/src/core-components/src/components/TreeSelect/elements.js +216 -117
- package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -1
- package/lib/src/core-components/src/components/TreeSelect/index.js +3 -1
- package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
- package/lib/src/core-components/src/components/ag-grid/AgGrid.d.ts +11 -0
- package/lib/src/core-components/src/components/ag-grid/AgGrid.js +733 -0
- package/lib/src/core-components/src/components/ag-grid/elements.d.ts +246 -0
- package/lib/src/core-components/src/components/ag-grid/elements.js +1156 -0
- package/lib/src/core-components/src/components/ag-grid/hooks.d.ts +196 -0
- package/lib/src/core-components/src/components/ag-grid/hooks.js +943 -0
- package/lib/src/core-components/src/components/ag-grid/index.d.ts +9 -0
- package/lib/src/core-components/src/components/ag-grid/index.js +13 -0
- package/lib/src/core-components/src/components/ag-grid/types.d.ts +1367 -0
- package/lib/src/core-components/src/components/ag-grid/types.js +6 -0
- package/lib/src/core-components/src/components/index.d.ts +1 -0
- package/lib/src/core-components/src/components/index.js +31 -1
- package/lib/src/core-components/src/components/pdf/pdf-images.components.js +7 -1
- package/lib/src/core-components/src/components/pdf/pdf-table.components.js +48 -5
- package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +70 -1
- package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +50 -1
- package/lib/src/core-components/src/core-components/Avatar.js +33 -4
- package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +10 -1
- package/lib/src/core-components/src/core-components/CoreButton/elements.js +176 -67
- package/lib/src/core-components/src/core-components/CoreButton/index.js +3 -1
- package/lib/src/core-components/src/core-components/CoreButton/types.js +6 -1
- package/lib/src/core-components/src/core-components/CoreButton/utils.js +12 -1
- package/lib/src/core-components/src/core-components/Divider/Divider.js +19 -4
- package/lib/src/core-components/src/core-components/Divider/index.js +1 -1
- package/lib/src/core-components/src/core-components/SelectionCardStrip/index.js +1 -1
- package/lib/src/core-components/src/core-components/SelectionCardStrip/selectionCardStrip.js +33 -10
- package/lib/src/core-components/src/core-components/StateLayer.js +5 -3
- package/lib/src/core-components/src/core-components/ToggleCore/elements.js +50 -25
- package/lib/src/core-components/src/core-components/ToggleCore/index.js +2 -1
- package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +14 -1
- package/lib/src/core-components/src/core-components/atoms/Input/Input.js +22 -1
- package/lib/src/core-components/src/core-components/atoms/Label/Label.js +21 -1
- package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +19 -1
- package/lib/src/core-components/src/core-components/index.js +3 -1
- package/lib/src/core-components/src/helpers/constants.js +11 -1
- package/lib/src/core-components/src/hooks/index.js +1 -1
- package/lib/src/core-components/src/hooks/outside.hook.js +28 -1
- package/lib/src/core-components/src/index.js +12 -1
- package/lib/src/core-components/src/tc.global.css +16 -3
- package/lib/src/core-components/src/tc.module.css +2 -2
- package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +28 -1
- package/lib/src/core-components/src/utils/abstracts/colors/index.js +49 -1
- package/lib/src/core-components/src/utils/abstracts/index.js +5 -1
- package/lib/src/core-components/src/utils/abstracts/space/index.js +26 -1
- package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +8 -1
- package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +30 -1
- package/lib/src/core-components/src/utils/abstracts/theme/index.js +3 -1
- package/lib/src/core-components/src/utils/abstracts/theme/theme.js +30 -1
- package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
- package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +17 -1
- package/lib/src/core-components/src/utils/abstracts/typography/index.js +25 -1
- package/lib/src/core-components/src/utils/context/DefaultsProvider.js +8 -1
- package/lib/src/core-components/src/utils/context/InternalProvider.js +24 -1
- package/lib/src/core-components/src/utils/context/index.js +2 -1
- package/lib/src/core-components/src/utils/designTokens.js +125 -1
- package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +23 -1
- package/lib/src/core-components/src/utils/helpers/flattenChildren.js +11 -1
- package/lib/src/core-components/src/utils/helpers/getChildByType.js +3 -1
- package/lib/src/core-components/src/utils/helpers/index.js +5 -1
- package/lib/src/core-components/src/utils/helpers/isComponentType.js +16 -1
- package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +12 -1
- package/lib/src/core-components/src/utils/hooks/index.js +18 -1
- package/lib/src/core-components/src/utils/hooks/useClickOutside.js +18 -1
- package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +17 -1
- package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +12 -1
- package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +20 -1
- package/lib/src/core-components/src/utils/hooks/useDeprecation.js +40 -1
- package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +10 -1
- package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +24 -1
- package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +16 -1
- package/lib/src/core-components/src/utils/hooks/useHoverState.js +36 -1
- package/lib/src/core-components/src/utils/hooks/useId.js +7 -1
- package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +11 -1
- package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +16 -1
- package/lib/src/core-components/src/utils/hooks/useOverflow.js +22 -1
- package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +5 -1
- package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +18 -1
- package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +30 -1
- package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +23 -1
- package/lib/src/core-components/src/utils/index.js +9 -1
- package/lib/src/core-components/src/utils/stories/Wrappers.js +23 -8
- package/lib/src/core-components/src/utils/stories/cleanProps.js +5 -1
- package/lib/src/core-components/src/utils/stories/index.js +4 -1
- package/lib/src/core-components/src/utils/stories/sleep.js +4 -1
- package/lib/src/core-components/src/utils/stories/view-ports.js +50 -1
- package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +5 -1
- package/lib/src/core-components/src/utils/styling/createGridContainer.js +12 -6
- package/lib/src/core-components/src/utils/styling/createTransition.js +7 -2
- package/lib/src/core-components/src/utils/styling/forwardProps.js +10 -1
- package/lib/src/core-components/src/utils/styling/index.js +5 -1
- package/lib/src/core-components/src/utils/styling/pxToRem.js +6 -1
- package/lib/src/core-components/src/utils/testing/getComputedStyle.js +3 -1
- package/lib/src/core-components/src/utils/testing/index.js +1 -1
- package/lib/src/core-components/src/utils/utility.util.js +14 -1
- package/lib/src/core-components/tailwind.config.js +233 -1
- package/lib/src/core-hooks/index.js +3 -1
- package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +46 -1
- package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +30 -1
- package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +8 -1
- package/lib/src/core-utils/index.js +7 -1
- package/lib/src/core-utils/src/calculation/calculation.util.js +89 -1
- package/lib/src/core-utils/src/colors/color.util.js +15 -1
- package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +145 -1
- package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +5 -1
- package/lib/src/core-utils/src/form-helper/form-helper.util.js +82 -1
- package/lib/src/core-utils/src/index.js +7 -1
- package/lib/src/core-utils/src/utility/utility.util.js +12 -1
- package/lib/src/core-utils/src/uuid/uuid.util.js +8 -1
- package/package.json +1 -1
|
@@ -1,2 +1,536 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { useState, useCallback, useMemo, useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Debounce function for table
|
|
4
|
+
*/
|
|
5
|
+
export function useTableDebounce(value, delay) {
|
|
6
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const handler = setTimeout(() => {
|
|
9
|
+
setDebouncedValue(value);
|
|
10
|
+
}, delay);
|
|
11
|
+
return () => clearTimeout(handler);
|
|
12
|
+
}, [value, delay]);
|
|
13
|
+
return debouncedValue;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Hook for managing sort state
|
|
17
|
+
*/
|
|
18
|
+
export function useSortState(defaultSort, controlledSort, multiSort = false) {
|
|
19
|
+
const [internalSort, setInternalSort] = useState(defaultSort || { field: '', order: null });
|
|
20
|
+
const sort = controlledSort ?? internalSort;
|
|
21
|
+
const handleSort = useCallback((field, currentOrder) => {
|
|
22
|
+
let nextOrder;
|
|
23
|
+
if (sort.field !== field) {
|
|
24
|
+
nextOrder = 'asc';
|
|
25
|
+
}
|
|
26
|
+
else if (currentOrder === null) {
|
|
27
|
+
nextOrder = 'asc';
|
|
28
|
+
}
|
|
29
|
+
else if (currentOrder === 'asc') {
|
|
30
|
+
nextOrder = 'desc';
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
nextOrder = null;
|
|
34
|
+
}
|
|
35
|
+
const newSort = { field, order: nextOrder };
|
|
36
|
+
setInternalSort(newSort);
|
|
37
|
+
return newSort;
|
|
38
|
+
}, [sort.field]);
|
|
39
|
+
return { sort, handleSort, setSort: setInternalSort };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Hook for managing filter state
|
|
43
|
+
*/
|
|
44
|
+
export function useFilterState(defaultFilters, controlledFilters) {
|
|
45
|
+
const [internalFilters, setInternalFilters] = useState(defaultFilters || {});
|
|
46
|
+
const filters = controlledFilters ?? internalFilters;
|
|
47
|
+
const setFilter = useCallback((field, value) => {
|
|
48
|
+
setInternalFilters((prev) => {
|
|
49
|
+
if (value === undefined || value === null || value === '') {
|
|
50
|
+
const { [field]: _, ...rest } = prev;
|
|
51
|
+
return rest;
|
|
52
|
+
}
|
|
53
|
+
return { ...prev, [field]: value };
|
|
54
|
+
});
|
|
55
|
+
}, []);
|
|
56
|
+
const clearFilters = useCallback(() => {
|
|
57
|
+
setInternalFilters({});
|
|
58
|
+
}, []);
|
|
59
|
+
return { filters, setFilter, clearFilters, setFilters: setInternalFilters };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Hook for managing pagination state
|
|
63
|
+
*/
|
|
64
|
+
export function usePaginationState(defaultPage = 0, defaultPageSize = 10, totalSize = 0) {
|
|
65
|
+
const [page, setPage] = useState(defaultPage);
|
|
66
|
+
const [pageSize, setPageSize] = useState(defaultPageSize);
|
|
67
|
+
const totalPages = Math.ceil(totalSize / pageSize) || 1;
|
|
68
|
+
const goToPage = useCallback((newPage) => {
|
|
69
|
+
const validPage = Math.max(0, Math.min(newPage, totalPages - 1));
|
|
70
|
+
setPage(validPage);
|
|
71
|
+
}, [totalPages]);
|
|
72
|
+
const goToNextPage = useCallback(() => {
|
|
73
|
+
goToPage(page + 1);
|
|
74
|
+
}, [page, goToPage]);
|
|
75
|
+
const goToPrevPage = useCallback(() => {
|
|
76
|
+
goToPage(page - 1);
|
|
77
|
+
}, [page, goToPage]);
|
|
78
|
+
const goToFirstPage = useCallback(() => {
|
|
79
|
+
goToPage(0);
|
|
80
|
+
}, [goToPage]);
|
|
81
|
+
const goToLastPage = useCallback(() => {
|
|
82
|
+
goToPage(totalPages - 1);
|
|
83
|
+
}, [totalPages, goToPage]);
|
|
84
|
+
const changePageSize = useCallback((newSize) => {
|
|
85
|
+
setPageSize(newSize);
|
|
86
|
+
setPage(0); // Reset to first page
|
|
87
|
+
}, []);
|
|
88
|
+
return {
|
|
89
|
+
page,
|
|
90
|
+
pageSize,
|
|
91
|
+
totalPages,
|
|
92
|
+
goToPage,
|
|
93
|
+
goToNextPage,
|
|
94
|
+
goToPrevPage,
|
|
95
|
+
goToFirstPage,
|
|
96
|
+
goToLastPage,
|
|
97
|
+
changePageSize,
|
|
98
|
+
setPage,
|
|
99
|
+
setPageSize,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Hook for managing row selection
|
|
104
|
+
*/
|
|
105
|
+
export function useRowSelection(data, keyField = '_id', mode = 'none', controlledSelectedKeys, getCheckboxProps) {
|
|
106
|
+
const [internalSelected, setInternalSelected] = useState(new Set());
|
|
107
|
+
const selectedKeys = controlledSelectedKeys
|
|
108
|
+
? new Set(controlledSelectedKeys)
|
|
109
|
+
: internalSelected;
|
|
110
|
+
const isSelected = useCallback((key) => selectedKeys.has(key), [selectedKeys]);
|
|
111
|
+
const toggleRow = useCallback((row) => {
|
|
112
|
+
const key = row[keyField];
|
|
113
|
+
const props = getCheckboxProps?.(row);
|
|
114
|
+
if (props?.disabled)
|
|
115
|
+
return;
|
|
116
|
+
if (mode === 'single') {
|
|
117
|
+
setInternalSelected(new Set([key]));
|
|
118
|
+
return { selectedKeys: [key], selectedRows: [row] };
|
|
119
|
+
}
|
|
120
|
+
setInternalSelected((prev) => {
|
|
121
|
+
const next = new Set(prev);
|
|
122
|
+
if (next.has(key)) {
|
|
123
|
+
next.delete(key);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
next.add(key);
|
|
127
|
+
}
|
|
128
|
+
return next;
|
|
129
|
+
});
|
|
130
|
+
const newSelected = selectedKeys.has(key)
|
|
131
|
+
? Array.from(selectedKeys).filter((k) => k !== key)
|
|
132
|
+
: [...Array.from(selectedKeys), key];
|
|
133
|
+
return {
|
|
134
|
+
selectedKeys: newSelected,
|
|
135
|
+
selectedRows: data.filter((r) => newSelected.includes(r[keyField])),
|
|
136
|
+
};
|
|
137
|
+
}, [data, keyField, mode, selectedKeys, getCheckboxProps]);
|
|
138
|
+
const toggleAll = useCallback((selectAll) => {
|
|
139
|
+
if (selectAll) {
|
|
140
|
+
const selectableKeys = data
|
|
141
|
+
.filter((row) => {
|
|
142
|
+
const props = getCheckboxProps?.(row);
|
|
143
|
+
return !props?.disabled;
|
|
144
|
+
})
|
|
145
|
+
.map((row) => row[keyField]);
|
|
146
|
+
setInternalSelected(new Set(selectableKeys));
|
|
147
|
+
return {
|
|
148
|
+
selectedKeys: selectableKeys,
|
|
149
|
+
selectedRows: data.filter((r) => selectableKeys.includes(r[keyField])),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
setInternalSelected(new Set());
|
|
154
|
+
return { selectedKeys: [], selectedRows: [] };
|
|
155
|
+
}
|
|
156
|
+
}, [data, keyField, getCheckboxProps]);
|
|
157
|
+
const isAllSelected = useMemo(() => {
|
|
158
|
+
if (data.length === 0)
|
|
159
|
+
return false;
|
|
160
|
+
const selectableRows = data.filter((row) => {
|
|
161
|
+
const props = getCheckboxProps?.(row);
|
|
162
|
+
return !props?.disabled;
|
|
163
|
+
});
|
|
164
|
+
return selectableRows.every((row) => selectedKeys.has(row[keyField]));
|
|
165
|
+
}, [data, selectedKeys, keyField, getCheckboxProps]);
|
|
166
|
+
const isIndeterminate = useMemo(() => {
|
|
167
|
+
if (data.length === 0)
|
|
168
|
+
return false;
|
|
169
|
+
const selectableRows = data.filter((row) => {
|
|
170
|
+
const props = getCheckboxProps?.(row);
|
|
171
|
+
return !props?.disabled;
|
|
172
|
+
});
|
|
173
|
+
const selectedCount = selectableRows.filter((row) => selectedKeys.has(row[keyField])).length;
|
|
174
|
+
return selectedCount > 0 && selectedCount < selectableRows.length;
|
|
175
|
+
}, [data, selectedKeys, keyField, getCheckboxProps]);
|
|
176
|
+
const clearSelection = useCallback(() => {
|
|
177
|
+
setInternalSelected(new Set());
|
|
178
|
+
}, []);
|
|
179
|
+
return {
|
|
180
|
+
selectedKeys,
|
|
181
|
+
isSelected,
|
|
182
|
+
toggleRow,
|
|
183
|
+
toggleAll,
|
|
184
|
+
isAllSelected,
|
|
185
|
+
isIndeterminate,
|
|
186
|
+
clearSelection,
|
|
187
|
+
setSelected: setInternalSelected,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Hook for managing row expansion
|
|
192
|
+
*/
|
|
193
|
+
export function useRowExpansion(keyField = '_id', defaultExpandedKeys, controlledExpandedKeys, accordion = false) {
|
|
194
|
+
const [internalExpanded, setInternalExpanded] = useState(new Set(defaultExpandedKeys || []));
|
|
195
|
+
const expandedKeys = controlledExpandedKeys
|
|
196
|
+
? new Set(controlledExpandedKeys)
|
|
197
|
+
: internalExpanded;
|
|
198
|
+
const isExpanded = useCallback((key) => expandedKeys.has(key), [expandedKeys]);
|
|
199
|
+
const toggleExpand = useCallback((row) => {
|
|
200
|
+
const key = row[keyField];
|
|
201
|
+
setInternalExpanded((prev) => {
|
|
202
|
+
const next = accordion ? new Set() : new Set(prev);
|
|
203
|
+
if (prev.has(key)) {
|
|
204
|
+
next.delete(key);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
next.add(key);
|
|
208
|
+
}
|
|
209
|
+
return next;
|
|
210
|
+
});
|
|
211
|
+
const newExpanded = expandedKeys.has(key)
|
|
212
|
+
? Array.from(expandedKeys).filter((k) => k !== key)
|
|
213
|
+
: accordion
|
|
214
|
+
? [key]
|
|
215
|
+
: [...Array.from(expandedKeys), key];
|
|
216
|
+
return { expandedKeys: newExpanded, expanded: !expandedKeys.has(key), row };
|
|
217
|
+
}, [keyField, expandedKeys, accordion]);
|
|
218
|
+
return {
|
|
219
|
+
expandedKeys,
|
|
220
|
+
isExpanded,
|
|
221
|
+
toggleExpand,
|
|
222
|
+
setExpanded: setInternalExpanded,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Hook for managing column visibility
|
|
227
|
+
*/
|
|
228
|
+
export function useColumnVisibility(columns, storageKey) {
|
|
229
|
+
const [hiddenColumns, setHiddenColumns] = useState(() => {
|
|
230
|
+
// Load from storage if available
|
|
231
|
+
if (storageKey && typeof window !== 'undefined') {
|
|
232
|
+
const stored = localStorage.getItem(`table_columns_${storageKey}`);
|
|
233
|
+
if (stored) {
|
|
234
|
+
try {
|
|
235
|
+
return new Set(JSON.parse(stored));
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
// Ignore
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return new Set(columns.filter((c) => c.hidden).map((c) => c.dataField));
|
|
243
|
+
});
|
|
244
|
+
const visibleColumns = useMemo(() => columns.filter((c) => !hiddenColumns.has(c.dataField)), [columns, hiddenColumns]);
|
|
245
|
+
const toggleColumn = useCallback((dataField) => {
|
|
246
|
+
setHiddenColumns((prev) => {
|
|
247
|
+
const next = new Set(prev);
|
|
248
|
+
if (next.has(dataField)) {
|
|
249
|
+
next.delete(dataField);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
next.add(dataField);
|
|
253
|
+
}
|
|
254
|
+
// Save to storage
|
|
255
|
+
if (storageKey && typeof window !== 'undefined') {
|
|
256
|
+
localStorage.setItem(`table_columns_${storageKey}`, JSON.stringify(Array.from(next)));
|
|
257
|
+
}
|
|
258
|
+
return next;
|
|
259
|
+
});
|
|
260
|
+
}, [storageKey]);
|
|
261
|
+
const showAllColumns = useCallback(() => {
|
|
262
|
+
setHiddenColumns(new Set());
|
|
263
|
+
if (storageKey && typeof window !== 'undefined') {
|
|
264
|
+
localStorage.removeItem(`table_columns_${storageKey}`);
|
|
265
|
+
}
|
|
266
|
+
}, [storageKey]);
|
|
267
|
+
return {
|
|
268
|
+
hiddenColumns,
|
|
269
|
+
visibleColumns,
|
|
270
|
+
toggleColumn,
|
|
271
|
+
showAllColumns,
|
|
272
|
+
isColumnHidden: (field) => hiddenColumns.has(field),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Sort data locally
|
|
277
|
+
*/
|
|
278
|
+
export function sortData(data, sort, columns) {
|
|
279
|
+
if (!sort.field || !sort.order)
|
|
280
|
+
return data;
|
|
281
|
+
const column = columns.find((c) => c.dataField === sort.field);
|
|
282
|
+
if (!column)
|
|
283
|
+
return data;
|
|
284
|
+
const sorted = [...data].sort((a, b) => {
|
|
285
|
+
const aVal = getNestedValue(a, sort.field);
|
|
286
|
+
const bVal = getNestedValue(b, sort.field);
|
|
287
|
+
if (column.sortFunc) {
|
|
288
|
+
return column.sortFunc(aVal, bVal, sort.order, a, b);
|
|
289
|
+
}
|
|
290
|
+
// Default sorting
|
|
291
|
+
if (aVal === bVal)
|
|
292
|
+
return 0;
|
|
293
|
+
if (aVal === null || aVal === undefined)
|
|
294
|
+
return 1;
|
|
295
|
+
if (bVal === null || bVal === undefined)
|
|
296
|
+
return -1;
|
|
297
|
+
const comparison = typeof aVal === 'string'
|
|
298
|
+
? aVal.localeCompare(bVal)
|
|
299
|
+
: aVal < bVal
|
|
300
|
+
? -1
|
|
301
|
+
: 1;
|
|
302
|
+
return sort.order === 'asc' ? comparison : -comparison;
|
|
303
|
+
});
|
|
304
|
+
return sorted;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Filter data locally
|
|
308
|
+
*/
|
|
309
|
+
export function filterData(data, filters, columns, searchValue) {
|
|
310
|
+
let filtered = data;
|
|
311
|
+
// Apply column filters
|
|
312
|
+
for (const [field, value] of Object.entries(filters)) {
|
|
313
|
+
if (value === undefined || value === null || value === '')
|
|
314
|
+
continue;
|
|
315
|
+
const column = columns.find((c) => c.dataField === field);
|
|
316
|
+
if (!column)
|
|
317
|
+
continue;
|
|
318
|
+
filtered = filtered.filter((row) => {
|
|
319
|
+
const cellValue = getNestedValue(row, field);
|
|
320
|
+
if (typeof value === 'object' && value !== null) {
|
|
321
|
+
// Complex filter (number range, date range, etc.)
|
|
322
|
+
if ('number' in value && 'comparator' in value) {
|
|
323
|
+
return compareNumber(cellValue, value.number, value.comparator);
|
|
324
|
+
}
|
|
325
|
+
if ('startDate' in value) {
|
|
326
|
+
return compareDateRange(cellValue, value);
|
|
327
|
+
}
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
// Simple text filter
|
|
331
|
+
if (cellValue === null || cellValue === undefined)
|
|
332
|
+
return false;
|
|
333
|
+
return String(cellValue)
|
|
334
|
+
.toLowerCase()
|
|
335
|
+
.includes(String(value).toLowerCase());
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
// Apply global search
|
|
339
|
+
if (searchValue) {
|
|
340
|
+
const searchLower = searchValue.toLowerCase();
|
|
341
|
+
filtered = filtered.filter((row) => {
|
|
342
|
+
return columns.some((column) => {
|
|
343
|
+
const value = getNestedValue(row, column.dataField);
|
|
344
|
+
if (value === null || value === undefined)
|
|
345
|
+
return false;
|
|
346
|
+
return String(value).toLowerCase().includes(searchLower);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return filtered;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Paginate data locally
|
|
354
|
+
*/
|
|
355
|
+
export function paginateData(data, page, pageSize) {
|
|
356
|
+
const start = page * pageSize;
|
|
357
|
+
return data.slice(start, start + pageSize);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get nested value from object
|
|
361
|
+
*/
|
|
362
|
+
export function getNestedValue(obj, path) {
|
|
363
|
+
return path.split('.').reduce((acc, part) => acc?.[part], obj);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Compare numbers with comparator
|
|
367
|
+
*/
|
|
368
|
+
function compareNumber(value, filterValue, comparator) {
|
|
369
|
+
const num = parseFloat(value);
|
|
370
|
+
const filterNum = parseFloat(filterValue);
|
|
371
|
+
if (isNaN(num) || isNaN(filterNum))
|
|
372
|
+
return false;
|
|
373
|
+
switch (comparator) {
|
|
374
|
+
case '=':
|
|
375
|
+
return num === filterNum;
|
|
376
|
+
case '!=':
|
|
377
|
+
return num !== filterNum;
|
|
378
|
+
case '>':
|
|
379
|
+
return num > filterNum;
|
|
380
|
+
case '>=':
|
|
381
|
+
return num >= filterNum;
|
|
382
|
+
case '<':
|
|
383
|
+
return num < filterNum;
|
|
384
|
+
case '<=':
|
|
385
|
+
return num <= filterNum;
|
|
386
|
+
default:
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Compare date range
|
|
392
|
+
*/
|
|
393
|
+
function compareDateRange(value, filter) {
|
|
394
|
+
if (!value)
|
|
395
|
+
return false;
|
|
396
|
+
const date = new Date(value);
|
|
397
|
+
if (isNaN(date.getTime()))
|
|
398
|
+
return false;
|
|
399
|
+
if (filter.diffFlag && filter.startDate && filter.endDate) {
|
|
400
|
+
const start = new Date(filter.startDate);
|
|
401
|
+
const end = new Date(filter.endDate);
|
|
402
|
+
return date >= start && date <= end;
|
|
403
|
+
}
|
|
404
|
+
if (filter.startDate) {
|
|
405
|
+
const start = new Date(filter.startDate);
|
|
406
|
+
switch (filter.comparator) {
|
|
407
|
+
case '=':
|
|
408
|
+
return date.toDateString() === start.toDateString();
|
|
409
|
+
case '>=':
|
|
410
|
+
return date >= start;
|
|
411
|
+
case '<':
|
|
412
|
+
return date < start;
|
|
413
|
+
default:
|
|
414
|
+
return date >= start;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Export data to CSV
|
|
421
|
+
*/
|
|
422
|
+
export function exportToCSV(data, columns, fileName) {
|
|
423
|
+
const exportColumns = columns.filter((c) => c.csvExport !== false);
|
|
424
|
+
// Header row
|
|
425
|
+
const header = exportColumns.map((c) => `"${c.text}"`).join(',');
|
|
426
|
+
// Data rows
|
|
427
|
+
const rows = data.map((row, rowIndex) => {
|
|
428
|
+
return exportColumns
|
|
429
|
+
.map((col) => {
|
|
430
|
+
const value = col.csvFormatter
|
|
431
|
+
? col.csvFormatter(getNestedValue(row, col.dataField), row, rowIndex)
|
|
432
|
+
: getNestedValue(row, col.dataField);
|
|
433
|
+
if (value === null || value === undefined)
|
|
434
|
+
return '""';
|
|
435
|
+
if (typeof value === 'string')
|
|
436
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
437
|
+
if (typeof value === 'object')
|
|
438
|
+
return `"${JSON.stringify(value).replace(/"/g, '""')}"`;
|
|
439
|
+
return `"${value}"`;
|
|
440
|
+
})
|
|
441
|
+
.join(',');
|
|
442
|
+
});
|
|
443
|
+
const csv = [header, ...rows].join('\n');
|
|
444
|
+
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
|
|
445
|
+
const url = URL.createObjectURL(blob);
|
|
446
|
+
const link = document.createElement('a');
|
|
447
|
+
link.href = url;
|
|
448
|
+
link.download = `${fileName}_${new Date().toISOString().slice(0, 10)}.csv`;
|
|
449
|
+
link.click();
|
|
450
|
+
URL.revokeObjectURL(url);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Dynamically load ExcelJS from CDN (no bundle impact)
|
|
454
|
+
*/
|
|
455
|
+
async function loadExcelJS() {
|
|
456
|
+
// Check if already loaded
|
|
457
|
+
if (window.ExcelJS) {
|
|
458
|
+
return window.ExcelJS;
|
|
459
|
+
}
|
|
460
|
+
return new Promise((resolve, reject) => {
|
|
461
|
+
const script = document.createElement('script');
|
|
462
|
+
script.src =
|
|
463
|
+
'https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js';
|
|
464
|
+
script.async = true;
|
|
465
|
+
script.onload = () => resolve(window.ExcelJS);
|
|
466
|
+
script.onerror = () => reject(new Error('Failed to load ExcelJS from CDN'));
|
|
467
|
+
document.head.appendChild(script);
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Export data to Excel (.xlsx) - loads ExcelJS dynamically from CDN
|
|
472
|
+
*/
|
|
473
|
+
export async function exportToExcel(data, columns, fileName, options) {
|
|
474
|
+
try {
|
|
475
|
+
const ExcelJS = await loadExcelJS();
|
|
476
|
+
const workbook = new ExcelJS.Workbook();
|
|
477
|
+
const worksheet = workbook.addWorksheet(options?.sheetName || 'Sheet1');
|
|
478
|
+
const exportColumns = columns.filter((c) => c.csvExport !== false);
|
|
479
|
+
// Set up columns with headers
|
|
480
|
+
worksheet.columns = exportColumns.map((col) => ({
|
|
481
|
+
header: col.text,
|
|
482
|
+
key: col.dataField,
|
|
483
|
+
width: Math.max(col.text.length + 5, 15),
|
|
484
|
+
}));
|
|
485
|
+
// Style header row
|
|
486
|
+
const headerRow = worksheet.getRow(1);
|
|
487
|
+
headerRow.font = {
|
|
488
|
+
bold: options?.headerStyle?.font?.bold ?? true,
|
|
489
|
+
size: options?.headerStyle?.font?.size ?? 12,
|
|
490
|
+
};
|
|
491
|
+
if (options?.headerStyle?.fill?.color) {
|
|
492
|
+
headerRow.fill = {
|
|
493
|
+
type: 'pattern',
|
|
494
|
+
pattern: 'solid',
|
|
495
|
+
fgColor: { argb: options.headerStyle.fill.color.replace('#', '') },
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
headerRow.commit();
|
|
499
|
+
// Add data rows
|
|
500
|
+
data.forEach((row, rowIndex) => {
|
|
501
|
+
const rowData = {};
|
|
502
|
+
exportColumns.forEach((col) => {
|
|
503
|
+
const value = col.csvFormatter
|
|
504
|
+
? col.csvFormatter(getNestedValue(row, col.dataField), row, rowIndex)
|
|
505
|
+
: getNestedValue(row, col.dataField);
|
|
506
|
+
if (value === null || value === undefined) {
|
|
507
|
+
rowData[col.dataField] = '';
|
|
508
|
+
}
|
|
509
|
+
else if (typeof value === 'object') {
|
|
510
|
+
rowData[col.dataField] = JSON.stringify(value);
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
rowData[col.dataField] = value;
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
worksheet.addRow(rowData);
|
|
517
|
+
});
|
|
518
|
+
// Generate and download
|
|
519
|
+
const buffer = await workbook.xlsx.writeBuffer();
|
|
520
|
+
const blob = new Blob([buffer], {
|
|
521
|
+
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
522
|
+
});
|
|
523
|
+
const url = URL.createObjectURL(blob);
|
|
524
|
+
const link = document.createElement('a');
|
|
525
|
+
link.href = url;
|
|
526
|
+
link.download = `${fileName}_${new Date().toISOString().slice(0, 10)}.xlsx`;
|
|
527
|
+
link.click();
|
|
528
|
+
URL.revokeObjectURL(url);
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
console.error('Excel export failed:', error);
|
|
532
|
+
// Fallback to CSV if Excel export fails
|
|
533
|
+
console.warn('Falling back to CSV export');
|
|
534
|
+
exportToCSV(data, columns, fileName);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
@@ -3,3 +3,7 @@ export * from './types';
|
|
|
3
3
|
export { useSortState, useFilterState, usePaginationState, useRowSelection, useRowExpansion, useColumnVisibility, useTableDebounce, sortData, filterData, paginateData, getNestedValue, exportToCSV, exportToExcel, } from './hooks';
|
|
4
4
|
export { TextFilter, NumberFilter, DateFilter, SelectFilter, getFilterComponent, } from './filters';
|
|
5
5
|
export type { TextFilterOptions, TextFilterInstance, NumberFilterOptions, NumberFilterInstance, SelectFilterOptions, SelectFilterInstance, DateFilterOptions, DateFilterInstance, } from './filters';
|
|
6
|
+
export { useColumnResize, getColumnStyle, ResizeHandle, ResizeLine, ResizableHeaderCell, } from './columnResize';
|
|
7
|
+
export type { ColumnResizeConfig, UseColumnResizeReturn } from './columnResize';
|
|
8
|
+
export { useColumnReorder, DragGhost, DropIndicator, DraggableHeader, ColumnReorderGhost, ColumnDropIndicator, getReorderableHeaderProps, } from './columnReorder';
|
|
9
|
+
export type { ColumnReorderConfig, UseColumnReorderReturn } from './columnReorder';
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
export { Table, default } from './Table';
|
|
2
|
+
export * from './types';
|
|
3
|
+
export { useSortState, useFilterState, usePaginationState, useRowSelection, useRowExpansion, useColumnVisibility, useTableDebounce, sortData, filterData, paginateData, getNestedValue, exportToCSV, exportToExcel, } from './hooks';
|
|
4
|
+
export { TextFilter, NumberFilter, DateFilter, SelectFilter, getFilterComponent, } from './filters';
|
|
5
|
+
export { useColumnResize, getColumnStyle, ResizeHandle, ResizeLine, ResizableHeaderCell, } from './columnResize';
|
|
6
|
+
export { useColumnReorder, DragGhost, DropIndicator, DraggableHeader, ColumnReorderGhost, ColumnDropIndicator, getReorderableHeaderProps, } from './columnReorder';
|
|
@@ -658,4 +658,62 @@ export interface TableProps<T = any> {
|
|
|
658
658
|
rowSelected?: string;
|
|
659
659
|
rowExpanded?: string;
|
|
660
660
|
};
|
|
661
|
+
/**
|
|
662
|
+
* Enable column resizing via drag handle
|
|
663
|
+
* @default true
|
|
664
|
+
*/
|
|
665
|
+
resizable?: boolean;
|
|
666
|
+
/**
|
|
667
|
+
* Column resize configuration
|
|
668
|
+
* Only used when resizable={true}
|
|
669
|
+
*/
|
|
670
|
+
resizeConfig?: {
|
|
671
|
+
/** Minimum column width in pixels (default: 50) */
|
|
672
|
+
minWidth?: number;
|
|
673
|
+
/** Maximum column width in pixels (default: 800) */
|
|
674
|
+
maxWidth?: number;
|
|
675
|
+
/** Enable double-click to auto-fit width (default: true) */
|
|
676
|
+
autoFit?: boolean;
|
|
677
|
+
/** Callback when column is resized */
|
|
678
|
+
onResize?: (columnWidths: Record<string, number>) => void;
|
|
679
|
+
/** Callback when resize starts */
|
|
680
|
+
onResizeStart?: (dataField: string, width: number) => void;
|
|
681
|
+
/** Callback when resize ends */
|
|
682
|
+
onResizeEnd?: (dataField: string, width: number) => void;
|
|
683
|
+
/** Initial column widths */
|
|
684
|
+
defaultWidths?: Record<string, number>;
|
|
685
|
+
/** Handle color */
|
|
686
|
+
handleColor?: string;
|
|
687
|
+
/** Handle hover color */
|
|
688
|
+
handleHoverColor?: string;
|
|
689
|
+
/** Handle width in pixels (default: 4) */
|
|
690
|
+
handleWidth?: number;
|
|
691
|
+
};
|
|
692
|
+
/**
|
|
693
|
+
* Enable column reordering via long press and drag
|
|
694
|
+
* @default true
|
|
695
|
+
*/
|
|
696
|
+
reorderable?: boolean;
|
|
697
|
+
/**
|
|
698
|
+
* Column reorder configuration
|
|
699
|
+
* Only used when reorderable={true}
|
|
700
|
+
*/
|
|
701
|
+
reorderConfig?: {
|
|
702
|
+
/** Long press delay in ms before drag starts (default: 200) */
|
|
703
|
+
longPressDelay?: number;
|
|
704
|
+
/** Callback when columns are reordered */
|
|
705
|
+
onReorder?: (newColumns: TableColumn<T>[], fromIndex: number, toIndex: number) => void;
|
|
706
|
+
/** Callback when drag starts */
|
|
707
|
+
onDragStart?: (column: TableColumn<T>, index: number) => void;
|
|
708
|
+
/** Callback when drag ends */
|
|
709
|
+
onDragEnd?: (column: TableColumn<T>, index: number) => void;
|
|
710
|
+
/** Disable specific columns from being dragged */
|
|
711
|
+
disabledColumns?: string[];
|
|
712
|
+
/** Ghost element opacity (default: 0.8) */
|
|
713
|
+
ghostOpacity?: number;
|
|
714
|
+
/** Drop indicator color */
|
|
715
|
+
dropIndicatorColor?: string;
|
|
716
|
+
/** Enable animation (default: true) */
|
|
717
|
+
animated?: boolean;
|
|
718
|
+
};
|
|
661
719
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export {};
|
|
@@ -1 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import s from '../../tc.module.css';
|
|
4
|
+
import { cn } from '../../utils';
|
|
5
|
+
export const Tab = ({ title, children, className, style }) => {
|
|
6
|
+
return (_jsx("div", { className: cn(s.flex, className), style: style, children: children }, title));
|
|
7
|
+
};
|
|
8
|
+
export const Tabs = ({ options, onSelect, children, classNames = {}, styles = {}, }) => {
|
|
9
|
+
const [activeTab, setActiveTab] = useState(0);
|
|
10
|
+
const [selected, setSelected] = useState(options[0].title);
|
|
11
|
+
const tabs = React.Children.toArray(children).filter((child) => React.isValidElement(child) && child.type === Tab);
|
|
12
|
+
return (_jsx(_Fragment, { children: _jsxs("div", { className: cn(s.flex, s['flex-col'], s['w-full'], classNames.container), style: styles.container, children: [_jsx("div", { className: cn(s.flex, s['border-b'], classNames.tabsHeader), style: styles.tabsHeader, children: options?.map((tab, index) => (_jsx("button", { type: "button", className: cn(s['py-2'], s['px-4'], s['mr-1'], s['border-none'], s['rounded-t-md'], s['shadow-inner'], s['cursor-pointer'], activeTab === index && s['bg-blue-500'], activeTab === index && s['border-none'], activeTab === index && s['text-white'], classNames.tabButton, activeTab === index && classNames.activeTabButton), style: {
|
|
13
|
+
...styles.tabButton,
|
|
14
|
+
...(activeTab === index ? styles.activeTabButton : {}),
|
|
15
|
+
}, onClick: () => {
|
|
16
|
+
setSelected(tab?.title);
|
|
17
|
+
onSelect && onSelect(tab, index);
|
|
18
|
+
!tab.inActive && setActiveTab(index);
|
|
19
|
+
}, disabled: tab.inActive, children: tab.title }, index))) }), _jsx("div", { className: cn(s['p-2'], s.border, s['border-solid'], s['border-slate-600'], s['rounded-b-md'], classNames.contentContainer), style: styles.contentContainer, children: options[activeTab]?.content
|
|
20
|
+
? options[activeTab]?.content
|
|
21
|
+
: tabs[options?.findIndex((item) => item.title === selected)] })] }) }));
|
|
22
|
+
};
|