react-restyle-components 0.4.47 → 0.4.48

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 (233) 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.d.ts +3 -1
  18. 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 +466 -1
  19. 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
  20. 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
  21. 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
  22. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +55 -1
  23. 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
  24. package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +115 -1
  25. package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +442 -2
  26. package/lib/src/core-components/src/components/AutoComplete/index.js +8 -1
  27. package/lib/src/core-components/src/components/Avatar/Avatar.js +148 -14
  28. package/lib/src/core-components/src/components/Badge/Badge.js +25 -2
  29. package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +25 -1
  30. package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +25 -1
  31. package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +78 -32
  32. package/lib/src/core-components/src/components/Badge/InnerBadge/index.js +1 -1
  33. package/lib/src/core-components/src/components/Badge/index.js +1 -1
  34. package/lib/src/core-components/src/components/Badge/types.js +5 -1
  35. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -1
  36. package/lib/src/core-components/src/components/Breadcrumb/elements.js +166 -94
  37. package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -1
  38. package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -1
  39. package/lib/src/core-components/src/components/Button/button.component.js +18 -1
  40. package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +4 -1
  41. package/lib/src/core-components/src/components/Button/index.js +2 -1
  42. package/lib/src/core-components/src/components/Button/types.js +1 -1
  43. package/lib/src/core-components/src/components/Chip/Chip.js +64 -1
  44. package/lib/src/core-components/src/components/Chip/elements.js +148 -48
  45. package/lib/src/core-components/src/components/Chip/index.js +2 -1
  46. package/lib/src/core-components/src/components/Chip/types.js +4 -1
  47. package/lib/src/core-components/src/components/Divider/Divider.js +25 -1
  48. package/lib/src/core-components/src/components/Divider/elements.js +68 -31
  49. package/lib/src/core-components/src/components/Divider/index.js +2 -1
  50. package/lib/src/core-components/src/components/Divider/types.js +4 -1
  51. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -1
  52. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +24 -17
  53. package/lib/src/core-components/src/components/DynamicGrid/elements.js +162 -100
  54. package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -1
  55. package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -1
  56. package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -1
  57. package/lib/src/core-components/src/components/FormField/FormField.js +103 -1
  58. package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +37 -1
  59. package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +8 -1
  60. package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +192 -1
  61. package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +99 -1
  62. package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +70 -1
  63. package/lib/src/core-components/src/components/FormField/components/OtpInput.js +81 -1
  64. package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +40 -1
  65. package/lib/src/core-components/src/components/FormField/components/PinInput.js +75 -1
  66. package/lib/src/core-components/src/components/FormField/components/RadioInput.js +54 -1
  67. package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +94 -1
  68. package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +36 -1
  69. package/lib/src/core-components/src/components/FormField/components/index.js +11 -1
  70. package/lib/src/core-components/src/components/FormField/css-properties.js +161 -1
  71. package/lib/src/core-components/src/components/FormField/index.js +2 -1
  72. package/lib/src/core-components/src/components/Icon/Icon.js +159 -1
  73. package/lib/src/core-components/src/components/Icon/index.js +2 -1
  74. package/lib/src/core-components/src/components/Icon/types.js +9 -1
  75. package/lib/src/core-components/src/components/Loader/loader.component.js +215 -2
  76. package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -1
  77. package/lib/src/core-components/src/components/Masonry/elements.js +46 -29
  78. package/lib/src/core-components/src/components/Masonry/hooks.js +100 -1
  79. package/lib/src/core-components/src/components/Masonry/index.js +3 -1
  80. package/lib/src/core-components/src/components/Masonry/types.js +1 -1
  81. package/lib/src/core-components/src/components/Modal/BasicModal/modal.component.js +116 -1
  82. package/lib/src/core-components/src/components/Modal/index.js +2 -1
  83. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +147 -1
  84. package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +12 -1
  85. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +40 -1
  86. package/lib/src/core-components/src/components/Picker/index.js +2 -1
  87. package/lib/src/core-components/src/components/Selection/index.js +4 -1
  88. package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +49 -1
  89. package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +58 -1
  90. package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +43 -1
  91. package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +87 -1
  92. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -1
  93. package/lib/src/core-components/src/components/Skeleton/elements.js +143 -54
  94. package/lib/src/core-components/src/components/Skeleton/index.js +2 -1
  95. package/lib/src/core-components/src/components/Skeleton/types.js +4 -1
  96. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -1
  97. package/lib/src/core-components/src/components/SpeedDial/elements.js +132 -62
  98. package/lib/src/core-components/src/components/SpeedDial/index.js +2 -1
  99. package/lib/src/core-components/src/components/SpeedDial/types.js +3 -1
  100. package/lib/src/core-components/src/components/Stepper2/stepper.component.js +139 -1
  101. package/lib/src/core-components/src/components/Switch/Switch.js +26 -1
  102. package/lib/src/core-components/src/components/Switch/elements.js +103 -34
  103. package/lib/src/core-components/src/components/Switch/index.js +2 -1
  104. package/lib/src/core-components/src/components/Switch/types.js +3 -1
  105. package/lib/src/core-components/src/components/Table/Table.js +1489 -1
  106. package/lib/src/core-components/src/components/Table/columnReorder.js +332 -36
  107. package/lib/src/core-components/src/components/Table/columnResize.js +284 -21
  108. package/lib/src/core-components/src/components/Table/elements.js +277 -173
  109. package/lib/src/core-components/src/components/Table/filters.js +555 -30
  110. package/lib/src/core-components/src/components/Table/hooks.js +536 -2
  111. package/lib/src/core-components/src/components/Table/index.js +6 -1
  112. package/lib/src/core-components/src/components/Table/types.js +1 -1
  113. package/lib/src/core-components/src/components/Tabs/tabs.component.js +22 -1
  114. package/lib/src/core-components/src/components/Tags1/Tags.component.js +118 -1
  115. package/lib/src/core-components/src/components/Tags1/types.js +20 -1
  116. package/lib/src/core-components/src/components/Timer1/timer.component.js +76 -1
  117. package/lib/src/core-components/src/components/Toast/Toast.js +50 -1
  118. package/lib/src/core-components/src/components/Toast/elements.js +122 -41
  119. package/lib/src/core-components/src/components/Toast/index.js +2 -1
  120. package/lib/src/core-components/src/components/Toast/types.js +9 -1
  121. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -1
  122. package/lib/src/core-components/src/components/Tooltip/elements.js +117 -55
  123. package/lib/src/core-components/src/components/Tooltip/index.js +2 -1
  124. package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
  125. package/lib/src/core-components/src/components/Tooltip/utils.js +140 -1
  126. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -1
  127. package/lib/src/core-components/src/components/TreeSelect/elements.js +216 -117
  128. package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -1
  129. package/lib/src/core-components/src/components/TreeSelect/index.js +3 -1
  130. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
  131. package/lib/src/core-components/src/components/ag-grid/AgGrid.js +1057 -1
  132. package/lib/src/core-components/src/components/ag-grid/elements.js +790 -396
  133. package/lib/src/core-components/src/components/ag-grid/hooks.js +1220 -4
  134. package/lib/src/core-components/src/components/ag-grid/index.js +15 -1
  135. package/lib/src/core-components/src/components/ag-grid/types.js +6 -1
  136. package/lib/src/core-components/src/components/index.js +31 -1
  137. package/lib/src/core-components/src/components/pdf/pdf-images.components.js +7 -1
  138. package/lib/src/core-components/src/components/pdf/pdf-table.components.js +48 -5
  139. package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +70 -1
  140. package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +50 -1
  141. package/lib/src/core-components/src/core-components/Avatar.js +33 -4
  142. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +10 -1
  143. package/lib/src/core-components/src/core-components/CoreButton/elements.js +176 -67
  144. package/lib/src/core-components/src/core-components/CoreButton/index.js +3 -1
  145. package/lib/src/core-components/src/core-components/CoreButton/types.js +6 -1
  146. package/lib/src/core-components/src/core-components/CoreButton/utils.js +12 -1
  147. package/lib/src/core-components/src/core-components/Divider/Divider.js +19 -4
  148. package/lib/src/core-components/src/core-components/Divider/index.js +1 -1
  149. package/lib/src/core-components/src/core-components/SelectionCardStrip/index.js +1 -1
  150. package/lib/src/core-components/src/core-components/SelectionCardStrip/selectionCardStrip.js +33 -10
  151. package/lib/src/core-components/src/core-components/StateLayer.js +5 -3
  152. package/lib/src/core-components/src/core-components/ToggleCore/elements.js +50 -25
  153. package/lib/src/core-components/src/core-components/ToggleCore/index.js +2 -1
  154. package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +14 -1
  155. package/lib/src/core-components/src/core-components/atoms/Input/Input.js +22 -1
  156. package/lib/src/core-components/src/core-components/atoms/Label/Label.js +21 -1
  157. package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +19 -1
  158. package/lib/src/core-components/src/core-components/index.js +3 -1
  159. package/lib/src/core-components/src/helpers/constants.js +11 -1
  160. package/lib/src/core-components/src/hooks/index.js +1 -1
  161. package/lib/src/core-components/src/hooks/outside.hook.js +28 -1
  162. package/lib/src/core-components/src/index.js +12 -1
  163. package/lib/src/core-components/src/tc.global.css +1 -0
  164. package/lib/src/core-components/src/tc.module.css +1 -1
  165. package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +28 -1
  166. package/lib/src/core-components/src/utils/abstracts/colors/index.js +49 -1
  167. package/lib/src/core-components/src/utils/abstracts/index.js +5 -1
  168. package/lib/src/core-components/src/utils/abstracts/space/index.js +26 -1
  169. package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +8 -1
  170. package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +30 -1
  171. package/lib/src/core-components/src/utils/abstracts/theme/index.js +3 -1
  172. package/lib/src/core-components/src/utils/abstracts/theme/theme.js +30 -1
  173. package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
  174. package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +17 -1
  175. package/lib/src/core-components/src/utils/abstracts/typography/index.js +25 -1
  176. package/lib/src/core-components/src/utils/context/DefaultsProvider.js +8 -1
  177. package/lib/src/core-components/src/utils/context/InternalProvider.js +24 -1
  178. package/lib/src/core-components/src/utils/context/index.js +2 -1
  179. package/lib/src/core-components/src/utils/designTokens.js +128 -1
  180. package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +23 -1
  181. package/lib/src/core-components/src/utils/helpers/flattenChildren.js +11 -1
  182. package/lib/src/core-components/src/utils/helpers/getChildByType.js +3 -1
  183. package/lib/src/core-components/src/utils/helpers/index.js +5 -1
  184. package/lib/src/core-components/src/utils/helpers/isComponentType.js +16 -1
  185. package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +12 -1
  186. package/lib/src/core-components/src/utils/hooks/index.js +18 -1
  187. package/lib/src/core-components/src/utils/hooks/useClickOutside.js +18 -1
  188. package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +17 -1
  189. package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +12 -1
  190. package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +20 -1
  191. package/lib/src/core-components/src/utils/hooks/useDeprecation.js +40 -1
  192. package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +10 -1
  193. package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +24 -1
  194. package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +16 -1
  195. package/lib/src/core-components/src/utils/hooks/useHoverState.js +36 -1
  196. package/lib/src/core-components/src/utils/hooks/useId.js +7 -1
  197. package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +11 -1
  198. package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +16 -1
  199. package/lib/src/core-components/src/utils/hooks/useOverflow.js +22 -1
  200. package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +5 -1
  201. package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +18 -1
  202. package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +30 -1
  203. package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +23 -1
  204. package/lib/src/core-components/src/utils/index.js +9 -1
  205. package/lib/src/core-components/src/utils/stories/Wrappers.js +23 -8
  206. package/lib/src/core-components/src/utils/stories/cleanProps.js +5 -1
  207. package/lib/src/core-components/src/utils/stories/index.js +4 -1
  208. package/lib/src/core-components/src/utils/stories/sleep.js +4 -1
  209. package/lib/src/core-components/src/utils/stories/view-ports.js +50 -1
  210. package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +5 -1
  211. package/lib/src/core-components/src/utils/styling/createGridContainer.js +12 -6
  212. package/lib/src/core-components/src/utils/styling/createTransition.js +7 -2
  213. package/lib/src/core-components/src/utils/styling/forwardProps.js +10 -1
  214. package/lib/src/core-components/src/utils/styling/index.js +5 -1
  215. package/lib/src/core-components/src/utils/styling/pxToRem.js +6 -1
  216. package/lib/src/core-components/src/utils/testing/getComputedStyle.js +3 -1
  217. package/lib/src/core-components/src/utils/testing/index.js +1 -1
  218. package/lib/src/core-components/src/utils/utility.util.js +14 -1
  219. package/lib/src/core-components/tailwind.config.js +233 -1
  220. package/lib/src/core-hooks/index.js +3 -1
  221. package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +46 -1
  222. package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +30 -1
  223. package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +8 -1
  224. package/lib/src/core-utils/index.js +7 -1
  225. package/lib/src/core-utils/src/calculation/calculation.util.js +89 -1
  226. package/lib/src/core-utils/src/colors/color.util.js +15 -1
  227. package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +145 -1
  228. package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +5 -1
  229. package/lib/src/core-utils/src/form-helper/form-helper.util.js +82 -1
  230. package/lib/src/core-utils/src/index.js +7 -1
  231. package/lib/src/core-utils/src/utility/utility.util.js +12 -1
  232. package/lib/src/core-utils/src/uuid/uuid.util.js +8 -1
  233. package/package.json +1 -1
@@ -1 +1,466 @@
1
- "use strict";import{jsx as c,jsxs as i,Fragment as me}from"react/jsx-runtime";import fe,{useState as f,useEffect as E,useRef as X,useCallback as L}from"react";import{Icon as v}from"../../Icon/Icon";import e from"../../../tc.module.css";import{cn as n}from"../../../utils";export const AutoCompleteFilterGroupByMultipleSelectMultipleFieldsDisplay=({uniqueField:p="_id",groupByField:be,selectionConfig:xe={},displayConfig:ge={},uiConfig:ye={},loader:ve=!1,placeholder:Z="Search...",data:d,hasError:q=!1,disable:Ie=!1,isUpperCase:we=!1,name:Ce,groupByDetails:z,onFilter:ee,onUpdate:I,onSelect:S,onBlur:te,className:Ne,style:Se,filterDebounceDelay:se=500,optionsRenderKey:Ge})=>{const{isSelectedStringArray:P=!1,maxSelection:qe,onSelectionChange:R}=xe,{displayKeys:_,displaySeparator:ke=" - ",fallbackKeys:D=["name","code"],renderItem:x,renderGroupName:re}=ge,{showGroupHeaders:Oe=!0,collapsibleGroups:G=!1,showSelectAllButtons:je=!0,showSelectedSection:Ae=!0,selectedPlaceholder:M,emptyStateMessage:Te="No results found",emptyStateDescription:Fe="Try adjusting your search terms",enableInternalFilter:ne=!1,showGroupSearch:$e=!1,groupSearchMinItems:Ee=5}=ye,k=be||z?.groupByName||"lab",K=z?.defaultGroupName||"Default",Le=z?.totalItemName||"department",le=t=>{if(x){const s=x(t);if(typeof s=="string")return s}return(_||d.displayKey||D).map(s=>t[s]).filter(Boolean).join(ke)||"Unnamed Item"},ze=(t,r)=>re?re(t,r):t,[oe,O]=f(""),[m,j]=f({}),[U,A]=f({}),[T,g]=f([]),[ce,Pe]=f(new Set),[w,V]=f(!1),[Re,_e]=f(0),[B,Y]=f(""),[F,ae]=f({}),H=L((t,r)=>{if(!r||r.trim()==="")return t;const s=r.toLowerCase().trim(),o=_||d.displayKey||D;return t.filter(l=>o.some(a=>{const u=l[a];return typeof u=="string"?u.toLowerCase().includes(s):typeof u=="number"?u.toString().includes(s):!1}))},[_,d.displayKey,D]),De=L(()=>{const t={},r=B.trim();return Object.keys(m).forEach(s=>{const o=m[s]||[];let l=r?H(o,r):o;const a=F[s]?.trim();a&&(l=H(l,a)),l.length>0&&(t[s]=l)}),t},[m,B,F,H]),Me=(t,r)=>{ae(s=>({...s,[t]:r}))},Ke=t=>{ae(r=>{const s={...r};return delete s[t],s})},C=fe.useCallback(()=>Object.keys(U).reduce((t,r)=>{const s=(U[r]||[]).filter(o=>o.selected);return s.length>0&&(t[r]=s),t},{}),[U]),Ue=t=>{E(()=>{function r(s){if(t.current&&!t.current.contains(s.target)&&w){const o=C();S&&S(o);const l=J(m);I&&I(l),V(!1),O("")}}return document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[t,w,C,S,m,J,I])},J=L(t=>Array.isArray(t)?t.flat(Number.POSITIVE_INFINITY):Object.values(t).flat(Number.POSITIVE_INFINITY),[]),ie=X(null);Ue(ie);const de=(t,r)=>{const s={};let o=0;return Object.keys(t).forEach(l=>{const u=(t[l]||[]).map(b=>{o++;const W=r&&r.length>0?r.some($=>P?$===b[p]:$[p]===b[p]):!1;return{...b,selected:W}});s[l]=u}),_e(o),s},Ve=fe.useMemo(()=>d.list?Array.isArray(d.list)?d.list.length.toString():Object.keys(d.list).map(r=>`${r}:${d.list[r]?.length||0}`).join(","):"",[d.list]);E(()=>{let t={};if(d.list&&Array.isArray(d.list)){const s=d.list.reduce((o,l)=>{const a=l?.[k]||K;return o[a]||(o[a]=[]),o[a].push(l),o},{});t=de(s,d.selected||[])}else typeof d.list=="object"&&d.list!==null&&(t=de(d.list,d.selected||[]));A(t),j(t);const r=[];Object.keys(t).forEach(s=>{const o=(t[s]||[]).filter(l=>l.selected);r.push(...o)}),g(Array.isArray(d?.selected)&&!P?d.selected:r)},[d.list,d.selected,P,p,k,K,Ve]);const Q=X(ee);Q.current=ee;const N=X(null);E(()=>()=>{N.current&&clearTimeout(N.current)},[]);const ue=L(t=>{Q.current&&(N.current&&clearTimeout(N.current),N.current=setTimeout(()=>{Q.current?.(t)},se))},[se]),Be=t=>{const r=t.target.value;O(r),ne&&Y(r),ue(r)},Ye=t=>{if((t.which?t.which:t.keyCode)===8){const s=t.currentTarget.value;ne&&Y(s),ue(s)}},He=t=>{const r=new Set(ce);r.has(t)?r.delete(t):r.add(t),Pe(r)},pe=(t,r,s)=>{const o=r.map(l=>({...l,selected:s}));if(j(l=>({...l,[t]:o})),A(l=>({...l,[t]:o})),s){const l=[...T];r.forEach(a=>{l.findIndex(b=>b[p]===a[p])===-1&&l.push({...a,selected:!0})}),g(l)}else{const l=T.filter(a=>!r.some(u=>u[p]===a[p]));g(l)}},Je=(t,r,s)=>{const o=m[t][s],l=m[t].map((a,u)=>u===s?{...a,selected:!r}:a);j(a=>({...a,[t]:l})),A(a=>({...a,[t]:l})),g(r?a=>a.filter(u=>u[p]!==o[p]):a=>[...a,{...o,selected:!0}])},Qe=t=>{g(r=>r.filter(s=>s[p]!==t[p])),Object.keys(m).forEach(r=>{const s=m[r].map(o=>o[p]===t[p]?{...o,selected:!1}:o);j(o=>({...o,[r]:s})),A(o=>({...o,[r]:s}))})},We=()=>{const t=De(),r=Object.keys(t).sort();return r.length===0?i("div",{className:n(e["p-4"],e["text-center"],e["text-gray-500"]),children:[c(v,{nameIcon:"FaSearch",propsIcon:{size:24,color:"#ccc"}}),c("p",{className:n(e["mt-2"],e["text-sm"]),children:Te}),c("p",{className:n(e["text-xs"]),children:Fe}),B&&c("button",{type:"button",onClick:()=>{Y(""),O("")},className:n(e["mt-3"],e["text-xs"],e["px-3"],e["py-1"],e["bg-blue-500"],e["text-white"],e.rounded,e["hover:bg-blue-600"]),children:"Clear Search"})]}):r.map(s=>{const o=t[s]||[],l=m[s]||[],a=ce.has(s),u=l.filter(h=>h.selected).length,b=o.filter(h=>!h.selected),W=!!F[s],$=$e&&l.length>=Ee;return i("div",{className:n(e["border-b"],e["border-gray-200"],e["last:border-b-0"]),children:[Oe&&i("div",{className:n(e.flex,e["flex-col"],e["bg-gradient-to-r"],e["from-blue-50"],e["to-indigo-50"],e["border-b"],e["border-blue-200"]),children:[i("div",{className:n(e.flex,e["items-center"],e["justify-between"],e["p-3"],e["font-semibold"],e["text-sm"],e["text-gray-700"],G&&e["cursor-pointer"],e["hover:bg-blue-100"],e["transition-colors"]),onClick:()=>G&&He(s),children:[i("div",{className:n(e.flex,e["items-center"],e["gap-2"]),children:[G&&c(v,{nameIcon:a?"FaChevronRight":"FaChevronDown",propsIcon:{size:12,color:"#4F46E5"}}),c("span",{className:n(e["font-bold"],e["text-indigo-700"],e["text-base"]),children:ze(s,l.length)}),i("span",{className:n(e["text-xs"],e["bg-indigo-100"],e["text-indigo-800"],e["px-2"],e["py-1"],e["rounded-full"],e["font-medium"]),children:[u,"/",l.length]}),o.length!==l.length&&i("span",{className:n(e["text-xs"],e["bg-amber-100"],e["text-amber-800"],e["px-2"],e["py-1"],e["rounded-full"]),children:[o.length," shown"]})]}),je&&i("div",{className:n(e.flex,e["gap-1"]),children:[c("button",{type:"button",onClick:h=>{h.stopPropagation(),pe(s,l,!0)},className:n(e["text-xs"],e["px-2"],e["py-1"],e["bg-emerald-500"],e["text-white"],e.rounded,e["hover:bg-emerald-600"],e["transition-colors"],e["shadow-sm"],u===l.length&&e["opacity-50"],u===l.length&&e["cursor-not-allowed"]),title:`Select all in ${s}`,disabled:u===l.length,children:"All"}),c("button",{type:"button",onClick:h=>{h.stopPropagation(),pe(s,l,!1)},className:n(e["text-xs"],e["px-2"],e["py-1"],e["bg-slate-500"],e["text-white"],e.rounded,e["hover:bg-slate-600"],e["transition-colors"],e["shadow-sm"],u===0&&e["opacity-50"],u===0&&e["cursor-not-allowed"]),title:`Deselect all in ${s}`,disabled:u===0,children:"None"})]})]}),$&&!a&&c("div",{className:n(e["px-3"],e["pb-2"]),children:i("div",{className:n(e.relative),children:[c("input",{type:"text",placeholder:`Search in ${s}...`,value:F[s]||"",onChange:h=>Me(s,h.target.value),onClick:h=>h.stopPropagation(),className:n(e["w-full"],e["px-3"],e["py-1.5"],e["text-sm"],e.border,e["border-indigo-200"],e["rounded-md"],e["focus:outline-none"],e["focus:ring-2"],e["focus:ring-indigo-300"],e["focus:border-indigo-400"],e["bg-white"],e["placeholder-gray-400"])}),W&&c("button",{type:"button",onClick:h=>{h.stopPropagation(),Ke(s)},className:n(e.absolute,e["right-2"],e["top-1/2"],e["-translate-y-1/2"],e["text-gray-400"],e["hover:text-gray-600"]),children:c(v,{nameIcon:"FaTimes",propsIcon:{size:12,color:"currentColor"}})})]})})]}),(!G||!a)&&i("div",{className:n(e["max-h-60"],e["overflow-y-auto"]),children:[b.map((h,he)=>c("div",{className:n(e.flex,e["items-center"],e["gap-3"],e["p-3"],e["hover:bg-blue-50"],e["border-l-4"],e["border-transparent"],e["transition-colors"]),children:i("label",{className:n(e.flex,e["items-center"],e["cursor-pointer"],e["w-full"]),children:[c("input",{id:`${s}-${he}`,className:n(e["h-4"],e["w-4"],e["text-blue-600"],e["border-gray-300"],e.rounded,e["focus:ring-blue-500"],e["cursor-pointer"]),type:"checkbox",checked:!1,onChange:()=>{const Xe=m[s].findIndex(Ze=>Ze[p]===h[p]);Je(s,!1,Xe)}}),c("div",{className:n(e["ml-3"],e.flex,e["flex-col"]),children:x?x(h):c("span",{className:n(e["text-sm"],e["font-medium"],e["text-gray-700"]),children:le(h)})})]})},`${s}-${h[p]||he}`)),b.length===0&&o.length>0&&c("div",{className:n(e["p-3"],e["text-center"],e["text-gray-500"],e["text-sm"]),children:"All items in this group are selected"})]})]},s)})},y=()=>T?.length;return E(()=>{R&&R(C())},[m,R,C]),c(me,{children:i("div",{ref:ie,className:n(e["w-full"],e.relative,Ne),style:Se,children:[i("div",{className:n(e.flex,e["items-center"],e["leading-4"],e["p-2"],e["focus:outline-none"],e["focus:ring"],e["w-full"],e["shadow-sm"],e["sm:text-base"],e.border,e["rounded-md"],{[e["border-red"]]:q,[e["border-gray-300"]]:!q},e["bg-white"]),children:[c("input",{placeholder:Z,disabled:Ie,name:Ce,value:w?we?oe?.toUpperCase():oe:y()>0?typeof M=="function"?M(y()):M||`${y()} Items Selected`:Z,className:n(e["w-full"],e["focus:outline-none"],e["bg-transparent"]),onKeyUp:Ye,onChange:Be,onClick:()=>V(!0),onBlur:t=>te&&te(t)}),ve?c("div",{className:n(e["animate-spin"],e["w-4"],e["h-4"]),children:c(v,{nameIcon:"FaSpinner",propsIcon:{size:16,color:"#666"}})}):c(v,{nameIcon:w?"FaChevronUp":"FaChevronDown",propsIcon:{size:16,color:"#000000"}})]}),w&&i("div",{className:n(e["mt-1"],e.absolute,e["rounded-md"],e["bg-white"],e.border,e["border-gray-300"],e["shadow-lg"],e["z-50"],e["w-full"],e["max-h-96"],e["overflow-hidden"]),style:{zIndex:1e3},children:[c("div",{className:n(e["p-3"],e["border-b"],e["border-gray-200"],e["bg-gray-50"],e["text-sm"],e["font-medium"],e["text-gray-700"]),children:i("div",{className:n(e.flex,e["justify-between"],e["items-center"]),children:[i("span",{children:[Object.keys(m).length," ",k?.toUpperCase(),", ",Re," ",Le?.toUpperCase()]}),i("div",{className:"flex items-center gap-2",children:[i("span",{className:n(e["text-blue-600"]),children:[y()," Selected"]}),c("div",{className:n(e.flex,e["gap-2"]),children:c("button",{type:"button",className:n(e["text-xs"],e["px-3"],e["py-1"],e["bg-blue-600"],e["text-white"],e.rounded,e["hover:bg-blue-700"],e["transition-colors"]),onClick:()=>{const t=C();S(t);const r=J(m);I&&I(r),V(!1),O("")},children:"OK"})})]})]})}),i("div",{className:n(e["max-h-80"],e["overflow-y-auto"]),children:[Ae&&y()>0&&i("div",{className:n(e["border-b"],e["border-gray-200"]),children:[c("div",{className:n(e["p-3"],e["bg-blue-50"],e["border-b"],e["border-blue-200"],e["font-semibold"],e["text-sm"],e["text-blue-700"]),children:i("div",{className:n(e.flex,e["items-center"],e["gap-2"]),children:[c(v,{nameIcon:"FaCheck",propsIcon:{size:12,color:"#1976d2"}}),i("span",{children:["Selected Items (",y(),")"]})]})}),c("div",{className:n(e["max-h-48"],e["overflow-y-auto"]),children:T?.map((t,r)=>c("div",{className:n(e.flex,e["items-center"],e["gap-3"],e["p-3"],e["hover:bg-blue-50"],e["border-l-4"],e["border-blue-500"],e["bg-blue-25"],e["transition-colors"]),children:i("label",{className:n(e.flex,e["items-center"],e["cursor-pointer"],e["w-full"]),children:[c("input",{type:"checkbox",checked:!0,onChange:()=>Qe(t),className:n(e["h-4"],e["w-4"],e["text-blue-600"],e["border-gray-300"],e.rounded,e["focus:ring-blue-500"],e["cursor-pointer"])}),c("div",{className:n(e["ml-3"],e.flex,e["flex-col"]),children:x?x(t):i(me,{children:[c("span",{className:n(e["text-sm"],e["font-medium"],e["text-blue-700"]),children:le(t)}),c("span",{className:n(e["text-xs"],e["text-gray-500"]),children:t[k]||K})]})})]})},`selected-${t[p]||r}`))})]}),c("div",{children:We()})]})]},Ge)]})})};
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /* eslint-disable */
3
+ import React, { useState, useEffect, useRef, useCallback } from 'react';
4
+ import { Icon } from '../../Icon/Icon';
5
+ import s from '../../../tc.module.css';
6
+ import { cn } from '../../../utils';
7
+ export const AutoCompleteFilterGroupByMultipleSelectMultipleFieldsDisplay = ({ uniqueField = '_id', groupByField, selectionConfig = {}, displayConfig = {}, uiConfig = {}, loader = false, placeholder = 'Search...', data, hasError = false, disable = false, isUpperCase = false, name, groupByDetails, onFilter, onUpdate, onSelect, onClearAll, onBlur, className, style, filterDebounceDelay = 500, optionsRenderKey, }) => {
8
+ // Merge configs with defaults
9
+ const { isSelectedStringArray = false, maxSelection, onSelectionChange, } = selectionConfig;
10
+ const { displayKeys, displaySeparator = ' - ', fallbackKeys = ['name', 'code'], renderItem, renderGroupName, } = displayConfig;
11
+ const { showGroupHeaders = true, collapsibleGroups = false, showSelectAllButtons = true, showSelectedSection = true, selectedPlaceholder, emptyStateMessage = 'No results found', emptyStateDescription = 'Try adjusting your search terms', enableInternalFilter = false, showGroupSearch = false, groupSearchMinItems = 5, } = uiConfig;
12
+ // Get groupByField from props or legacy groupByDetails
13
+ const groupField = groupByField || groupByDetails?.groupByName || 'lab';
14
+ const defaultGroupName = groupByDetails?.defaultGroupName || 'Default';
15
+ const totalItemName = groupByDetails?.totalItemName || 'department';
16
+ // Helper to get display text for item
17
+ const getItemDisplayText = (item) => {
18
+ if (renderItem) {
19
+ const rendered = renderItem(item);
20
+ if (typeof rendered === 'string')
21
+ return rendered;
22
+ }
23
+ const keys = displayKeys || data.displayKey || fallbackKeys;
24
+ return (keys
25
+ .map((key) => item[key])
26
+ .filter(Boolean)
27
+ .join(displaySeparator) || 'Unnamed Item');
28
+ };
29
+ // Helper to get group name display
30
+ const getGroupNameDisplay = (groupName, count) => {
31
+ if (renderGroupName) {
32
+ return renderGroupName(groupName, count);
33
+ }
34
+ return groupName;
35
+ };
36
+ const [value, setValue] = useState('');
37
+ const [groupedOptions, setGroupedOptions] = useState({});
38
+ const [originalGroupedOptions, setOriginalGroupedOptions] = useState({});
39
+ const [selectedItems, setSelectedItems] = useState([]);
40
+ const [collapsedGroups, setCollapsedGroups] = useState(new Set());
41
+ const [isListOpen, setIsListOpen] = useState(false);
42
+ const [totalItems, setTotalItems] = useState(0);
43
+ // Internal filter state
44
+ const [internalFilterText, setInternalFilterText] = useState('');
45
+ const [groupFilters, setGroupFilters] = useState({});
46
+ // Filter items based on display text
47
+ const filterItems = useCallback((items, searchText) => {
48
+ if (!searchText || searchText.trim() === '')
49
+ return items;
50
+ const lowerSearch = searchText.toLowerCase().trim();
51
+ const keys = displayKeys || data.displayKey || fallbackKeys;
52
+ return items.filter((item) => {
53
+ // Search across all display keys
54
+ return keys.some((key) => {
55
+ const value = item[key];
56
+ if (typeof value === 'string') {
57
+ return value.toLowerCase().includes(lowerSearch);
58
+ }
59
+ if (typeof value === 'number') {
60
+ return value.toString().includes(lowerSearch);
61
+ }
62
+ return false;
63
+ });
64
+ });
65
+ }, [displayKeys, data.displayKey, fallbackKeys]);
66
+ // Get filtered options based on internal filter and group filters
67
+ const getFilteredGroupedOptions = useCallback(() => {
68
+ const result = {};
69
+ const searchText = internalFilterText.trim();
70
+ Object.keys(groupedOptions).forEach((groupKey) => {
71
+ const groupItems = groupedOptions[groupKey] || [];
72
+ // Apply global filter first
73
+ let filteredItems = searchText
74
+ ? filterItems(groupItems, searchText)
75
+ : groupItems;
76
+ // Apply group-specific filter if exists
77
+ const groupSearch = groupFilters[groupKey]?.trim();
78
+ if (groupSearch) {
79
+ filteredItems = filterItems(filteredItems, groupSearch);
80
+ }
81
+ // Only include groups with matching items
82
+ if (filteredItems.length > 0) {
83
+ result[groupKey] = filteredItems;
84
+ }
85
+ });
86
+ return result;
87
+ }, [groupedOptions, internalFilterText, groupFilters, filterItems]);
88
+ // Handle group-specific search
89
+ const handleGroupSearch = (groupName, searchValue) => {
90
+ setGroupFilters((prev) => ({
91
+ ...prev,
92
+ [groupName]: searchValue,
93
+ }));
94
+ };
95
+ // Clear group filter
96
+ const clearGroupFilter = (groupName) => {
97
+ setGroupFilters((prev) => {
98
+ const newFilters = { ...prev };
99
+ delete newFilters[groupName];
100
+ return newFilters;
101
+ });
102
+ };
103
+ // Helper to get selected groups
104
+ const getSelectedGroups = React.useCallback(() => {
105
+ return Object.keys(originalGroupedOptions).reduce((acc, groupKey) => {
106
+ const selectedItems = (originalGroupedOptions[groupKey] || []).filter((item) => item.selected);
107
+ if (selectedItems.length > 0) {
108
+ acc[groupKey] = selectedItems;
109
+ }
110
+ return acc;
111
+ }, {});
112
+ }, [originalGroupedOptions]);
113
+ const useOutsideAlerter = (ref) => {
114
+ useEffect(() => {
115
+ function handleClickOutside(event) {
116
+ if (ref.current &&
117
+ !ref.current.contains(event.target) &&
118
+ isListOpen) {
119
+ const selectedGroups = getSelectedGroups();
120
+ onSelect && onSelect(selectedGroups);
121
+ // Call onUpdate when user clicks outside
122
+ const flatList = getFlatListFromGroupedOptions(groupedOptions);
123
+ onUpdate && onUpdate(flatList);
124
+ setIsListOpen(false);
125
+ setValue('');
126
+ }
127
+ }
128
+ document.addEventListener('mousedown', handleClickOutside);
129
+ return () => {
130
+ document.removeEventListener('mousedown', handleClickOutside);
131
+ };
132
+ }, [
133
+ ref,
134
+ isListOpen,
135
+ getSelectedGroups,
136
+ onSelect,
137
+ groupedOptions,
138
+ getFlatListFromGroupedOptions,
139
+ onUpdate,
140
+ ]);
141
+ };
142
+ // Helper to get flat list from grouped options for onUpdate callback
143
+ const getFlatListFromGroupedOptions = useCallback((grouped) => {
144
+ return Array.isArray(grouped)
145
+ ? grouped.flat(Number.POSITIVE_INFINITY)
146
+ : Object.values(grouped).flat(Number.POSITIVE_INFINITY);
147
+ }, []);
148
+ const wrapperRef = useRef(null);
149
+ useOutsideAlerter(wrapperRef);
150
+ // Process grouped data and mark selected items
151
+ const processGroupedData = (groupedData, selectedItems) => {
152
+ const processedGroups = {};
153
+ let totalCount = 0;
154
+ Object.keys(groupedData).forEach((groupKey) => {
155
+ const groupItems = groupedData[groupKey] || [];
156
+ const processedItems = groupItems.map((item) => {
157
+ totalCount++;
158
+ const isSelected = selectedItems && selectedItems.length > 0
159
+ ? selectedItems.some((sItem) => {
160
+ if (isSelectedStringArray) {
161
+ return sItem === item[uniqueField];
162
+ }
163
+ else {
164
+ return sItem[uniqueField] === item[uniqueField];
165
+ }
166
+ })
167
+ : false;
168
+ return {
169
+ ...item,
170
+ selected: isSelected,
171
+ };
172
+ });
173
+ processedGroups[groupKey] = processedItems;
174
+ });
175
+ setTotalItems(totalCount);
176
+ return processedGroups;
177
+ };
178
+ // Compute a key from data.list to detect changes (helps with MobX observables)
179
+ const dataListKey = React.useMemo(() => {
180
+ if (!data.list)
181
+ return '';
182
+ if (Array.isArray(data.list)) {
183
+ return data.list.length.toString();
184
+ }
185
+ // For grouped data, create a key from group names and item counts
186
+ const groups = Object.keys(data.list);
187
+ return groups
188
+ .map((g) => `${g}:${data.list[g]?.length || 0}`)
189
+ .join(',');
190
+ }, [data.list]);
191
+ useEffect(() => {
192
+ // Handle both grouped data structure and regular list structure
193
+ let processedData = {};
194
+ if (data.list && Array.isArray(data.list)) {
195
+ // If data.list is an array, group by the specified field
196
+ const grouped = data.list.reduce((groups, item) => {
197
+ const groupKey = item?.[groupField] || defaultGroupName;
198
+ if (!groups[groupKey]) {
199
+ groups[groupKey] = [];
200
+ }
201
+ groups[groupKey].push(item);
202
+ return groups;
203
+ }, {});
204
+ processedData = processGroupedData(grouped, data.selected || []);
205
+ }
206
+ else if (typeof data.list === 'object' && data.list !== null) {
207
+ // If data.list is an object, it's already grouped
208
+ processedData = processGroupedData(data.list, data.selected || []);
209
+ }
210
+ // Store both original and current grouped options
211
+ setOriginalGroupedOptions(processedData);
212
+ setGroupedOptions(processedData);
213
+ // Extract and maintain selected items separately
214
+ const allSelected = [];
215
+ Object.keys(processedData).forEach((groupKey) => {
216
+ const selectedInGroup = (processedData[groupKey] || []).filter((item) => item.selected);
217
+ allSelected.push(...selectedInGroup);
218
+ });
219
+ setSelectedItems(Array.isArray(data?.selected) && !isSelectedStringArray
220
+ ? data.selected
221
+ : allSelected);
222
+ }, [
223
+ data.list,
224
+ data.selected,
225
+ isSelectedStringArray,
226
+ uniqueField,
227
+ groupField,
228
+ defaultGroupName,
229
+ dataListKey, // Computed key to detect data.list changes
230
+ ]);
231
+ // Store onFilter in ref to avoid recreating debounce when callback changes
232
+ const onFilterRef = useRef(onFilter);
233
+ onFilterRef.current = onFilter;
234
+ // Store timeout ref for proper cleanup
235
+ const debounceTimeoutRef = useRef(null);
236
+ // Cleanup timeout on unmount
237
+ useEffect(() => {
238
+ return () => {
239
+ if (debounceTimeoutRef.current) {
240
+ clearTimeout(debounceTimeoutRef.current);
241
+ }
242
+ };
243
+ }, []);
244
+ // Debounced filter using useCallback with stable reference
245
+ const debouncedFilter = useCallback((search) => {
246
+ if (!onFilterRef.current)
247
+ return;
248
+ // Clear any existing timeout
249
+ if (debounceTimeoutRef.current) {
250
+ clearTimeout(debounceTimeoutRef.current);
251
+ }
252
+ // Set new timeout
253
+ debounceTimeoutRef.current = setTimeout(() => {
254
+ onFilterRef.current?.(search);
255
+ }, filterDebounceDelay);
256
+ }, [filterDebounceDelay]);
257
+ const onChange = (e) => {
258
+ const search = e.target.value;
259
+ setValue(search);
260
+ // Use internal filtering if enabled
261
+ if (enableInternalFilter) {
262
+ setInternalFilterText(search);
263
+ }
264
+ // Also call external filter if provided
265
+ debouncedFilter(search);
266
+ };
267
+ const onKeyUp = (e) => {
268
+ const charCode = e.which ? e.which : e.keyCode;
269
+ if (charCode === 8) {
270
+ const search = e.currentTarget.value;
271
+ if (enableInternalFilter) {
272
+ setInternalFilterText(search);
273
+ }
274
+ debouncedFilter(search);
275
+ }
276
+ };
277
+ const toggleGroupCollapse = (groupName) => {
278
+ const newCollapsedGroups = new Set(collapsedGroups);
279
+ if (newCollapsedGroups.has(groupName)) {
280
+ newCollapsedGroups.delete(groupName);
281
+ }
282
+ else {
283
+ newCollapsedGroups.add(groupName);
284
+ }
285
+ setCollapsedGroups(newCollapsedGroups);
286
+ };
287
+ // Simple and effective group select all function
288
+ const handleGroupSelectAll = (groupName, groupItems, selectAll) => {
289
+ const updatedGroupItems = groupItems.map((item) => ({
290
+ ...item,
291
+ selected: selectAll,
292
+ }));
293
+ // Update groupedOptions state
294
+ setGroupedOptions((prev) => ({
295
+ ...prev,
296
+ [groupName]: updatedGroupItems,
297
+ }));
298
+ // Update originalGroupedOptions to maintain consistency
299
+ setOriginalGroupedOptions((prev) => ({
300
+ ...prev,
301
+ [groupName]: updatedGroupItems,
302
+ }));
303
+ // Update selected items list
304
+ if (selectAll) {
305
+ // Add all items from this group to selected items
306
+ const newSelectedItems = [...selectedItems];
307
+ groupItems.forEach((item) => {
308
+ const existingIndex = newSelectedItems.findIndex((selected) => selected[uniqueField] === item[uniqueField]);
309
+ if (existingIndex === -1) {
310
+ newSelectedItems.push({ ...item, selected: true });
311
+ }
312
+ });
313
+ setSelectedItems(newSelectedItems);
314
+ }
315
+ else {
316
+ // Remove all items from this group from selected items
317
+ const newSelectedItems = selectedItems.filter((selectedItem) => {
318
+ return !groupItems.some((groupItem) => groupItem[uniqueField] === selectedItem[uniqueField]);
319
+ });
320
+ setSelectedItems(newSelectedItems);
321
+ }
322
+ };
323
+ const handleGroupSelectToggle = (groupName, isSelected, itemIndex) => {
324
+ const item = groupedOptions[groupName][itemIndex];
325
+ const updatedGroupItems = groupedOptions[groupName].map((grpItem, index) => index === itemIndex ? { ...grpItem, selected: !isSelected } : grpItem);
326
+ setGroupedOptions((prev) => ({
327
+ ...prev,
328
+ [groupName]: updatedGroupItems,
329
+ }));
330
+ // Update originalGroupedOptions to maintain consistency
331
+ setOriginalGroupedOptions((prev) => ({
332
+ ...prev,
333
+ [groupName]: updatedGroupItems,
334
+ }));
335
+ // Update selected items list
336
+ if (!isSelected) {
337
+ // Add item to selected items
338
+ setSelectedItems((prev) => [...prev, { ...item, selected: true }]);
339
+ }
340
+ else {
341
+ // Remove item from selected items
342
+ setSelectedItems((prev) => prev.filter((selectedItem) => selectedItem[uniqueField] !== item[uniqueField]));
343
+ }
344
+ };
345
+ // Handle individual item deselection from selected section
346
+ const handleDeselectItem = (itemToDeselect) => {
347
+ // Remove from selected items
348
+ setSelectedItems((prev) => prev.filter((item) => item[uniqueField] !== itemToDeselect[uniqueField]));
349
+ // Update both grouped options
350
+ Object.keys(groupedOptions).forEach((groupKey) => {
351
+ const updatedGroupItems = groupedOptions[groupKey].map((item) => {
352
+ if (item[uniqueField] === itemToDeselect[uniqueField]) {
353
+ return { ...item, selected: false };
354
+ }
355
+ return item;
356
+ });
357
+ setGroupedOptions((prev) => ({
358
+ ...prev,
359
+ [groupKey]: updatedGroupItems,
360
+ }));
361
+ setOriginalGroupedOptions((prev) => ({
362
+ ...prev,
363
+ [groupKey]: updatedGroupItems,
364
+ }));
365
+ });
366
+ };
367
+ // Clear all selected items and notify consumer if provided
368
+ const handleClearAll = () => {
369
+ const clearedGroupedOptions = {};
370
+ Object.keys(groupedOptions).forEach((groupKey) => {
371
+ const clearedItems = (groupedOptions[groupKey] || []).map((item) => ({
372
+ ...item,
373
+ selected: false,
374
+ }));
375
+ clearedGroupedOptions[groupKey] = clearedItems;
376
+ });
377
+ setGroupedOptions(clearedGroupedOptions);
378
+ setOriginalGroupedOptions(clearedGroupedOptions);
379
+ setSelectedItems([]);
380
+ onClearAll?.();
381
+ };
382
+ const renderGroupedOptions = () => {
383
+ // Use filtered options instead of raw groupedOptions
384
+ const filteredOptions = getFilteredGroupedOptions();
385
+ const groupNames = Object.keys(filteredOptions).sort();
386
+ if (groupNames.length === 0) {
387
+ return (_jsxs("div", { className: cn(s['p-4'], s['text-center'], s['text-gray-500']), children: [_jsx(Icon, { nameIcon: "FaSearch", propsIcon: {
388
+ size: 24,
389
+ color: '#ccc',
390
+ } }), _jsx("p", { className: cn(s['mt-2'], s['text-sm']), children: emptyStateMessage }), _jsx("p", { className: cn(s['text-xs']), children: emptyStateDescription }), internalFilterText && (_jsx("button", { type: "button", onClick: () => {
391
+ setInternalFilterText('');
392
+ setValue('');
393
+ }, className: cn(s['mt-3'], s['text-xs'], s['px-3'], s['py-1'], s['bg-blue-500'], s['text-white'], s['rounded'], s['hover:bg-blue-600']), children: "Clear Search" }))] }));
394
+ }
395
+ return groupNames.map((groupName) => {
396
+ const groupItems = filteredOptions[groupName] || [];
397
+ // Get original group items for accurate counts
398
+ const originalGroupItems = groupedOptions[groupName] || [];
399
+ const isCollapsed = collapsedGroups.has(groupName);
400
+ const selectedInGroup = originalGroupItems.filter((item) => item.selected).length;
401
+ const unselectedInGroup = groupItems.filter((item) => !item.selected);
402
+ const hasGroupFilter = !!groupFilters[groupName];
403
+ const showGroupSearchInput = showGroupSearch && originalGroupItems.length >= groupSearchMinItems;
404
+ return (_jsxs("div", { className: cn(s['border-b'], s['border-gray-200'], s['last:border-b-0']), children: [showGroupHeaders && (_jsxs("div", { className: cn(s['flex'], s['flex-col'], s['bg-gradient-to-r'], s['from-blue-50'], s['to-indigo-50'], s['border-b'], s['border-blue-200']), children: [_jsxs("div", { className: cn(s['flex'], s['items-center'], s['justify-between'], s['p-3'], s['font-semibold'], s['text-sm'], s['text-gray-700'], collapsibleGroups && s['cursor-pointer'], s['hover:bg-blue-100'], s['transition-colors']), onClick: () => collapsibleGroups && toggleGroupCollapse(groupName), children: [_jsxs("div", { className: cn(s['flex'], s['items-center'], s['gap-2']), children: [collapsibleGroups && (_jsx(Icon, { nameIcon: isCollapsed ? 'FaChevronRight' : 'FaChevronDown', propsIcon: {
405
+ size: 12,
406
+ color: '#4F46E5',
407
+ } })), _jsx("span", { className: cn(s['font-bold'], s['text-indigo-700'], s['text-base']), children: getGroupNameDisplay(groupName, originalGroupItems.length) }), _jsxs("span", { className: cn(s['text-xs'], s['bg-indigo-100'], s['text-indigo-800'], s['px-2'], s['py-1'], s['rounded-full'], s['font-medium']), children: [selectedInGroup, "/", originalGroupItems.length] }), groupItems.length !== originalGroupItems.length && (_jsxs("span", { className: cn(s['text-xs'], s['bg-amber-100'], s['text-amber-800'], s['px-2'], s['py-1'], s['rounded-full']), children: [groupItems.length, " shown"] }))] }), showSelectAllButtons && (_jsxs("div", { className: cn(s['flex'], s['gap-1']), children: [_jsx("button", { type: "button", onClick: (e) => {
408
+ e.stopPropagation();
409
+ handleGroupSelectAll(groupName, originalGroupItems, true);
410
+ }, className: cn(s['text-xs'], s['px-2'], s['py-1'], s['bg-emerald-500'], s['text-white'], s['rounded'], s['hover:bg-emerald-600'], s['transition-colors'], s['shadow-sm'], selectedInGroup === originalGroupItems.length &&
411
+ s['opacity-50'], selectedInGroup === originalGroupItems.length &&
412
+ s['cursor-not-allowed']), title: `Select all in ${groupName}`, disabled: selectedInGroup === originalGroupItems.length, children: "All" }), _jsx("button", { type: "button", onClick: (e) => {
413
+ e.stopPropagation();
414
+ handleGroupSelectAll(groupName, originalGroupItems, false);
415
+ }, className: cn(s['text-xs'], s['px-2'], s['py-1'], s['bg-slate-500'], s['text-white'], s['rounded'], s['hover:bg-slate-600'], s['transition-colors'], s['shadow-sm'], selectedInGroup === 0 && s['opacity-50'], selectedInGroup === 0 && s['cursor-not-allowed']), title: `Deselect all in ${groupName}`, disabled: selectedInGroup === 0, children: "None" })] }))] }), showGroupSearchInput && !isCollapsed && (_jsx("div", { className: cn(s['px-3'], s['pb-2']), children: _jsxs("div", { className: cn(s['relative']), children: [_jsx("input", { type: "text", placeholder: `Search in ${groupName}...`, value: groupFilters[groupName] || '', onChange: (e) => handleGroupSearch(groupName, e.target.value), onClick: (e) => e.stopPropagation(), className: cn(s['w-full'], s['px-3'], s['py-1.5'], s['text-sm'], s['border'], s['border-indigo-200'], s['rounded-md'], s['focus:outline-none'], s['focus:ring-2'], s['focus:ring-indigo-300'], s['focus:border-indigo-400'], s['bg-white'], s['placeholder-gray-400']) }), hasGroupFilter && (_jsx("button", { type: "button", onClick: (e) => {
416
+ e.stopPropagation();
417
+ clearGroupFilter(groupName);
418
+ }, className: cn(s['absolute'], s['right-2'], s['top-1/2'], s['-translate-y-1/2'], s['text-gray-400'], s['hover:text-gray-600']), children: _jsx(Icon, { nameIcon: "FaTimes", propsIcon: {
419
+ size: 12,
420
+ color: 'currentColor',
421
+ } }) }))] }) }))] })), (!collapsibleGroups || !isCollapsed) && (_jsxs("div", { className: cn(s['max-h-60'], s['overflow-y-auto']), children: [unselectedInGroup.map((item, index) => (_jsx("div", { className: cn(s['flex'], s['items-center'], s['gap-3'], s['p-3'], s['hover:bg-blue-50'], s['border-l-4'], s['border-transparent'], s['transition-colors']), children: _jsxs("label", { className: cn(s['flex'], s['items-center'], s['cursor-pointer'], s['w-full']), children: [_jsx("input", { id: `${groupName}-${index}`, className: cn(s['h-4'], s['w-4'], s['text-blue-600'], s['border-gray-300'], s['rounded'], s['focus:ring-blue-500'], s['cursor-pointer']), type: "checkbox", checked: false, onChange: () => {
422
+ const itemIndex = groupedOptions[groupName].findIndex((grpItem) => grpItem[uniqueField] === item[uniqueField]);
423
+ handleGroupSelectToggle(groupName, false, itemIndex);
424
+ } }), _jsx("div", { className: cn(s['ml-3'], s['flex'], s['flex-col']), children: renderItem ? (renderItem(item)) : (_jsx("span", { className: cn(s['text-sm'], s['font-medium'], s['text-gray-700']), children: getItemDisplayText(item) })) })] }) }, `${groupName}-${item[uniqueField] || index}`))), unselectedInGroup.length === 0 && groupItems.length > 0 && (_jsx("div", { className: cn(s['p-3'], s['text-center'], s['text-gray-500'], s['text-sm']), children: "All items in this group are selected" }))] }))] }, groupName));
425
+ });
426
+ };
427
+ const getSelectedCount = () => {
428
+ return selectedItems?.length;
429
+ };
430
+ // Call selection change callback when selection updates
431
+ useEffect(() => {
432
+ if (onSelectionChange) {
433
+ onSelectionChange(getSelectedGroups());
434
+ }
435
+ }, [groupedOptions, onSelectionChange, getSelectedGroups]);
436
+ return (_jsx(_Fragment, { children: _jsxs("div", { ref: wrapperRef, className: cn(s['w-full'], s['relative'], className), style: style, children: [_jsxs("div", { className: cn(s['flex'], s['items-center'], s['leading-4'], s['p-2'], s['focus:outline-none'], s['focus:ring'], s['w-full'], s['shadow-sm'], s['sm:text-base'], s['border'], s['rounded-md'], {
437
+ [s['border-red']]: hasError,
438
+ [s['border-gray-300']]: !hasError,
439
+ }, s['bg-white']), children: [_jsx("input", { placeholder: placeholder, disabled: disable, name: name, value: !isListOpen
440
+ ? getSelectedCount() > 0
441
+ ? typeof selectedPlaceholder === 'function'
442
+ ? selectedPlaceholder(getSelectedCount())
443
+ : selectedPlaceholder ||
444
+ `${getSelectedCount()} Items Selected`
445
+ : placeholder
446
+ : isUpperCase
447
+ ? value?.toUpperCase()
448
+ : value, className: cn(s['w-full'], s['focus:outline-none'], s['bg-transparent']), onKeyUp: onKeyUp, onChange: onChange, onClick: () => setIsListOpen(true), onBlur: (e) => onBlur && onBlur(e) }), loader ? (_jsx("div", { className: cn(s['animate-spin'], s['w-4'], s['h-4']), children: _jsx(Icon, { nameIcon: "FaSpinner", propsIcon: {
449
+ size: 16,
450
+ color: '#666',
451
+ } }) })) : (_jsx(Icon, { nameIcon: isListOpen ? 'FaChevronUp' : 'FaChevronDown', propsIcon: {
452
+ size: 16,
453
+ color: '#000000',
454
+ } }))] }), isListOpen && (_jsxs("div", { className: cn(s['mt-1'], s['absolute'], s['rounded-md'], s['bg-white'], s['border'], s['border-gray-300'], s['shadow-lg'], s['z-50'], s['w-full'], s['max-h-96'], s['overflow-hidden']), style: { zIndex: 1000 }, children: [_jsx("div", { className: cn(s['p-3'], s['border-b'], s['border-gray-200'], s['bg-gray-50'], s['text-sm'], s['font-medium'], s['text-gray-700']), children: _jsxs("div", { className: cn(s['flex'], s['justify-between'], s['items-center']), children: [_jsxs("span", { children: [Object.keys(groupedOptions).length, ' ', groupField?.toUpperCase(), ", ", totalItems, ' ', totalItemName?.toUpperCase()] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("span", { className: cn(s['text-blue-600']), children: [getSelectedCount(), " Selected"] }), _jsxs("div", { className: cn(s['flex'], s['gap-2'], s['items-center']), children: [_jsx("button", { type: "button", className: cn(s['text-xs'], s['px-3'], s['py-1'], s['bg-gray-200'], s['text-gray-700'], s['rounded'], s['hover:bg-gray-300'], s['transition-colors'], s['disabled:opacity-50'], s['disabled:cursor-not-allowed']), disabled: getSelectedCount() === 0, onClick: handleClearAll, children: "Clear All" }), _jsx("button", { type: "button", className: cn(s['text-xs'], s['px-3'], s['py-1'], s['bg-blue-600'], s['text-white'], s['rounded'], s['hover:bg-blue-700'], s['transition-colors']), onClick: () => {
455
+ const selectedGroups = getSelectedGroups();
456
+ onSelect(selectedGroups);
457
+ // Call onUpdate when user clicks OK
458
+ const flatList = getFlatListFromGroupedOptions(groupedOptions);
459
+ onUpdate && onUpdate(flatList);
460
+ setIsListOpen(false);
461
+ setValue('');
462
+ }, children: "OK" })] })] })] }) }), _jsxs("div", { className: cn(s['max-h-80'], s['overflow-y-auto']), children: [showSelectedSection && getSelectedCount() > 0 && (_jsxs("div", { className: cn(s['border-b'], s['border-gray-200']), children: [_jsx("div", { className: cn(s['p-3'], s['bg-blue-50'], s['border-b'], s['border-blue-200'], s['font-semibold'], s['text-sm'], s['text-blue-700']), children: _jsxs("div", { className: cn(s['flex'], s['items-center'], s['gap-2']), children: [_jsx(Icon, { nameIcon: "FaCheck", propsIcon: {
463
+ size: 12,
464
+ color: '#1976d2',
465
+ } }), _jsxs("span", { children: ["Selected Items (", getSelectedCount(), ")"] })] }) }), _jsx("div", { className: cn(s['max-h-48'], s['overflow-y-auto']), children: selectedItems?.map((item, index) => (_jsx("div", { className: cn(s['flex'], s['items-center'], s['gap-3'], s['p-3'], s['hover:bg-blue-50'], s['border-l-4'], s['border-blue-500'], s['bg-blue-25'], s['transition-colors']), children: _jsxs("label", { className: cn(s['flex'], s['items-center'], s['cursor-pointer'], s['w-full']), children: [_jsx("input", { type: "checkbox", checked: true, onChange: () => handleDeselectItem(item), className: cn(s['h-4'], s['w-4'], s['text-blue-600'], s['border-gray-300'], s['rounded'], s['focus:ring-blue-500'], s['cursor-pointer']) }), _jsx("div", { className: cn(s['ml-3'], s['flex'], s['flex-col']), children: renderItem ? (renderItem(item)) : (_jsxs(_Fragment, { children: [_jsx("span", { className: cn(s['text-sm'], s['font-medium'], s['text-blue-700']), children: getItemDisplayText(item) }), _jsx("span", { className: cn(s['text-xs'], s['text-gray-500']), children: item[groupField] || defaultGroupName })] })) })] }) }, `selected-${item[uniqueField] || index}`))) })] })), _jsx("div", { children: renderGroupedOptions() })] })] }, optionsRenderKey))] }) }));
466
+ };