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.
Files changed (232) hide show
  1. package/lib/index.js +3 -1
  2. package/lib/src/core-components/index.js +1 -1
  3. package/lib/src/core-components/src/components/Accordion/AccordionSection/Accordion.js +15 -1
  4. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionContext.js +6 -1
  5. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionSection.js +39 -1
  6. package/lib/src/core-components/src/components/Accordion/AccordionSection/Header.js +39 -1
  7. package/lib/src/core-components/src/components/Accordion/AccordionSection/elements.js +94 -57
  8. package/lib/src/core-components/src/components/Accordion/AccordionSection/hooks/useCurrentAccordionIndex.js +13 -1
  9. package/lib/src/core-components/src/components/Accordion/AccordionSection/index.js +3 -1
  10. package/lib/src/core-components/src/components/Accordion/AccordionSection/types.js +9 -1
  11. package/lib/src/core-components/src/components/Accordion/Collapsible/Collapsible2.component.js +249 -1
  12. package/lib/src/core-components/src/components/Action/types.js +8 -1
  13. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +45 -1
  14. package/lib/src/core-components/src/components/AlertBanner/elements.js +120 -45
  15. package/lib/src/core-components/src/components/AlertBanner/index.js +2 -1
  16. package/lib/src/core-components/src/components/AlertBanner/types.js +10 -1
  17. 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
  18. 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
  19. 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
  20. 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
  21. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +55 -1
  22. 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
  23. package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +115 -1
  24. package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +442 -2
  25. package/lib/src/core-components/src/components/AutoComplete/index.js +8 -1
  26. package/lib/src/core-components/src/components/Avatar/Avatar.js +148 -14
  27. package/lib/src/core-components/src/components/Badge/Badge.js +25 -2
  28. package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +25 -1
  29. package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +25 -1
  30. package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +78 -32
  31. package/lib/src/core-components/src/components/Badge/InnerBadge/index.js +1 -1
  32. package/lib/src/core-components/src/components/Badge/index.js +1 -1
  33. package/lib/src/core-components/src/components/Badge/types.js +5 -1
  34. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -1
  35. package/lib/src/core-components/src/components/Breadcrumb/elements.js +166 -94
  36. package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -1
  37. package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -1
  38. package/lib/src/core-components/src/components/Button/button.component.js +18 -1
  39. package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +4 -1
  40. package/lib/src/core-components/src/components/Button/index.js +2 -1
  41. package/lib/src/core-components/src/components/Button/types.js +1 -1
  42. package/lib/src/core-components/src/components/Chip/Chip.js +64 -1
  43. package/lib/src/core-components/src/components/Chip/elements.js +148 -48
  44. package/lib/src/core-components/src/components/Chip/index.js +2 -1
  45. package/lib/src/core-components/src/components/Chip/types.js +4 -1
  46. package/lib/src/core-components/src/components/Divider/Divider.js +25 -1
  47. package/lib/src/core-components/src/components/Divider/elements.js +68 -31
  48. package/lib/src/core-components/src/components/Divider/index.js +2 -1
  49. package/lib/src/core-components/src/components/Divider/types.js +4 -1
  50. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -1
  51. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +24 -17
  52. package/lib/src/core-components/src/components/DynamicGrid/elements.js +162 -100
  53. package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -1
  54. package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -1
  55. package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -1
  56. package/lib/src/core-components/src/components/FormField/FormField.js +103 -1
  57. package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +37 -1
  58. package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +8 -1
  59. package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +192 -1
  60. package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +99 -1
  61. package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +70 -1
  62. package/lib/src/core-components/src/components/FormField/components/OtpInput.js +81 -1
  63. package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +40 -1
  64. package/lib/src/core-components/src/components/FormField/components/PinInput.js +75 -1
  65. package/lib/src/core-components/src/components/FormField/components/RadioInput.js +54 -1
  66. package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +94 -1
  67. package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +36 -1
  68. package/lib/src/core-components/src/components/FormField/components/index.js +11 -1
  69. package/lib/src/core-components/src/components/FormField/css-properties.js +161 -1
  70. package/lib/src/core-components/src/components/FormField/index.js +2 -1
  71. package/lib/src/core-components/src/components/Icon/Icon.js +79 -1
  72. package/lib/src/core-components/src/components/Icon/index.js +2 -1
  73. package/lib/src/core-components/src/components/Icon/types.js +9 -1
  74. package/lib/src/core-components/src/components/Loader/loader.component.js +215 -2
  75. package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -1
  76. package/lib/src/core-components/src/components/Masonry/elements.js +46 -29
  77. package/lib/src/core-components/src/components/Masonry/hooks.js +100 -1
  78. package/lib/src/core-components/src/components/Masonry/index.js +3 -1
  79. package/lib/src/core-components/src/components/Masonry/types.js +1 -1
  80. package/lib/src/core-components/src/components/Modal/BasicModal/modal.component.js +116 -1
  81. package/lib/src/core-components/src/components/Modal/index.js +2 -1
  82. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +147 -1
  83. package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +12 -1
  84. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +40 -1
  85. package/lib/src/core-components/src/components/Picker/index.js +2 -1
  86. package/lib/src/core-components/src/components/Selection/index.js +4 -1
  87. package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +49 -1
  88. package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +58 -1
  89. package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +43 -1
  90. package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +87 -1
  91. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -1
  92. package/lib/src/core-components/src/components/Skeleton/elements.js +143 -54
  93. package/lib/src/core-components/src/components/Skeleton/index.js +2 -1
  94. package/lib/src/core-components/src/components/Skeleton/types.js +4 -1
  95. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -1
  96. package/lib/src/core-components/src/components/SpeedDial/elements.js +132 -62
  97. package/lib/src/core-components/src/components/SpeedDial/index.js +2 -1
  98. package/lib/src/core-components/src/components/SpeedDial/types.js +3 -1
  99. package/lib/src/core-components/src/components/Stepper2/stepper.component.js +139 -1
  100. package/lib/src/core-components/src/components/Switch/Switch.js +26 -1
  101. package/lib/src/core-components/src/components/Switch/elements.js +103 -34
  102. package/lib/src/core-components/src/components/Switch/index.js +2 -1
  103. package/lib/src/core-components/src/components/Switch/types.js +3 -1
  104. package/lib/src/core-components/src/components/Table/Table.js +1332 -1
  105. package/lib/src/core-components/src/components/Table/columnReorder.d.ts +128 -0
  106. package/lib/src/core-components/src/components/Table/columnReorder.js +530 -0
  107. package/lib/src/core-components/src/components/Table/columnResize.d.ts +99 -0
  108. package/lib/src/core-components/src/components/Table/columnResize.js +399 -0
  109. package/lib/src/core-components/src/components/Table/elements.d.ts +9 -1
  110. package/lib/src/core-components/src/components/Table/elements.js +324 -155
  111. package/lib/src/core-components/src/components/Table/filters.js +555 -30
  112. package/lib/src/core-components/src/components/Table/hooks.js +536 -2
  113. package/lib/src/core-components/src/components/Table/index.d.ts +4 -0
  114. package/lib/src/core-components/src/components/Table/index.js +6 -1
  115. package/lib/src/core-components/src/components/Table/types.d.ts +58 -0
  116. package/lib/src/core-components/src/components/Table/types.js +1 -1
  117. package/lib/src/core-components/src/components/Tabs/tabs.component.js +22 -1
  118. package/lib/src/core-components/src/components/Tags1/Tags.component.js +118 -1
  119. package/lib/src/core-components/src/components/Tags1/types.js +20 -1
  120. package/lib/src/core-components/src/components/Timer1/timer.component.js +76 -1
  121. package/lib/src/core-components/src/components/Toast/Toast.js +50 -1
  122. package/lib/src/core-components/src/components/Toast/elements.js +122 -41
  123. package/lib/src/core-components/src/components/Toast/index.js +2 -1
  124. package/lib/src/core-components/src/components/Toast/types.js +9 -1
  125. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -1
  126. package/lib/src/core-components/src/components/Tooltip/elements.js +117 -55
  127. package/lib/src/core-components/src/components/Tooltip/index.js +2 -1
  128. package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
  129. package/lib/src/core-components/src/components/Tooltip/utils.js +140 -1
  130. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -1
  131. package/lib/src/core-components/src/components/TreeSelect/elements.js +216 -117
  132. package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -1
  133. package/lib/src/core-components/src/components/TreeSelect/index.js +3 -1
  134. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
  135. package/lib/src/core-components/src/components/index.js +30 -1
  136. package/lib/src/core-components/src/components/pdf/pdf-images.components.js +7 -1
  137. package/lib/src/core-components/src/components/pdf/pdf-table.components.js +48 -5
  138. package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +70 -1
  139. package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +50 -1
  140. package/lib/src/core-components/src/core-components/Avatar.js +33 -4
  141. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +10 -1
  142. package/lib/src/core-components/src/core-components/CoreButton/elements.js +176 -67
  143. package/lib/src/core-components/src/core-components/CoreButton/index.js +3 -1
  144. package/lib/src/core-components/src/core-components/CoreButton/types.js +6 -1
  145. package/lib/src/core-components/src/core-components/CoreButton/utils.js +12 -1
  146. package/lib/src/core-components/src/core-components/Divider/Divider.js +19 -4
  147. package/lib/src/core-components/src/core-components/Divider/index.js +1 -1
  148. package/lib/src/core-components/src/core-components/SelectionCardStrip/index.js +1 -1
  149. package/lib/src/core-components/src/core-components/SelectionCardStrip/selectionCardStrip.js +33 -10
  150. package/lib/src/core-components/src/core-components/StateLayer.js +5 -3
  151. package/lib/src/core-components/src/core-components/ToggleCore/elements.js +50 -25
  152. package/lib/src/core-components/src/core-components/ToggleCore/index.js +2 -1
  153. package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +14 -1
  154. package/lib/src/core-components/src/core-components/atoms/Input/Input.js +22 -1
  155. package/lib/src/core-components/src/core-components/atoms/Label/Label.js +21 -1
  156. package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +19 -1
  157. package/lib/src/core-components/src/core-components/index.js +3 -1
  158. package/lib/src/core-components/src/helpers/constants.js +11 -1
  159. package/lib/src/core-components/src/hooks/index.js +1 -1
  160. package/lib/src/core-components/src/hooks/outside.hook.js +28 -1
  161. package/lib/src/core-components/src/index.js +12 -1
  162. package/lib/src/core-components/src/tc.global.css +12 -1
  163. package/lib/src/core-components/src/tc.module.css +1 -1
  164. package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +28 -1
  165. package/lib/src/core-components/src/utils/abstracts/colors/index.js +49 -1
  166. package/lib/src/core-components/src/utils/abstracts/index.js +5 -1
  167. package/lib/src/core-components/src/utils/abstracts/space/index.js +26 -1
  168. package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +8 -1
  169. package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +30 -1
  170. package/lib/src/core-components/src/utils/abstracts/theme/index.js +3 -1
  171. package/lib/src/core-components/src/utils/abstracts/theme/theme.js +30 -1
  172. package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
  173. package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +17 -1
  174. package/lib/src/core-components/src/utils/abstracts/typography/index.js +25 -1
  175. package/lib/src/core-components/src/utils/context/DefaultsProvider.js +8 -1
  176. package/lib/src/core-components/src/utils/context/InternalProvider.js +24 -1
  177. package/lib/src/core-components/src/utils/context/index.js +2 -1
  178. package/lib/src/core-components/src/utils/designTokens.js +125 -1
  179. package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +23 -1
  180. package/lib/src/core-components/src/utils/helpers/flattenChildren.js +11 -1
  181. package/lib/src/core-components/src/utils/helpers/getChildByType.js +3 -1
  182. package/lib/src/core-components/src/utils/helpers/index.js +5 -1
  183. package/lib/src/core-components/src/utils/helpers/isComponentType.js +16 -1
  184. package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +12 -1
  185. package/lib/src/core-components/src/utils/hooks/index.js +18 -1
  186. package/lib/src/core-components/src/utils/hooks/useClickOutside.js +18 -1
  187. package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +17 -1
  188. package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +12 -1
  189. package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +20 -1
  190. package/lib/src/core-components/src/utils/hooks/useDeprecation.js +40 -1
  191. package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +10 -1
  192. package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +24 -1
  193. package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +16 -1
  194. package/lib/src/core-components/src/utils/hooks/useHoverState.js +36 -1
  195. package/lib/src/core-components/src/utils/hooks/useId.js +7 -1
  196. package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +11 -1
  197. package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +16 -1
  198. package/lib/src/core-components/src/utils/hooks/useOverflow.js +22 -1
  199. package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +5 -1
  200. package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +18 -1
  201. package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +30 -1
  202. package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +23 -1
  203. package/lib/src/core-components/src/utils/index.js +9 -1
  204. package/lib/src/core-components/src/utils/stories/Wrappers.js +23 -8
  205. package/lib/src/core-components/src/utils/stories/cleanProps.js +5 -1
  206. package/lib/src/core-components/src/utils/stories/index.js +4 -1
  207. package/lib/src/core-components/src/utils/stories/sleep.js +4 -1
  208. package/lib/src/core-components/src/utils/stories/view-ports.js +50 -1
  209. package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +5 -1
  210. package/lib/src/core-components/src/utils/styling/createGridContainer.js +12 -6
  211. package/lib/src/core-components/src/utils/styling/createTransition.js +7 -2
  212. package/lib/src/core-components/src/utils/styling/forwardProps.js +10 -1
  213. package/lib/src/core-components/src/utils/styling/index.js +5 -1
  214. package/lib/src/core-components/src/utils/styling/pxToRem.js +6 -1
  215. package/lib/src/core-components/src/utils/testing/getComputedStyle.js +3 -1
  216. package/lib/src/core-components/src/utils/testing/index.js +1 -1
  217. package/lib/src/core-components/src/utils/utility.util.js +14 -1
  218. package/lib/src/core-components/tailwind.config.js +233 -1
  219. package/lib/src/core-hooks/index.js +3 -1
  220. package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +46 -1
  221. package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +30 -1
  222. package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +8 -1
  223. package/lib/src/core-utils/index.js +7 -1
  224. package/lib/src/core-utils/src/calculation/calculation.util.js +89 -1
  225. package/lib/src/core-utils/src/colors/color.util.js +15 -1
  226. package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +145 -1
  227. package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +5 -1
  228. package/lib/src/core-utils/src/form-helper/form-helper.util.js +82 -1
  229. package/lib/src/core-utils/src/index.js +7 -1
  230. package/lib/src/core-utils/src/utility/utility.util.js +12 -1
  231. package/lib/src/core-utils/src/uuid/uuid.util.js +8 -1
  232. package/package.json +1 -1
@@ -1,64 +1,74 @@
1
- "use strict";"use client";import{jsx as c,jsxs as G,Fragment as Q}from"react/jsx-runtime";import{useState as _,useCallback as B,useEffect as d,useRef as f}from"react";import{styled as M,css as U}from"styled-components";import{tokens as i}from"../../utils/designTokens";import{useDebouncedValue as H}from"../../utils/hooks/useDebouncedValue";const X=M.div`
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
- `,Y=M.input`
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 ${i.outline||"#e2e8f0"};
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: ${i.primary||"#94a3b8"};
26
+ border-color: ${tokens.primary || '#94a3b8'};
19
27
  }
20
28
 
21
29
  &:focus {
22
30
  outline: none;
23
- border-color: ${i.primary||"#3b82f6"};
31
+ border-color: ${tokens.primary || '#3b82f6'};
24
32
  box-shadow: 0 0 0 1px
25
- ${i.primary?`${i.primary}20`:"#3b82f620"};
33
+ ${tokens.primary ? `${tokens.primary}20` : '#3b82f620'};
26
34
  }
27
35
 
28
36
  &::placeholder {
29
- color: ${i.onSurface?`${i.onSurface}50`:"#94a3af"};
37
+ color: ${tokens.onSurface ? `${tokens.onSurface}50` : '#94a3af'};
30
38
  font-size: 9px;
31
39
  }
32
- `,ne=M.select`
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 ${i.outline||"#e2e8f0"};
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: ${i.primary||"#94a3b8"};
55
+ border-color: ${tokens.primary || '#94a3b8'};
47
56
  }
48
57
 
49
58
  &:focus {
50
59
  outline: none;
51
- border-color: ${i.primary||"#3b82f6"};
60
+ border-color: ${tokens.primary || '#3b82f6'};
52
61
  box-shadow: 0 0 0 1px
53
- ${i.primary?`${i.primary}20`:"#3b82f620"};
62
+ ${tokens.primary ? `${tokens.primary}20` : '#3b82f620'};
54
63
  }
55
- `,Z=M.select`
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 ${i.outline||"#e2e8f0"};
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: ${i.primary||"#94a3b8"};
80
+ border-color: ${tokens.primary || '#94a3b8'};
71
81
  }
72
82
 
73
83
  &:focus {
74
84
  outline: none;
75
- border-color: ${i.primary||"#3b82f6"};
85
+ border-color: ${tokens.primary || '#3b82f6'};
76
86
  }
77
- `,O=M.input`
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 ${i.outline||"#e2e8f0"};
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: ${i.primary||"#94a3b8"};
100
+ border-color: ${tokens.primary || '#94a3b8'};
90
101
  }
91
102
 
92
103
  &:focus {
93
104
  outline: none;
94
- border-color: ${i.primary||"#3b82f6"};
105
+ border-color: ${tokens.primary || '#3b82f6'};
95
106
  box-shadow: 0 0 0 1px
96
- ${i.primary?`${i.primary}20`:"#3b82f620"};
107
+ ${tokens.primary ? `${tokens.primary}20` : '#3b82f620'};
97
108
  }
98
- `,ae=M.button`
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 ${i.outline||"#e2e8f0"};
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:e})=>e?U`
110
- background: ${i.primary||"#3b82f6"};
121
+ ${({ $active }) => $active
122
+ ? css `
123
+ background: ${tokens.primary || '#3b82f6'};
111
124
  color: white;
112
- border-color: ${i.primary||"#3b82f6"};
113
- `:U`
125
+ border-color: ${tokens.primary || '#3b82f6'};
126
+ `
127
+ : css `
114
128
  background: white;
115
- color: ${i.onSurface||"#374151"};
129
+ color: ${tokens.onSurface || '#374151'};
116
130
 
117
131
  &:hover {
118
132
  background: #f8fafc;
119
- border-color: ${i.primary||"#94a3b8"};
133
+ border-color: ${tokens.primary || '#94a3b8'};
120
134
  }
121
135
  `}
122
- `,P=({column:e,value:n,onChange:s,options:h})=>{const{placeholder:x,className:z,style:S,defaultValue:W,delay:V=500,getFilter:C,onFilter:w,id:k,disabled:$}=h||{},[D,b]=_(n||W||""),F=f(D),y=f(null),o=f(s),p=f(w),l=f(D);d(()=>{F.current=D},[D]),d(()=>{o.current=s,p.current=w},[s,w]),d(()=>{const u=n||"";u!==l.current&&(b(u),l.current=u)},[n]);const[g]=H(D,{wait:V});d(()=>{l.current=g||"",o.current(g||null),p.current?.(g)},[g]),d(()=>{C&&C({get value(){return F.current},setValue:u=>{b(u),o.current(u||null),p.current?.(u)},clear:()=>{b(""),o.current(null),p.current?.("")}})},[C]);const m=f(!1),R=B(u=>{b(u.target.value)},[]),v=B(()=>{m.current=!0},[]),r=B(()=>{m.current=!1},[]);d(()=>{m.current&&y.current&&requestAnimationFrame(()=>{m.current&&y.current&&y.current.focus()})});const N={fontWeight:400,...S};return z?c("input",{ref:y,type:"text",id:k,"data-filter-field":e.dataField,value:D,onChange:R,onFocus:v,onBlur:r,placeholder:x||e.filterPlaceholder||`Filter ${e.text}...`,className:z,style:{width:"100%",fontWeight:400,...S},disabled:$}):c(Y,{ref:y,type:"text",id:k,"data-filter-field":e.dataField,value:D,onChange:R,onFocus:v,onBlur:r,placeholder:x||e.filterPlaceholder||`Filter ${e.text}...`,style:N,disabled:$})};export function TextFilter(e){if(!("column"in e)&&!("value"in e)&&!("onChange"in e)){const s=e,h=x=>c(P,{...x,options:s});return h.displayName="TextFilter",h}return c(P,{...e})}const ee=({column:e,value:n,onChange:s,options:h})=>{const{placeholder:x,className:z,style:S,defaultValue:W,delay:V=500,defaultComparator:C="=",allowDecimal:w=!0,getFilter:k,onFilter:$,id:D,disabled:b,hideComparator:F,comparators:y=["=","!=",">",">=","<","<="]}=h||{},[o,p]=_(n?.number||W?.number||""),[l,g]=_(n?.comparator||W?.comparator||C),m=f(o),R=f(l),v=f(null),r=f(s),N=f($),u=f(o),I=f(l);d(()=>{m.current=o,R.current=l},[o,l]),d(()=>{r.current=s,N.current=$},[s,$]),d(()=>{const t=n?.number||"",j=n?.comparator||C;t!==u.current&&(p(t),u.current=t),j!==I.current&&(g(j),I.current=j)},[n,C]);const[E]=H(o,{wait:V});d(()=>{u.current=E||"",I.current=R.current;const t=E?{number:E,comparator:R.current}:null;r.current(t),N.current?.(t)},[E]),d(()=>{k&&k({get value(){return m.current?{number:m.current,comparator:R.current}:null},setValue:t=>{t?(p(t.number),g(t.comparator),r.current(t),N.current?.(t)):(p(""),r.current(null),N.current?.(null))},clear:()=>{p(""),g(C),r.current(null),N.current?.(null)}})},[k]);const q=f(!1),J=B(()=>{q.current=!0},[]),K=B(()=>{q.current=!1},[]);d(()=>{q.current&&v.current&&requestAnimationFrame(()=>{q.current&&v.current&&v.current.focus()})});const L=B(t=>{if(g(t),o){const j={number:o,comparator:t};r.current(j),N.current?.(j)}},[o]),a={"=":"=","!=":"\u2260",">":">",">=":"\u2265","<":"<","<=":"\u2264"},T={flex:1,fontWeight:400,...S},A={type:"text",id:D,"data-filter-field":e.dataField,value:o,onChange:t=>{const j=t.target.value;(w?/^[0-9.,]*$/:/^[0-9]*$/).test(j)&&p(j)},onFocus:J,onBlur:K,placeholder:x||e.filterPlaceholder||"Number...",disabled:b};return G(X,{children:[!F&&c(Z,{value:l,onChange:t=>L(t.target.value),disabled:b,children:y.map(t=>c("option",{value:t,children:a[t]||t},t))}),z?c("input",{ref:v,...A,className:z,style:{flex:1,width:"100%",fontWeight:400,...S}}):c(Y,{ref:v,...A,style:T})]})};export function NumberFilter(e){if(!("column"in e)&&!("value"in e)&&!("onChange"in e)){const s=e,h=x=>c(ee,{...x,options:s});return h.displayName="NumberFilter",h}return c(ee,{...e})}const te=({column:e,value:n,onChange:s,options:h})=>{const{className:x,style:z,defaultValue:S,defaultComparator:W="=",defaultRangeMode:V=!1,getFilter:C,onFilter:w,id:k,disabled:$,minDate:D,maxDate:b}=h||{},[F,y]=_(n?.startDate||S?.startDate||""),[o,p]=_(n?.endDate||S?.endDate||""),[l,g]=_(n?.diffFlag??S?.diffFlag??V),[m,R]=_(n?.comparator||S?.comparator||W),v=f({startDate:F,endDate:o,diffFlag:l,comparator:m}),r=f(s),N=f(w),u=f({startDate:F,endDate:o,diffFlag:l,comparator:m});d(()=>{v.current={startDate:F,endDate:o,diffFlag:l,comparator:m}},[F,o,l,m]),d(()=>{r.current=s,N.current=w},[s,w]),d(()=>{const a=n?.startDate||"",T=n?.endDate||"",A=n?.diffFlag??V,t=n?.comparator||W;a!==u.current.startDate&&(y(a),u.current.startDate=a),T!==u.current.endDate&&(p(T),u.current.endDate=T),A!==u.current.diffFlag&&(g(A),u.current.diffFlag=A),t!==u.current.comparator&&(R(t),u.current.comparator=t)},[n,V,W]);const[I]=H(F,{wait:500}),[E]=H(o,{wait:500});d(()=>{u.current={startDate:I,endDate:E,diffFlag:l,comparator:m};const a=I||E?{startDate:I,endDate:E,diffFlag:l,comparator:m}:null;r.current(a),N.current?.(a)},[I,E,l,m]),d(()=>{C&&C({get value(){const{startDate:a,endDate:T,diffFlag:A,comparator:t}=v.current;return a||T?{startDate:a,endDate:T,diffFlag:A,comparator:t}:null},setValue:a=>{a?(y(a.startDate||""),p(a.endDate||""),g(a.diffFlag??V),R(a.comparator||W),r.current(a),N.current?.(a)):(y(""),p(""),r.current(null),N.current?.(null))},clear:()=>{y(""),p(""),g(V),R(W),r.current(null),N.current?.(null)}})},[C]);const q=B(a=>{y(a.target.value)},[]),J=B(a=>{p(a.target.value)},[]),K=B(()=>{g(a=>!a)},[]),L=B(a=>{R(a.target.value)},[]);return G(X,{className:x,style:z,children:[c(ae,{$active:l,onClick:K,title:"Date range mode",disabled:$,children:l?"Range":"Single"}),!l&&G(Z,{value:m,onChange:L,disabled:$,style:{fontWeight:400},children:[c("option",{value:"=",children:"="}),c("option",{value:">=",children:"\u2265"}),c("option",{value:"<",children:"<"})]}),c(O,{type:"date",id:k,value:F,onChange:q,disabled:$,min:D,max:b,style:{fontWeight:400}}),l&&G(Q,{children:[c("span",{style:{color:"#6b7280",fontSize:12,fontWeight:400},children:"to"}),c(O,{type:"date",value:o,onChange:J,disabled:$,min:D,max:b,style:{fontWeight:400}})]})]})};export function DateFilter(e){if(!("column"in e)&&!("value"in e)&&!("onChange"in e)){const s=e,h=x=>c(te,{...x,options:s});return h.displayName="DateFilter",h}return c(te,{...e})}const re=({column:e,value:n,onChange:s,options:h})=>{const{placeholder:x="All",className:z,style:S,defaultValue:W,delay:V=300,options:C,getFilter:w,onFilter:k,id:$,disabled:D}=h||{},[b,F]=_(n||W||""),y=f(b),o=f(s),p=f(k),l=f(b);d(()=>{y.current=b},[b]),d(()=>{o.current=s,p.current=k},[s,k]),d(()=>{const r=n||"";r!==l.current&&(F(r),l.current=r)},[n]);const[g]=H(b,{wait:V});d(()=>{l.current=g||"",o.current(g||null),p.current?.(g||null)},[g]),d(()=>{w&&w({get value(){return y.current||null},setValue:r=>{F(r||""),o.current(r),p.current?.(r)},clear:()=>{F(""),o.current(null),p.current?.(null)}})},[w]);const m=B(r=>{F(r.target.value)},[]),R=C||e.filterOptions||[],v=G(Q,{children:[c("option",{value:"",children:x}),R.map(r=>c("option",{value:r.value,children:r.label},r.value))]});return z?c("select",{id:$,value:b,onChange:m,className:z,style:{width:"100%",fontWeight:400,...S},disabled:D,children:v}):c(ne,{id:$,value:b,onChange:m,style:{fontWeight:400,...S},disabled:D,children:v})};export function SelectFilter(e){if(!("column"in e)&&!("value"in e)&&!("onChange"in e)){const s=e,h=x=>c(re,{...x,options:s});return h.displayName="SelectFilter",h}return c(re,{...e})}export const getFilterComponent=e=>{switch(e){case"number":return NumberFilter;case"date":case"dateRange":return DateFilter;case"select":return SelectFilter;default:return TextFilter}};
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
+ };