@cccsaurora/howler-ui 2.18.0-dev.739 → 2.18.0-dev.748

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