@cccsaurora/howler-ui 2.19.0-dev.836 → 2.19.0-dev.842

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 (328) hide show
  1. package/api/index.d.ts +4 -0
  2. package/api/index.js +10 -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/socket/index.d.ts +3 -0
  10. package/api/socket/index.js +6 -0
  11. package/api/socket/viewers.d.ts +2 -0
  12. package/api/socket/viewers.js +8 -0
  13. package/api/socket/viewers.test.js +44 -0
  14. package/api/v2/case/index.d.ts +9 -0
  15. package/api/v2/case/index.js +21 -0
  16. package/api/v2/case/items.d.ts +6 -0
  17. package/api/v2/case/items.js +18 -0
  18. package/api/v2/case/rules.d.ts +6 -0
  19. package/api/v2/case/rules.js +18 -0
  20. package/api/v2/index.d.ts +4 -0
  21. package/api/v2/index.js +6 -0
  22. package/api/v2/search/facet.d.ts +3 -0
  23. package/api/v2/search/facet.js +12 -0
  24. package/api/v2/search/index.d.ts +5 -0
  25. package/api/v2/search/index.js +24 -0
  26. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  27. package/components/app/App.js +41 -8
  28. package/components/app/hooks/useMatchers.d.ts +1 -1
  29. package/components/app/hooks/useMatchers.js +23 -11
  30. package/components/app/hooks/useMatchers.test.js +22 -22
  31. package/components/app/hooks/useTitle.js +5 -5
  32. package/components/app/providers/FavouritesProvider.js +2 -2
  33. package/components/app/providers/ModalProvider.d.ts +1 -0
  34. package/components/app/providers/ParameterProvider.d.ts +9 -2
  35. package/components/app/providers/ParameterProvider.js +165 -240
  36. package/components/app/providers/ParameterProvider.test.js +346 -94
  37. package/components/app/providers/RecordProvider.d.ts +23 -0
  38. package/components/app/providers/{HitProvider.js → RecordProvider.js} +41 -41
  39. package/components/app/providers/{HitSearchProvider.d.ts → RecordSearchProvider.d.ts} +6 -6
  40. package/components/app/providers/{HitSearchProvider.js → RecordSearchProvider.js} +12 -17
  41. package/components/app/providers/{HitSearchProvider.test.js → RecordSearchProvider.test.js} +52 -71
  42. package/components/app/providers/SocketProvider.d.ts +11 -2
  43. package/components/app/providers/SocketProvider.js +18 -5
  44. package/components/app/providers/UserListProvider.js +28 -8
  45. package/components/elements/ContextMenu.d.ts +56 -0
  46. package/components/elements/ContextMenu.js +109 -0
  47. package/components/elements/ContextMenu.test.d.ts +1 -0
  48. package/components/elements/ContextMenu.test.js +215 -0
  49. package/components/{routes/overviews/OverviewEditor.js → elements/MarkdownEditor.js} +3 -3
  50. package/components/elements/ObjectDetails.d.ts +6 -0
  51. package/components/elements/{hit/HitDetails.js → ObjectDetails.js} +17 -17
  52. package/components/elements/PluginTypography.d.ts +2 -1
  53. package/components/elements/PluginTypography.js +3 -2
  54. package/components/elements/UserList.d.ts +5 -2
  55. package/components/elements/UserList.js +18 -8
  56. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  57. package/components/elements/case/CaseCard.d.ts +12 -0
  58. package/components/elements/case/CaseCard.js +42 -0
  59. package/components/elements/case/CasePreview.d.ts +6 -0
  60. package/components/elements/case/CasePreview.js +17 -0
  61. package/components/elements/case/StatusIcon.d.ts +5 -0
  62. package/components/elements/case/StatusIcon.js +13 -0
  63. package/components/elements/display/ChipPopper.d.ts +1 -1
  64. package/components/elements/display/ChipPopper.js +5 -5
  65. package/components/elements/display/HowlerCard.js +1 -1
  66. package/components/elements/display/Modal.js +2 -0
  67. package/components/elements/hit/HitActions.js +4 -4
  68. package/components/elements/hit/HitBanner.d.ts +1 -0
  69. package/components/elements/hit/HitBanner.js +34 -51
  70. package/components/elements/hit/HitCard.d.ts +2 -0
  71. package/components/elements/hit/HitCard.js +7 -7
  72. package/components/elements/hit/HitLabels.js +2 -2
  73. package/components/elements/hit/HitOutline.d.ts +1 -0
  74. package/components/elements/hit/HitOutline.js +3 -3
  75. package/components/elements/hit/{HitQuickSearch.d.ts → HitPreview.d.ts} +3 -3
  76. package/components/elements/hit/{HitQuickSearch.js → HitPreview.js} +10 -4
  77. package/components/elements/hit/HitSummary.d.ts +2 -1
  78. package/components/elements/hit/HitSummary.js +6 -5
  79. package/components/elements/hit/aggregate/HitGraph.js +8 -8
  80. package/components/elements/hit/elements/AnalyticLink.d.ts +9 -0
  81. package/components/elements/hit/elements/AnalyticLink.js +22 -0
  82. package/components/elements/hit/elements/Assigned.js +6 -3
  83. package/components/elements/hit/elements/Assigned.test.d.ts +1 -0
  84. package/components/elements/hit/elements/Assigned.test.js +65 -0
  85. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  86. package/components/elements/hit/related/RelatedRecords.js +63 -0
  87. package/components/elements/observable/ObservableCard.d.ts +6 -0
  88. package/components/elements/observable/ObservableCard.js +22 -0
  89. package/components/elements/observable/ObservablePreview.d.ts +6 -0
  90. package/components/elements/observable/ObservablePreview.js +12 -0
  91. package/components/elements/{hit/HitComments.d.ts → record/RecordComments.d.ts} +5 -4
  92. package/components/elements/{hit/HitComments.js → record/RecordComments.js} +29 -28
  93. package/components/{routes/hits/search/HitContextMenu.d.ts → elements/record/RecordContextMenu.d.ts} +3 -3
  94. package/components/elements/record/RecordContextMenu.js +268 -0
  95. package/components/elements/record/RecordContextMenu.test.d.ts +1 -0
  96. package/components/{routes/hits/search/HitContextMenu.test.js → elements/record/RecordContextMenu.test.js} +98 -43
  97. package/components/elements/record/RecordRelated.d.ts +7 -0
  98. package/components/elements/record/RecordRelated.js +34 -0
  99. package/components/elements/{hit/HitWorklog.d.ts → record/RecordWorklog.d.ts} +4 -3
  100. package/components/elements/{hit/HitWorklog.js → record/RecordWorklog.js} +15 -13
  101. package/components/elements/view/ViewTitle.d.ts +1 -0
  102. package/components/elements/view/ViewTitle.js +9 -2
  103. package/components/hooks/useHitActions.d.ts +1 -1
  104. package/components/hooks/useHitActions.js +4 -4
  105. package/components/hooks/useMyPreferences.js +10 -1
  106. package/components/hooks/useMySearch.js +2 -2
  107. package/components/hooks/useMySitemap.js +4 -1
  108. package/components/hooks/useMyTheme.js +9 -2
  109. package/components/hooks/{useHitSelection.d.ts → useRecordSelection.d.ts} +2 -2
  110. package/components/hooks/{useHitSelection.js → useRecordSelection.js} +12 -33
  111. package/components/hooks/useRelatedRecords.d.ts +13 -0
  112. package/components/hooks/useRelatedRecords.js +32 -0
  113. package/components/routes/action/edit/ActionEditor.js +2 -2
  114. package/components/routes/action/view/ActionSearch.js +1 -1
  115. package/components/routes/advanced/QueryBuilder.js +1 -1
  116. package/components/routes/advanced/QueryEditor.js +3 -3
  117. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  118. package/components/routes/analytics/AnalyticDetails.js +2 -2
  119. package/components/routes/analytics/AnalyticSearch.js +1 -1
  120. package/components/routes/cases/CaseViewer.d.ts +2 -0
  121. package/components/routes/cases/CaseViewer.js +44 -0
  122. package/components/routes/cases/CaseViewer.test.d.ts +1 -0
  123. package/components/routes/cases/CaseViewer.test.js +133 -0
  124. package/components/routes/cases/Cases.d.ts +2 -0
  125. package/components/routes/cases/Cases.js +148 -0
  126. package/components/routes/cases/constants.d.ts +6 -0
  127. package/components/routes/cases/constants.js +6 -0
  128. package/components/routes/cases/detail/AlertPanel.d.ts +6 -0
  129. package/components/routes/cases/detail/AlertPanel.js +33 -0
  130. package/components/routes/cases/detail/CaseAssets.d.ts +11 -0
  131. package/components/routes/cases/detail/CaseAssets.js +104 -0
  132. package/components/routes/cases/detail/CaseAssets.test.d.ts +1 -0
  133. package/components/routes/cases/detail/CaseAssets.test.js +167 -0
  134. package/components/routes/cases/detail/CaseDashboard.d.ts +7 -0
  135. package/components/routes/cases/detail/CaseDashboard.js +66 -0
  136. package/components/routes/cases/detail/CaseDetails.d.ts +6 -0
  137. package/components/routes/cases/detail/CaseDetails.js +70 -0
  138. package/components/routes/cases/detail/CaseOverview.d.ts +7 -0
  139. package/components/routes/cases/detail/CaseOverview.js +43 -0
  140. package/components/routes/cases/detail/CaseRules.d.ts +7 -0
  141. package/components/routes/cases/detail/CaseRules.js +57 -0
  142. package/components/routes/cases/detail/CaseRules.test.d.ts +1 -0
  143. package/components/routes/cases/detail/CaseRules.test.js +221 -0
  144. package/components/routes/cases/detail/CaseSidebar.d.ts +8 -0
  145. package/components/routes/cases/detail/CaseSidebar.js +107 -0
  146. package/components/routes/cases/detail/CaseSidebar.test.d.ts +1 -0
  147. package/components/routes/cases/detail/CaseSidebar.test.js +266 -0
  148. package/components/routes/cases/detail/CaseTask.d.ts +11 -0
  149. package/components/routes/cases/detail/CaseTask.js +66 -0
  150. package/components/routes/cases/detail/CaseTimeline.d.ts +12 -0
  151. package/components/routes/cases/detail/CaseTimeline.js +106 -0
  152. package/components/routes/cases/detail/CaseTimeline.test.d.ts +1 -0
  153. package/components/routes/cases/detail/CaseTimeline.test.js +320 -0
  154. package/components/routes/cases/detail/CreateRuleDialog.d.ts +9 -0
  155. package/components/routes/cases/detail/CreateRuleDialog.js +163 -0
  156. package/components/routes/cases/detail/CreateRuleDialog.test.d.ts +1 -0
  157. package/components/routes/cases/detail/CreateRuleDialog.test.js +259 -0
  158. package/components/routes/cases/detail/ItemPage.d.ts +6 -0
  159. package/components/routes/cases/detail/ItemPage.js +95 -0
  160. package/components/routes/cases/detail/RelatedCasePanel.d.ts +6 -0
  161. package/components/routes/cases/detail/RelatedCasePanel.js +34 -0
  162. package/components/routes/cases/detail/TaskPanel.d.ts +7 -0
  163. package/components/routes/cases/detail/TaskPanel.js +52 -0
  164. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +11 -0
  165. package/components/routes/cases/detail/aggregates/CaseAggregate.js +24 -0
  166. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +6 -0
  167. package/components/routes/cases/detail/aggregates/SourceAggregate.js +26 -0
  168. package/components/routes/cases/detail/assets/Asset.d.ts +14 -0
  169. package/components/routes/cases/detail/assets/Asset.js +12 -0
  170. package/components/routes/cases/detail/assets/Asset.test.d.ts +1 -0
  171. package/components/routes/cases/detail/assets/Asset.test.js +72 -0
  172. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +20 -0
  173. package/components/routes/cases/detail/sidebar/CaseFolder.js +83 -0
  174. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +1 -0
  175. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +295 -0
  176. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +34 -0
  177. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +103 -0
  178. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +1 -0
  179. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +363 -0
  180. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +25 -0
  181. package/components/routes/cases/detail/sidebar/FolderEntry.js +88 -0
  182. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +1 -0
  183. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +206 -0
  184. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +5 -0
  185. package/components/routes/cases/detail/sidebar/RootDropZone.js +33 -0
  186. package/components/routes/cases/detail/sidebar/types.d.ts +9 -0
  187. package/components/routes/cases/detail/sidebar/utils.d.ts +3 -0
  188. package/components/routes/cases/detail/sidebar/utils.js +29 -0
  189. package/components/routes/cases/detail/sidebar/utils.test.d.ts +1 -0
  190. package/components/routes/cases/detail/sidebar/utils.test.js +82 -0
  191. package/components/routes/cases/hooks/useCase.d.ts +13 -0
  192. package/components/routes/cases/hooks/useCase.js +69 -0
  193. package/components/routes/cases/hooks/useCase.test.d.ts +1 -0
  194. package/components/routes/cases/hooks/useCase.test.js +141 -0
  195. package/components/routes/cases/modals/AddToCaseModal.d.ts +7 -0
  196. package/components/routes/cases/modals/AddToCaseModal.js +59 -0
  197. package/components/routes/cases/modals/AddToCaseModal.test.d.ts +1 -0
  198. package/components/routes/cases/modals/AddToCaseModal.test.js +313 -0
  199. package/components/routes/cases/modals/CaseRecordRow.d.ts +9 -0
  200. package/components/routes/cases/modals/CaseRecordRow.js +15 -0
  201. package/components/routes/cases/modals/CreateCaseModal.d.ts +7 -0
  202. package/components/routes/cases/modals/CreateCaseModal.js +55 -0
  203. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +1 -0
  204. package/components/routes/cases/modals/CreateCaseModal.test.js +358 -0
  205. package/components/routes/cases/modals/RenameItemModal.d.ts +9 -0
  206. package/components/routes/cases/modals/RenameItemModal.js +48 -0
  207. package/components/routes/cases/modals/ResolveModal.d.ts +7 -0
  208. package/components/routes/cases/modals/ResolveModal.js +115 -0
  209. package/components/routes/cases/modals/ResolveModal.test.d.ts +1 -0
  210. package/components/routes/cases/modals/ResolveModal.test.js +394 -0
  211. package/components/routes/cases/modals/hooks.d.ts +7 -0
  212. package/components/routes/cases/modals/hooks.js +44 -0
  213. package/components/routes/cases/modals/types.d.ts +5 -0
  214. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +6 -0
  215. package/components/routes/cases/search/CaseAssigneeFilter.js +33 -0
  216. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +1 -0
  217. package/components/routes/cases/search/CaseAssigneeFilter.test.js +127 -0
  218. package/components/routes/cases/search/CaseDateFilter.d.ts +13 -0
  219. package/components/routes/cases/search/CaseDateFilter.js +26 -0
  220. package/components/routes/cases/search/CaseDateFilter.test.d.ts +1 -0
  221. package/components/routes/cases/search/CaseDateFilter.test.js +115 -0
  222. package/components/routes/cases/search/CaseStatusFilter.d.ts +6 -0
  223. package/components/routes/cases/search/CaseStatusFilter.js +13 -0
  224. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +1 -0
  225. package/components/routes/cases/search/CaseStatusFilter.test.js +86 -0
  226. package/components/routes/dossiers/DossierEditor.js +2 -2
  227. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  228. package/components/routes/help/ApiDocumentation.js +1 -1
  229. package/components/routes/help/HitBannerDocumentation.js +1 -0
  230. package/components/routes/help/HitDocumentation.js +1 -3
  231. package/components/routes/hits/search/InformationPane.d.ts +1 -0
  232. package/components/routes/hits/search/InformationPane.js +50 -63
  233. package/components/routes/hits/search/LayoutSettings.js +3 -3
  234. package/components/routes/hits/search/QuerySettings.js +2 -1
  235. package/components/routes/hits/search/QuerySettings.test.js +14 -9
  236. package/components/routes/hits/search/{HitBrowser.js → RecordBrowser.js} +9 -9
  237. package/components/routes/hits/search/{HitQuery.d.ts → RecordQuery.d.ts} +2 -2
  238. package/components/routes/hits/search/{HitQuery.js → RecordQuery.js} +6 -6
  239. package/components/routes/hits/search/SearchPane.js +26 -49
  240. package/components/routes/hits/search/ViewLink.js +3 -3
  241. package/components/routes/hits/search/ViewLink.test.js +8 -8
  242. package/components/routes/hits/search/grid/AddColumnModal.js +5 -4
  243. package/components/routes/hits/search/grid/EnhancedCell.d.ts +2 -1
  244. package/components/routes/hits/search/grid/EnhancedCell.js +2 -2
  245. package/components/routes/hits/search/grid/HitGrid.js +20 -18
  246. package/components/routes/hits/search/grid/{HitRow.d.ts → RecordRow.d.ts} +3 -2
  247. package/components/routes/hits/search/grid/{HitRow.js → RecordRow.js} +10 -8
  248. package/components/routes/hits/search/shared/IndexPicker.d.ts +2 -0
  249. package/components/routes/hits/search/shared/IndexPicker.js +20 -0
  250. package/components/routes/hits/view/HitViewer.js +12 -13
  251. package/components/routes/home/ViewCard.js +47 -41
  252. package/components/routes/observables/ObservableViewer.d.ts +7 -0
  253. package/components/routes/observables/ObservableViewer.js +27 -0
  254. package/components/routes/overviews/OverviewViewer.js +2 -2
  255. package/components/routes/views/ViewComposer.js +46 -19
  256. package/locales/en/translation.json +123 -3
  257. package/locales/fr/translation.json +121 -3
  258. package/models/WithMetadata.d.ts +2 -1
  259. package/models/entities/generated/AttachmentsFile.d.ts +12 -0
  260. package/models/entities/generated/Case.d.ts +28 -0
  261. package/models/entities/generated/DestinationOriginal.d.ts +19 -0
  262. package/models/entities/generated/EmailAttachment.d.ts +8 -0
  263. package/models/entities/generated/EmailParent.d.ts +19 -0
  264. package/models/entities/generated/Enrichments.d.ts +7 -0
  265. package/models/entities/generated/EnrichmentsIndicator.d.ts +21 -0
  266. package/models/entities/generated/Hit.d.ts +1 -0
  267. package/models/entities/generated/Howler.d.ts +0 -5
  268. package/models/entities/generated/HttpResponse.d.ts +11 -0
  269. package/models/entities/generated/Item.d.ts +9 -0
  270. package/models/entities/generated/Observable.d.ts +85 -0
  271. package/models/entities/generated/ObservableCloud.d.ts +20 -0
  272. package/models/entities/generated/ObservableDestination.d.ts +23 -0
  273. package/models/entities/generated/ObservableEmail.d.ts +30 -0
  274. package/models/entities/generated/ObservableFile.d.ts +36 -0
  275. package/models/entities/generated/ObservableHowler.d.ts +42 -0
  276. package/models/entities/generated/ObservableHttp.d.ts +11 -0
  277. package/models/entities/generated/ObservableObserver.d.ts +21 -0
  278. package/models/entities/generated/ObservableOrganization.d.ts +7 -0
  279. package/models/entities/generated/ObservableProcess.d.ts +34 -0
  280. package/models/entities/generated/ObservableSource.d.ts +23 -0
  281. package/models/entities/generated/ObservableThreat.d.ts +21 -0
  282. package/models/entities/generated/ObservableTls.d.ts +12 -0
  283. package/models/entities/generated/ObserverIngress.d.ts +9 -0
  284. package/models/entities/generated/Rule.d.ts +6 -9
  285. package/models/entities/generated/Task.d.ts +10 -0
  286. package/models/entities/generated/Threat.d.ts +2 -2
  287. package/models/entities/generated/{Enrichment.d.ts → ThreatEnrichment.d.ts} +1 -1
  288. package/models/entities/generated/View.d.ts +1 -0
  289. package/models/socket/CaseUpdate.d.ts +5 -0
  290. package/models/socket/ViewersUpdate.d.ts +4 -0
  291. package/package.json +21 -1
  292. package/plugins/clue/components/ClueTypography.js +2 -2
  293. package/plugins/clue/utils.d.ts +2 -1
  294. package/tests/mocks.d.ts +11 -1
  295. package/tests/mocks.js +12 -7
  296. package/tests/server-handlers.js +6 -1
  297. package/tests/utils.d.ts +4 -0
  298. package/tests/utils.js +20 -0
  299. package/utils/constants.d.ts +4 -3
  300. package/utils/constants.js +6 -0
  301. package/utils/hitFunctions.d.ts +2 -1
  302. package/utils/hitFunctions.js +4 -4
  303. package/utils/socketUtils.d.ts +14 -0
  304. package/utils/socketUtils.js +17 -1
  305. package/utils/socketUtils.test.d.ts +1 -0
  306. package/utils/socketUtils.test.js +59 -0
  307. package/utils/typeUtils.d.ts +7 -0
  308. package/utils/typeUtils.js +27 -0
  309. package/utils/viewUtils.js +3 -0
  310. package/components/app/providers/HitProvider.d.ts +0 -22
  311. package/components/elements/display/icons/BundleButton.d.ts +0 -6
  312. package/components/elements/display/icons/BundleButton.js +0 -32
  313. package/components/elements/hit/HitRelated.d.ts +0 -6
  314. package/components/elements/hit/HitRelated.js +0 -7
  315. package/components/routes/help/BundleDocumentation.d.ts +0 -3
  316. package/components/routes/help/BundleDocumentation.js +0 -12
  317. package/components/routes/help/markdown/en/bundles.md.js +0 -1
  318. package/components/routes/help/markdown/fr/bundles.md.js +0 -1
  319. package/components/routes/hits/search/BundleParentMenu.d.ts +0 -6
  320. package/components/routes/hits/search/BundleParentMenu.js +0 -32
  321. package/components/routes/hits/search/BundleScroller.d.ts +0 -2
  322. package/components/routes/hits/search/BundleScroller.js +0 -6
  323. package/components/routes/hits/search/HitContextMenu.js +0 -239
  324. /package/{components/app/providers/HitSearchProvider.test.d.ts → api/socket/viewers.test.d.ts} +0 -0
  325. /package/components/{routes/hits/search/HitContextMenu.test.d.ts → app/providers/RecordSearchProvider.test.d.ts} +0 -0
  326. /package/components/{routes/overviews/OverviewEditor.d.ts → elements/MarkdownEditor.d.ts} +0 -0
  327. /package/components/elements/hit/{HitDetails.d.ts → related/RelatedRecords.d.ts} +0 -0
  328. /package/components/routes/hits/search/{HitBrowser.d.ts → RecordBrowser.d.ts} +0 -0
package/api/index.d.ts CHANGED
@@ -8,8 +8,10 @@ import * as hit from '@cccsaurora/howler-ui/api/hit';
8
8
  import * as notebook from '@cccsaurora/howler-ui/api/notebook';
9
9
  import * as overview from '@cccsaurora/howler-ui/api/overview';
10
10
  import * as search from '@cccsaurora/howler-ui/api/search';
11
+ import * as socket from '@cccsaurora/howler-ui/api/socket';
11
12
  import * as template from '@cccsaurora/howler-ui/api/template';
12
13
  import * as user from '@cccsaurora/howler-ui/api/user';
14
+ import * as v2 from '@cccsaurora/howler-ui/api/v2';
13
15
  import * as view from '@cccsaurora/howler-ui/api/view';
14
16
  /**
15
17
  * Defining the default export exposing all children routes of '/api/v1/'.
@@ -24,10 +26,12 @@ declare const api: {
24
26
  hit: typeof hit;
25
27
  overview: typeof overview;
26
28
  search: typeof search;
29
+ socket: typeof socket;
27
30
  template: typeof template;
28
31
  user: typeof user;
29
32
  view: typeof view;
30
33
  notebook: typeof notebook;
34
+ v2: typeof v2;
31
35
  };
32
36
  /**
33
37
  * The specification interface of an Howler HTTP response.
package/api/index.js CHANGED
@@ -8,8 +8,10 @@ import * as hit from '@cccsaurora/howler-ui/api/hit';
8
8
  import * as notebook from '@cccsaurora/howler-ui/api/notebook';
9
9
  import * as overview from '@cccsaurora/howler-ui/api/overview';
10
10
  import * as search from '@cccsaurora/howler-ui/api/search';
11
+ import * as socket from '@cccsaurora/howler-ui/api/socket';
11
12
  import * as template from '@cccsaurora/howler-ui/api/template';
12
13
  import * as user from '@cccsaurora/howler-ui/api/user';
14
+ import * as v2 from '@cccsaurora/howler-ui/api/v2';
13
15
  import * as view from '@cccsaurora/howler-ui/api/view';
14
16
  import AxiosClient from '@cccsaurora/howler-ui/rest/AxiosClient';
15
17
  import urlJoin from 'url-join';
@@ -35,10 +37,12 @@ const api = {
35
37
  hit,
36
38
  overview,
37
39
  search,
40
+ socket,
38
41
  template,
39
42
  user,
40
43
  view,
41
- notebook
44
+ notebook,
45
+ v2
42
46
  };
43
47
  /**
44
48
  * The base section of the Howler API uri.
@@ -57,7 +61,11 @@ export const uri = () => {
57
61
  * @returns `string` - properly formatted howler uri.
58
62
  */
59
63
  const format = (_uri) => {
60
- return _uri.startsWith(uri()) ? _uri : `${uri()}/${_uri.replace(/\/$/, '')}`;
64
+ // skip validation if we're hitting the socket endpoints
65
+ if (_uri.startsWith('/socket')) {
66
+ return _uri;
67
+ }
68
+ return _uri.startsWith('/api') ? _uri : `${uri()}/${_uri.replace(/\/$/, '')}`;
61
69
  };
62
70
  /**
63
71
  * Append series of search parameters to the specified uri.
@@ -0,0 +1,4 @@
1
+ import type { HowlerSearchRequest, HowlerSearchResponse } from '@cccsaurora/howler-ui/api/search';
2
+ import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case';
3
+ export declare const uri: () => string;
4
+ export declare const post: (request?: HowlerSearchRequest) => Promise<HowlerSearchResponse<Case>>;
@@ -0,0 +1,8 @@
1
+ import { hpost, joinUri } from '@cccsaurora/howler-ui/api';
2
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/search';
3
+ export const uri = () => {
4
+ return joinUri(parentUri(), 'case');
5
+ };
6
+ export const post = (request) => {
7
+ return hpost(uri(), { ...(request || {}), query: request?.query || 'case_id:*' });
8
+ };
@@ -1,5 +1,3 @@
1
1
  import type { HowlerFacetSearchRequest, HowlerFacetSearchResponse } from '@cccsaurora/howler-ui/api/search/facet';
2
2
  export declare const uri: () => string;
3
- export declare const post: (request?: HowlerFacetSearchRequest) => Promise<{
4
- [index: string]: HowlerFacetSearchResponse;
5
- }>;
3
+ export declare const post: (request?: HowlerFacetSearchRequest) => Promise<HowlerFacetSearchResponse>;
@@ -8,6 +8,8 @@ export type HowlerFacetSearchRequest = {
8
8
  filters?: string[];
9
9
  };
10
10
  export type HowlerFacetSearchResponse = {
11
- [value: string]: number;
11
+ [field: string]: {
12
+ [value: string]: number;
13
+ };
12
14
  };
13
15
  export { hit };
@@ -1,5 +1,6 @@
1
1
  import * as action from '@cccsaurora/howler-ui/api/search/action';
2
2
  import * as analytic from '@cccsaurora/howler-ui/api/search/analytic';
3
+ import * as case_ from '@cccsaurora/howler-ui/api/search/case';
3
4
  import * as count from '@cccsaurora/howler-ui/api/search/count';
4
5
  import * as dossier from '@cccsaurora/howler-ui/api/search/dossier';
5
6
  import * as facet from '@cccsaurora/howler-ui/api/search/facet';
@@ -60,4 +61,4 @@ export type HowlerExplainSearchResponse = {
60
61
  explanation: string;
61
62
  }[];
62
63
  };
63
- export { action, analytic, count, dossier, facet, fields, grouped, histogram, hit, overview, template, user, view };
64
+ export { action, analytic, case_ as case, count, dossier, facet, fields, grouped, histogram, hit, overview, template, user, view };
@@ -1,6 +1,7 @@
1
1
  import { joinUri, uri as parentUri } from '@cccsaurora/howler-ui/api';
2
2
  import * as action from '@cccsaurora/howler-ui/api/search/action';
3
3
  import * as analytic from '@cccsaurora/howler-ui/api/search/analytic';
4
+ import * as case_ from '@cccsaurora/howler-ui/api/search/case';
4
5
  import * as count from '@cccsaurora/howler-ui/api/search/count';
5
6
  import * as dossier from '@cccsaurora/howler-ui/api/search/dossier';
6
7
  import * as facet from '@cccsaurora/howler-ui/api/search/facet';
@@ -15,4 +16,4 @@ import * as view from '@cccsaurora/howler-ui/api/search/view';
15
16
  export const uri = () => {
16
17
  return joinUri(parentUri(), 'search');
17
18
  };
18
- export { action, analytic, count, dossier, facet, fields, grouped, histogram, hit, overview, template, user, view };
19
+ export { action, analytic, case_ as case, count, dossier, facet, fields, grouped, histogram, hit, overview, template, user, view };
@@ -0,0 +1,3 @@
1
+ import * as viewers from '@cccsaurora/howler-ui/api/socket/viewers';
2
+ export declare const uri: () => string;
3
+ export { viewers };
@@ -0,0 +1,6 @@
1
+ import { joinAllUri } from '@cccsaurora/howler-ui/api';
2
+ import * as viewers from '@cccsaurora/howler-ui/api/socket/viewers';
3
+ export const uri = () => {
4
+ return joinAllUri('/socket', 'v1');
5
+ };
6
+ export { viewers };
@@ -0,0 +1,2 @@
1
+ export declare const uri: (entityId?: string) => string;
2
+ export declare const get: (entityId: string) => Promise<string[]>;
@@ -0,0 +1,8 @@
1
+ import { hget, joinAllUri } from '@cccsaurora/howler-ui/api';
2
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/socket';
3
+ export const uri = (entityId) => {
4
+ return entityId ? joinAllUri(parentUri(), 'viewers', entityId) : joinAllUri(parentUri(), 'viewers');
5
+ };
6
+ export const get = async (entityId) => {
7
+ return hget(uri(entityId));
8
+ };
@@ -0,0 +1,44 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // ---------------------------------------------------------------------------
3
+ // Hoisted mocks
4
+ // ---------------------------------------------------------------------------
5
+ const mockHget = vi.hoisted(() => vi.fn());
6
+ vi.mock('api', async () => {
7
+ const urlJoin = (await import('url-join')).default;
8
+ return {
9
+ hget: mockHget,
10
+ joinAllUri: (...parts) => urlJoin(...parts)
11
+ };
12
+ });
13
+ // ---------------------------------------------------------------------------
14
+ // Import after mocks
15
+ // ---------------------------------------------------------------------------
16
+ // eslint-disable-next-line
17
+ import { get } from './viewers';
18
+ // ---------------------------------------------------------------------------
19
+ // Setup
20
+ // ---------------------------------------------------------------------------
21
+ beforeEach(() => {
22
+ mockHget.mockReset();
23
+ });
24
+ // ---------------------------------------------------------------------------
25
+ // Tests
26
+ // ---------------------------------------------------------------------------
27
+ describe('viewers API', () => {
28
+ describe('get', () => {
29
+ it('calls hget with the correct URI', async () => {
30
+ mockHget.mockResolvedValue(['alice', 'bob']);
31
+ await get('entity-1');
32
+ expect(mockHget).toHaveBeenCalledWith('/socket/v1/viewers/entity-1');
33
+ });
34
+ it('returns the result from hget', async () => {
35
+ mockHget.mockResolvedValue(['alice', 'bob']);
36
+ const result = await get('entity-1');
37
+ expect(result).toEqual(['alice', 'bob']);
38
+ });
39
+ it('propagates errors from hget', async () => {
40
+ mockHget.mockRejectedValue(new Error('not found'));
41
+ await expect(get('entity-1')).rejects.toThrow('not found');
42
+ });
43
+ });
44
+ });
@@ -0,0 +1,9 @@
1
+ import * as items from '@cccsaurora/howler-ui/api/v2/case/items';
2
+ import * as rules from '@cccsaurora/howler-ui/api/v2/case/rules';
3
+ import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case';
4
+ export declare const uri: (id?: string) => string;
5
+ export declare const get: (id: string) => Promise<Case>;
6
+ export declare const post: (newData: Partial<Case>) => Promise<Case>;
7
+ export declare const put: (id: string, _case: Partial<Case>) => Promise<Case>;
8
+ export declare const del: (id: string) => Promise<void>;
9
+ export { items, rules };
@@ -0,0 +1,21 @@
1
+ // eslint-disable-next-line import/no-cycle
2
+ import { hdelete, hget, hpost, hput, joinAllUri, joinUri } from '@cccsaurora/howler-ui/api';
3
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/v2';
4
+ import * as items from '@cccsaurora/howler-ui/api/v2/case/items';
5
+ import * as rules from '@cccsaurora/howler-ui/api/v2/case/rules';
6
+ export const uri = (id) => {
7
+ return id ? joinAllUri(parentUri(), 'case', id) : joinUri(parentUri(), 'case');
8
+ };
9
+ export const get = (id) => {
10
+ return hget(uri(id));
11
+ };
12
+ export const post = (newData) => {
13
+ return hpost(uri(), newData);
14
+ };
15
+ export const put = (id, _case) => {
16
+ return hput(uri(id), _case);
17
+ };
18
+ export const del = (id) => {
19
+ return hdelete(uri(id));
20
+ };
21
+ export { items, rules };
@@ -0,0 +1,6 @@
1
+ import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case';
2
+ import type { Item } from '@cccsaurora/howler-ui/models/entities/generated/Item';
3
+ export declare const uri: (id: string) => string;
4
+ export declare const post: (id: string, newData: Item) => Promise<Case>;
5
+ export declare const del: (id: string, values: string | string[]) => Promise<Case>;
6
+ export declare const put: (id: string, value: string, newPath: string) => Promise<Case>;
@@ -0,0 +1,18 @@
1
+ // eslint-disable-next-line import/no-cycle
2
+ import { hdelete, hpost, hput, joinUri } from '@cccsaurora/howler-ui/api';
3
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/v2/case';
4
+ export const uri = (id) => {
5
+ return joinUri(parentUri(id), 'items');
6
+ };
7
+ export const post = (id, newData) => {
8
+ return hpost(uri(id), newData);
9
+ };
10
+ export const del = (id, values) => {
11
+ if (!Array.isArray(values)) {
12
+ values = [values];
13
+ }
14
+ return hdelete(uri(id), { values });
15
+ };
16
+ export const put = (id, value, newPath) => {
17
+ return hput(uri(id), { value, new_path: newPath });
18
+ };
@@ -0,0 +1,6 @@
1
+ import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case';
2
+ import type { Rule } from '@cccsaurora/howler-ui/models/entities/generated/Rule';
3
+ export declare const uri: (caseId: string, ruleId?: string) => string;
4
+ export declare const post: (caseId: string, ruleData: Partial<Rule>) => Promise<Case>;
5
+ export declare const del: (caseId: string, ruleId: string) => Promise<Case>;
6
+ export declare const put: (caseId: string, ruleId: string, data: Partial<Rule>) => Promise<Case>;
@@ -0,0 +1,18 @@
1
+ // eslint-disable-next-line import/no-cycle
2
+ import { hdelete, hpost, hput, joinAllUri } from '@cccsaurora/howler-ui/api';
3
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/v2/case';
4
+ export const uri = (caseId, ruleId) => {
5
+ if (ruleId) {
6
+ return joinAllUri(parentUri(caseId), 'rules', ruleId);
7
+ }
8
+ return joinAllUri(parentUri(caseId), 'rules');
9
+ };
10
+ export const post = (caseId, ruleData) => {
11
+ return hpost(uri(caseId), ruleData);
12
+ };
13
+ export const del = (caseId, ruleId) => {
14
+ return hdelete(uri(caseId, ruleId));
15
+ };
16
+ export const put = (caseId, ruleId, data) => {
17
+ return hput(uri(caseId, ruleId), data);
18
+ };
@@ -0,0 +1,4 @@
1
+ import * as case_ from '@cccsaurora/howler-ui/api/v2/case';
2
+ import * as search from '@cccsaurora/howler-ui/api/v2/search';
3
+ export declare const uri: () => string;
4
+ export { case_ as case, search };
@@ -0,0 +1,6 @@
1
+ import * as case_ from '@cccsaurora/howler-ui/api/v2/case';
2
+ import * as search from '@cccsaurora/howler-ui/api/v2/search';
3
+ export const uri = () => {
4
+ return '/api/v2';
5
+ };
6
+ export { case_ as case, search };
@@ -0,0 +1,3 @@
1
+ import type { HowlerFacetSearchRequest, HowlerFacetSearchResponse } from '@cccsaurora/howler-ui/api/search/facet';
2
+ export declare const uri: (indexes: string[]) => string;
3
+ export declare const post: (indexes: string | string[], request?: HowlerFacetSearchRequest) => Promise<HowlerFacetSearchResponse>;
@@ -0,0 +1,12 @@
1
+ // eslint-disable-next-line import/no-cycle
2
+ import { hpost, joinAllUri } from '@cccsaurora/howler-ui/api';
3
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/v2';
4
+ export const uri = (indexes) => {
5
+ return joinAllUri(parentUri(), 'search', 'facet', indexes.join(','));
6
+ };
7
+ export const post = (indexes, request) => {
8
+ if (typeof indexes === 'string') {
9
+ indexes = indexes.split(',');
10
+ }
11
+ return hpost(uri(indexes), { ...(request || {}), query: request?.query || 'howler.id:*' });
12
+ };
@@ -0,0 +1,5 @@
1
+ import type { HowlerSearchRequest, HowlerSearchResponse } from '@cccsaurora/howler-ui/api/search';
2
+ import * as facet from './facet';
3
+ export declare const uri: (indexes: string[]) => string;
4
+ export declare const post: <T = any>(indexes: string | string[], request?: HowlerSearchRequest) => Promise<HowlerSearchResponse<T>>;
5
+ export { facet };
@@ -0,0 +1,24 @@
1
+ // eslint-disable-next-line import/no-cycle
2
+ import { hpost, joinAllUri } from '@cccsaurora/howler-ui/api';
3
+ import { uri as parentUri } from '@cccsaurora/howler-ui/api/v2';
4
+ import { identity, isNil } from 'lodash-es';
5
+ import * as facet from './facet';
6
+ export const uri = (indexes) => {
7
+ return joinAllUri(parentUri(), 'search', indexes.join(','));
8
+ };
9
+ export const post = (indexes, request) => {
10
+ if (isNil(indexes)) {
11
+ throw new Error('Indexes cannot be null or undefined.');
12
+ }
13
+ if (typeof indexes === 'string') {
14
+ indexes = indexes.split(',').filter(identity);
15
+ }
16
+ if (indexes.some(index => !['hit', 'observable', 'case'].includes(index))) {
17
+ throw new Error('Only hit, case, and observable indexes should be used currently.');
18
+ }
19
+ if (indexes.length < 1) {
20
+ throw new Error('indexes must have length of at least 1.');
21
+ }
22
+ return hpost(uri(indexes), { ...(request || {}), query: request?.query || 'howler.id:*' });
23
+ };
24
+ export { facet };
@@ -75,7 +75,7 @@ const LeftNavDrawer = () => {
75
75
  }
76
76
  }, children: _jsx(AppName, {}) }), !isTopLayout && _jsx(Divider, {})] }));
77
77
  const hide = (_jsx(List, { disablePadding: true, children: _jsxs(ListItemButton, { onClick: leftnav.toggle, children: [_jsx(ListItemIcon, { children: leftnav.open ? _jsx(ChevronLeftIcon, {}) : _jsx(ChevronRightIcon, {}) }), _jsx(ListItemText, { primary: t('drawer.collapse') })] }, "chevron") }));
78
- return (_jsx(ClickAwayListener, { mouseEvent: "onMouseDown", touchEvent: "onTouchStart", onClickAway: onCloseDrawerIfOpen, children: _jsxs(StyledDrawer, { PaperProps: { elevation: 1 }, variant: "permanent", style: { height: '100%' }, width: preferences.leftnav.width, open: leftnav.open, children: [leftnav.open ? (header) : (_jsx(Tooltip, { title: preferences.appName, "aria-label": preferences.appName, placement: "right", children: header })), _jsx(List, { disablePadding: true, children: leftnav.elements.map((e, i) => {
78
+ return (_jsx(ClickAwayListener, { mouseEvent: "onMouseDown", touchEvent: "onTouchStart", onClickAway: onCloseDrawerIfOpen, children: _jsxs(StyledDrawer, { variant: "permanent", style: { height: '100%' }, width: preferences.leftnav.width, open: leftnav.open, children: [leftnav.open ? (header) : (_jsx(Tooltip, { title: preferences.appName, "aria-label": preferences.appName, placement: "right", children: header })), _jsx(List, { disablePadding: true, children: leftnav.elements.map((e, i) => {
79
79
  if (e.type === 'item') {
80
80
  const item = e.element;
81
81
  return _jsx(LeftNavItem, { item: item, onClick: isSmDown && onCloseDrawerIfOpen }, item.id);
@@ -26,6 +26,13 @@ import UserSearchProvider from '@cccsaurora/howler-ui/components/routes/admin/us
26
26
  import QueryBuilder from '@cccsaurora/howler-ui/components/routes/advanced/QueryBuilder';
27
27
  import AnalyticDetails from '@cccsaurora/howler-ui/components/routes/analytics/AnalyticDetails';
28
28
  import AnalyticSearch from '@cccsaurora/howler-ui/components/routes/analytics/AnalyticSearch';
29
+ import CaseViewer from '@cccsaurora/howler-ui/components/routes/cases/CaseViewer';
30
+ import Cases from '@cccsaurora/howler-ui/components/routes/cases/Cases';
31
+ import CaseAssets from '@cccsaurora/howler-ui/components/routes/cases/detail/CaseAssets';
32
+ import CaseDashboard from '@cccsaurora/howler-ui/components/routes/cases/detail/CaseDashboard';
33
+ import CaseRules from '@cccsaurora/howler-ui/components/routes/cases/detail/CaseRules';
34
+ import CaseTimeline from '@cccsaurora/howler-ui/components/routes/cases/detail/CaseTimeline';
35
+ import ItemPage from '@cccsaurora/howler-ui/components/routes/cases/detail/ItemPage';
29
36
  import DossierEditor from '@cccsaurora/howler-ui/components/routes/dossiers/DossierEditor';
30
37
  import Dossiers from '@cccsaurora/howler-ui/components/routes/dossiers/Dossiers';
31
38
  import ActionDocumentation from '@cccsaurora/howler-ui/components/routes/help/ActionDocumentation';
@@ -40,7 +47,7 @@ import RetentionDocumentation from '@cccsaurora/howler-ui/components/routes/help
40
47
  import SearchDocumentation from '@cccsaurora/howler-ui/components/routes/help/SearchDocumentation';
41
48
  import TemplateDocumentation from '@cccsaurora/howler-ui/components/routes/help/TemplateDocumentation';
42
49
  import ViewDocumentation from '@cccsaurora/howler-ui/components/routes/help/ViewDocumentation';
43
- import HitBrowser from '@cccsaurora/howler-ui/components/routes/hits/search/HitBrowser';
50
+ import RecordBrowser from '@cccsaurora/howler-ui/components/routes/hits/search/RecordBrowser';
44
51
  import HitViewer from '@cccsaurora/howler-ui/components/routes/hits/view/HitViewer';
45
52
  import Home from '@cccsaurora/howler-ui/components/routes/home';
46
53
  import OverviewViewer from '@cccsaurora/howler-ui/components/routes/overviews/OverviewViewer';
@@ -72,11 +79,11 @@ import AvatarProvider from './providers/AvatarProvider';
72
79
  import CustomPluginProvider from './providers/CustomPluginProvider';
73
80
  import FavouriteProvider from './providers/FavouritesProvider';
74
81
  import FieldProvider from './providers/FieldProvider';
75
- import HitProvider from './providers/HitProvider';
76
82
  import LocalStorageProvider from './providers/LocalStorageProvider';
77
83
  import ModalProvider from './providers/ModalProvider';
78
84
  import OverviewProvider from './providers/OverviewProvider';
79
85
  import ParameterProvider from './providers/ParameterProvider';
86
+ import RecordProvider from './providers/RecordProvider';
80
87
  import SocketProvider from './providers/SocketProvider';
81
88
  import UserListProvider from './providers/UserListProvider';
82
89
  import ViewProvider from './providers/ViewProvider';
@@ -149,7 +156,7 @@ const MyAppProvider = ({ children }) => {
149
156
  const mySitemap = useMySitemap();
150
157
  const myUser = useMyUser();
151
158
  const mySearch = useMySearch();
152
- return (_jsx(ErrorBoundary, { children: _jsx(AppProvider, { preferences: myPreferences, theme: myTheme, sitemap: mySitemap, user: myUser, search: mySearch, children: _jsx(CustomPluginProvider, { children: _jsx(ErrorBoundary, { children: _jsx(ErrorBoundary, { children: _jsx(ViewProvider, { children: _jsx(AvatarProvider, { children: _jsx(ModalProvider, { children: _jsx(FieldProvider, { children: _jsx(LocalStorageProvider, { children: _jsx(SocketProvider, { children: _jsx(HitProvider, { children: _jsx(OverviewProvider, { children: _jsx(AnalyticProvider, { children: _jsx(FavouriteProvider, { children: _jsx(UserListProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
159
+ return (_jsx(ErrorBoundary, { children: _jsx(AppProvider, { preferences: myPreferences, theme: myTheme, sitemap: mySitemap, user: myUser, search: mySearch, children: _jsx(CustomPluginProvider, { children: _jsx(ErrorBoundary, { children: _jsx(ErrorBoundary, { children: _jsx(ViewProvider, { children: _jsx(AvatarProvider, { children: _jsx(ModalProvider, { children: _jsx(FieldProvider, { children: _jsx(LocalStorageProvider, { children: _jsx(SocketProvider, { children: _jsx(RecordProvider, { children: _jsx(OverviewProvider, { children: _jsx(AnalyticProvider, { children: _jsx(FavouriteProvider, { children: _jsx(UserListProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
153
160
  };
154
161
  const AppProviderWrapper = () => {
155
162
  return (_jsx(I18nextProvider, { i18n: i18n, defaultNS: "translation", children: _jsx(ApiConfigProvider, { children: _jsx(PluginProvider, { pluginStore: howlerPluginStore.pluginStore, children: _jsx(AppBarProvider, { children: _jsxs(MyAppProvider, { children: [_jsx(MyApp, {}), _jsx(Modal, {})] }) }) }) }) }));
@@ -173,19 +180,45 @@ const createRouter = () => createBrowserRouter([
173
180
  },
174
181
  {
175
182
  path: 'hits',
176
- element: _jsx(HitBrowser, {})
183
+ element: _jsx(RecordBrowser, {})
177
184
  },
178
185
  {
179
186
  path: 'search',
180
- element: _jsx(HitBrowser, {})
187
+ element: _jsx(RecordBrowser, {})
181
188
  },
182
189
  {
183
190
  path: 'hits/:id',
184
191
  element: _jsx(HitViewer, {})
185
192
  },
186
193
  {
187
- path: 'bundles/:id',
188
- element: _jsx(HitBrowser, {})
194
+ path: 'cases',
195
+ element: _jsx(Cases, {})
196
+ },
197
+ {
198
+ path: 'cases/:id',
199
+ element: _jsx(CaseViewer, {}),
200
+ children: [
201
+ {
202
+ index: true,
203
+ element: _jsx(CaseDashboard, {})
204
+ },
205
+ {
206
+ path: 'assets',
207
+ element: _jsx(CaseAssets, {})
208
+ },
209
+ {
210
+ path: 'timeline',
211
+ element: _jsx(CaseTimeline, {})
212
+ },
213
+ {
214
+ path: 'rules',
215
+ element: _jsx(CaseRules, {})
216
+ },
217
+ {
218
+ path: '*',
219
+ element: _jsx(ItemPage, {})
220
+ }
221
+ ]
189
222
  },
190
223
  {
191
224
  path: 'templates',
@@ -225,7 +258,7 @@ const createRouter = () => createBrowserRouter([
225
258
  },
226
259
  {
227
260
  path: 'views/:id',
228
- element: _jsx(HitBrowser, {})
261
+ element: _jsx(RecordBrowser, {})
229
262
  },
230
263
  {
231
264
  path: 'views/:id/edit',
@@ -1,6 +1,6 @@
1
1
  import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
2
2
  import type { WithMetadata } from '@cccsaurora/howler-ui/models/WithMetadata';
3
- declare const useMatchers: () => {
3
+ declare const useMatchers: (lazy?: boolean) => {
4
4
  getMatchingDossiers: (hit: WithMetadata<Hit>) => Promise<import("../../../models/entities/generated/Dossier").Dossier[]>;
5
5
  getMatchingOverview: (hit: WithMetadata<Hit>) => Promise<import("../../../models/entities/generated/Overview").Overview>;
6
6
  getMatchingTemplate: (hit: WithMetadata<Hit>) => Promise<import("../../../models/entities/generated/Template").Template>;
@@ -2,9 +2,9 @@
2
2
  import { has } from 'lodash-es';
3
3
  import { useCallback } from 'react';
4
4
  import { useContextSelector } from 'use-context-selector';
5
- import { HitContext } from '../providers/HitProvider';
6
- const useMatchers = () => {
7
- const getHit = useContextSelector(HitContext, ctx => ctx.getHit);
5
+ import { RecordContext } from '../providers/RecordProvider';
6
+ const useMatchers = (lazy = false) => {
7
+ const getRecord = useContextSelector(RecordContext, ctx => ctx.getRecord);
8
8
  const getMatchingTemplate = useCallback(async (hit) => {
9
9
  if (!hit) {
10
10
  return null;
@@ -12,15 +12,18 @@ const useMatchers = () => {
12
12
  if (has(hit, '__template')) {
13
13
  return hit.__template;
14
14
  }
15
+ if (lazy) {
16
+ return null;
17
+ }
15
18
  // This is a fallback in case metadata is not included. In most cases templates are shown, the template metadata
16
19
  // should also exist
17
20
  try {
18
- return (await getHit(hit.howler.id, true)).__template;
21
+ return (await getRecord(hit.howler.id, true)).__template;
19
22
  }
20
23
  catch (e) {
21
24
  return null;
22
25
  }
23
- }, [getHit]);
26
+ }, [getRecord, lazy]);
24
27
  const getMatchingOverview = useCallback(async (hit) => {
25
28
  if (!hit) {
26
29
  return null;
@@ -28,15 +31,18 @@ const useMatchers = () => {
28
31
  if (has(hit, '__overview')) {
29
32
  return hit.__overview;
30
33
  }
34
+ if (lazy) {
35
+ return null;
36
+ }
31
37
  // This is a fallback in case metadata is not included. In most cases templates are shown, the template metadata
32
38
  // should also exist
33
39
  try {
34
- return (await getHit(hit.howler.id, true)).__overview;
40
+ return (await getRecord(hit.howler.id, true)).__overview;
35
41
  }
36
42
  catch (e) {
37
43
  return null;
38
44
  }
39
- }, [getHit]);
45
+ }, [getRecord, lazy]);
40
46
  const getMatchingDossiers = useCallback(async (hit) => {
41
47
  if (!hit) {
42
48
  return null;
@@ -44,15 +50,18 @@ const useMatchers = () => {
44
50
  if (has(hit, '__dossiers')) {
45
51
  return hit.__dossiers;
46
52
  }
53
+ if (lazy) {
54
+ return null;
55
+ }
47
56
  // This is a fallback in case metadata is not included. In most cases templates are shown, the template metadata
48
57
  // should also exist
49
58
  try {
50
- return (await getHit(hit.howler.id, true)).__dossiers ?? [];
59
+ return (await getRecord(hit.howler.id, true)).__dossiers ?? [];
51
60
  }
52
61
  catch (e) {
53
62
  return [];
54
63
  }
55
- }, [getHit]);
64
+ }, [getRecord, lazy]);
56
65
  const getMatchingAnalytic = useCallback(async (hit) => {
57
66
  if (!hit) {
58
67
  return null;
@@ -60,14 +69,17 @@ const useMatchers = () => {
60
69
  if (has(hit, '__analytic')) {
61
70
  return hit.__analytic;
62
71
  }
72
+ if (lazy) {
73
+ return null;
74
+ }
63
75
  // This is a fallback in case metadata is not included.
64
76
  try {
65
- return (await getHit(hit.howler.id, true)).__analytic;
77
+ return (await getRecord(hit.howler.id, true)).__analytic;
66
78
  }
67
79
  catch (e) {
68
80
  return null;
69
81
  }
70
- }, [getHit]);
82
+ }, [getRecord, lazy]);
71
83
  return {
72
84
  getMatchingDossiers,
73
85
  getMatchingOverview,