@cccsaurora/howler-ui 2.18.0 → 2.19.0-cases.862

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 (342) 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 +52 -12
  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} +42 -42
  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} +190 -39
  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/403.d.ts +3 -0
  114. package/components/routes/403.js +10 -0
  115. package/components/routes/action/edit/ActionEditor.js +3 -3
  116. package/components/routes/action/useMyActionFunctions.js +4 -1
  117. package/components/routes/action/view/ActionDetails.js +6 -1
  118. package/components/routes/action/view/ActionSearch.js +5 -4
  119. package/components/routes/action/view/markdown/integrations.en.md.js +1 -1
  120. package/components/routes/action/view/markdown/integrations.fr.md.js +1 -1
  121. package/components/routes/advanced/QueryBuilder.js +1 -1
  122. package/components/routes/advanced/QueryEditor.js +3 -3
  123. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  124. package/components/routes/analytics/AnalyticDetails.js +2 -2
  125. package/components/routes/analytics/AnalyticSearch.js +1 -1
  126. package/components/routes/cases/CaseViewer.d.ts +2 -0
  127. package/components/routes/cases/CaseViewer.js +44 -0
  128. package/components/routes/cases/CaseViewer.test.d.ts +1 -0
  129. package/components/routes/cases/CaseViewer.test.js +133 -0
  130. package/components/routes/cases/Cases.d.ts +2 -0
  131. package/components/routes/cases/Cases.js +148 -0
  132. package/components/routes/cases/constants.d.ts +6 -0
  133. package/components/routes/cases/constants.js +6 -0
  134. package/components/routes/cases/detail/AlertPanel.d.ts +6 -0
  135. package/components/routes/cases/detail/AlertPanel.js +33 -0
  136. package/components/routes/cases/detail/CaseAssets.d.ts +11 -0
  137. package/components/routes/cases/detail/CaseAssets.js +104 -0
  138. package/components/routes/cases/detail/CaseAssets.test.d.ts +1 -0
  139. package/components/routes/cases/detail/CaseAssets.test.js +167 -0
  140. package/components/routes/cases/detail/CaseDashboard.d.ts +7 -0
  141. package/components/routes/cases/detail/CaseDashboard.js +66 -0
  142. package/components/routes/cases/detail/CaseDetails.d.ts +6 -0
  143. package/components/routes/cases/detail/CaseDetails.js +70 -0
  144. package/components/routes/cases/detail/CaseOverview.d.ts +7 -0
  145. package/components/routes/cases/detail/CaseOverview.js +43 -0
  146. package/components/routes/cases/detail/CaseRules.d.ts +7 -0
  147. package/components/routes/cases/detail/CaseRules.js +57 -0
  148. package/components/routes/cases/detail/CaseRules.test.d.ts +1 -0
  149. package/components/routes/cases/detail/CaseRules.test.js +221 -0
  150. package/components/routes/cases/detail/CaseSidebar.d.ts +8 -0
  151. package/components/routes/cases/detail/CaseSidebar.js +107 -0
  152. package/components/routes/cases/detail/CaseSidebar.test.d.ts +1 -0
  153. package/components/routes/cases/detail/CaseSidebar.test.js +266 -0
  154. package/components/routes/cases/detail/CaseTask.d.ts +11 -0
  155. package/components/routes/cases/detail/CaseTask.js +66 -0
  156. package/components/routes/cases/detail/CaseTimeline.d.ts +12 -0
  157. package/components/routes/cases/detail/CaseTimeline.js +106 -0
  158. package/components/routes/cases/detail/CaseTimeline.test.d.ts +1 -0
  159. package/components/routes/cases/detail/CaseTimeline.test.js +320 -0
  160. package/components/routes/cases/detail/CreateRuleDialog.d.ts +9 -0
  161. package/components/routes/cases/detail/CreateRuleDialog.js +163 -0
  162. package/components/routes/cases/detail/CreateRuleDialog.test.d.ts +1 -0
  163. package/components/routes/cases/detail/CreateRuleDialog.test.js +259 -0
  164. package/components/routes/cases/detail/ItemPage.d.ts +6 -0
  165. package/components/routes/cases/detail/ItemPage.js +95 -0
  166. package/components/routes/cases/detail/RelatedCasePanel.d.ts +6 -0
  167. package/components/routes/cases/detail/RelatedCasePanel.js +34 -0
  168. package/components/routes/cases/detail/TaskPanel.d.ts +7 -0
  169. package/components/routes/cases/detail/TaskPanel.js +52 -0
  170. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +11 -0
  171. package/components/routes/cases/detail/aggregates/CaseAggregate.js +24 -0
  172. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +6 -0
  173. package/components/routes/cases/detail/aggregates/SourceAggregate.js +26 -0
  174. package/components/routes/cases/detail/assets/Asset.d.ts +14 -0
  175. package/components/routes/cases/detail/assets/Asset.js +12 -0
  176. package/components/routes/cases/detail/assets/Asset.test.d.ts +1 -0
  177. package/components/routes/cases/detail/assets/Asset.test.js +72 -0
  178. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +20 -0
  179. package/components/routes/cases/detail/sidebar/CaseFolder.js +83 -0
  180. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +1 -0
  181. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +295 -0
  182. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +34 -0
  183. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +103 -0
  184. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +1 -0
  185. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +363 -0
  186. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +25 -0
  187. package/components/routes/cases/detail/sidebar/FolderEntry.js +88 -0
  188. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +1 -0
  189. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +206 -0
  190. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +5 -0
  191. package/components/routes/cases/detail/sidebar/RootDropZone.js +33 -0
  192. package/components/routes/cases/detail/sidebar/types.d.ts +9 -0
  193. package/components/routes/cases/detail/sidebar/utils.d.ts +3 -0
  194. package/components/routes/cases/detail/sidebar/utils.js +29 -0
  195. package/components/routes/cases/detail/sidebar/utils.test.d.ts +1 -0
  196. package/components/routes/cases/detail/sidebar/utils.test.js +82 -0
  197. package/components/routes/cases/hooks/useCase.d.ts +13 -0
  198. package/components/routes/cases/hooks/useCase.js +69 -0
  199. package/components/routes/cases/hooks/useCase.test.d.ts +1 -0
  200. package/components/routes/cases/hooks/useCase.test.js +141 -0
  201. package/components/routes/cases/modals/AddToCaseModal.d.ts +7 -0
  202. package/components/routes/cases/modals/AddToCaseModal.js +59 -0
  203. package/components/routes/cases/modals/AddToCaseModal.test.d.ts +1 -0
  204. package/components/routes/cases/modals/AddToCaseModal.test.js +313 -0
  205. package/components/routes/cases/modals/CaseRecordRow.d.ts +9 -0
  206. package/components/routes/cases/modals/CaseRecordRow.js +15 -0
  207. package/components/routes/cases/modals/CreateCaseModal.d.ts +7 -0
  208. package/components/routes/cases/modals/CreateCaseModal.js +55 -0
  209. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +1 -0
  210. package/components/routes/cases/modals/CreateCaseModal.test.js +358 -0
  211. package/components/routes/cases/modals/RenameItemModal.d.ts +9 -0
  212. package/components/routes/cases/modals/RenameItemModal.js +48 -0
  213. package/components/routes/cases/modals/ResolveModal.d.ts +7 -0
  214. package/components/routes/cases/modals/ResolveModal.js +115 -0
  215. package/components/routes/cases/modals/ResolveModal.test.d.ts +1 -0
  216. package/components/routes/cases/modals/ResolveModal.test.js +394 -0
  217. package/components/routes/cases/modals/hooks.d.ts +7 -0
  218. package/components/routes/cases/modals/hooks.js +44 -0
  219. package/components/routes/cases/modals/types.d.ts +5 -0
  220. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +6 -0
  221. package/components/routes/cases/search/CaseAssigneeFilter.js +33 -0
  222. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +1 -0
  223. package/components/routes/cases/search/CaseAssigneeFilter.test.js +127 -0
  224. package/components/routes/cases/search/CaseDateFilter.d.ts +13 -0
  225. package/components/routes/cases/search/CaseDateFilter.js +26 -0
  226. package/components/routes/cases/search/CaseDateFilter.test.d.ts +1 -0
  227. package/components/routes/cases/search/CaseDateFilter.test.js +115 -0
  228. package/components/routes/cases/search/CaseStatusFilter.d.ts +6 -0
  229. package/components/routes/cases/search/CaseStatusFilter.js +13 -0
  230. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +1 -0
  231. package/components/routes/cases/search/CaseStatusFilter.test.js +86 -0
  232. package/components/routes/dossiers/DossierEditor.js +2 -2
  233. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  234. package/components/routes/help/ActionIntroductionDocumentation.js +1 -1
  235. package/components/routes/help/ApiDocumentation.js +1 -1
  236. package/components/routes/help/HitBannerDocumentation.js +1 -0
  237. package/components/routes/help/HitDocumentation.js +1 -3
  238. package/components/routes/help/markdown/en/retention.md.js +1 -1
  239. package/components/routes/help/markdown/fr/retention.md.js +1 -1
  240. package/components/routes/hits/search/InformationPane.d.ts +1 -0
  241. package/components/routes/hits/search/InformationPane.js +50 -63
  242. package/components/routes/hits/search/LayoutSettings.js +3 -3
  243. package/components/routes/hits/search/QuerySettings.js +2 -1
  244. package/components/routes/hits/search/QuerySettings.test.js +14 -9
  245. package/components/routes/hits/search/{HitBrowser.js → RecordBrowser.js} +9 -9
  246. package/components/routes/hits/search/{HitQuery.d.ts → RecordQuery.d.ts} +2 -2
  247. package/components/routes/hits/search/{HitQuery.js → RecordQuery.js} +6 -6
  248. package/components/routes/hits/search/SearchPane.js +26 -49
  249. package/components/routes/hits/search/ViewLink.js +3 -3
  250. package/components/routes/hits/search/ViewLink.test.js +8 -8
  251. package/components/routes/hits/search/grid/AddColumnModal.js +5 -4
  252. package/components/routes/hits/search/grid/EnhancedCell.d.ts +2 -1
  253. package/components/routes/hits/search/grid/EnhancedCell.js +2 -2
  254. package/components/routes/hits/search/grid/HitGrid.js +20 -18
  255. package/components/routes/hits/search/grid/{HitRow.d.ts → RecordRow.d.ts} +3 -2
  256. package/components/routes/hits/search/grid/{HitRow.js → RecordRow.js} +10 -8
  257. package/components/routes/hits/search/shared/IndexPicker.d.ts +2 -0
  258. package/components/routes/hits/search/shared/IndexPicker.js +20 -0
  259. package/components/routes/hits/view/HitViewer.js +12 -13
  260. package/components/routes/home/AddNewCard.js +1 -1
  261. package/components/routes/home/ViewCard.js +47 -41
  262. package/components/routes/observables/ObservableViewer.d.ts +7 -0
  263. package/components/routes/observables/ObservableViewer.js +27 -0
  264. package/components/routes/overviews/OverviewViewer.js +2 -2
  265. package/components/routes/overviews/template/en.md.js +1 -1
  266. package/components/routes/overviews/template/fr.md.js +1 -1
  267. package/components/routes/views/ViewComposer.js +46 -19
  268. package/locales/en/translation.json +125 -3
  269. package/locales/fr/translation.json +123 -3
  270. package/models/WithMetadata.d.ts +2 -1
  271. package/models/entities/generated/ApiType.d.ts +1 -1
  272. package/models/entities/generated/AttachmentsFile.d.ts +12 -0
  273. package/models/entities/generated/Case.d.ts +28 -0
  274. package/models/entities/generated/DestinationOriginal.d.ts +19 -0
  275. package/models/entities/generated/EmailAttachment.d.ts +8 -0
  276. package/models/entities/generated/EmailParent.d.ts +19 -0
  277. package/models/entities/generated/Enrichments.d.ts +7 -0
  278. package/models/entities/generated/EnrichmentsIndicator.d.ts +21 -0
  279. package/models/entities/generated/Hit.d.ts +1 -0
  280. package/models/entities/generated/Howler.d.ts +0 -5
  281. package/models/entities/generated/HttpResponse.d.ts +11 -0
  282. package/models/entities/generated/Item.d.ts +9 -0
  283. package/models/entities/generated/Observable.d.ts +85 -0
  284. package/models/entities/generated/ObservableCloud.d.ts +20 -0
  285. package/models/entities/generated/ObservableDestination.d.ts +23 -0
  286. package/models/entities/generated/ObservableEmail.d.ts +30 -0
  287. package/models/entities/generated/ObservableFile.d.ts +36 -0
  288. package/models/entities/generated/ObservableHowler.d.ts +42 -0
  289. package/models/entities/generated/ObservableHttp.d.ts +11 -0
  290. package/models/entities/generated/ObservableObserver.d.ts +21 -0
  291. package/models/entities/generated/ObservableOrganization.d.ts +7 -0
  292. package/models/entities/generated/ObservableProcess.d.ts +34 -0
  293. package/models/entities/generated/ObservableSource.d.ts +23 -0
  294. package/models/entities/generated/ObservableThreat.d.ts +21 -0
  295. package/models/entities/generated/ObservableTls.d.ts +12 -0
  296. package/models/entities/generated/ObserverIngress.d.ts +9 -0
  297. package/models/entities/generated/Rule.d.ts +6 -9
  298. package/models/entities/generated/Task.d.ts +10 -0
  299. package/models/entities/generated/Threat.d.ts +2 -2
  300. package/models/entities/generated/{Enrichment.d.ts → ThreatEnrichment.d.ts} +1 -1
  301. package/models/entities/generated/View.d.ts +1 -0
  302. package/models/socket/CaseUpdate.d.ts +5 -0
  303. package/models/socket/ViewersUpdate.d.ts +4 -0
  304. package/package.json +23 -8
  305. package/plugins/clue/components/ClueTypography.js +2 -2
  306. package/plugins/clue/utils.d.ts +2 -1
  307. package/tests/mocks.d.ts +11 -1
  308. package/tests/mocks.js +12 -7
  309. package/tests/server-handlers.js +6 -1
  310. package/tests/utils.d.ts +4 -0
  311. package/tests/utils.js +20 -0
  312. package/utils/constants.d.ts +4 -3
  313. package/utils/constants.js +6 -0
  314. package/utils/hitFunctions.d.ts +2 -1
  315. package/utils/hitFunctions.js +4 -4
  316. package/utils/menuUtils.js +1 -1
  317. package/utils/socketUtils.d.ts +14 -0
  318. package/utils/socketUtils.js +17 -1
  319. package/utils/socketUtils.test.d.ts +1 -0
  320. package/utils/socketUtils.test.js +59 -0
  321. package/utils/typeUtils.d.ts +7 -0
  322. package/utils/typeUtils.js +27 -0
  323. package/utils/viewUtils.js +3 -0
  324. package/components/app/providers/HitProvider.d.ts +0 -22
  325. package/components/elements/display/icons/BundleButton.d.ts +0 -6
  326. package/components/elements/display/icons/BundleButton.js +0 -32
  327. package/components/elements/hit/HitRelated.d.ts +0 -6
  328. package/components/elements/hit/HitRelated.js +0 -7
  329. package/components/routes/help/BundleDocumentation.d.ts +0 -3
  330. package/components/routes/help/BundleDocumentation.js +0 -12
  331. package/components/routes/help/markdown/en/bundles.md.js +0 -1
  332. package/components/routes/help/markdown/fr/bundles.md.js +0 -1
  333. package/components/routes/hits/search/BundleParentMenu.d.ts +0 -6
  334. package/components/routes/hits/search/BundleParentMenu.js +0 -32
  335. package/components/routes/hits/search/BundleScroller.d.ts +0 -2
  336. package/components/routes/hits/search/BundleScroller.js +0 -6
  337. package/components/routes/hits/search/HitContextMenu.js +0 -229
  338. /package/{components/app/providers/HitSearchProvider.test.d.ts → api/socket/viewers.test.d.ts} +0 -0
  339. /package/components/{routes/hits/search/HitContextMenu.test.d.ts → app/providers/RecordSearchProvider.test.d.ts} +0 -0
  340. /package/components/{routes/overviews/OverviewEditor.d.ts → elements/MarkdownEditor.d.ts} +0 -0
  341. /package/components/elements/hit/{HitDetails.d.ts → related/RelatedRecords.d.ts} +0 -0
  342. /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);
@@ -13,6 +13,7 @@ import useMyTheme from '@cccsaurora/howler-ui/components/hooks/useMyTheme';
13
13
  import useMyUser from '@cccsaurora/howler-ui/components/hooks/useMyUser';
14
14
  import LoginScreen from '@cccsaurora/howler-ui/components/logins/Login';
15
15
  import useLogin from '@cccsaurora/howler-ui/components/logins/hooks/useLogin';
16
+ import PermissionDeniedPage from '@cccsaurora/howler-ui/components/routes/403';
16
17
  import NotFoundPage from '@cccsaurora/howler-ui/components/routes/404';
17
18
  import ErrorBoundary from '@cccsaurora/howler-ui/components/routes/ErrorBoundary';
18
19
  import Logout from '@cccsaurora/howler-ui/components/routes/Logout';
@@ -25,6 +26,13 @@ import UserSearchProvider from '@cccsaurora/howler-ui/components/routes/admin/us
25
26
  import QueryBuilder from '@cccsaurora/howler-ui/components/routes/advanced/QueryBuilder';
26
27
  import AnalyticDetails from '@cccsaurora/howler-ui/components/routes/analytics/AnalyticDetails';
27
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';
28
36
  import DossierEditor from '@cccsaurora/howler-ui/components/routes/dossiers/DossierEditor';
29
37
  import Dossiers from '@cccsaurora/howler-ui/components/routes/dossiers/Dossiers';
30
38
  import ActionDocumentation from '@cccsaurora/howler-ui/components/routes/help/ActionDocumentation';
@@ -39,7 +47,7 @@ import RetentionDocumentation from '@cccsaurora/howler-ui/components/routes/help
39
47
  import SearchDocumentation from '@cccsaurora/howler-ui/components/routes/help/SearchDocumentation';
40
48
  import TemplateDocumentation from '@cccsaurora/howler-ui/components/routes/help/TemplateDocumentation';
41
49
  import ViewDocumentation from '@cccsaurora/howler-ui/components/routes/help/ViewDocumentation';
42
- import HitBrowser from '@cccsaurora/howler-ui/components/routes/hits/search/HitBrowser';
50
+ import RecordBrowser from '@cccsaurora/howler-ui/components/routes/hits/search/RecordBrowser';
43
51
  import HitViewer from '@cccsaurora/howler-ui/components/routes/hits/view/HitViewer';
44
52
  import Home from '@cccsaurora/howler-ui/components/routes/home';
45
53
  import OverviewViewer from '@cccsaurora/howler-ui/components/routes/overviews/OverviewViewer';
@@ -71,11 +79,11 @@ import AvatarProvider from './providers/AvatarProvider';
71
79
  import CustomPluginProvider from './providers/CustomPluginProvider';
72
80
  import FavouriteProvider from './providers/FavouritesProvider';
73
81
  import FieldProvider from './providers/FieldProvider';
74
- import HitProvider from './providers/HitProvider';
75
82
  import LocalStorageProvider from './providers/LocalStorageProvider';
76
83
  import ModalProvider from './providers/ModalProvider';
77
84
  import OverviewProvider from './providers/OverviewProvider';
78
85
  import ParameterProvider from './providers/ParameterProvider';
86
+ import RecordProvider from './providers/RecordProvider';
79
87
  import SocketProvider from './providers/SocketProvider';
80
88
  import UserListProvider from './providers/UserListProvider';
81
89
  import ViewProvider from './providers/ViewProvider';
@@ -84,12 +92,12 @@ dayjs.extend(duration);
84
92
  dayjs.extend(relativeTime);
85
93
  dayjs.extend(localizedFormat);
86
94
  loader.config({ monaco });
87
- const RoleRoute = ({ role }) => {
95
+ const RoleRoute = ({ roles }) => {
88
96
  const appUser = useAppUser();
89
- if (appUser.user?.roles?.includes(role)) {
97
+ if (roles.some((role) => appUser.user?.roles?.includes(role))) {
90
98
  return _jsx(Outlet, {});
91
99
  }
92
- return _jsx(NotFoundPage, {});
100
+ return _jsx(PermissionDeniedPage, {});
93
101
  };
94
102
  // Your application's initialization flow.
95
103
  const MyApp = () => {
@@ -148,7 +156,7 @@ const MyAppProvider = ({ children }) => {
148
156
  const mySitemap = useMySitemap();
149
157
  const myUser = useMyUser();
150
158
  const mySearch = useMySearch();
151
- 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 }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
152
160
  };
153
161
  const AppProviderWrapper = () => {
154
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, {})] }) }) }) }) }));
@@ -172,19 +180,45 @@ const createRouter = () => createBrowserRouter([
172
180
  },
173
181
  {
174
182
  path: 'hits',
175
- element: _jsx(HitBrowser, {})
183
+ element: _jsx(RecordBrowser, {})
176
184
  },
177
185
  {
178
186
  path: 'search',
179
- element: _jsx(HitBrowser, {})
187
+ element: _jsx(RecordBrowser, {})
180
188
  },
181
189
  {
182
190
  path: 'hits/:id',
183
191
  element: _jsx(HitViewer, {})
184
192
  },
185
193
  {
186
- path: 'bundles/:id',
187
- 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
+ ]
188
222
  },
189
223
  {
190
224
  path: 'templates',
@@ -224,7 +258,7 @@ const createRouter = () => createBrowserRouter([
224
258
  },
225
259
  {
226
260
  path: 'views/:id',
227
- element: _jsx(HitBrowser, {})
261
+ element: _jsx(RecordBrowser, {})
228
262
  },
229
263
  {
230
264
  path: 'views/:id/edit',
@@ -304,7 +338,13 @@ const createRouter = () => createBrowserRouter([
304
338
  },
305
339
  {
306
340
  path: 'action',
307
- element: _jsx(RoleRoute, { role: "automation_basic" }),
341
+ element: (_jsx(RoleRoute, { roles: [
342
+ 'admin',
343
+ 'automation_basic',
344
+ 'automation_advanced',
345
+ 'actionrunner_basic',
346
+ 'actionrunner_advanced'
347
+ ] })),
308
348
  children: [
309
349
  {
310
350
  index: true,
@@ -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,