@cccsaurora/howler-ui 2.18.0-dev.766 → 2.18.0-dev.771

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 (297) hide show
  1. package/api/index.d.ts +0 -2
  2. package/api/index.js +2 -4
  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 +3 -3
  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/UserListProvider.js +8 -28
  24. package/components/elements/PluginTypography.d.ts +1 -2
  25. package/components/elements/PluginTypography.js +2 -3
  26. package/components/elements/UserList.d.ts +2 -5
  27. package/components/elements/UserList.js +8 -18
  28. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  29. package/components/elements/display/ChipPopper.d.ts +1 -1
  30. package/components/elements/display/HowlerCard.js +1 -1
  31. package/components/elements/display/Modal.js +0 -2
  32. package/components/elements/display/icons/BundleButton.d.ts +6 -0
  33. package/components/elements/display/icons/BundleButton.js +32 -0
  34. package/components/elements/hit/HitActions.js +4 -4
  35. package/components/elements/hit/HitBanner.d.ts +0 -1
  36. package/components/elements/hit/HitBanner.js +49 -29
  37. package/components/elements/hit/HitCard.d.ts +0 -2
  38. package/components/elements/hit/HitCard.js +7 -7
  39. package/components/elements/{record/RecordComments.d.ts → hit/HitComments.d.ts} +4 -5
  40. package/components/elements/{record/RecordComments.js → hit/HitComments.js} +28 -29
  41. package/components/elements/{ObjectDetails.js → hit/HitDetails.js} +17 -17
  42. package/components/elements/hit/HitLabels.js +2 -2
  43. package/components/elements/hit/HitLinks.js +1 -1
  44. package/components/elements/hit/HitOutline.d.ts +0 -1
  45. package/components/elements/hit/HitOutline.js +3 -3
  46. package/components/elements/hit/{HitPreview.d.ts → HitQuickSearch.d.ts} +3 -3
  47. package/components/elements/hit/{HitPreview.js → HitQuickSearch.js} +4 -10
  48. package/components/elements/hit/HitRelated.d.ts +6 -0
  49. package/components/elements/hit/HitRelated.js +7 -0
  50. package/components/elements/hit/HitSummary.d.ts +1 -2
  51. package/components/elements/hit/HitSummary.js +5 -6
  52. package/components/elements/{record/RecordWorklog.d.ts → hit/HitWorklog.d.ts} +3 -4
  53. package/components/elements/{record/RecordWorklog.js → hit/HitWorklog.js} +13 -15
  54. package/components/elements/hit/aggregate/HitGraph.js +8 -8
  55. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  56. package/components/elements/view/ViewTitle.d.ts +0 -1
  57. package/components/elements/view/ViewTitle.js +2 -9
  58. package/components/hooks/useHitActions.d.ts +1 -1
  59. package/components/hooks/useHitActions.js +4 -4
  60. package/components/hooks/{useRecordSelection.d.ts → useHitSelection.d.ts} +2 -2
  61. package/components/hooks/{useRecordSelection.js → useHitSelection.js} +33 -12
  62. package/components/hooks/useMyPreferences.js +1 -10
  63. package/components/hooks/useMySearch.js +2 -2
  64. package/components/hooks/useMySitemap.js +1 -4
  65. package/components/hooks/useMyTheme.js +2 -9
  66. package/components/routes/action/edit/ActionEditor.js +2 -2
  67. package/components/routes/action/view/ActionSearch.js +1 -1
  68. package/components/routes/advanced/QueryBuilder.js +1 -1
  69. package/components/routes/advanced/QueryEditor.js +3 -3
  70. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  71. package/components/routes/analytics/AnalyticDetails.js +2 -2
  72. package/components/routes/analytics/AnalyticSearch.js +1 -1
  73. package/components/routes/dossiers/DossierEditor.js +2 -2
  74. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  75. package/components/routes/help/ApiDocumentation.js +1 -1
  76. package/components/routes/help/BundleDocumentation.d.ts +3 -0
  77. package/components/routes/help/BundleDocumentation.js +12 -0
  78. package/components/routes/help/HitBannerDocumentation.js +0 -1
  79. package/components/routes/help/HitDocumentation.js +3 -1
  80. package/components/routes/help/markdown/en/bundles.md.js +1 -0
  81. package/components/routes/help/markdown/fr/bundles.md.js +1 -0
  82. package/components/routes/hits/search/BundleParentMenu.d.ts +6 -0
  83. package/components/routes/hits/search/BundleParentMenu.js +32 -0
  84. package/components/routes/hits/search/BundleScroller.d.ts +2 -0
  85. package/components/routes/hits/search/BundleScroller.js +6 -0
  86. package/components/routes/hits/search/{RecordBrowser.js → HitBrowser.js} +9 -9
  87. package/components/{elements/record/RecordContextMenu.d.ts → routes/hits/search/HitContextMenu.d.ts} +3 -3
  88. package/components/routes/hits/search/HitContextMenu.js +227 -0
  89. package/components/{elements/record/RecordContextMenu.test.js → routes/hits/search/HitContextMenu.test.js} +39 -94
  90. package/components/routes/hits/search/{RecordQuery.d.ts → HitQuery.d.ts} +2 -2
  91. package/components/routes/hits/search/{RecordQuery.js → HitQuery.js} +6 -6
  92. package/components/routes/hits/search/InformationPane.d.ts +0 -1
  93. package/components/routes/hits/search/InformationPane.js +60 -47
  94. package/components/routes/hits/search/LayoutSettings.js +3 -3
  95. package/components/routes/hits/search/QuerySettings.js +1 -2
  96. package/components/routes/hits/search/QuerySettings.test.js +9 -14
  97. package/components/routes/hits/search/SearchPane.js +49 -26
  98. package/components/routes/hits/search/ViewLink.js +3 -3
  99. package/components/routes/hits/search/ViewLink.test.js +8 -8
  100. package/components/routes/hits/search/grid/AddColumnModal.js +4 -5
  101. package/components/routes/hits/search/grid/EnhancedCell.d.ts +1 -2
  102. package/components/routes/hits/search/grid/EnhancedCell.js +2 -2
  103. package/components/routes/hits/search/grid/HitGrid.js +18 -20
  104. package/components/routes/hits/search/grid/{RecordRow.d.ts → HitRow.d.ts} +2 -3
  105. package/components/routes/hits/search/grid/{RecordRow.js → HitRow.js} +8 -10
  106. package/components/routes/hits/view/HitViewer.js +13 -12
  107. package/components/routes/home/ViewCard.js +41 -47
  108. package/components/{elements/MarkdownEditor.js → routes/overviews/OverviewEditor.js} +3 -3
  109. package/components/routes/overviews/OverviewViewer.js +2 -2
  110. package/components/routes/views/ViewComposer.js +19 -46
  111. package/locales/en/translation.json +3 -109
  112. package/locales/fr/translation.json +3 -107
  113. package/models/WithMetadata.d.ts +1 -2
  114. package/models/entities/generated/{ThreatEnrichment.d.ts → Enrichment.d.ts} +1 -1
  115. package/models/entities/generated/Hit.d.ts +0 -1
  116. package/models/entities/generated/Howler.d.ts +4 -0
  117. package/models/entities/generated/Rule.d.ts +10 -2
  118. package/models/entities/generated/Threat.d.ts +2 -2
  119. package/models/entities/generated/View.d.ts +0 -1
  120. package/package.json +3 -21
  121. package/plugins/clue/components/ClueTypography.js +2 -2
  122. package/plugins/clue/utils.d.ts +1 -2
  123. package/tests/mocks.d.ts +1 -11
  124. package/tests/mocks.js +7 -12
  125. package/tests/server-handlers.js +1 -6
  126. package/tests/utils.d.ts +0 -4
  127. package/tests/utils.js +0 -20
  128. package/utils/constants.d.ts +3 -4
  129. package/utils/constants.js +0 -6
  130. package/utils/hitFunctions.d.ts +1 -2
  131. package/utils/hitFunctions.js +4 -4
  132. package/utils/viewUtils.js +0 -3
  133. package/api/search/case.d.ts +0 -4
  134. package/api/search/case.js +0 -8
  135. package/api/v2/case/index.d.ts +0 -8
  136. package/api/v2/case/index.js +0 -20
  137. package/api/v2/case/items.d.ts +0 -6
  138. package/api/v2/case/items.js +0 -18
  139. package/api/v2/index.d.ts +0 -4
  140. package/api/v2/index.js +0 -6
  141. package/api/v2/search/facet.d.ts +0 -3
  142. package/api/v2/search/facet.js +0 -12
  143. package/api/v2/search/index.d.ts +0 -5
  144. package/api/v2/search/index.js +0 -24
  145. package/components/app/providers/RecordProvider.d.ts +0 -23
  146. package/components/elements/ContextMenu.d.ts +0 -56
  147. package/components/elements/ContextMenu.js +0 -109
  148. package/components/elements/ContextMenu.test.js +0 -215
  149. package/components/elements/ObjectDetails.d.ts +0 -6
  150. package/components/elements/case/CaseCard.d.ts +0 -12
  151. package/components/elements/case/CaseCard.js +0 -42
  152. package/components/elements/case/CasePreview.d.ts +0 -6
  153. package/components/elements/case/CasePreview.js +0 -17
  154. package/components/elements/case/StatusIcon.d.ts +0 -5
  155. package/components/elements/case/StatusIcon.js +0 -13
  156. package/components/elements/hit/elements/AnalyticLink.d.ts +0 -9
  157. package/components/elements/hit/elements/AnalyticLink.js +0 -22
  158. package/components/elements/hit/related/RelatedRecords.js +0 -63
  159. package/components/elements/observable/ObservableCard.d.ts +0 -6
  160. package/components/elements/observable/ObservableCard.js +0 -22
  161. package/components/elements/observable/ObservablePreview.d.ts +0 -6
  162. package/components/elements/observable/ObservablePreview.js +0 -12
  163. package/components/elements/record/RecordContextMenu.js +0 -256
  164. package/components/elements/record/RecordContextMenu.test.d.ts +0 -1
  165. package/components/elements/record/RecordRelated.d.ts +0 -7
  166. package/components/elements/record/RecordRelated.js +0 -34
  167. package/components/hooks/useRelatedRecords.d.ts +0 -13
  168. package/components/hooks/useRelatedRecords.js +0 -32
  169. package/components/routes/cases/CaseViewer.d.ts +0 -2
  170. package/components/routes/cases/CaseViewer.js +0 -22
  171. package/components/routes/cases/Cases.d.ts +0 -2
  172. package/components/routes/cases/Cases.js +0 -148
  173. package/components/routes/cases/constants.d.ts +0 -6
  174. package/components/routes/cases/constants.js +0 -6
  175. package/components/routes/cases/detail/AlertPanel.d.ts +0 -6
  176. package/components/routes/cases/detail/AlertPanel.js +0 -33
  177. package/components/routes/cases/detail/CaseAssets.d.ts +0 -11
  178. package/components/routes/cases/detail/CaseAssets.js +0 -104
  179. package/components/routes/cases/detail/CaseAssets.test.d.ts +0 -1
  180. package/components/routes/cases/detail/CaseAssets.test.js +0 -167
  181. package/components/routes/cases/detail/CaseDashboard.d.ts +0 -7
  182. package/components/routes/cases/detail/CaseDashboard.js +0 -66
  183. package/components/routes/cases/detail/CaseDetails.d.ts +0 -6
  184. package/components/routes/cases/detail/CaseDetails.js +0 -61
  185. package/components/routes/cases/detail/CaseOverview.d.ts +0 -7
  186. package/components/routes/cases/detail/CaseOverview.js +0 -43
  187. package/components/routes/cases/detail/CaseSidebar.d.ts +0 -8
  188. package/components/routes/cases/detail/CaseSidebar.js +0 -107
  189. package/components/routes/cases/detail/CaseSidebar.test.d.ts +0 -1
  190. package/components/routes/cases/detail/CaseSidebar.test.js +0 -246
  191. package/components/routes/cases/detail/CaseTask.d.ts +0 -11
  192. package/components/routes/cases/detail/CaseTask.js +0 -57
  193. package/components/routes/cases/detail/CaseTimeline.d.ts +0 -12
  194. package/components/routes/cases/detail/CaseTimeline.js +0 -106
  195. package/components/routes/cases/detail/CaseTimeline.test.d.ts +0 -1
  196. package/components/routes/cases/detail/CaseTimeline.test.js +0 -320
  197. package/components/routes/cases/detail/ItemPage.d.ts +0 -6
  198. package/components/routes/cases/detail/ItemPage.js +0 -99
  199. package/components/routes/cases/detail/RelatedCasePanel.d.ts +0 -6
  200. package/components/routes/cases/detail/RelatedCasePanel.js +0 -34
  201. package/components/routes/cases/detail/TaskPanel.d.ts +0 -7
  202. package/components/routes/cases/detail/TaskPanel.js +0 -52
  203. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +0 -11
  204. package/components/routes/cases/detail/aggregates/CaseAggregate.js +0 -24
  205. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +0 -6
  206. package/components/routes/cases/detail/aggregates/SourceAggregate.js +0 -26
  207. package/components/routes/cases/detail/assets/Asset.d.ts +0 -14
  208. package/components/routes/cases/detail/assets/Asset.js +0 -12
  209. package/components/routes/cases/detail/assets/Asset.test.d.ts +0 -1
  210. package/components/routes/cases/detail/assets/Asset.test.js +0 -72
  211. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +0 -20
  212. package/components/routes/cases/detail/sidebar/CaseFolder.js +0 -83
  213. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +0 -1
  214. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +0 -295
  215. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +0 -34
  216. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +0 -103
  217. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +0 -1
  218. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +0 -363
  219. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +0 -25
  220. package/components/routes/cases/detail/sidebar/FolderEntry.js +0 -88
  221. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +0 -1
  222. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +0 -206
  223. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +0 -5
  224. package/components/routes/cases/detail/sidebar/RootDropZone.js +0 -33
  225. package/components/routes/cases/detail/sidebar/types.d.ts +0 -9
  226. package/components/routes/cases/detail/sidebar/utils.d.ts +0 -3
  227. package/components/routes/cases/detail/sidebar/utils.js +0 -29
  228. package/components/routes/cases/detail/sidebar/utils.test.d.ts +0 -1
  229. package/components/routes/cases/detail/sidebar/utils.test.js +0 -82
  230. package/components/routes/cases/hooks/useCase.d.ts +0 -13
  231. package/components/routes/cases/hooks/useCase.js +0 -51
  232. package/components/routes/cases/modals/AddToCaseModal.d.ts +0 -7
  233. package/components/routes/cases/modals/AddToCaseModal.js +0 -59
  234. package/components/routes/cases/modals/AddToCaseModal.test.d.ts +0 -1
  235. package/components/routes/cases/modals/AddToCaseModal.test.js +0 -313
  236. package/components/routes/cases/modals/CaseRecordRow.d.ts +0 -9
  237. package/components/routes/cases/modals/CaseRecordRow.js +0 -15
  238. package/components/routes/cases/modals/CreateCaseModal.d.ts +0 -7
  239. package/components/routes/cases/modals/CreateCaseModal.js +0 -55
  240. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +0 -1
  241. package/components/routes/cases/modals/CreateCaseModal.test.js +0 -358
  242. package/components/routes/cases/modals/RenameItemModal.d.ts +0 -9
  243. package/components/routes/cases/modals/RenameItemModal.js +0 -48
  244. package/components/routes/cases/modals/ResolveModal.d.ts +0 -7
  245. package/components/routes/cases/modals/ResolveModal.js +0 -115
  246. package/components/routes/cases/modals/ResolveModal.test.d.ts +0 -1
  247. package/components/routes/cases/modals/ResolveModal.test.js +0 -384
  248. package/components/routes/cases/modals/hooks.d.ts +0 -7
  249. package/components/routes/cases/modals/hooks.js +0 -44
  250. package/components/routes/cases/modals/types.d.ts +0 -5
  251. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +0 -6
  252. package/components/routes/cases/search/CaseAssigneeFilter.js +0 -33
  253. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +0 -1
  254. package/components/routes/cases/search/CaseAssigneeFilter.test.js +0 -127
  255. package/components/routes/cases/search/CaseDateFilter.d.ts +0 -13
  256. package/components/routes/cases/search/CaseDateFilter.js +0 -26
  257. package/components/routes/cases/search/CaseDateFilter.test.d.ts +0 -1
  258. package/components/routes/cases/search/CaseDateFilter.test.js +0 -115
  259. package/components/routes/cases/search/CaseStatusFilter.d.ts +0 -6
  260. package/components/routes/cases/search/CaseStatusFilter.js +0 -13
  261. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +0 -1
  262. package/components/routes/cases/search/CaseStatusFilter.test.js +0 -86
  263. package/components/routes/hits/search/shared/IndexPicker.d.ts +0 -2
  264. package/components/routes/hits/search/shared/IndexPicker.js +0 -20
  265. package/components/routes/observables/ObservableViewer.d.ts +0 -7
  266. package/components/routes/observables/ObservableViewer.js +0 -27
  267. package/models/entities/generated/AttachmentsFile.d.ts +0 -12
  268. package/models/entities/generated/Case.d.ts +0 -28
  269. package/models/entities/generated/DestinationOriginal.d.ts +0 -19
  270. package/models/entities/generated/EmailAttachment.d.ts +0 -8
  271. package/models/entities/generated/EmailParent.d.ts +0 -19
  272. package/models/entities/generated/Enrichments.d.ts +0 -7
  273. package/models/entities/generated/EnrichmentsIndicator.d.ts +0 -21
  274. package/models/entities/generated/HttpResponse.d.ts +0 -11
  275. package/models/entities/generated/Item.d.ts +0 -9
  276. package/models/entities/generated/Observable.d.ts +0 -85
  277. package/models/entities/generated/ObservableCloud.d.ts +0 -20
  278. package/models/entities/generated/ObservableDestination.d.ts +0 -23
  279. package/models/entities/generated/ObservableEmail.d.ts +0 -30
  280. package/models/entities/generated/ObservableFile.d.ts +0 -36
  281. package/models/entities/generated/ObservableHowler.d.ts +0 -43
  282. package/models/entities/generated/ObservableHttp.d.ts +0 -11
  283. package/models/entities/generated/ObservableObserver.d.ts +0 -21
  284. package/models/entities/generated/ObservableOrganization.d.ts +0 -7
  285. package/models/entities/generated/ObservableProcess.d.ts +0 -34
  286. package/models/entities/generated/ObservableSource.d.ts +0 -23
  287. package/models/entities/generated/ObservableThreat.d.ts +0 -21
  288. package/models/entities/generated/ObservableTls.d.ts +0 -12
  289. package/models/entities/generated/ObserverIngress.d.ts +0 -9
  290. package/models/entities/generated/Task.d.ts +0 -10
  291. package/utils/typeUtils.d.ts +0 -7
  292. package/utils/typeUtils.js +0 -27
  293. /package/components/app/providers/{RecordSearchProvider.test.d.ts → HitSearchProvider.test.d.ts} +0 -0
  294. /package/components/elements/hit/{related/RelatedRecords.d.ts → HitDetails.d.ts} +0 -0
  295. /package/components/routes/hits/search/{RecordBrowser.d.ts → HitBrowser.d.ts} +0 -0
  296. /package/components/{elements/ContextMenu.test.d.ts → routes/hits/search/HitContextMenu.test.d.ts} +0 -0
  297. /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;