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

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 +2 -2
  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
@@ -1,23 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Delete, Engineering, Terminal } from '@mui/icons-material';
3
3
  import { Autocomplete, Card, CardContent, CardHeader, Chip, Grid, IconButton, Stack, TextField, Tooltip, 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 { ModalContext } from '@cccsaurora/howler-ui/components/app/providers/ModalProvider';
7
- import SearchResponseProvider, { SearchResponseContext } from '@cccsaurora/howler-ui/components/app/providers/SearchResponseProvider';
7
+ import SearchResponseProvider, { createSearchResponseContext, useSearchResponseContext } from '@cccsaurora/howler-ui/components/app/providers/SearchResponseProvider';
8
8
  import FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
9
9
  import { TuiListProvider } from '@cccsaurora/howler-ui/components/elements/addons/lists';
10
10
  import { TuiListMethodContext } from '@cccsaurora/howler-ui/components/elements/addons/lists/TuiListProvider';
11
- import HowlerAvatar from '@cccsaurora/howler-ui/components/elements/display/HowlerAvatar';
12
11
  import ItemManager from '@cccsaurora/howler-ui/components/elements/display/ItemManager';
12
+ import Members from '@cccsaurora/howler-ui/components/elements/membership/Members';
13
13
  import { useMyLocalStorageItem } from '@cccsaurora/howler-ui/components/hooks/useMyLocalStorage';
14
14
  import useMySnackbar from '@cccsaurora/howler-ui/components/hooks/useMySnackbar';
15
15
  import { useCallback, useContext, useEffect, useState } from 'react';
16
16
  import { Trans, useTranslation } from 'react-i18next';
17
- import { useNavigate, useSearchParams } from 'react-router-dom';
17
+ import { useNavigate, useSearchParams } from 'react-router';
18
18
  import { StorageKey, VALID_ACTION_TRIGGERS } from '@cccsaurora/howler-ui/utils/constants';
19
19
  import { sanitizeLuceneQuery } from '@cccsaurora/howler-ui/utils/stringUtils';
20
20
  import useMyActionFunctions from '../useMyActionFunctions';
21
+ const SearchResponseContext = createSearchResponseContext();
21
22
  const ActionSearch = () => {
22
23
  const navigate = useNavigate();
23
24
  const { t } = useTranslation();
@@ -28,11 +29,11 @@ const ActionSearch = () => {
28
29
  const [searchParams, setSearchParams] = useSearchParams();
29
30
  const { deleteAction } = useMyActionFunctions();
30
31
  const pageCount = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25)[0];
31
- const { response, request, remove, getSearchRequestData } = useContext(SearchResponseContext);
32
+ const { response, request, remove, getSearchRequestData } = useSearchResponseContext(SearchResponseContext);
32
33
  const [searching, setSearching] = useState(false);
33
34
  const [hasError, setHasError] = useState(false);
34
35
  const [phrase, setPhrase] = useState(searchParams.get('phrase') || '');
35
- const [offset, setOffset] = useState(parseInt(searchParams.get('offset')) || 0);
36
+ const [offset, setOffset] = useState(parseInt(searchParams.get('offset') ?? '0') || 0);
36
37
  const [searchModifiers, setSearchModifiers] = useState([]);
37
38
  // Search Handler.
38
39
  const onSearch = useCallback(async () => {
@@ -97,12 +98,12 @@ const ActionSearch = () => {
97
98
  // eslint-disable-next-line react-hooks/exhaustive-deps
98
99
  []);
99
100
  useEffect(() => {
100
- if (response?.total <= offset) {
101
+ if (response && response.total <= offset) {
101
102
  setOffset(0);
102
103
  searchParams.set('offset', '0');
103
104
  setSearchParams(searchParams, { replace: true });
104
105
  }
105
- }, [offset, response?.total, searchParams, setSearchParams]);
106
+ }, [offset, response, searchParams, setSearchParams]);
106
107
  useEffect(() => {
107
108
  if (!searching) {
108
109
  void onSearch();
@@ -121,11 +122,11 @@ const ActionSearch = () => {
121
122
  transitionProperty: 'border-color',
122
123
  cursor: 'pointer',
123
124
  mt: 1
124
- }, children: [_jsx(CardHeader, { title: _jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [_jsx(Typography, { variant: "h5", children: item.item.name }), item.item.triggers.length > 0 && (_jsx(Tooltip, { title: _jsx(Trans, { i18nKey: "route.actions.trigger.description", values: { triggers: item.item.triggers.join(', ') }, components: { bold: _jsx("strong", {}) } }), children: _jsx(Engineering, {}) })), _jsx(FlexOne, {}), ((item.item.owner_id === user.username && editRoles) || user.roles?.includes('admin')) && (_jsx(IconButton, { size: "small", onClick: e => onDelete(e, item.item.action_id), children: _jsx(Delete, {}) })), _jsx(HowlerAvatar, { sx: { width: 24, height: 24, marginRight: '8px !important' }, userId: item.item.owner_id })] }), subheader: item.item.query }), _jsx(CardContent, { sx: { paddingTop: 0 }, children: _jsx(Grid, { container: true, spacing: 1, children: item.item.operations.map(d => (_jsx(Grid, { item: true, children: _jsx(Chip, { label: t(`operations.${d.operation_id}`) }) }, d.operation_id))) }) })] }, item.item.name));
125
+ }, children: [_jsx(CardHeader, { title: _jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [_jsx(Typography, { variant: "h5", children: item.item.name }), item.item.triggers.length > 0 && (_jsx(Tooltip, { title: _jsx(Trans, { i18nKey: "route.actions.trigger.description", values: { triggers: item.item.triggers.join(', ') }, components: { bold: _jsx("strong", {}) } }), children: _jsx(Engineering, {}) })), _jsx(FlexOne, {}), _jsx(Members, { item: item.item }), ((item.item.owner === user.username && editRoles) || user.roles?.includes('admin')) && (_jsx(IconButton, { size: "small", onClick: e => onDelete(e, item.item.action_id), children: _jsx(Delete, {}) }))] }), subheader: item.item.query }), _jsx(CardContent, { sx: { paddingTop: 0 }, children: _jsx(Grid, { container: true, spacing: 1, children: item.item.operations.map(d => (_jsx(Grid, { children: _jsx(Chip, { label: t(`operations.${d.operation_id}`) }) }, d.operation_id))) }) })] }, item.item.name));
125
126
  }, [editRoles, navigate, onDelete, t, user.roles, user.username]);
126
127
  return (_jsx(ItemManager, { onSearch: onSearch, onCreate: editRoles ? () => navigate('/action/execute') : undefined, onPageChange: onPageChange, phrase: phrase, setPhrase: setPhrase, hasError: hasError, searching: searching, aboveSearch: _jsx(Typography, { sx: theme => ({ fontStyle: 'italic', color: theme.palette.text.disabled, mb: 0.5 }), variant: "body2", children: t('route.actions.search.prompt') }), searchFilters: _jsx(Autocomplete, { multiple: true, size: "small", value: searchModifiers, onChange: (__, values) => setSearchModifiers(values), getOptionLabel: trigger => t(`route.actions.trigger.${trigger}`), options: VALID_ACTION_TRIGGERS, renderInput: params => (_jsx(TextField, { ...params, sx: { maxWidth: '500px' }, label: t('route.actions.trigger') })) }), renderer: renderer, response: response, createPrompt: "route.actions.create", searchPrompt: "route.actions.search", createIcon: _jsx(Terminal, { sx: { mr: 1 } }) }));
127
128
  };
128
129
  const ActionSearchProvider = () => {
129
- return (_jsx(TuiListProvider, { children: _jsx(SearchResponseProvider, { idField: "action_id", children: _jsx(ActionSearch, {}) }) }));
130
+ return (_jsx(TuiListProvider, { children: _jsx(SearchResponseProvider, { context: SearchResponseContext, idField: "action_id", children: _jsx(ActionSearch, {}) }) }));
130
131
  };
131
132
  export default ActionSearchProvider;
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PageCenter } from '@tui/core';
2
3
  import { Stack, Tab, Tabs } from '@mui/material';
3
- import PageCenter from '@cccsaurora/howler-ui/commons/components/pages/PageCenter';
4
4
  import Markdown from '@cccsaurora/howler-ui/components/elements/display/Markdown';
5
5
  import { isEmpty } from 'lodash-es';
6
6
  import howlerPluginStore from '@cccsaurora/howler-ui/plugins/store';
7
7
  import { useEffect, useMemo, useState } from 'react';
8
8
  import { useTranslation } from 'react-i18next';
9
9
  import { usePluginStore } from 'react-pluggable';
10
- import { useSearchParams } from 'react-router-dom';
10
+ import { useSearchParams } from 'react-router';
11
11
  import { default as INTEGRATIONS_EN, default as INTEGRATIONS_FR } from './markdown/integrations.en.md';
12
12
  const Integrations = () => {
13
13
  const { t } = useTranslation();
@@ -1 +1 @@
1
- export default "# Integrations and Plugins\n\n> **Note:** This page is fallback documentation. In `Integrations.tsx`, when plugins provide integration views, those plugin tabs/content are rendered and this markdown is replaced.\n\nHowler plugins let you extend both UI behavior and rendering paths without modifying core screens directly. Plugins are installed through the plugin store and then invoked across the app through `executeFunction(...)` hooks.\n\n## How the plugin system works\n\n- `HowlerPlugin` is the base class that defines extension points.\n- `howlerPluginStore` keeps global plugin state (installed plugins, lead formats, pivot formats, operations, routes, menus, sitemap entries).\n- On activation, each plugin can register named functions in the runtime plugin store.\n- The app calls those functions via `pluginStore.executeFunction(...)` in specific locations.\n\nIn practice, this means plugins can contribute features incrementally rather than replacing full pages.\n\n## What plugins can add\n\nFrom `HowlerPlugin.ts` and store usage, plugins can provide:\n\n- **Lead formats** (`addLead`) with:\n - a lead editor form (`lead.<format>.form`)\n - a lead renderer (`lead.<format>`)\n- **Pivot formats** (`addPivot`) with:\n - a pivot form (`pivot.<format>.form`)\n - a pivot link renderer (`pivot.<format>`)\n- **Custom action operations** (`addOperation`) with:\n - operation editor UI (`operation.<id>`)\n - operation help docs (`operation.<id>.documentation`)\n- **Menu entries**:\n - user menu items\n - admin menu items\n - main menu insertions/dividers\n- **Routing/navigation**:\n - routes\n - sitemap entries and breadcrumbs behavior\n- **Global extension hooks**:\n - `provider()` wrapper for app-wide context\n - `setup()` startup logic\n - `localization(...)` translation bundles\n - `helpers()` custom handlebars helpers\n - `typography(...)` and `chip(...)` custom UI rendering\n - `actions(...)` hit actions\n - `status(...)` hit banner/status widgets\n - `support()`, `help()`, and section-specific `settings(...)`\n - `documentation(md)` markdown post-processing\n - `on(event, hit)` event callback\n\n## Where hooks are executed\n\n`executeFunction(...)` is used throughout the app to render plugin output at runtime, for example:\n\n- lead rendering and lead form editors\n- pivot rendering and pivot form editors\n- custom operation editors and docs\n- plugin actions in hit views/context menus\n- hit status/banner components\n- typography/chip wrappers\n- plugin providers and startup setup\n- settings sections (`admin`, `local`, `profile`, `security`)\n- help/support panels\n- markdown documentation transforms\n\n## Clue plugin example\n\nThe Clue plugin (`ui/src/plugins/clue/index.tsx`) demonstrates a typical plugin:\n\n- registers localization bundles in English/French\n- provides a plugin provider + setup hook\n- adds a custom lead format (`clue`) with:\n - a lead form component\n - a renderer that parses lead metadata and renders a `Fetcher`\n- adds a custom pivot format (`clue`) with form + renderer\n- provides custom handlebars helpers\n- overrides plugin typography/chip renderers\n\nThis is the main pattern to follow when adding a new integration.\n"
1
+ export default "# Integrations and Plugins\n\n> **Note:** This page is fallback documentation. In `Integrations.tsx`, when plugins provide integration views, those plugin tabs/content are rendered and this markdown is replaced.\n\nHowler plugins let you extend both UI behavior and rendering paths without modifying core screens directly. Plugins are installed through the plugin store and then invoked across the app through `executeFunction(...)` hooks.\n\n## How the plugin system works\n\n- `HowlerPlugin` is the base class that defines extension points.\n- `howlerPluginStore` keeps global plugin state (installed plugins, lead formats, pivot formats, operations, routes, menus).\n- On activation, each plugin can register named functions in the runtime plugin store.\n- The app calls those functions via `pluginStore.executeFunction(...)` in specific locations.\n\nIn practice, this means plugins can contribute features incrementally rather than replacing full pages.\n\n## What plugins can add\n\nFrom `HowlerPlugin.ts` and store usage, plugins can provide:\n\n- **Lead formats** (`addLead`) with:\n - a lead editor form (`lead.<format>.form`)\n - a lead renderer (`lead.<format>`)\n- **Pivot formats** (`addPivot`) with:\n - a pivot form (`pivot.<format>.form`)\n - a pivot link renderer (`pivot.<format>`)\n- **Custom action operations** (`addOperation`) with:\n - operation editor UI (`operation.<id>`)\n - operation help docs (`operation.<id>.documentation`)\n- **Menu entries**:\n - user menu items\n - admin menu items\n - main menu insertions/dividers\n- **Routing/navigation**:\n - routes\n - breadcrumbs behavior via route `handle.breadcrumb`\n- **Global extension hooks**:\n - `provider()` wrapper for app-wide context\n - `setup()` startup logic\n - `localization(...)` translation bundles\n - `helpers()` custom handlebars helpers\n - `typography(...)` and `chip(...)` custom UI rendering\n - `actions(...)` hit actions\n - `status(...)` hit banner/status widgets\n - `support()`, `help()`, and section-specific `settings(...)`\n - `documentation(md)` markdown post-processing\n - `on(event, hit)` event callback\n\n## Where hooks are executed\n\n`executeFunction(...)` is used throughout the app to render plugin output at runtime, for example:\n\n- lead rendering and lead form editors\n- pivot rendering and pivot form editors\n- custom operation editors and docs\n- plugin actions in hit views/context menus\n- hit status/banner components\n- typography/chip wrappers\n- plugin providers and startup setup\n- settings sections (`admin`, `local`, `profile`, `security`)\n- help/support panels\n- markdown documentation transforms\n\n## Clue plugin example\n\nThe Clue plugin (`ui/src/plugins/clue/index.tsx`) demonstrates a typical plugin:\n\n- registers localization bundles in English/French\n- provides a plugin provider + setup hook\n- adds a custom lead format (`clue`) with:\n - a lead form component\n - a renderer that parses lead metadata and renders a `Fetcher`\n- adds a custom pivot format (`clue`) with form + renderer\n- provides custom handlebars helpers\n- overrides plugin typography/chip renderers\n\nThis is the main pattern to follow when adding a new integration.\n"
@@ -1 +1 @@
1
- export default "# Int\u00e9grations et plugins\n\n> **Remarque :** cette page est une documentation de secours. Dans `Integrations.tsx`, quand des plugins fournissent des vues d\u2019int\u00e9gration, ces onglets/contenus plugins sont affich\u00e9s et ce markdown est remplac\u00e9.\n\nLes plugins Howler permettent d\u2019\u00e9tendre le comportement de l\u2019interface et le rendu sans modifier directement les \u00e9crans principaux. Les plugins sont install\u00e9s via le magasin de plugins, puis appel\u00e9s dans l\u2019application \u00e0 l\u2019aide des points d\u2019extension `executeFunction(...)`.\n\n## Fonctionnement du syst\u00e8me de plugins\n\n- `HowlerPlugin` est la classe de base qui d\u00e9finit les points d\u2019extension.\n- `howlerPluginStore` conserve l\u2019\u00e9tat global (plugins install\u00e9s, formats de lead, formats de pivot, op\u00e9rations, routes, menus, sitemap).\n- \u00c0 l\u2019activation, un plugin enregistre des fonctions nomm\u00e9es dans le magasin de plugins.\n- L\u2019application ex\u00e9cute ensuite ces fonctions via `pluginStore.executeFunction(...)` \u00e0 des endroits pr\u00e9cis.\n\nCe m\u00e9canisme permet d\u2019ajouter des capacit\u00e9s de fa\u00e7on incr\u00e9mentale, sans remplacer des pages compl\u00e8tes.\n\n## Ce qu\u2019un plugin peut ajouter\n\nD\u2019apr\u00e8s `HowlerPlugin.ts` et les usages du store, un plugin peut fournir :\n\n- **Formats de lead** (`addLead`) avec :\n - un formulaire d\u2019\u00e9dition (`lead.<format>.form`)\n - un rendu (`lead.<format>`)\n- **Formats de pivot** (`addPivot`) avec :\n - un formulaire (`pivot.<format>.form`)\n - un rendu de lien pivot (`pivot.<format>`)\n- **Op\u00e9rations d\u2019action personnalis\u00e9es** (`addOperation`) avec :\n - l\u2019UI d\u2019\u00e9dition de l\u2019op\u00e9ration (`operation.<id>`)\n - la documentation de l\u2019op\u00e9ration (`operation.<id>.documentation`)\n- **Entr\u00e9es de menu** :\n - menu utilisateur\n - menu administrateur\n - insertions/s\u00e9parateurs dans le menu principal\n- **Routage/navigation** :\n - routes\n - entr\u00e9es de sitemap et logique de fil d\u2019Ariane\n- **Points d\u2019extension globaux** :\n - `provider()` pour injecter un contexte global\n - `setup()` au d\u00e9marrage\n - `localization(...)` pour les traductions\n - `helpers()` pour les helpers handlebars\n - `typography(...)` et `chip(...)` pour le rendu UI\n - `actions(...)` pour les actions sur les hits\n - `status(...)` pour la banni\u00e8re/statut d\u2019un hit\n - `support()`, `help()` et `settings(...)` par section\n - `documentation(md)` pour post-traiter du markdown\n - `on(event, hit)` pour les \u00e9v\u00e9nements\n\n## O\u00f9 les hooks sont ex\u00e9cut\u00e9s\n\n`executeFunction(...)` est utilis\u00e9 dans plusieurs parties de l\u2019UI, notamment pour :\n\n- le rendu des leads et leurs formulaires\n- le rendu des pivots et leurs formulaires\n- les \u00e9diteurs d\u2019op\u00e9rations et leur documentation\n- les actions plugin dans les vues/context menus de hit\n- les composants de statut/banni\u00e8re des hits\n- les composants typographie/chip\n- les providers plugins et la logique `setup`\n- les sections de param\u00e8tres (`admin`, `local`, `profile`, `security`)\n- les vues d\u2019aide/support\n- la transformation de markdown de documentation\n\n## Exemple : plugin Clue\n\nLe plugin Clue (`ui/src/plugins/clue/index.tsx`) montre un exemple concret :\n\n- enregistre des bundles de traduction EN/FR\n- expose un provider et un hook de setup\n- ajoute un format de lead `clue` avec :\n - un composant de formulaire\n - un renderer qui lit les m\u00e9tadonn\u00e9es du lead et affiche un `Fetcher`\n- ajoute un format de pivot `clue` (formulaire + rendu)\n- fournit des helpers handlebars personnalis\u00e9s\n- fournit des rendus personnalis\u00e9s pour `typography` et `chip`\n\nC\u2019est le mod\u00e8le recommand\u00e9 pour d\u00e9velopper de nouvelles int\u00e9grations.\n"
1
+ export default "# Int\u00e9grations et plugins\n\n> **Remarque :** cette page est une documentation de secours. Dans `Integrations.tsx`, quand des plugins fournissent des vues d\u2019int\u00e9gration, ces onglets/contenus plugins sont affich\u00e9s et ce markdown est remplac\u00e9.\n\nLes plugins Howler permettent d\u2019\u00e9tendre le comportement de l\u2019interface et le rendu sans modifier directement les \u00e9crans principaux. Les plugins sont install\u00e9s via le magasin de plugins, puis appel\u00e9s dans l\u2019application \u00e0 l\u2019aide des points d\u2019extension `executeFunction(...)`.\n\n## Fonctionnement du syst\u00e8me de plugins\n\n- `HowlerPlugin` est la classe de base qui d\u00e9finit les points d\u2019extension.\n- `howlerPluginStore` conserve l\u2019\u00e9tat global (plugins install\u00e9s, formats de lead, formats de pivot, op\u00e9rations, routes, menus).\n- \u00c0 l\u2019activation, un plugin enregistre des fonctions nomm\u00e9es dans le magasin de plugins.\n- L\u2019application ex\u00e9cute ensuite ces fonctions via `pluginStore.executeFunction(...)` \u00e0 des endroits pr\u00e9cis.\n\nCe m\u00e9canisme permet d\u2019ajouter des capacit\u00e9s de fa\u00e7on incr\u00e9mentale, sans remplacer des pages compl\u00e8tes.\n\n## Ce qu\u2019un plugin peut ajouter\n\nD\u2019apr\u00e8s `HowlerPlugin.ts` et les usages du store, un plugin peut fournir :\n\n- **Formats de lead** (`addLead`) avec :\n - un formulaire d\u2019\u00e9dition (`lead.<format>.form`)\n - un rendu (`lead.<format>`)\n- **Formats de pivot** (`addPivot`) avec :\n - un formulaire (`pivot.<format>.form`)\n - un rendu de lien pivot (`pivot.<format>`)\n- **Op\u00e9rations d\u2019action personnalis\u00e9es** (`addOperation`) avec :\n - l\u2019UI d\u2019\u00e9dition de l\u2019op\u00e9ration (`operation.<id>`)\n - la documentation de l\u2019op\u00e9ration (`operation.<id>.documentation`)\n- **Entr\u00e9es de menu** :\n - menu utilisateur\n - menu administrateur\n - insertions/s\u00e9parateurs dans le menu principal\n- **Routage/navigation** :\n - routes\n - logique de fil d\u2019Ariane via `handle.breadcrumb` des routes\n- **Points d\u2019extension globaux** :\n - `provider()` pour injecter un contexte global\n - `setup()` au d\u00e9marrage\n - `localization(...)` pour les traductions\n - `helpers()` pour les helpers handlebars\n - `typography(...)` et `chip(...)` pour le rendu UI\n - `actions(...)` pour les actions sur les hits\n - `status(...)` pour la banni\u00e8re/statut d\u2019un hit\n - `support()`, `help()` et `settings(...)` par section\n - `documentation(md)` pour post-traiter du markdown\n - `on(event, hit)` pour les \u00e9v\u00e9nements\n\n## O\u00f9 les hooks sont ex\u00e9cut\u00e9s\n\n`executeFunction(...)` est utilis\u00e9 dans plusieurs parties de l\u2019UI, notamment pour :\n\n- le rendu des leads et leurs formulaires\n- le rendu des pivots et leurs formulaires\n- les \u00e9diteurs d\u2019op\u00e9rations et leur documentation\n- les actions plugin dans les vues/context menus de hit\n- les composants de statut/banni\u00e8re des hits\n- les composants typographie/chip\n- les providers plugins et la logique `setup`\n- les sections de param\u00e8tres (`admin`, `local`, `profile`, `security`)\n- les vues d\u2019aide/support\n- la transformation de markdown de documentation\n\n## Exemple : plugin Clue\n\nLe plugin Clue (`ui/src/plugins/clue/index.tsx`) montre un exemple concret :\n\n- enregistre des bundles de traduction EN/FR\n- expose un provider et un hook de setup\n- ajoute un format de lead `clue` avec :\n - un composant de formulaire\n - un renderer qui lit les m\u00e9tadonn\u00e9es du lead et affiche un `Fetcher`\n- ajoute un format de pivot `clue` (formulaire + rendu)\n- fournit des helpers handlebars personnalis\u00e9s\n- fournit des rendus personnalis\u00e9s pour `typography` et `chip`\n\nC\u2019est le mod\u00e8le recommand\u00e9 pour d\u00e9velopper de nouvelles int\u00e9grations.\n"
@@ -1,28 +1,41 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } 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 UserPageWrapper from '@cccsaurora/howler-ui/components/elements/display/UserPageWrapper';
5
5
  import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
6
6
  import useMyUserFunctions from '@cccsaurora/howler-ui/components/hooks/useMyUserFunctions';
7
7
  import ProfileSection from '@cccsaurora/howler-ui/components/routes/settings/ProfileSection';
8
8
  import SecuritySection from '@cccsaurora/howler-ui/components/routes/settings/SecuritySection';
9
- import { useCallback, useEffect, useState } from 'react';
10
- import { useParams } from 'react-router-dom';
9
+ import { useEffect, useState } from 'react';
10
+ import { useParams } from 'react-router';
11
11
  const UserEditor = () => {
12
12
  const { dispatchApi } = useMyApi();
13
13
  const { id } = useParams();
14
14
  const [user, setUser] = useState();
15
15
  const { user: currentUser } = useAppUser();
16
16
  const isAdmin = currentUser.is_admin;
17
+ const sameUser = currentUser.username === user?.username;
17
18
  const { editName, editPassword, editQuota, addRole, removeRole, addApiKey, removeApiKey, viewGroups } = useMyUserFunctions();
18
- const userWrapper = useCallback((fn) => {
19
- return async (value) => setUser(await fn(user, value));
20
- }, [user, setUser]);
19
+ const userWrapper = (fn) => {
20
+ return async (value) => {
21
+ if (!user) {
22
+ return;
23
+ }
24
+ setUser(await fn(user, value));
25
+ };
26
+ };
21
27
  useEffect(() => {
22
28
  if (id && !user) {
23
- void dispatchApi(api.user.get(id)).then(setUser);
29
+ void dispatchApi(api.user.get(id)).then(result => {
30
+ if (result) {
31
+ setUser(result);
32
+ }
33
+ });
24
34
  }
25
35
  }, [dispatchApi, id, user]);
26
- return (_jsxs(UserPageWrapper, { user: user, children: [_jsx(ProfileSection, { user: user, editName: (isAdmin || currentUser.username === user?.username) && userWrapper(editName), addRole: isAdmin && userWrapper(addRole), removeRole: isAdmin && userWrapper(removeRole), viewGroups: currentUser.username === user?.username && viewGroups }), _jsx(SecuritySection, { user: user, editPassword: currentUser.username === user?.username && editPassword, addApiKey: currentUser.username === user?.username && addApiKey, removeApiKey: (isAdmin || currentUser.username === user?.username) && userWrapper(removeApiKey), editQuota: isAdmin && userWrapper(editQuota) })] }));
36
+ if (!user) {
37
+ return null;
38
+ }
39
+ return (_jsxs(UserPageWrapper, { user: user, children: [_jsx(ProfileSection, { user: user, editName: isAdmin || sameUser ? userWrapper(editName) : undefined, addRole: isAdmin ? userWrapper(addRole) : undefined, removeRole: isAdmin ? userWrapper(removeRole) : undefined, viewGroups: sameUser ? viewGroups : undefined }), _jsx(SecuritySection, { user: user, editPassword: sameUser ? editPassword : undefined, addApiKey: sameUser ? addApiKey : undefined, removeApiKey: isAdmin || sameUser ? userWrapper(removeApiKey) : undefined, editQuota: isAdmin ? userWrapper(editQuota) : undefined })] }));
27
40
  };
28
41
  export default UserEditor;
@@ -1,9 +1,8 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Close, Search } from '@mui/icons-material';
3
3
  import { Box, Chip, Grid, IconButton, LinearProgress, Stack, TextField, Typography } from '@mui/material';
4
+ import { PageCenter, parseEvent } from '@tui/core';
4
5
  import api from '@cccsaurora/howler-ui/api';
5
- import PageCenter from '@cccsaurora/howler-ui/commons/components/pages/PageCenter';
6
- import { parseEvent } from '@cccsaurora/howler-ui/commons/components/utils/keyboard';
7
6
  import VSBox from '@cccsaurora/howler-ui/components/elements/addons/layout/vsbox/VSBox';
8
7
  import VSBoxContent from '@cccsaurora/howler-ui/components/elements/addons/layout/vsbox/VSBoxContent';
9
8
  import VSBoxHeader from '@cccsaurora/howler-ui/components/elements/addons/layout/vsbox/VSBoxHeader';
@@ -16,7 +15,7 @@ import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
16
15
  import { useMyLocalStorageItem } from '@cccsaurora/howler-ui/components/hooks/useMyLocalStorage';
17
16
  import { useCallback, useContext, useEffect, useState } from 'react';
18
17
  import { useTranslation } from 'react-i18next';
19
- import { useNavigate, useSearchParams } from 'react-router-dom';
18
+ import { useNavigate, useSearchParams } from 'react-router';
20
19
  import { StorageKey } from '@cccsaurora/howler-ui/utils/constants';
21
20
  import { sanitizeLuceneQuery } from '@cccsaurora/howler-ui/utils/stringUtils';
22
21
  const COLUMN = [
@@ -33,8 +32,8 @@ const UserSearch = () => {
33
32
  const pageCount = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25)[0];
34
33
  const [searching, setSearching] = useState(false);
35
34
  const [phrase, setPhrase] = useState('');
36
- const [offset, setOffset] = useState(parseInt(searchParams.get('offset')) || 0);
37
- const [response, setResponse] = useState(null);
35
+ const [offset, setOffset] = useState(parseInt(searchParams.get('offset') ?? '0') || 0);
36
+ const [response, setResponse] = useState();
38
37
  // Search Handler.
39
38
  const onSearch = useCallback(async () => {
40
39
  setSearching(true);
@@ -46,7 +45,9 @@ const UserSearch = () => {
46
45
  offset
47
46
  }));
48
47
  setResponse(_response);
49
- load(_response.items.map(u => ({ id: u.username, item: u })));
48
+ if (_response) {
49
+ load(_response.items.map(u => ({ id: u.username, item: u })));
50
+ }
50
51
  }
51
52
  finally {
52
53
  setSearching(false);
@@ -84,7 +85,7 @@ const UserSearch = () => {
84
85
  // eslint-disable-next-line react-hooks/exhaustive-deps
85
86
  []);
86
87
  useEffect(() => {
87
- if (response?.total <= offset) {
88
+ if (response && response.total <= offset) {
88
89
  setOffset(0);
89
90
  searchParams.set('offset', '0');
90
91
  setSearchParams(searchParams);
@@ -102,12 +103,12 @@ const UserSearch = () => {
102
103
  return _jsx("div", { style: { height: '100%', display: 'flex', alignItems: 'center' }, children: _value.toString() });
103
104
  }
104
105
  else {
105
- return (_jsx(Grid, { container: true, spacing: 1, children: _value.map(g => (_jsx(Grid, { item: true, children: _jsx(Chip, { label: g, size: "small", sx: { fontSize: '11px' } }) }, g))) }));
106
+ return (_jsx(Grid, { container: true, spacing: 1, children: _value.map(g => (_jsx(Grid, { children: _jsx(Chip, { label: g, size: "small", sx: { fontSize: '11px' } }) }, g))) }));
106
107
  }
107
108
  }, []);
108
109
  // TuiTable handler for when selecting/clicking a Row.
109
110
  const onRowSelect = useCallback(selection => {
110
- navigate(selection.item.username);
111
+ void navigate(selection.item.username);
111
112
  }, [navigate]);
112
113
  return (_jsxs(VSBox, { children: [_jsxs(VSBoxHeader, { children: [_jsx(Typography, { sx: theme => ({ fontStyle: 'italic ', color: theme.palette.text.disabled, mb: 0.5 }), variant: "body2", children: t('page.user.search.prompt') }), _jsx(TextField, { fullWidth: true, autoComplete: "off", value: phrase, onChange: onValueChange, onKeyDown: onKeyDown, InputProps: {
113
114
  startAdornment: (_jsx(_Fragment, { children: _jsx(IconButton, { onClick: onSearch, children: _jsx(Search, {}) }) })),
@@ -4,9 +4,8 @@ import { useMonaco } from '@monaco-editor/react';
4
4
  import { OpenInNew, PlayArrowOutlined } from '@mui/icons-material';
5
5
  import { Alert, AlertTitle, Autocomplete, Box, Card, Checkbox, Chip, CircularProgress, FormControlLabel, IconButton, ListItemText, Slider, Stack, TextField, Tooltip, Typography, useMediaQuery, useTheme } from '@mui/material';
6
6
  import Popper, {} from '@mui/material/Popper';
7
+ import { PageCenter, parseEvent } from '@tui/core';
7
8
  import api from '@cccsaurora/howler-ui/api';
8
- import PageCenter from '@cccsaurora/howler-ui/commons/components/pages/PageCenter';
9
- import { parseEvent } from '@cccsaurora/howler-ui/commons/components/utils/keyboard';
10
9
  import { FieldContext } from '@cccsaurora/howler-ui/components/app/providers/FieldProvider';
11
10
  import CustomButton from '@cccsaurora/howler-ui/components/elements/addons/buttons/CustomButton';
12
11
  import FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
@@ -14,7 +13,7 @@ import JSONViewer from '@cccsaurora/howler-ui/components/elements/display/json/J
14
13
  import dayjs from 'dayjs';
15
14
  import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
16
15
  import { useTranslation } from 'react-i18next';
17
- import { Link } from 'react-router-dom';
16
+ import { Link } from 'react-router';
18
17
  import { sanitizeMultilineLucene } from '@cccsaurora/howler-ui/utils/stringUtils';
19
18
  import { v4 as uuid } from 'uuid';
20
19
  import QueryEditor from './QueryEditor';
@@ -78,21 +77,21 @@ const QueryBuilder = () => {
78
77
  const [type, setType] = useState('lucene');
79
78
  const [loading, setLoading] = useState(false);
80
79
  const [query, setQuery] = useState(DEFAULT_VALUES.lucene);
81
- const [queryType, setQueryType] = useState(LUCENE_QUERY_OPTIONS[0]);
82
- const [groupByField, setGroupByField] = useState(null);
80
+ const [queryType, setQueryType] = useState('default');
81
+ const [groupByField, setGroupByField] = useState('');
83
82
  const [allFields, setAllFields] = useState(true);
84
83
  const [fields, setFields] = useState(['howler.id']);
85
84
  const [response, setResponse] = useState(null);
86
- const [error, setError] = useState(null);
85
+ const [error, setError] = useState('');
87
86
  const [rows, setRows] = useState(1);
88
87
  const [x, setX] = useState(0);
89
- const wrapper = useRef();
88
+ const wrapper = useRef(null);
90
89
  const fieldOptions = useMemo(() => hitFields.map(_field => _field.key), [hitFields]);
91
90
  const execute = useCallback(async () => {
92
91
  setLoading(true);
93
92
  try {
94
93
  const searchProperties = {
95
- fl: allFields ? null : fields.join(','),
94
+ fl: allFields ? undefined : fields.join(','),
96
95
  rows: STEPS[rows]
97
96
  };
98
97
  let result;
@@ -134,11 +133,15 @@ const QueryBuilder = () => {
134
133
  ...searchProperties
135
134
  });
136
135
  }
136
+ setError('');
137
+ if (!result) {
138
+ setResponse(null);
139
+ return;
140
+ }
137
141
  setResponse(result);
138
- setError(null);
139
142
  }
140
143
  catch (e) {
141
- setError(e.message ?? e.toString());
144
+ setError(e instanceof Error ? (e.message ?? e.toString()) : String(e));
142
145
  }
143
146
  finally {
144
147
  setLoading(false);
@@ -152,6 +155,9 @@ const QueryBuilder = () => {
152
155
  }, [execute]);
153
156
  const onMouseMove = useCallback((event) => {
154
157
  const wrapperRect = wrapper.current?.getBoundingClientRect();
158
+ if (!wrapperRect) {
159
+ return;
160
+ }
155
161
  const offset = event.clientX - (wrapperRect.left + wrapperRect.width / 2);
156
162
  setX(offset);
157
163
  }, []);
@@ -210,7 +216,7 @@ const QueryBuilder = () => {
210
216
  height: '100%',
211
217
  '& .MuiFormControl-root': { height: '100%', '& > div': { height: '100%' } }
212
218
  }
213
- ], slotProps: { paper: { sx: { minWidth: '600px' } } } }), _jsx(Card, { variant: "outlined", sx: { flex: 1, maxWidth: '350px', minWidth: '210px' }, children: _jsxs(Stack, { spacing: 0.5, sx: { px: 1, alignItems: 'start' }, children: [_jsxs(Typography, { variant: "caption", color: "text.secondary", sx: { whiteSpace: 'nowrap' }, children: [t('route.advanced.rows'), ": ", STEPS[rows]] }), _jsx(Slider, { size: "small", valueLabelDisplay: "off", value: rows, onChange: (_, value) => setRows(value), min: 0, max: 9, step: 1, marks: true, track: false, sx: { py: 0.5 } })] }) })] }), type === 'lucene' && (_jsx(Autocomplete, { size: "small", getOptionLabel: opt => t(`route.advanced.query.type.${opt}`), options: LUCENE_QUERY_OPTIONS, value: queryType, onChange: (_event, value) => setQueryType(value), renderInput: params => (_jsx(TextField, { ...params, label: t('route.advanced.query.lucene.type'), sx: { minWidth: '230px' } })), renderOption: (props, option) => (_jsx(ListItemText, { ...props, sx: { flexDirection: 'column', alignItems: 'start !important' }, primary: t(`route.advanced.query.type.${option}`), secondary: t(`route.advanced.query.type.${option}.description`) })) })), queryType === 'groupby' && (_jsx(Autocomplete, { size: "small", options: fieldOptions, value: groupByField, onChange: (__, value) => setGroupByField(value), renderInput: params => _jsx(TextField, { ...params, label: t('route.advanced.pivot.field') }), sx: { minWidth: '200px', '& label': { zIndex: 1200 } }, onKeyDown: onKeyDown, PopperComponent: CustomPopper })), allFields && queryType !== 'facet' ? (_jsx(FormControlLabel, { control: _jsx(Checkbox, { size: "small", checked: allFields, onChange: (__, checked) => setAllFields(checked) }), label: t('route.advanced.fields.all'), sx: { '& > span': { color: 'text.secondary' }, alignSelf: 'start' } })) : (_jsx(Autocomplete, { fullWidth: true, renderTags: values => values.length <= 3 ? (_jsx(Stack, { direction: "row", spacing: 0.5, children: values.map(_value => (_jsx(Chip, { label: _value }, _value))) })) : (_jsx(Tooltip, { title: _jsx(Stack, { spacing: 1, children: values.map(_value => (_jsx("span", { children: _value }, _value))) }), children: _jsx(Chip, { label: values.length }) })), multiple: true, size: "small", options: fieldOptions, value: fields, onChange: (__, values) => (values.length > 0 ? setFields(values) : setAllFields(true)), renderInput: params => _jsx(TextField, { ...params, label: t('route.advanced.fields') }), sx: { maxWidth: '500px', width: '20vw', minWidth: '200px', '& label': { zIndex: 1200 } }, onKeyDown: onKeyDown, PopperComponent: CustomPopper })), _jsx(FlexOne, {}), type === 'lucene' &&
219
+ ], slotProps: { paper: { sx: { minWidth: '600px' } } } }), _jsx(Card, { variant: "outlined", sx: { flex: 1, maxWidth: '350px', minWidth: '210px' }, children: _jsxs(Stack, { spacing: 0.5, sx: { px: 1, alignItems: 'start' }, children: [_jsxs(Typography, { variant: "caption", color: "text.secondary", sx: { whiteSpace: 'nowrap' }, children: [t('route.advanced.rows'), ": ", STEPS[rows]] }), _jsx(Slider, { size: "small", valueLabelDisplay: "off", value: rows, onChange: (_, value) => setRows(value), min: 0, max: 9, step: 1, marks: true, track: false, sx: { py: 0.5 } })] }) })] }), type === 'lucene' && (_jsx(Autocomplete, { size: "small", getOptionLabel: opt => t(`route.advanced.query.type.${opt}`), options: LUCENE_QUERY_OPTIONS, value: queryType, onChange: (_event, value) => setQueryType(value ?? 'default'), renderInput: params => (_jsx(TextField, { ...params, label: t('route.advanced.query.lucene.type'), sx: { minWidth: '230px' } })), renderOption: (props, option) => (_jsx(ListItemText, { ...props, sx: { flexDirection: 'column', alignItems: 'start !important' }, primary: t(`route.advanced.query.type.${option}`), secondary: t(`route.advanced.query.type.${option}.description`) })) })), queryType === 'groupby' && (_jsx(Autocomplete, { size: "small", options: fieldOptions, value: groupByField, onChange: (__, value) => setGroupByField(value ?? ''), renderInput: params => _jsx(TextField, { ...params, label: t('route.advanced.pivot.field') }), sx: { minWidth: '200px', '& label': { zIndex: 1200 } }, onKeyDown: onKeyDown, PopperComponent: CustomPopper })), allFields && queryType !== 'facet' ? (_jsx(FormControlLabel, { control: _jsx(Checkbox, { size: "small", checked: allFields, onChange: (__, checked) => setAllFields(checked) }), label: t('route.advanced.fields.all'), sx: { '& > span': { color: 'text.secondary' }, alignSelf: 'start' } })) : (_jsx(Autocomplete, { fullWidth: true, renderTags: values => values.length <= 3 ? (_jsx(Stack, { direction: "row", spacing: 0.5, children: values.map(_value => (_jsx(Chip, { label: _value }, _value))) })) : (_jsx(Tooltip, { title: _jsx(Stack, { spacing: 1, children: values.map(_value => (_jsx("span", { children: _value }, _value))) }), children: _jsx(Chip, { label: values.length }) })), multiple: true, size: "small", options: fieldOptions, value: fields, onChange: (__, values) => (values.length > 0 ? setFields(values) : setAllFields(true)), renderInput: params => _jsx(TextField, { ...params, label: t('route.advanced.fields') }), sx: { maxWidth: '500px', width: '20vw', minWidth: '200px', '& label': { zIndex: 1200 } }, onKeyDown: onKeyDown, slots: { popper: CustomPopper } })), _jsx(FlexOne, {}), type === 'lucene' &&
214
220
  (smallButtons ? (_jsx(Tooltip, { title: t('route.advanced.open'), children: _jsx(IconButton, { color: "primary", sx: { alignSelf: 'center' }, component: Link, disabled: !response, to: `/hits?query=${sanitizeMultilineLucene(query).replaceAll('\n', ' ').trim()}`, children: _jsx(OpenInNew, { fontSize: "small" }) }) })) : (_jsx(CustomButton, { size: "small", variant: "outlined", startIcon: _jsx(OpenInNew, {}), component: Link, disabled: !response, ...{ to: `/hits?query=${sanitizeMultilineLucene(query).replaceAll('\n', ' ').trim()}` }, children: t('route.advanced.open') })))] }), _jsxs(Box, { width: "100%", height: "calc(100vh - 112px)", sx: { position: 'relative', overflow: 'hidden', borderTop: `thin solid ${theme.palette.divider}` }, children: [_jsx(Box, { sx: {
215
221
  position: 'absolute',
216
222
  top: 0,
@@ -5,6 +5,7 @@ import { FieldContext } from '@cccsaurora/howler-ui/components/app/providers/Fie
5
5
  import Fuse from 'fuse.js';
6
6
  import { useContext, useEffect, useMemo } from 'react';
7
7
  import { DEFAULT_QUERY } from '@cccsaurora/howler-ui/utils/constants';
8
+ const isLookupKey = (key, lookups) => Object.hasOwn(lookups, key);
8
9
  const useLuceneCompletionProvider = () => {
9
10
  const { config } = useContext(ApiConfigContext);
10
11
  const monaco = useMonaco();
@@ -16,6 +17,9 @@ const useLuceneCompletionProvider = () => {
16
17
  const fuse = useMemo(() => new Fuse(hitFields, { keys: ['key'], threshold: 0.4 }), [hitFields]);
17
18
  return {
18
19
  provideCompletionItems: async (model, position) => {
20
+ if (!monaco) {
21
+ return { suggestions: [] };
22
+ }
19
23
  const line = model.getLineContent(position.lineNumber);
20
24
  const context = line.slice(0, position.column - 1);
21
25
  // Get what comes before, and the field we're intersted in autocompleting
@@ -23,12 +27,15 @@ const useLuceneCompletionProvider = () => {
23
27
  const portion = context.replace(/^.+?[^a-zA-Z._]([a-zA-Z._*]*)$/, '$1');
24
28
  // If the field is complete and we're autocompleting the value, we parse the field and see if it's an enum.
25
29
  // If it is, suggest the matching values
26
- if (before.trim().endsWith(':')) {
30
+ if (before.trim().endsWith(':') && config.lookups) {
27
31
  const key = before.trim().replace(/^.*?[^a-zA-Z._]?([a-zA-Z._]+):$/, '$1');
28
- if (config.lookups[key]) {
32
+ const lookupValues = isLookupKey(key, config.lookups) ? config.lookups[key] : undefined;
33
+ if (Array.isArray(lookupValues)) {
29
34
  const _position = model.getWordUntilPosition(position);
30
35
  return {
31
- suggestions: config.lookups[key].map(_value => ({
36
+ suggestions: lookupValues
37
+ .filter((value) => typeof value === 'string')
38
+ .map(_value => ({
32
39
  label: _value,
33
40
  kind: monaco.languages.CompletionItemKind.Constant,
34
41
  insertText: _value,
@@ -44,10 +51,10 @@ const useLuceneCompletionProvider = () => {
44
51
  else {
45
52
  const options = await api.search.facet.hit
46
53
  .post({ query: DEFAULT_QUERY, rows: 250, fields: [key] })
47
- .catch(() => ({}));
54
+ .catch(() => null);
48
55
  const _position = model.getWordUntilPosition(position);
49
56
  return {
50
- suggestions: Object.keys(options[key] || {}).map(_value => ({
57
+ suggestions: Object.keys(options?.[key] ?? {}).map(_value => ({
51
58
  label: _value,
52
59
  kind: monaco.languages.CompletionItemKind.Constant,
53
60
  insertText: `"${_value}"`,
@@ -71,26 +78,40 @@ const useLuceneCompletionProvider = () => {
71
78
  if (portion) {
72
79
  const fuzzyMatches = fuse.search(portion);
73
80
  return {
74
- suggestions: fuzzyMatches.map(({ item }) => ({
75
- label: item.key,
76
- detail: item.type,
77
- documentation: item.description,
78
- kind: monaco.languages.CompletionItemKind.Property,
79
- insertText: item.key + ':',
80
- range
81
- }))
81
+ suggestions: fuzzyMatches.flatMap(({ item }) => {
82
+ if (!item.key) {
83
+ return [];
84
+ }
85
+ return [
86
+ {
87
+ label: item.key,
88
+ detail: item.type,
89
+ documentation: item.description,
90
+ kind: monaco.languages.CompletionItemKind.Property,
91
+ insertText: item.key + ':',
92
+ range
93
+ }
94
+ ];
95
+ })
82
96
  };
83
97
  }
84
98
  else {
85
99
  return {
86
- suggestions: hitFields.map(_field => ({
87
- label: _field.key,
88
- detail: _field.type,
89
- documentation: _field.description,
90
- kind: monaco.languages.CompletionItemKind.Property,
91
- insertText: _field.key + ':',
92
- range
93
- }))
100
+ suggestions: hitFields.flatMap(_field => {
101
+ if (!_field.key) {
102
+ return [];
103
+ }
104
+ return [
105
+ {
106
+ label: _field.key,
107
+ detail: _field.type,
108
+ documentation: _field.description,
109
+ kind: monaco.languages.CompletionItemKind.Property,
110
+ insertText: _field.key + ':',
111
+ range
112
+ }
113
+ ];
114
+ })
94
115
  };
95
116
  }
96
117
  }
@@ -1,16 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Clear, Send } from '@mui/icons-material';
3
3
  import { Chip, Divider, IconButton, 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 FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
7
7
  import Comment from '@cccsaurora/howler-ui/components/elements/Comment';
8
8
  import HowlerAvatar from '@cccsaurora/howler-ui/components/elements/display/HowlerAvatar';
9
9
  import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
10
10
  import useMyUserList from '@cccsaurora/howler-ui/components/hooks/useMyUserList';
11
+ import { omit } from 'lodash-es';
11
12
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
12
13
  import { useTranslation } from 'react-i18next';
13
- import { useSearchParams } from 'react-router-dom';
14
+ import { useSearchParams } from 'react-router';
14
15
  import { compareTimestamp } from '@cccsaurora/howler-ui/utils/utils';
15
16
  const MAX_LENGTH = 5000;
16
17
  const AnalyticComments = ({ analytic, setAnalytic }) => {
@@ -23,17 +24,21 @@ const AnalyticComments = ({ analytic, setAnalytic }) => {
23
24
  const [length, setLength] = useState(0);
24
25
  const [loading, setLoading] = useState(false);
25
26
  const [showClear, setShowClear] = useState(false);
26
- const input = useRef();
27
+ const input = useRef(null);
27
28
  const onSubmit = useCallback(async () => {
28
- if (!input.current?.value || !analytic || input.current.value.length > MAX_LENGTH)
29
+ if (!input.current?.value || !analytic || input.current.value.length > MAX_LENGTH) {
29
30
  return;
31
+ }
30
32
  setLoading(true);
31
33
  try {
32
- const result = await dispatchApi(api.analytic.comments.post(analytic.analytic_id, input.current.value, searchParams.get('filter')), {
34
+ const result = await dispatchApi(api.analytic.comments.post(analytic.analytic_id, input.current.value, searchParams.get('filter') ?? undefined), {
33
35
  showError: true,
34
36
  throwError: true,
35
37
  logError: false
36
38
  });
39
+ if (!result) {
40
+ return;
41
+ }
37
42
  setAnalytic(result);
38
43
  input.current.value = '';
39
44
  setShowClear(false);
@@ -56,16 +61,16 @@ const AnalyticComments = ({ analytic, setAnalytic }) => {
56
61
  void onSubmit();
57
62
  }
58
63
  }, [loading, onSubmit]);
59
- const checkLength = useCallback(() => setLength(input.current?.value.length), []);
64
+ const checkLength = useCallback(() => setLength(input.current?.value.length ?? 0), []);
60
65
  const handleDelete = useCallback(async (commentId) => {
61
- await dispatchApi(api.analytic.comments.del(analytic?.analytic_id, [commentId]));
66
+ await dispatchApi(api.analytic.comments.del(analytic.analytic_id, [commentId]));
62
67
  setAnalytic({
63
68
  ...analytic,
64
69
  comment: analytic.comment.filter(c => c.id !== commentId)
65
70
  });
66
71
  }, [analytic, dispatchApi, setAnalytic]);
67
72
  const handleEdit = useCallback(async (commentId, editValue) => {
68
- await dispatchApi(api.analytic.comments.put(analytic?.analytic_id, commentId, editValue));
73
+ await dispatchApi(api.analytic.comments.put(analytic.analytic_id, commentId, editValue));
69
74
  setAnalytic({
70
75
  ...analytic,
71
76
  comment: analytic.comment.map(cmt => (cmt.id !== commentId ? cmt : { ...cmt, value: editValue }))
@@ -86,28 +91,28 @@ const AnalyticComments = ({ analytic, setAnalytic }) => {
86
91
  }, []);
87
92
  const handleReact = useCallback(async (commentId, type) => {
88
93
  if (type) {
89
- await dispatchApi(api.analytic.comments.react.put(analytic?.analytic_id, commentId, type));
94
+ await dispatchApi(api.analytic.comments.react.put(analytic.analytic_id, commentId, type));
90
95
  setAnalytic({
91
96
  ...analytic,
92
97
  comment: analytic.comment.map(cmt => cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt?.reactions, [user.username]: type } })
93
98
  });
94
99
  }
95
100
  else {
96
- await dispatchApi(api.analytic.comments.react.del(analytic?.analytic_id, commentId));
101
+ await dispatchApi(api.analytic.comments.react.del(analytic.analytic_id, commentId));
97
102
  setAnalytic({
98
103
  ...analytic,
99
- comment: analytic.comment.map(cmt => cmt.id !== commentId ? cmt : { ...cmt, reactions: { ...cmt?.reactions, [user.username]: undefined } })
104
+ comment: analytic.comment.map(cmt => cmt.id !== commentId ? cmt : { ...cmt, reactions: omit(cmt.reactions, user.username) })
100
105
  });
101
106
  }
102
107
  }, [analytic, dispatchApi, setAnalytic, user.username]);
103
108
  useEffect(() => {
104
- setUserIds(new Set(analytic?.comment.map(c => c.user)));
109
+ setUserIds(new Set((analytic.comment ?? []).map(c => c.user)));
105
110
  // eslint-disable-next-line react-hooks/exhaustive-deps
106
111
  }, [analytic?.analytic_id]);
107
112
  const comments = useMemo(() => analytic?.comment
108
- .filter(c => !searchParams.get('filter') || c.detection === searchParams.get('filter'))
113
+ ?.filter(c => !searchParams.get('filter') || c.detection === searchParams.get('filter'))
109
114
  .sort((a, b) => compareTimestamp(b.timestamp, a.timestamp))
110
115
  .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), extra: !searchParams.get('filter') && (_jsx(Chip, { size: "small", sx: theme => ({ marginLeft: '0 !important', mr: `${theme.spacing(2)} !important` }), label: c.detection ?? 'Analytic' })) }, c.id))), [analytic?.comment, searchParams, handleDelete, handleEdit, handleQuote, handleReact, users]);
111
- return (_jsxs(Stack, { direction: "column", py: 2, spacing: 1, children: [_jsx(Divider, { orientation: "horizontal", flexItem: true }), _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(searchParams.get('filter') ? 'comments.add.detection' : 'comments.add.analytic'), onKeyDown: checkForSubmit, onChangeCapture: checkLength, inputRef: input, error: length > MAX_LENGTH, fullWidth: true, multiline: true })] }), _jsxs(Stack, { direction: "row", alignItems: "center", children: [_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" }) })] }), comments] }));
116
+ return (_jsxs(Stack, { direction: "column", py: 2, spacing: 1, children: [_jsx(Divider, { orientation: "horizontal", flexItem: true }), _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(searchParams.get('filter') ? 'comments.add.detection' : 'comments.add.analytic'), onKeyDown: checkForSubmit, onChangeCapture: checkLength, inputRef: input, error: length > MAX_LENGTH, fullWidth: true, multiline: true })] }), _jsxs(Stack, { direction: "row", alignItems: "center", children: [_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" }) })] }), comments] }));
112
117
  };
113
118
  export default AnalyticComments;
@@ -1,2 +1,2 @@
1
- declare const AnalyticDetails: () => import("react/jsx-runtime").JSX.Element;
1
+ declare const AnalyticDetails: () => import("react").JSX.Element;
2
2
  export default AnalyticDetails;