@cccsaurora/howler-ui 2.18.0-dev.799 → 2.18.0-dev.822

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 (319) hide show
  1. package/api/index.d.ts +0 -4
  2. package/api/index.js +2 -10
  3. package/api/search/facet/hit.d.ts +3 -1
  4. package/api/search/facet/index.d.ts +1 -3
  5. package/api/search/index.d.ts +1 -2
  6. package/api/search/index.js +1 -2
  7. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  8. package/components/app/App.js +8 -36
  9. package/components/app/hooks/useMatchers.d.ts +1 -1
  10. package/components/app/hooks/useMatchers.js +11 -23
  11. package/components/app/hooks/useMatchers.test.js +22 -22
  12. package/components/app/hooks/useTitle.js +5 -5
  13. package/components/app/providers/FavouritesProvider.js +2 -2
  14. package/components/app/providers/HitProvider.d.ts +22 -0
  15. package/components/app/providers/{RecordProvider.js → HitProvider.js} +41 -41
  16. package/components/app/providers/{RecordSearchProvider.d.ts → HitSearchProvider.d.ts} +6 -6
  17. package/components/app/providers/{RecordSearchProvider.js → HitSearchProvider.js} +17 -12
  18. package/components/app/providers/{RecordSearchProvider.test.js → HitSearchProvider.test.js} +71 -52
  19. package/components/app/providers/ModalProvider.d.ts +0 -1
  20. package/components/app/providers/ParameterProvider.d.ts +2 -9
  21. package/components/app/providers/ParameterProvider.js +240 -165
  22. package/components/app/providers/ParameterProvider.test.js +94 -346
  23. package/components/app/providers/SocketProvider.d.ts +2 -11
  24. package/components/app/providers/SocketProvider.js +5 -18
  25. package/components/app/providers/UserListProvider.js +8 -28
  26. package/components/elements/PluginTypography.d.ts +1 -2
  27. package/components/elements/PluginTypography.js +2 -3
  28. package/components/elements/UserList.d.ts +2 -5
  29. package/components/elements/UserList.js +8 -18
  30. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  31. package/components/elements/display/ChipPopper.d.ts +1 -1
  32. package/components/elements/display/HowlerCard.js +1 -1
  33. package/components/elements/display/Modal.js +0 -2
  34. package/components/elements/display/icons/BundleButton.d.ts +6 -0
  35. package/components/elements/display/icons/BundleButton.js +32 -0
  36. package/components/elements/hit/HitActions.js +4 -4
  37. package/components/elements/hit/HitBanner.d.ts +0 -1
  38. package/components/elements/hit/HitBanner.js +49 -29
  39. package/components/elements/hit/HitCard.d.ts +0 -2
  40. package/components/elements/hit/HitCard.js +7 -7
  41. package/components/elements/{record/RecordComments.d.ts → hit/HitComments.d.ts} +4 -5
  42. package/components/elements/{record/RecordComments.js → hit/HitComments.js} +28 -29
  43. package/components/elements/{ObjectDetails.js → hit/HitDetails.js} +17 -17
  44. package/components/elements/hit/HitLabels.js +2 -2
  45. package/components/elements/hit/HitLinks.js +1 -1
  46. package/components/elements/hit/HitOutline.d.ts +0 -1
  47. package/components/elements/hit/HitOutline.js +3 -3
  48. package/components/elements/hit/{HitPreview.d.ts → HitQuickSearch.d.ts} +3 -3
  49. package/components/elements/hit/{HitPreview.js → HitQuickSearch.js} +4 -10
  50. package/components/elements/hit/HitRelated.d.ts +6 -0
  51. package/components/elements/hit/HitRelated.js +7 -0
  52. package/components/elements/hit/HitSummary.d.ts +1 -2
  53. package/components/elements/hit/HitSummary.js +5 -6
  54. package/components/elements/{record/RecordWorklog.d.ts → hit/HitWorklog.d.ts} +3 -4
  55. package/components/elements/{record/RecordWorklog.js → hit/HitWorklog.js} +13 -15
  56. package/components/elements/hit/aggregate/HitGraph.js +8 -8
  57. package/components/elements/hit/elements/Assigned.js +3 -6
  58. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  59. package/components/elements/view/ViewTitle.d.ts +0 -1
  60. package/components/elements/view/ViewTitle.js +2 -9
  61. package/components/hooks/useHitActions.d.ts +1 -1
  62. package/components/hooks/useHitActions.js +4 -4
  63. package/components/hooks/{useRecordSelection.d.ts → useHitSelection.d.ts} +2 -2
  64. package/components/hooks/{useRecordSelection.js → useHitSelection.js} +33 -12
  65. package/components/hooks/useMyPreferences.js +1 -10
  66. package/components/hooks/useMySearch.js +2 -2
  67. package/components/hooks/useMySitemap.js +1 -4
  68. package/components/hooks/useMyTheme.js +2 -9
  69. package/components/routes/action/edit/ActionEditor.js +2 -2
  70. package/components/routes/action/useMyActionFunctions.js +22 -4
  71. package/components/routes/action/view/ActionSearch.js +1 -1
  72. package/components/routes/advanced/QueryBuilder.js +1 -1
  73. package/components/routes/advanced/QueryEditor.js +3 -3
  74. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  75. package/components/routes/analytics/AnalyticDetails.js +2 -2
  76. package/components/routes/analytics/AnalyticSearch.js +1 -1
  77. package/components/routes/dossiers/DossierEditor.js +2 -2
  78. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  79. package/components/routes/help/ApiDocumentation.js +1 -1
  80. package/components/routes/help/BundleDocumentation.d.ts +3 -0
  81. package/components/routes/help/BundleDocumentation.js +12 -0
  82. package/components/routes/help/HitBannerDocumentation.js +0 -1
  83. package/components/routes/help/HitDocumentation.js +3 -1
  84. package/components/routes/help/markdown/en/bundles.md.js +1 -0
  85. package/components/routes/help/markdown/fr/bundles.md.js +1 -0
  86. package/components/routes/hits/search/BundleParentMenu.d.ts +6 -0
  87. package/components/routes/hits/search/BundleParentMenu.js +32 -0
  88. package/components/routes/hits/search/BundleScroller.d.ts +2 -0
  89. package/components/routes/hits/search/BundleScroller.js +6 -0
  90. package/components/routes/hits/search/{RecordBrowser.js → HitBrowser.js} +9 -9
  91. package/components/{elements/record/RecordContextMenu.d.ts → routes/hits/search/HitContextMenu.d.ts} +3 -3
  92. package/components/routes/hits/search/HitContextMenu.js +229 -0
  93. package/components/{elements/record/RecordContextMenu.test.js → routes/hits/search/HitContextMenu.test.js} +39 -94
  94. package/components/routes/hits/search/{RecordQuery.d.ts → HitQuery.d.ts} +2 -2
  95. package/components/routes/hits/search/{RecordQuery.js → HitQuery.js} +6 -6
  96. package/components/routes/hits/search/InformationPane.d.ts +0 -1
  97. package/components/routes/hits/search/InformationPane.js +63 -50
  98. package/components/routes/hits/search/LayoutSettings.js +3 -3
  99. package/components/routes/hits/search/QuerySettings.js +1 -2
  100. package/components/routes/hits/search/QuerySettings.test.js +9 -14
  101. package/components/routes/hits/search/SearchPane.js +49 -26
  102. package/components/routes/hits/search/ViewLink.js +3 -3
  103. package/components/routes/hits/search/ViewLink.test.js +8 -8
  104. package/components/routes/hits/search/grid/AddColumnModal.js +4 -5
  105. package/components/routes/hits/search/grid/EnhancedCell.d.ts +1 -2
  106. package/components/routes/hits/search/grid/EnhancedCell.js +2 -2
  107. package/components/routes/hits/search/grid/HitGrid.js +18 -20
  108. package/components/routes/hits/search/grid/{RecordRow.d.ts → HitRow.d.ts} +2 -3
  109. package/components/routes/hits/search/grid/{RecordRow.js → HitRow.js} +8 -10
  110. package/components/routes/hits/view/HitViewer.js +13 -12
  111. package/components/routes/home/ViewCard.js +41 -47
  112. package/components/{elements/MarkdownEditor.js → routes/overviews/OverviewEditor.js} +3 -3
  113. package/components/routes/overviews/OverviewViewer.js +2 -2
  114. package/components/routes/views/ViewComposer.js +19 -46
  115. package/locales/en/translation.json +5 -110
  116. package/locales/fr/translation.json +5 -108
  117. package/models/WithMetadata.d.ts +1 -2
  118. package/models/entities/generated/{ThreatEnrichment.d.ts → Enrichment.d.ts} +1 -1
  119. package/models/entities/generated/Hit.d.ts +0 -1
  120. package/models/entities/generated/Howler.d.ts +5 -0
  121. package/models/entities/generated/Rule.d.ts +10 -2
  122. package/models/entities/generated/Threat.d.ts +2 -2
  123. package/models/entities/generated/View.d.ts +0 -1
  124. package/package.json +6 -26
  125. package/plugins/clue/components/ClueTypography.js +2 -2
  126. package/plugins/clue/utils.d.ts +1 -2
  127. package/tests/mocks.d.ts +1 -11
  128. package/tests/mocks.js +7 -12
  129. package/tests/server-handlers.js +1 -6
  130. package/tests/utils.d.ts +0 -4
  131. package/tests/utils.js +0 -20
  132. package/utils/constants.d.ts +3 -4
  133. package/utils/constants.js +0 -6
  134. package/utils/hitFunctions.d.ts +1 -2
  135. package/utils/hitFunctions.js +4 -4
  136. package/utils/socketUtils.d.ts +0 -14
  137. package/utils/socketUtils.js +1 -17
  138. package/utils/viewUtils.js +0 -3
  139. package/api/search/case.d.ts +0 -4
  140. package/api/search/case.js +0 -8
  141. package/api/socket/index.d.ts +0 -3
  142. package/api/socket/index.js +0 -6
  143. package/api/socket/viewers.d.ts +0 -2
  144. package/api/socket/viewers.js +0 -8
  145. package/api/socket/viewers.test.js +0 -44
  146. package/api/v2/case/index.d.ts +0 -8
  147. package/api/v2/case/index.js +0 -20
  148. package/api/v2/case/items.d.ts +0 -6
  149. package/api/v2/case/items.js +0 -18
  150. package/api/v2/index.d.ts +0 -4
  151. package/api/v2/index.js +0 -6
  152. package/api/v2/search/facet.d.ts +0 -3
  153. package/api/v2/search/facet.js +0 -12
  154. package/api/v2/search/index.d.ts +0 -5
  155. package/api/v2/search/index.js +0 -24
  156. package/components/app/providers/RecordProvider.d.ts +0 -23
  157. package/components/elements/ContextMenu.d.ts +0 -56
  158. package/components/elements/ContextMenu.js +0 -109
  159. package/components/elements/ContextMenu.test.d.ts +0 -1
  160. package/components/elements/ContextMenu.test.js +0 -215
  161. package/components/elements/ObjectDetails.d.ts +0 -6
  162. package/components/elements/case/CaseCard.d.ts +0 -12
  163. package/components/elements/case/CaseCard.js +0 -42
  164. package/components/elements/case/CasePreview.d.ts +0 -6
  165. package/components/elements/case/CasePreview.js +0 -17
  166. package/components/elements/case/StatusIcon.d.ts +0 -5
  167. package/components/elements/case/StatusIcon.js +0 -13
  168. package/components/elements/hit/elements/AnalyticLink.d.ts +0 -9
  169. package/components/elements/hit/elements/AnalyticLink.js +0 -22
  170. package/components/elements/hit/elements/Assigned.test.d.ts +0 -1
  171. package/components/elements/hit/elements/Assigned.test.js +0 -65
  172. package/components/elements/hit/related/RelatedRecords.js +0 -63
  173. package/components/elements/observable/ObservableCard.d.ts +0 -6
  174. package/components/elements/observable/ObservableCard.js +0 -22
  175. package/components/elements/observable/ObservablePreview.d.ts +0 -6
  176. package/components/elements/observable/ObservablePreview.js +0 -12
  177. package/components/elements/record/RecordContextMenu.js +0 -256
  178. package/components/elements/record/RecordContextMenu.test.d.ts +0 -1
  179. package/components/elements/record/RecordRelated.d.ts +0 -7
  180. package/components/elements/record/RecordRelated.js +0 -34
  181. package/components/hooks/useRelatedRecords.d.ts +0 -13
  182. package/components/hooks/useRelatedRecords.js +0 -32
  183. package/components/routes/cases/CaseViewer.d.ts +0 -2
  184. package/components/routes/cases/CaseViewer.js +0 -44
  185. package/components/routes/cases/CaseViewer.test.d.ts +0 -1
  186. package/components/routes/cases/CaseViewer.test.js +0 -133
  187. package/components/routes/cases/Cases.d.ts +0 -2
  188. package/components/routes/cases/Cases.js +0 -148
  189. package/components/routes/cases/constants.d.ts +0 -6
  190. package/components/routes/cases/constants.js +0 -6
  191. package/components/routes/cases/detail/AlertPanel.d.ts +0 -6
  192. package/components/routes/cases/detail/AlertPanel.js +0 -33
  193. package/components/routes/cases/detail/CaseAssets.d.ts +0 -11
  194. package/components/routes/cases/detail/CaseAssets.js +0 -104
  195. package/components/routes/cases/detail/CaseAssets.test.d.ts +0 -1
  196. package/components/routes/cases/detail/CaseAssets.test.js +0 -167
  197. package/components/routes/cases/detail/CaseDashboard.d.ts +0 -7
  198. package/components/routes/cases/detail/CaseDashboard.js +0 -66
  199. package/components/routes/cases/detail/CaseDetails.d.ts +0 -6
  200. package/components/routes/cases/detail/CaseDetails.js +0 -70
  201. package/components/routes/cases/detail/CaseOverview.d.ts +0 -7
  202. package/components/routes/cases/detail/CaseOverview.js +0 -43
  203. package/components/routes/cases/detail/CaseSidebar.d.ts +0 -8
  204. package/components/routes/cases/detail/CaseSidebar.js +0 -107
  205. package/components/routes/cases/detail/CaseSidebar.test.d.ts +0 -1
  206. package/components/routes/cases/detail/CaseSidebar.test.js +0 -246
  207. package/components/routes/cases/detail/CaseTask.d.ts +0 -11
  208. package/components/routes/cases/detail/CaseTask.js +0 -66
  209. package/components/routes/cases/detail/CaseTimeline.d.ts +0 -12
  210. package/components/routes/cases/detail/CaseTimeline.js +0 -106
  211. package/components/routes/cases/detail/CaseTimeline.test.d.ts +0 -1
  212. package/components/routes/cases/detail/CaseTimeline.test.js +0 -320
  213. package/components/routes/cases/detail/ItemPage.d.ts +0 -6
  214. package/components/routes/cases/detail/ItemPage.js +0 -95
  215. package/components/routes/cases/detail/RelatedCasePanel.d.ts +0 -6
  216. package/components/routes/cases/detail/RelatedCasePanel.js +0 -34
  217. package/components/routes/cases/detail/TaskPanel.d.ts +0 -7
  218. package/components/routes/cases/detail/TaskPanel.js +0 -52
  219. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +0 -11
  220. package/components/routes/cases/detail/aggregates/CaseAggregate.js +0 -24
  221. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +0 -6
  222. package/components/routes/cases/detail/aggregates/SourceAggregate.js +0 -26
  223. package/components/routes/cases/detail/assets/Asset.d.ts +0 -14
  224. package/components/routes/cases/detail/assets/Asset.js +0 -12
  225. package/components/routes/cases/detail/assets/Asset.test.d.ts +0 -1
  226. package/components/routes/cases/detail/assets/Asset.test.js +0 -72
  227. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +0 -20
  228. package/components/routes/cases/detail/sidebar/CaseFolder.js +0 -83
  229. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +0 -1
  230. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +0 -295
  231. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +0 -34
  232. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +0 -103
  233. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +0 -1
  234. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +0 -363
  235. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +0 -25
  236. package/components/routes/cases/detail/sidebar/FolderEntry.js +0 -88
  237. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +0 -1
  238. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +0 -206
  239. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +0 -5
  240. package/components/routes/cases/detail/sidebar/RootDropZone.js +0 -33
  241. package/components/routes/cases/detail/sidebar/types.d.ts +0 -9
  242. package/components/routes/cases/detail/sidebar/utils.d.ts +0 -3
  243. package/components/routes/cases/detail/sidebar/utils.js +0 -29
  244. package/components/routes/cases/detail/sidebar/utils.test.d.ts +0 -1
  245. package/components/routes/cases/detail/sidebar/utils.test.js +0 -82
  246. package/components/routes/cases/hooks/useCase.d.ts +0 -13
  247. package/components/routes/cases/hooks/useCase.js +0 -69
  248. package/components/routes/cases/hooks/useCase.test.d.ts +0 -1
  249. package/components/routes/cases/hooks/useCase.test.js +0 -141
  250. package/components/routes/cases/modals/AddToCaseModal.d.ts +0 -7
  251. package/components/routes/cases/modals/AddToCaseModal.js +0 -59
  252. package/components/routes/cases/modals/AddToCaseModal.test.d.ts +0 -1
  253. package/components/routes/cases/modals/AddToCaseModal.test.js +0 -313
  254. package/components/routes/cases/modals/CaseRecordRow.d.ts +0 -9
  255. package/components/routes/cases/modals/CaseRecordRow.js +0 -15
  256. package/components/routes/cases/modals/CreateCaseModal.d.ts +0 -7
  257. package/components/routes/cases/modals/CreateCaseModal.js +0 -55
  258. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +0 -1
  259. package/components/routes/cases/modals/CreateCaseModal.test.js +0 -358
  260. package/components/routes/cases/modals/RenameItemModal.d.ts +0 -9
  261. package/components/routes/cases/modals/RenameItemModal.js +0 -48
  262. package/components/routes/cases/modals/ResolveModal.d.ts +0 -7
  263. package/components/routes/cases/modals/ResolveModal.js +0 -115
  264. package/components/routes/cases/modals/ResolveModal.test.d.ts +0 -1
  265. package/components/routes/cases/modals/ResolveModal.test.js +0 -384
  266. package/components/routes/cases/modals/hooks.d.ts +0 -7
  267. package/components/routes/cases/modals/hooks.js +0 -44
  268. package/components/routes/cases/modals/types.d.ts +0 -5
  269. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +0 -6
  270. package/components/routes/cases/search/CaseAssigneeFilter.js +0 -33
  271. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +0 -1
  272. package/components/routes/cases/search/CaseAssigneeFilter.test.js +0 -127
  273. package/components/routes/cases/search/CaseDateFilter.d.ts +0 -13
  274. package/components/routes/cases/search/CaseDateFilter.js +0 -26
  275. package/components/routes/cases/search/CaseDateFilter.test.d.ts +0 -1
  276. package/components/routes/cases/search/CaseDateFilter.test.js +0 -115
  277. package/components/routes/cases/search/CaseStatusFilter.d.ts +0 -6
  278. package/components/routes/cases/search/CaseStatusFilter.js +0 -13
  279. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +0 -1
  280. package/components/routes/cases/search/CaseStatusFilter.test.js +0 -86
  281. package/components/routes/hits/search/shared/IndexPicker.d.ts +0 -2
  282. package/components/routes/hits/search/shared/IndexPicker.js +0 -20
  283. package/components/routes/observables/ObservableViewer.d.ts +0 -7
  284. package/components/routes/observables/ObservableViewer.js +0 -27
  285. package/models/entities/generated/AttachmentsFile.d.ts +0 -12
  286. package/models/entities/generated/Case.d.ts +0 -28
  287. package/models/entities/generated/DestinationOriginal.d.ts +0 -19
  288. package/models/entities/generated/EmailAttachment.d.ts +0 -8
  289. package/models/entities/generated/EmailParent.d.ts +0 -19
  290. package/models/entities/generated/Enrichments.d.ts +0 -7
  291. package/models/entities/generated/EnrichmentsIndicator.d.ts +0 -21
  292. package/models/entities/generated/HttpResponse.d.ts +0 -11
  293. package/models/entities/generated/Item.d.ts +0 -9
  294. package/models/entities/generated/Observable.d.ts +0 -85
  295. package/models/entities/generated/ObservableCloud.d.ts +0 -20
  296. package/models/entities/generated/ObservableDestination.d.ts +0 -23
  297. package/models/entities/generated/ObservableEmail.d.ts +0 -30
  298. package/models/entities/generated/ObservableFile.d.ts +0 -36
  299. package/models/entities/generated/ObservableHowler.d.ts +0 -42
  300. package/models/entities/generated/ObservableHttp.d.ts +0 -11
  301. package/models/entities/generated/ObservableObserver.d.ts +0 -21
  302. package/models/entities/generated/ObservableOrganization.d.ts +0 -7
  303. package/models/entities/generated/ObservableProcess.d.ts +0 -34
  304. package/models/entities/generated/ObservableSource.d.ts +0 -23
  305. package/models/entities/generated/ObservableThreat.d.ts +0 -21
  306. package/models/entities/generated/ObservableTls.d.ts +0 -12
  307. package/models/entities/generated/ObserverIngress.d.ts +0 -9
  308. package/models/entities/generated/Task.d.ts +0 -10
  309. package/models/socket/CaseUpdate.d.ts +0 -5
  310. package/models/socket/ViewersUpdate.d.ts +0 -4
  311. package/utils/socketUtils.test.d.ts +0 -1
  312. package/utils/socketUtils.test.js +0 -59
  313. package/utils/typeUtils.d.ts +0 -7
  314. package/utils/typeUtils.js +0 -27
  315. /package/{api/socket/viewers.test.d.ts → components/app/providers/HitSearchProvider.test.d.ts} +0 -0
  316. /package/components/elements/hit/{related/RelatedRecords.d.ts → HitDetails.d.ts} +0 -0
  317. /package/components/routes/hits/search/{RecordBrowser.d.ts → HitBrowser.d.ts} +0 -0
  318. /package/components/{app/providers/RecordSearchProvider.test.d.ts → routes/hits/search/HitContextMenu.test.d.ts} +0 -0
  319. /package/components/{elements/MarkdownEditor.d.ts → routes/overviews/OverviewEditor.d.ts} +0 -0
@@ -5,25 +5,25 @@ import { uniq } from 'lodash-es';
5
5
  import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
6
6
  import { createContext, useContextSelector } from 'use-context-selector';
7
7
  import { SocketContext } from './SocketProvider';
8
- export const RecordContext = createContext(null);
8
+ export const HitContext = createContext(null);
9
9
  /**
10
10
  * Central repository for storing individual hit data across the application. Allows efficient retrieval of hits across componenents.
11
11
  */
12
- const RecordProvider = ({ children }) => {
12
+ const HitProvider = ({ children }) => {
13
13
  const { dispatchApi } = useMyApi();
14
14
  const { addListener, removeListener } = useContext(SocketContext);
15
15
  /**
16
16
  * The most immediate of two levels of caching, this ref stores the raw promises for each hit.
17
17
  * Rapidly updates, good for uses in-context where parallel updates my be occurring, i.e.
18
- * when two cards request the same hit that's missing from the store. Used in getRecord for this reason.
18
+ * when two cards request the same hit that's missing from the store. Used in getHit for this reason.
19
19
  */
20
- const recordRequests = useRef({});
20
+ const hitRequests = useRef({});
21
21
  /**
22
22
  * The "Authoritative" store of hits. Changes here will trigger rerenders, and essentially
23
23
  * caches the result of the above promises. Slower to update, so used outside of the hitcontext
24
24
  * where parallel requests aren't an issue.
25
25
  */
26
- const [records, setRecords] = useState({});
26
+ const [hits, setHits] = useState({});
27
27
  const [selectedHitIds, setSelectedHitIds] = useState([]);
28
28
  // The central location where we propagate any changes from hits made via websockets into the repository. We just save every update,
29
29
  // instead of caching it across many components inconsistently as before.
@@ -31,8 +31,8 @@ const RecordProvider = ({ children }) => {
31
31
  if (data.hit) {
32
32
  // eslint-disable-next-line no-console
33
33
  console.debug('Received websocket update for hit', data.hit.howler.id);
34
- recordRequests.current[data.hit.howler.id] = Promise.resolve(data.hit);
35
- setRecords(_hits => ({
34
+ hitRequests.current[data.hit.howler.id] = Promise.resolve(data.hit);
35
+ setHits(_hits => ({
36
36
  ..._hits,
37
37
  [data.hit.howler.id]: {
38
38
  ..._hits[data.hit.howler.id],
@@ -46,68 +46,68 @@ const RecordProvider = ({ children }) => {
46
46
  return () => removeListener('hits');
47
47
  }, [addListener, handler, removeListener]);
48
48
  /**
49
- * A method to retrieve a record from the context. It first checks the hit state,
49
+ * A method to retrieve a hit from the context. It first checks the hit state,
50
50
  * then checks for ongoing requests, then finally executes a new request if necessary.
51
51
  */
52
- const getRecord = useCallback(async (id, force = false) => {
53
- if (!recordRequests.current[id] || force) {
54
- recordRequests.current[id] = dispatchApi(api.hit.get(id, ['template', 'dossiers', 'analytic', 'overview']));
55
- const newRecord = await recordRequests.current[id];
56
- setRecords(_records => ({ ..._records, [id]: newRecord }));
52
+ const getHit = useCallback(async (id, force = false) => {
53
+ if (!hitRequests.current[id] || force) {
54
+ hitRequests.current[id] = dispatchApi(api.hit.get(id, ['template', 'dossiers', 'analytic', 'overview']));
55
+ const newHit = await hitRequests.current[id];
56
+ setHits(_hits => ({ ..._hits, [id]: newHit }));
57
57
  }
58
- return recordRequests.current[id];
58
+ return hitRequests.current[id];
59
59
  }, [dispatchApi]);
60
60
  /**
61
61
  * Update a hit in the context locally
62
62
  */
63
- const updateRecord = useCallback((newHit) => {
64
- recordRequests.current[newHit.howler.id] = Promise.resolve(newHit);
65
- setRecords(_hits => ({ ..._hits, [newHit.howler.id]: newHit }));
63
+ const updateHit = useCallback((newHit) => {
64
+ hitRequests.current[newHit.howler.id] = Promise.resolve(newHit);
65
+ setHits(_hits => ({ ..._hits, [newHit.howler.id]: newHit }));
66
66
  }, []);
67
67
  /**
68
68
  * Add a large number of hits to the cache. Used for results of searches.
69
69
  */
70
- const loadRecords = useCallback((newHits) => {
70
+ const loadHits = useCallback((newHits) => {
71
71
  const mappedHits = newHits.map(hit => [hit.howler.id, hit]);
72
72
  mappedHits.forEach(([id, hit]) => {
73
- recordRequests.current[id] = Promise.resolve(hit);
73
+ hitRequests.current[id] = Promise.resolve(hit);
74
74
  });
75
- setRecords(_hits => ({ ..._hits, ...Object.fromEntries(mappedHits) }));
75
+ setHits(_hits => ({ ..._hits, ...Object.fromEntries(mappedHits) }));
76
76
  }, []);
77
- const addRecordToSelection = useCallback((id) => {
77
+ const addHitToSelection = useCallback((id) => {
78
78
  setSelectedHitIds(_selected => uniq([..._selected, id]));
79
79
  }, []);
80
- const removeRecordFromSelection = useCallback((id) => {
80
+ const removeHitFromSelection = useCallback((id) => {
81
81
  setSelectedHitIds(_selected => _selected.filter(_id => _id !== id));
82
82
  }, []);
83
- const clearSelectedRecords = useCallback((except) => {
83
+ const clearSelectedHits = useCallback((except) => {
84
84
  setSelectedHitIds(!!except ? [except] : []);
85
85
  }, []);
86
- const selectedRecords = useMemo(() => selectedHitIds.map(id => records[id]).filter(hit => !!hit), [records, selectedHitIds]);
86
+ const selectedHits = useMemo(() => selectedHitIds.map(id => hits[id]).filter(hit => !!hit), [hits, selectedHitIds]);
87
87
  useEffect(() => {
88
88
  selectedHitIds.forEach(id => {
89
- if (!recordRequests.current[id]) {
90
- getRecord(id);
89
+ if (!hitRequests.current[id]) {
90
+ getHit(id);
91
91
  }
92
92
  });
93
- }, [getRecord, selectedHitIds]);
93
+ }, [getHit, selectedHitIds]);
94
94
  useEffect(() => {
95
- Object.entries(records).forEach(([id, hit]) => {
96
- recordRequests.current[id] = Promise.resolve(hit);
95
+ Object.entries(hits).forEach(([id, hit]) => {
96
+ hitRequests.current[id] = Promise.resolve(hit);
97
97
  });
98
- }, [records]);
99
- return (_jsx(RecordContext.Provider, { value: {
100
- records,
101
- getRecord,
102
- updateRecord,
103
- selectedRecords,
104
- addRecordToSelection,
105
- removeRecordFromSelection,
106
- clearSelectedRecords,
107
- loadRecords
98
+ }, [hits]);
99
+ return (_jsx(HitContext.Provider, { value: {
100
+ hits,
101
+ getHit,
102
+ updateHit,
103
+ selectedHits,
104
+ addHitToSelection,
105
+ removeHitFromSelection,
106
+ clearSelectedHits,
107
+ loadHits
108
108
  }, children: children }));
109
109
  };
110
110
  export const useHitContextSelector = (selector) => {
111
- return useContextSelector(RecordContext, selector);
111
+ return useContextSelector(HitContext, selector);
112
112
  };
113
- export default RecordProvider;
113
+ export default HitProvider;
@@ -1,17 +1,17 @@
1
1
  import type { HowlerSearchResponse } from '@cccsaurora/howler-ui/api/search';
2
2
  import { useMyLocalStorageItem } from '@cccsaurora/howler-ui/components/hooks/useMyLocalStorage';
3
3
  import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
4
- import type { Observable } from '@cccsaurora/howler-ui/models/entities/generated/Observable';
5
4
  import type { WithMetadata } from '@cccsaurora/howler-ui/models/WithMetadata';
6
5
  import { type Dispatch, type FC, type PropsWithChildren, type SetStateAction } from 'react';
7
6
  export interface QueryEntry {
8
7
  [query: string]: string;
9
8
  }
10
- export interface RecordSearchContextType {
9
+ export interface HitSearchContextType {
11
10
  displayType: 'list' | 'grid';
12
11
  searching: boolean;
13
12
  error: string | null;
14
- response: HowlerSearchResponse<WithMetadata<Hit | Observable>> | null;
13
+ response: HowlerSearchResponse<WithMetadata<Hit>> | null;
14
+ bundleId: string | null;
15
15
  fzfSearch: boolean;
16
16
  setDisplayType: (type: 'list' | 'grid') => void;
17
17
  setFzfSearch: Dispatch<SetStateAction<boolean>>;
@@ -20,6 +20,6 @@ export interface RecordSearchContextType {
20
20
  queryHistory: QueryEntry;
21
21
  setQueryHistory: ReturnType<typeof useMyLocalStorageItem>[1];
22
22
  }
23
- export declare const RecordSearchContext: import("use-context-selector").Context<RecordSearchContextType>;
24
- declare const RecordSearchProvider: FC<PropsWithChildren>;
25
- export default RecordSearchProvider;
23
+ export declare const HitSearchContext: import("use-context-selector").Context<HitSearchContextType>;
24
+ declare const HitSearchProvider: FC<PropsWithChildren>;
25
+ export default HitSearchProvider;
@@ -13,12 +13,12 @@ import { createContext, useContextSelector } from 'use-context-selector';
13
13
  import { DEFAULT_QUERY, StorageKey } from '@cccsaurora/howler-ui/utils/constants';
14
14
  import Throttler from '@cccsaurora/howler-ui/utils/Throttler';
15
15
  import { convertCustomDateRangeToLucene, convertDateToLucene } from '@cccsaurora/howler-ui/utils/utils';
16
+ import { HitContext } from './HitProvider';
16
17
  import { ParameterContext } from './ParameterProvider';
17
- import { RecordContext } from './RecordProvider';
18
18
  import { ViewContext } from './ViewProvider';
19
- export const RecordSearchContext = createContext(null);
19
+ export const HitSearchContext = createContext(null);
20
20
  const THROTTLER = new Throttler(500);
21
- const RecordSearchProvider = ({ children }) => {
21
+ const HitSearchProvider = ({ children }) => {
22
22
  const { get } = useMyLocalStorage();
23
23
  const routeParams = useParams();
24
24
  const location = useLocation();
@@ -33,13 +33,12 @@ const RecordSearchProvider = ({ children }) => {
33
33
  const trackTotalHits = useContextSelector(ParameterContext, ctx => ctx.trackTotalHits);
34
34
  const sort = useContextSelector(ParameterContext, ctx => ctx.sort);
35
35
  const span = useContextSelector(ParameterContext, ctx => ctx.span);
36
- const indexes = useContextSelector(ParameterContext, ctx => ctx.indexes);
37
36
  const allFilters = useContextSelector(ParameterContext, ctx => ctx.filters);
38
37
  const startDate = useContextSelector(ParameterContext, ctx => ctx.startDate);
39
38
  const endDate = useContextSelector(ParameterContext, ctx => ctx.endDate);
40
39
  const views = useContextSelector(ParameterContext, ctx => ctx.views);
41
40
  const addView = useContextSelector(ParameterContext, ctx => ctx.addView);
42
- const loadHits = useContextSelector(RecordContext, ctx => ctx.loadRecords);
41
+ const loadHits = useContextSelector(HitContext, ctx => ctx.loadHits);
43
42
  const [displayType, setDisplayType] = useState(get(StorageKey.DISPLAY_TYPE) ?? 'list');
44
43
  const [searching, setSearching] = useState(false);
45
44
  const [error, setError] = useState(null);
@@ -48,6 +47,7 @@ const RecordSearchProvider = ({ children }) => {
48
47
  'howler.id: *': new Date().toISOString()
49
48
  });
50
49
  const [fzfSearch, setFzfSearch] = useState(false);
50
+ const bundleId = useMemo(() => (location.pathname.startsWith('/bundles') ? routeParams.id : null), [location.pathname, routeParams.id]);
51
51
  const filters = useMemo(() => allFilters.filter(filter => !filter.endsWith('*')), [allFilters]);
52
52
  // On load check to filter out any queries older than one month
53
53
  useEffect(() => {
@@ -70,6 +70,11 @@ const RecordSearchProvider = ({ children }) => {
70
70
  else if (startDate && endDate) {
71
71
  _filters.push(`event.created:${convertCustomDateRangeToLucene(startDate, endDate)}`);
72
72
  }
73
+ // Add bundle filter
74
+ const bundle = location.pathname.startsWith('/bundles') && routeParams.id;
75
+ if (bundle) {
76
+ _filters.push(`howler.bundles:${bundle}`);
77
+ }
73
78
  // Fetch all view queries
74
79
  if (views.length > 0) {
75
80
  const viewObjects = await getCurrentViews({ views });
@@ -80,7 +85,7 @@ const RecordSearchProvider = ({ children }) => {
80
85
  .forEach(viewQuery => _filters.push(viewQuery));
81
86
  }
82
87
  return _filters;
83
- }, [endDate, filters, getCurrentViews, span, startDate, views]);
88
+ }, [endDate, filters, getCurrentViews, location.pathname, routeParams.id, span, startDate, views]);
84
89
  const search = useCallback(async (_query, appendResults) => {
85
90
  THROTTLER.debounce(async () => {
86
91
  if (_query === 'woof!') {
@@ -100,7 +105,7 @@ const RecordSearchProvider = ({ children }) => {
100
105
  setSearching(true);
101
106
  setError(null);
102
107
  try {
103
- const _response = await dispatchApi(api.v2.search.post(indexes, {
108
+ const _response = await dispatchApi(api.search.hit.post({
104
109
  offset: appendResults && response ? response.rows : offset,
105
110
  rows: pageCount,
106
111
  query: _query || DEFAULT_QUERY,
@@ -144,7 +149,6 @@ const RecordSearchProvider = ({ children }) => {
144
149
  startDate,
145
150
  endDate,
146
151
  filters,
147
- indexes,
148
152
  setQuery,
149
153
  location.pathname,
150
154
  routeParams.id,
@@ -163,15 +167,15 @@ const RecordSearchProvider = ({ children }) => {
163
167
  if (span?.endsWith('custom') && (!startDate || !endDate)) {
164
168
  return;
165
169
  }
166
- if (views.length > 0 || (query && query !== DEFAULT_QUERY) || offset > 0 || filters.length > 0) {
170
+ if (views.length > 0 || bundleId || (query && query !== DEFAULT_QUERY) || offset > 0 || filters.length > 0) {
167
171
  search(query);
168
172
  }
169
173
  else {
170
174
  setResponse(null);
171
175
  }
172
176
  // eslint-disable-next-line react-hooks/exhaustive-deps
173
- }, [offset, pageCount, sort, span, indexes, location.pathname, startDate, endDate, filters, query, views]);
174
- return (_jsx(RecordSearchContext.Provider, { value: {
177
+ }, [offset, pageCount, sort, span, bundleId, location.pathname, startDate, endDate, filters, query, views]);
178
+ return (_jsx(HitSearchContext.Provider, { value: {
175
179
  displayType,
176
180
  setDisplayType,
177
181
  search,
@@ -179,10 +183,11 @@ const RecordSearchProvider = ({ children }) => {
179
183
  getFilters,
180
184
  error,
181
185
  response,
186
+ bundleId,
182
187
  setQueryHistory,
183
188
  queryHistory,
184
189
  fzfSearch,
185
190
  setFzfSearch
186
191
  }, children: children }));
187
192
  };
188
- export default RecordSearchProvider;
193
+ export default HitSearchProvider;