@geotab/zenith 3.0.1 → 3.1.0

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 (262) hide show
  1. package/README.md +17 -0
  2. package/dist/advancedGroupsFilter/advancedGroupsFilter.d.ts +1 -0
  3. package/dist/advancedGroupsFilter/advancedGroupsFilter.js +2 -2
  4. package/dist/advancedGroupsFilter/advancedGroupsFilterFormSection.js +3 -1
  5. package/dist/chip/chip.js +5 -5
  6. package/dist/commonStyles/zIndex.less +5 -0
  7. package/dist/dateInput/dateInput.d.ts +2 -1
  8. package/dist/dateInput/dateInput.js +11 -2
  9. package/dist/dateRange/dateRange.js +9 -8
  10. package/dist/dropdown/dropdown.d.ts +2 -0
  11. package/dist/dropdown/dropdown.js +6 -5
  12. package/dist/dropdown/dropdownHelper.d.ts +4 -4
  13. package/dist/dropdown/dropdownHelper.js +2 -1
  14. package/dist/dropdown/dropdownList.js +2 -2
  15. package/dist/dropdown/dropdownPopup.d.ts +1 -0
  16. package/dist/dropdown/dropdownPopup.js +2 -2
  17. package/dist/dropdown/dropdownSearchableTrigger.js +1 -1
  18. package/dist/dropdown/stateReducer/stateReducer.d.ts +6 -2
  19. package/dist/dropdown/stateReducer/stateReducer.js +28 -42
  20. package/dist/dropdown/stateReducer/stateReducerHelper.d.ts +2 -0
  21. package/dist/dropdown/stateReducer/stateReducerHelper.js +12 -1
  22. package/dist/dropdown/useDropdownState.d.ts +1 -1
  23. package/dist/dropdown/useDropdownState.js +5 -2
  24. package/dist/filters/components/filtersContainer.d.ts +1 -0
  25. package/dist/filters/components/filtersContainer.js +10 -11
  26. package/dist/filters/components/filtersDateInput.d.ts +10 -0
  27. package/dist/filters/components/filtersDateInput.js +27 -0
  28. package/dist/filters/components/filtersDropdown.d.ts +5 -4
  29. package/dist/filters/components/filtersDropdown.js +3 -3
  30. package/dist/filters/components/filtersEmptySelectedList.d.ts +2 -0
  31. package/dist/filters/components/filtersEmptySelectedList.js +11 -0
  32. package/dist/filters/components/filtersItem.d.ts +5 -4
  33. package/dist/filters/components/filtersItem.js +2 -1
  34. package/dist/filters/components/filtersSaveModal.d.ts +3 -1
  35. package/dist/filters/components/filtersSaveModal.js +2 -2
  36. package/dist/filters/components/filtersSavedChipComponent.js +68 -6
  37. package/dist/filters/components/filtersSearch.d.ts +4 -4
  38. package/dist/filters/components/filtersSearch.js +20 -9
  39. package/dist/filters/components/filtersSearchItemData.js +18 -1
  40. package/dist/filters/components/filtersSearchList.d.ts +5 -1
  41. package/dist/filters/components/filtersSearchList.js +155 -27
  42. package/dist/filters/components/filtersSelect.d.ts +1 -0
  43. package/dist/filters/components/filtersSelect.js +35 -7
  44. package/dist/filters/components/filtersSelectListItem.d.ts +21 -15
  45. package/dist/filters/components/filtersSelectListItem.js +13 -3
  46. package/dist/filters/components/filtersSidePanel.d.ts +15 -0
  47. package/dist/filters/components/filtersSidePanel.js +212 -0
  48. package/dist/filters/components/filtersSidePanelChip.d.ts +9 -0
  49. package/dist/filters/components/filtersSidePanelChip.js +13 -0
  50. package/dist/filters/components/filtersSidePanelDropdown.d.ts +6 -0
  51. package/dist/filters/components/filtersSidePanelDropdown.js +85 -0
  52. package/dist/filters/components/filtersSidePanelItem.d.ts +16 -0
  53. package/dist/filters/components/filtersSidePanelItem.js +67 -0
  54. package/dist/filters/components/filtersSidePanelRange.d.ts +6 -0
  55. package/dist/filters/components/filtersSidePanelRange.js +28 -0
  56. package/dist/filters/filters.d.ts +5 -0
  57. package/dist/filters/filters.js +101 -38
  58. package/dist/filters/filtersHelper.d.ts +4 -2
  59. package/dist/filters/filtersHelper.js +40 -1
  60. package/dist/filters/filtersHooks.d.ts +12 -2
  61. package/dist/filters/filtersHooks.js +21 -3
  62. package/dist/formStepper/formStepper.d.ts +1 -1
  63. package/dist/formStepper/formStepper.js +5 -2
  64. package/dist/groupsFilter/groupsFilter.js +72 -37
  65. package/dist/groupsFilter/groupsFilterMenu.d.ts +1 -0
  66. package/dist/groupsFilter/groupsFilterMenu.js +2 -2
  67. package/dist/groupsFilter/groupsFilterTrigger.js +1 -1
  68. package/dist/images/imageLooking.d.ts +4 -0
  69. package/dist/images/imageLooking.js +16 -0
  70. package/dist/index.css +407 -83
  71. package/dist/index.d.ts +7 -4
  72. package/dist/index.js +26 -15
  73. package/dist/list/list.d.ts +3 -1
  74. package/dist/list/list.js +2 -2
  75. package/dist/mobileSheet/mobileSheet.d.ts +2 -0
  76. package/dist/mobileSheet/mobileSheet.js +4 -4
  77. package/dist/modal/modal.d.ts +1 -0
  78. package/dist/modal/modal.js +2 -2
  79. package/dist/radioGroup/radioGroup.d.ts +1 -0
  80. package/dist/radioGroup/radioGroup.js +3 -2
  81. package/dist/range/range.js +29 -10
  82. package/dist/searchInputRaw/searchInputRaw.js +1 -1
  83. package/dist/sidePanel/sidePanel.d.ts +1 -0
  84. package/dist/sidePanel/sidePanel.js +3 -3
  85. package/dist/tabs/tabItem/tabItem.d.ts +1 -0
  86. package/dist/tabs/tabItem/tabItem.js +2 -2
  87. package/dist/tabs/tabs.d.ts +1 -0
  88. package/dist/tabs/tabs.js +1 -1
  89. package/dist/utils/keyboardHelpers.d.ts +2 -0
  90. package/dist/utils/keyboardHelpers.js +49 -0
  91. package/dist/utils/localization/translations/cs-json.d.ts +1 -0
  92. package/dist/utils/localization/translations/cs-json.js +2 -1
  93. package/dist/utils/localization/translations/de-json.d.ts +1 -0
  94. package/dist/utils/localization/translations/de-json.js +2 -1
  95. package/dist/utils/localization/translations/en-json.d.ts +7 -0
  96. package/dist/utils/localization/translations/en-json.js +8 -1
  97. package/dist/utils/localization/translations/es-json.d.ts +1 -0
  98. package/dist/utils/localization/translations/es-json.js +2 -1
  99. package/dist/utils/localization/translations/fr-FR-json.d.ts +1 -0
  100. package/dist/utils/localization/translations/fr-FR-json.js +2 -1
  101. package/dist/utils/localization/translations/fr-json.d.ts +1 -0
  102. package/dist/utils/localization/translations/fr-json.js +2 -1
  103. package/dist/utils/localization/translations/id-json.d.ts +1 -0
  104. package/dist/utils/localization/translations/id-json.js +2 -1
  105. package/dist/utils/localization/translations/it-json.d.ts +1 -0
  106. package/dist/utils/localization/translations/it-json.js +2 -1
  107. package/dist/utils/localization/translations/ja-json.d.ts +1 -0
  108. package/dist/utils/localization/translations/ja-json.js +2 -1
  109. package/dist/utils/localization/translations/ko-KR-json.d.ts +1 -0
  110. package/dist/utils/localization/translations/ko-KR-json.js +2 -1
  111. package/dist/utils/localization/translations/ms-json.d.ts +1 -0
  112. package/dist/utils/localization/translations/ms-json.js +2 -1
  113. package/dist/utils/localization/translations/nl-json.d.ts +1 -0
  114. package/dist/utils/localization/translations/nl-json.js +2 -1
  115. package/dist/utils/localization/translations/pl-json.d.ts +1 -0
  116. package/dist/utils/localization/translations/pl-json.js +2 -1
  117. package/dist/utils/localization/translations/pt-BR-json.d.ts +1 -0
  118. package/dist/utils/localization/translations/pt-BR-json.js +2 -1
  119. package/dist/utils/localization/translations/sv-json.d.ts +1 -0
  120. package/dist/utils/localization/translations/sv-json.js +2 -1
  121. package/dist/utils/localization/translations/th-json.d.ts +1 -0
  122. package/dist/utils/localization/translations/th-json.js +2 -1
  123. package/dist/utils/localization/translations/tr-json.d.ts +1 -0
  124. package/dist/utils/localization/translations/tr-json.js +2 -1
  125. package/dist/utils/localization/translations/zh-Hans-json.d.ts +1 -0
  126. package/dist/utils/localization/translations/zh-Hans-json.js +2 -1
  127. package/dist/utils/localization/translations/zh-TW-json.d.ts +1 -0
  128. package/dist/utils/localization/translations/zh-TW-json.js +2 -1
  129. package/esm/advancedGroupsFilter/advancedGroupsFilter.d.ts +1 -0
  130. package/esm/advancedGroupsFilter/advancedGroupsFilter.js +2 -2
  131. package/esm/advancedGroupsFilter/advancedGroupsFilterFormSection.js +3 -1
  132. package/esm/chip/chip.js +5 -5
  133. package/esm/dateInput/dateInput.d.ts +2 -1
  134. package/esm/dateInput/dateInput.js +11 -2
  135. package/esm/dateRange/dateRange.js +9 -8
  136. package/esm/dropdown/dropdown.d.ts +2 -0
  137. package/esm/dropdown/dropdown.js +5 -4
  138. package/esm/dropdown/dropdownHelper.d.ts +4 -4
  139. package/esm/dropdown/dropdownHelper.js +2 -1
  140. package/esm/dropdown/dropdownList.js +2 -2
  141. package/esm/dropdown/dropdownPopup.d.ts +1 -0
  142. package/esm/dropdown/dropdownPopup.js +2 -2
  143. package/esm/dropdown/dropdownSearchableTrigger.js +1 -1
  144. package/esm/dropdown/stateReducer/stateReducer.d.ts +6 -2
  145. package/esm/dropdown/stateReducer/stateReducer.js +29 -43
  146. package/esm/dropdown/stateReducer/stateReducerHelper.d.ts +2 -0
  147. package/esm/dropdown/stateReducer/stateReducerHelper.js +10 -0
  148. package/esm/dropdown/useDropdownState.d.ts +1 -1
  149. package/esm/dropdown/useDropdownState.js +5 -2
  150. package/esm/filters/components/filtersContainer.d.ts +1 -0
  151. package/esm/filters/components/filtersContainer.js +12 -13
  152. package/esm/filters/components/filtersDateInput.d.ts +10 -0
  153. package/esm/filters/components/filtersDateInput.js +23 -0
  154. package/esm/filters/components/filtersDropdown.d.ts +5 -4
  155. package/esm/filters/components/filtersDropdown.js +3 -3
  156. package/esm/filters/components/filtersEmptySelectedList.d.ts +2 -0
  157. package/esm/filters/components/filtersEmptySelectedList.js +7 -0
  158. package/esm/filters/components/filtersItem.d.ts +5 -4
  159. package/esm/filters/components/filtersItem.js +2 -1
  160. package/esm/filters/components/filtersSaveModal.d.ts +3 -1
  161. package/esm/filters/components/filtersSaveModal.js +2 -2
  162. package/esm/filters/components/filtersSavedChipComponent.js +68 -6
  163. package/esm/filters/components/filtersSearch.d.ts +4 -4
  164. package/esm/filters/components/filtersSearch.js +20 -9
  165. package/esm/filters/components/filtersSearchItemData.js +18 -1
  166. package/esm/filters/components/filtersSearchList.d.ts +5 -1
  167. package/esm/filters/components/filtersSearchList.js +156 -28
  168. package/esm/filters/components/filtersSelect.d.ts +1 -0
  169. package/esm/filters/components/filtersSelect.js +36 -8
  170. package/esm/filters/components/filtersSelectListItem.d.ts +21 -15
  171. package/esm/filters/components/filtersSelectListItem.js +13 -3
  172. package/esm/filters/components/filtersSidePanel.d.ts +15 -0
  173. package/esm/filters/components/filtersSidePanel.js +208 -0
  174. package/esm/filters/components/filtersSidePanelChip.d.ts +9 -0
  175. package/esm/filters/components/filtersSidePanelChip.js +9 -0
  176. package/esm/filters/components/filtersSidePanelDropdown.d.ts +6 -0
  177. package/esm/filters/components/filtersSidePanelDropdown.js +81 -0
  178. package/esm/filters/components/filtersSidePanelItem.d.ts +16 -0
  179. package/esm/filters/components/filtersSidePanelItem.js +63 -0
  180. package/esm/filters/components/filtersSidePanelRange.d.ts +6 -0
  181. package/esm/filters/components/filtersSidePanelRange.js +24 -0
  182. package/esm/filters/filters.d.ts +5 -0
  183. package/esm/filters/filters.js +101 -38
  184. package/esm/filters/filtersHelper.d.ts +4 -2
  185. package/esm/filters/filtersHelper.js +37 -0
  186. package/esm/filters/filtersHooks.d.ts +12 -2
  187. package/esm/filters/filtersHooks.js +19 -2
  188. package/esm/formStepper/formStepper.d.ts +1 -1
  189. package/esm/formStepper/formStepper.js +5 -2
  190. package/esm/groupsFilter/groupsFilter.js +72 -37
  191. package/esm/groupsFilter/groupsFilterMenu.d.ts +1 -0
  192. package/esm/groupsFilter/groupsFilterMenu.js +2 -2
  193. package/esm/groupsFilter/groupsFilterTrigger.js +1 -1
  194. package/esm/images/imageLooking.d.ts +4 -0
  195. package/esm/images/imageLooking.js +12 -0
  196. package/esm/index.d.ts +7 -4
  197. package/esm/index.js +6 -3
  198. package/esm/list/list.d.ts +3 -1
  199. package/esm/list/list.js +2 -2
  200. package/esm/mobileSheet/mobileSheet.d.ts +2 -0
  201. package/esm/mobileSheet/mobileSheet.js +4 -4
  202. package/esm/modal/modal.d.ts +1 -0
  203. package/esm/modal/modal.js +2 -2
  204. package/esm/radioGroup/radioGroup.d.ts +1 -0
  205. package/esm/radioGroup/radioGroup.js +3 -2
  206. package/esm/range/range.js +29 -10
  207. package/esm/searchInputRaw/searchInputRaw.js +1 -1
  208. package/esm/sidePanel/sidePanel.d.ts +1 -0
  209. package/esm/sidePanel/sidePanel.js +3 -3
  210. package/esm/tabs/tabItem/tabItem.d.ts +1 -0
  211. package/esm/tabs/tabItem/tabItem.js +2 -2
  212. package/esm/tabs/tabs.d.ts +1 -0
  213. package/esm/tabs/tabs.js +1 -1
  214. package/esm/utils/keyboardHelpers.d.ts +2 -0
  215. package/esm/utils/keyboardHelpers.js +44 -0
  216. package/esm/utils/localization/translations/cs-json.d.ts +1 -0
  217. package/esm/utils/localization/translations/cs-json.js +2 -1
  218. package/esm/utils/localization/translations/de-json.d.ts +1 -0
  219. package/esm/utils/localization/translations/de-json.js +2 -1
  220. package/esm/utils/localization/translations/en-json.d.ts +7 -0
  221. package/esm/utils/localization/translations/en-json.js +8 -1
  222. package/esm/utils/localization/translations/es-json.d.ts +1 -0
  223. package/esm/utils/localization/translations/es-json.js +2 -1
  224. package/esm/utils/localization/translations/fr-FR-json.d.ts +1 -0
  225. package/esm/utils/localization/translations/fr-FR-json.js +2 -1
  226. package/esm/utils/localization/translations/fr-json.d.ts +1 -0
  227. package/esm/utils/localization/translations/fr-json.js +2 -1
  228. package/esm/utils/localization/translations/id-json.d.ts +1 -0
  229. package/esm/utils/localization/translations/id-json.js +2 -1
  230. package/esm/utils/localization/translations/it-json.d.ts +1 -0
  231. package/esm/utils/localization/translations/it-json.js +2 -1
  232. package/esm/utils/localization/translations/ja-json.d.ts +1 -0
  233. package/esm/utils/localization/translations/ja-json.js +2 -1
  234. package/esm/utils/localization/translations/ko-KR-json.d.ts +1 -0
  235. package/esm/utils/localization/translations/ko-KR-json.js +2 -1
  236. package/esm/utils/localization/translations/ms-json.d.ts +1 -0
  237. package/esm/utils/localization/translations/ms-json.js +2 -1
  238. package/esm/utils/localization/translations/nl-json.d.ts +1 -0
  239. package/esm/utils/localization/translations/nl-json.js +2 -1
  240. package/esm/utils/localization/translations/pl-json.d.ts +1 -0
  241. package/esm/utils/localization/translations/pl-json.js +2 -1
  242. package/esm/utils/localization/translations/pt-BR-json.d.ts +1 -0
  243. package/esm/utils/localization/translations/pt-BR-json.js +2 -1
  244. package/esm/utils/localization/translations/sv-json.d.ts +1 -0
  245. package/esm/utils/localization/translations/sv-json.js +2 -1
  246. package/esm/utils/localization/translations/th-json.d.ts +1 -0
  247. package/esm/utils/localization/translations/th-json.js +2 -1
  248. package/esm/utils/localization/translations/tr-json.d.ts +1 -0
  249. package/esm/utils/localization/translations/tr-json.js +2 -1
  250. package/esm/utils/localization/translations/zh-Hans-json.d.ts +1 -0
  251. package/esm/utils/localization/translations/zh-Hans-json.js +2 -1
  252. package/esm/utils/localization/translations/zh-TW-json.d.ts +1 -0
  253. package/esm/utils/localization/translations/zh-TW-json.js +2 -1
  254. package/package.json +1 -1
  255. package/dist/filters/components/filtersModal.d.ts +0 -17
  256. package/dist/filters/components/filtersModal.js +0 -107
  257. package/dist/filters/components/filtersModalItem.d.ts +0 -9
  258. package/dist/filters/components/filtersModalItem.js +0 -74
  259. package/esm/filters/components/filtersModal.d.ts +0 -17
  260. package/esm/filters/components/filtersModal.js +0 -103
  261. package/esm/filters/components/filtersModalItem.d.ts +0 -9
  262. package/esm/filters/components/filtersModalItem.js +0 -70
@@ -7,6 +7,7 @@ exports.Filters = exports.FiltersDisplayName = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  /* eslint-disable @typescript-eslint/no-explicit-any */
9
9
  const react_1 = require("react");
10
+ const react_dom_1 = require("react-dom");
10
11
  const headerHelpers_1 = require("../header/headerHelpers");
11
12
  const react_2 = __importDefault(require("react"));
12
13
  const filtersSelect_1 = require("./components/filtersSelect");
@@ -22,7 +23,6 @@ const filtersGroups_1 = require("./components/filtersGroups");
22
23
  const filtersRange_1 = require("./components/filtersRange");
23
24
  const filtersChip_1 = require("./components/filtersChip");
24
25
  const filtersDateRange_1 = require("./components/filtersDateRange");
25
- const filtersModal_1 = require("./components/filtersModal");
26
26
  const filtersSearchList_1 = require("./components/filtersSearchList");
27
27
  const chipStatusProvider_1 = require("../chip/chipStatusProvider");
28
28
  const filtersSavedItemsProvider_1 = require("./components/filtersSavedItemsProvider");
@@ -31,20 +31,34 @@ const filtersSearch_1 = require("./components/filtersSearch");
31
31
  const useUniqueId_1 = require("../commonHelpers/useUniqueId");
32
32
  const isElementsEqual_1 = require("../utils/compareElementsUtils/isElementsEqual");
33
33
  const iconFilter_1 = require("../icons/iconFilter");
34
+ const filtersSidePanel_1 = require("./components/filtersSidePanel");
35
+ const filtersDateInput_1 = require("./components/filtersDateInput");
36
+ const useMobile_1 = require("../commonHelpers/hooks/useMobile");
37
+ const iconChevronTopSmall_1 = require("../icons/iconChevronTopSmall");
38
+ const focusableSelector_1 = require("../utils/focusableSelector");
34
39
  exports.FiltersDisplayName = "Filters";
40
+ /**
41
+ * @beta This component is currently in beta.
42
+ */
35
43
  const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeyword, searchTypes, searchType, setSearchType, allFiltersState, setAllFiltersState, onToggleView, searchSelection, setSearchSelection, recentSearches, onRemoveRecentSearchItem, onSaveRecentSearch, savedFilters, onRemoveSavedFilter, onSaveFilter }) => {
36
44
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
37
45
  const isSavedFiltersMode = Boolean(savedFilters && onRemoveSavedFilter && onSaveFilter);
38
46
  const isPinMode = Boolean(typeof isPinned === "boolean" && onPinChange);
39
47
  const isRecentSearchesMode = Boolean(recentSearches && onRemoveRecentSearchItem && onSaveRecentSearch);
40
48
  const uniqueKey = (0, useUniqueId_1.useUniqueId)();
41
- const [isModalOpen, setIsModalOpen] = (0, react_1.useState)(false);
49
+ const isMobile = (0, useMobile_1.useMobile)();
50
+ const [isSidePanelOpen, setIsSidePanelOpen] = (0, react_1.useState)(false);
42
51
  const triggerRef = react_2.default.useRef(null);
52
+ const sidePanelTriggerRef = react_2.default.useRef(null);
53
+ const searchPopupTriggerRef = react_2.default.useRef(null);
54
+ const searchListRef = react_2.default.useRef(null);
55
+ const selectListRef = react_2.default.useRef(null);
43
56
  const searchTriggerRef = react_2.default.useRef(null);
44
57
  const prevIsOpenRef = react_2.default.useRef(isOpen);
45
58
  const [savedFiltersStates, setSavedFiltersStates] = (0, react_1.useState)(new Map());
46
59
  const { translate } = (0, useLanguage_1.useLanguage)();
47
60
  const searchTypesArray = (0, react_1.useMemo)(() => (0, filtersHelper_1.getArrayOfElements)(searchTypes), [searchTypes]);
61
+ const searchOnlyOneType = (0, react_1.useMemo)(() => searchTypesArray.length === 1 ? searchTypesArray[0].id : undefined, [searchTypesArray]);
48
62
  const searchTypesMap = (0, react_1.useMemo)(() => {
49
63
  const map = new Map();
50
64
  searchTypesArray.forEach(el => {
@@ -88,19 +102,19 @@ const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeywo
88
102
  const newRecentSearchName = newRecentSearchNamesArr.join(", ");
89
103
  const newRecentSearch = { name: newRecentSearchName, type: isTyped ? preparedItemsArray[0].type : filtersSearchList_1.NO_TYPED_SEARCH_ITEM,
90
104
  description: Array.from(new Set(entries.filter(el => el.type && el.type !== filtersSearchList_1.NO_TYPED_SEARCH_ITEM && el.type !== filtersSearchList_1.KEYWORD_TYPE)
91
- .map(el => searchTypesMap.get(el.type) || el))).join(", "),
105
+ .map(el => searchTypesMap.get(el.type) || ""))).join(", "),
92
106
  itemsArray: [...preparedItemsArray] };
93
107
  onSaveRecentSearch(Object.assign({}, newRecentSearch));
94
108
  }, [onSaveRecentSearch, searchSelection, searchTypesMap]);
95
- const handleSearchFocus = (0, react_1.useCallback)(() => {
96
- if (!isOpen) {
97
- setIsOpen(true);
98
- }
99
- }, [isOpen]);
100
109
  (0, react_1.useEffect)(() => {
101
- var _a;
102
- isOpen && ((_a = searchTriggerRef.current) === null || _a === void 0 ? void 0 : _a.focus());
103
- }, [isOpen, searchTriggerRef]);
110
+ var _a, _b;
111
+ if (isOpen) {
112
+ (_a = searchPopupTriggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
113
+ }
114
+ else {
115
+ prevIsOpenRef.current && ((_b = searchTriggerRef.current) === null || _b === void 0 ? void 0 : _b.focus());
116
+ }
117
+ }, [isOpen, searchPopupTriggerRef, searchTriggerRef]);
104
118
  (0, react_1.useEffect)(() => {
105
119
  if (!isOpen && prevIsOpenRef.current) {
106
120
  prevIsOpenRef.current = false;
@@ -111,31 +125,53 @@ const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeywo
111
125
  }
112
126
  }, [isOpen, isRecentSearchesMode, handleSaveRecentSearch]);
113
127
  const selectState = (0, react_1.useMemo)(() => Object.keys(searchType), [searchType]);
128
+ const onClearSearchSelection = (0, react_1.useCallback)(() => {
129
+ setSearchSelection && setSearchSelection([]);
130
+ }, [setSearchSelection]);
114
131
  const onSearchItemClick = (0, react_1.useCallback)((item) => {
115
132
  if (!(searchSelection && setSearchSelection)) {
116
133
  return;
117
134
  }
118
135
  const typeKey = item.type || filtersSearchList_1.NO_TYPED_SEARCH_ITEM;
119
- const currentItem = searchSelection.find(el => el.id === item.id && (el.type || filtersSearchList_1.NO_TYPED_SEARCH_ITEM) === typeKey);
136
+ const currentItem = searchOnlyOneType ? searchSelection.find(el => el.id === item.id)
137
+ : searchSelection.find(el => el.id === item.id && (el.type || filtersSearchList_1.NO_TYPED_SEARCH_ITEM) === typeKey);
120
138
  if (currentItem) {
121
- const newValue = searchSelection.filter(el => !(el.id === currentItem.id && (el.type || filtersSearchList_1.NO_TYPED_SEARCH_ITEM) === typeKey));
139
+ const newValue = searchOnlyOneType ? searchSelection.filter(el => el.id !== currentItem.id)
140
+ : searchSelection.filter(el => !(el.id === currentItem.id && (el.type || filtersSearchList_1.NO_TYPED_SEARCH_ITEM) === typeKey));
141
+ currentItem.id === filtersSearchList_1.KEYWORD_ID && setKeyword("");
122
142
  setSearchSelection(newValue);
123
143
  }
124
144
  else {
125
- setSearchSelection([...searchSelection, item]);
145
+ setSearchSelection([...searchSelection, Object.assign(Object.assign({}, item), { type: item.type || searchOnlyOneType || filtersSearchList_1.NO_TYPED_SEARCH_ITEM })]);
126
146
  }
127
- }, [searchSelection, setSearchSelection]);
147
+ }, [searchOnlyOneType, searchSelection, setKeyword, setSearchSelection]);
128
148
  const handleTriggerClick = (0, react_1.useCallback)(() => {
129
- setIsOpen(prevState => !prevState);
149
+ if (!document.startViewTransition) {
150
+ setIsOpen(prevState => !prevState);
151
+ return;
152
+ }
153
+ document.startViewTransition(() => {
154
+ (0, react_dom_1.flushSync)(() => {
155
+ setIsOpen(prevState => !prevState);
156
+ });
157
+ });
130
158
  }, []);
131
- const handleModalState = (0, react_1.useCallback)(() => {
132
- onToggleView && onToggleView(!isModalOpen);
133
- setIsModalOpen(val => !val);
134
- }, [isModalOpen, onToggleView]);
159
+ const handleViewState = (0, react_1.useCallback)(() => {
160
+ onToggleView && onToggleView(!isSidePanelOpen);
161
+ setIsSidePanelOpen(val => !val);
162
+ }, [isSidePanelOpen, onToggleView]);
135
163
  const handleOpenChange = (0, react_1.useCallback)((open) => {
136
- setIsOpen(open);
164
+ if (!document.startViewTransition) {
165
+ setIsOpen(open);
166
+ return;
167
+ }
168
+ document.startViewTransition(() => {
169
+ (0, react_dom_1.flushSync)(() => {
170
+ setIsOpen(open);
171
+ });
172
+ });
137
173
  }, []);
138
- const handleModalApply = (0, react_1.useCallback)((state) => {
174
+ const handleSidePanelApply = (0, react_1.useCallback)((state) => {
139
175
  filters.forEach((filter) => {
140
176
  const filterProps = filter.props;
141
177
  const newState = state[filterProps.id];
@@ -160,11 +196,29 @@ const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeywo
160
196
  setSearchSelection === null || setSearchSelection === void 0 ? void 0 : setSearchSelection([...newSearchSelection]);
161
197
  }
162
198
  newItemSearch && setKeyword(newItemSearch.name);
163
- setIsOpen(false);
164
- }, [setKeyword, setSearchSelection]);
199
+ handleOpenChange(false);
200
+ }, [handleOpenChange, setKeyword, setSearchSelection]);
165
201
  const handlePinChange = (0, react_1.useCallback)(() => {
166
202
  onPinChange && onPinChange(!isPinned);
167
203
  }, [onPinChange, isPinned]);
204
+ const handleSearchKeyDown = (0, react_1.useCallback)((event) => {
205
+ var _a, _b;
206
+ if (event.code === "Enter") {
207
+ isRecentSearchesMode && handleSaveRecentSearch(event.currentTarget.value);
208
+ !isOpen && handleTriggerClick();
209
+ }
210
+ if (event.code === "ArrowDown" && !isOpen) {
211
+ handleTriggerClick();
212
+ }
213
+ if (event.code === "ArrowDown" && isOpen) {
214
+ const firstItem = (_a = searchListRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(focusableSelector_1.FOCUSABLE_SELECTOR);
215
+ firstItem === null || firstItem === void 0 ? void 0 : firstItem.focus();
216
+ }
217
+ if (event.code === "ArrowLeft" && isOpen && event.currentTarget.value === "") {
218
+ const firstItem = (_b = selectListRef.current) === null || _b === void 0 ? void 0 : _b.querySelector(focusableSelector_1.FOCUSABLE_SELECTOR);
219
+ firstItem === null || firstItem === void 0 ? void 0 : firstItem.focus();
220
+ }
221
+ }, [isOpen, isRecentSearchesMode, handleSaveRecentSearch, handleTriggerClick]);
168
222
  const getIconByType = (0, react_1.useCallback)((type) => {
169
223
  if (!type) {
170
224
  return iconFilter_1.IconFilter;
@@ -172,24 +226,32 @@ const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeywo
172
226
  const foundType = searchTypesArray.find((item) => item.id === type);
173
227
  return foundType && foundType.icon ? foundType.icon : iconFilter_1.IconFilter;
174
228
  }, [searchTypesArray]);
175
- const memoizedSelect = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersSelect_1.FiltersSelect, { id: `filtersSelect_${uniqueKey}`,
176
- // name={translate("Search by")}
177
- value: searchType, onChange: setSearchType, items: searchTypesToSelect }), [searchType, searchTypesToSelect, setSearchType, uniqueKey]);
178
- const memoizedSearch = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersSearch_1.FiltersSearch, { id: `filtersSearch_${uniqueKey}`, ref: isOpen ? searchTriggerRef : undefined, name: translate("Search page"), value: keyword, onChange: setKeyword, onSearchKeyDown: isRecentSearchesMode ? handleSaveRecentSearch : undefined, handleSearchFocus: handleSearchFocus, handleRemove: onSearchItemClick, searchSelection: searchSelection, className: "zen-filters-popup__search-with-pills" }), [uniqueKey, isOpen, translate, keyword, setKeyword, isRecentSearchesMode, handleSaveRecentSearch, handleSearchFocus, onSearchItemClick, searchSelection]);
229
+ const combinedData = (0, filtersHelper_1.useCombineData)(searchTypesArray);
230
+ const memoizedSelect = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersSelect_1.FiltersSelect, { value: searchType, selectListRef: selectListRef, onChange: setSearchType, items: searchTypesToSelect }), [searchType, searchTypesToSelect, setSearchType]);
231
+ const handleSearchKeywordChange = (0, react_1.useCallback)((newKeyword) => {
232
+ setKeyword(newKeyword);
233
+ !isOpen && handleOpenChange(true);
234
+ }, [setKeyword, isOpen, handleOpenChange]);
235
+ const memoizedSearch = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersSearch_1.FiltersSearch, { id: `filtersSearch_${uniqueKey}`, ref: searchTriggerRef, name: translate("Search page"), value: keyword, onSearchKeyDown: handleSearchKeyDown, onOpenPopup: isOpen ? undefined : handleTriggerClick, onChange: handleSearchKeywordChange, handleRemove: onSearchItemClick, searchSelection: searchSelection, className: "zen-filters__search-with-pills" }), [uniqueKey, translate, keyword, handleSearchKeyDown, isOpen, handleTriggerClick, handleSearchKeywordChange, onSearchItemClick, searchSelection]);
236
+ const memoizedSearchPopup = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersSearch_1.FiltersSearch, { id: `filtersSearch_${uniqueKey}_popup`, ref: searchPopupTriggerRef, name: translate("Search page"), value: keyword, onChange: setKeyword, onSearchKeyDown: handleSearchKeyDown, handleRemove: onSearchItemClick, searchSelection: searchSelection, className: "zen-filters-popup__search-with-pills" }), [uniqueKey, translate, keyword, setKeyword, handleSearchKeyDown, onSearchItemClick, searchSelection]);
237
+ const memoizedSearchList = (0, react_1.useMemo)(() => !isOpen ? null :
238
+ (0, jsx_runtime_1.jsx)(filtersSearchList_1.FiltersSearchList, { searchValue: keyword, searchListRef: searchListRef, searchData: combinedData, searchSelection: searchSelection, onlyOneType: searchOnlyOneType, getIconByType: getIconByType, handleSearchItemClick: onSearchItemClick, handleClearSearchSelection: onClearSearchSelection, recentSearches: isRecentSearchesMode ? recentSearches : undefined, onRemoveRecentSearchItem: isRecentSearchesMode ? onRemoveRecentSearchItem : undefined, handleRecentSearchItemClick: isRecentSearchesMode ? handleRecentSearchItemClick : undefined }), [isOpen, keyword, combinedData, searchSelection, getIconByType, onSearchItemClick, onClearSearchSelection, isRecentSearchesMode, recentSearches,
239
+ onRemoveRecentSearchItem, handleRecentSearchItemClick, searchOnlyOneType, searchListRef]);
179
240
  const allOption = (0, react_1.useMemo)(() => (0, filtersSelect_1.getAllOption)(translate), [translate]);
241
+ const selectTriggerPopup = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-filters__select-trigger", iconClasses: "zen-filters__select-trigger-icon", contentClasses: "zen-filters__select-trigger-content", title: translate("Close setting conditions popup"), onClick: handleTriggerClick, icon: iconChevronTopSmall_1.IconChevronTopSmall, iconPosition: "end", children: translate("Search by") }), [handleTriggerClick, translate]);
242
+ // added onMouseDown to prevent focus
180
243
  const selectTrigger = (0, react_1.useMemo)(() => {
181
244
  var _a;
182
- return (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-filters__select-trigger", iconClasses: "zen-filters__select-trigger-icon", contentClasses: "zen-filters__select-trigger-content", onClick: handleTriggerClick, icon: iconChevronDownSmall_1.IconChevronDownSmall, iconPosition: "end", children: !isOpen ? selectState[0] === filtersSelect_1.ALL_SELECT_OPTION_ID ? allOption.name :
183
- (_a = searchTypesArray.find((item) => item.id === selectState[0])) === null || _a === void 0 ? void 0 : _a.name : translate("Search by") });
184
- }, [handleTriggerClick, selectState, isOpen, allOption.name, translate, searchTypesArray]);
185
- const combinedData = (0, filtersHelper_1.useCombineData)(searchTypesArray);
186
- const memoizedPopup = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { paddingY: -28, isOpen: isOpen, className: (0, classNames_1.classNames)(["zen-filters-popup"]), onOpenChange: handleOpenChange, useTrapFocusWithTrigger: "withTrigger", alignment: "bottom", shouldHoldScroll: true, triggerRef: triggerRef, ariaLabel: translate("Setting conditions"), recalculateOnScroll: true, children: (0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-popup__content", children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-popup__left-panel", children: [selectTrigger, memoizedSelect] }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-popup__right-panel", children: [memoizedSearch, (0, jsx_runtime_1.jsx)(filtersSearchList_1.FiltersSearchList, { searchValue: keyword, searchData: combinedData, searchSelection: searchSelection, getIconByType: getIconByType, handleSearchItemClick: onSearchItemClick, recentSearches: isRecentSearchesMode ? recentSearches : undefined, onRemoveRecentSearchItem: isRecentSearchesMode ? onRemoveRecentSearchItem : undefined, handleRecentSearchItemClick: isRecentSearchesMode ? handleRecentSearchItemClick : undefined })] })] }) }), [isOpen, handleOpenChange, selectTrigger, memoizedSelect, memoizedSearch, keyword, combinedData, searchSelection, getIconByType, onSearchItemClick, isRecentSearchesMode, recentSearches, translate, onRemoveRecentSearchItem, handleRecentSearchItemClick]);
245
+ return isMobile ? null : (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { tabIndex: -1, onMouseDown: e => e.preventDefault(), className: "zen-filters__select-trigger", iconClasses: "zen-filters__select-trigger-icon", contentClasses: "zen-filters__select-trigger-content", title: translate("Open setting conditions popup"), onClick: handleTriggerClick, icon: iconChevronDownSmall_1.IconChevronDownSmall, iconPosition: "end", children: selectState[0] === filtersSelect_1.ALL_SELECT_OPTION_ID ? allOption.name :
246
+ (_a = searchTypesArray.find((item) => item.id === selectState[0])) === null || _a === void 0 ? void 0 : _a.name });
247
+ }, [translate, handleTriggerClick, selectState, allOption.name, searchTypesArray, isMobile]);
248
+ const memoizedPopup = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { paddingY: -34, isOpen: isOpen, className: (0, classNames_1.classNames)(["zen-filters-popup"]), onOpenChange: handleOpenChange, useTrapFocusWithTrigger: "on", alignment: "bottom", shouldHoldScroll: true, triggerRef: triggerRef, ariaLabel: translate("Setting conditions"), recalculateOnScroll: true, children: (0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-popup__content", children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-popup__left-panel", children: [selectTriggerPopup, memoizedSelect] }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-popup__right-panel", children: [memoizedSearchPopup, memoizedSearchList] })] }) }), [isOpen, handleOpenChange, translate, selectTriggerPopup, memoizedSelect, memoizedSearchPopup, memoizedSearchList]);
187
249
  const filtersForRender = (0, react_1.useMemo)(() => filters.filter(el => {
188
250
  const elProps = el.props;
189
251
  return typeof elProps.visible === "boolean" ? elProps.visible
190
252
  : elProps.visible === undefined ? false : elProps.visible(Array.from(selectState), undefined);
191
253
  }), [filters, selectState]);
192
- // The modal has a full set of filters, so we need to calculate the number of changed filters based on all filters, not just the visible ones
254
+ // The sidePanel has a full set of filters, so we need to calculate the number of changed filters based on all filters, not just the visible ones
193
255
  const filtersForCalculation = (0, react_1.useMemo)(() => {
194
256
  const stateObj = (0, filtersHelper_1.createStateObject)(filters, "state");
195
257
  return filters.filter(el => {
@@ -199,9 +261,9 @@ const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeywo
199
261
  });
200
262
  }, [filters, selectState]);
201
263
  const hasSavedFilters = savedFiltersStates.size > 0;
202
- const memoizedFiltersContainer = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersContainer_1.FiltersContainer, { filtersClickHandler: handleModalState, filtersForCalculation: filtersForCalculation, isPinned: isPinMode ? isPinned : undefined, onPinChange: isPinMode ? onPinChange : undefined, hasSavedFilters: hasSavedFilters, children: filtersForRender }), [handleModalState, filtersForCalculation, isPinMode, isPinned, onPinChange, hasSavedFilters, filtersForRender]);
203
- const tabItems = (0, react_1.useMemo)(() => searchTypesArray.map((item) => ({ id: item.id, name: item.name })), [searchTypesArray]);
204
- const memoizedModal = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersModal_1.FiltersModal, { isOpen: isModalOpen, onApply: handleModalApply, onClose: handleModalState, onPin: isPinMode ? handlePinChange : undefined, isPinned: isPinMode ? isPinned : undefined, filters: filters, tabItems: tabItems, externalModalState: allFiltersState, setExternalModalState: setAllFiltersState }), [isModalOpen, handleModalApply, handleModalState, handlePinChange, isPinned, isPinMode, filters, tabItems, allFiltersState, setAllFiltersState]);
264
+ const hasFilters = filtersForCalculation.length > 0;
265
+ const memoizedFiltersContainer = (0, react_1.useMemo)(() => hasFilters ? (0, jsx_runtime_1.jsx)(filtersContainer_1.FiltersContainer, { filtersChipRef: sidePanelTriggerRef, filtersClickHandler: handleViewState, filtersForCalculation: filtersForCalculation, isPinned: isPinMode ? isPinned : undefined, onPinChange: isPinMode ? onPinChange : undefined, hasSavedFilters: hasSavedFilters, children: filtersForRender }) : null, [handleViewState, filtersForCalculation, isPinMode, isPinned, onPinChange, hasSavedFilters, filtersForRender, hasFilters]);
266
+ const memoizedSidePanel = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(filtersSidePanel_1.FiltersSidePanel, { isOpen: isSidePanelOpen, onApply: handleSidePanelApply, onClose: handleViewState, onPin: isPinMode ? handlePinChange : undefined, isPinned: isPinMode ? isPinned : undefined, filters: filters, externalState: allFiltersState, setExternalState: setAllFiltersState, triggerRef: sidePanelTriggerRef }), [isSidePanelOpen, handleSidePanelApply, handleViewState, handlePinChange, isPinned, isPinMode, filters, allFiltersState, setAllFiltersState, sidePanelTriggerRef]);
205
267
  const memoizedStatus = (0, react_1.useMemo)(() => isPinned && isPinMode ? "accent" : undefined, [isPinned, isPinMode]);
206
268
  const memoizedSavedFiltersItems = (0, react_1.useMemo)(() => new Set(savedFiltersStates.keys()), [savedFiltersStates]);
207
269
  const memoizedSavedFiltersActive = (0, react_1.useMemo)(() => {
@@ -243,11 +305,12 @@ const Filters = ({ className, children, isPinned, onPinChange, keyword, setKeywo
243
305
  });
244
306
  }
245
307
  }, [filters, savedFiltersStates]);
246
- return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters", className || ""]), children: [isOpen ? null : (0, jsx_runtime_1.jsxs)("div", { className: "zen-filters__main-row", children: [selectTrigger, memoizedSearch] }), (0, jsx_runtime_1.jsx)("div", { className: "zen-filters__trigger", ref: triggerRef, role: "button", tabIndex: 0, "aria-label": translate("Open search") }), (0, jsx_runtime_1.jsx)(filtersSavedItemsProvider_1.FiltersSavedItemsProvider, { items: memoizedSavedFiltersItems, active: memoizedSavedFiltersActive, onRemove: isSavedFiltersMode ? removeSavedFiltersState : undefined, onApply: isSavedFiltersMode ? applySavedFiltersState : undefined, onSave: isSavedFiltersMode ? handleSaveFilters : undefined, children: (0, jsx_runtime_1.jsx)(chipStatusProvider_1.ChipStatusProvider, { status: memoizedStatus, children: memoizedFiltersContainer }) }), memoizedPopup, isModalOpen ? (0, jsx_runtime_1.jsx)(filtersSavedItemsProvider_1.FiltersSavedItemsProvider, { items: memoizedSavedFiltersItems, active: memoizedSavedFiltersActive, onRemove: isSavedFiltersMode ? removeSavedFiltersState : undefined, onApply: isSavedFiltersMode ? applySavedFiltersState : undefined, onSave: isSavedFiltersMode ? handleSaveFilters : undefined, children: (0, jsx_runtime_1.jsx)(chipStatusProvider_1.ChipStatusProvider, { status: memoizedStatus, children: memoizedModal }) }) : null] });
308
+ return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters", className || ""]), children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters__main-row", isOpen ? "" : "zen-filters__main-row--initial"]), ref: triggerRef, role: "combobox", "aria-label": translate("Open setting conditions popup"), children: [selectTrigger, memoizedSearch] }), (0, jsx_runtime_1.jsx)(filtersSavedItemsProvider_1.FiltersSavedItemsProvider, { items: memoizedSavedFiltersItems, active: memoizedSavedFiltersActive, onRemove: isSavedFiltersMode ? removeSavedFiltersState : undefined, onApply: isSavedFiltersMode ? applySavedFiltersState : undefined, onSave: isSavedFiltersMode ? handleSaveFilters : undefined, children: (0, jsx_runtime_1.jsx)(chipStatusProvider_1.ChipStatusProvider, { status: memoizedStatus, children: memoizedFiltersContainer }) }), memoizedPopup, (0, jsx_runtime_1.jsx)(filtersSavedItemsProvider_1.FiltersSavedItemsProvider, { items: memoizedSavedFiltersItems, active: memoizedSavedFiltersActive, onRemove: isSavedFiltersMode ? removeSavedFiltersState : undefined, onApply: isSavedFiltersMode ? applySavedFiltersState : undefined, onSave: isSavedFiltersMode ? handleSaveFilters : undefined, children: (0, jsx_runtime_1.jsx)(chipStatusProvider_1.ChipStatusProvider, { status: memoizedStatus, children: memoizedSidePanel }) })] });
247
309
  };
248
310
  exports.Filters = Filters;
249
311
  exports.Filters.Chip = filtersChip_1.FiltersChip;
250
312
  exports.Filters.DateRange = filtersDateRange_1.FiltersDateRange;
313
+ exports.Filters.DateInput = filtersDateInput_1.FiltersDateInput;
251
314
  exports.Filters.Dropdown = filtersDropdown_1.FiltersDropdown;
252
315
  exports.Filters.Groups = filtersGroups_1.FiltersGroups;
253
316
  exports.Filters.Range = filtersRange_1.FiltersRange;
@@ -1,8 +1,8 @@
1
1
  import { ReactElement } from "react";
2
2
  import React from "react";
3
3
  import { TFiltersDropdownAllStates } from "./components/filtersDropdown";
4
- import { IFiltersSearchTypesItem } from "./filters";
5
- import { ISearchItem } from "./components/filtersSearchList";
4
+ import { IFiltersSearchTypesItem, ISavedFilters } from "./filters";
5
+ import { IRecentSearchItem, ISearchItem } from "./components/filtersSearchList";
6
6
  export declare const createStateHash: (state: unknown) => string;
7
7
  export declare const createPropsHash: (props: Record<string, unknown>) => string;
8
8
  export declare const stabilizeChildrenWithId: (children: React.ReactNode) => (React.ReactElement | null)[];
@@ -38,3 +38,5 @@ export declare const useCombineData: (searchTypes: IFiltersSearchTypesItem[]) =>
38
38
  error: Error | null;
39
39
  };
40
40
  export declare function getArrayOfElements<T>(elem: T | T[] | undefined): T[];
41
+ export declare function getSavedFiltersFromStorage(key: string): Promise<ISavedFilters[]>;
42
+ export declare function getRecentSearchesFromStorage(key: string): IRecentSearchItem[];
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getArrayOfElements = exports.useCombineData = exports.MAX_TOTAL_RESULTS = exports.serializeEntriesToId = exports.getTotalChangedNumber = exports.getNumberOfChangedFilters = exports.createStateObject = exports.getFiltersState = exports.getChildren = exports.prepareDefaultDropdownState = exports.getDropdownStateType = exports.stabilizeChildrenWithId = exports.createPropsHash = exports.createStateHash = void 0;
6
+ exports.getRecentSearchesFromStorage = exports.getSavedFiltersFromStorage = exports.getArrayOfElements = exports.useCombineData = exports.MAX_TOTAL_RESULTS = exports.serializeEntriesToId = exports.getTotalChangedNumber = exports.getNumberOfChangedFilters = exports.createStateObject = exports.getFiltersState = exports.getChildren = exports.prepareDefaultDropdownState = exports.getDropdownStateType = exports.stabilizeChildrenWithId = exports.createPropsHash = exports.createStateHash = void 0;
7
7
  /* eslint-disable @typescript-eslint/no-explicit-any */
8
8
  const react_1 = require("react");
9
9
  const filtersGroups_1 = require("./components/filtersGroups");
@@ -230,3 +230,42 @@ function getArrayOfElements(elem) {
230
230
  return Array.isArray(elem) ? elem : [elem];
231
231
  }
232
232
  exports.getArrayOfElements = getArrayOfElements;
233
+ const dateReviver = (_, value) => {
234
+ const isIsoDateString = typeof value === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value);
235
+ if (isIsoDateString) {
236
+ return new Date(value);
237
+ }
238
+ return value;
239
+ };
240
+ const getParsedFilters = (storageKey) => {
241
+ const storedData = localStorage.getItem(storageKey);
242
+ if (!storedData) {
243
+ return [];
244
+ }
245
+ try {
246
+ return JSON.parse(storedData, dateReviver);
247
+ }
248
+ catch (e) {
249
+ console.error(`Error parsing saved filters for key "${storageKey}"`, e);
250
+ return [];
251
+ }
252
+ };
253
+ async function getSavedFiltersFromStorage(key) {
254
+ const result = getParsedFilters(key);
255
+ return Promise.resolve(result);
256
+ }
257
+ exports.getSavedFiltersFromStorage = getSavedFiltersFromStorage;
258
+ function getRecentSearchesFromStorage(key) {
259
+ const storedData = localStorage.getItem(key);
260
+ if (!storedData) {
261
+ return [];
262
+ }
263
+ try {
264
+ return JSON.parse(storedData);
265
+ }
266
+ catch (e) {
267
+ console.error(`Error parsing recent searches for key "${key}"`, e);
268
+ return [];
269
+ }
270
+ }
271
+ exports.getRecentSearchesFromStorage = getRecentSearchesFromStorage;
@@ -1,6 +1,8 @@
1
1
  /// <reference types="react" />
2
2
  import { IFiltersSearchType } from "./components/filtersSelect";
3
3
  import { ISearchItem } from "./components/filtersSearchList";
4
+ import { IFetchState, IFiltersSearchTypesSubItem } from "./filters";
5
+ import { IIcon } from "../icons/icon";
4
6
  export declare const useFiltersSearch: (keywordDebounceTime?: number) => {
5
7
  keyword: string;
6
8
  setKeyword: import("react").Dispatch<import("react").SetStateAction<string>>;
@@ -13,7 +15,15 @@ export declare const usePinnedFilters: () => {
13
15
  isPinned: boolean;
14
16
  onPinChange: import("react").Dispatch<import("react").SetStateAction<boolean>>;
15
17
  };
16
- export declare const useFiltersSelection: () => {
18
+ export declare const useFiltersSelection: (setArgs?: (selection: ISearchItem[]) => void) => {
17
19
  searchSelection: ISearchItem[];
18
- setSearchSelection: import("react").Dispatch<import("react").SetStateAction<ISearchItem[]>>;
20
+ setSearchSelection: (selection: ISearchItem[]) => void;
21
+ };
22
+ export declare const useSearchData: <T>(id: string, name: string, data: IFetchState<T>, icon?: React.FC<IIcon>, subItems?: IFiltersSearchTypesSubItem[], relevance?: number) => {
23
+ id: string;
24
+ name: string;
25
+ data: IFetchState<T>;
26
+ icon: import("react").FC<IIcon> | undefined;
27
+ subItems: IFiltersSearchTypesSubItem[] | undefined;
28
+ relevance: number | undefined;
19
29
  };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useFiltersSelection = exports.usePinnedFilters = exports.useFiltersSearch = void 0;
3
+ exports.useSearchData = exports.useFiltersSelection = exports.usePinnedFilters = exports.useFiltersSearch = void 0;
4
4
  const react_1 = require("react");
5
5
  const filtersSelect_1 = require("./components/filtersSelect");
6
6
  const useDebouncedMemo_1 = require("../commonHelpers/hooks/useDebouncedMemo");
@@ -18,8 +18,26 @@ const usePinnedFilters = () => {
18
18
  return pinnedFilters;
19
19
  };
20
20
  exports.usePinnedFilters = usePinnedFilters;
21
- const useFiltersSelection = () => {
21
+ const useFiltersSelection = (setArgs) => {
22
22
  const [searchSelection, setSearchSelection] = (0, react_1.useState)([]);
23
- return { searchSelection, setSearchSelection };
23
+ const handleSelectionChange = (0, react_1.useCallback)((selection) => {
24
+ setSearchSelection(selection);
25
+ if (setArgs) {
26
+ setArgs(selection);
27
+ }
28
+ }, [setArgs]);
29
+ return { searchSelection, setSearchSelection: handleSelectionChange };
24
30
  };
25
31
  exports.useFiltersSelection = useFiltersSelection;
32
+ const useSearchData = (id, name, data, icon, subItems, relevance) => {
33
+ const memoizedData = (0, react_1.useMemo)(() => ({
34
+ id,
35
+ name,
36
+ data,
37
+ icon,
38
+ subItems,
39
+ relevance
40
+ }), [id, name, data, subItems, icon, relevance]);
41
+ return memoizedData;
42
+ };
43
+ exports.useSearchData = useSearchData;
@@ -8,7 +8,7 @@ export interface IFormStepper {
8
8
  current: string;
9
9
  setCurrent: React.Dispatch<React.SetStateAction<string>>;
10
10
  errors?: string[];
11
- onStepClicked?: ((id: string) => void) | false;
11
+ onStepClicked?: ((id: string) => void | boolean) | false;
12
12
  className?: string;
13
13
  mode?: TFormStepperMode;
14
14
  }
@@ -26,10 +26,13 @@ const FormStepper = ({ steps, onStepClicked, className = "", current, errors, se
26
26
  return steps;
27
27
  }, [steps]);
28
28
  const onStepClickedHandler = (0, react_1.useCallback)((id) => {
29
- setCurrent(id);
30
29
  if (!isStepperNonClickable) {
31
- onStepClicked === null || onStepClicked === void 0 ? void 0 : onStepClicked(id);
30
+ const res = onStepClicked === null || onStepClicked === void 0 ? void 0 : onStepClicked(id);
31
+ if (res === false) {
32
+ return;
33
+ }
32
34
  }
35
+ setCurrent(id);
33
36
  }, [setCurrent, isStepperNonClickable, onStepClicked]);
34
37
  const isCompactMode = mode === "compact" || isMobile;
35
38
  const isOptionalStep = isCompactMode && ((_a = adjustedSteps[activeStepIndex]) === null || _a === void 0 ? void 0 : _a.optional);