@cccsaurora/howler-ui 2.19.0-dev.1181 → 2.19.0-dev.1264

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 (419) hide show
  1. package/api/analytic/index.d.ts +2 -3
  2. package/api/analytic/index.js +1 -2
  3. package/api/index.d.ts +4 -0
  4. package/api/index.js +10 -2
  5. package/api/search/case.d.ts +4 -0
  6. package/api/search/case.js +8 -0
  7. package/api/search/facet/hit.d.ts +1 -3
  8. package/api/search/facet/index.d.ts +3 -1
  9. package/api/search/index.d.ts +3 -1
  10. package/api/search/index.js +2 -1
  11. package/api/socket/index.d.ts +3 -0
  12. package/api/socket/index.js +6 -0
  13. package/api/socket/viewers.d.ts +2 -0
  14. package/api/socket/viewers.js +8 -0
  15. package/api/socket/viewers.test.js +44 -0
  16. package/api/v2/case/index.d.ts +9 -0
  17. package/api/v2/case/index.js +21 -0
  18. package/api/v2/case/items.d.ts +9 -0
  19. package/api/v2/case/items.js +19 -0
  20. package/api/v2/case/rules.d.ts +6 -0
  21. package/api/v2/case/rules.js +18 -0
  22. package/api/v2/fuzzy.d.ts +17 -0
  23. package/api/v2/fuzzy.js +11 -0
  24. package/api/v2/index.d.ts +5 -0
  25. package/api/v2/index.js +7 -0
  26. package/api/v2/search/facet.d.ts +3 -0
  27. package/api/v2/search/facet.js +12 -0
  28. package/api/v2/search/index.d.ts +6 -0
  29. package/api/v2/search/index.js +24 -0
  30. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  31. package/components/app/App.js +49 -11
  32. package/components/app/hooks/useMatchers.d.ts +1 -1
  33. package/components/app/hooks/useMatchers.js +23 -11
  34. package/components/app/hooks/useMatchers.test.js +22 -22
  35. package/components/app/hooks/useTitle.js +5 -5
  36. package/components/app/providers/FavouritesProvider.js +2 -2
  37. package/components/app/providers/GridColumnsProvider.js +2 -2
  38. package/components/app/providers/GridColumnsProvider.test.js +3 -3
  39. package/components/app/providers/ModalProvider.d.ts +1 -0
  40. package/components/app/providers/ParameterProvider.d.ts +25 -3
  41. package/components/app/providers/ParameterProvider.js +163 -226
  42. package/components/app/providers/ParameterProvider.test.js +358 -94
  43. package/components/app/providers/RecordProvider.d.ts +23 -0
  44. package/components/app/providers/{HitProvider.js → RecordProvider.js} +46 -42
  45. package/components/app/providers/{HitSearchProvider.d.ts → RecordSearchProvider.d.ts} +6 -6
  46. package/components/app/providers/{HitSearchProvider.js → RecordSearchProvider.js} +13 -19
  47. package/components/app/providers/{HitSearchProvider.test.js → RecordSearchProvider.test.js} +52 -71
  48. package/components/app/providers/SearchResponseProvider.d.ts +4 -4
  49. package/components/app/providers/SearchResponseProvider.js +1 -1
  50. package/components/app/providers/SocketProvider.d.ts +11 -2
  51. package/components/app/providers/SocketProvider.js +18 -5
  52. package/components/app/providers/UserListProvider.js +28 -8
  53. package/components/app/providers/UserListProvider.test.js +150 -0
  54. package/components/elements/ContextMenu.d.ts +56 -0
  55. package/components/elements/ContextMenu.js +109 -0
  56. package/components/elements/ContextMenu.test.d.ts +1 -0
  57. package/components/elements/ContextMenu.test.js +215 -0
  58. package/components/{routes/overviews/OverviewEditor.js → elements/MarkdownEditor.js} +3 -3
  59. package/components/elements/ObjectDetails.d.ts +6 -0
  60. package/components/elements/{hit/HitDetails.js → ObjectDetails.js} +17 -17
  61. package/components/elements/PluginChip.d.ts +1 -1
  62. package/components/elements/PluginChip.js +0 -1
  63. package/components/elements/PluginTypography.d.ts +2 -1
  64. package/components/elements/PluginTypography.js +3 -2
  65. package/components/elements/UserList.d.ts +5 -2
  66. package/components/elements/UserList.js +33 -16
  67. package/components/elements/UserList.test.d.ts +1 -0
  68. package/components/elements/UserList.test.js +122 -0
  69. package/components/elements/addons/lists/TuiListElement.d.ts +1 -1
  70. package/components/elements/addons/lists/TuiListElement.js +0 -1
  71. package/components/elements/addons/search/SearchTotal.js +1 -1
  72. package/components/elements/addons/search/SearchTotal.test.js +2 -2
  73. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  74. package/components/elements/case/CaseCard.d.ts +12 -0
  75. package/components/elements/case/CaseCard.js +43 -0
  76. package/components/elements/case/CasePreview.d.ts +6 -0
  77. package/components/elements/case/CasePreview.js +17 -0
  78. package/components/elements/case/StatusIcon.d.ts +5 -0
  79. package/components/elements/case/StatusIcon.js +13 -0
  80. package/components/elements/display/ChipPopper.d.ts +1 -1
  81. package/components/elements/display/ChipPopper.js +6 -5
  82. package/components/elements/display/Classification.js +1 -1
  83. package/components/elements/display/ClassificationChip.d.ts +14 -0
  84. package/components/elements/display/ClassificationChip.js +36 -0
  85. package/components/elements/display/HowlerCard.js +1 -1
  86. package/components/elements/display/HowlerCard.test.js +5 -9
  87. package/components/elements/display/ItemManager.js +2 -2
  88. package/components/elements/display/Modal.js +2 -0
  89. package/components/elements/display/QueryResultText.d.ts +1 -0
  90. package/components/elements/display/QueryResultText.js +2 -2
  91. package/components/elements/event/EventCard.d.ts +6 -0
  92. package/components/elements/event/EventCard.js +22 -0
  93. package/components/elements/event/EventPreview.d.ts +6 -0
  94. package/components/elements/event/EventPreview.js +12 -0
  95. package/components/elements/hit/HitActions.js +4 -4
  96. package/components/elements/hit/HitBanner.d.ts +1 -0
  97. package/components/elements/hit/HitBanner.js +31 -49
  98. package/components/elements/hit/HitCard.d.ts +4 -0
  99. package/components/elements/hit/HitCard.js +7 -7
  100. package/components/elements/hit/HitLabels.js +2 -2
  101. package/components/elements/hit/HitLabels.test.js +2 -2
  102. package/components/elements/hit/HitOutline.d.ts +1 -0
  103. package/components/elements/hit/HitOutline.js +3 -3
  104. package/components/elements/hit/{HitQuickSearch.d.ts → HitPreview.d.ts} +3 -3
  105. package/components/elements/hit/{HitQuickSearch.js → HitPreview.js} +10 -4
  106. package/components/elements/hit/HitSummary.d.ts +2 -1
  107. package/components/elements/hit/HitSummary.js +6 -5
  108. package/components/elements/hit/aggregate/HitGraph.js +8 -8
  109. package/components/elements/hit/elements/AnalyticLink.d.ts +9 -0
  110. package/components/elements/hit/elements/AnalyticLink.js +22 -0
  111. package/components/elements/hit/elements/{HitUsers.d.ts → Assigned.d.ts} +3 -4
  112. package/components/elements/hit/elements/Assigned.js +36 -0
  113. package/components/elements/hit/elements/Assigned.test.d.ts +1 -0
  114. package/components/elements/hit/elements/Assigned.test.js +65 -0
  115. package/components/elements/hit/grid/AddColumnModal.js +5 -4
  116. package/components/elements/hit/grid/EnhancedCell.d.ts +2 -1
  117. package/components/elements/hit/grid/EnhancedCell.js +2 -2
  118. package/components/elements/hit/grid/{HitRow.d.ts → RecordRow.d.ts} +3 -2
  119. package/components/elements/hit/grid/{HitRow.js → RecordRow.js} +11 -9
  120. package/components/elements/hit/grid/{HitTable.d.ts → RecordTable.d.ts} +5 -4
  121. package/components/elements/hit/grid/{HitTable.js → RecordTable.js} +13 -11
  122. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  123. package/components/elements/hit/related/RelatedRecords.js +63 -0
  124. package/components/elements/{hit/HitComments.d.ts → record/RecordComments.d.ts} +5 -4
  125. package/components/elements/{hit/HitComments.js → record/RecordComments.js} +29 -28
  126. package/components/elements/{hit/HitContextMenu.d.ts → record/RecordContextMenu.d.ts} +3 -3
  127. package/components/elements/record/RecordContextMenu.js +268 -0
  128. package/components/elements/record/RecordContextMenu.test.d.ts +1 -0
  129. package/components/elements/{hit/HitContextMenu.test.js → record/RecordContextMenu.test.js} +98 -43
  130. package/components/elements/record/RecordRelated.d.ts +7 -0
  131. package/components/elements/record/RecordRelated.js +34 -0
  132. package/components/elements/{hit/HitWorklog.d.ts → record/RecordWorklog.d.ts} +4 -3
  133. package/components/elements/{hit/HitWorklog.js → record/RecordWorklog.js} +15 -13
  134. package/components/elements/search/FuzzySearchBar.d.ts +7 -0
  135. package/components/elements/search/FuzzySearchBar.js +33 -0
  136. package/components/elements/search/FuzzySearchBar.test.d.ts +1 -0
  137. package/components/elements/search/FuzzySearchBar.test.js +87 -0
  138. package/components/elements/view/ViewTitle.d.ts +1 -0
  139. package/components/elements/view/ViewTitle.js +9 -2
  140. package/components/hooks/useHitActions.d.ts +1 -1
  141. package/components/hooks/useHitActions.js +4 -4
  142. package/components/hooks/useMyPreferences.js +10 -1
  143. package/components/hooks/useMySearch.js +2 -2
  144. package/components/hooks/useMySitemap.js +4 -1
  145. package/components/hooks/useMyTheme.js +9 -2
  146. package/components/hooks/{useHitSelection.d.ts → useRecordSelection.d.ts} +2 -2
  147. package/components/hooks/{useHitSelection.js → useRecordSelection.js} +12 -33
  148. package/components/hooks/useRelatedRecords.d.ts +13 -0
  149. package/components/hooks/useRelatedRecords.js +32 -0
  150. package/components/routes/action/edit/ActionEditor.js +2 -2
  151. package/components/routes/action/view/ActionSearch.js +1 -1
  152. package/components/routes/advanced/QueryBuilder.js +4 -27
  153. package/components/routes/advanced/QueryEditor.js +3 -3
  154. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  155. package/components/routes/analytics/AnalyticDetails.js +6 -54
  156. package/components/routes/analytics/AnalyticSearch.js +9 -18
  157. package/components/routes/cases/CaseViewer.d.ts +2 -0
  158. package/components/routes/cases/CaseViewer.js +44 -0
  159. package/components/routes/cases/CaseViewer.test.d.ts +1 -0
  160. package/components/routes/cases/CaseViewer.test.js +133 -0
  161. package/components/routes/cases/Cases.d.ts +2 -0
  162. package/components/routes/cases/Cases.js +140 -0
  163. package/components/routes/cases/constants.d.ts +6 -0
  164. package/components/routes/cases/constants.js +6 -0
  165. package/components/routes/cases/detail/AlertPanel.d.ts +6 -0
  166. package/components/routes/cases/detail/AlertPanel.js +33 -0
  167. package/components/routes/cases/detail/AlertPanel.test.d.ts +1 -0
  168. package/components/routes/cases/detail/AlertPanel.test.js +107 -0
  169. package/components/routes/cases/detail/CaseDashboard.d.ts +7 -0
  170. package/components/routes/cases/detail/CaseDashboard.js +66 -0
  171. package/components/routes/cases/detail/CaseDashboard.test.d.ts +1 -0
  172. package/components/routes/cases/detail/CaseDashboard.test.js +218 -0
  173. package/components/routes/cases/detail/CaseDetails.d.ts +6 -0
  174. package/components/routes/cases/detail/CaseDetails.js +79 -0
  175. package/components/routes/cases/detail/CaseDetails.test.d.ts +1 -0
  176. package/components/routes/cases/detail/CaseDetails.test.js +145 -0
  177. package/components/routes/cases/detail/CaseObservables.d.ts +6 -0
  178. package/components/routes/cases/detail/CaseObservables.js +142 -0
  179. package/components/routes/cases/detail/CaseObservables.test.d.ts +1 -0
  180. package/components/routes/cases/detail/CaseObservables.test.js +169 -0
  181. package/components/routes/cases/detail/CaseOverview.d.ts +7 -0
  182. package/components/routes/cases/detail/CaseOverview.js +43 -0
  183. package/components/routes/cases/detail/CaseRules.d.ts +7 -0
  184. package/components/routes/cases/detail/CaseRules.js +55 -0
  185. package/components/routes/cases/detail/CaseRules.test.d.ts +1 -0
  186. package/components/routes/cases/detail/CaseRules.test.js +238 -0
  187. package/components/routes/cases/detail/CaseSearch.d.ts +3 -0
  188. package/components/routes/cases/detail/CaseSearch.js +78 -0
  189. package/components/routes/cases/detail/CaseSearch.test.d.ts +1 -0
  190. package/components/routes/cases/detail/CaseSearch.test.js +154 -0
  191. package/components/routes/cases/detail/CaseSidebar.d.ts +8 -0
  192. package/components/routes/cases/detail/CaseSidebar.js +147 -0
  193. package/components/routes/cases/detail/CaseSidebar.test.d.ts +1 -0
  194. package/components/routes/cases/detail/CaseSidebar.test.js +155 -0
  195. package/components/routes/cases/detail/CaseTask.d.ts +14 -0
  196. package/components/routes/cases/detail/CaseTask.js +71 -0
  197. package/components/routes/cases/detail/CaseTask.test.d.ts +1 -0
  198. package/components/routes/cases/detail/CaseTask.test.js +143 -0
  199. package/components/routes/cases/detail/CaseTimeline.d.ts +12 -0
  200. package/components/routes/cases/detail/CaseTimeline.js +106 -0
  201. package/components/routes/cases/detail/CaseTimeline.test.d.ts +1 -0
  202. package/components/routes/cases/detail/CaseTimeline.test.js +320 -0
  203. package/components/routes/cases/detail/CreateRuleDialog.d.ts +9 -0
  204. package/components/routes/cases/detail/CreateRuleDialog.js +145 -0
  205. package/components/routes/cases/detail/CreateRuleDialog.test.d.ts +1 -0
  206. package/components/routes/cases/detail/CreateRuleDialog.test.js +284 -0
  207. package/components/routes/cases/detail/ItemPage.d.ts +6 -0
  208. package/components/routes/cases/detail/ItemPage.js +100 -0
  209. package/components/routes/cases/detail/ItemPage.test.d.ts +1 -0
  210. package/components/routes/cases/detail/ItemPage.test.js +238 -0
  211. package/components/routes/cases/detail/MarkdownPage.d.ts +8 -0
  212. package/components/routes/cases/detail/MarkdownPage.js +63 -0
  213. package/components/routes/cases/detail/MarkdownPage.test.d.ts +1 -0
  214. package/components/routes/cases/detail/MarkdownPage.test.js +116 -0
  215. package/components/routes/cases/detail/RelatedCasePanel.d.ts +6 -0
  216. package/components/routes/cases/detail/RelatedCasePanel.js +34 -0
  217. package/components/routes/cases/detail/RelatedCasePanel.test.d.ts +1 -0
  218. package/components/routes/cases/detail/RelatedCasePanel.test.js +115 -0
  219. package/components/routes/cases/detail/TaskPanel.d.ts +7 -0
  220. package/components/routes/cases/detail/TaskPanel.js +95 -0
  221. package/components/routes/cases/detail/TaskPanel.test.d.ts +1 -0
  222. package/components/routes/cases/detail/TaskPanel.test.js +145 -0
  223. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +11 -0
  224. package/components/routes/cases/detail/aggregates/CaseAggregate.js +24 -0
  225. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +6 -0
  226. package/components/routes/cases/detail/aggregates/SourceAggregate.js +26 -0
  227. package/components/routes/cases/detail/observables/Observable.d.ts +8 -0
  228. package/components/routes/cases/detail/observables/Observable.js +13 -0
  229. package/components/routes/cases/detail/observables/Observable.test.d.ts +1 -0
  230. package/components/routes/cases/detail/observables/Observable.test.js +72 -0
  231. package/components/routes/cases/detail/observables/ObservableTable.d.ts +7 -0
  232. package/components/routes/cases/detail/observables/ObservableTable.js +61 -0
  233. package/components/routes/cases/detail/observables/ObservableTable.test.d.ts +1 -0
  234. package/components/routes/cases/detail/observables/ObservableTable.test.js +85 -0
  235. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +22 -0
  236. package/components/routes/cases/detail/sidebar/CaseFolder.js +105 -0
  237. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +1 -0
  238. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +98 -0
  239. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +32 -0
  240. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +99 -0
  241. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +1 -0
  242. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +117 -0
  243. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +25 -0
  244. package/components/routes/cases/detail/sidebar/FolderEntry.js +89 -0
  245. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +1 -0
  246. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +81 -0
  247. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +5 -0
  248. package/components/routes/cases/detail/sidebar/RootDropZone.js +33 -0
  249. package/components/routes/cases/detail/sidebar/types.d.ts +9 -0
  250. package/components/routes/cases/detail/sidebar/utils.d.ts +10 -0
  251. package/components/routes/cases/detail/sidebar/utils.js +51 -0
  252. package/components/routes/cases/detail/sidebar/utils.test.d.ts +1 -0
  253. package/components/routes/cases/detail/sidebar/utils.test.js +82 -0
  254. package/components/routes/cases/detail/types.d.ts +24 -0
  255. package/components/routes/cases/detail/utils.d.ts +29 -0
  256. package/components/routes/cases/detail/utils.js +114 -0
  257. package/components/routes/cases/detail/utils.test.d.ts +1 -0
  258. package/components/routes/cases/detail/utils.test.js +144 -0
  259. package/components/routes/cases/hooks/useCase.d.ts +13 -0
  260. package/components/routes/cases/hooks/useCase.js +69 -0
  261. package/components/routes/cases/hooks/useCase.test.d.ts +1 -0
  262. package/components/routes/cases/hooks/useCase.test.js +141 -0
  263. package/components/routes/cases/modals/AddRecordToCaseModal.d.ts +7 -0
  264. package/components/routes/cases/modals/AddRecordToCaseModal.js +57 -0
  265. package/components/routes/cases/modals/AddRecordToCaseModal.test.d.ts +1 -0
  266. package/components/routes/cases/modals/AddRecordToCaseModal.test.js +309 -0
  267. package/components/routes/cases/modals/AddToCaseModal.d.ts +9 -0
  268. package/components/routes/cases/modals/AddToCaseModal.js +72 -0
  269. package/components/routes/cases/modals/CaseRecordRow.d.ts +9 -0
  270. package/components/routes/cases/modals/CaseRecordRow.js +14 -0
  271. package/components/routes/cases/modals/CreateCaseModal.d.ts +7 -0
  272. package/components/routes/cases/modals/CreateCaseModal.js +53 -0
  273. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +1 -0
  274. package/components/routes/cases/modals/CreateCaseModal.test.js +319 -0
  275. package/components/routes/cases/modals/RenameItemModal.d.ts +9 -0
  276. package/components/routes/cases/modals/RenameItemModal.js +44 -0
  277. package/components/routes/cases/modals/ResolveModal.d.ts +7 -0
  278. package/components/routes/cases/modals/ResolveModal.js +120 -0
  279. package/components/routes/cases/modals/ResolveModal.test.d.ts +1 -0
  280. package/components/routes/cases/modals/ResolveModal.test.js +520 -0
  281. package/components/routes/cases/modals/hooks.d.ts +7 -0
  282. package/components/routes/cases/modals/hooks.js +40 -0
  283. package/components/routes/cases/modals/types.d.ts +13 -0
  284. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +6 -0
  285. package/components/routes/cases/search/CaseAssigneeFilter.js +33 -0
  286. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +1 -0
  287. package/components/routes/cases/search/CaseAssigneeFilter.test.js +127 -0
  288. package/components/routes/cases/search/CaseDateFilter.d.ts +13 -0
  289. package/components/routes/cases/search/CaseDateFilter.js +26 -0
  290. package/components/routes/cases/search/CaseDateFilter.test.d.ts +1 -0
  291. package/components/routes/cases/search/CaseDateFilter.test.js +115 -0
  292. package/components/routes/cases/search/CaseStatusFilter.d.ts +6 -0
  293. package/components/routes/cases/search/CaseStatusFilter.js +13 -0
  294. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +1 -0
  295. package/components/routes/cases/search/CaseStatusFilter.test.js +86 -0
  296. package/components/routes/cases/utils.d.ts +3 -0
  297. package/components/routes/cases/utils.js +21 -0
  298. package/components/routes/dossiers/DossierEditor.js +2 -2
  299. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  300. package/components/routes/events/EventViewer.d.ts +7 -0
  301. package/components/routes/events/EventViewer.js +24 -0
  302. package/components/routes/help/ApiDocumentation.js +1 -1
  303. package/components/routes/help/HitBannerDocumentation.js +1 -0
  304. package/components/routes/help/HitDocumentation.js +1 -3
  305. package/components/routes/help/OverviewDocumentation.d.ts +1 -1
  306. package/components/routes/help/OverviewDocumentation.js +0 -1
  307. package/components/routes/hits/search/InformationPane.d.ts +1 -0
  308. package/components/routes/hits/search/InformationPane.js +51 -64
  309. package/components/routes/hits/search/QuerySettings.js +2 -1
  310. package/components/routes/hits/search/QuerySettings.test.js +14 -9
  311. package/components/routes/hits/search/{HitBrowser.js → RecordBrowser.js} +11 -11
  312. package/components/routes/hits/search/{HitQuery.d.ts → RecordQuery.d.ts} +2 -2
  313. package/components/routes/hits/search/{HitQuery.js → RecordQuery.js} +6 -6
  314. package/components/routes/hits/search/SearchPane.js +24 -46
  315. package/components/routes/hits/search/ViewLink.js +4 -4
  316. package/components/routes/hits/search/ViewLink.test.js +8 -9
  317. package/components/routes/hits/search/grid/RecordGrid.d.ts +3 -0
  318. package/components/routes/hits/search/grid/{HitGrid.js → RecordGrid.js} +15 -15
  319. package/components/routes/hits/search/shared/CustomSpan.test.js +3 -4
  320. package/components/routes/hits/search/shared/IndexPicker.d.ts +8 -0
  321. package/components/routes/hits/search/shared/IndexPicker.js +21 -0
  322. package/components/routes/hits/search/shared/LayoutSettings.js +3 -3
  323. package/components/routes/hits/search/shared/SearchActionMenu.js +3 -9
  324. package/components/routes/hits/view/HitViewer.js +13 -14
  325. package/components/routes/home/ViewCard.js +47 -41
  326. package/components/routes/overviews/OverviewViewer.js +4 -4
  327. package/components/routes/views/ViewComposer.js +49 -23
  328. package/locales/en/translation.json +171 -27
  329. package/locales/fr/translation.json +169 -25
  330. package/models/WithMetadata.d.ts +2 -1
  331. package/models/entities/generated/Analytic.d.ts +0 -3
  332. package/models/entities/generated/ApiType.d.ts +3 -1
  333. package/models/entities/generated/AttachmentsFile.d.ts +12 -0
  334. package/models/entities/generated/Case.d.ts +29 -0
  335. package/models/entities/generated/DestinationOriginal.d.ts +19 -0
  336. package/models/entities/generated/ECSEvent.d.ts +31 -0
  337. package/models/entities/generated/EmailAttachment.d.ts +8 -0
  338. package/models/entities/generated/EmailParent.d.ts +19 -0
  339. package/models/entities/generated/Enrichments.d.ts +7 -0
  340. package/models/entities/generated/EnrichmentsIndicator.d.ts +21 -0
  341. package/models/entities/generated/Event.d.ts +80 -26
  342. package/models/entities/generated/EventCloud.d.ts +20 -0
  343. package/models/entities/generated/EventDestination.d.ts +23 -0
  344. package/models/entities/generated/EventEmail.d.ts +30 -0
  345. package/models/entities/generated/EventFile.d.ts +36 -0
  346. package/models/entities/generated/EventHowler.d.ts +42 -0
  347. package/models/entities/generated/EventHttp.d.ts +11 -0
  348. package/models/entities/generated/EventObserver.d.ts +21 -0
  349. package/models/entities/generated/EventOrganization.d.ts +7 -0
  350. package/models/entities/generated/EventProcess.d.ts +34 -0
  351. package/models/entities/generated/EventSource.d.ts +23 -0
  352. package/models/entities/generated/EventThreat.d.ts +21 -0
  353. package/models/entities/generated/EventTls.d.ts +12 -0
  354. package/models/entities/generated/Hit.d.ts +3 -2
  355. package/models/entities/generated/Howler.d.ts +0 -5
  356. package/models/entities/generated/HttpResponse.d.ts +11 -0
  357. package/models/entities/generated/Item.d.ts +12 -0
  358. package/models/entities/generated/ObserverIngress.d.ts +9 -0
  359. package/models/entities/generated/Rule.d.ts +8 -9
  360. package/models/entities/generated/Task.d.ts +10 -0
  361. package/models/entities/generated/Threat.d.ts +2 -2
  362. package/models/entities/generated/{Enrichment.d.ts → ThreatEnrichment.d.ts} +1 -1
  363. package/models/entities/generated/View.d.ts +1 -0
  364. package/models/socket/CaseUpdate.d.ts +5 -0
  365. package/models/socket/ViewersUpdate.d.ts +4 -0
  366. package/package.json +115 -94
  367. package/plugins/clue/components/ClueTypography.js +2 -2
  368. package/plugins/clue/index.d.ts +1 -1
  369. package/plugins/clue/index.js +0 -1
  370. package/plugins/clue/utils.d.ts +2 -1
  371. package/tests/mocks.d.ts +11 -1
  372. package/tests/mocks.js +12 -7
  373. package/tests/server-handlers.js +11 -1
  374. package/tests/utils.d.ts +4 -0
  375. package/tests/utils.js +21 -0
  376. package/utils/classificationParser.d.ts +195 -0
  377. package/utils/classificationParser.js +680 -0
  378. package/utils/constants.d.ts +4 -3
  379. package/utils/constants.js +6 -0
  380. package/utils/recordFunctions.d.ts +3 -0
  381. package/utils/recordFunctions.js +8 -0
  382. package/utils/recordFunctions.test.d.ts +1 -0
  383. package/utils/{hitFunctions.test.js → recordFunctions.test.js} +1 -1
  384. package/utils/socketUtils.d.ts +14 -0
  385. package/utils/socketUtils.js +17 -1
  386. package/utils/socketUtils.test.js +49 -16
  387. package/utils/typeUtils.d.ts +7 -0
  388. package/utils/typeUtils.js +27 -0
  389. package/utils/viewUtils.js +3 -0
  390. package/api/analytic/rules.d.ts +0 -4
  391. package/api/analytic/rules.js +0 -8
  392. package/components/app/providers/HitProvider.d.ts +0 -22
  393. package/components/elements/display/icons/BundleButton.d.ts +0 -6
  394. package/components/elements/display/icons/BundleButton.js +0 -32
  395. package/components/elements/hit/HitContextMenu.js +0 -239
  396. package/components/elements/hit/HitRelated.d.ts +0 -6
  397. package/components/elements/hit/HitRelated.js +0 -7
  398. package/components/elements/hit/elements/HitUsers.js +0 -33
  399. package/components/routes/advanced/RuleModal.d.ts +0 -7
  400. package/components/routes/advanced/RuleModal.js +0 -83
  401. package/components/routes/analytics/RuleView.d.ts +0 -8
  402. package/components/routes/analytics/RuleView.js +0 -48
  403. package/components/routes/help/BundleDocumentation.d.ts +0 -3
  404. package/components/routes/help/BundleDocumentation.js +0 -12
  405. package/components/routes/help/markdown/en/bundles.md.js +0 -1
  406. package/components/routes/help/markdown/fr/bundles.md.js +0 -1
  407. package/components/routes/hits/search/BundleScroller.d.ts +0 -2
  408. package/components/routes/hits/search/BundleScroller.js +0 -6
  409. package/components/routes/hits/search/grid/HitGrid.d.ts +0 -3
  410. package/components/routes/hits/search/shared/BundleParentMenu.d.ts +0 -6
  411. package/components/routes/hits/search/shared/BundleParentMenu.js +0 -32
  412. package/utils/hitFunctions.d.ts +0 -2
  413. package/utils/hitFunctions.js +0 -8
  414. /package/{components/app/providers/HitSearchProvider.test.d.ts → api/socket/viewers.test.d.ts} +0 -0
  415. /package/components/{elements/hit/HitContextMenu.test.d.ts → app/providers/RecordSearchProvider.test.d.ts} +0 -0
  416. /package/{utils/hitFunctions.test.d.ts → components/app/providers/UserListProvider.test.d.ts} +0 -0
  417. /package/components/{routes/overviews/OverviewEditor.d.ts → elements/MarkdownEditor.d.ts} +0 -0
  418. /package/components/elements/hit/{HitDetails.d.ts → related/RelatedRecords.d.ts} +0 -0
  419. /package/components/routes/hits/search/{HitBrowser.d.ts → RecordBrowser.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { isEmpty, isEqual, isUndefined, omitBy, uniq } from 'lodash-es';
2
+ import { identity, isEmpty, isEqual, isUndefined, omitBy, uniq } from 'lodash-es';
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useLocation, useParams, useSearchParams } from 'react-router-dom';
5
5
  import { createContext, useContextSelector } from 'use-context-selector';
@@ -9,12 +9,10 @@ export const ParameterContext = createContext(null);
9
9
  const DEFAULT_VALUES = {
10
10
  query: DEFAULT_QUERY,
11
11
  sort: 'event.created desc',
12
- span: 'date.range.1.month'
12
+ span: 'date.range.1.month',
13
+ indexes: ['hit']
13
14
  };
14
- /**
15
- * Mapping of URL parameter keys to internal state keys
16
- * Note: 'filters' is handled separately due to multi-value support
17
- */
15
+ /** Scalar URL params that map 1:1 to a state key */
18
16
  const PARAM_MAPPINGS = [
19
17
  ['query', 'query'],
20
18
  ['sort', 'sort'],
@@ -22,6 +20,13 @@ const PARAM_MAPPINGS = [
22
20
  ['start_date', 'startDate'],
23
21
  ['end_date', 'endDate']
24
22
  ];
23
+ /** Multi-value URL params that map to array state keys */
24
+ const ARRAY_PARAMS = [
25
+ { urlKey: 'filter', stateKey: 'filters' },
26
+ { urlKey: 'view', stateKey: 'views' },
27
+ { urlKey: 'index', stateKey: 'indexes' }
28
+ ];
29
+ const ARRAY_URL_KEYS = new Set(ARRAY_PARAMS.map(p => p.urlKey));
25
30
  const WRITE_THROTTLER = new Throttler(100);
26
31
  /**
27
32
  * Helper function to convert a number/string representation of a number into a valid offset.
@@ -47,252 +52,132 @@ const getSelectedValue = (params, pathname, bundleId) => {
47
52
  return null;
48
53
  };
49
54
  /**
50
- * Context responsible for tracking updates to query operations in hit and view search.
55
+ * Returns stable add / remove / setAt / setAll / clear handlers for a list field in
56
+ * SearchValues. All returned functions are memoized; since _setValues (from useState)
57
+ * and key are both stable for the lifetime of the component, the deps array is empty.
51
58
  */
52
- const ParameterProvider = ({ children }) => {
53
- const location = useLocation();
54
- const routeParams = useParams();
55
- const [params, setParams] = useSearchParams();
56
- const pendingChanges = useRef({});
57
- const [values, _setValues] = useState({
58
- selected: getSelectedValue(params, location.pathname, routeParams.id),
59
- query: params.get('query') ?? DEFAULT_VALUES.query,
60
- sort: params.get('sort') ?? DEFAULT_VALUES.sort,
61
- span: params.get('span') ?? DEFAULT_VALUES.span,
62
- filters: params.getAll('filter'),
63
- views: params.getAll('view'),
64
- startDate: params.get('start_date'),
65
- endDate: params.get('end_date'),
66
- offset: parseOffset(params.get('offset')),
67
- trackTotalHits: (params.get('track_total_hits') ?? 'false') !== 'false'
68
- });
69
- // TODO: SELECTING A BUNDLE STILL CAUSES A FREAKOUT
70
- const set = useCallback(key => value => {
71
- if (key === 'filters') {
72
- // eslint-disable-next-line no-console
73
- console.error('Cannot use set() for filters. Use addFilter/removeFilter/clearFilters instead.');
74
- return;
75
- }
76
- if (key === 'views') {
77
- // eslint-disable-next-line no-console
78
- console.error('Cannot use set() for views. Use addView/removeView/clearViews instead.');
79
- return;
80
- }
81
- if (value === values[key]) {
82
- return;
83
- }
84
- if (key === 'selected') {
85
- pendingChanges.current.selected = value;
86
- }
87
- else {
88
- pendingChanges.current[key] = value ?? DEFAULT_VALUES[key] ?? null;
59
+ const useListHandlers = (key, _setValues) => {
60
+ const add = useCallback((item) => _setValues(c => ({ ...c, [key]: uniq([...c[key], item]) })),
61
+ // eslint-disable-next-line react-hooks/exhaustive-deps
62
+ []);
63
+ const remove = useCallback((item) => _setValues(c => {
64
+ const arr = c[key];
65
+ const i = arr.indexOf(item);
66
+ return i === -1 ? c : { ...c, [key]: arr.filter((_, idx) => idx !== i) };
67
+ }),
68
+ // eslint-disable-next-line react-hooks/exhaustive-deps
69
+ []);
70
+ const setAt = useCallback((pos, item) => _setValues(c => {
71
+ const arr = c[key];
72
+ if (pos < 0 || pos >= arr.length) {
73
+ return c;
89
74
  }
90
- if (key === 'span' && typeof value === 'string' && !value.endsWith('custom')) {
91
- pendingChanges.current.startDate = null;
92
- pendingChanges.current.endDate = null;
93
- }
94
- WRITE_THROTTLER.debounce(() => {
95
- _setValues(_current => ({ ..._current, ...pendingChanges.current }));
96
- pendingChanges.current = {};
97
- });
98
- }, [values]);
99
- const setOffset = useCallback(_offset => _setValues(_current => ({ ..._current, offset: parseOffset(_offset) })), []);
100
- const setCustomSpan = useCallback((startDate, endDate) => {
101
- _setValues(_values => ({
102
- ..._values,
103
- startDate,
104
- endDate
105
- }));
106
- }, []);
107
- /**
108
- * Filter manipulation
109
- */
110
- const addFilter = useCallback(filter => {
111
- _setValues(_current => ({
112
- ..._current,
113
- filters: uniq([..._current.filters, filter])
114
- }));
115
- }, []);
116
- const removeFilter = useCallback(filter => {
117
- _setValues(_current => {
118
- const index = _current.filters.indexOf(filter);
119
- if (index === -1) {
120
- return _current;
121
- }
122
- return {
123
- ..._current,
124
- filters: _current.filters.filter((_, i) => i !== index)
125
- };
126
- });
127
- }, []);
128
- const setFilter = useCallback((index, filter) => {
129
- _setValues(_current => {
130
- // Validate index
131
- if (index < 0 || index >= _current.filters.length) {
132
- return _current;
133
- }
134
- const newFilters = [..._current.filters];
135
- newFilters[index] = filter;
136
- return {
137
- ..._current,
138
- filters: newFilters
139
- };
140
- });
141
- }, []);
142
- const clearFilters = useCallback(() => {
143
- _setValues(_current => ({
144
- ..._current,
145
- filters: []
146
- }));
147
- }, []);
148
- /**
149
- * View manipulation
150
- */
151
- const addView = useCallback(view => {
152
- _setValues(_current => ({
153
- ..._current,
154
- views: uniq([..._current.views, view])
155
- }));
156
- }, []);
157
- const removeView = useCallback(view => {
158
- _setValues(_current => {
159
- const index = _current.views.indexOf(view);
160
- if (index === -1) {
161
- return _current;
162
- }
163
- return {
164
- ..._current,
165
- views: _current.views.filter((_, i) => i !== index)
166
- };
167
- });
168
- }, []);
169
- const setView = useCallback((index, view) => {
170
- _setValues(_current => {
171
- // Validate index
172
- if (index < 0 || index >= _current.views.length) {
173
- return _current;
174
- }
175
- const newViews = [..._current.views];
176
- newViews[index] = view;
177
- return {
178
- ..._current,
179
- views: newViews
180
- };
181
- });
182
- }, []);
183
- const clearViews = useCallback(() => {
184
- _setValues(_current => ({
185
- ..._current,
186
- views: []
187
- }));
188
- }, []);
189
- /**
190
- * Get URL parameter changes needed to sync internal state to the address bar.
191
- * Returns null values for params that should be removed from URL.
192
- */
75
+ const next = [...arr];
76
+ next[pos] = item;
77
+ return { ...c, [key]: next };
78
+ }),
79
+ // eslint-disable-next-line react-hooks/exhaustive-deps
80
+ []);
81
+ const setAll = useCallback((items) => _setValues(c => ({ ...c, [key]: uniq(items) })),
82
+ // eslint-disable-next-line react-hooks/exhaustive-deps
83
+ []);
84
+ const reset = useCallback((defaultValue = []) => _setValues(c => ({ ...c, [key]: defaultValue })),
85
+ // eslint-disable-next-line react-hooks/exhaustive-deps
86
+ []);
87
+ return { add, remove, setAt, setAll, reset };
88
+ };
89
+ /**
90
+ * Synchronizes SearchValues state with the URL search string, and vice-versa.
91
+ */
92
+ const useUrlSync = (values, defaults, _setValues, params, setParams, pathname, search, routeId) => {
193
93
  const getUrlFromState = useCallback(() => {
194
94
  const changes = {};
95
+ // Scalar params: write if changed from URL, remove if back to default
195
96
  PARAM_MAPPINGS.forEach(([urlKey, stateKey]) => {
196
97
  const stateValue = values[stateKey];
197
98
  const urlValue = params.get(urlKey);
198
- if (stateValue !== urlValue) {
199
- // If the value matches the default, remove it from URL (null signals removal)
200
- if (params.has(urlKey) && stateValue === DEFAULT_VALUES[stateKey]) {
201
- changes[urlKey] = null;
202
- }
203
- else if (stateValue !== DEFAULT_VALUES[stateKey]) {
204
- changes[urlKey] = stateValue;
205
- }
99
+ if (stateValue === urlValue) {
100
+ return;
101
+ }
102
+ if (params.has(urlKey) && stateValue === defaults[stateKey]) {
103
+ changes[urlKey] = null; // remove
104
+ }
105
+ else if (stateValue !== defaults[stateKey]) {
106
+ changes[urlKey] = stateValue; // write
206
107
  }
207
108
  });
208
- // Handle filters: compare arrays with isEqual
209
- const urlFilters = params.getAll('filter');
210
- if (!isEqual(values.filters, urlFilters)) {
211
- // Coerce empty array to null for removal signal
212
- changes.filters = values.filters.length === 0 ? null : values.filters;
213
- }
214
- // Handle views: compare arrays with isEqual
215
- const urlViews = params.getAll('view');
216
- if (!isEqual(values.views, urlViews)) {
217
- // Coerce empty array to null for removal signal
218
- changes.views = values.views.length === 0 ? null : values.views;
219
- }
220
- // Handle selected: remove if redundant in bundle context, otherwise set
221
- if (location.pathname.startsWith('/bundles') &&
222
- (!params.has('selected') || values.selected === params.get('selected'))) {
109
+ // Array params: skip when state equals default and URL is already empty
110
+ ARRAY_PARAMS.forEach(({ urlKey, stateKey }) => {
111
+ const stateArr = values[stateKey];
112
+ const urlArr = params.getAll(urlKey);
113
+ const defaultValue = stateKey === 'indexes' ? defaults.indexes : undefined;
114
+ if (isEqual(stateArr, urlArr)) {
115
+ return;
116
+ }
117
+ const isDefault = defaultValue ? isEqual(stateArr, defaultValue) : stateArr.length === 0;
118
+ if (!isDefault) {
119
+ changes[urlKey] = stateArr.length === 0 ? null : stateArr;
120
+ }
121
+ else if (urlArr.length > 0) {
122
+ changes[urlKey] = null; // state is default but URL isn't — remove
123
+ }
124
+ });
125
+ // selected
126
+ if (pathname.startsWith('/bundles') && (!params.has('selected') || values.selected === params.get('selected'))) {
223
127
  changes.selected = null;
224
128
  }
225
129
  else if (values.selected !== params.get('selected')) {
226
130
  changes.selected = values.selected;
227
131
  }
228
- // Handle offset: remove if 0, otherwise set
229
- const urlOffset = parseOffset(params.get('offset'));
230
- if (urlOffset !== values.offset) {
132
+ // offset: remove when 0
133
+ if (parseOffset(params.get('offset')) !== values.offset) {
231
134
  changes.offset = values.offset || null;
232
135
  }
233
- // Filter out values that already match the URL (skip 'filters', 'views' as they're handled above)
234
- return omitBy(changes, (val, key) => {
235
- if (['filters', 'views'].includes(key)) {
236
- return false;
237
- }
238
- return val == params.get(key);
239
- });
240
- }, [values, params, location.pathname]);
241
- /**
242
- * Get state changes needed to sync URL parameters to internal state.
243
- */
136
+ // Drop scalar entries that already match the URL
137
+ return omitBy(changes, (val, key) => !ARRAY_URL_KEYS.has(key) && val == params.get(key));
138
+ }, [values, defaults, params, pathname]);
244
139
  const getStateFromUrl = useCallback(() => {
245
140
  const changes = {};
141
+ // Scalar params: fall back to default when absent from URL
246
142
  PARAM_MAPPINGS.forEach(([urlKey, stateKey]) => {
247
- const urlValue = params.has(urlKey) ? params.get(urlKey) : (DEFAULT_VALUES[stateKey] ?? undefined);
143
+ const urlValue = params.has(urlKey) ? params.get(urlKey) : (defaults[stateKey] ?? undefined);
248
144
  if (urlValue !== values[stateKey]) {
249
145
  changes[stateKey] = urlValue;
250
146
  }
251
147
  });
252
- // Handle filters: compare arrays with isEqual
253
- const urlFilters = uniq(params.getAll('filter'));
254
- if (!isEqual(urlFilters, values.filters)) {
255
- changes.filters = urlFilters;
256
- }
257
- // Handle filters: compare arrays with isEqual
258
- const urlViews = uniq(params.getAll('view'));
259
- if (!isEqual(urlViews, values.views)) {
260
- changes.views = urlViews;
261
- }
262
- // Handle selected using helper
263
- const selectedValue = getSelectedValue(params, location.pathname, routeParams.id);
148
+ // Array params: fall back to their declared default when absent from URL
149
+ ARRAY_PARAMS.forEach(({ urlKey, stateKey }) => {
150
+ const raw = params.getAll(urlKey);
151
+ const defaultValue = stateKey === 'indexes' ? defaults.indexes : undefined;
152
+ const resolved = (isEmpty(raw) && defaultValue ? defaultValue : uniq(raw));
153
+ if (!isEqual(resolved, values[stateKey])) {
154
+ changes[stateKey] = resolved;
155
+ }
156
+ });
157
+ // selected
158
+ const selectedValue = getSelectedValue(params, pathname, routeId);
264
159
  if (selectedValue !== values.selected) {
265
160
  changes.selected = selectedValue;
266
161
  }
267
- // Handle offset
162
+ // offset
268
163
  const urlOffset = parseOffset(params.get('offset'));
269
164
  if (urlOffset !== values.offset) {
270
165
  changes.offset = urlOffset;
271
166
  }
272
- // Filter out undefined values and values that already match state
273
167
  return omitBy(omitBy(changes, isUndefined), (val, key) => val == values[key]);
274
- }, [values, params, location.pathname, routeParams.id]);
275
- /**
276
- * Effect to synchronize the context's state with the address bar
277
- */
168
+ }, [values, defaults, params, pathname, routeId]);
169
+ // State → URL
278
170
  useEffect(() => {
279
171
  const changes = getUrlFromState();
280
172
  if (isEmpty(changes)) {
281
173
  return;
282
174
  }
283
175
  setParams(_params => {
284
- // Build fresh URLSearchParams from existing params
285
176
  const newParams = new URLSearchParams(_params);
286
- // Handle standard params
287
177
  Object.entries(changes).forEach(([key, value]) => {
288
- if (['filters', 'views'].includes(key)) {
289
- const multiFieldKey = key.replace(/s$/, '');
290
- // Special handling for arrays
291
- newParams.delete(multiFieldKey);
292
- if (Array.isArray(value)) {
293
- value.forEach(val => newParams.append(multiFieldKey, val));
294
- }
295
- // null/undefined means remove (already deleted above)
178
+ if (Array.isArray(value)) {
179
+ newParams.delete(key);
180
+ value.forEach(val => newParams.append(key, val));
296
181
  }
297
182
  else if (value === null || value === undefined) {
298
183
  newParams.delete(key);
@@ -305,17 +190,64 @@ const ParameterProvider = ({ children }) => {
305
190
  }, { replace: !changes.query && !Object.keys(changes).includes('offset') });
306
191
  // eslint-disable-next-line react-hooks/exhaustive-deps
307
192
  }, [values]);
193
+ // URL → State
308
194
  useEffect(() => {
309
195
  const changes = getStateFromUrl();
310
196
  if (isEmpty(changes)) {
311
197
  return;
312
198
  }
313
- _setValues(_current => ({
314
- ..._current,
315
- ...changes
316
- }));
199
+ _setValues(c => ({ ...c, ...changes }));
317
200
  // eslint-disable-next-line react-hooks/exhaustive-deps
318
- }, [location.search, location.pathname, routeParams.id]);
201
+ }, [search, pathname, routeId]);
202
+ };
203
+ /**
204
+ * Context responsible for tracking updates to query operations in hit and view search.
205
+ */
206
+ const ParameterProvider = ({ children, defaults: _defaults = {} }) => {
207
+ const location = useLocation();
208
+ const routeParams = useParams();
209
+ const [params, setParams] = useSearchParams();
210
+ const defaults = useMemo(() => ({ ...DEFAULT_VALUES, ..._defaults }), [_defaults]);
211
+ const pendingChanges = useRef({});
212
+ const [values, _setValues] = useState({
213
+ selected: getSelectedValue(params, location.pathname, routeParams.id),
214
+ query: params.get('query') ?? defaults.query,
215
+ sort: params.get('sort') ?? defaults.sort,
216
+ span: params.get('span') ?? defaults.span,
217
+ indexes: params.has('index') ? uniq(params.getAll('index')).filter(identity) : defaults.indexes,
218
+ filters: params.getAll('filter'),
219
+ views: params.getAll('view'),
220
+ startDate: params.get('start_date'),
221
+ endDate: params.get('end_date'),
222
+ offset: parseOffset(params.get('offset')),
223
+ trackTotalHits: (params.get('track_total_hits') ?? 'false') !== 'false'
224
+ });
225
+ // TODO: SELECTING A BUNDLE STILL CAUSES A FREAKOUT
226
+ useUrlSync(values, defaults, _setValues, params, setParams, location.pathname, location.search, routeParams.id);
227
+ const set = useCallback((key) => (value) => {
228
+ if (value === values[key]) {
229
+ return;
230
+ }
231
+ if (key === 'selected') {
232
+ pendingChanges.current.selected = value;
233
+ }
234
+ else {
235
+ pendingChanges.current[key] = value ?? defaults[key] ?? null;
236
+ }
237
+ if (key === 'span' && typeof value === 'string' && !value.endsWith('custom')) {
238
+ pendingChanges.current.startDate = null;
239
+ pendingChanges.current.endDate = null;
240
+ }
241
+ WRITE_THROTTLER.debounce(() => {
242
+ _setValues(c => ({ ...c, ...pendingChanges.current }));
243
+ pendingChanges.current = {};
244
+ });
245
+ }, [values, defaults]);
246
+ const setOffset = useCallback((_offset) => _setValues(c => ({ ...c, offset: parseOffset(_offset) })), []);
247
+ const setCustomSpan = useCallback((startDate, endDate) => _setValues(c => ({ ...c, startDate, endDate })), []);
248
+ const filters = useListHandlers('filters', _setValues);
249
+ const indexes = useListHandlers('indexes', _setValues);
250
+ const views = useListHandlers('views', _setValues);
319
251
  return (_jsx(ParameterContext.Provider, { value: {
320
252
  ...values,
321
253
  setOffset,
@@ -324,14 +256,19 @@ const ParameterProvider = ({ children }) => {
324
256
  setQuery: useMemo(() => set('query'), [set]),
325
257
  setSort: useMemo(() => set('sort'), [set]),
326
258
  setSpan: useMemo(() => set('span'), [set]),
327
- addFilter,
328
- removeFilter,
329
- setFilter,
330
- clearFilters,
331
- addView,
332
- removeView,
333
- setView,
334
- clearViews
259
+ addFilter: filters.add,
260
+ removeFilter: filters.remove,
261
+ setFilter: filters.setAt,
262
+ resetFilters: filters.reset,
263
+ addIndex: indexes.add,
264
+ removeIndex: indexes.remove,
265
+ setIndex: indexes.setAt,
266
+ setIndexes: indexes.setAll,
267
+ resetIndexes: useCallback(() => indexes.reset(defaults.indexes), [indexes, defaults]),
268
+ addView: views.add,
269
+ removeView: views.remove,
270
+ setView: views.setAt,
271
+ resetViews: views.reset
335
272
  }, children: children }));
336
273
  };
337
274
  export const useParameterContextSelector = (selector) => {