@cccsaurora/howler-ui 3.1.0-dev.1493 → 3.1.0-dev.1602

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 (727) hide show
  1. package/api/action/execute.d.ts +1 -1
  2. package/api/action/index.d.ts +10 -6
  3. package/api/action/index.js +5 -9
  4. package/api/action/operations.js +2 -2
  5. package/api/analytic/comments/index.d.ts +4 -6
  6. package/api/analytic/comments/react.d.ts +2 -2
  7. package/api/analytic/favourite.d.ts +2 -4
  8. package/api/analytic/index.d.ts +7 -4
  9. package/api/analytic/index.js +2 -2
  10. package/api/analytic/notebooks/index.d.ts +2 -4
  11. package/api/analytic/owner.d.ts +1 -1
  12. package/api/auth/apikey.d.ts +2 -2
  13. package/api/auth/login.d.ts +2 -2
  14. package/api/configs/index.d.ts +1 -1
  15. package/api/dossier.d.ts +16 -0
  16. package/api/{dossier/index.js → dossier.js} +6 -4
  17. package/api/help.d.ts +2 -2
  18. package/api/hit/assign.d.ts +6 -2
  19. package/api/hit/comments/index.d.ts +4 -6
  20. package/api/hit/comments/react.d.ts +2 -2
  21. package/api/hit/index.d.ts +3 -8
  22. package/api/hit/labels.d.ts +2 -2
  23. package/api/hit/overwrite.d.ts +1 -1
  24. package/api/hit/transition.d.ts +1 -1
  25. package/api/index.d.ts +6 -6
  26. package/api/index.js +7 -6
  27. package/api/notebook/environments.d.ts +1 -1
  28. package/api/notebook/index.d.ts +1 -1
  29. package/api/overview/index.d.ts +4 -4
  30. package/api/search/action.d.ts +1 -1
  31. package/api/search/analytic.d.ts +1 -1
  32. package/api/search/case.d.ts +1 -1
  33. package/api/search/count/hit.d.ts +1 -1
  34. package/api/search/dossier.d.ts +1 -1
  35. package/api/search/eql/hit.d.ts +1 -1
  36. package/api/search/explain/hit.d.ts +1 -1
  37. package/api/search/facet/hit.d.ts +1 -1
  38. package/api/search/fields/hit.js +1 -2
  39. package/api/search/fields/user.js +2 -4
  40. package/api/search/grouped/hit.d.ts +1 -1
  41. package/api/search/grouped/user.js +3 -0
  42. package/api/search/histogram/hit.d.ts +1 -1
  43. package/api/search/hit.d.ts +1 -1
  44. package/api/search/overview.d.ts +1 -1
  45. package/api/search/sigma/hit.d.ts +1 -1
  46. package/api/search/template.d.ts +1 -1
  47. package/api/search/user.d.ts +30 -2
  48. package/api/search/user.js +3 -0
  49. package/api/search/view.d.ts +1 -1
  50. package/api/socket/viewers.d.ts +1 -1
  51. package/api/socket/viewers.js +1 -1
  52. package/api/template/index.d.ts +3 -3
  53. package/api/template/index.js +2 -2
  54. package/api/user/avatar/index.d.ts +1 -1
  55. package/api/user/groups.d.ts +1 -1
  56. package/api/user/index.d.ts +2 -2
  57. package/api/user/whoami.d.ts +1 -1
  58. package/api/utils/createPermissionsApi.d.ts +10 -0
  59. package/api/utils/createPermissionsApi.js +10 -0
  60. package/api/v2/case/index.d.ts +4 -4
  61. package/api/v2/case/items.d.ts +3 -3
  62. package/api/v2/case/rules.d.ts +3 -3
  63. package/api/v2/fuzzy.d.ts +1 -1
  64. package/api/v2/search/facet.d.ts +1 -1
  65. package/api/v2/search/index.d.ts +1 -1
  66. package/api/view/favourite.d.ts +2 -4
  67. package/api/view/index.d.ts +9 -5
  68. package/api/view/index.js +3 -1
  69. package/branding/AppBrand.d.ts +2 -2
  70. package/branding/AppBrand.js +4 -6
  71. package/components/app/App.js +248 -51
  72. package/components/app/AppContainer.js +1 -1
  73. package/components/app/drawers/ApiKeyDrawer.js +13 -5
  74. package/components/app/drawers/AssignUserDrawer.js +11 -4
  75. package/components/app/hooks/useMatchers.d.ts +3 -3
  76. package/components/app/hooks/useMatchers.js +12 -12
  77. package/components/app/hooks/useMatchers.test.js +15 -14
  78. package/components/app/hooks/useTitle.js +8 -7
  79. package/components/app/providers/AnalyticProvider.d.ts +1 -1
  80. package/components/app/providers/AnalyticProvider.js +7 -4
  81. package/components/app/providers/ApiConfigProvider.d.ts +2 -1
  82. package/components/app/providers/ApiConfigProvider.js +12 -10
  83. package/components/app/providers/AppDrawerProvider.js +2 -2
  84. package/components/app/providers/AvatarProvider.js +18 -11
  85. package/components/app/providers/FavouritesProvider.js +56 -86
  86. package/components/app/providers/FieldProvider.js +1 -1
  87. package/components/app/providers/GridColumnsProvider.d.ts +1 -1
  88. package/components/app/providers/GridColumnsProvider.js +17 -4
  89. package/components/app/providers/GridColumnsProvider.test.js +2 -1
  90. package/components/app/providers/LocalStorageProvider.d.ts +2 -2
  91. package/components/app/providers/LocalStorageProvider.js +4 -3
  92. package/components/app/providers/ModalProvider.js +8 -1
  93. package/components/app/providers/OverviewProvider.js +10 -2
  94. package/components/app/providers/ParameterProvider.d.ts +7 -7
  95. package/components/app/providers/ParameterProvider.js +42 -5
  96. package/components/app/providers/ParameterProvider.test.js +1 -0
  97. package/components/app/providers/RecordProvider.js +7 -1
  98. package/components/app/providers/RecordSearchProvider.d.ts +1 -2
  99. package/components/app/providers/RecordSearchProvider.js +32 -23
  100. package/components/app/providers/RecordSearchProvider.test.js +2 -1
  101. package/components/app/providers/SearchResponseProvider.d.ts +9 -6
  102. package/components/app/providers/SearchResponseProvider.js +37 -19
  103. package/components/app/providers/SearchResponseProvider.test.js +37 -11
  104. package/components/app/providers/SocketProvider.js +6 -4
  105. package/components/app/providers/UserListProvider.d.ts +1 -1
  106. package/components/app/providers/ViewProvider.d.ts +2 -2
  107. package/components/app/providers/ViewProvider.js +22 -12
  108. package/components/app/providers/ViewProvider.test.js +2 -2
  109. package/components/app/providers/contextUtils.d.ts +1 -0
  110. package/components/app/providers/contextUtils.js +3 -0
  111. package/components/elements/Comment.d.ts +1 -1
  112. package/components/elements/Comment.js +11 -9
  113. package/components/elements/ContextMenu.js +1 -1
  114. package/components/elements/ContextMenu.test.js +2 -2
  115. package/components/elements/EditRow.d.ts +9 -4
  116. package/components/elements/EditRow.js +5 -4
  117. package/components/elements/MarkdownEditor.js +1 -1
  118. package/components/elements/MembershipManagement.test.js +178 -0
  119. package/components/elements/ObjectDetails.js +6 -6
  120. package/components/elements/ThemedEditor.js +17 -17
  121. package/components/elements/UserList.d.ts +2 -0
  122. package/components/elements/UserList.js +26 -18
  123. package/components/elements/UserList.test.js +24 -1
  124. package/components/elements/addons/buttons/CustomButton.d.ts +1 -1
  125. package/components/elements/addons/buttons/CustomButton.js +2 -2
  126. package/components/elements/addons/buttons/CustomIconButton.d.ts +1 -1
  127. package/components/elements/addons/buttons/CustomIconButton.js +3 -3
  128. package/components/elements/addons/buttons/index.d.ts +1 -1
  129. package/components/elements/addons/layout/FlexOne.d.ts +2 -2
  130. package/components/elements/addons/layout/FlexOne.test.js +1 -0
  131. package/components/elements/addons/layout/FlexPort.d.ts +1 -1
  132. package/components/elements/addons/layout/FlexPort.js +9 -2
  133. package/components/elements/addons/layout/FlexVertical.d.ts +2 -2
  134. package/components/elements/addons/layout/FlexVertical.js +1 -1
  135. package/components/elements/addons/layout/vsbox/VSBox.d.ts +2 -2
  136. package/components/elements/addons/layout/vsbox/VSBox.js +5 -4
  137. package/components/elements/addons/layout/vsbox/VSBoxElement.d.ts +1 -1
  138. package/components/elements/addons/layout/vsbox/VSBoxHeader.js +4 -3
  139. package/components/elements/addons/lists/TuiList.d.ts +2 -2
  140. package/components/elements/addons/lists/TuiList.js +1 -1
  141. package/components/elements/addons/lists/TuiListBase.d.ts +2 -2
  142. package/components/elements/addons/lists/TuiListBase.js +4 -4
  143. package/components/elements/addons/lists/TuiListElement.d.ts +2 -2
  144. package/components/elements/addons/lists/TuiListElement.js +2 -2
  145. package/components/elements/addons/lists/TuiListMenu.d.ts +13 -37
  146. package/components/elements/addons/lists/TuiListMenu.js +8 -8
  147. package/components/elements/addons/lists/TuiListProvider.d.ts +2 -2
  148. package/components/elements/addons/lists/TuiListProvider.js +4 -4
  149. package/components/elements/addons/lists/hooks/useTuiListKeyboard.js +1 -1
  150. package/components/elements/addons/lists/table/TuiTable.d.ts +1 -1
  151. package/components/elements/addons/lists/table/TuiTable.js +1 -1
  152. package/components/elements/addons/lists/table/TuiTableBody.d.ts +1 -1
  153. package/components/elements/addons/lists/table/TuiTableBody.js +1 -1
  154. package/components/elements/addons/lists/table/TuiTableHead.d.ts +1 -1
  155. package/components/elements/addons/lists/table/TuiTableHead.js +1 -1
  156. package/components/elements/addons/lists/table/TuiTableHeader.d.ts +1 -1
  157. package/components/elements/addons/lists/table/TuiTableLayout.js +1 -1
  158. package/components/elements/addons/search/SearchPagination.d.ts +1 -1
  159. package/components/elements/addons/search/SearchPagination.test.js +1 -1
  160. package/components/elements/addons/search/SearchTotal.d.ts +1 -1
  161. package/components/elements/addons/search/phrase/Phrase.d.ts +2 -2
  162. package/components/elements/addons/search/phrase/Phrase.js +7 -7
  163. package/components/elements/addons/search/phrase/PhraseConsumer.d.ts +2 -2
  164. package/components/elements/addons/search/phrase/PhraseLexer.d.ts +1 -1
  165. package/components/elements/addons/search/phrase/PhraseLexer.js +6 -6
  166. package/components/elements/addons/search/phrase/WordLexer.test.js +1 -0
  167. package/components/elements/addons/search/phrase/index.d.ts +2 -2
  168. package/components/elements/addons/search/phrase/index.js +3 -2
  169. package/components/elements/addons/search/phrase/word/consumers/WhitespaceConsumer.d.ts +1 -1
  170. package/components/elements/addons/search/phrase/word/consumers/WhitespaceConsumer.js +1 -1
  171. package/components/elements/addons/search/phrase/word/consumers/WordConsumer.d.ts +1 -1
  172. package/components/elements/case/CaseCard.js +10 -4
  173. package/components/elements/case/CasePreview.js +1 -1
  174. package/components/elements/display/ActionButton.js +3 -1
  175. package/components/elements/display/ChipPopper.js +1 -1
  176. package/components/elements/display/ChipPopper.test.js +1 -0
  177. package/components/elements/display/Classification.js +6 -5
  178. package/components/elements/display/ClassificationChip.d.ts +2 -4
  179. package/components/elements/display/ClassificationChip.js +5 -3
  180. package/components/elements/display/DocumentationButton.js +1 -1
  181. package/components/elements/display/DocumentationButton.test.js +1 -1
  182. package/components/elements/display/HandlebarsMarkdown.js +2 -2
  183. package/components/elements/display/HowlerAvatar.d.ts +1 -0
  184. package/components/elements/display/HowlerAvatar.js +5 -4
  185. package/components/elements/display/HowlerAvatarHeader.js +2 -2
  186. package/components/elements/display/Image.test.js +1 -0
  187. package/components/elements/display/ItemManager.d.ts +6 -6
  188. package/components/elements/display/ItemManager.js +1 -1
  189. package/components/elements/display/Markdown.js +9 -3
  190. package/components/elements/display/Modal.js +3 -3
  191. package/components/elements/display/QueryResultText.js +1 -1
  192. package/components/elements/display/TextDivider.test.js +1 -0
  193. package/components/elements/display/TypingIndicator.d.ts +1 -1
  194. package/components/elements/display/UserPageWrapper.js +2 -2
  195. package/components/elements/display/handlebars/helpers.js +1 -1
  196. package/components/elements/display/json/JSONViewer.js +2 -2
  197. package/components/elements/display/markdownPlugins/tabs.js +4 -0
  198. package/components/elements/display/modals/CreateActionModal.js +1 -1
  199. package/components/elements/display/modals/RationaleModal.js +1 -2
  200. package/components/elements/display/modals/RationaleModal.test.js +9 -5
  201. package/components/elements/event/EventPreview.js +1 -1
  202. package/components/elements/hit/HitActions.js +5 -7
  203. package/components/elements/hit/HitBanner.js +4 -16
  204. package/components/elements/hit/HitBanner.test.js +11 -20
  205. package/components/elements/hit/HitLabels.js +23 -13
  206. package/components/elements/hit/HitLinks.js +4 -4
  207. package/components/elements/hit/HitNotebooks.js +28 -10
  208. package/components/elements/hit/HitOutline.js +9 -15
  209. package/components/elements/hit/HitOutline.test.js +5 -5
  210. package/components/elements/hit/HitOverview.js +3 -3
  211. package/components/elements/hit/HitPreview.d.ts +1 -1
  212. package/components/elements/hit/HitPreview.js +6 -7
  213. package/components/elements/hit/HitSummary.js +8 -8
  214. package/components/elements/hit/PivotTooltip.js +1 -1
  215. package/components/elements/hit/actions/ButtonActions.js +2 -2
  216. package/components/elements/hit/actions/DropdownActions.js +4 -4
  217. package/components/elements/hit/aggregate/HitGraph.js +28 -11
  218. package/components/elements/hit/elements/AnalyticLink.js +2 -2
  219. package/components/elements/hit/elements/AnalyticLink.test.js +1 -1
  220. package/components/elements/hit/elements/Assigned.js +1 -1
  221. package/components/elements/hit/elements/Assigned.test.js +1 -1
  222. package/components/elements/hit/elements/EscalationChip.js +2 -2
  223. package/components/elements/hit/elements/HitTimestamp.js +2 -2
  224. package/components/elements/hit/grid/AddColumnModal.js +2 -2
  225. package/components/elements/hit/grid/ColumnHeader.js +1 -1
  226. package/components/elements/hit/grid/RecordRow.js +1 -1
  227. package/components/elements/hit/grid/RecordTable.d.ts +4 -3
  228. package/components/elements/hit/grid/RecordTable.js +6 -6
  229. package/components/elements/hit/related/PivotLink.js +2 -2
  230. package/components/elements/hit/related/RelatedIcon.js +2 -2
  231. package/components/elements/hit/related/RelatedLink.js +1 -1
  232. package/components/elements/hit/related/RelatedRecords.js +1 -1
  233. package/components/elements/membership/Members.d.ts +6 -0
  234. package/components/elements/membership/Members.js +14 -0
  235. package/components/elements/membership/MembershipManagement.d.ts +9 -0
  236. package/components/elements/membership/MembershipManagement.js +119 -0
  237. package/components/elements/membership/types.d.ts +7 -0
  238. package/components/elements/membership/utils.d.ts +2 -0
  239. package/components/elements/membership/utils.js +6 -0
  240. package/components/elements/record/RecordComments.js +16 -10
  241. package/components/elements/record/RecordContextMenu.d.ts +2 -2
  242. package/components/elements/record/RecordContextMenu.js +11 -5
  243. package/components/elements/record/RecordContextMenu.test.js +14 -6
  244. package/components/elements/record/RecordRelated.js +2 -2
  245. package/components/elements/search/FuzzySearchBar.js +1 -1
  246. package/components/elements/view/LayoutToggle.d.ts +1 -1
  247. package/components/elements/view/ViewTitle.js +3 -4
  248. package/components/hooks/useHitActions.d.ts +1 -1
  249. package/components/hooks/useHitActions.js +25 -15
  250. package/components/hooks/useLocalStorage.d.ts +1 -1
  251. package/components/hooks/useLocalStorage.js +1 -1
  252. package/components/hooks/useLocalStorageItem.d.ts +11 -1
  253. package/components/hooks/useLocalStorageItem.js +7 -5
  254. package/components/hooks/useLocalStorageItem.test.js +23 -0
  255. package/components/hooks/useMyAccessibility.d.ts +7 -0
  256. package/components/hooks/useMyAccessibility.js +21 -0
  257. package/components/hooks/useMyApi.d.ts +1 -1
  258. package/components/hooks/useMyApi.js +4 -4
  259. package/components/hooks/useMyChart.d.ts +46 -48
  260. package/components/hooks/useMyChart.js +30 -9
  261. package/components/hooks/useMyCookies.d.ts +3 -0
  262. package/components/hooks/useMyCookies.js +8 -0
  263. package/components/hooks/useMyLocalStorage.d.ts +8 -2
  264. package/components/hooks/useMyLocalStorage.js +1 -1
  265. package/components/hooks/useMyPreferences.d.ts +1 -1
  266. package/components/hooks/useMyPreferences.js +93 -127
  267. package/components/hooks/useMyRouter.d.ts +2 -0
  268. package/components/hooks/useMyRouter.js +24 -0
  269. package/components/hooks/useMySearch.d.ts +1 -1
  270. package/components/hooks/useMySearch.js +17 -7
  271. package/components/hooks/useMySnackbar.js +1 -1
  272. package/components/hooks/useMyTheme.d.ts +1 -1
  273. package/components/hooks/useMyTheme.js +13 -8
  274. package/components/hooks/useMyTheme.test.js +11 -6
  275. package/components/hooks/useMyUser.d.ts +1 -1
  276. package/components/hooks/useMyUser.js +6 -5
  277. package/components/hooks/useMyUserFunctions.d.ts +2 -2
  278. package/components/hooks/useMyUserFunctions.js +14 -10
  279. package/components/hooks/useMyUserList.d.ts +1 -1
  280. package/components/hooks/useMyUtils.js +1 -1
  281. package/components/hooks/useParamState.js +5 -3
  282. package/components/hooks/useParamState.test.js +1 -1
  283. package/components/hooks/useRecordSelection.d.ts +4 -3
  284. package/components/hooks/useRecordSelection.js +5 -5
  285. package/components/hooks/useScrollRestoration.js +3 -3
  286. package/components/logins/Login.d.ts +1 -1
  287. package/components/logins/Login.js +4 -6
  288. package/components/logins/auth/OAuthLogin.js +1 -1
  289. package/components/logins/auth/UserPassLogin.d.ts +1 -1
  290. package/components/logins/hooks/useLogin.js +10 -6
  291. package/components/routes/403.js +1 -1
  292. package/components/routes/403.test.js +7 -3
  293. package/components/routes/404.js +1 -1
  294. package/components/routes/404.test.js +7 -3
  295. package/components/routes/ErrorBoundary.d.ts +2 -2
  296. package/components/routes/ErrorBoundary.js +2 -2
  297. package/components/routes/ErrorBoundary.test.js +1 -4
  298. package/components/routes/ErrorOccured.js +1 -1
  299. package/components/routes/ErrorOccured.test.js +7 -3
  300. package/components/routes/Logout.js +3 -4
  301. package/components/routes/Logout.test.js +12 -11
  302. package/components/routes/action/edit/ActionEditor.js +38 -30
  303. package/components/routes/action/shared/ActionReportDisplay.js +1 -1
  304. package/components/routes/action/shared/OperationEntry.js +2 -2
  305. package/components/routes/action/shared/OperationStep.js +12 -10
  306. package/components/routes/action/useMyActionFunctions.d.ts +3 -3
  307. package/components/routes/action/useMyActionFunctions.js +13 -13
  308. package/components/routes/action/view/ActionDetails.d.ts +1 -1
  309. package/components/routes/action/view/ActionDetails.js +46 -26
  310. package/components/routes/action/view/ActionSearch.js +11 -10
  311. package/components/routes/action/view/Integrations.js +2 -2
  312. package/components/routes/action/view/markdown/integrations.en.md.js +1 -1
  313. package/components/routes/action/view/markdown/integrations.fr.md.js +1 -1
  314. package/components/routes/admin/users/UserEditor.js +21 -8
  315. package/components/routes/admin/users/UserSearch.js +10 -9
  316. package/components/routes/advanced/QueryBuilder.js +17 -11
  317. package/components/routes/advanced/luceneCompletionProvider.js +42 -21
  318. package/components/routes/analytics/AnalyticComments.js +19 -14
  319. package/components/routes/analytics/AnalyticDetails.d.ts +1 -1
  320. package/components/routes/analytics/AnalyticDetails.js +20 -16
  321. package/components/routes/analytics/AnalyticHitComments.js +13 -6
  322. package/components/routes/analytics/AnalyticHitComments.test.js +5 -4
  323. package/components/routes/analytics/AnalyticNotebooks.js +5 -5
  324. package/components/routes/analytics/AnalyticOverview.js +28 -15
  325. package/components/routes/analytics/AnalyticOverviews.js +2 -2
  326. package/components/routes/analytics/AnalyticSearch.js +11 -10
  327. package/components/routes/analytics/AnalyticTemplates.js +3 -3
  328. package/components/routes/analytics/TriageSettings.d.ts +1 -1
  329. package/components/routes/analytics/TriageSettings.js +1 -1
  330. package/components/routes/analytics/widgets/Assessment.js +1 -1
  331. package/components/routes/analytics/widgets/Created.js +9 -9
  332. package/components/routes/analytics/widgets/Escalation.js +3 -3
  333. package/components/routes/analytics/widgets/Stacked.js +5 -5
  334. package/components/routes/analytics/widgets/Status.js +2 -2
  335. package/components/routes/cases/CaseViewer.js +1 -1
  336. package/components/routes/cases/CaseViewer.test.js +2 -2
  337. package/components/routes/cases/Cases.d.ts +1 -1
  338. package/components/routes/cases/Cases.js +8 -7
  339. package/components/routes/cases/constants.d.ts +3 -3
  340. package/components/routes/cases/detail/AlertPanel.js +1 -1
  341. package/components/routes/cases/detail/AlertPanel.test.js +4 -6
  342. package/components/routes/cases/detail/CaseDashboard.js +8 -4
  343. package/components/routes/cases/detail/CaseDashboard.test.js +2 -2
  344. package/components/routes/cases/detail/CaseDetails.js +7 -2
  345. package/components/routes/cases/detail/CaseDetails.test.js +1 -1
  346. package/components/routes/cases/detail/CaseObservables.js +5 -4
  347. package/components/routes/cases/detail/CaseObservables.test.js +1 -1
  348. package/components/routes/cases/detail/CaseOverview.js +2 -2
  349. package/components/routes/cases/detail/CaseRules.js +10 -6
  350. package/components/routes/cases/detail/CaseRules.test.js +2 -2
  351. package/components/routes/cases/detail/CaseSearch.js +5 -5
  352. package/components/routes/cases/detail/CaseSearch.test.js +2 -2
  353. package/components/routes/cases/detail/CaseSidebar.js +12 -7
  354. package/components/routes/cases/detail/CaseSidebar.test.js +5 -6
  355. package/components/routes/cases/detail/CaseTask.js +27 -15
  356. package/components/routes/cases/detail/CaseTask.test.js +8 -1
  357. package/components/routes/cases/detail/CaseTimeline.js +8 -8
  358. package/components/routes/cases/detail/CaseTimeline.test.js +6 -6
  359. package/components/routes/cases/detail/CreateRuleDialog.js +4 -4
  360. package/components/routes/cases/detail/CreateRuleDialog.test.js +2 -2
  361. package/components/routes/cases/detail/ItemPage.js +3 -3
  362. package/components/routes/cases/detail/MarkdownPage.test.js +0 -4
  363. package/components/routes/cases/detail/RelatedCasePanel.js +1 -1
  364. package/components/routes/cases/detail/RelatedCasePanel.test.js +4 -6
  365. package/components/routes/cases/detail/TaskPanel.js +8 -8
  366. package/components/routes/cases/detail/TaskPanel.test.js +3 -3
  367. package/components/routes/cases/detail/aggregates/CaseAggregate.js +1 -1
  368. package/components/routes/cases/detail/aggregates/SourceAggregate.js +3 -3
  369. package/components/routes/cases/detail/observables/Observable.js +4 -5
  370. package/components/routes/cases/detail/observables/Observable.test.js +1 -1
  371. package/components/routes/cases/detail/observables/ObservableTable.js +3 -3
  372. package/components/routes/cases/detail/observables/ObservableTable.test.js +1 -1
  373. package/components/routes/cases/detail/sidebar/CaseFolder.js +24 -20
  374. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +1 -1
  375. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +4 -2
  376. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +3 -2
  377. package/components/routes/cases/detail/sidebar/FolderEntry.js +3 -3
  378. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +3 -3
  379. package/components/routes/cases/detail/sidebar/types.d.ts +1 -1
  380. package/components/routes/cases/detail/sidebar/utils.js +1 -1
  381. package/components/routes/cases/detail/sidebar/utils.test.js +8 -8
  382. package/components/routes/cases/detail/utils.d.ts +1 -1
  383. package/components/routes/cases/detail/utils.js +3 -2
  384. package/components/routes/cases/hooks/useCase.js +14 -2
  385. package/components/routes/cases/modals/AddRecordToCaseModal.test.js +1 -1
  386. package/components/routes/cases/modals/AddToCaseModal.d.ts +1 -1
  387. package/components/routes/cases/modals/AddToCaseModal.js +2 -2
  388. package/components/routes/cases/modals/CreateCaseModal.test.js +1 -1
  389. package/components/routes/cases/modals/ResolveModal.js +8 -5
  390. package/components/routes/cases/modals/ResolveModal.test.js +5 -5
  391. package/components/routes/cases/modals/hooks.js +1 -2
  392. package/components/routes/cases/modals/types.d.ts +1 -1
  393. package/components/routes/cases/search/CaseAssigneeFilter.js +1 -1
  394. package/components/routes/cases/search/CaseAssigneeFilter.test.js +8 -3
  395. package/components/routes/cases/search/CaseStatusFilter.test.js +1 -0
  396. package/components/routes/cases/utils.d.ts +0 -1
  397. package/components/routes/cases/utils.js +4 -13
  398. package/components/routes/dossiers/DossierCard.js +3 -3
  399. package/components/routes/dossiers/DossierCard.test.js +6 -6
  400. package/components/routes/dossiers/DossierEditor.js +61 -25
  401. package/components/routes/dossiers/DossierEditor.test.js +16 -9
  402. package/components/routes/dossiers/Dossiers.d.ts +1 -1
  403. package/components/routes/dossiers/Dossiers.js +6 -5
  404. package/components/routes/dossiers/LeadEditor.d.ts +1 -1
  405. package/components/routes/dossiers/LeadEditor.js +2 -2
  406. package/components/routes/dossiers/LeadForm.js +2 -2
  407. package/components/routes/dossiers/PivotForm.d.ts +1 -1
  408. package/components/routes/dossiers/PivotForm.js +10 -9
  409. package/components/routes/events/EventViewer.js +1 -1
  410. package/components/routes/help/ActionDocumentation.js +2 -2
  411. package/components/routes/help/ActionIntroductionDocumentation.js +2 -2
  412. package/components/routes/help/ApiDocumentation.js +3 -4
  413. package/components/routes/help/AuthDocumentation.js +1 -1
  414. package/components/routes/help/ClientDocumentation.js +1 -1
  415. package/components/routes/help/Help.d.ts +1 -1
  416. package/components/routes/help/Help.js +5 -4
  417. package/components/routes/help/HitDocumentation.js +3 -3
  418. package/components/routes/help/HitLabelsDocumentation.js +12 -12
  419. package/components/routes/help/HitLinksDocumentation.js +2 -2
  420. package/components/routes/help/HitSchemaDocumentation.js +14 -8
  421. package/components/routes/help/NotebookDocumentation.js +1 -1
  422. package/components/routes/help/OverviewDocumentation.js +1 -1
  423. package/components/routes/help/RetentionDocumentation.js +3 -3
  424. package/components/routes/help/SearchDocumentation.js +6 -4
  425. package/components/routes/help/TemplateDocumentation.js +2 -2
  426. package/components/routes/help/ViewDocumentation.js +1 -1
  427. package/components/routes/help/markdown/en/views.md.js +1 -1
  428. package/components/routes/help/markdown/fr/views.md.js +1 -1
  429. package/components/routes/hits/search/InformationPane.js +8 -8
  430. package/components/routes/hits/search/QuerySettings.js +1 -1
  431. package/components/routes/hits/search/QuerySettings.test.js +8 -4
  432. package/components/routes/hits/search/RecordBrowser.js +12 -9
  433. package/components/routes/hits/search/RecordQuery.js +13 -10
  434. package/components/routes/hits/search/SearchPane.js +2 -3
  435. package/components/routes/hits/search/ViewLink.js +4 -4
  436. package/components/routes/hits/search/ViewLink.test.js +1 -0
  437. package/components/routes/hits/search/grid/RecordGrid.js +1 -1
  438. package/components/routes/hits/search/shared/CustomSort.js +3 -2
  439. package/components/routes/hits/search/shared/CustomSpan.js +9 -1
  440. package/components/routes/hits/search/shared/HitFilter.js +8 -3
  441. package/components/routes/hits/search/shared/HitSort.js +8 -6
  442. package/components/routes/hits/search/shared/IndexPicker.js +1 -1
  443. package/components/routes/hits/search/shared/LayoutSettings.js +1 -1
  444. package/components/routes/hits/search/shared/SearchActionMenu.d.ts +1 -1
  445. package/components/routes/hits/search/shared/SearchActionMenu.js +1 -1
  446. package/components/routes/hits/search/shared/SearchSpan.js +1 -1
  447. package/components/routes/hits/view/HitViewer.js +21 -11
  448. package/components/routes/hits/view/HitViewer.test.js +2 -2
  449. package/components/routes/home/AddNewCard.d.ts +2 -1
  450. package/components/routes/home/AddNewCard.js +7 -4
  451. package/components/routes/home/AnalyticCard.js +3 -3
  452. package/components/routes/home/EntryWrapper.js +1 -1
  453. package/components/routes/home/ViewCard.js +11 -7
  454. package/components/routes/home/ViewCard.test.js +3 -6
  455. package/components/routes/home/index.js +20 -17
  456. package/components/routes/overviews/OverviewCard.js +6 -2
  457. package/components/routes/overviews/OverviewViewer.d.ts +1 -1
  458. package/components/routes/overviews/OverviewViewer.js +48 -39
  459. package/components/routes/overviews/Overviews.d.ts +1 -1
  460. package/components/routes/overviews/Overviews.js +7 -6
  461. package/components/routes/overviews/markdownExtendedTokenProvider.test.js +1 -0
  462. package/components/routes/overviews/startingTemplate.js +1 -1
  463. package/components/routes/settings/ProfileSection.d.ts +1 -1
  464. package/components/routes/settings/ProfileSection.js +2 -2
  465. package/components/routes/settings/SecuritySection.d.ts +1 -1
  466. package/components/routes/settings/SecuritySection.js +2 -2
  467. package/components/routes/settings/Settings.js +6 -6
  468. package/components/routes/templates/TemplateCard.js +1 -1
  469. package/components/routes/templates/TemplateEditor.d.ts +1 -1
  470. package/components/routes/templates/TemplateEditor.js +3 -3
  471. package/components/routes/templates/TemplateViewer.d.ts +1 -1
  472. package/components/routes/templates/TemplateViewer.js +54 -52
  473. package/components/routes/templates/Templates.d.ts +1 -1
  474. package/components/routes/templates/Templates.js +10 -9
  475. package/components/routes/views/ViewComposer.js +38 -30
  476. package/components/routes/views/Views.d.ts +2 -1
  477. package/components/routes/views/Views.js +20 -14
  478. package/i18n.js +4 -0
  479. package/locales/en/translation.json +10 -0
  480. package/locales/fr/translation.json +10 -0
  481. package/models/entities/HowlerUser.d.ts +1 -1
  482. package/models/entities/generated/Action.d.ts +3 -1
  483. package/models/entities/generated/ApiType.d.ts +2 -3
  484. package/models/entities/generated/Dossier.d.ts +2 -0
  485. package/models/entities/generated/HowlerDossier.d.ts +2 -0
  486. package/models/entities/generated/Item.d.ts +2 -2
  487. package/models/entities/generated/Settings.d.ts +1 -1
  488. package/models/entities/generated/View.d.ts +2 -0
  489. package/package.json +102 -118
  490. package/plugins/HowlerPlugin.d.ts +9 -50
  491. package/plugins/HowlerPlugin.js +7 -113
  492. package/plugins/clue/Provider.js +1 -1
  493. package/plugins/clue/components/ClueLeadForm.js +2 -2
  494. package/plugins/clue/components/CluePivot.js +6 -7
  495. package/plugins/clue/components/CluePivotForm.js +26 -15
  496. package/plugins/clue/components/ClueTypography.js +2 -2
  497. package/plugins/clue/helpers.js +5 -5
  498. package/plugins/clue/index.d.ts +2 -2
  499. package/plugins/clue/index.js +1 -1
  500. package/plugins/clue/setup.js +1 -1
  501. package/plugins/clue/utils.d.ts +1 -1
  502. package/plugins/store.d.ts +26 -43
  503. package/plugins/store.js +2 -15
  504. package/rest/AxiosClient.js +3 -3
  505. package/rest/FetchClient.d.ts +1 -1
  506. package/rest/FetchClient.js +8 -5
  507. package/rest/FetchClient.test.js +7 -4
  508. package/rest/index.d.ts +4 -3
  509. package/setupTests.d.ts +3 -0
  510. package/tests/MockLocalStorage.js +2 -1
  511. package/tests/mocks.d.ts +2 -2
  512. package/tests/mocks.js +3 -3
  513. package/tests/server-handlers.js +1 -1
  514. package/utils/Throttler.js +1 -1
  515. package/utils/actionUtils.d.ts +1 -1
  516. package/utils/actionUtils.js +10 -6
  517. package/utils/classificationParser.js +56 -63
  518. package/utils/constants.d.ts +0 -17
  519. package/utils/constants.js +1 -18
  520. package/utils/exampleHit.d.ts +2 -0
  521. package/utils/exampleHit.js +18 -0
  522. package/utils/localStorage.d.ts +2 -2
  523. package/utils/localStorage.js +1 -1
  524. package/utils/menuUtils.d.ts +3 -89
  525. package/utils/menuUtils.js +66 -227
  526. package/utils/menuUtils.test.js +45 -181
  527. package/utils/sessionStorage.js +1 -1
  528. package/utils/sessionStorage.test.js +1 -0
  529. package/utils/stringUtils.d.ts +1 -1
  530. package/utils/utils.d.ts +30 -6
  531. package/utils/utils.js +66 -9
  532. package/utils/utils.test.js +1 -0
  533. package/utils/xsrf.d.ts +1 -1
  534. package/utils/xsrf.js +5 -10
  535. package/api/dossier/hit.d.ts +0 -2
  536. package/api/dossier/hit.js +0 -7
  537. package/api/dossier/index.d.ts +0 -9
  538. package/commons/components/app/AppConfigs.d.ts +0 -137
  539. package/commons/components/app/AppConstants.d.ts +0 -10
  540. package/commons/components/app/AppConstants.js +0 -10
  541. package/commons/components/app/AppContexts.d.ts +0 -105
  542. package/commons/components/app/AppContexts.js +0 -21
  543. package/commons/components/app/AppDefaults.d.ts +0 -6
  544. package/commons/components/app/AppDefaults.js +0 -40
  545. package/commons/components/app/AppNotificationService.d.ts +0 -6
  546. package/commons/components/app/AppNotificationService.js +0 -1
  547. package/commons/components/app/AppProvider.d.ts +0 -15
  548. package/commons/components/app/AppProvider.js +0 -41
  549. package/commons/components/app/AppSearchService.d.ts +0 -21
  550. package/commons/components/app/AppSearchService.js +0 -1
  551. package/commons/components/app/AppSkeleton.d.ts +0 -5
  552. package/commons/components/app/AppSkeleton.js +0 -152
  553. package/commons/components/app/AppUserService.d.ts +0 -17
  554. package/commons/components/app/AppUserService.js +0 -1
  555. package/commons/components/app/hooks/index.d.ts +0 -18
  556. package/commons/components/app/hooks/index.js +0 -18
  557. package/commons/components/app/hooks/useApp.d.ts +0 -1
  558. package/commons/components/app/hooks/useApp.js +0 -5
  559. package/commons/components/app/hooks/useAppBanner.d.ts +0 -1
  560. package/commons/components/app/hooks/useAppBanner.js +0 -6
  561. package/commons/components/app/hooks/useAppBar.d.ts +0 -1
  562. package/commons/components/app/hooks/useAppBar.js +0 -5
  563. package/commons/components/app/hooks/useAppBarHeight.d.ts +0 -2
  564. package/commons/components/app/hooks/useAppBarHeight.js +0 -22
  565. package/commons/components/app/hooks/useAppBarScrollTrigger.d.ts +0 -1
  566. package/commons/components/app/hooks/useAppBarScrollTrigger.js +0 -7
  567. package/commons/components/app/hooks/useAppBreadcrumbs.d.ts +0 -1
  568. package/commons/components/app/hooks/useAppBreadcrumbs.js +0 -5
  569. package/commons/components/app/hooks/useAppConfigs.d.ts +0 -59
  570. package/commons/components/app/hooks/useAppConfigs.js +0 -44
  571. package/commons/components/app/hooks/useAppLanguage.d.ts +0 -6
  572. package/commons/components/app/hooks/useAppLanguage.js +0 -17
  573. package/commons/components/app/hooks/useAppLayout.d.ts +0 -1
  574. package/commons/components/app/hooks/useAppLayout.js +0 -5
  575. package/commons/components/app/hooks/useAppLeftNav.d.ts +0 -1
  576. package/commons/components/app/hooks/useAppLeftNav.js +0 -5
  577. package/commons/components/app/hooks/useAppLogo.d.ts +0 -1
  578. package/commons/components/app/hooks/useAppLogo.js +0 -8
  579. package/commons/components/app/hooks/useAppNotification.d.ts +0 -1
  580. package/commons/components/app/hooks/useAppNotification.js +0 -5
  581. package/commons/components/app/hooks/useAppQuickSearch.d.ts +0 -1
  582. package/commons/components/app/hooks/useAppQuickSearch.js +0 -5
  583. package/commons/components/app/hooks/useAppSearchService.d.ts +0 -2
  584. package/commons/components/app/hooks/useAppSearchService.js +0 -5
  585. package/commons/components/app/hooks/useAppSitemap.d.ts +0 -16
  586. package/commons/components/app/hooks/useAppSitemap.js +0 -70
  587. package/commons/components/app/hooks/useAppSwitcher.d.ts +0 -1
  588. package/commons/components/app/hooks/useAppSwitcher.js +0 -5
  589. package/commons/components/app/hooks/useAppTheme.d.ts +0 -8
  590. package/commons/components/app/hooks/useAppTheme.js +0 -12
  591. package/commons/components/app/hooks/useAppUser.d.ts +0 -2
  592. package/commons/components/app/hooks/useAppUser.js +0 -5
  593. package/commons/components/app/providers/AppBarProvider.d.ts +0 -10
  594. package/commons/components/app/providers/AppBarProvider.js +0 -24
  595. package/commons/components/app/providers/AppBreadcrumbsProvider.d.ts +0 -6
  596. package/commons/components/app/providers/AppBreadcrumbsProvider.js +0 -43
  597. package/commons/components/app/providers/AppLayoutProvider.d.ts +0 -6
  598. package/commons/components/app/providers/AppLayoutProvider.js +0 -73
  599. package/commons/components/app/providers/AppLeftNavProvider.d.ts +0 -6
  600. package/commons/components/app/providers/AppLeftNavProvider.js +0 -22
  601. package/commons/components/app/providers/AppNotificationProvider.d.ts +0 -6
  602. package/commons/components/app/providers/AppNotificationProvider.js +0 -31
  603. package/commons/components/app/providers/AppQuickSearchProvider.d.ts +0 -8
  604. package/commons/components/app/providers/AppQuickSearchProvider.js +0 -19
  605. package/commons/components/app/providers/AppSearchServiceProvider.d.ts +0 -6
  606. package/commons/components/app/providers/AppSearchServiceProvider.js +0 -46
  607. package/commons/components/app/providers/AppSnackbarProvider.d.ts +0 -3
  608. package/commons/components/app/providers/AppSnackbarProvider.js +0 -15
  609. package/commons/components/app/providers/AppSwitcherProvider.d.ts +0 -6
  610. package/commons/components/app/providers/AppSwitcherProvider.js +0 -10
  611. package/commons/components/app/providers/AppUserProvider.d.ts +0 -8
  612. package/commons/components/app/providers/AppUserProvider.js +0 -12
  613. package/commons/components/breadcrumbs/BreadcrumbIcon.d.ts +0 -6
  614. package/commons/components/breadcrumbs/BreadcrumbIcon.js +0 -9
  615. package/commons/components/breadcrumbs/BreadcrumbLastItem.d.ts +0 -7
  616. package/commons/components/breadcrumbs/BreadcrumbLastItem.js +0 -19
  617. package/commons/components/breadcrumbs/BreadcrumbLinkItem.d.ts +0 -7
  618. package/commons/components/breadcrumbs/BreadcrumbLinkItem.js +0 -20
  619. package/commons/components/breadcrumbs/BreadcrumbList.d.ts +0 -11
  620. package/commons/components/breadcrumbs/BreadcrumbList.js +0 -44
  621. package/commons/components/breadcrumbs/Breadcrumbs.d.ts +0 -5
  622. package/commons/components/breadcrumbs/Breadcrumbs.js +0 -31
  623. package/commons/components/display/AppAvatar.d.ts +0 -8
  624. package/commons/components/display/AppAvatar.js +0 -18
  625. package/commons/components/display/AppInfoPanel.d.ts +0 -5
  626. package/commons/components/display/AppInfoPanel.js +0 -17
  627. package/commons/components/display/AppListEmpty.d.ts +0 -2
  628. package/commons/components/display/AppListEmpty.js +0 -5
  629. package/commons/components/display/AppToc.d.ts +0 -20
  630. package/commons/components/display/AppToc.js +0 -98
  631. package/commons/components/display/hooks/useAppColor.d.ts +0 -5
  632. package/commons/components/display/hooks/useAppColor.js +0 -10
  633. package/commons/components/leftnav/LeftNavDrawer.d.ts +0 -3
  634. package/commons/components/leftnav/LeftNavDrawer.js +0 -99
  635. package/commons/components/leftnav/LeftNavGroup.d.ts +0 -8
  636. package/commons/components/leftnav/LeftNavGroup.js +0 -55
  637. package/commons/components/leftnav/LeftNavItem.d.ts +0 -11
  638. package/commons/components/leftnav/LeftNavItem.js +0 -29
  639. package/commons/components/notification/FeedModels.d.ts +0 -64
  640. package/commons/components/notification/FeedModels.js +0 -94
  641. package/commons/components/notification/Notification.d.ts +0 -10
  642. package/commons/components/notification/Notification.js +0 -95
  643. package/commons/components/notification/elements/NotificationCloseButton.d.ts +0 -3
  644. package/commons/components/notification/elements/NotificationCloseButton.js +0 -6
  645. package/commons/components/notification/elements/NotificationContainer.d.ts +0 -16
  646. package/commons/components/notification/elements/NotificationContainer.js +0 -29
  647. package/commons/components/notification/elements/NotificationEndOfPage.d.ts +0 -5
  648. package/commons/components/notification/elements/NotificationEndOfPage.js +0 -36
  649. package/commons/components/notification/elements/NotificationError.d.ts +0 -2
  650. package/commons/components/notification/elements/NotificationError.js +0 -10
  651. package/commons/components/notification/elements/NotificationHeader.d.ts +0 -8
  652. package/commons/components/notification/elements/NotificationHeader.js +0 -18
  653. package/commons/components/notification/elements/NotificationItems.d.ts +0 -12
  654. package/commons/components/notification/elements/NotificationItems.js +0 -12
  655. package/commons/components/notification/elements/NotificationSkeleton.d.ts +0 -2
  656. package/commons/components/notification/elements/NotificationSkeleton.js +0 -12
  657. package/commons/components/notification/elements/NotificationTopNavButton.d.ts +0 -9
  658. package/commons/components/notification/elements/NotificationTopNavButton.js +0 -9
  659. package/commons/components/notification/elements/item/NotificationItem.d.ts +0 -5
  660. package/commons/components/notification/elements/item/NotificationItem.js +0 -25
  661. package/commons/components/notification/elements/item/NotificationItemAuthor.d.ts +0 -5
  662. package/commons/components/notification/elements/item/NotificationItemAuthor.js +0 -31
  663. package/commons/components/notification/elements/item/NotificationItemContent.d.ts +0 -3
  664. package/commons/components/notification/elements/item/NotificationItemContent.js +0 -9
  665. package/commons/components/notification/elements/item/NotificationItemDate.d.ts +0 -3
  666. package/commons/components/notification/elements/item/NotificationItemDate.js +0 -10
  667. package/commons/components/notification/elements/item/NotificationItemImage.d.ts +0 -4
  668. package/commons/components/notification/elements/item/NotificationItemImage.js +0 -8
  669. package/commons/components/notification/elements/item/NotificationItemTag.d.ts +0 -4
  670. package/commons/components/notification/elements/item/NotificationItemTag.js +0 -12
  671. package/commons/components/notification/elements/item/NotificationItemTitle.d.ts +0 -3
  672. package/commons/components/notification/elements/item/NotificationItemTitle.js +0 -15
  673. package/commons/components/notification/index.d.ts +0 -2
  674. package/commons/components/notification/index.js +0 -2
  675. package/commons/components/pages/PageCardCentered.d.ts +0 -5
  676. package/commons/components/pages/PageCardCentered.js +0 -30
  677. package/commons/components/pages/PageCenter.d.ts +0 -9
  678. package/commons/components/pages/PageCenter.js +0 -20
  679. package/commons/components/pages/PageContent.d.ts +0 -8
  680. package/commons/components/pages/PageContent.js +0 -8
  681. package/commons/components/pages/PageFullScreen.d.ts +0 -11
  682. package/commons/components/pages/PageFullScreen.js +0 -40
  683. package/commons/components/pages/PageFullWidth.d.ts +0 -11
  684. package/commons/components/pages/PageFullWidth.js +0 -7
  685. package/commons/components/pages/PageHeader.d.ts +0 -23
  686. package/commons/components/pages/PageHeader.js +0 -27
  687. package/commons/components/pages/hooks/usePageProps.d.ts +0 -24
  688. package/commons/components/pages/hooks/usePageProps.js +0 -19
  689. package/commons/components/search/AppSearch.d.ts +0 -1
  690. package/commons/components/search/AppSearch.js +0 -135
  691. package/commons/components/search/AppSearchInput.d.ts +0 -12
  692. package/commons/components/search/AppSearchInput.js +0 -35
  693. package/commons/components/search/AppSearchResult.d.ts +0 -5
  694. package/commons/components/search/AppSearchResult.js +0 -28
  695. package/commons/components/topnav/AppBar.d.ts +0 -6
  696. package/commons/components/topnav/AppBar.js +0 -80
  697. package/commons/components/topnav/AppName.d.ts +0 -5
  698. package/commons/components/topnav/AppName.js +0 -31
  699. package/commons/components/topnav/AppSwitcher.d.ts +0 -3
  700. package/commons/components/topnav/AppSwitcher.js +0 -44
  701. package/commons/components/topnav/Notifications.d.ts +0 -2
  702. package/commons/components/topnav/Notifications.js +0 -8
  703. package/commons/components/topnav/ThemeSelection.d.ts +0 -3
  704. package/commons/components/topnav/ThemeSelection.js +0 -33
  705. package/commons/components/topnav/ThemeSelectionIcon.d.ts +0 -2
  706. package/commons/components/topnav/ThemeSelectionIcon.js +0 -16
  707. package/commons/components/topnav/UserProfile.d.ts +0 -6
  708. package/commons/components/topnav/UserProfile.js +0 -71
  709. package/commons/components/utils/hooks/useClipboard.d.ts +0 -3
  710. package/commons/components/utils/hooks/useClipboard.js +0 -29
  711. package/commons/components/utils/hooks/useEnv.d.ts +0 -1
  712. package/commons/components/utils/hooks/useEnv.js +0 -11
  713. package/commons/components/utils/hooks/useFullscreenStatus.d.ts +0 -2
  714. package/commons/components/utils/hooks/useFullscreenStatus.js +0 -41
  715. package/commons/components/utils/hooks/useGravatar.d.ts +0 -2
  716. package/commons/components/utils/hooks/useGravatar.js +0 -9
  717. package/commons/components/utils/hooks/useLocalStorage.d.ts +0 -12
  718. package/commons/components/utils/hooks/useLocalStorage.js +0 -52
  719. package/commons/components/utils/hooks/useLocalStorageItem.d.ts +0 -14
  720. package/commons/components/utils/hooks/useLocalStorageItem.js +0 -39
  721. package/commons/components/utils/hooks/useThemeBuilder.d.ts +0 -7
  722. package/commons/components/utils/hooks/useThemeBuilder.js +0 -48
  723. package/commons/components/utils/keyboard.d.ts +0 -30
  724. package/commons/components/utils/keyboard.js +0 -50
  725. package/components/hooks/useMySitemap.d.ts +0 -3
  726. package/components/hooks/useMySitemap.js +0 -219
  727. /package/{commons/components/app/AppConfigs.js → components/elements/MembershipManagement.test.d.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ export interface Ownership {
2
+ owner?: string;
3
+ admins?: string[];
4
+ members?: string[];
5
+ }
6
+
7
+ export type MemberItem = [string, 'owner' | 'admins' | 'members'];
@@ -0,0 +1,2 @@
1
+ import type { MemberItem, Ownership } from './types';
2
+ export declare const getAllMembers: (item?: Ownership) => MemberItem[];
@@ -0,0 +1,6 @@
1
+ import { pick } from 'lodash-es';
2
+ export const getAllMembers = (item) => item
3
+ ? Object.entries(pick(item, ['owner', 'admins', 'members'])).flatMap(([privilege, members]) => Array.isArray(members)
4
+ ? members.map(member => [member, privilege])
5
+ : [[members, privilege]])
6
+ : [];
@@ -1,15 +1,16 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Clear, KeyboardArrowDown, Send } from '@mui/icons-material';
3
3
  import { Accordion, AccordionDetails, AccordionSummary, AvatarGroup, Chip, IconButton, Skeleton, Stack, TextField, Typography } from '@mui/material';
4
+ import { useAppUser } from '@tui/core';
4
5
  import api from '@cccsaurora/howler-ui/api';
5
- import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks';
6
6
  import useMatchers from '@cccsaurora/howler-ui/components/app/hooks/useMatchers';
7
7
  import { SocketContext } from '@cccsaurora/howler-ui/components/app/providers/SocketProvider';
8
8
  import FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
9
9
  import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
10
+ import { omit } from 'lodash-es';
10
11
  import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
11
12
  import { useTranslation } from 'react-i18next';
12
- import { useNavigate } from 'react-router-dom';
13
+ import { useNavigate } from 'react-router';
13
14
  import { isHit } from '@cccsaurora/howler-ui/utils/typeUtils';
14
15
  import { compareTimestamp, sortByTimestamp } from '@cccsaurora/howler-ui/utils/utils';
15
16
  import Comment from '../Comment';
@@ -29,8 +30,8 @@ const RecordComments = ({ record, users }) => {
29
30
  const [length, setLength] = useState(0);
30
31
  const [analyticId, setAnalyticId] = useState();
31
32
  const [analyticComments, setAnalyticComments] = useState([]);
32
- const [comments, setComments] = useState(sortByTimestamp(record?.howler?.comment));
33
- const input = useRef();
33
+ const [comments, setComments] = useState(sortByTimestamp(record?.howler?.comment ?? []));
34
+ const input = useRef(null);
34
35
  /**
35
36
  * Set the list of typers based on updates from the websocket
36
37
  */
@@ -69,8 +70,13 @@ const RecordComments = ({ record, users }) => {
69
70
  throwError: true,
70
71
  logError: false
71
72
  });
72
- setComments(sortByTimestamp(result.howler.comment));
73
- input.current.value = '';
73
+ if (!result) {
74
+ return;
75
+ }
76
+ setComments(sortByTimestamp(result.howler.comment ?? []));
77
+ if (input.current) {
78
+ input.current.value = '';
79
+ }
74
80
  setShowClear(false);
75
81
  }
76
82
  finally {
@@ -107,7 +113,7 @@ const RecordComments = ({ record, users }) => {
107
113
  void onSubmit();
108
114
  }
109
115
  }, [loading, onSubmit]);
110
- const checkLength = useCallback(() => setLength(input.current?.value.length), []);
116
+ const checkLength = useCallback(() => setLength(input.current?.value.length ?? 0), []);
111
117
  const handleDelete = useCallback(async (commentId) => {
112
118
  await dispatchApi(api.hit.comments.del(record.howler.id, [commentId]), { throwError: true, showError: true });
113
119
  setComments(comments.filter(cmt => cmt.id !== commentId));
@@ -137,11 +143,11 @@ const RecordComments = ({ record, users }) => {
137
143
  const handleReact = useCallback(async (commentId, type) => {
138
144
  if (type) {
139
145
  await dispatchApi(api.hit.comments.react.put(record.howler.id, commentId, type));
140
- setComments(comments.map(cmt => cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt?.reactions, [user.username]: type } }));
146
+ setComments(comments.map(cmt => cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt.reactions, [user.username]: type } }));
141
147
  }
142
148
  else {
143
149
  await dispatchApi(api.hit.comments.react.del(record.howler.id, commentId));
144
- setComments(comments.map(cmt => cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt?.reactions, [user.username]: undefined } }));
150
+ setComments(comments.map(cmt => (cmt.id !== commentId ? cmt : { ...cmt, reactions: omit(cmt.reactions, user.username) })));
145
151
  }
146
152
  }, [comments, dispatchApi, record?.howler.id, user.username]);
147
153
  /**
@@ -170,6 +176,6 @@ const RecordComments = ({ record, users }) => {
170
176
  : '')), sx: theme => ({ marginLeft: '0 !important', mr: `${theme.spacing(2)} !important` }), label: `${record?.howler?.analytic ?? 'Analytic'}${c.detection ? ' - ' + c.detection : ''}` }), users: users }, c.id))) }) })] }));
171
177
  }, [analyticComments, analyticId, record?.howler.analytic, record?.howler.detection, navigate, t, users]);
172
178
  const renderedComments = useMemo(() => comments.map(c => (_jsx(Comment, { comment: c, users: users, handleDelete: () => handleDelete(c.id), handleEdit: value => handleEdit(c.id, value), handleReact: type => handleReact(c.id, type), handleQuote: () => handleQuote(c.value) }, c.id))), [comments, handleDelete, handleEdit, handleQuote, handleReact, users]);
173
- return (_jsxs(Stack, { sx: { py: 1, pr: 1 }, spacing: 1, children: [record && renderedAnalyticComments, _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(HowlerAvatar, { userId: user.username }), _jsx(TextField, { inputProps: { sx: theme => ({ fontSize: theme.typography.body2.fontSize }) }, InputLabelProps: { shrink: false }, placeholder: t('comments.add'), onKeyDown: checkForSubmit, onChangeCapture: checkLength, inputRef: input, onFocus: onFocus, onBlur: onBlur, error: length > MAX_LENGTH, fullWidth: true, multiline: true })] }), _jsxs(Stack, { direction: "row", alignItems: "center", children: [typers.length > 0 && (_jsxs(_Fragment, { children: [_jsx(AvatarGroup, { componentsProps: { additionalAvatar: { sx: { height: 24, width: 24, fontSize: '12px' } } }, children: typers.map(typer => (_jsx(HowlerAvatar, { userId: typer, sx: { height: 24, width: 24 } }, typer))) }), _jsx(TypingIndicator, {})] })), _jsx(FlexOne, {}), length > 0.9 * MAX_LENGTH && (_jsxs(Typography, { variant: "caption", sx: [{ opacity: 0.7, mr: 1 }, length > MAX_LENGTH && { color: 'error.main' }], children: [length, "/", MAX_LENGTH] })), showClear && (_jsx(IconButton, { size: "small", onClick: onClear, disabled: loading, children: _jsx(Clear, { fontSize: "small" }) })), _jsx(IconButton, { size: "small", onClick: onSubmit, disabled: loading || length > MAX_LENGTH, children: _jsx(Send, { fontSize: "small" }) })] }), record ? (renderedComments) : (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Skeleton, { width: 40, height: 40, variant: "circular" }), _jsx(Skeleton, { width: "100%", height: 80, variant: "rounded" })] }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Skeleton, { width: 40, height: 40, variant: "circular" }), _jsx(Skeleton, { width: "100%", height: 100, variant: "rounded" })] }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Skeleton, { width: 40, height: 40, variant: "circular" }), _jsx(Skeleton, { width: "100%", height: 80, variant: "rounded" })] })] }))] }));
179
+ return (_jsxs(Stack, { sx: { py: 1, pr: 1 }, spacing: 1, children: [record && renderedAnalyticComments, _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(HowlerAvatar, { userId: user.username }), _jsx(TextField, { inputProps: { sx: (theme) => ({ fontSize: theme.typography.body2.fontSize }) }, InputLabelProps: { shrink: false }, placeholder: t('comments.add'), onKeyDown: checkForSubmit, onChangeCapture: checkLength, inputRef: input, onFocus: onFocus, onBlur: onBlur, error: length > MAX_LENGTH, fullWidth: true, multiline: true })] }), _jsxs(Stack, { direction: "row", alignItems: "center", children: [typers.length > 0 && (_jsxs(_Fragment, { children: [_jsx(AvatarGroup, { componentsProps: { additionalAvatar: { sx: { height: 24, width: 24, fontSize: '12px' } } }, children: typers.map(typer => (_jsx(HowlerAvatar, { userId: typer, sx: { height: 24, width: 24 } }, typer))) }), _jsx(TypingIndicator, {})] })), _jsx(FlexOne, {}), length > 0.9 * MAX_LENGTH && (_jsxs(Typography, { variant: "caption", sx: [{ opacity: 0.7, mr: 1 }, length > MAX_LENGTH && { color: 'error.main' }], children: [length, "/", MAX_LENGTH] })), showClear && (_jsx(IconButton, { size: "small", onClick: onClear, disabled: loading, children: _jsx(Clear, { fontSize: "small" }) })), _jsx(IconButton, { size: "small", onClick: onSubmit, disabled: loading || length > MAX_LENGTH, children: _jsx(Send, { fontSize: "small" }) })] }), record ? (renderedComments) : (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Skeleton, { width: 40, height: 40, variant: "circular" }), _jsx(Skeleton, { width: "100%", height: 80, variant: "rounded" })] }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Skeleton, { width: 40, height: 40, variant: "circular" }), _jsx(Skeleton, { width: "100%", height: 100, variant: "rounded" })] }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Skeleton, { width: 40, height: 40, variant: "circular" }), _jsx(Skeleton, { width: "100%", height: 80, variant: "rounded" })] })] }))] }));
174
180
  };
175
181
  export default RecordComments;
@@ -3,11 +3,11 @@ import React from 'react';
3
3
  /**
4
4
  * Props for the HitContextMenu component
5
5
  */
6
- interface RecordContextMenuProps {
6
+ export interface RecordContextMenuProps {
7
7
  /**
8
8
  * Function to extract the hit ID from a mouse event
9
9
  */
10
- getSelectedId: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => string;
10
+ getSelectedId: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => string | undefined;
11
11
  /**
12
12
  * Optional component to wrap the children, defaults to Box
13
13
  */
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { AddCircleOutline, Assignment, CreateNewFolder, Edit, HowToVote, NoteAdd, OpenInNew, QueryStats, RemoveCircleOutline, SettingsSuggest, Terminal } from '@mui/icons-material';
3
+ import { useAppUser } from '@tui/core';
3
4
  import api from '@cccsaurora/howler-ui/api';
4
- import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks/useAppUser';
5
5
  import useMatchers from '@cccsaurora/howler-ui/components/app/hooks/useMatchers';
6
6
  import { ApiConfigContext } from '@cccsaurora/howler-ui/components/app/providers/ApiConfigProvider';
7
7
  import { ModalContext } from '@cccsaurora/howler-ui/components/app/providers/ModalProvider';
@@ -54,8 +54,8 @@ const RecordContextMenu = ({ children, getSelectedId, Component }) => {
54
54
  const [id, setId] = useState(null);
55
55
  const record = useContextSelector(RecordContext, ctx => ctx.records[id]);
56
56
  const selectedRecords = useContextSelector(RecordContext, ctx => ctx.selectedRecords);
57
- const [analytic, setAnalytic] = useState(null);
58
- const [template, setTemplate] = useState(null);
57
+ const [analytic, setAnalytic] = useState();
58
+ const [template, setTemplate] = useState();
59
59
  const [actions, setActions] = useState([]);
60
60
  const records = useMemo(() => selectedRecords.some(_record => _record.howler.id === record?.howler.id)
61
61
  ? selectedRecords
@@ -78,6 +78,9 @@ const RecordContextMenu = ({ children, getSelectedId, Component }) => {
78
78
  */
79
79
  const onOpen = useCallback(async (event) => {
80
80
  const _id = getSelectedId(event);
81
+ if (!_id) {
82
+ return;
83
+ }
81
84
  setId(_id);
82
85
  // TODO: Bumping the number of rows is a temporary fix - we'll need to improve this.
83
86
  const _actions = (await dispatchApi(api.search.action.post({ query: 'action_id:*', rows: 100, sort: 'name asc' }), {
@@ -101,7 +104,10 @@ const RecordContextMenu = ({ children, getSelectedId, Component }) => {
101
104
  if (canVote) {
102
105
  _actions = [
103
106
  ..._actions,
104
- ...VOTE_OPTIONS.map(option => ({ ...option, actionFunction: () => vote(option.name.toLowerCase()) }))
107
+ ...VOTE_OPTIONS.map(option => ({
108
+ ...option,
109
+ actionFunction: () => vote(option.name.toLowerCase())
110
+ }))
105
111
  ];
106
112
  }
107
113
  if (config.lookups?.['howler.assessment'] && canAssess) {
@@ -263,6 +269,6 @@ const RecordContextMenu = ({ children, getSelectedId, Component }) => {
263
269
  return result;
264
270
  // eslint-disable-next-line react-hooks/exhaustive-deps
265
271
  }, [record, analytic, template, entries, rowStatus, actions, query, t, setQuery, executeAction, showModal, records]);
266
- return (_jsx(ContextMenu, { id: "contextMenu", Component: Component, onOpen: onOpen, onClose: () => setAnalytic(null), items: items, children: children }));
272
+ return (_jsx(ContextMenu, { id: "contextMenu", Component: Component, onOpen: onOpen, onClose: () => setAnalytic(undefined), items: items, children: children }));
267
273
  };
268
274
  export default RecordContextMenu;
@@ -1,4 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ // @ts-nocheck
2
3
  import { fireEvent, render, screen, waitFor } from '@testing-library/react';
3
4
  import userEvent, {} from '@testing-library/user-event';
4
5
  import { omit } from 'lodash-es';
@@ -15,13 +16,14 @@ const mockUseAppUser = vi.hoisted(() => vi.fn(() => ({
15
16
  roles: ['automation_basic', 'actionrunner_basic']
16
17
  }
17
18
  })));
18
- vi.mock('commons/components/app/hooks/useAppUser', () => ({
19
- useAppUser: mockUseAppUser
20
- }));
21
- // Mock react-router-dom
19
+ vi.mock('@tui/core', async () => {
20
+ const actual = await vi.importActual('@tui/core');
21
+ return { ...actual, useAppUser: mockUseAppUser };
22
+ });
23
+ // Mock react-router
22
24
  const mockNavigate = vi.fn();
23
- vi.mock('react-router-dom', async () => {
24
- const actual = await vi.importActual('react-router-dom');
25
+ vi.mock('react-router', async () => {
26
+ const actual = await vi.importActual('react-router');
25
27
  return {
26
28
  ...actual,
27
29
  useNavigate: () => mockNavigate,
@@ -566,6 +568,9 @@ describe('HitContextMenu', () => {
566
568
  await waitFor(() => {
567
569
  expect(screen.getByRole('menu')).toBeInTheDocument();
568
570
  });
571
+ await waitFor(() => {
572
+ expect(screen.getByText('Exclude By')).toBeInTheDocument();
573
+ });
569
574
  act(() => {
570
575
  const excludesMenuItem = screen.getByText('Exclude By');
571
576
  fireEvent.mouseEnter(excludesMenuItem);
@@ -692,6 +697,9 @@ describe('HitContextMenu', () => {
692
697
  await waitFor(() => {
693
698
  expect(screen.getByRole('menu')).toBeInTheDocument();
694
699
  });
700
+ await waitFor(() => {
701
+ expect(screen.getByText('Include By')).toBeInTheDocument();
702
+ });
695
703
  act(() => {
696
704
  const includesMenuItem = screen.getByText('Include By');
697
705
  fireEvent.mouseEnter(includesMenuItem);
@@ -5,7 +5,7 @@ import useRelatedRecords from '@cccsaurora/howler-ui/components/hooks/useRelated
5
5
  import { groupBy } from 'lodash-es';
6
6
  import { useMemo, useState } from 'react';
7
7
  import { useTranslation } from 'react-i18next';
8
- import { Link } from 'react-router-dom';
8
+ import { Link } from 'react-router';
9
9
  import { isCase, isEvent, isHit } from '@cccsaurora/howler-ui/utils/typeUtils';
10
10
  import CaseCard from '../case/CaseCard';
11
11
  import HitCard from '../hit/HitCard';
@@ -29,6 +29,6 @@ const RecordRelated = ({ record }) => {
29
29
  if (!record) {
30
30
  return null;
31
31
  }
32
- return (_jsxs(Box, { sx: { borderTop: `thin solid ${theme.palette.divider}`, height: '100%', flex: 1, mr: 2, pb: 2 }, children: [_jsxs(Tabs, { value: currentTab, onChange: (_, v) => setActiveTab(v), variant: "scrollable", scrollButtons: "auto", children: [hasLinks && _jsx(Tab, { value: "links", label: t('hit.related.tab.links') }), groups.hit?.length > 0 && _jsx(Tab, { value: "hit", label: t('hit.related.tab.hit') }), groups.case?.length > 0 && _jsx(Tab, { value: "case", label: t('hit.related.tab.case') }), groups.event?.length > 0 && _jsx(Tab, { value: "event", label: t('hit.related.tab.event') })] }), currentTab === 'links' && (_jsx(Box, { display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(200px, 1fr))", gap: 1, pt: 1, children: record.howler.links.map(l => (_jsx(RelatedLink, { ...l }, l.title + l.href))) })), currentTab === 'hit' && (_jsx(Stack, { spacing: 1, pt: 1, children: records.filter(isHit).map(h => (_jsx(Link, { to: `/hits/${h.howler.id}`, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'none' }, children: _jsx(HitCard, { id: h.howler.id, layout: HitLayout.NORMAL }) }, h.howler.id))) })), currentTab === 'case' && (_jsx(Stack, { spacing: 1, pt: 1, children: records.filter(isCase).map(c => (_jsx(Link, { to: `/cases/${c.case_id}`, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'none' }, children: _jsx(CaseCard, { case: c }) }, c.case_id))) })), currentTab === 'event' && (_jsx(Stack, { spacing: 1, pt: 1, children: records.filter(isEvent).map(o => (_jsx(Link, { to: `/events/${o.howler.id}`, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'none' }, children: _jsx(EventCard, { event: o }) }, o.howler.id))) }))] }));
32
+ return (_jsxs(Box, { sx: { borderTop: `thin solid ${theme.palette.divider}`, height: '100%', flex: 1, mr: 2, pb: 2 }, children: [_jsxs(Tabs, { value: currentTab, onChange: (_, v) => setActiveTab(v), variant: "scrollable", scrollButtons: "auto", children: [hasLinks && _jsx(Tab, { value: "links", label: t('hit.related.tab.links') }), groups.hit?.length > 0 && _jsx(Tab, { value: "hit", label: t('hit.related.tab.hit') }), groups.case?.length > 0 && _jsx(Tab, { value: "case", label: t('hit.related.tab.case') }), groups.event?.length > 0 && _jsx(Tab, { value: "event", label: t('hit.related.tab.event') })] }), currentTab === 'links' && (_jsx(Box, { display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(200px, 1fr))", gap: 1, pt: 1, children: record.howler.links?.map(l => (_jsx(RelatedLink, { ...l, title: l.title, href: l.href }, (l.title ?? '') + (l.href ?? '')))) })), currentTab === 'hit' && (_jsx(Stack, { spacing: 1, pt: 1, children: records.filter(isHit).map(h => (_jsx(Link, { to: `/hits/${h.howler.id}`, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'none' }, children: _jsx(HitCard, { id: h.howler.id, layout: HitLayout.NORMAL }) }, h.howler.id))) })), currentTab === 'case' && (_jsx(Stack, { spacing: 1, pt: 1, children: records.filter(isCase).map(c => (_jsx(Link, { to: `/cases/${c.case_id}`, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'none' }, children: _jsx(CaseCard, { case: c }) }, c.case_id))) })), currentTab === 'event' && (_jsx(Stack, { spacing: 1, pt: 1, children: records.filter(isEvent).map(o => (_jsx(Link, { to: `/events/${o.howler.id}`, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'none' }, children: _jsx(EventCard, { event: o }) }, o.howler.id))) }))] }));
33
33
  };
34
34
  export default RecordRelated;
@@ -18,7 +18,7 @@ const FuzzySearchBar = ({ onSearch, loading = false }) => {
18
18
  const handleSearch = useCallback(() => {
19
19
  if (query.trim()) {
20
20
  setQuery(query.trim());
21
- onSearch(query.trim(), indexes);
21
+ onSearch(query.trim(), indexes ?? ['hit']);
22
22
  }
23
23
  }, [query, setQuery, onSearch, indexes]);
24
24
  const handleKeyDown = useCallback((e) => {
@@ -4,5 +4,5 @@ declare const LayoutToggle: ({ displayType, setDisplayType, size, allowNullValue
4
4
  setDisplayType: (type: HowlerViewLayoutType) => void;
5
5
  size?: 'small' | 'medium' | 'large';
6
6
  allowNullValue?: boolean;
7
- }) => import("react/jsx-runtime").JSX.Element;
7
+ }) => import("react").JSX.Element;
8
8
  export default LayoutToggle;
@@ -21,15 +21,14 @@ export const ViewTitle = ({ title, type, query, sort, span, indexes, settings })
21
21
  if (!indexes || indexes.length === 0) {
22
22
  return '';
23
23
  }
24
- else
25
- return `(${indexes.join(', ')})`;
24
+ return `(${indexes.join(', ')})`;
26
25
  }, [indexes]);
27
26
  return (_jsxs(Stack, { children: [_jsxs(Stack, { direction: "row", alignItems: "start", spacing: 1, children: [_jsx(Tooltip, { title: t(`route.views.manager.${type}`), children: {
28
27
  readonly: _jsx(Lock, { fontSize: "small" }),
29
28
  global: _jsx(Language, { fontSize: "small" }),
30
29
  personal: _jsx(Person, { fontSize: "small" })
31
- }[type] }), settings?.display && (_jsx(Tooltip, { title: t(`page.settings.local.hits.display_type.${settings.display}`), children: {
30
+ }[type] ?? _jsx("span", {}) }), settings?.display && (_jsx(Tooltip, { title: t(`page.settings.local.hits.display_type.${settings.display}`), children: {
32
31
  list: _jsx(List, { fontSize: "small" }),
33
32
  grid: _jsx(TableChart, { fontSize: "small" })
34
- }[settings.display] })), _jsx(Typography, { variant: "body1", children: t(title) })] }), _jsx(Typography, { variant: "caption", children: _jsx("code", { children: query }) }), (sort || span || indexLabel) && (_jsxs(Stack, { direction: "row", sx: { mt: 1 }, spacing: 1, children: [sort?.split(',').map(_sort => (_jsx(Chip, { size: "small", label: _sort.split(' ')[0], icon: _sort.endsWith('desc') ? _jsx(ArrowDownward, {}) : _jsx(ArrowUpward, {}) }, _sort.split(' ')[0]))), spanLabel && _jsx(Chip, { label: spanLabel }), indexLabel && _jsx(Chip, { label: indexLabel })] }))] }));
33
+ }[settings.display] ?? _jsx("span", {}) })), _jsx(Typography, { variant: "body1", children: t(title) })] }), _jsx(Typography, { variant: "caption", children: _jsx("code", { children: query }) }), (sort || span || indexLabel) && (_jsxs(Stack, { direction: "row", sx: { mt: 1 }, spacing: 1, children: [sort?.split(',').map(_sort => (_jsx(Chip, { size: "small", label: _sort.split(' ')[0], icon: _sort.endsWith('desc') ? _jsx(ArrowDownward, {}) : _jsx(ArrowUpward, {}) }, _sort.split(' ')[0]))), spanLabel && _jsx(Chip, { label: spanLabel }), indexLabel && _jsx(Chip, { label: indexLabel })] }))] }));
35
34
  };
@@ -7,7 +7,7 @@ declare const useHitActions: (_hits: Hit | Hit[]) => {
7
7
  canAssess: boolean;
8
8
  loading: boolean;
9
9
  manage: (transition: string) => Promise<void>;
10
- assess: (assessment: string, skipRationale?: boolean, providedRationale?: any) => Promise<void>;
10
+ assess: (assessment: string, skipRationale?: boolean, providedRationale?: string | null) => Promise<void>;
11
11
  vote: (v: string) => Promise<void>;
12
12
  selectedVote: string;
13
13
  };
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useAppUser } from '@tui/core';
2
3
  import api from '@cccsaurora/howler-ui/api';
3
- import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks';
4
4
  import AssignUserDrawer from '@cccsaurora/howler-ui/components/app/drawers/AssignUserDrawer';
5
5
  import { ApiConfigContext } from '@cccsaurora/howler-ui/components/app/providers/ApiConfigProvider';
6
6
  import { AppDrawerContext } from '@cccsaurora/howler-ui/components/app/providers/AppDrawerProvider';
@@ -35,17 +35,17 @@ const useHitActions = (_hits) => {
35
35
  const [loading, setLoading] = useState(false);
36
36
  const hits = useMemo(() => (Array.isArray(_hits) ? _hits : [_hits]).filter(_hit => !!_hit), [_hits]);
37
37
  const canVote = useMemo(() => hits.every(hit => hit?.howler.assignment !== user.username || hit?.howler.status === 'in-progress'), [hits, user.username]);
38
- const canAssess = useMemo(() => hits.every(hit => !(['on-hold', 'resolved'].includes(hit?.howler.status) && hit?.howler.assignment === user.username)), [hits, user.username]);
38
+ const canAssess = useMemo(() => hits.every(hit => !(['on-hold', 'resolved'].includes(hit?.howler.status ?? '') && hit?.howler.assignment === user.username)), [hits, user.username]);
39
39
  const selectedVote = useMemo(() => {
40
40
  if (hits.length !== 1) {
41
41
  return '';
42
42
  }
43
43
  const hit = hits[0];
44
- return hit?.howler.votes.benign.includes(user.email)
44
+ return hit?.howler.votes?.benign?.includes(user.email)
45
45
  ? 'benign'
46
- : hit?.howler.votes.malicious.includes(user.email)
46
+ : hit?.howler.votes?.malicious?.includes(user.email)
47
47
  ? 'malicious'
48
- : hit?.howler.votes.obscure.includes(user.email)
48
+ : hit?.howler.votes?.obscure?.includes(user.email)
49
49
  ? 'obscure'
50
50
  : '';
51
51
  }, [hits, user.email]);
@@ -72,12 +72,14 @@ const useHitActions = (_hits) => {
72
72
  setLoading(true);
73
73
  try {
74
74
  await Promise.all(hits.map(async (hit) => {
75
- const _vote = () => api.hit.transition.post(hit?.howler.id, { transition: 'vote', data: { vote: v, email: user.email } });
75
+ const _vote = () => api.hit.transition.post(hit.howler.id, { transition: 'vote', data: { vote: v, email: user.email } });
76
76
  const updatedHit = await dispatchApi(_vote(), {
77
77
  onConflict: async () => {
78
- await api.hit.get(hit?.howler.id);
78
+ await api.hit.get(hit.howler.id);
79
79
  const newResult = await _vote();
80
- updateHit(newResult);
80
+ if (newResult) {
81
+ updateHit(newResult);
82
+ }
81
83
  }
82
84
  });
83
85
  if (updatedHit) {
@@ -102,13 +104,19 @@ const useHitActions = (_hits) => {
102
104
  if (assessment !== hit?.howler.assessment) {
103
105
  setLoading(true);
104
106
  try {
105
- const update = () => api.hit.transition.post(hit?.howler.id, { transition: 'assess', data: { assessment, rationale } });
107
+ const update = () => api.hit.transition.post(hit.howler.id, { transition: 'assess', data: { assessment, rationale } });
106
108
  const updatedHit = await dispatchApi(update(), {
107
109
  onConflict: async () => {
108
- const updatedData = await api.hit.get(hit?.howler.id);
110
+ const updatedData = await api.hit.get(hit.howler.id);
111
+ if (!updatedData) {
112
+ showWarningMessage(t('hit.actions.conflict.assess'));
113
+ return;
114
+ }
109
115
  if (!updatedData.howler.assessment) {
110
116
  const result = await update();
111
- updateHit(result);
117
+ if (result) {
118
+ updateHit(result);
119
+ }
112
120
  }
113
121
  else {
114
122
  updateHit(updatedData);
@@ -134,11 +142,13 @@ const useHitActions = (_hits) => {
134
142
  data.assignee = await onAssign();
135
143
  }
136
144
  await Promise.all(hits.map(async (hit) => {
137
- const update = () => api.hit.transition.post(hit?.howler.id, { transition, data });
145
+ const update = () => api.hit.transition.post(hit.howler.id, { transition, data });
138
146
  const updatedHit = await dispatchApi(update(), {
139
147
  onConflict: async () => {
140
- const updatedData = await api.hit.get(hit?.howler.id);
141
- updateHit(updatedData);
148
+ const updatedData = await api.hit.get(hit.howler.id);
149
+ if (updatedData) {
150
+ updateHit(updatedData);
151
+ }
142
152
  showWarningMessage(t('hit.actions.conflict.manage'));
143
153
  }
144
154
  });
@@ -159,7 +169,7 @@ const useHitActions = (_hits) => {
159
169
  const availableTransitions = useMemo(() => MANAGE_OPTIONS.filter(option => {
160
170
  const name = option.name.toLowerCase();
161
171
  // Is this option one that is valid for the current state?
162
- return hits.every(hit => config.config.lookups?.transitions[hit?.howler.status]?.includes(name) &&
172
+ return hits.every(hit => config.config.lookups?.transitions[hit.howler.status]?.includes(name) &&
163
173
  // If we are assigning or voting, the hit can't be assigned to the current user
164
174
  ((name !== 'assign_to_me' && name !== 'vote') || hit?.howler.assignment !== user.username) &&
165
175
  // If we are running any of these actions, the current user must be assigned the hit
@@ -1,5 +1,5 @@
1
1
  declare const useLocalStorage: (prefix?: string) => {
2
- get: <T>(key: string) => T;
2
+ get: <T>(key: string) => T | null;
3
3
  set: (key: string, value: any) => void;
4
4
  remove: (key: string, withPrefix?: boolean) => void;
5
5
  has: (key: string) => boolean;
@@ -7,7 +7,7 @@ const useLocalStorage = (prefix) => {
7
7
  // If a 'prefix' was specified, the 'key' will be appended to the 'prefix' automatically.
8
8
  const get = useCallback((key) => {
9
9
  try {
10
- return JSON.parse(localStorage.getItem(_buildKey(key)));
10
+ return JSON.parse(localStorage.getItem(_buildKey(key)) ?? 'null');
11
11
  }
12
12
  catch {
13
13
  return null;
@@ -1,3 +1,13 @@
1
+ export type LocalStorageItemResult<T> = [T, (value: T | undefined) => void, () => void];
2
+ export type NonNullish = object | string | number | bigint | boolean | symbol;
3
+ type WidenStringLiteral<T extends string> = T extends `${infer Underlying}` ? (Underlying extends T ? string : T) : T;
4
+ type WidenNumberLiteral<T extends number> = `${T}` extends `${infer Underlying extends number}` ? Underlying extends T ? number : T : T;
5
+ export type WidenLiteral<T> = T extends string ? WidenStringLiteral<T> : T extends number ? WidenNumberLiteral<T> : T extends boolean ? boolean : T extends bigint ? bigint : T;
6
+ type UseLocalStorageItem = {
7
+ <T extends string | number | boolean | bigint>(key: string, initialValue: T): LocalStorageItemResult<WidenLiteral<T>>;
8
+ <T extends NonNullish>(key: string, initialValue: T): LocalStorageItemResult<T>;
9
+ <T>(key: string, initialValue?: T): LocalStorageItemResult<T | undefined>;
10
+ };
1
11
  /**
2
12
  * This hooks backs the typical 'useState' hook with local storage.
3
13
  *
@@ -14,5 +24,5 @@
14
24
  * @param initialValue - local storage initialization value.
15
25
  * @returns a stateful value, a function to update it, and a function to remove it.
16
26
  */
17
- declare const useLocalStorageItem: <T>(key: string, initialValue?: T) => [T, (value: T) => void, () => void];
27
+ declare const useLocalStorageItem: UseLocalStorageItem;
18
28
  export default useLocalStorageItem;
@@ -1,5 +1,6 @@
1
1
  import useLocalStorage from '@cccsaurora/howler-ui/components/hooks/useLocalStorage';
2
2
  import { useEffect, useMemo, useState } from 'react';
3
+ import { notNil } from '@cccsaurora/howler-ui/utils/utils';
3
4
  // Module-level subscriber map for same-page cross-component synchronization.
4
5
  // Maps each storage key to the set of React state setters currently subscribed to it.
5
6
  const SUBSCRIBERS = new Map();
@@ -24,9 +25,9 @@ const notify = (key, value) => {
24
25
  */
25
26
  const useLocalStorageItem = (key, initialValue) => {
26
27
  const { get, set, has, remove } = useLocalStorage();
27
- const [value, setValue] = useState(get(key) ?? initialValue);
28
+ const [value, setValue] = useState(get(key) ?? initialValue ?? undefined);
28
29
  useEffect(() => {
29
- if (initialValue !== null && initialValue !== undefined && !has(key)) {
30
+ if (notNil(initialValue) && !has(key)) {
30
31
  set(key, initialValue);
31
32
  }
32
33
  }, [key, initialValue, has, set]);
@@ -47,9 +48,10 @@ const useLocalStorageItem = (key, initialValue) => {
47
48
  // React to cross-tab storage changes via the native 'storage' event.
48
49
  useEffect(() => {
49
50
  const handler = (event) => {
50
- if (event.key !== key)
51
+ if (event.key !== key) {
51
52
  return;
52
- const next = event.newValue !== null ? JSON.parse(event.newValue) : initialValue;
53
+ }
54
+ const next = (event.newValue !== null ? JSON.parse(event.newValue) : initialValue) ?? null;
53
55
  notify(key, next);
54
56
  };
55
57
  window.addEventListener('storage', handler);
@@ -59,7 +61,7 @@ const useLocalStorageItem = (key, initialValue) => {
59
61
  value,
60
62
  (newValue, save = true) => {
61
63
  if (save) {
62
- if (newValue !== undefined) {
64
+ if (notNil(newValue)) {
63
65
  set(key, newValue);
64
66
  }
65
67
  else {
@@ -4,6 +4,29 @@ import { act, renderHook } from '@testing-library/react';
4
4
  import { setupLocalStorageMock } from '@cccsaurora/howler-ui/tests/mocks';
5
5
  import { vi } from 'vitest';
6
6
  import useLocalStorageItem from './useLocalStorageItem';
7
+ var TestLayout;
8
+ (function (TestLayout) {
9
+ TestLayout["NORMAL"] = "normal";
10
+ TestLayout["DENSE"] = "dense";
11
+ })(TestLayout || (TestLayout = {}));
12
+ var TestPriority;
13
+ (function (TestPriority) {
14
+ TestPriority[TestPriority["LOW"] = 1] = "LOW";
15
+ TestPriority[TestPriority["HIGH"] = 2] = "HIGH";
16
+ })(TestPriority || (TestPriority = {}));
17
+ const TypeCheckedUsage = () => {
18
+ const [layout, setLayout] = useLocalStorageItem('layout', TestLayout.NORMAL);
19
+ const [pageCount, setPageCount] = useLocalStorageItem('page-count', 25);
20
+ const [priority, setPriority] = useLocalStorageItem('priority', TestPriority.LOW);
21
+ const typedLayout = layout;
22
+ const typedPageCount = pageCount;
23
+ const typedPriority = priority;
24
+ setLayout(TestLayout.DENSE);
25
+ setPageCount(50);
26
+ setPriority(TestPriority.HIGH);
27
+ return [typedLayout, typedPageCount, typedPriority];
28
+ };
29
+ void TypeCheckedUsage;
7
30
  const mockLocalStorage = setupLocalStorageMock();
8
31
  beforeEach(() => {
9
32
  mockLocalStorage.clear();
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { AppAccessibilityPreferences } from '@tui/a11y';
3
+ export type MyAccessibilityType = {
4
+ features: ReactNode[];
5
+ preferences: AppAccessibilityPreferences;
6
+ };
7
+ export declare const useMyAccessibility: () => MyAccessibilityType;
@@ -0,0 +1,21 @@
1
+ // Add/remove accessibility buttons from this list to have them in the app
2
+ // Each button should use the AccessibilityButton component provided in order to be properly formatted/added
3
+ const accessibilityFeatures = [];
4
+ // Modify web accessibility preferences to manage the default features
5
+ const accessibilityPreferences = {
6
+ enableAccessibility: true,
7
+ enableAnimation: true,
8
+ enableCursor: true,
9
+ enableLineHeight: true,
10
+ enableTextAlignment: true,
11
+ enableTextSize: true,
12
+ enableTextSpacing: true,
13
+ enableTooltipLeaveDelay: true
14
+ };
15
+ // Export the preferences and accessibility features you want shown/active in the application
16
+ export const useMyAccessibility = () => {
17
+ return {
18
+ features: accessibilityFeatures,
19
+ preferences: accessibilityPreferences
20
+ };
21
+ };
@@ -5,6 +5,6 @@ export type DispatchApiConfig = {
5
5
  onConflict?: () => Promise<void>;
6
6
  };
7
7
  declare const useMyApi: () => {
8
- dispatchApi: <R>(apiCall: Promise<R>, config?: DispatchApiConfig) => Promise<R>;
8
+ dispatchApi: <R>(apiCall: Promise<R>, config?: DispatchApiConfig) => Promise<R | undefined>;
9
9
  };
10
10
  export default useMyApi;
@@ -4,7 +4,7 @@ const DEFAULT_CONFIG = {
4
4
  throwError: true,
5
5
  logError: false,
6
6
  showError: true,
7
- onConflict: null
7
+ onConflict: undefined
8
8
  };
9
9
  const useMyApi = () => {
10
10
  const { showErrorMessage } = useMySnackbar();
@@ -19,8 +19,8 @@ const useMyApi = () => {
19
19
  catch (error) {
20
20
  if (error instanceof Error) {
21
21
  if (onConflict && [409, 412].includes(error.cause?.api_status_code)) {
22
- onConflict();
23
- return null;
22
+ void onConflict();
23
+ return;
24
24
  }
25
25
  if (showError) {
26
26
  showErrorMessage(error.message);
@@ -33,7 +33,7 @@ const useMyApi = () => {
33
33
  throw error;
34
34
  }
35
35
  }
36
- return null;
36
+ return;
37
37
  }
38
38
  }, [showErrorMessage]);
39
39
  return useMemo(() => ({