react-restyle-components 0.4.39 → 0.4.40
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 +1332 -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/index.js +30 -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 +12 -1
- package/lib/src/core-components/src/tc.module.css +1 -1
- 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,64 +1,74 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
4
|
+
import { styled, css } from 'styled-components';
|
|
5
|
+
import { tokens } from '../../utils/designTokens';
|
|
6
|
+
import { useDebouncedValue } from '../../utils/hooks/useDebouncedValue';
|
|
7
|
+
// Styled components for filters
|
|
8
|
+
const FilterContainer = styled.div `
|
|
2
9
|
display: flex;
|
|
3
10
|
align-items: center;
|
|
4
11
|
gap: 3px;
|
|
5
|
-
|
|
12
|
+
`;
|
|
13
|
+
const FilterInputBase = styled.input `
|
|
6
14
|
width: 100%;
|
|
7
15
|
height: 22px;
|
|
8
16
|
padding: 0 5px;
|
|
9
17
|
font-size: 10px;
|
|
10
18
|
font-weight: normal;
|
|
11
19
|
color: #000000;
|
|
12
|
-
border: 1px solid ${
|
|
20
|
+
border: 1px solid ${tokens.outline || '#e2e8f0'};
|
|
13
21
|
border-radius: 2px;
|
|
14
22
|
background: white;
|
|
15
23
|
transition: all 0.15s ease;
|
|
16
24
|
|
|
17
25
|
&:hover {
|
|
18
|
-
border-color: ${
|
|
26
|
+
border-color: ${tokens.primary || '#94a3b8'};
|
|
19
27
|
}
|
|
20
28
|
|
|
21
29
|
&:focus {
|
|
22
30
|
outline: none;
|
|
23
|
-
border-color: ${
|
|
31
|
+
border-color: ${tokens.primary || '#3b82f6'};
|
|
24
32
|
box-shadow: 0 0 0 1px
|
|
25
|
-
${
|
|
33
|
+
${tokens.primary ? `${tokens.primary}20` : '#3b82f620'};
|
|
26
34
|
}
|
|
27
35
|
|
|
28
36
|
&::placeholder {
|
|
29
|
-
color: ${
|
|
37
|
+
color: ${tokens.onSurface ? `${tokens.onSurface}50` : '#94a3af'};
|
|
30
38
|
font-size: 9px;
|
|
31
39
|
}
|
|
32
|
-
|
|
40
|
+
`;
|
|
41
|
+
const FilterSelectBase = styled.select `
|
|
33
42
|
width: 100%;
|
|
34
43
|
height: 22px;
|
|
35
44
|
padding: 0 5px;
|
|
36
45
|
font-size: 10px;
|
|
37
46
|
font-weight: normal;
|
|
38
47
|
color: #000000;
|
|
39
|
-
border: 1px solid ${
|
|
48
|
+
border: 1px solid ${tokens.outline || '#e2e8f0'};
|
|
40
49
|
border-radius: 2px;
|
|
41
50
|
background: white;
|
|
42
51
|
cursor: pointer;
|
|
43
52
|
transition: all 0.15s ease;
|
|
44
53
|
|
|
45
54
|
&:hover {
|
|
46
|
-
border-color: ${
|
|
55
|
+
border-color: ${tokens.primary || '#94a3b8'};
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
&:focus {
|
|
50
59
|
outline: none;
|
|
51
|
-
border-color: ${
|
|
60
|
+
border-color: ${tokens.primary || '#3b82f6'};
|
|
52
61
|
box-shadow: 0 0 0 1px
|
|
53
|
-
${
|
|
62
|
+
${tokens.primary ? `${tokens.primary}20` : '#3b82f620'};
|
|
54
63
|
}
|
|
55
|
-
|
|
64
|
+
`;
|
|
65
|
+
const ComparatorSelect = styled.select `
|
|
56
66
|
width: 38px;
|
|
57
67
|
height: 22px;
|
|
58
68
|
padding: 0 2px;
|
|
59
69
|
font-size: 9px;
|
|
60
70
|
font-weight: normal;
|
|
61
|
-
border: 1px solid ${
|
|
71
|
+
border: 1px solid ${tokens.outline || '#e2e8f0'};
|
|
62
72
|
border-radius: 2px;
|
|
63
73
|
background: white;
|
|
64
74
|
cursor: pointer;
|
|
@@ -67,56 +77,571 @@
|
|
|
67
77
|
transition: all 0.15s ease;
|
|
68
78
|
|
|
69
79
|
&:hover {
|
|
70
|
-
border-color: ${
|
|
80
|
+
border-color: ${tokens.primary || '#94a3b8'};
|
|
71
81
|
}
|
|
72
82
|
|
|
73
83
|
&:focus {
|
|
74
84
|
outline: none;
|
|
75
|
-
border-color: ${
|
|
85
|
+
border-color: ${tokens.primary || '#3b82f6'};
|
|
76
86
|
}
|
|
77
|
-
|
|
87
|
+
`;
|
|
88
|
+
const DateInput = styled.input `
|
|
78
89
|
flex: 1;
|
|
79
90
|
height: 22px;
|
|
80
91
|
padding: 0 4px;
|
|
81
92
|
font-size: 10px;
|
|
82
|
-
border: 1px solid ${
|
|
93
|
+
border: 1px solid ${tokens.outline || '#e2e8f0'};
|
|
83
94
|
border-radius: 2px;
|
|
84
95
|
background: white;
|
|
85
96
|
min-width: 80px;
|
|
86
97
|
transition: all 0.15s ease;
|
|
87
98
|
|
|
88
99
|
&:hover {
|
|
89
|
-
border-color: ${
|
|
100
|
+
border-color: ${tokens.primary || '#94a3b8'};
|
|
90
101
|
}
|
|
91
102
|
|
|
92
103
|
&:focus {
|
|
93
104
|
outline: none;
|
|
94
|
-
border-color: ${
|
|
105
|
+
border-color: ${tokens.primary || '#3b82f6'};
|
|
95
106
|
box-shadow: 0 0 0 1px
|
|
96
|
-
${
|
|
107
|
+
${tokens.primary ? `${tokens.primary}20` : '#3b82f620'};
|
|
97
108
|
}
|
|
98
|
-
|
|
109
|
+
`;
|
|
110
|
+
const ToggleButton = styled.button `
|
|
99
111
|
height: 22px;
|
|
100
112
|
padding: 0 5px;
|
|
101
113
|
font-size: 9px;
|
|
102
114
|
font-weight: normal;
|
|
103
|
-
border: 1px solid ${
|
|
115
|
+
border: 1px solid ${tokens.outline || '#e2e8f0'};
|
|
104
116
|
border-radius: 2px;
|
|
105
117
|
cursor: pointer;
|
|
106
118
|
transition: all 0.15s ease;
|
|
107
119
|
white-space: nowrap;
|
|
108
120
|
|
|
109
|
-
${({$active
|
|
110
|
-
|
|
121
|
+
${({ $active }) => $active
|
|
122
|
+
? css `
|
|
123
|
+
background: ${tokens.primary || '#3b82f6'};
|
|
111
124
|
color: white;
|
|
112
|
-
border-color: ${
|
|
113
|
-
|
|
125
|
+
border-color: ${tokens.primary || '#3b82f6'};
|
|
126
|
+
`
|
|
127
|
+
: css `
|
|
114
128
|
background: white;
|
|
115
|
-
color: ${
|
|
129
|
+
color: ${tokens.onSurface || '#374151'};
|
|
116
130
|
|
|
117
131
|
&:hover {
|
|
118
132
|
background: #f8fafc;
|
|
119
|
-
border-color: ${
|
|
133
|
+
border-color: ${tokens.primary || '#94a3b8'};
|
|
120
134
|
}
|
|
121
135
|
`}
|
|
122
|
-
|
|
136
|
+
`;
|
|
137
|
+
/**
|
|
138
|
+
* Internal Text filter component with options support
|
|
139
|
+
*/
|
|
140
|
+
const TextFilterComponent = ({ column, value, onChange, options }) => {
|
|
141
|
+
const { placeholder, className, style, defaultValue, delay = 500, getFilter, onFilter, id, disabled, } = options || {};
|
|
142
|
+
// Local state for immediate input updates (maintains focus)
|
|
143
|
+
const [internalValue, setInternalValue] = useState(value || defaultValue || '');
|
|
144
|
+
const internalValueRef = useRef(internalValue);
|
|
145
|
+
const inputRef = useRef(null);
|
|
146
|
+
const onChangeRef = useRef(onChange);
|
|
147
|
+
const onFilterRef = useRef(onFilter);
|
|
148
|
+
// Track if the last change was from user input (internal) vs external (e.g., clear all)
|
|
149
|
+
const lastInternalValueRef = useRef(internalValue);
|
|
150
|
+
// Keep refs in sync
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
internalValueRef.current = internalValue;
|
|
153
|
+
}, [internalValue]);
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
onChangeRef.current = onChange;
|
|
156
|
+
onFilterRef.current = onFilter;
|
|
157
|
+
}, [onChange, onFilter]);
|
|
158
|
+
// Sync internal value when external value changes (e.g., from clear all filters)
|
|
159
|
+
// Only sync when external value differs from what we last sent to parent
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
const externalValue = value || '';
|
|
162
|
+
// Only sync if external value is different from what we last propagated
|
|
163
|
+
// This prevents overwriting user input while they're typing
|
|
164
|
+
if (externalValue !== lastInternalValueRef.current) {
|
|
165
|
+
setInternalValue(externalValue);
|
|
166
|
+
lastInternalValueRef.current = externalValue;
|
|
167
|
+
}
|
|
168
|
+
}, [value]);
|
|
169
|
+
// Debounce the internal value
|
|
170
|
+
const [debouncedValue] = useDebouncedValue(internalValue, { wait: delay });
|
|
171
|
+
// Propagate debounced value to parent
|
|
172
|
+
useEffect(() => {
|
|
173
|
+
// Update the ref to track what we're sending to parent
|
|
174
|
+
lastInternalValueRef.current = debouncedValue || '';
|
|
175
|
+
onChangeRef.current(debouncedValue || null);
|
|
176
|
+
onFilterRef.current?.(debouncedValue);
|
|
177
|
+
}, [debouncedValue]);
|
|
178
|
+
// Provide filter instance via getFilter callback - only on mount
|
|
179
|
+
useEffect(() => {
|
|
180
|
+
if (getFilter) {
|
|
181
|
+
getFilter({
|
|
182
|
+
get value() {
|
|
183
|
+
return internalValueRef.current;
|
|
184
|
+
},
|
|
185
|
+
setValue: (newValue) => {
|
|
186
|
+
setInternalValue(newValue);
|
|
187
|
+
onChangeRef.current(newValue || null);
|
|
188
|
+
onFilterRef.current?.(newValue);
|
|
189
|
+
},
|
|
190
|
+
clear: () => {
|
|
191
|
+
setInternalValue('');
|
|
192
|
+
onChangeRef.current(null);
|
|
193
|
+
onFilterRef.current?.('');
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
198
|
+
}, [getFilter]);
|
|
199
|
+
// Track if input should be focused (user is actively typing)
|
|
200
|
+
const hasFocusRef = useRef(false);
|
|
201
|
+
// Simple change handler - just update local state
|
|
202
|
+
const handleChange = useCallback((e) => {
|
|
203
|
+
setInternalValue(e.target.value);
|
|
204
|
+
}, []);
|
|
205
|
+
// Track focus state
|
|
206
|
+
const handleFocus = useCallback(() => {
|
|
207
|
+
hasFocusRef.current = true;
|
|
208
|
+
}, []);
|
|
209
|
+
const handleBlur = useCallback(() => {
|
|
210
|
+
hasFocusRef.current = false;
|
|
211
|
+
}, []);
|
|
212
|
+
// Restore focus after re-renders if it was focused
|
|
213
|
+
useEffect(() => {
|
|
214
|
+
if (hasFocusRef.current && inputRef.current) {
|
|
215
|
+
// Use requestAnimationFrame to ensure DOM is ready
|
|
216
|
+
requestAnimationFrame(() => {
|
|
217
|
+
if (hasFocusRef.current && inputRef.current) {
|
|
218
|
+
inputRef.current.focus();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
const inputStyle = {
|
|
224
|
+
fontWeight: 400,
|
|
225
|
+
...style,
|
|
226
|
+
};
|
|
227
|
+
// If custom className is provided, use plain input to allow full CSS control
|
|
228
|
+
if (className) {
|
|
229
|
+
return (_jsx("input", { ref: inputRef, type: "text", id: id, "data-filter-field": column.dataField, value: internalValue, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, placeholder: placeholder || column.filterPlaceholder || `Filter ${column.text}...`, className: className, style: {
|
|
230
|
+
width: '100%',
|
|
231
|
+
fontWeight: 400,
|
|
232
|
+
...style,
|
|
233
|
+
}, disabled: disabled }));
|
|
234
|
+
}
|
|
235
|
+
return (_jsx(FilterInputBase, { ref: inputRef, type: "text", id: id, "data-filter-field": column.dataField, value: internalValue, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, placeholder: placeholder || column.filterPlaceholder || `Filter ${column.text}...`, style: inputStyle, disabled: disabled }));
|
|
236
|
+
};
|
|
237
|
+
export function TextFilter(optionsOrProps) {
|
|
238
|
+
// Check if it's being used as a factory function (options object without column/value/onChange)
|
|
239
|
+
if (!('column' in optionsOrProps) &&
|
|
240
|
+
!('value' in optionsOrProps) &&
|
|
241
|
+
!('onChange' in optionsOrProps)) {
|
|
242
|
+
// Factory function usage - return a component
|
|
243
|
+
const options = optionsOrProps;
|
|
244
|
+
const FilterWithOptions = (props) => (_jsx(TextFilterComponent, { ...props, options: options }));
|
|
245
|
+
FilterWithOptions.displayName = 'TextFilter';
|
|
246
|
+
return FilterWithOptions;
|
|
247
|
+
}
|
|
248
|
+
// Direct component usage
|
|
249
|
+
const props = optionsOrProps;
|
|
250
|
+
return _jsx(TextFilterComponent, { ...props });
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Internal Number filter component with options support
|
|
254
|
+
*/
|
|
255
|
+
const NumberFilterComponent = ({ column, value, onChange, options }) => {
|
|
256
|
+
const { placeholder, className, style, defaultValue, delay = 500, defaultComparator = '=', allowDecimal = true, getFilter, onFilter, id, disabled, hideComparator, comparators = ['=', '!=', '>', '>=', '<', '<='], } = options || {};
|
|
257
|
+
// Local state for immediate input updates (maintains focus)
|
|
258
|
+
const [number, setNumber] = useState(value?.number || defaultValue?.number || '');
|
|
259
|
+
const [comparator, setComparator] = useState(value?.comparator || defaultValue?.comparator || defaultComparator);
|
|
260
|
+
const numberRef = useRef(number);
|
|
261
|
+
const comparatorRef = useRef(comparator);
|
|
262
|
+
const inputRef = useRef(null);
|
|
263
|
+
const onChangeRef = useRef(onChange);
|
|
264
|
+
const onFilterRef = useRef(onFilter);
|
|
265
|
+
// Track last value sent to parent to prevent sync loops
|
|
266
|
+
const lastNumberRef = useRef(number);
|
|
267
|
+
const lastComparatorRef = useRef(comparator);
|
|
268
|
+
// Keep refs in sync with state
|
|
269
|
+
useEffect(() => {
|
|
270
|
+
numberRef.current = number;
|
|
271
|
+
comparatorRef.current = comparator;
|
|
272
|
+
}, [number, comparator]);
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
onChangeRef.current = onChange;
|
|
275
|
+
onFilterRef.current = onFilter;
|
|
276
|
+
}, [onChange, onFilter]);
|
|
277
|
+
// Sync internal value when external value changes (e.g., from clear all filters)
|
|
278
|
+
useEffect(() => {
|
|
279
|
+
const externalNumber = value?.number || '';
|
|
280
|
+
const externalComparator = value?.comparator || defaultComparator;
|
|
281
|
+
// Only sync if different from what we last sent to parent
|
|
282
|
+
if (externalNumber !== lastNumberRef.current) {
|
|
283
|
+
setNumber(externalNumber);
|
|
284
|
+
lastNumberRef.current = externalNumber;
|
|
285
|
+
}
|
|
286
|
+
if (externalComparator !== lastComparatorRef.current) {
|
|
287
|
+
setComparator(externalComparator);
|
|
288
|
+
lastComparatorRef.current = externalComparator;
|
|
289
|
+
}
|
|
290
|
+
}, [value, defaultComparator]);
|
|
291
|
+
// Debounce the number value
|
|
292
|
+
const [debouncedNumber] = useDebouncedValue(number, { wait: delay });
|
|
293
|
+
// Propagate debounced value to parent
|
|
294
|
+
useEffect(() => {
|
|
295
|
+
// Update refs to track what we're sending to parent
|
|
296
|
+
lastNumberRef.current = debouncedNumber || '';
|
|
297
|
+
lastComparatorRef.current = comparatorRef.current;
|
|
298
|
+
const newValue = debouncedNumber
|
|
299
|
+
? { number: debouncedNumber, comparator: comparatorRef.current }
|
|
300
|
+
: null;
|
|
301
|
+
onChangeRef.current(newValue);
|
|
302
|
+
onFilterRef.current?.(newValue);
|
|
303
|
+
}, [debouncedNumber]);
|
|
304
|
+
// Provide filter instance via getFilter callback - only on mount
|
|
305
|
+
useEffect(() => {
|
|
306
|
+
if (getFilter) {
|
|
307
|
+
getFilter({
|
|
308
|
+
get value() {
|
|
309
|
+
return numberRef.current
|
|
310
|
+
? { number: numberRef.current, comparator: comparatorRef.current }
|
|
311
|
+
: null;
|
|
312
|
+
},
|
|
313
|
+
setValue: (newValue) => {
|
|
314
|
+
if (newValue) {
|
|
315
|
+
setNumber(newValue.number);
|
|
316
|
+
setComparator(newValue.comparator);
|
|
317
|
+
onChangeRef.current(newValue);
|
|
318
|
+
onFilterRef.current?.(newValue);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
setNumber('');
|
|
322
|
+
onChangeRef.current(null);
|
|
323
|
+
onFilterRef.current?.(null);
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
clear: () => {
|
|
327
|
+
setNumber('');
|
|
328
|
+
setComparator(defaultComparator);
|
|
329
|
+
onChangeRef.current(null);
|
|
330
|
+
onFilterRef.current?.(null);
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
335
|
+
}, [getFilter]);
|
|
336
|
+
// Track if input should be focused
|
|
337
|
+
const hasFocusRef = useRef(false);
|
|
338
|
+
// Track focus state
|
|
339
|
+
const handleFocus = useCallback(() => {
|
|
340
|
+
hasFocusRef.current = true;
|
|
341
|
+
}, []);
|
|
342
|
+
const handleBlur = useCallback(() => {
|
|
343
|
+
hasFocusRef.current = false;
|
|
344
|
+
}, []);
|
|
345
|
+
// Restore focus after re-renders if it was focused
|
|
346
|
+
useEffect(() => {
|
|
347
|
+
if (hasFocusRef.current && inputRef.current) {
|
|
348
|
+
requestAnimationFrame(() => {
|
|
349
|
+
if (hasFocusRef.current && inputRef.current) {
|
|
350
|
+
inputRef.current.focus();
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
// Handle comparator change - trigger immediate filter update
|
|
356
|
+
const handleComparatorChange = useCallback((newComparator) => {
|
|
357
|
+
setComparator(newComparator);
|
|
358
|
+
if (number) {
|
|
359
|
+
const newValue = { number, comparator: newComparator };
|
|
360
|
+
onChangeRef.current(newValue);
|
|
361
|
+
onFilterRef.current?.(newValue);
|
|
362
|
+
}
|
|
363
|
+
}, [number]);
|
|
364
|
+
const comparatorSymbols = {
|
|
365
|
+
'=': '=',
|
|
366
|
+
'!=': '≠',
|
|
367
|
+
'>': '>',
|
|
368
|
+
'>=': '≥',
|
|
369
|
+
'<': '<',
|
|
370
|
+
'<=': '≤',
|
|
371
|
+
};
|
|
372
|
+
const inputStyle = {
|
|
373
|
+
flex: 1,
|
|
374
|
+
fontWeight: 400,
|
|
375
|
+
...style,
|
|
376
|
+
};
|
|
377
|
+
const inputProps = {
|
|
378
|
+
type: 'text',
|
|
379
|
+
id,
|
|
380
|
+
'data-filter-field': column.dataField,
|
|
381
|
+
value: number,
|
|
382
|
+
onChange: (e) => {
|
|
383
|
+
const val = e.target.value;
|
|
384
|
+
const pattern = allowDecimal ? /^[0-9.,]*$/ : /^[0-9]*$/;
|
|
385
|
+
if (pattern.test(val)) {
|
|
386
|
+
setNumber(val);
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
onFocus: handleFocus,
|
|
390
|
+
onBlur: handleBlur,
|
|
391
|
+
placeholder: placeholder || column.filterPlaceholder || 'Number...',
|
|
392
|
+
disabled,
|
|
393
|
+
};
|
|
394
|
+
return (_jsxs(FilterContainer, { children: [!hideComparator && (_jsx(ComparatorSelect, { value: comparator, onChange: (e) => handleComparatorChange(e.target.value), disabled: disabled, children: comparators.map((comp) => (_jsx("option", { value: comp, children: comparatorSymbols[comp] || comp }, comp))) })), className ? (_jsx("input", { ref: inputRef, ...inputProps, className: className, style: { flex: 1, width: '100%', fontWeight: 400, ...style } })) : (_jsx(FilterInputBase, { ref: inputRef, ...inputProps, style: inputStyle }))] }));
|
|
395
|
+
};
|
|
396
|
+
export function NumberFilter(optionsOrProps) {
|
|
397
|
+
if (!('column' in optionsOrProps) &&
|
|
398
|
+
!('value' in optionsOrProps) &&
|
|
399
|
+
!('onChange' in optionsOrProps)) {
|
|
400
|
+
const options = optionsOrProps;
|
|
401
|
+
const FilterWithOptions = (props) => (_jsx(NumberFilterComponent, { ...props, options: options }));
|
|
402
|
+
FilterWithOptions.displayName = 'NumberFilter';
|
|
403
|
+
return FilterWithOptions;
|
|
404
|
+
}
|
|
405
|
+
const props = optionsOrProps;
|
|
406
|
+
return _jsx(NumberFilterComponent, { ...props });
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Internal Date filter component with options support
|
|
410
|
+
*/
|
|
411
|
+
const DateFilterComponent = ({ column, value, onChange, options }) => {
|
|
412
|
+
const { className, style, defaultValue, defaultComparator = '=', defaultRangeMode = false, getFilter, onFilter, id, disabled, minDate, maxDate, } = options || {};
|
|
413
|
+
// Local state for immediate updates
|
|
414
|
+
const [startDate, setStartDate] = useState(value?.startDate || defaultValue?.startDate || '');
|
|
415
|
+
const [endDate, setEndDate] = useState(value?.endDate || defaultValue?.endDate || '');
|
|
416
|
+
const [diffFlag, setDiffFlag] = useState(value?.diffFlag ?? defaultValue?.diffFlag ?? defaultRangeMode);
|
|
417
|
+
const [comparator, setComparator] = useState(value?.comparator || defaultValue?.comparator || defaultComparator);
|
|
418
|
+
const stateRef = useRef({ startDate, endDate, diffFlag, comparator });
|
|
419
|
+
const onChangeRef = useRef(onChange);
|
|
420
|
+
const onFilterRef = useRef(onFilter);
|
|
421
|
+
// Track last values sent to parent to prevent sync loops
|
|
422
|
+
const lastValuesRef = useRef({
|
|
423
|
+
startDate,
|
|
424
|
+
endDate,
|
|
425
|
+
diffFlag,
|
|
426
|
+
comparator,
|
|
427
|
+
});
|
|
428
|
+
// Keep refs in sync with state
|
|
429
|
+
useEffect(() => {
|
|
430
|
+
stateRef.current = { startDate, endDate, diffFlag, comparator };
|
|
431
|
+
}, [startDate, endDate, diffFlag, comparator]);
|
|
432
|
+
useEffect(() => {
|
|
433
|
+
onChangeRef.current = onChange;
|
|
434
|
+
onFilterRef.current = onFilter;
|
|
435
|
+
}, [onChange, onFilter]);
|
|
436
|
+
// Sync internal value when external value changes (e.g., from clear all filters)
|
|
437
|
+
useEffect(() => {
|
|
438
|
+
const externalStartDate = value?.startDate || '';
|
|
439
|
+
const externalEndDate = value?.endDate || '';
|
|
440
|
+
const externalDiffFlag = value?.diffFlag ?? defaultRangeMode;
|
|
441
|
+
const externalComparator = value?.comparator || defaultComparator;
|
|
442
|
+
// Only sync if different from what we last sent to parent
|
|
443
|
+
if (externalStartDate !== lastValuesRef.current.startDate) {
|
|
444
|
+
setStartDate(externalStartDate);
|
|
445
|
+
lastValuesRef.current.startDate = externalStartDate;
|
|
446
|
+
}
|
|
447
|
+
if (externalEndDate !== lastValuesRef.current.endDate) {
|
|
448
|
+
setEndDate(externalEndDate);
|
|
449
|
+
lastValuesRef.current.endDate = externalEndDate;
|
|
450
|
+
}
|
|
451
|
+
if (externalDiffFlag !== lastValuesRef.current.diffFlag) {
|
|
452
|
+
setDiffFlag(externalDiffFlag);
|
|
453
|
+
lastValuesRef.current.diffFlag = externalDiffFlag;
|
|
454
|
+
}
|
|
455
|
+
if (externalComparator !== lastValuesRef.current.comparator) {
|
|
456
|
+
setComparator(externalComparator);
|
|
457
|
+
lastValuesRef.current.comparator = externalComparator;
|
|
458
|
+
}
|
|
459
|
+
}, [value, defaultRangeMode, defaultComparator]);
|
|
460
|
+
// Debounce the date values
|
|
461
|
+
const [debouncedStartDate] = useDebouncedValue(startDate, { wait: 500 });
|
|
462
|
+
const [debouncedEndDate] = useDebouncedValue(endDate, { wait: 500 });
|
|
463
|
+
// Propagate debounced value to parent
|
|
464
|
+
useEffect(() => {
|
|
465
|
+
// Update refs to track what we're sending to parent
|
|
466
|
+
lastValuesRef.current = {
|
|
467
|
+
startDate: debouncedStartDate,
|
|
468
|
+
endDate: debouncedEndDate,
|
|
469
|
+
diffFlag,
|
|
470
|
+
comparator,
|
|
471
|
+
};
|
|
472
|
+
const newValue = debouncedStartDate || debouncedEndDate
|
|
473
|
+
? {
|
|
474
|
+
startDate: debouncedStartDate,
|
|
475
|
+
endDate: debouncedEndDate,
|
|
476
|
+
diffFlag,
|
|
477
|
+
comparator,
|
|
478
|
+
}
|
|
479
|
+
: null;
|
|
480
|
+
onChangeRef.current(newValue);
|
|
481
|
+
onFilterRef.current?.(newValue);
|
|
482
|
+
}, [debouncedStartDate, debouncedEndDate, diffFlag, comparator]);
|
|
483
|
+
// Provide filter instance via getFilter callback - only on mount
|
|
484
|
+
useEffect(() => {
|
|
485
|
+
if (getFilter) {
|
|
486
|
+
getFilter({
|
|
487
|
+
get value() {
|
|
488
|
+
const { startDate: s, endDate: e, diffFlag: d, comparator: c, } = stateRef.current;
|
|
489
|
+
return s || e
|
|
490
|
+
? { startDate: s, endDate: e, diffFlag: d, comparator: c }
|
|
491
|
+
: null;
|
|
492
|
+
},
|
|
493
|
+
setValue: (newValue) => {
|
|
494
|
+
if (newValue) {
|
|
495
|
+
setStartDate(newValue.startDate || '');
|
|
496
|
+
setEndDate(newValue.endDate || '');
|
|
497
|
+
setDiffFlag(newValue.diffFlag ?? defaultRangeMode);
|
|
498
|
+
setComparator(newValue.comparator || defaultComparator);
|
|
499
|
+
onChangeRef.current(newValue);
|
|
500
|
+
onFilterRef.current?.(newValue);
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
setStartDate('');
|
|
504
|
+
setEndDate('');
|
|
505
|
+
onChangeRef.current(null);
|
|
506
|
+
onFilterRef.current?.(null);
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
clear: () => {
|
|
510
|
+
setStartDate('');
|
|
511
|
+
setEndDate('');
|
|
512
|
+
setDiffFlag(defaultRangeMode);
|
|
513
|
+
setComparator(defaultComparator);
|
|
514
|
+
onChangeRef.current(null);
|
|
515
|
+
onFilterRef.current?.(null);
|
|
516
|
+
},
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
520
|
+
}, [getFilter]);
|
|
521
|
+
// Simple change handlers - just update local state
|
|
522
|
+
const handleStartDateChange = useCallback((e) => {
|
|
523
|
+
setStartDate(e.target.value);
|
|
524
|
+
}, []);
|
|
525
|
+
const handleEndDateChange = useCallback((e) => {
|
|
526
|
+
setEndDate(e.target.value);
|
|
527
|
+
}, []);
|
|
528
|
+
const handleDiffFlagChange = useCallback(() => {
|
|
529
|
+
setDiffFlag((prev) => !prev);
|
|
530
|
+
}, []);
|
|
531
|
+
const handleComparatorChange = useCallback((e) => {
|
|
532
|
+
setComparator(e.target.value);
|
|
533
|
+
}, []);
|
|
534
|
+
return (_jsxs(FilterContainer, { className: className, style: style, children: [_jsx(ToggleButton, { "$active": diffFlag, onClick: handleDiffFlagChange, title: "Date range mode", disabled: disabled, children: diffFlag ? 'Range' : 'Single' }), !diffFlag && (_jsxs(ComparatorSelect, { value: comparator, onChange: handleComparatorChange, disabled: disabled, style: { fontWeight: 400 }, children: [_jsx("option", { value: "=", children: "=" }), _jsx("option", { value: ">=", children: "\u2265" }), _jsx("option", { value: "<", children: "<" })] })), _jsx(DateInput, { type: "date", id: id, value: startDate, onChange: handleStartDateChange, disabled: disabled, min: minDate, max: maxDate, style: { fontWeight: 400 } }), diffFlag && (_jsxs(_Fragment, { children: [_jsx("span", { style: { color: '#6b7280', fontSize: 12, fontWeight: 400 }, children: "to" }), _jsx(DateInput, { type: "date", value: endDate, onChange: handleEndDateChange, disabled: disabled, min: minDate, max: maxDate, style: { fontWeight: 400 } })] }))] }));
|
|
535
|
+
};
|
|
536
|
+
export function DateFilter(optionsOrProps) {
|
|
537
|
+
if (!('column' in optionsOrProps) &&
|
|
538
|
+
!('value' in optionsOrProps) &&
|
|
539
|
+
!('onChange' in optionsOrProps)) {
|
|
540
|
+
const options = optionsOrProps;
|
|
541
|
+
const FilterWithOptions = (props) => (_jsx(DateFilterComponent, { ...props, options: options }));
|
|
542
|
+
FilterWithOptions.displayName = 'DateFilter';
|
|
543
|
+
return FilterWithOptions;
|
|
544
|
+
}
|
|
545
|
+
const props = optionsOrProps;
|
|
546
|
+
return _jsx(DateFilterComponent, { ...props });
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Internal Select filter component with options support
|
|
550
|
+
*/
|
|
551
|
+
const SelectFilterComponent = ({ column, value, onChange, options }) => {
|
|
552
|
+
const { placeholder = 'All', className, style, defaultValue, delay = 300, options: customOptions, getFilter, onFilter, id, disabled, } = options || {};
|
|
553
|
+
// Local state for immediate updates
|
|
554
|
+
const [selectedValue, setSelectedValue] = useState(value || defaultValue || '');
|
|
555
|
+
const selectedValueRef = useRef(selectedValue);
|
|
556
|
+
const onChangeRef = useRef(onChange);
|
|
557
|
+
const onFilterRef = useRef(onFilter);
|
|
558
|
+
// Track last value sent to parent to prevent sync loops
|
|
559
|
+
const lastValueRef = useRef(selectedValue);
|
|
560
|
+
// Keep refs in sync with state
|
|
561
|
+
useEffect(() => {
|
|
562
|
+
selectedValueRef.current = selectedValue;
|
|
563
|
+
}, [selectedValue]);
|
|
564
|
+
useEffect(() => {
|
|
565
|
+
onChangeRef.current = onChange;
|
|
566
|
+
onFilterRef.current = onFilter;
|
|
567
|
+
}, [onChange, onFilter]);
|
|
568
|
+
// Sync internal value when external value changes (e.g., from clear all filters)
|
|
569
|
+
useEffect(() => {
|
|
570
|
+
const externalValue = value || '';
|
|
571
|
+
// Only sync if different from what we last sent to parent
|
|
572
|
+
if (externalValue !== lastValueRef.current) {
|
|
573
|
+
setSelectedValue(externalValue);
|
|
574
|
+
lastValueRef.current = externalValue;
|
|
575
|
+
}
|
|
576
|
+
}, [value]);
|
|
577
|
+
// Debounce the selected value
|
|
578
|
+
const [debouncedValue] = useDebouncedValue(selectedValue, { wait: delay });
|
|
579
|
+
// Propagate debounced value to parent
|
|
580
|
+
useEffect(() => {
|
|
581
|
+
// Update ref to track what we're sending to parent
|
|
582
|
+
lastValueRef.current = debouncedValue || '';
|
|
583
|
+
onChangeRef.current(debouncedValue || null);
|
|
584
|
+
onFilterRef.current?.(debouncedValue || null);
|
|
585
|
+
}, [debouncedValue]);
|
|
586
|
+
// Provide filter instance via getFilter callback - only on mount
|
|
587
|
+
useEffect(() => {
|
|
588
|
+
if (getFilter) {
|
|
589
|
+
getFilter({
|
|
590
|
+
get value() {
|
|
591
|
+
return selectedValueRef.current || null;
|
|
592
|
+
},
|
|
593
|
+
setValue: (newValue) => {
|
|
594
|
+
setSelectedValue(newValue || '');
|
|
595
|
+
onChangeRef.current(newValue);
|
|
596
|
+
onFilterRef.current?.(newValue);
|
|
597
|
+
},
|
|
598
|
+
clear: () => {
|
|
599
|
+
setSelectedValue('');
|
|
600
|
+
onChangeRef.current(null);
|
|
601
|
+
onFilterRef.current?.(null);
|
|
602
|
+
},
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
606
|
+
}, [getFilter]);
|
|
607
|
+
// Simple change handler - just update local state
|
|
608
|
+
const handleChange = useCallback((e) => {
|
|
609
|
+
setSelectedValue(e.target.value);
|
|
610
|
+
}, []);
|
|
611
|
+
// Use custom options if provided, otherwise fall back to column.filterOptions
|
|
612
|
+
const selectOptions = customOptions || column.filterOptions || [];
|
|
613
|
+
const selectContent = (_jsxs(_Fragment, { children: [_jsx("option", { value: "", children: placeholder }), selectOptions.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value)))] }));
|
|
614
|
+
// If custom className is provided, use plain select to allow full CSS control
|
|
615
|
+
if (className) {
|
|
616
|
+
return (_jsx("select", { id: id, value: selectedValue, onChange: handleChange, className: className, style: { width: '100%', fontWeight: 400, ...style }, disabled: disabled, children: selectContent }));
|
|
617
|
+
}
|
|
618
|
+
return (_jsx(FilterSelectBase, { id: id, value: selectedValue, onChange: handleChange, style: { fontWeight: 400, ...style }, disabled: disabled, children: selectContent }));
|
|
619
|
+
};
|
|
620
|
+
export function SelectFilter(optionsOrProps) {
|
|
621
|
+
if (!('column' in optionsOrProps) &&
|
|
622
|
+
!('value' in optionsOrProps) &&
|
|
623
|
+
!('onChange' in optionsOrProps)) {
|
|
624
|
+
const options = optionsOrProps;
|
|
625
|
+
const FilterWithOptions = (props) => (_jsx(SelectFilterComponent, { ...props, options: options }));
|
|
626
|
+
FilterWithOptions.displayName = 'SelectFilter';
|
|
627
|
+
return FilterWithOptions;
|
|
628
|
+
}
|
|
629
|
+
const props = optionsOrProps;
|
|
630
|
+
return _jsx(SelectFilterComponent, { ...props });
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Get filter component based on type
|
|
634
|
+
*/
|
|
635
|
+
export const getFilterComponent = (type) => {
|
|
636
|
+
switch (type) {
|
|
637
|
+
case 'number':
|
|
638
|
+
return NumberFilter;
|
|
639
|
+
case 'date':
|
|
640
|
+
case 'dateRange':
|
|
641
|
+
return DateFilter;
|
|
642
|
+
case 'select':
|
|
643
|
+
return SelectFilter;
|
|
644
|
+
default:
|
|
645
|
+
return TextFilter;
|
|
646
|
+
}
|
|
647
|
+
};
|