@cccsaurora/howler-ui 2.19.0-dev.1181 → 2.19.0-dev.1264

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 (419) hide show
  1. package/api/analytic/index.d.ts +2 -3
  2. package/api/analytic/index.js +1 -2
  3. package/api/index.d.ts +4 -0
  4. package/api/index.js +10 -2
  5. package/api/search/case.d.ts +4 -0
  6. package/api/search/case.js +8 -0
  7. package/api/search/facet/hit.d.ts +1 -3
  8. package/api/search/facet/index.d.ts +3 -1
  9. package/api/search/index.d.ts +3 -1
  10. package/api/search/index.js +2 -1
  11. package/api/socket/index.d.ts +3 -0
  12. package/api/socket/index.js +6 -0
  13. package/api/socket/viewers.d.ts +2 -0
  14. package/api/socket/viewers.js +8 -0
  15. package/api/socket/viewers.test.js +44 -0
  16. package/api/v2/case/index.d.ts +9 -0
  17. package/api/v2/case/index.js +21 -0
  18. package/api/v2/case/items.d.ts +9 -0
  19. package/api/v2/case/items.js +19 -0
  20. package/api/v2/case/rules.d.ts +6 -0
  21. package/api/v2/case/rules.js +18 -0
  22. package/api/v2/fuzzy.d.ts +17 -0
  23. package/api/v2/fuzzy.js +11 -0
  24. package/api/v2/index.d.ts +5 -0
  25. package/api/v2/index.js +7 -0
  26. package/api/v2/search/facet.d.ts +3 -0
  27. package/api/v2/search/facet.js +12 -0
  28. package/api/v2/search/index.d.ts +6 -0
  29. package/api/v2/search/index.js +24 -0
  30. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  31. package/components/app/App.js +49 -11
  32. package/components/app/hooks/useMatchers.d.ts +1 -1
  33. package/components/app/hooks/useMatchers.js +23 -11
  34. package/components/app/hooks/useMatchers.test.js +22 -22
  35. package/components/app/hooks/useTitle.js +5 -5
  36. package/components/app/providers/FavouritesProvider.js +2 -2
  37. package/components/app/providers/GridColumnsProvider.js +2 -2
  38. package/components/app/providers/GridColumnsProvider.test.js +3 -3
  39. package/components/app/providers/ModalProvider.d.ts +1 -0
  40. package/components/app/providers/ParameterProvider.d.ts +25 -3
  41. package/components/app/providers/ParameterProvider.js +163 -226
  42. package/components/app/providers/ParameterProvider.test.js +358 -94
  43. package/components/app/providers/RecordProvider.d.ts +23 -0
  44. package/components/app/providers/{HitProvider.js → RecordProvider.js} +46 -42
  45. package/components/app/providers/{HitSearchProvider.d.ts → RecordSearchProvider.d.ts} +6 -6
  46. package/components/app/providers/{HitSearchProvider.js → RecordSearchProvider.js} +13 -19
  47. package/components/app/providers/{HitSearchProvider.test.js → RecordSearchProvider.test.js} +52 -71
  48. package/components/app/providers/SearchResponseProvider.d.ts +4 -4
  49. package/components/app/providers/SearchResponseProvider.js +1 -1
  50. package/components/app/providers/SocketProvider.d.ts +11 -2
  51. package/components/app/providers/SocketProvider.js +18 -5
  52. package/components/app/providers/UserListProvider.js +28 -8
  53. package/components/app/providers/UserListProvider.test.js +150 -0
  54. package/components/elements/ContextMenu.d.ts +56 -0
  55. package/components/elements/ContextMenu.js +109 -0
  56. package/components/elements/ContextMenu.test.d.ts +1 -0
  57. package/components/elements/ContextMenu.test.js +215 -0
  58. package/components/{routes/overviews/OverviewEditor.js → elements/MarkdownEditor.js} +3 -3
  59. package/components/elements/ObjectDetails.d.ts +6 -0
  60. package/components/elements/{hit/HitDetails.js → ObjectDetails.js} +17 -17
  61. package/components/elements/PluginChip.d.ts +1 -1
  62. package/components/elements/PluginChip.js +0 -1
  63. package/components/elements/PluginTypography.d.ts +2 -1
  64. package/components/elements/PluginTypography.js +3 -2
  65. package/components/elements/UserList.d.ts +5 -2
  66. package/components/elements/UserList.js +33 -16
  67. package/components/elements/UserList.test.d.ts +1 -0
  68. package/components/elements/UserList.test.js +122 -0
  69. package/components/elements/addons/lists/TuiListElement.d.ts +1 -1
  70. package/components/elements/addons/lists/TuiListElement.js +0 -1
  71. package/components/elements/addons/search/SearchTotal.js +1 -1
  72. package/components/elements/addons/search/SearchTotal.test.js +2 -2
  73. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  74. package/components/elements/case/CaseCard.d.ts +12 -0
  75. package/components/elements/case/CaseCard.js +43 -0
  76. package/components/elements/case/CasePreview.d.ts +6 -0
  77. package/components/elements/case/CasePreview.js +17 -0
  78. package/components/elements/case/StatusIcon.d.ts +5 -0
  79. package/components/elements/case/StatusIcon.js +13 -0
  80. package/components/elements/display/ChipPopper.d.ts +1 -1
  81. package/components/elements/display/ChipPopper.js +6 -5
  82. package/components/elements/display/Classification.js +1 -1
  83. package/components/elements/display/ClassificationChip.d.ts +14 -0
  84. package/components/elements/display/ClassificationChip.js +36 -0
  85. package/components/elements/display/HowlerCard.js +1 -1
  86. package/components/elements/display/HowlerCard.test.js +5 -9
  87. package/components/elements/display/ItemManager.js +2 -2
  88. package/components/elements/display/Modal.js +2 -0
  89. package/components/elements/display/QueryResultText.d.ts +1 -0
  90. package/components/elements/display/QueryResultText.js +2 -2
  91. package/components/elements/event/EventCard.d.ts +6 -0
  92. package/components/elements/event/EventCard.js +22 -0
  93. package/components/elements/event/EventPreview.d.ts +6 -0
  94. package/components/elements/event/EventPreview.js +12 -0
  95. package/components/elements/hit/HitActions.js +4 -4
  96. package/components/elements/hit/HitBanner.d.ts +1 -0
  97. package/components/elements/hit/HitBanner.js +31 -49
  98. package/components/elements/hit/HitCard.d.ts +4 -0
  99. package/components/elements/hit/HitCard.js +7 -7
  100. package/components/elements/hit/HitLabels.js +2 -2
  101. package/components/elements/hit/HitLabels.test.js +2 -2
  102. package/components/elements/hit/HitOutline.d.ts +1 -0
  103. package/components/elements/hit/HitOutline.js +3 -3
  104. package/components/elements/hit/{HitQuickSearch.d.ts → HitPreview.d.ts} +3 -3
  105. package/components/elements/hit/{HitQuickSearch.js → HitPreview.js} +10 -4
  106. package/components/elements/hit/HitSummary.d.ts +2 -1
  107. package/components/elements/hit/HitSummary.js +6 -5
  108. package/components/elements/hit/aggregate/HitGraph.js +8 -8
  109. package/components/elements/hit/elements/AnalyticLink.d.ts +9 -0
  110. package/components/elements/hit/elements/AnalyticLink.js +22 -0
  111. package/components/elements/hit/elements/{HitUsers.d.ts → Assigned.d.ts} +3 -4
  112. package/components/elements/hit/elements/Assigned.js +36 -0
  113. package/components/elements/hit/elements/Assigned.test.d.ts +1 -0
  114. package/components/elements/hit/elements/Assigned.test.js +65 -0
  115. package/components/elements/hit/grid/AddColumnModal.js +5 -4
  116. package/components/elements/hit/grid/EnhancedCell.d.ts +2 -1
  117. package/components/elements/hit/grid/EnhancedCell.js +2 -2
  118. package/components/elements/hit/grid/{HitRow.d.ts → RecordRow.d.ts} +3 -2
  119. package/components/elements/hit/grid/{HitRow.js → RecordRow.js} +11 -9
  120. package/components/elements/hit/grid/{HitTable.d.ts → RecordTable.d.ts} +5 -4
  121. package/components/elements/hit/grid/{HitTable.js → RecordTable.js} +13 -11
  122. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  123. package/components/elements/hit/related/RelatedRecords.js +63 -0
  124. package/components/elements/{hit/HitComments.d.ts → record/RecordComments.d.ts} +5 -4
  125. package/components/elements/{hit/HitComments.js → record/RecordComments.js} +29 -28
  126. package/components/elements/{hit/HitContextMenu.d.ts → record/RecordContextMenu.d.ts} +3 -3
  127. package/components/elements/record/RecordContextMenu.js +268 -0
  128. package/components/elements/record/RecordContextMenu.test.d.ts +1 -0
  129. package/components/elements/{hit/HitContextMenu.test.js → record/RecordContextMenu.test.js} +98 -43
  130. package/components/elements/record/RecordRelated.d.ts +7 -0
  131. package/components/elements/record/RecordRelated.js +34 -0
  132. package/components/elements/{hit/HitWorklog.d.ts → record/RecordWorklog.d.ts} +4 -3
  133. package/components/elements/{hit/HitWorklog.js → record/RecordWorklog.js} +15 -13
  134. package/components/elements/search/FuzzySearchBar.d.ts +7 -0
  135. package/components/elements/search/FuzzySearchBar.js +33 -0
  136. package/components/elements/search/FuzzySearchBar.test.d.ts +1 -0
  137. package/components/elements/search/FuzzySearchBar.test.js +87 -0
  138. package/components/elements/view/ViewTitle.d.ts +1 -0
  139. package/components/elements/view/ViewTitle.js +9 -2
  140. package/components/hooks/useHitActions.d.ts +1 -1
  141. package/components/hooks/useHitActions.js +4 -4
  142. package/components/hooks/useMyPreferences.js +10 -1
  143. package/components/hooks/useMySearch.js +2 -2
  144. package/components/hooks/useMySitemap.js +4 -1
  145. package/components/hooks/useMyTheme.js +9 -2
  146. package/components/hooks/{useHitSelection.d.ts → useRecordSelection.d.ts} +2 -2
  147. package/components/hooks/{useHitSelection.js → useRecordSelection.js} +12 -33
  148. package/components/hooks/useRelatedRecords.d.ts +13 -0
  149. package/components/hooks/useRelatedRecords.js +32 -0
  150. package/components/routes/action/edit/ActionEditor.js +2 -2
  151. package/components/routes/action/view/ActionSearch.js +1 -1
  152. package/components/routes/advanced/QueryBuilder.js +4 -27
  153. package/components/routes/advanced/QueryEditor.js +3 -3
  154. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  155. package/components/routes/analytics/AnalyticDetails.js +6 -54
  156. package/components/routes/analytics/AnalyticSearch.js +9 -18
  157. package/components/routes/cases/CaseViewer.d.ts +2 -0
  158. package/components/routes/cases/CaseViewer.js +44 -0
  159. package/components/routes/cases/CaseViewer.test.d.ts +1 -0
  160. package/components/routes/cases/CaseViewer.test.js +133 -0
  161. package/components/routes/cases/Cases.d.ts +2 -0
  162. package/components/routes/cases/Cases.js +140 -0
  163. package/components/routes/cases/constants.d.ts +6 -0
  164. package/components/routes/cases/constants.js +6 -0
  165. package/components/routes/cases/detail/AlertPanel.d.ts +6 -0
  166. package/components/routes/cases/detail/AlertPanel.js +33 -0
  167. package/components/routes/cases/detail/AlertPanel.test.d.ts +1 -0
  168. package/components/routes/cases/detail/AlertPanel.test.js +107 -0
  169. package/components/routes/cases/detail/CaseDashboard.d.ts +7 -0
  170. package/components/routes/cases/detail/CaseDashboard.js +66 -0
  171. package/components/routes/cases/detail/CaseDashboard.test.d.ts +1 -0
  172. package/components/routes/cases/detail/CaseDashboard.test.js +218 -0
  173. package/components/routes/cases/detail/CaseDetails.d.ts +6 -0
  174. package/components/routes/cases/detail/CaseDetails.js +79 -0
  175. package/components/routes/cases/detail/CaseDetails.test.d.ts +1 -0
  176. package/components/routes/cases/detail/CaseDetails.test.js +145 -0
  177. package/components/routes/cases/detail/CaseObservables.d.ts +6 -0
  178. package/components/routes/cases/detail/CaseObservables.js +142 -0
  179. package/components/routes/cases/detail/CaseObservables.test.d.ts +1 -0
  180. package/components/routes/cases/detail/CaseObservables.test.js +169 -0
  181. package/components/routes/cases/detail/CaseOverview.d.ts +7 -0
  182. package/components/routes/cases/detail/CaseOverview.js +43 -0
  183. package/components/routes/cases/detail/CaseRules.d.ts +7 -0
  184. package/components/routes/cases/detail/CaseRules.js +55 -0
  185. package/components/routes/cases/detail/CaseRules.test.d.ts +1 -0
  186. package/components/routes/cases/detail/CaseRules.test.js +238 -0
  187. package/components/routes/cases/detail/CaseSearch.d.ts +3 -0
  188. package/components/routes/cases/detail/CaseSearch.js +78 -0
  189. package/components/routes/cases/detail/CaseSearch.test.d.ts +1 -0
  190. package/components/routes/cases/detail/CaseSearch.test.js +154 -0
  191. package/components/routes/cases/detail/CaseSidebar.d.ts +8 -0
  192. package/components/routes/cases/detail/CaseSidebar.js +147 -0
  193. package/components/routes/cases/detail/CaseSidebar.test.d.ts +1 -0
  194. package/components/routes/cases/detail/CaseSidebar.test.js +155 -0
  195. package/components/routes/cases/detail/CaseTask.d.ts +14 -0
  196. package/components/routes/cases/detail/CaseTask.js +71 -0
  197. package/components/routes/cases/detail/CaseTask.test.d.ts +1 -0
  198. package/components/routes/cases/detail/CaseTask.test.js +143 -0
  199. package/components/routes/cases/detail/CaseTimeline.d.ts +12 -0
  200. package/components/routes/cases/detail/CaseTimeline.js +106 -0
  201. package/components/routes/cases/detail/CaseTimeline.test.d.ts +1 -0
  202. package/components/routes/cases/detail/CaseTimeline.test.js +320 -0
  203. package/components/routes/cases/detail/CreateRuleDialog.d.ts +9 -0
  204. package/components/routes/cases/detail/CreateRuleDialog.js +145 -0
  205. package/components/routes/cases/detail/CreateRuleDialog.test.d.ts +1 -0
  206. package/components/routes/cases/detail/CreateRuleDialog.test.js +284 -0
  207. package/components/routes/cases/detail/ItemPage.d.ts +6 -0
  208. package/components/routes/cases/detail/ItemPage.js +100 -0
  209. package/components/routes/cases/detail/ItemPage.test.d.ts +1 -0
  210. package/components/routes/cases/detail/ItemPage.test.js +238 -0
  211. package/components/routes/cases/detail/MarkdownPage.d.ts +8 -0
  212. package/components/routes/cases/detail/MarkdownPage.js +63 -0
  213. package/components/routes/cases/detail/MarkdownPage.test.d.ts +1 -0
  214. package/components/routes/cases/detail/MarkdownPage.test.js +116 -0
  215. package/components/routes/cases/detail/RelatedCasePanel.d.ts +6 -0
  216. package/components/routes/cases/detail/RelatedCasePanel.js +34 -0
  217. package/components/routes/cases/detail/RelatedCasePanel.test.d.ts +1 -0
  218. package/components/routes/cases/detail/RelatedCasePanel.test.js +115 -0
  219. package/components/routes/cases/detail/TaskPanel.d.ts +7 -0
  220. package/components/routes/cases/detail/TaskPanel.js +95 -0
  221. package/components/routes/cases/detail/TaskPanel.test.d.ts +1 -0
  222. package/components/routes/cases/detail/TaskPanel.test.js +145 -0
  223. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +11 -0
  224. package/components/routes/cases/detail/aggregates/CaseAggregate.js +24 -0
  225. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +6 -0
  226. package/components/routes/cases/detail/aggregates/SourceAggregate.js +26 -0
  227. package/components/routes/cases/detail/observables/Observable.d.ts +8 -0
  228. package/components/routes/cases/detail/observables/Observable.js +13 -0
  229. package/components/routes/cases/detail/observables/Observable.test.d.ts +1 -0
  230. package/components/routes/cases/detail/observables/Observable.test.js +72 -0
  231. package/components/routes/cases/detail/observables/ObservableTable.d.ts +7 -0
  232. package/components/routes/cases/detail/observables/ObservableTable.js +61 -0
  233. package/components/routes/cases/detail/observables/ObservableTable.test.d.ts +1 -0
  234. package/components/routes/cases/detail/observables/ObservableTable.test.js +85 -0
  235. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +22 -0
  236. package/components/routes/cases/detail/sidebar/CaseFolder.js +105 -0
  237. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +1 -0
  238. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +98 -0
  239. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +32 -0
  240. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +99 -0
  241. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +1 -0
  242. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +117 -0
  243. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +25 -0
  244. package/components/routes/cases/detail/sidebar/FolderEntry.js +89 -0
  245. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +1 -0
  246. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +81 -0
  247. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +5 -0
  248. package/components/routes/cases/detail/sidebar/RootDropZone.js +33 -0
  249. package/components/routes/cases/detail/sidebar/types.d.ts +9 -0
  250. package/components/routes/cases/detail/sidebar/utils.d.ts +10 -0
  251. package/components/routes/cases/detail/sidebar/utils.js +51 -0
  252. package/components/routes/cases/detail/sidebar/utils.test.d.ts +1 -0
  253. package/components/routes/cases/detail/sidebar/utils.test.js +82 -0
  254. package/components/routes/cases/detail/types.d.ts +24 -0
  255. package/components/routes/cases/detail/utils.d.ts +29 -0
  256. package/components/routes/cases/detail/utils.js +114 -0
  257. package/components/routes/cases/detail/utils.test.d.ts +1 -0
  258. package/components/routes/cases/detail/utils.test.js +144 -0
  259. package/components/routes/cases/hooks/useCase.d.ts +13 -0
  260. package/components/routes/cases/hooks/useCase.js +69 -0
  261. package/components/routes/cases/hooks/useCase.test.d.ts +1 -0
  262. package/components/routes/cases/hooks/useCase.test.js +141 -0
  263. package/components/routes/cases/modals/AddRecordToCaseModal.d.ts +7 -0
  264. package/components/routes/cases/modals/AddRecordToCaseModal.js +57 -0
  265. package/components/routes/cases/modals/AddRecordToCaseModal.test.d.ts +1 -0
  266. package/components/routes/cases/modals/AddRecordToCaseModal.test.js +309 -0
  267. package/components/routes/cases/modals/AddToCaseModal.d.ts +9 -0
  268. package/components/routes/cases/modals/AddToCaseModal.js +72 -0
  269. package/components/routes/cases/modals/CaseRecordRow.d.ts +9 -0
  270. package/components/routes/cases/modals/CaseRecordRow.js +14 -0
  271. package/components/routes/cases/modals/CreateCaseModal.d.ts +7 -0
  272. package/components/routes/cases/modals/CreateCaseModal.js +53 -0
  273. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +1 -0
  274. package/components/routes/cases/modals/CreateCaseModal.test.js +319 -0
  275. package/components/routes/cases/modals/RenameItemModal.d.ts +9 -0
  276. package/components/routes/cases/modals/RenameItemModal.js +44 -0
  277. package/components/routes/cases/modals/ResolveModal.d.ts +7 -0
  278. package/components/routes/cases/modals/ResolveModal.js +120 -0
  279. package/components/routes/cases/modals/ResolveModal.test.d.ts +1 -0
  280. package/components/routes/cases/modals/ResolveModal.test.js +520 -0
  281. package/components/routes/cases/modals/hooks.d.ts +7 -0
  282. package/components/routes/cases/modals/hooks.js +40 -0
  283. package/components/routes/cases/modals/types.d.ts +13 -0
  284. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +6 -0
  285. package/components/routes/cases/search/CaseAssigneeFilter.js +33 -0
  286. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +1 -0
  287. package/components/routes/cases/search/CaseAssigneeFilter.test.js +127 -0
  288. package/components/routes/cases/search/CaseDateFilter.d.ts +13 -0
  289. package/components/routes/cases/search/CaseDateFilter.js +26 -0
  290. package/components/routes/cases/search/CaseDateFilter.test.d.ts +1 -0
  291. package/components/routes/cases/search/CaseDateFilter.test.js +115 -0
  292. package/components/routes/cases/search/CaseStatusFilter.d.ts +6 -0
  293. package/components/routes/cases/search/CaseStatusFilter.js +13 -0
  294. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +1 -0
  295. package/components/routes/cases/search/CaseStatusFilter.test.js +86 -0
  296. package/components/routes/cases/utils.d.ts +3 -0
  297. package/components/routes/cases/utils.js +21 -0
  298. package/components/routes/dossiers/DossierEditor.js +2 -2
  299. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  300. package/components/routes/events/EventViewer.d.ts +7 -0
  301. package/components/routes/events/EventViewer.js +24 -0
  302. package/components/routes/help/ApiDocumentation.js +1 -1
  303. package/components/routes/help/HitBannerDocumentation.js +1 -0
  304. package/components/routes/help/HitDocumentation.js +1 -3
  305. package/components/routes/help/OverviewDocumentation.d.ts +1 -1
  306. package/components/routes/help/OverviewDocumentation.js +0 -1
  307. package/components/routes/hits/search/InformationPane.d.ts +1 -0
  308. package/components/routes/hits/search/InformationPane.js +51 -64
  309. package/components/routes/hits/search/QuerySettings.js +2 -1
  310. package/components/routes/hits/search/QuerySettings.test.js +14 -9
  311. package/components/routes/hits/search/{HitBrowser.js → RecordBrowser.js} +11 -11
  312. package/components/routes/hits/search/{HitQuery.d.ts → RecordQuery.d.ts} +2 -2
  313. package/components/routes/hits/search/{HitQuery.js → RecordQuery.js} +6 -6
  314. package/components/routes/hits/search/SearchPane.js +24 -46
  315. package/components/routes/hits/search/ViewLink.js +4 -4
  316. package/components/routes/hits/search/ViewLink.test.js +8 -9
  317. package/components/routes/hits/search/grid/RecordGrid.d.ts +3 -0
  318. package/components/routes/hits/search/grid/{HitGrid.js → RecordGrid.js} +15 -15
  319. package/components/routes/hits/search/shared/CustomSpan.test.js +3 -4
  320. package/components/routes/hits/search/shared/IndexPicker.d.ts +8 -0
  321. package/components/routes/hits/search/shared/IndexPicker.js +21 -0
  322. package/components/routes/hits/search/shared/LayoutSettings.js +3 -3
  323. package/components/routes/hits/search/shared/SearchActionMenu.js +3 -9
  324. package/components/routes/hits/view/HitViewer.js +13 -14
  325. package/components/routes/home/ViewCard.js +47 -41
  326. package/components/routes/overviews/OverviewViewer.js +4 -4
  327. package/components/routes/views/ViewComposer.js +49 -23
  328. package/locales/en/translation.json +171 -27
  329. package/locales/fr/translation.json +169 -25
  330. package/models/WithMetadata.d.ts +2 -1
  331. package/models/entities/generated/Analytic.d.ts +0 -3
  332. package/models/entities/generated/ApiType.d.ts +3 -1
  333. package/models/entities/generated/AttachmentsFile.d.ts +12 -0
  334. package/models/entities/generated/Case.d.ts +29 -0
  335. package/models/entities/generated/DestinationOriginal.d.ts +19 -0
  336. package/models/entities/generated/ECSEvent.d.ts +31 -0
  337. package/models/entities/generated/EmailAttachment.d.ts +8 -0
  338. package/models/entities/generated/EmailParent.d.ts +19 -0
  339. package/models/entities/generated/Enrichments.d.ts +7 -0
  340. package/models/entities/generated/EnrichmentsIndicator.d.ts +21 -0
  341. package/models/entities/generated/Event.d.ts +80 -26
  342. package/models/entities/generated/EventCloud.d.ts +20 -0
  343. package/models/entities/generated/EventDestination.d.ts +23 -0
  344. package/models/entities/generated/EventEmail.d.ts +30 -0
  345. package/models/entities/generated/EventFile.d.ts +36 -0
  346. package/models/entities/generated/EventHowler.d.ts +42 -0
  347. package/models/entities/generated/EventHttp.d.ts +11 -0
  348. package/models/entities/generated/EventObserver.d.ts +21 -0
  349. package/models/entities/generated/EventOrganization.d.ts +7 -0
  350. package/models/entities/generated/EventProcess.d.ts +34 -0
  351. package/models/entities/generated/EventSource.d.ts +23 -0
  352. package/models/entities/generated/EventThreat.d.ts +21 -0
  353. package/models/entities/generated/EventTls.d.ts +12 -0
  354. package/models/entities/generated/Hit.d.ts +3 -2
  355. package/models/entities/generated/Howler.d.ts +0 -5
  356. package/models/entities/generated/HttpResponse.d.ts +11 -0
  357. package/models/entities/generated/Item.d.ts +12 -0
  358. package/models/entities/generated/ObserverIngress.d.ts +9 -0
  359. package/models/entities/generated/Rule.d.ts +8 -9
  360. package/models/entities/generated/Task.d.ts +10 -0
  361. package/models/entities/generated/Threat.d.ts +2 -2
  362. package/models/entities/generated/{Enrichment.d.ts → ThreatEnrichment.d.ts} +1 -1
  363. package/models/entities/generated/View.d.ts +1 -0
  364. package/models/socket/CaseUpdate.d.ts +5 -0
  365. package/models/socket/ViewersUpdate.d.ts +4 -0
  366. package/package.json +115 -94
  367. package/plugins/clue/components/ClueTypography.js +2 -2
  368. package/plugins/clue/index.d.ts +1 -1
  369. package/plugins/clue/index.js +0 -1
  370. package/plugins/clue/utils.d.ts +2 -1
  371. package/tests/mocks.d.ts +11 -1
  372. package/tests/mocks.js +12 -7
  373. package/tests/server-handlers.js +11 -1
  374. package/tests/utils.d.ts +4 -0
  375. package/tests/utils.js +21 -0
  376. package/utils/classificationParser.d.ts +195 -0
  377. package/utils/classificationParser.js +680 -0
  378. package/utils/constants.d.ts +4 -3
  379. package/utils/constants.js +6 -0
  380. package/utils/recordFunctions.d.ts +3 -0
  381. package/utils/recordFunctions.js +8 -0
  382. package/utils/recordFunctions.test.d.ts +1 -0
  383. package/utils/{hitFunctions.test.js → recordFunctions.test.js} +1 -1
  384. package/utils/socketUtils.d.ts +14 -0
  385. package/utils/socketUtils.js +17 -1
  386. package/utils/socketUtils.test.js +49 -16
  387. package/utils/typeUtils.d.ts +7 -0
  388. package/utils/typeUtils.js +27 -0
  389. package/utils/viewUtils.js +3 -0
  390. package/api/analytic/rules.d.ts +0 -4
  391. package/api/analytic/rules.js +0 -8
  392. package/components/app/providers/HitProvider.d.ts +0 -22
  393. package/components/elements/display/icons/BundleButton.d.ts +0 -6
  394. package/components/elements/display/icons/BundleButton.js +0 -32
  395. package/components/elements/hit/HitContextMenu.js +0 -239
  396. package/components/elements/hit/HitRelated.d.ts +0 -6
  397. package/components/elements/hit/HitRelated.js +0 -7
  398. package/components/elements/hit/elements/HitUsers.js +0 -33
  399. package/components/routes/advanced/RuleModal.d.ts +0 -7
  400. package/components/routes/advanced/RuleModal.js +0 -83
  401. package/components/routes/analytics/RuleView.d.ts +0 -8
  402. package/components/routes/analytics/RuleView.js +0 -48
  403. package/components/routes/help/BundleDocumentation.d.ts +0 -3
  404. package/components/routes/help/BundleDocumentation.js +0 -12
  405. package/components/routes/help/markdown/en/bundles.md.js +0 -1
  406. package/components/routes/help/markdown/fr/bundles.md.js +0 -1
  407. package/components/routes/hits/search/BundleScroller.d.ts +0 -2
  408. package/components/routes/hits/search/BundleScroller.js +0 -6
  409. package/components/routes/hits/search/grid/HitGrid.d.ts +0 -3
  410. package/components/routes/hits/search/shared/BundleParentMenu.d.ts +0 -6
  411. package/components/routes/hits/search/shared/BundleParentMenu.js +0 -32
  412. package/utils/hitFunctions.d.ts +0 -2
  413. package/utils/hitFunctions.js +0 -8
  414. /package/{components/app/providers/HitSearchProvider.test.d.ts → api/socket/viewers.test.d.ts} +0 -0
  415. /package/components/{elements/hit/HitContextMenu.test.d.ts → app/providers/RecordSearchProvider.test.d.ts} +0 -0
  416. /package/{utils/hitFunctions.test.d.ts → components/app/providers/UserListProvider.test.d.ts} +0 -0
  417. /package/components/{routes/overviews/OverviewEditor.d.ts → elements/MarkdownEditor.d.ts} +0 -0
  418. /package/components/elements/hit/{HitDetails.d.ts → related/RelatedRecords.d.ts} +0 -0
  419. /package/components/routes/hits/search/{HitBrowser.d.ts → RecordBrowser.d.ts} +0 -0
@@ -7,9 +7,9 @@ import api from '@cccsaurora/howler-ui/api';
7
7
  import AppListEmpty from '@cccsaurora/howler-ui/commons/components/display/AppListEmpty';
8
8
  import PageCenter from '@cccsaurora/howler-ui/commons/components/pages/PageCenter';
9
9
  import { GridColumnsContext } from '@cccsaurora/howler-ui/components/app/providers/GridColumnsProvider';
10
- import { HitContext } from '@cccsaurora/howler-ui/components/app/providers/HitProvider';
11
- import { HitSearchContext } from '@cccsaurora/howler-ui/components/app/providers/HitSearchProvider';
12
10
  import { ParameterContext } from '@cccsaurora/howler-ui/components/app/providers/ParameterProvider';
11
+ import { RecordContext } from '@cccsaurora/howler-ui/components/app/providers/RecordProvider';
12
+ import { RecordSearchContext } from '@cccsaurora/howler-ui/components/app/providers/RecordSearchProvider';
13
13
  import { ViewContext } from '@cccsaurora/howler-ui/components/app/providers/ViewProvider';
14
14
  import CustomButton from '@cccsaurora/howler-ui/components/elements/addons/buttons/CustomButton';
15
15
  import FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
@@ -19,8 +19,9 @@ import VSBoxContent from '@cccsaurora/howler-ui/components/elements/addons/layou
19
19
  import VSBoxHeader from '@cccsaurora/howler-ui/components/elements/addons/layout/vsbox/VSBoxHeader';
20
20
  import SearchTotal from '@cccsaurora/howler-ui/components/elements/addons/search/SearchTotal';
21
21
  import ChipPopper from '@cccsaurora/howler-ui/components/elements/display/ChipPopper';
22
+ import EventCard from '@cccsaurora/howler-ui/components/elements/event/EventCard';
22
23
  import AddColumnModal from '@cccsaurora/howler-ui/components/elements/hit/grid/AddColumnModal';
23
- import HitTable from '@cccsaurora/howler-ui/components/elements/hit/grid/HitTable';
24
+ import RecordTable from '@cccsaurora/howler-ui/components/elements/hit/grid/RecordTable';
24
25
  import HitCard from '@cccsaurora/howler-ui/components/elements/hit/HitCard';
25
26
  import { HitLayout } from '@cccsaurora/howler-ui/components/elements/hit/HitLayout';
26
27
  import LayoutToggle, {} from '@cccsaurora/howler-ui/components/elements/view/LayoutToggle';
@@ -34,8 +35,9 @@ import { DEFAULT_QUERY, StorageKey } from '@cccsaurora/howler-ui/utils/constants
34
35
  import { convertDateToLucene } from '@cccsaurora/howler-ui/utils/utils';
35
36
  import { buildViewUrl } from '@cccsaurora/howler-ui/utils/viewUtils';
36
37
  import ErrorBoundary from '../ErrorBoundary';
37
- import HitQuery from '../hits/search/HitQuery';
38
+ import RecordQuery from '../hits/search/RecordQuery';
38
39
  import HitSort from '../hits/search/shared/HitSort';
40
+ import IndexPicker from '../hits/search/shared/IndexPicker';
39
41
  import SearchSpan from '../hits/search/shared/SearchSpan';
40
42
  const ViewComposer = () => {
41
43
  const { t } = useTranslation();
@@ -46,8 +48,10 @@ const ViewComposer = () => {
46
48
  const addView = useContextSelector(ViewContext, ctx => ctx.addView);
47
49
  const editView = useContextSelector(ViewContext, ctx => ctx.editView);
48
50
  const getCurrentViews = useContextSelector(ViewContext, ctx => ctx.getCurrentViews);
51
+ const indexes = useContextSelector(ParameterContext, ctx => ctx.indexes);
52
+ const setIndexes = useContextSelector(ParameterContext, ctx => ctx.setIndexes);
49
53
  const pageCount = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25)[0];
50
- const loadHits = useContextSelector(HitContext, ctx => ctx.loadHits);
54
+ const loadRecords = useContextSelector(RecordContext, ctx => ctx.loadRecords);
51
55
  // view state
52
56
  const [title, setTitle] = useState('');
53
57
  const [type, setType] = useState('global');
@@ -65,8 +69,9 @@ const ViewComposer = () => {
65
69
  const [searching, setSearching] = useState(false);
66
70
  const [error, setError] = useState(null);
67
71
  const [response, setResponse] = useState();
68
- const displayType = useContextSelector(HitSearchContext, ctx => ctx.displayType);
69
- const setDisplayType = useContextSelector(HitSearchContext, ctx => ctx.setDisplayType);
72
+ const [isLoadingView, setIsLoadingView] = useState(!!routeParams.id);
73
+ const displayType = useContextSelector(RecordSearchContext, ctx => ctx.displayType);
74
+ const setDisplayType = useContextSelector(RecordSearchContext, ctx => ctx.setDisplayType);
70
75
  const onSave = useCallback(async () => {
71
76
  setLoading(true);
72
77
  const _columnData = columns.map(column => ({
@@ -74,11 +79,13 @@ const ViewComposer = () => {
74
79
  width: columnWidths[column] ?? null
75
80
  }));
76
81
  try {
82
+ const normalizedIndexes = indexes?.length > 0 ? indexes : ['hit'];
77
83
  if (!routeParams.id) {
78
84
  const newView = await addView({
79
85
  title,
80
86
  type,
81
87
  query,
88
+ indexes: normalizedIndexes,
82
89
  sort: sort || null,
83
90
  span: span || null,
84
91
  settings: {
@@ -94,6 +101,7 @@ const ViewComposer = () => {
94
101
  title,
95
102
  type,
96
103
  query,
104
+ indexes: normalizedIndexes,
97
105
  sort,
98
106
  span,
99
107
  settings: {
@@ -122,6 +130,7 @@ const ViewComposer = () => {
122
130
  sort,
123
131
  span,
124
132
  advanceOnTriage,
133
+ indexes,
125
134
  displayType,
126
135
  columns,
127
136
  navigate,
@@ -129,19 +138,19 @@ const ViewComposer = () => {
129
138
  editView,
130
139
  showErrorMessage
131
140
  ]);
132
- const search = useCallback(async (_query) => {
133
- setQuery(_query);
141
+ const performSearch = useCallback(async (searchQuery, searchIndexes, searchSort, searchSpan) => {
134
142
  setSearching(true);
135
143
  setError(null);
136
144
  try {
137
- const _response = await dispatchApi(api.search.hit.post({
145
+ const normalizedIndexes = searchIndexes?.length > 0 ? searchIndexes : ['hit'];
146
+ const _response = await dispatchApi(api.v2.search.post(normalizedIndexes, {
138
147
  rows: pageCount,
139
- query: _query,
140
- sort,
141
- filters: span ? [`event.created:${convertDateToLucene(span)}`] : [],
148
+ query: searchQuery,
149
+ sort: searchSort,
150
+ filters: searchSpan ? [`event.created:${convertDateToLucene(searchSpan)}`] : [],
142
151
  metadata: ['template', 'analytic']
143
152
  }), { showError: false, throwError: true });
144
- loadHits(_response.items);
153
+ loadRecords(_response.items);
145
154
  setResponse(_response);
146
155
  }
147
156
  catch (e) {
@@ -150,18 +159,25 @@ const ViewComposer = () => {
150
159
  finally {
151
160
  setSearching(false);
152
161
  }
153
- }, [dispatchApi, loadHits, pageCount, setQuery, sort, span]);
162
+ }, [dispatchApi, loadRecords, pageCount]);
163
+ const search = useCallback(async (_query) => {
164
+ setQuery(_query);
165
+ await performSearch(_query, indexes, sort, span);
166
+ }, [performSearch, indexes, sort, span, setQuery]);
154
167
  useEffect(() => {
155
- search(query || DEFAULT_QUERY);
168
+ // Only run initial search if we're NOT editing an existing view
169
+ if (!routeParams.id) {
170
+ search(query || DEFAULT_QUERY);
171
+ }
156
172
  // eslint-disable-next-line react-hooks/exhaustive-deps
157
- }, []);
173
+ }, [routeParams.id]);
158
174
  // We only run this when ancillary properties (i.e. filters, sorting) change
159
175
  useEffect(() => {
160
- if (query) {
176
+ if (query && !isLoadingView) {
161
177
  search(query);
162
178
  }
163
179
  // eslint-disable-next-line react-hooks/exhaustive-deps
164
- }, [sort, span]);
180
+ }, [sort, span, indexes, isLoadingView]);
165
181
  useEffect(() => {
166
182
  if (!routeParams.id) {
167
183
  return;
@@ -177,15 +193,25 @@ const ViewComposer = () => {
177
193
  }
178
194
  setTitle(viewToEdit.title);
179
195
  setAdvanceOnTriage(viewToEdit.settings?.advance_on_triage ?? false);
180
- setQuery(viewToEdit.query);
181
196
  setDisplayType((viewToEdit.settings?.display ?? null));
182
197
  setType(viewToEdit.type);
198
+ const loadedQuery = viewToEdit.query || DEFAULT_QUERY;
199
+ const loadedIndexes = viewToEdit.indexes || indexes;
200
+ const loadedSort = viewToEdit.sort || sort;
201
+ const loadedSpan = viewToEdit.span || span;
202
+ setQuery(loadedQuery);
203
+ if (viewToEdit.indexes) {
204
+ setIndexes(loadedIndexes);
205
+ }
183
206
  if (viewToEdit.sort) {
184
- setSort(viewToEdit.sort);
207
+ setSort(loadedSort);
185
208
  }
186
209
  if (viewToEdit.span) {
187
- setSpan(viewToEdit.span);
210
+ setSpan(loadedSpan);
188
211
  }
212
+ // Perform search with the loaded values to avoid using stale state
213
+ await performSearch(loadedQuery, loadedIndexes, loadedSort, loadedSpan);
214
+ setIsLoadingView(false);
189
215
  })();
190
216
  // eslint-disable-next-line react-hooks/exhaustive-deps
191
217
  }, [routeParams.id]);
@@ -198,6 +224,6 @@ const ViewComposer = () => {
198
224
  fontSize: '0.9em',
199
225
  fontStyle: 'italic',
200
226
  mb: 0.5
201
- }), variant: "body2", children: t('hit.search.prompt') }), _jsx(Stack, { direction: "row", width: "100%", spacing: 2, alignItems: "flex-start", paddingBottom: 1, children: _jsxs(Stack, { direction: "column", width: "100%", spacing: 1, children: [_jsx(HitQuery, { triggerSearch: search, searching: searching, onChange: (_query, isDirty) => setIsSearchDirty(isDirty) }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(HitSort, {}), _jsx(SearchSpan, { omitCustom: true }), _jsx("div", { style: { flex: 1 } }), _jsx(ChipPopper, { label: _jsx(Typography, { variant: "body2", children: t('view.settings') }), deleteIcon: _jsx(Settings, {}), toggleOnDelete: true, slotProps: { chip: { size: 'small' } }, placement: "bottom-end", children: _jsxs(Stack, { direction: "column", spacing: 1, children: [_jsxs(Stack, { spacing: 1, direction: "row", alignItems: "center", sx: { flex: '0 !important', minWidth: '300px' }, children: [_jsx(Typography, { component: "span", children: t('view.settings.advance_on_triage') }), _jsx(Tooltip, { title: t('view.settings.advance_on_triage.description'), children: _jsx(HelpOutline, { sx: { fontSize: '16px' } }) }), _jsx(FlexOne, {}), _jsx(Checkbox, { size: "small", checked: advanceOnTriage, onChange: (_event, checked) => setAdvanceOnTriage(checked) })] }), _jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", justifyContent: "space-between", children: [_jsx(Typography, { component: "span", children: t('view.settings.layout') }), _jsx(LayoutToggle, { displayType: displayType, setDisplayType: setDisplayType, size: "small", allowNullValue: true })] })] }) })] })] }) }), _jsxs(Stack, { direction: "row", spacing: 1, alignItems: "flex-end", justifyContent: "space-between", children: [response && (_jsx(SearchTotal, { total: response.total, pageLength: response.items.length, offset: response.offset, sx: theme => ({ color: theme.palette.text.secondary, fontSize: '0.9em', fontStyle: 'italic' }) })), _jsx(FlexOne, {}), displayType === 'grid' && (_jsx(AddColumnModal, { columns: columns, addColumn: key => isReady && setColumns(uniq([...columns, key])) }))] }), _jsx(LinearProgress, { sx: [!searching && { opacity: 0 }] })] }) }), _jsx(VSBoxContent, { children: displayType === 'grid' ? (_jsx(Stack, { component: Paper, spacing: 1, width: "100%", height: "100%", sx: { overflow: 'auto', flex: 1 }, children: _jsx(HitTable, { query: query, items: response?.items }) })) : (_jsxs(Stack, { spacing: 1, children: [!response?.total && _jsx(AppListEmpty, {}), response?.items.map(hit => (_jsx(HitCard, { id: hit.howler.id, layout: HitLayout.DENSE }, hit.howler.id)))] })) })] }) }) }) }));
227
+ }), variant: "body2", children: t('hit.search.prompt') }), _jsx(Stack, { direction: "row", width: "100%", spacing: 2, alignItems: "flex-start", paddingBottom: 1, children: _jsxs(Stack, { direction: "column", width: "100%", spacing: 1, children: [_jsx(RecordQuery, { triggerSearch: search, searching: searching, onChange: (_query, isDirty) => setIsSearchDirty(isDirty) }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(IndexPicker, {}), _jsx(HitSort, {}), _jsx(SearchSpan, { omitCustom: true }), _jsx("div", { style: { flex: 1 } }), _jsx(ChipPopper, { label: _jsx(Typography, { variant: "body2", children: t('view.settings') }), deleteIcon: _jsx(Settings, {}), toggleOnDelete: true, slotProps: { chip: { size: 'small' } }, placement: "bottom-end", children: _jsxs(Stack, { direction: "column", spacing: 1, children: [_jsxs(Stack, { spacing: 1, direction: "row", alignItems: "center", sx: { flex: '0 !important', minWidth: '300px' }, children: [_jsx(Typography, { component: "span", children: t('view.settings.advance_on_triage') }), _jsx(Tooltip, { title: t('view.settings.advance_on_triage.description'), children: _jsx(HelpOutline, { sx: { fontSize: '16px' } }) }), _jsx(FlexOne, {}), _jsx(Checkbox, { size: "small", checked: advanceOnTriage, onChange: (_event, checked) => setAdvanceOnTriage(checked) })] }), _jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", justifyContent: "space-between", children: [_jsx(Typography, { component: "span", children: t('view.settings.layout') }), _jsx(LayoutToggle, { displayType: displayType, setDisplayType: setDisplayType, size: "small", allowNullValue: true })] })] }) })] })] }) }), _jsxs(Stack, { direction: "row", spacing: 1, alignItems: "flex-end", justifyContent: "space-between", children: [response && (_jsx(SearchTotal, { total: response.total, pageLength: response.items.length, offset: response.offset, sx: theme => ({ color: theme.palette.text.secondary, fontSize: '0.9em', fontStyle: 'italic' }) })), _jsx(FlexOne, {}), displayType === 'grid' && (_jsx(AddColumnModal, { columns: columns, addColumn: key => isReady && setColumns(uniq([...columns, key])) }))] }), _jsx(LinearProgress, { sx: [!searching && { opacity: 0 }] })] }) }), _jsx(VSBoxContent, { children: displayType === 'grid' ? (_jsx(Stack, { component: Paper, spacing: 1, width: "100%", height: "100%", sx: { overflow: 'auto', flex: 1 }, children: _jsx(RecordTable, { query: query, items: response?.items }) })) : (_jsxs(Stack, { spacing: 1, children: [!response?.total && _jsx(AppListEmpty, {}), response?.items.map(record => record.__index === 'hit' ? (_jsx(HitCard, { id: record.howler.id, layout: HitLayout.DENSE }, record.howler.id)) : (_jsx(EventCard, { event: record }, record.howler.id)))] })) })] }) }) }) }));
202
228
  };
203
229
  export default ViewComposer;
@@ -15,6 +15,7 @@
15
15
  "analytic.notebook.error.minFields": "Name and link are required.",
16
16
  "analytic.notebook.link": "Link",
17
17
  "analytic.notebook.name": "Name",
18
+ "analytic.open": "Open Analytic",
18
19
  "any": "Any",
19
20
  "api.user.apikey.removed": "API key removed successfully.",
20
21
  "api.user.apikey.updated": "New API key added successfully.",
@@ -86,6 +87,8 @@
86
87
  "comments.edit.stop": "Stop Editing",
87
88
  "comments.edited": "Edited",
88
89
  "comments.quote": "Quote Reply",
90
+ "complete": "Complete",
91
+ "crisis": "Crisis",
89
92
  "custom": "Custom",
90
93
  "date.range.1.day": "The last day",
91
94
  "date.range.1.month": "The last month",
@@ -111,8 +114,13 @@
111
114
  "drawer.expand": "Expand Menu",
112
115
  "duplicates.omitted": "Some duplicate entries have been omitted.",
113
116
  "edit": "Edit",
117
+ "enabled": "Enabled",
118
+ "event.module": "Event Module",
119
+ "event.open": "Open Event",
120
+ "event.type": "Event Type",
114
121
  "features.warning.description": "This feature is undergoing active development, and is not yet in a finished state. You may encounter bugs or instability.",
115
122
  "features.warning.title": "Feature In Active Development",
123
+ "focus": "Main focus",
116
124
  "global": "Global",
117
125
  "help.actions.introduction": "Introduction to Actions",
118
126
  "help.hit.banner.description": "See the below hit banner example for the hit keys necessary to properly populate it. If you have any additional questions, ask in the HOWLER support channel.",
@@ -169,17 +177,21 @@
169
177
  "hit.header.assignment": "Assignment: {{user}}",
170
178
  "hit.header.assignment.add": "Assign to a user",
171
179
  "hit.header.assignment.change": "Change assignment",
172
- "hit.header.bundlesize": "{{hits}} hits",
173
180
  "hit.header.escalation": "Escalation Level: ",
174
181
  "hit.header.indicators": "Indicators",
175
182
  "hit.header.link": "Open Link",
176
183
  "hit.header.rationale": "Rationale",
184
+ "hit.header.related": "{{count}} related records",
177
185
  "hit.header.scrutiny": "Scrutiny: ",
178
186
  "hit.header.status": "Status: ",
179
187
  "hit.header.summary": "Summary",
180
188
  "hit.header.target": "Target",
181
189
  "hit.header.threat": "Threat",
190
+ "hit.header.view.case": "View case {{id}}",
191
+ "hit.header.view.event": "View event {{id}}",
192
+ "hit.header.view.hit": "View hit {{id}}",
182
193
  "hit.header.votes": "Votes: ",
194
+ "hit.howler.related": "{{count}} related records",
183
195
  "hit.label": "Labels",
184
196
  "hit.label.category.assignments": "Category: Assignments - Specifies what analyst or team of analysts is assigned to triaging this hit.",
185
197
  "hit.label.category.campaign": "Catergory: Campaign - Identifies ongoing campaigns from specific malware families or phishing initiatives. They should only be considered correct attributions if the hit is promoted to evidence.",
@@ -202,9 +214,9 @@
202
214
  "hit.notebook.goTo": "Go to Jupyterhub",
203
215
  "hit.notebook.select": "Please Select a notebook",
204
216
  "hit.notebook.tooltip": "Open in Jupyterhub",
217
+ "hit.open": "Open Hit",
205
218
  "hit.overview.missing": "No overview has been created for this hit. In order to create an overview, press the add button to the right.",
206
219
  "hit.panel.aggregation.run": "Create Summary",
207
- "hit.panel.analytic.open": "Open Analytic",
208
220
  "hit.panel.bundles.open": "Parent Bundles",
209
221
  "hit.panel.bundles.open.prompt": "Open Parent Bundle",
210
222
  "hit.panel.close": "Close",
@@ -217,9 +229,12 @@
217
229
  "hit.panel.exclude": "Exclude By",
218
230
  "hit.panel.hit.noselection": "No hit has been selected",
219
231
  "hit.panel.include": "Include By",
220
- "hit.panel.open": "Open Hit Viewer",
221
232
  "hit.panel.view.layout": "Change View Panel",
222
233
  "hit.quicksearch": "Search by assignment, analytic, detection or status",
234
+ "hit.related.tab.case": "Cases",
235
+ "hit.related.tab.event": "Events",
236
+ "hit.related.tab.hit": "Hits",
237
+ "hit.related.tab.links": "Links",
223
238
  "hit.search.aggregate.button": "Create Summary",
224
239
  "hit.search.button": "Perform search",
225
240
  "hit.search.custom": "Custom Sort",
@@ -228,6 +243,10 @@
228
243
  "hit.search.filter.fields": "Fields",
229
244
  "hit.search.filter.label": "Lookup Filters",
230
245
  "hit.search.filter.values": "Values",
246
+ "hit.search.index": "Indexes",
247
+ "hit.search.index.case": "Cases",
248
+ "hit.search.index.event": "Events",
249
+ "hit.search.index.hit": "Hits",
231
250
  "hit.search.invalid": "Invalid Query",
232
251
  "hit.search.keyboard": "Keyboard shortcuts",
233
252
  "hit.search.keyboard.no_shortcuts": "No shortcuts",
@@ -301,6 +320,44 @@
301
320
  "modal.action.empty": "Action Name cannot be empty.",
302
321
  "modal.action.label": "Action Name",
303
322
  "modal.action.title": "Save Action",
323
+ "modal.cases.add_item": "Add item",
324
+ "modal.cases.add_item.content": "Content",
325
+ "modal.cases.add_item.folder": "Folder",
326
+ "modal.cases.add_item.markdown_placeholder": "Describe the alert and any important context",
327
+ "modal.cases.add_item.root": "Root",
328
+ "modal.cases.add_item.title": "Title",
329
+ "modal.cases.add_item.type": "Item Type",
330
+ "modal.cases.add_item.type.link": "Link",
331
+ "modal.cases.add_item.type.markdown": "Markdown",
332
+ "modal.cases.add_item.url": "URL",
333
+ "modal.cases.add_to_case": "Add to Case",
334
+ "modal.cases.add_to_case.full_path": "Full path: {{path}}",
335
+ "modal.cases.add_to_case.items_section": "Alert Placement",
336
+ "modal.cases.add_to_case.path_invalid": "Path must not start or end with a /",
337
+ "modal.cases.add_to_case.select_case": "Search Cases",
338
+ "modal.cases.add_to_case.select_path": "Select Folder Path",
339
+ "modal.cases.add_to_case.title": "Item Title",
340
+ "modal.cases.alerts.assess": "Assess Alerts",
341
+ "modal.cases.alerts.resolved": "Resolved Alerts",
342
+ "modal.cases.create_case": "Create Case",
343
+ "modal.cases.create_case.escalation": "Escalation",
344
+ "modal.cases.create_case.full_path": "Full path: {{path}}",
345
+ "modal.cases.create_case.item.path": "Folder Path (optional)",
346
+ "modal.cases.create_case.item.title": "Item Title",
347
+ "modal.cases.create_case.items_section": "Alert Placement",
348
+ "modal.cases.create_case.overview": "Case Overview (Markdown, optional)",
349
+ "modal.cases.create_case.summary": "Short Case Summary",
350
+ "modal.cases.create_case.title": "Case Title",
351
+ "modal.cases.rename_item": "Rename Item",
352
+ "modal.cases.rename_item.error.empty": "Name cannot be empty",
353
+ "modal.cases.rename_item.error.slash": "Name cannot contain '/'",
354
+ "modal.cases.rename_item.error.taken": "An item already exists at this path",
355
+ "modal.cases.rename_item.folder_path": "Folder: {{path}}",
356
+ "modal.cases.rename_item.new_name": "New Name",
357
+ "modal.cases.resolve": "Resolve Case",
358
+ "modal.cases.resolve.allow_unresolved": "Resolve this case even if some alerts remain unresolved.",
359
+ "modal.cases.resolve.allow_unresolved.aria_label": "Allow unresolved alerts",
360
+ "modal.cases.resolve.description": "When resolving a case, you must either assess all open alerts, or add an assessment to the alerts.",
304
361
  "modal.confirm.delete.description": "Are you sure you want to delete this item?",
305
362
  "modal.confirm.delete.title": "Confirm Deletion",
306
363
  "modal.rationale.description": "Provide a rationale that succinctly explains to other analysts why you are confident in this assessment.",
@@ -309,19 +366,9 @@
309
366
  "modal.rationale.type.analytic": "This rationale was used when assessing alerts with the same analytic name.",
310
367
  "modal.rationale.type.assignment": "This is a rationale you have recently used when assessing an alert.",
311
368
  "modal.rationale.type.preset": "This is a preset rationale configured for the associated analytic.",
312
- "modal.rule.description": "Create a new rule by giving it a name, markdown description and submitting.",
313
- "modal.rule.description.title": "Rule Description",
314
- "modal.rule.disabled.analytic": "You must provide a rule name.",
315
- "modal.rule.disabled.description": "You must provide a useful markdown description for your rule.",
316
- "modal.rule.file.title": "Query",
317
- "modal.rule.markdown.placeholder": "Your *markdown* **description** will be ~~rendered~~ here.\n\n![](/images/doggie.png)",
318
- "modal.rule.markdown.title": "Markdown Preview",
319
- "modal.rule.name": "Rule Name",
320
- "modal.rule.name.warn": "In general, analytic name should only contain letters and spaces, preferablly 'In Pascal Case'.",
321
- "modal.rule.success": "Rule Created!",
322
- "modal.rule.title": "Create a New Rule",
323
369
  "no.data": "No Data",
324
370
  "none": "None",
371
+ "normal": "Normal Priority",
325
372
  "notebook.opens.panel": "Opens notebook panel",
326
373
  "notebook.title": "Notebook",
327
374
  "on": "on",
@@ -345,6 +392,94 @@
345
392
  "page.403.title": "403: Access Forbidden",
346
393
  "page.404.description": "The page you are looking for cannot be found...",
347
394
  "page.404.title": "404: Not found",
395
+ "page.cases.created": "Created",
396
+ "page.cases.dashboard": "Dashboard",
397
+ "page.cases.dashboard.alerts": "Alerts",
398
+ "page.cases.dashboard.cases": "Related Cases",
399
+ "page.cases.dashboard.duration": "Duration",
400
+ "page.cases.dashboard.indicators": "Indicators",
401
+ "page.cases.dashboard.target": "Targets",
402
+ "page.cases.dashboard.tasks": "Tasks",
403
+ "page.cases.dashboard.tasks.add": "Add Task",
404
+ "page.cases.dashboard.tasks.child.empty": "No tasks in this child case.",
405
+ "page.cases.dashboard.tasks.child_cases": "Child Cases",
406
+ "page.cases.dashboard.tasks.filter_cases": "Filter child cases",
407
+ "page.cases.dashboard.tasks.hide_child": "Hide child case tasks",
408
+ "page.cases.dashboard.tasks.show_child": "Show child case tasks",
409
+ "page.cases.dashboard.threat": "Threats",
410
+ "page.cases.detail.escalation": "Escalation",
411
+ "page.cases.detail.participants": "Participants",
412
+ "page.cases.detail.properties": "Properties",
413
+ "page.cases.detail.status": "Status",
414
+ "page.cases.detail.viewers": "Active Viewers",
415
+ "page.cases.escalation": "Escalation",
416
+ "page.cases.folder.drop.root": "Place here to move to root",
417
+ "page.cases.observables": "Observables",
418
+ "page.cases.observables.columns.escalation": "Escalation",
419
+ "page.cases.observables.columns.role": "Role",
420
+ "page.cases.observables.columns.seen_in": "Seen In",
421
+ "page.cases.observables.columns.sources": "Sources",
422
+ "page.cases.observables.columns.type": "Type",
423
+ "page.cases.observables.columns.value": "Value",
424
+ "page.cases.observables.empty": "No observables found.",
425
+ "page.cases.observables.filter_by_escalation": "Escalation",
426
+ "page.cases.observables.filter_by_origin": "Origin",
427
+ "page.cases.observables.filter_by_role": "Role",
428
+ "page.cases.observables.filter_by_type": "Filter by type:",
429
+ "page.cases.observables.origin.event": "Event",
430
+ "page.cases.observables.origin.hit": "Hit",
431
+ "page.cases.observables.role.indicator": "Indicator",
432
+ "page.cases.observables.role.target": "Target",
433
+ "page.cases.observables.role.threat": "Threat",
434
+ "page.cases.observables.search": "Search observables...",
435
+ "page.cases.observables.seen_in": "Seen in",
436
+ "page.cases.observables.type.hash": "Hash",
437
+ "page.cases.observables.type.hosts": "Host",
438
+ "page.cases.observables.type.id": "ID",
439
+ "page.cases.observables.type.ids": "ID",
440
+ "page.cases.observables.type.ip": "IP",
441
+ "page.cases.observables.type.signature": "Signature",
442
+ "page.cases.observables.type.uri": "URI",
443
+ "page.cases.observables.type.user": "User",
444
+ "page.cases.rules": "Rules",
445
+ "page.cases.rules.author": "Author",
446
+ "page.cases.rules.create": "Create Rule",
447
+ "page.cases.rules.delete.confirm": "Delete this rule?",
448
+ "page.cases.rules.destination": "Alert Destination Path",
449
+ "page.cases.rules.destination.help": "Handlebars template for the case item path (e.g. alerts/{{howler.analytic}})",
450
+ "page.cases.rules.empty": "No correlation rules configured.",
451
+ "page.cases.rules.expire_after_resolved": "Start expiry after case is resolved",
452
+ "page.cases.rules.indexes": "Indexes",
453
+ "page.cases.rules.no_expiry": "No expiry",
454
+ "page.cases.rules.query": "Match Query",
455
+ "page.cases.rules.timeframe": "Rule Expiry",
456
+ "page.cases.rules.timeframe.after_resolved": "{{days}} day(s) after resolved",
457
+ "page.cases.rules.timeframe.days": "{{days}} day(s)",
458
+ "page.cases.rules.timeframe.help": "Number of days before the rule expires",
459
+ "page.cases.search": "Search",
460
+ "page.cases.sidebar.add_folder": "Add folder",
461
+ "page.cases.sidebar.add_item": "Add item",
462
+ "page.cases.sidebar.collapse_all": "Collapse all folders",
463
+ "page.cases.sidebar.folder.remove": "Remove folder",
464
+ "page.cases.sidebar.folder.rename": "Rename folder",
465
+ "page.cases.sidebar.item.open": "Open item",
466
+ "page.cases.sidebar.item.remove": "Remove item",
467
+ "page.cases.sidebar.item.rename": "Rename item",
468
+ "page.cases.sidebar.new_folder": "New Folder",
469
+ "page.cases.sidebar.refresh": "Refresh case",
470
+ "page.cases.sources": "Sources",
471
+ "page.cases.status.in-progress": "In Progress",
472
+ "page.cases.status.on-hold": "On Hold",
473
+ "page.cases.status.open": "Open",
474
+ "page.cases.status.resolved": "Resolved",
475
+ "page.cases.timeline": "Timeline",
476
+ "page.cases.timeline.empty": "No events match the selected filters.",
477
+ "page.cases.timeline.filter.escalation": "Escalation",
478
+ "page.cases.timeline.filter.escalation.empty": "No escalation levels found.",
479
+ "page.cases.timeline.filter.label": "Show only",
480
+ "page.cases.timeline.filter.mitre": "MITRE ATT&CK",
481
+ "page.cases.timeline.filter.mitre.empty": "No tactics or techniques found.",
482
+ "page.cases.updated": "Updated",
348
483
  "page.dashboard.settings.edit": "Edit Dashboard",
349
484
  "page.dashboard.settings.refreshRate": "Refresh Rate",
350
485
  "page.dashboard.title": "Dashboard",
@@ -417,6 +552,8 @@
417
552
  "page.user.search.column.groups": "Groups",
418
553
  "page.user.search.column.username": "Username",
419
554
  "page.user.search.prompt": "Search by username, fullname, email or group",
555
+ "pages.cases.detail.participants": "Participants",
556
+ "pages.cases.detail.status": "Status",
420
557
  "password": "New Password",
421
558
  "password.confirm": "Confirm Password",
422
559
  "password.match": "Password and Confirm Password must match",
@@ -480,8 +617,6 @@
480
617
  "route.admin.user.details": "User Details",
481
618
  "route.admin.user.search": "User Search",
482
619
  "route.advanced": "Advanced Search",
483
- "route.advanced.create.rule": "Create Rule",
484
- "route.advanced.create.rule.disabled": "You must run your search to ensure it is valid first.",
485
620
  "route.advanced.error": "Search Error",
486
621
  "route.advanced.execute.query": "Execute Query",
487
622
  "route.advanced.fields": "Hit Fields to Show",
@@ -507,7 +642,6 @@
507
642
  "route.advanced.result.description": "Execute a query to show results here.",
508
643
  "route.advanced.result.title": "Howler Advanced Search",
509
644
  "route.advanced.rows": "Number of Rows to Return",
510
- "route.advanced.rule.type": "Rule Type",
511
645
  "route.analytics": "Analytics",
512
646
  "route.analytics.assessment.title": "Assessment Result of Created Hits",
513
647
  "route.analytics.contributors": "Contributors",
@@ -516,7 +650,6 @@
516
650
  "route.analytics.detections": "Detections:",
517
651
  "route.analytics.dropdown.detection": "Detection",
518
652
  "route.analytics.escalation.title": "Escalation of Created Hits",
519
- "route.analytics.filter.rule": "Filter on Rules",
520
653
  "route.analytics.ingestion.title": "Number of Hits Created",
521
654
  "route.analytics.manager.search": "Search Analytics",
522
655
  "route.analytics.overview.description": "Description",
@@ -526,11 +659,6 @@
526
659
  "route.analytics.overview.statistics": "Statistics",
527
660
  "route.analytics.pinned": "Pinned Analytics",
528
661
  "route.analytics.rationales.new": "New Rationale",
529
- "route.analytics.rule": "Rule",
530
- "route.analytics.rule.title": "Rule Query",
531
- "route.analytics.search.filter.rules.hide": "Hiding Rules Only",
532
- "route.analytics.search.filter.rules.show": "Showing Rules Only",
533
- "route.analytics.search.filter.rules.toggle": "Toggle Filtering Rule",
534
662
  "route.analytics.search.prompt": "Search by name or detections.",
535
663
  "route.analytics.set.owner": "Change Ownership",
536
664
  "route.analytics.status.title": "Cumulative Status of Hits Created in the Last Three Months",
@@ -539,7 +667,6 @@
539
667
  "route.analytics.tab.notebooks": "Notebooks",
540
668
  "route.analytics.tab.overview": "Summary",
541
669
  "route.analytics.tab.overviews": "Overviews",
542
- "route.analytics.tab.rule": "Rule Query",
543
670
  "route.analytics.tab.templates": "Templates",
544
671
  "route.analytics.tab.triage": "Triage",
545
672
  "route.analytics.tags": "Tags:",
@@ -552,6 +679,16 @@
552
679
  "route.analytics.triage.title": "Triage Settings",
553
680
  "route.analytics.updated": "Analytic Updated!",
554
681
  "route.analytics.view": "View Analytic",
682
+ "route.cases": "Cases",
683
+ "route.cases.create": "Create Case",
684
+ "route.cases.filter.assignee": "Assignee",
685
+ "route.cases.filter.assignees": "Assignees",
686
+ "route.cases.filter.date": "Date Range",
687
+ "route.cases.filter.myself": "Myself",
688
+ "route.cases.filter.status": "Status",
689
+ "route.cases.manager.search": "Search Cases",
690
+ "route.cases.search.prompt": "Search cases by title, summary, description, participants or task details",
691
+ "route.cases.view": "View Case",
555
692
  "route.clear": "Clear query",
556
693
  "route.dossiers": "Dossiers",
557
694
  "route.dossiers.create": "New Dossier",
@@ -569,7 +706,7 @@
569
706
  "route.dossiers.manager.icon": "Lead Icon",
570
707
  "route.dossiers.manager.icon.description": "Specify an icon using the iconify ID. To browse icons, click the button to the right.",
571
708
  "route.dossiers.manager.label.en": "English Title",
572
- "route.dossiers.manager.label.fr": "Titre français",
709
+ "route.dossiers.manager.label.fr": "Titre francais",
573
710
  "route.dossiers.manager.lead.create": "Create a new lead by pressing the button to the right.",
574
711
  "route.dossiers.manager.openinsearch": "Open in Search",
575
712
  "route.dossiers.manager.personal": "Personal",
@@ -577,7 +714,7 @@
577
714
  "route.dossiers.manager.pivot.format": "Pivot format",
578
715
  "route.dossiers.manager.pivot.icon": "Pivot Icon",
579
716
  "route.dossiers.manager.pivot.label.en": "English Title",
580
- "route.dossiers.manager.pivot.label.fr": "Titre français",
717
+ "route.dossiers.manager.pivot.label.fr": "Titre francais",
581
718
  "route.dossiers.manager.pivot.mapping.custom": "Custom Value",
582
719
  "route.dossiers.manager.pivot.mapping.field": "Hit Field",
583
720
  "route.dossiers.manager.pivot.mapping.key": "Key",
@@ -698,7 +835,6 @@
698
835
  "route.templates.personal": "Personal",
699
836
  "route.templates.prompt": "Activate autocomplete using [ctrl + space].",
700
837
  "route.templates.readonly.warning": "This is a built-in template, and cannot be edited. To make changes to it, contact",
701
- "route.templates.rule.explanation": "This is a Howler Analytic. There is only one detection, which has been pre-selected.",
702
838
  "route.templates.search.prompt": "Search by analytic, detection, or template keys.",
703
839
  "route.templates.select": "Select an analytic and detection to view and edit the template.",
704
840
  "route.templates.view": "View Template",
@@ -732,11 +868,19 @@
732
868
  "rule.interval.thirty.minutes": "Every thirty minutes",
733
869
  "rule.interval.three.hours": "Every three hours",
734
870
  "save": "Save",
871
+ "search.fuzzy.no_results": "No results found.",
872
+ "search.fuzzy.placeholder": "Search by IP, domain, hash, email, or keyword...",
873
+ "search.fuzzy.results.cases": "Cases",
874
+ "search.fuzzy.results.events": "Events",
875
+ "search.fuzzy.results.hits": "Hits",
876
+ "search.fuzzy.title": "Fuzzy Search",
877
+ "search.fuzzy.total_results": "results found",
735
878
  "search.layout.settings": "Edit search result layout",
736
879
  "search.open": "Open Search",
737
880
  "search.result.showing": "Showing {{offset}} to {{length}} of {{total}} results",
738
881
  "search.result.showing.single": "No results",
739
882
  "search.total": "There are a total of {{count}} hits matching this query.",
883
+ "started": "Started",
740
884
  "templates.edit.analytic": "Edit analytic template",
741
885
  "templates.edit.detection": "Edit detection template",
742
886
  "to": "to",