react-restyle-components 0.4.46 → 0.4.47

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 (231) hide show
  1. package/lib/index.js +1 -3
  2. package/lib/src/core-components/index.js +1 -1
  3. package/lib/src/core-components/src/components/Accordion/AccordionSection/Accordion.js +1 -15
  4. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionContext.js +1 -6
  5. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionSection.js +1 -39
  6. package/lib/src/core-components/src/components/Accordion/AccordionSection/Header.js +1 -39
  7. package/lib/src/core-components/src/components/Accordion/AccordionSection/elements.js +57 -94
  8. package/lib/src/core-components/src/components/Accordion/AccordionSection/hooks/useCurrentAccordionIndex.js +1 -13
  9. package/lib/src/core-components/src/components/Accordion/AccordionSection/index.js +1 -3
  10. package/lib/src/core-components/src/components/Accordion/AccordionSection/types.js +1 -9
  11. package/lib/src/core-components/src/components/Accordion/Collapsible/Collapsible2.component.js +1 -249
  12. package/lib/src/core-components/src/components/Action/types.js +1 -8
  13. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +1 -45
  14. package/lib/src/core-components/src/components/AlertBanner/elements.js +45 -120
  15. package/lib/src/core-components/src/components/AlertBanner/index.js +1 -2
  16. package/lib/src/core-components/src/components/AlertBanner/types.js +1 -10
  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 +1 -451
  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 +1 -229
  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 +1 -174
  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 +2 -129
  21. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +1 -55
  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 +2 -308
  23. package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +1 -115
  24. package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +2 -442
  25. package/lib/src/core-components/src/components/AutoComplete/index.js +1 -8
  26. package/lib/src/core-components/src/components/Avatar/Avatar.js +14 -148
  27. package/lib/src/core-components/src/components/Badge/Badge.js +2 -25
  28. package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +1 -25
  29. package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +1 -25
  30. package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +32 -78
  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 +1 -5
  34. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +1 -83
  35. package/lib/src/core-components/src/components/Breadcrumb/elements.js +94 -166
  36. package/lib/src/core-components/src/components/Breadcrumb/index.js +1 -3
  37. package/lib/src/core-components/src/components/Breadcrumb/types.js +1 -3
  38. package/lib/src/core-components/src/components/Button/button.component.js +1 -18
  39. package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +1 -4
  40. package/lib/src/core-components/src/components/Button/index.js +1 -2
  41. package/lib/src/core-components/src/components/Button/types.js +1 -1
  42. package/lib/src/core-components/src/components/Chip/Chip.js +1 -64
  43. package/lib/src/core-components/src/components/Chip/elements.js +48 -148
  44. package/lib/src/core-components/src/components/Chip/index.js +1 -2
  45. package/lib/src/core-components/src/components/Chip/types.js +1 -4
  46. package/lib/src/core-components/src/components/Divider/Divider.js +1 -25
  47. package/lib/src/core-components/src/components/Divider/elements.js +31 -68
  48. package/lib/src/core-components/src/components/Divider/index.js +1 -2
  49. package/lib/src/core-components/src/components/Divider/types.js +1 -4
  50. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +1 -147
  51. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +17 -24
  52. package/lib/src/core-components/src/components/DynamicGrid/elements.js +100 -162
  53. package/lib/src/core-components/src/components/DynamicGrid/index.js +1 -3
  54. package/lib/src/core-components/src/components/DynamicGrid/types.js +1 -28
  55. package/lib/src/core-components/src/components/DynamicGrid/utils.js +1 -193
  56. package/lib/src/core-components/src/components/FormField/FormField.js +1 -103
  57. package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +1 -37
  58. package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +1 -8
  59. package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +1 -192
  60. package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +1 -99
  61. package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +1 -70
  62. package/lib/src/core-components/src/components/FormField/components/OtpInput.js +1 -81
  63. package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +1 -40
  64. package/lib/src/core-components/src/components/FormField/components/PinInput.js +1 -75
  65. package/lib/src/core-components/src/components/FormField/components/RadioInput.js +1 -54
  66. package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +1 -94
  67. package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +1 -36
  68. package/lib/src/core-components/src/components/FormField/components/index.js +1 -11
  69. package/lib/src/core-components/src/components/FormField/css-properties.js +1 -161
  70. package/lib/src/core-components/src/components/FormField/index.js +1 -2
  71. package/lib/src/core-components/src/components/Icon/Icon.js +1 -159
  72. package/lib/src/core-components/src/components/Icon/index.js +1 -2
  73. package/lib/src/core-components/src/components/Icon/types.js +1 -9
  74. package/lib/src/core-components/src/components/Loader/loader.component.js +2 -215
  75. package/lib/src/core-components/src/components/Masonry/Masonry.js +1 -73
  76. package/lib/src/core-components/src/components/Masonry/elements.js +29 -46
  77. package/lib/src/core-components/src/components/Masonry/hooks.js +1 -100
  78. package/lib/src/core-components/src/components/Masonry/index.js +1 -3
  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 +1 -116
  81. package/lib/src/core-components/src/components/Modal/index.js +1 -2
  82. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +1 -147
  83. package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +1 -12
  84. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +1 -40
  85. package/lib/src/core-components/src/components/Picker/index.js +1 -2
  86. package/lib/src/core-components/src/components/Selection/index.js +1 -4
  87. package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +1 -49
  88. package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +1 -58
  89. package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +1 -43
  90. package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +1 -87
  91. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +1 -51
  92. package/lib/src/core-components/src/components/Skeleton/elements.js +54 -143
  93. package/lib/src/core-components/src/components/Skeleton/index.js +1 -2
  94. package/lib/src/core-components/src/components/Skeleton/types.js +1 -4
  95. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +1 -128
  96. package/lib/src/core-components/src/components/SpeedDial/elements.js +62 -132
  97. package/lib/src/core-components/src/components/SpeedDial/index.js +1 -2
  98. package/lib/src/core-components/src/components/SpeedDial/types.js +1 -3
  99. package/lib/src/core-components/src/components/Stepper2/stepper.component.js +1 -139
  100. package/lib/src/core-components/src/components/Switch/Switch.js +1 -26
  101. package/lib/src/core-components/src/components/Switch/elements.js +34 -103
  102. package/lib/src/core-components/src/components/Switch/index.js +1 -2
  103. package/lib/src/core-components/src/components/Switch/types.js +1 -3
  104. package/lib/src/core-components/src/components/Table/Table.js +1 -1489
  105. package/lib/src/core-components/src/components/Table/columnReorder.js +36 -332
  106. package/lib/src/core-components/src/components/Table/columnResize.js +21 -284
  107. package/lib/src/core-components/src/components/Table/elements.js +173 -277
  108. package/lib/src/core-components/src/components/Table/filters.js +30 -555
  109. package/lib/src/core-components/src/components/Table/hooks.js +2 -536
  110. package/lib/src/core-components/src/components/Table/index.js +1 -6
  111. package/lib/src/core-components/src/components/Table/types.js +1 -1
  112. package/lib/src/core-components/src/components/Tabs/tabs.component.js +1 -22
  113. package/lib/src/core-components/src/components/Tags1/Tags.component.js +1 -118
  114. package/lib/src/core-components/src/components/Tags1/types.js +1 -20
  115. package/lib/src/core-components/src/components/Timer1/timer.component.js +1 -76
  116. package/lib/src/core-components/src/components/Toast/Toast.js +1 -50
  117. package/lib/src/core-components/src/components/Toast/elements.js +41 -122
  118. package/lib/src/core-components/src/components/Toast/index.js +1 -2
  119. package/lib/src/core-components/src/components/Toast/types.js +1 -9
  120. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +1 -200
  121. package/lib/src/core-components/src/components/Tooltip/elements.js +55 -117
  122. package/lib/src/core-components/src/components/Tooltip/index.js +1 -2
  123. package/lib/src/core-components/src/components/Tooltip/types.js +1 -17
  124. package/lib/src/core-components/src/components/Tooltip/utils.js +1 -140
  125. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +1 -303
  126. package/lib/src/core-components/src/components/TreeSelect/elements.js +117 -216
  127. package/lib/src/core-components/src/components/TreeSelect/hooks.js +1 -252
  128. package/lib/src/core-components/src/components/TreeSelect/index.js +1 -3
  129. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
  130. package/lib/src/core-components/src/components/ag-grid/AgGrid.js +1 -1057
  131. package/lib/src/core-components/src/components/ag-grid/elements.js +396 -790
  132. package/lib/src/core-components/src/components/ag-grid/hooks.js +4 -1220
  133. package/lib/src/core-components/src/components/ag-grid/index.js +1 -15
  134. package/lib/src/core-components/src/components/ag-grid/types.js +1 -6
  135. package/lib/src/core-components/src/components/index.js +1 -31
  136. package/lib/src/core-components/src/components/pdf/pdf-images.components.js +1 -7
  137. package/lib/src/core-components/src/components/pdf/pdf-table.components.js +5 -48
  138. package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +1 -70
  139. package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +1 -50
  140. package/lib/src/core-components/src/core-components/Avatar.js +4 -33
  141. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +1 -10
  142. package/lib/src/core-components/src/core-components/CoreButton/elements.js +67 -176
  143. package/lib/src/core-components/src/core-components/CoreButton/index.js +1 -3
  144. package/lib/src/core-components/src/core-components/CoreButton/types.js +1 -6
  145. package/lib/src/core-components/src/core-components/CoreButton/utils.js +1 -12
  146. package/lib/src/core-components/src/core-components/Divider/Divider.js +4 -19
  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 +10 -33
  150. package/lib/src/core-components/src/core-components/StateLayer.js +3 -5
  151. package/lib/src/core-components/src/core-components/ToggleCore/elements.js +25 -50
  152. package/lib/src/core-components/src/core-components/ToggleCore/index.js +1 -2
  153. package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +1 -14
  154. package/lib/src/core-components/src/core-components/atoms/Input/Input.js +1 -22
  155. package/lib/src/core-components/src/core-components/atoms/Label/Label.js +1 -21
  156. package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +1 -19
  157. package/lib/src/core-components/src/core-components/index.js +1 -3
  158. package/lib/src/core-components/src/helpers/constants.js +1 -11
  159. package/lib/src/core-components/src/hooks/index.js +1 -1
  160. package/lib/src/core-components/src/hooks/outside.hook.js +1 -28
  161. package/lib/src/core-components/src/index.js +1 -12
  162. package/lib/src/core-components/src/tc.global.css +1 -0
  163. package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +1 -28
  164. package/lib/src/core-components/src/utils/abstracts/colors/index.js +1 -49
  165. package/lib/src/core-components/src/utils/abstracts/index.js +1 -5
  166. package/lib/src/core-components/src/utils/abstracts/space/index.js +1 -26
  167. package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +1 -8
  168. package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +1 -30
  169. package/lib/src/core-components/src/utils/abstracts/theme/index.js +1 -3
  170. package/lib/src/core-components/src/utils/abstracts/theme/theme.js +1 -30
  171. package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
  172. package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +1 -17
  173. package/lib/src/core-components/src/utils/abstracts/typography/index.js +1 -25
  174. package/lib/src/core-components/src/utils/context/DefaultsProvider.js +1 -8
  175. package/lib/src/core-components/src/utils/context/InternalProvider.js +1 -24
  176. package/lib/src/core-components/src/utils/context/index.js +1 -2
  177. package/lib/src/core-components/src/utils/designTokens.js +1 -128
  178. package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +1 -23
  179. package/lib/src/core-components/src/utils/helpers/flattenChildren.js +1 -11
  180. package/lib/src/core-components/src/utils/helpers/getChildByType.js +1 -3
  181. package/lib/src/core-components/src/utils/helpers/index.js +1 -5
  182. package/lib/src/core-components/src/utils/helpers/isComponentType.js +1 -16
  183. package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +1 -12
  184. package/lib/src/core-components/src/utils/hooks/index.js +1 -18
  185. package/lib/src/core-components/src/utils/hooks/useClickOutside.js +1 -18
  186. package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +1 -17
  187. package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +1 -12
  188. package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +1 -20
  189. package/lib/src/core-components/src/utils/hooks/useDeprecation.js +1 -40
  190. package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +1 -10
  191. package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +1 -24
  192. package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +1 -16
  193. package/lib/src/core-components/src/utils/hooks/useHoverState.js +1 -36
  194. package/lib/src/core-components/src/utils/hooks/useId.js +1 -7
  195. package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +1 -11
  196. package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +1 -16
  197. package/lib/src/core-components/src/utils/hooks/useOverflow.js +1 -22
  198. package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +1 -5
  199. package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +1 -18
  200. package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +1 -30
  201. package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +1 -23
  202. package/lib/src/core-components/src/utils/index.js +1 -9
  203. package/lib/src/core-components/src/utils/stories/Wrappers.js +8 -23
  204. package/lib/src/core-components/src/utils/stories/cleanProps.js +1 -5
  205. package/lib/src/core-components/src/utils/stories/index.js +1 -4
  206. package/lib/src/core-components/src/utils/stories/sleep.js +1 -4
  207. package/lib/src/core-components/src/utils/stories/view-ports.js +1 -50
  208. package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +1 -5
  209. package/lib/src/core-components/src/utils/styling/createGridContainer.js +6 -12
  210. package/lib/src/core-components/src/utils/styling/createTransition.js +2 -7
  211. package/lib/src/core-components/src/utils/styling/forwardProps.js +1 -10
  212. package/lib/src/core-components/src/utils/styling/index.js +1 -5
  213. package/lib/src/core-components/src/utils/styling/pxToRem.js +1 -6
  214. package/lib/src/core-components/src/utils/testing/getComputedStyle.js +1 -3
  215. package/lib/src/core-components/src/utils/testing/index.js +1 -1
  216. package/lib/src/core-components/src/utils/utility.util.js +1 -14
  217. package/lib/src/core-components/tailwind.config.js +1 -233
  218. package/lib/src/core-hooks/index.js +1 -3
  219. package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +1 -46
  220. package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +1 -30
  221. package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +1 -8
  222. package/lib/src/core-utils/index.js +1 -7
  223. package/lib/src/core-utils/src/calculation/calculation.util.js +1 -89
  224. package/lib/src/core-utils/src/colors/color.util.js +1 -15
  225. package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +1 -145
  226. package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +1 -5
  227. package/lib/src/core-utils/src/form-helper/form-helper.util.js +1 -82
  228. package/lib/src/core-utils/src/index.js +1 -7
  229. package/lib/src/core-utils/src/utility/utility.util.js +1 -12
  230. package/lib/src/core-utils/src/uuid/uuid.util.js +1 -8
  231. package/package.json +1 -1
@@ -1,451 +1 @@
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, 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
- const renderGroupedOptions = () => {
368
- // Use filtered options instead of raw groupedOptions
369
- const filteredOptions = getFilteredGroupedOptions();
370
- const groupNames = Object.keys(filteredOptions).sort();
371
- if (groupNames.length === 0) {
372
- return (_jsxs("div", { className: cn(s['p-4'], s['text-center'], s['text-gray-500']), children: [_jsx(Icon, { nameIcon: "FaSearch", propsIcon: {
373
- size: 24,
374
- color: '#ccc',
375
- } }), _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: () => {
376
- setInternalFilterText('');
377
- setValue('');
378
- }, 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" }))] }));
379
- }
380
- return groupNames.map((groupName) => {
381
- const groupItems = filteredOptions[groupName] || [];
382
- // Get original group items for accurate counts
383
- const originalGroupItems = groupedOptions[groupName] || [];
384
- const isCollapsed = collapsedGroups.has(groupName);
385
- const selectedInGroup = originalGroupItems.filter((item) => item.selected).length;
386
- const unselectedInGroup = groupItems.filter((item) => !item.selected);
387
- const hasGroupFilter = !!groupFilters[groupName];
388
- const showGroupSearchInput = showGroupSearch && originalGroupItems.length >= groupSearchMinItems;
389
- 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: {
390
- size: 12,
391
- color: '#4F46E5',
392
- } })), _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) => {
393
- e.stopPropagation();
394
- handleGroupSelectAll(groupName, originalGroupItems, true);
395
- }, 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 &&
396
- s['opacity-50'], selectedInGroup === originalGroupItems.length &&
397
- s['cursor-not-allowed']), title: `Select all in ${groupName}`, disabled: selectedInGroup === originalGroupItems.length, children: "All" }), _jsx("button", { type: "button", onClick: (e) => {
398
- e.stopPropagation();
399
- handleGroupSelectAll(groupName, originalGroupItems, false);
400
- }, 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) => {
401
- e.stopPropagation();
402
- clearGroupFilter(groupName);
403
- }, 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: {
404
- size: 12,
405
- color: 'currentColor',
406
- } }) }))] }) }))] })), (!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: () => {
407
- const itemIndex = groupedOptions[groupName].findIndex((grpItem) => grpItem[uniqueField] === item[uniqueField]);
408
- handleGroupSelectToggle(groupName, false, itemIndex);
409
- } }), _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));
410
- });
411
- };
412
- const getSelectedCount = () => {
413
- return selectedItems?.length;
414
- };
415
- // Call selection change callback when selection updates
416
- useEffect(() => {
417
- if (onSelectionChange) {
418
- onSelectionChange(getSelectedGroups());
419
- }
420
- }, [groupedOptions, onSelectionChange, getSelectedGroups]);
421
- 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'], {
422
- [s['border-red']]: hasError,
423
- [s['border-gray-300']]: !hasError,
424
- }, s['bg-white']), children: [_jsx("input", { placeholder: placeholder, disabled: disable, name: name, value: !isListOpen
425
- ? getSelectedCount() > 0
426
- ? typeof selectedPlaceholder === 'function'
427
- ? selectedPlaceholder(getSelectedCount())
428
- : selectedPlaceholder ||
429
- `${getSelectedCount()} Items Selected`
430
- : placeholder
431
- : isUpperCase
432
- ? value?.toUpperCase()
433
- : 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: {
434
- size: 16,
435
- color: '#666',
436
- } }) })) : (_jsx(Icon, { nameIcon: isListOpen ? 'FaChevronUp' : 'FaChevronDown', propsIcon: {
437
- size: 16,
438
- color: '#000000',
439
- } }))] }), 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"] }), _jsx("div", { className: cn(s['flex'], s['gap-2']), children: _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: () => {
440
- const selectedGroups = getSelectedGroups();
441
- onSelect(selectedGroups);
442
- // Call onUpdate when user clicks OK
443
- const flatList = getFlatListFromGroupedOptions(groupedOptions);
444
- onUpdate && onUpdate(flatList);
445
- setIsListOpen(false);
446
- setValue('');
447
- }, 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: {
448
- size: 12,
449
- color: '#1976d2',
450
- } }), _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))] }) }));
451
- };
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)]})})};