@cccsaurora/howler-ui 2.14.0-dev.264 → 2.14.0-dev.266

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 (345) hide show
  1. package/api/action/execute.ts +3 -3
  2. package/api/action/index.ts +5 -5
  3. package/api/action/operations.ts +3 -3
  4. package/api/analytic/comments/index.ts +4 -4
  5. package/api/analytic/comments/react.ts +2 -2
  6. package/api/analytic/favourite.ts +2 -2
  7. package/api/analytic/index.ts +7 -7
  8. package/api/analytic/notebooks/index.ts +3 -3
  9. package/api/analytic/owner.ts +3 -3
  10. package/api/analytic/rules.ts +3 -3
  11. package/api/auth/apikey.ts +2 -2
  12. package/api/auth/index.ts +3 -3
  13. package/api/auth/login.ts +3 -3
  14. package/api/configs/index.ts +2 -2
  15. package/api/dossier/hit.ts +2 -2
  16. package/api/dossier/index.ts +2 -2
  17. package/api/help.ts +1 -1
  18. package/api/hit/assign.ts +3 -3
  19. package/api/hit/comments/index.ts +4 -4
  20. package/api/hit/comments/react.ts +2 -2
  21. package/api/hit/index.ts +7 -7
  22. package/api/hit/labels.ts +4 -4
  23. package/api/hit/overwrite.ts +3 -3
  24. package/api/hit/transition.ts +4 -4
  25. package/api/index.ts +18 -18
  26. package/api/notebook/environments.ts +2 -2
  27. package/api/notebook/index.ts +4 -4
  28. package/api/overview/index.ts +2 -2
  29. package/api/search/action.ts +4 -4
  30. package/api/search/analytic.ts +4 -4
  31. package/api/search/count/hit.ts +3 -3
  32. package/api/search/count/index.ts +3 -3
  33. package/api/search/dossier.ts +4 -4
  34. package/api/search/eql/hit.ts +4 -4
  35. package/api/search/facet/hit.ts +3 -3
  36. package/api/search/facet/index.ts +3 -3
  37. package/api/search/fields/hit.ts +3 -3
  38. package/api/search/fields/index.ts +4 -4
  39. package/api/search/fields/user.ts +4 -4
  40. package/api/search/grouped/hit.ts +4 -4
  41. package/api/search/grouped/index.ts +4 -4
  42. package/api/search/grouped/user.ts +4 -4
  43. package/api/search/histogram/hit.ts +3 -3
  44. package/api/search/histogram/index.ts +3 -3
  45. package/api/search/hit.ts +6 -6
  46. package/api/search/index.ts +14 -14
  47. package/api/search/overview.ts +4 -4
  48. package/api/search/sigma/hit.ts +4 -4
  49. package/api/search/template.ts +4 -4
  50. package/api/search/user.ts +4 -4
  51. package/api/search/view.ts +4 -4
  52. package/api/template/index.ts +2 -2
  53. package/api/user/avatar/index.ts +2 -2
  54. package/api/user/groups.ts +2 -2
  55. package/api/user/index.ts +5 -5
  56. package/api/user/whoami.ts +3 -3
  57. package/api/view/favourite.ts +2 -2
  58. package/api/view/index.ts +3 -3
  59. package/commons/components/app/AppConfigs.ts +2 -2
  60. package/commons/components/app/AppContexts.ts +5 -5
  61. package/commons/components/app/AppDefaults.ts +1 -1
  62. package/commons/components/app/AppNotificationService.ts +1 -1
  63. package/commons/components/app/AppProvider.tsx +14 -14
  64. package/commons/components/app/AppSearchService.ts +1 -1
  65. package/commons/components/app/AppSkeleton.tsx +4 -4
  66. package/commons/components/app/hooks/useApp.tsx +1 -1
  67. package/commons/components/app/hooks/useAppBanner.tsx +1 -1
  68. package/commons/components/app/hooks/useAppBar.tsx +1 -1
  69. package/commons/components/app/hooks/useAppBreadcrumbs.tsx +1 -1
  70. package/commons/components/app/hooks/useAppConfigs.tsx +2 -2
  71. package/commons/components/app/hooks/useAppLanguage.tsx +2 -2
  72. package/commons/components/app/hooks/useAppLayout.tsx +1 -1
  73. package/commons/components/app/hooks/useAppLeftNav.tsx +1 -1
  74. package/commons/components/app/hooks/useAppLogo.tsx +2 -2
  75. package/commons/components/app/hooks/useAppNotification.tsx +1 -1
  76. package/commons/components/app/hooks/useAppQuickSearch.tsx +1 -1
  77. package/commons/components/app/hooks/useAppSearchService.tsx +2 -2
  78. package/commons/components/app/hooks/useAppSitemap.tsx +3 -3
  79. package/commons/components/app/hooks/useAppSwitcher.tsx +1 -1
  80. package/commons/components/app/hooks/useAppTheme.tsx +1 -1
  81. package/commons/components/app/hooks/useAppUser.tsx +2 -2
  82. package/commons/components/app/providers/AppBarProvider.tsx +9 -9
  83. package/commons/components/app/providers/AppBreadcrumbsProvider.tsx +5 -5
  84. package/commons/components/app/providers/AppLayoutProvider.tsx +7 -7
  85. package/commons/components/app/providers/AppLeftNavProvider.tsx +5 -5
  86. package/commons/components/app/providers/AppNotificationProvider.tsx +1 -1
  87. package/commons/components/app/providers/AppQuickSearchProvider.tsx +6 -6
  88. package/commons/components/app/providers/AppSearchServiceProvider.tsx +3 -3
  89. package/commons/components/app/providers/AppSwitcherProvider.tsx +3 -3
  90. package/commons/components/app/providers/AppUserProvider.tsx +2 -2
  91. package/commons/components/breadcrumbs/BreadcrumbIcon.tsx +1 -1
  92. package/commons/components/breadcrumbs/BreadcrumbLastItem.tsx +2 -2
  93. package/commons/components/breadcrumbs/BreadcrumbLinkItem.tsx +2 -2
  94. package/commons/components/breadcrumbs/BreadcrumbList.tsx +3 -3
  95. package/commons/components/breadcrumbs/Breadcrumbs.tsx +2 -2
  96. package/commons/components/display/AppAvatar.tsx +1 -1
  97. package/commons/components/display/AppListEmpty.tsx +1 -1
  98. package/commons/components/display/AppToc.tsx +3 -3
  99. package/commons/components/display/hooks/useAppColor.tsx +1 -1
  100. package/commons/components/leftnav/LeftNavDrawer.tsx +4 -4
  101. package/commons/components/leftnav/LeftNavGroup.tsx +3 -3
  102. package/commons/components/leftnav/LeftNavItem.tsx +2 -2
  103. package/commons/components/notification/Notification.tsx +4 -4
  104. package/commons/components/notification/elements/NotificationCloseButton.tsx +1 -1
  105. package/commons/components/notification/elements/NotificationContainer.tsx +5 -5
  106. package/commons/components/notification/elements/NotificationEndOfPage.tsx +1 -1
  107. package/commons/components/notification/elements/NotificationItems.tsx +2 -2
  108. package/commons/components/notification/elements/item/NotificationItem.tsx +7 -7
  109. package/commons/components/notification/elements/item/NotificationItemAuthor.tsx +1 -1
  110. package/commons/components/notification/elements/item/NotificationItemContent.tsx +1 -1
  111. package/commons/components/notification/elements/item/NotificationItemDate.tsx +1 -1
  112. package/commons/components/notification/elements/item/NotificationItemTitle.tsx +1 -1
  113. package/commons/components/pages/PageCenter.tsx +2 -2
  114. package/commons/components/pages/PageContent.tsx +1 -1
  115. package/commons/components/pages/PageFullScreen.tsx +3 -3
  116. package/commons/components/pages/PageFullWidth.tsx +1 -1
  117. package/commons/components/pages/PageHeader.tsx +1 -1
  118. package/commons/components/search/AppSearch.tsx +4 -4
  119. package/commons/components/search/AppSearchResult.tsx +4 -4
  120. package/commons/components/topnav/AppBar.tsx +9 -9
  121. package/commons/components/topnav/AppName.tsx +1 -1
  122. package/commons/components/topnav/AppSwitcher.tsx +1 -1
  123. package/commons/components/topnav/Notifications.tsx +2 -2
  124. package/commons/components/topnav/ThemeSelection.tsx +3 -3
  125. package/commons/components/topnav/ThemeSelectionIcon.tsx +2 -2
  126. package/commons/components/topnav/UserProfile.tsx +4 -4
  127. package/commons/components/utils/hooks/useLocalStorageItem.tsx +1 -1
  128. package/commons/components/utils/hooks/useThemeBuilder.tsx +2 -2
  129. package/components/app/App.tsx +57 -57
  130. package/components/app/AppContainer.tsx +1 -1
  131. package/components/app/drawers/ApiKeyDrawer.tsx +5 -5
  132. package/components/app/drawers/AssignUserDrawer.tsx +6 -6
  133. package/components/app/drawers/ViewGroupsDrawer.tsx +1 -1
  134. package/components/app/hooks/useMatchers.tsx +2 -2
  135. package/components/app/hooks/useTitle.tsx +1 -1
  136. package/components/app/providers/AnalyticProvider.tsx +5 -5
  137. package/components/app/providers/ApiConfigProvider.tsx +1 -1
  138. package/components/app/providers/AppDrawerProvider.tsx +1 -1
  139. package/components/app/providers/AvatarProvider.tsx +2 -2
  140. package/components/app/providers/CustomPluginProvider.tsx +1 -1
  141. package/components/app/providers/FavouritesProvider.tsx +3 -3
  142. package/components/app/providers/FieldProvider.tsx +3 -3
  143. package/components/app/providers/HitProvider.tsx +5 -5
  144. package/components/app/providers/HitSearchProvider.tsx +12 -12
  145. package/components/app/providers/LocalStorageProvider.tsx +2 -2
  146. package/components/app/providers/OverviewProvider.tsx +3 -3
  147. package/components/app/providers/ParameterProvider.tsx +1 -1
  148. package/components/app/providers/SocketProvider.tsx +5 -5
  149. package/components/app/providers/UserListProvider.tsx +3 -3
  150. package/components/app/providers/ViewProvider.tsx +7 -7
  151. package/components/elements/Comment.tsx +7 -7
  152. package/components/elements/EditRow.tsx +1 -1
  153. package/components/elements/PluginChip.tsx +1 -1
  154. package/components/elements/PluginTypography.tsx +1 -1
  155. package/components/elements/ThemedEditor.tsx +3 -3
  156. package/components/elements/UserList.tsx +1 -1
  157. package/components/elements/addons/layout/FlexPort.tsx +1 -1
  158. package/components/elements/addons/layout/FlexVertical.tsx +2 -2
  159. package/components/elements/addons/layout/vsbox/VSBox.tsx +1 -1
  160. package/components/elements/addons/lists/TuiList.tsx +1 -1
  161. package/components/elements/addons/lists/TuiListBase.tsx +2 -2
  162. package/components/elements/addons/lists/hooks/useTuiListKeyboard.tsx +2 -2
  163. package/components/elements/addons/lists/table/TuiTable.tsx +1 -1
  164. package/components/elements/addons/lists/table/TuiTableBody.tsx +1 -1
  165. package/components/elements/addons/lists/table/TuiTableHead.tsx +1 -1
  166. package/components/elements/addons/search/phrase/Phrase.tsx +1 -1
  167. package/components/elements/display/ActionButton.tsx +4 -4
  168. package/components/elements/display/Classification.tsx +1 -1
  169. package/components/elements/display/HandlebarsMarkdown.tsx +2 -2
  170. package/components/elements/display/HowlerAvatar.tsx +3 -3
  171. package/components/elements/display/HowlerAvatarHeader.tsx +1 -1
  172. package/components/elements/display/ItemManager.tsx +7 -7
  173. package/components/elements/display/Markdown.tsx +1 -1
  174. package/components/elements/display/Modal.tsx +1 -1
  175. package/components/elements/display/UserPageWrapper.tsx +2 -2
  176. package/components/elements/display/features/DevelopmentBanner.tsx +2 -2
  177. package/components/elements/display/features/DevelopmentIcon.tsx +2 -2
  178. package/components/elements/display/handlebars/helpers.tsx +4 -4
  179. package/components/elements/display/icons/BundleButton.tsx +1 -1
  180. package/components/elements/display/icons/SocketBadge.tsx +2 -2
  181. package/components/elements/display/json/JSONViewer.tsx +7 -7
  182. package/components/elements/display/modals/ConfirmDeleteModal.tsx +1 -1
  183. package/components/elements/display/modals/ConfirmNotebookModal.tsx +1 -1
  184. package/components/elements/display/modals/CreateActionModal.tsx +3 -3
  185. package/components/elements/display/modals/RationaleModal.tsx +2 -2
  186. package/components/elements/hit/HitActions.tsx +13 -13
  187. package/components/elements/hit/HitBanner.tsx +6 -6
  188. package/components/elements/hit/HitBannerTooltip.tsx +1 -1
  189. package/components/elements/hit/HitCard.tsx +1 -1
  190. package/components/elements/hit/HitComments.tsx +11 -11
  191. package/components/elements/hit/HitDetails.tsx +2 -2
  192. package/components/elements/hit/HitLabels.tsx +6 -6
  193. package/components/elements/hit/HitNotebooks.tsx +8 -8
  194. package/components/elements/hit/HitOutline.tsx +4 -4
  195. package/components/elements/hit/HitOverview.tsx +4 -4
  196. package/components/elements/hit/HitQuickSearch.tsx +4 -4
  197. package/components/elements/hit/HitRelated.tsx +1 -1
  198. package/components/elements/hit/HitSummary.tsx +13 -13
  199. package/components/elements/hit/HitWorklog.tsx +7 -7
  200. package/components/elements/hit/actions/DropdownActions.tsx +1 -1
  201. package/components/elements/hit/aggregate/HitGraph.tsx +8 -8
  202. package/components/elements/hit/elements/Assigned.tsx +4 -4
  203. package/components/elements/hit/elements/EscalationChip.tsx +2 -2
  204. package/components/elements/hit/elements/HitTimestamp.tsx +3 -3
  205. package/components/elements/hit/outlines/DefaultOutline.tsx +4 -4
  206. package/components/elements/hit/outlines/al/AssemblyLineRules.tsx +2 -2
  207. package/components/elements/hit/related/PivotLink.tsx +3 -3
  208. package/components/elements/hit/related/RelatedIcon.tsx +2 -2
  209. package/components/elements/hit/related/RelatedLink.tsx +1 -1
  210. package/components/elements/view/ViewTitle.tsx +1 -1
  211. package/components/hooks/useHitActions.tsx +12 -12
  212. package/components/hooks/useHitSelection.tsx +7 -7
  213. package/components/hooks/useMyApi.tsx +2 -2
  214. package/components/hooks/useMyLocalStorage.ts +5 -5
  215. package/components/hooks/useMyPreferences.tsx +6 -6
  216. package/components/hooks/useMySearch.tsx +7 -7
  217. package/components/hooks/useMySitemap.tsx +2 -2
  218. package/components/hooks/useMyTheme.tsx +1 -1
  219. package/components/hooks/useMyUser.tsx +2 -2
  220. package/components/hooks/useMyUserFunctions.tsx +8 -8
  221. package/components/hooks/useMyUserList.tsx +1 -1
  222. package/components/hooks/useMyUtils.tsx +1 -1
  223. package/components/logins/Login.tsx +4 -4
  224. package/components/logins/auth/OAuthLogin.tsx +3 -3
  225. package/components/logins/hooks/useLogin.tsx +11 -11
  226. package/components/routes/404.tsx +1 -1
  227. package/components/routes/ErrorOccured.tsx +2 -2
  228. package/components/routes/Logout.tsx +3 -3
  229. package/components/routes/action/edit/ActionEditor.tsx +13 -13
  230. package/components/routes/action/shared/ActionReportDisplay.tsx +2 -2
  231. package/components/routes/action/shared/OperationEntry.tsx +4 -4
  232. package/components/routes/action/shared/OperationStep.tsx +8 -8
  233. package/components/routes/action/useMyActionFunctions.tsx +9 -9
  234. package/components/routes/action/view/ActionDetails.tsx +12 -12
  235. package/components/routes/action/view/ActionSearch.tsx +14 -14
  236. package/components/routes/action/view/Integrations.tsx +2 -2
  237. package/components/routes/admin/users/UserEditor.tsx +8 -8
  238. package/components/routes/admin/users/UserSearch.tsx +19 -19
  239. package/components/routes/advanced/QueryBuilder.tsx +14 -14
  240. package/components/routes/advanced/QueryEditor.tsx +3 -3
  241. package/components/routes/advanced/RuleModal.tsx +10 -10
  242. package/components/routes/advanced/eqlCompletionProvider.ts +1 -1
  243. package/components/routes/advanced/historyCompletionProvider.ts +2 -2
  244. package/components/routes/advanced/luceneCompletionProvider.ts +3 -3
  245. package/components/routes/advanced/yamlCompletionProvider.ts +1 -1
  246. package/components/routes/analytics/AnalyticComments.tsx +9 -9
  247. package/components/routes/analytics/AnalyticDetails.tsx +12 -12
  248. package/components/routes/analytics/AnalyticHitComments.tsx +8 -8
  249. package/components/routes/analytics/AnalyticNotebooks.tsx +9 -9
  250. package/components/routes/analytics/AnalyticOverview.tsx +6 -6
  251. package/components/routes/analytics/AnalyticOverviews.tsx +3 -3
  252. package/components/routes/analytics/AnalyticSearch.tsx +15 -15
  253. package/components/routes/analytics/AnalyticTemplates.tsx +5 -5
  254. package/components/routes/analytics/RuleView.tsx +4 -4
  255. package/components/routes/analytics/TriageSettings.tsx +6 -6
  256. package/components/routes/analytics/widgets/Assessment.tsx +5 -5
  257. package/components/routes/analytics/widgets/Created.tsx +4 -4
  258. package/components/routes/analytics/widgets/Detection.tsx +2 -2
  259. package/components/routes/analytics/widgets/Escalation.tsx +5 -5
  260. package/components/routes/analytics/widgets/Stacked.tsx +3 -3
  261. package/components/routes/analytics/widgets/Status.tsx +2 -2
  262. package/components/routes/dossiers/DossierCard.tsx +3 -3
  263. package/components/routes/dossiers/DossierEditor.tsx +5 -5
  264. package/components/routes/dossiers/Dossiers.tsx +10 -10
  265. package/components/routes/dossiers/LeadEditor.tsx +3 -3
  266. package/components/routes/dossiers/LeadForm.tsx +1 -1
  267. package/components/routes/dossiers/PivotForm.tsx +4 -4
  268. package/components/routes/help/ActionDocumentation.tsx +3 -3
  269. package/components/routes/help/ActionIntroductionDocumentation.tsx +7 -7
  270. package/components/routes/help/ApiDocumentation.tsx +8 -8
  271. package/components/routes/help/AuthDocumentation.tsx +3 -3
  272. package/components/routes/help/BundleDocumentation.tsx +1 -1
  273. package/components/routes/help/ClientDocumentation.tsx +3 -3
  274. package/components/routes/help/Help.tsx +5 -5
  275. package/components/routes/help/HitBannerDocumentation.tsx +5 -5
  276. package/components/routes/help/HitDocumentation.tsx +2 -2
  277. package/components/routes/help/HitLabelsDocumentation.tsx +1 -1
  278. package/components/routes/help/HitLinksDocumentation.tsx +2 -2
  279. package/components/routes/help/HitSchemaDocumentation.tsx +3 -3
  280. package/components/routes/help/NotebookDocumentation.tsx +3 -3
  281. package/components/routes/help/OverviewDocumentation.tsx +3 -3
  282. package/components/routes/help/RetentionDocumentation.tsx +7 -7
  283. package/components/routes/help/SearchDocumentation.tsx +6 -6
  284. package/components/routes/help/TemplateDocumentation.tsx +5 -5
  285. package/components/routes/help/ViewDocumentation.tsx +3 -3
  286. package/components/routes/hits/search/BundleParentMenu.tsx +5 -5
  287. package/components/routes/hits/search/BundleScroller.tsx +1 -1
  288. package/components/routes/hits/search/CustomSort.tsx +2 -2
  289. package/components/routes/hits/search/HitBrowser.tsx +10 -10
  290. package/components/routes/hits/search/HitContextMenu.tsx +11 -11
  291. package/components/routes/hits/search/HitQuery.tsx +5 -5
  292. package/components/routes/hits/search/InformationPane.tsx +35 -35
  293. package/components/routes/hits/search/SearchPane.tsx +21 -21
  294. package/components/routes/hits/search/ViewLink.tsx +3 -3
  295. package/components/routes/hits/search/grid/AddColumnModal.tsx +3 -3
  296. package/components/routes/hits/search/grid/ColumnHeader.tsx +2 -2
  297. package/components/routes/hits/search/grid/EnhancedCell.tsx +1 -1
  298. package/components/routes/hits/search/grid/HitGrid.tsx +12 -12
  299. package/components/routes/hits/search/grid/HitRow.tsx +7 -7
  300. package/components/routes/hits/search/shared/CustomSpan.tsx +1 -1
  301. package/components/routes/hits/search/shared/HitFilter.tsx +4 -4
  302. package/components/routes/hits/search/shared/HitSort.tsx +2 -2
  303. package/components/routes/hits/search/shared/QuerySettings.tsx +2 -2
  304. package/components/routes/hits/search/shared/SearchSpan.tsx +3 -3
  305. package/components/routes/hits/view/HitViewer.tsx +28 -28
  306. package/components/routes/hits/view/LeadRenderer.tsx +3 -3
  307. package/components/routes/home/AddNewCard.tsx +5 -5
  308. package/components/routes/home/AnalyticCard.tsx +3 -3
  309. package/components/routes/home/ViewCard.tsx +7 -7
  310. package/components/routes/home/index.tsx +9 -9
  311. package/components/routes/overviews/OverviewCard.tsx +3 -3
  312. package/components/routes/overviews/OverviewEditor.tsx +2 -2
  313. package/components/routes/overviews/OverviewViewer.tsx +13 -13
  314. package/components/routes/overviews/Overviews.tsx +10 -10
  315. package/components/routes/overviews/startingTemplate.ts +1 -1
  316. package/components/routes/settings/AdminSection.tsx +1 -1
  317. package/components/routes/settings/LocalSection.tsx +4 -4
  318. package/components/routes/settings/ProfileSection.tsx +4 -4
  319. package/components/routes/settings/SecuritySection.tsx +5 -5
  320. package/components/routes/settings/Settings.tsx +6 -6
  321. package/components/routes/templates/TemplateCard.tsx +1 -1
  322. package/components/routes/templates/TemplateEditor.tsx +4 -4
  323. package/components/routes/templates/TemplateViewer.tsx +10 -10
  324. package/components/routes/templates/Templates.tsx +11 -11
  325. package/components/routes/views/ViewComposer.tsx +21 -21
  326. package/components/routes/views/Views.tsx +16 -16
  327. package/index.tsx +3 -3
  328. package/models/entities/HowlerUser.d.ts +1 -1
  329. package/models/socket/HitUpdate.d.ts +1 -1
  330. package/package.json +577 -604
  331. package/plugins/HowlerPlugin.ts +12 -12
  332. package/plugins/store.ts +1 -1
  333. package/rest/AxiosClient.ts +3 -3
  334. package/rest/FetchClient.ts +2 -2
  335. package/rest/index.ts +1 -1
  336. package/utils/actionUtils.ts +2 -2
  337. package/utils/hitFunctions.ts +1 -1
  338. package/utils/localStorage.ts +1 -1
  339. package/utils/sessionStorage.ts +1 -1
  340. package/utils/socketUtils.ts +2 -2
  341. package/components/app/hooks/useMatchers.test.ts +0 -328
  342. package/components/app/providers/ViewProvider.test.tsx +0 -244
  343. package/tests/MockLocalStorage.ts +0 -46
  344. package/tests/server-handlers.ts +0 -114
  345. package/tests/server.ts +0 -6
@@ -1,17 +1,17 @@
1
- import type { HowlerHelper } from 'components/elements/display/handlebars/helpers';
2
- import type { ActionButton } from 'components/elements/hit/actions/SharedComponents';
3
- import type { StatusProps } from 'components/elements/hit/HitBanner';
4
- import type { PivotLinkProps } from 'components/elements/hit/related/PivotLink';
5
- import type { PluginChipProps } from 'components/elements/PluginChip';
6
- import type { PluginTypographyProps } from 'components/elements/PluginTypography';
7
- import type { CustomActionProps } from 'components/routes/action/edit/ActionEditor';
8
- import type { LeadFormProps } from 'components/routes/dossiers/LeadEditor';
9
- import type { PivotFormProps } from 'components/routes/dossiers/PivotForm';
10
- import type { PluginDocumentation } from 'components/routes/help/ActionDocumentation';
11
- import i18nInstance from 'i18n';
1
+ import type { HowlerHelper } from '@cccsaurora/howler-ui/components/elements/display/handlebars/helpers';
2
+ import type { ActionButton } from '@cccsaurora/howler-ui/components/elements/hit/actions/SharedComponents';
3
+ import type { StatusProps } from '@cccsaurora/howler-ui/components/elements/hit/HitBanner';
4
+ import type { PivotLinkProps } from '@cccsaurora/howler-ui/components/elements/hit/related/PivotLink';
5
+ import type { PluginChipProps } from '@cccsaurora/howler-ui/components/elements/PluginChip';
6
+ import type { PluginTypographyProps } from '@cccsaurora/howler-ui/components/elements/PluginTypography';
7
+ import type { CustomActionProps } from '@cccsaurora/howler-ui/components/routes/action/edit/ActionEditor';
8
+ import type { LeadFormProps } from '@cccsaurora/howler-ui/components/routes/dossiers/LeadEditor';
9
+ import type { PivotFormProps } from '@cccsaurora/howler-ui/components/routes/dossiers/PivotForm';
10
+ import type { PluginDocumentation } from '@cccsaurora/howler-ui/components/routes/help/ActionDocumentation';
11
+ import i18nInstance from '@cccsaurora/howler-ui/i18n';
12
12
  import type { i18n as I18N } from 'i18next';
13
13
  import { difference } from 'lodash-es';
14
- import type { Hit } from 'models/entities/generated/Hit';
14
+ import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
15
15
  import type React from 'react';
16
16
  import type { PropsWithChildren } from 'react';
17
17
  import type { IPlugin, PluginStore } from 'react-pluggable';
package/plugins/store.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable no-console */
2
- import type { Hit } from 'models/entities/generated/Hit';
2
+ import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
3
3
  import { createPluginStore, Event } from 'react-pluggable';
4
4
  import type HowlerPlugin from './HowlerPlugin';
5
5
  import type { AppLeftNavElement } from '../commons/components/app/AppConfigs';
@@ -1,9 +1,9 @@
1
- import type { HowlerResponse } from 'api';
1
+ import type { HowlerResponse } from '@cccsaurora/howler-ui/api';
2
2
  import type { AxiosInstance, AxiosRequestConfig, AxiosRequestHeaders } from 'axios';
3
3
  import axios, { AxiosError } from 'axios';
4
4
  import axiosRetry, { exponentialDelay, isNetworkError } from 'axios-retry';
5
- import type RestClient from 'rest';
6
- import { getAxiosCache, setAxiosCache } from 'utils/sessionStorage';
5
+ import type RestClient from '@cccsaurora/howler-ui/rest';
6
+ import { getAxiosCache, setAxiosCache } from '@cccsaurora/howler-ui/utils/sessionStorage';
7
7
 
8
8
  class AxiosCache {
9
9
  constructor(_axios: AxiosInstance) {
@@ -1,5 +1,5 @@
1
- import type { HowlerResponse } from 'api';
2
- import type RestClient from 'rest';
1
+ import type { HowlerResponse } from '@cccsaurora/howler-ui/api';
2
+ import type RestClient from '@cccsaurora/howler-ui/rest';
3
3
 
4
4
  export default class FetchClient implements RestClient {
5
5
  public async fetch<R>(
package/rest/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { HowlerResponse } from 'api';
1
+ import type { HowlerResponse } from '@cccsaurora/howler-ui/api';
2
2
 
3
3
  export default interface RestClient {
4
4
  fetch<R>(
@@ -1,5 +1,5 @@
1
- import type { ActionOperation, ActionOperationStep } from 'models/ActionTypes';
2
- import type { Operation } from 'models/entities/generated/Operation';
1
+ import type { ActionOperation, ActionOperationStep } from '@cccsaurora/howler-ui/models/ActionTypes';
2
+ import type { Operation } from '@cccsaurora/howler-ui/models/entities/generated/Operation';
3
3
 
4
4
  /**
5
5
  * A simple validation function to ensure we have all the necessary arguments filled out.
@@ -1,4 +1,4 @@
1
- import type { Hit } from 'models/entities/generated/Hit';
1
+ import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
2
2
 
3
3
  export const getUserList = (hit: Hit): Set<string> => {
4
4
  const ids = new Set<string>();
@@ -1,4 +1,4 @@
1
- import type { LoginResponse } from 'api/auth/login';
1
+ import type { LoginResponse } from '@cccsaurora/howler-ui/api/auth/login';
2
2
  import { MY_LOCAL_STORAGE_PREFIX, StorageKey } from './constants';
3
3
 
4
4
  const buildName = (name: string) => `${MY_LOCAL_STORAGE_PREFIX}.${name}`;
@@ -1,4 +1,4 @@
1
- import Throttler from 'utils/Throttler';
1
+ import Throttler from '@cccsaurora/howler-ui/utils/Throttler';
2
2
  import { MY_SESSION_STORAGE_PREFIX, StorageKey } from './constants';
3
3
 
4
4
  const buildName = (name: string) => `${MY_SESSION_STORAGE_PREFIX}.${name}`;
@@ -1,5 +1,5 @@
1
- import type { RecievedDataType } from 'components/app/providers/SocketProvider';
2
- import type { HitUpdate } from 'models/socket/HitUpdate';
1
+ import type { RecievedDataType } from '@cccsaurora/howler-ui/components/app/providers/SocketProvider';
2
+ import type { HitUpdate } from '@cccsaurora/howler-ui/models/socket/HitUpdate';
3
3
 
4
4
  /**
5
5
  * Checks to see if the data recieved from the socket is a hit update
@@ -1,328 +0,0 @@
1
- import { renderHook } from '@testing-library/react';
2
- import type { Dossier } from 'models/entities/generated/Dossier';
3
- import type { Hit } from 'models/entities/generated/Hit';
4
- import type { Overview } from 'models/entities/generated/Overview';
5
- import type { Template } from 'models/entities/generated/Template';
6
- import type { WithMetadata } from 'models/WithMetadata';
7
- import { useContextSelector } from 'use-context-selector';
8
- import { beforeEach, describe, expect, it, vi } from 'vitest';
9
- import { HitContext } from '../providers/HitProvider';
10
- import useMatchers from './useMatchers';
11
-
12
- // Mock the useContextSelector hook
13
- vi.mock('use-context-selector', () => ({
14
- useContextSelector: vi.fn(),
15
- createContext: vi.fn()
16
- }));
17
-
18
- // Mock lodash-es has function
19
- vi.mock('lodash-es', () => ({
20
- has: vi.fn()
21
- }));
22
-
23
- // Create mock data
24
- const mockTemplate: Template = {
25
- name: 'test-template',
26
- template: 'Test template content'
27
- } as Template;
28
-
29
- const mockOverview: Overview = {
30
- name: 'test-overview',
31
- overview: 'Test overview content'
32
- } as Overview;
33
-
34
- const mockDossiers: Dossier[] = [
35
- {
36
- name: 'test-dossier',
37
- description: 'Test dossier content'
38
- } as Dossier
39
- ];
40
-
41
- const mockHit: Hit = {
42
- howler: {
43
- id: 'test-hit-id',
44
- analytic: 'test-analytic',
45
- data: {}
46
- }
47
- } as Hit;
48
-
49
- const mockHitWithMetadata: WithMetadata<Hit> = {
50
- ...mockHit,
51
- __template: mockTemplate,
52
- __overview: mockOverview,
53
- __dossiers: mockDossiers
54
- };
55
-
56
- const mockGetHit = vi.fn();
57
-
58
- describe('useMatchers', () => {
59
- beforeEach(() => {
60
- vi.clearAllMocks();
61
-
62
- // Mock useContextSelector to return our mock getHit function
63
- (useContextSelector as any).mockImplementation((context: any, selector: any) => {
64
- if (context === HitContext) {
65
- return selector({ getHit: mockGetHit });
66
- }
67
- return null;
68
- });
69
- });
70
-
71
- describe('getMatchingTemplate', () => {
72
- it('should return null when hit is null', async () => {
73
- const { result } = renderHook(() => useMatchers());
74
-
75
- const template = await result.current.getMatchingTemplate(null);
76
-
77
- expect(template).toBeNull();
78
- });
79
-
80
- it('should return null when hit is undefined', async () => {
81
- const { result } = renderHook(() => useMatchers());
82
-
83
- const template = await result.current.getMatchingTemplate(undefined);
84
-
85
- expect(template).toBeNull();
86
- });
87
-
88
- it('should return template from metadata when it exists', async () => {
89
- const { has } = await import('lodash-es');
90
- (has as any).mockReturnValue(true);
91
-
92
- const { result } = renderHook(() => useMatchers());
93
-
94
- const template = await result.current.getMatchingTemplate(mockHitWithMetadata);
95
-
96
- expect(template).toBe(mockTemplate);
97
- expect(mockGetHit).not.toHaveBeenCalled();
98
- });
99
-
100
- it('should fetch hit with metadata when template is not present', async () => {
101
- const { has } = await import('lodash-es');
102
- (has as any).mockReturnValue(false);
103
-
104
- const hitWithFetchedMetadata = { ...mockHit, __template: mockTemplate };
105
- mockGetHit.mockResolvedValue(hitWithFetchedMetadata);
106
-
107
- const { result } = renderHook(() => useMatchers());
108
-
109
- const template = await result.current.getMatchingTemplate(mockHit);
110
-
111
- expect(template).toBe(mockTemplate);
112
- expect(mockGetHit).toHaveBeenCalledWith('test-hit-id', true);
113
- });
114
-
115
- it('should handle getHit rejection gracefully', async () => {
116
- const { has } = await import('lodash-es');
117
- (has as any).mockReturnValue(false);
118
-
119
- mockGetHit.mockRejectedValue(new Error('Failed to fetch hit'));
120
-
121
- const { result } = renderHook(() => useMatchers());
122
-
123
- await expect(result.current.getMatchingTemplate(mockHit)).resolves.toBeNull();
124
- expect(mockGetHit).toHaveBeenCalledWith('test-hit-id', true);
125
- });
126
- });
127
-
128
- describe('getMatchingOverview', () => {
129
- it('should return null when hit is null', async () => {
130
- const { result } = renderHook(() => useMatchers());
131
-
132
- const overview = await result.current.getMatchingOverview(null);
133
-
134
- expect(overview).toBeNull();
135
- });
136
-
137
- it('should return null when hit is undefined', async () => {
138
- const { result } = renderHook(() => useMatchers());
139
-
140
- const overview = await result.current.getMatchingOverview(undefined);
141
-
142
- expect(overview).toBeNull();
143
- });
144
-
145
- it('should return overview from metadata when it exists', async () => {
146
- const { has } = await import('lodash-es');
147
- (has as any).mockReturnValue(true);
148
-
149
- const { result } = renderHook(() => useMatchers());
150
-
151
- const overview = await result.current.getMatchingOverview(mockHitWithMetadata);
152
-
153
- expect(overview).toBe(mockOverview);
154
- expect(mockGetHit).not.toHaveBeenCalled();
155
- });
156
-
157
- it('should fetch hit with metadata when overview is not present', async () => {
158
- const { has } = await import('lodash-es');
159
- (has as any).mockReturnValue(false);
160
-
161
- const hitWithFetchedMetadata = { ...mockHit, __overview: mockOverview };
162
- mockGetHit.mockResolvedValue(hitWithFetchedMetadata);
163
-
164
- const { result } = renderHook(() => useMatchers());
165
-
166
- const overview = await result.current.getMatchingOverview(mockHit);
167
-
168
- expect(overview).toBe(mockOverview);
169
- expect(mockGetHit).toHaveBeenCalledWith('test-hit-id', true);
170
- });
171
-
172
- it('should handle getHit rejection gracefully', async () => {
173
- const { has } = await import('lodash-es');
174
- (has as any).mockReturnValue(false);
175
-
176
- mockGetHit.mockRejectedValue(new Error('Failed to fetch hit'));
177
-
178
- const { result } = renderHook(() => useMatchers());
179
-
180
- await expect(result.current.getMatchingOverview(mockHit)).resolves.toBeNull();
181
- expect(mockGetHit).toHaveBeenCalledWith('test-hit-id', true);
182
- });
183
- });
184
-
185
- describe('getMatchingDossiers', () => {
186
- it('should return null when hit is null', async () => {
187
- const { result } = renderHook(() => useMatchers());
188
-
189
- const dossiers = await result.current.getMatchingDossiers(null);
190
-
191
- expect(dossiers).toBeNull();
192
- });
193
-
194
- it('should return null when hit is undefined', async () => {
195
- const { result } = renderHook(() => useMatchers());
196
-
197
- const dossiers = await result.current.getMatchingDossiers(undefined);
198
-
199
- expect(dossiers).toBeNull();
200
- });
201
-
202
- it('should return dossiers from metadata when they exist', async () => {
203
- const { has } = await import('lodash-es');
204
- (has as any).mockReturnValue(true);
205
-
206
- const { result } = renderHook(() => useMatchers());
207
-
208
- const dossiers = await result.current.getMatchingDossiers(mockHitWithMetadata);
209
-
210
- expect(dossiers).toBe(mockDossiers);
211
- expect(mockGetHit).not.toHaveBeenCalled();
212
- });
213
-
214
- it('should fetch hit with metadata when dossiers are not present', async () => {
215
- const { has } = await import('lodash-es');
216
- (has as any).mockReturnValue(false);
217
-
218
- const hitWithFetchedMetadata = { ...mockHit, __dossiers: mockDossiers };
219
- mockGetHit.mockResolvedValue(hitWithFetchedMetadata);
220
-
221
- const { result } = renderHook(() => useMatchers());
222
-
223
- const dossiers = await result.current.getMatchingDossiers(mockHit);
224
-
225
- expect(dossiers).toBe(mockDossiers);
226
- expect(mockGetHit).toHaveBeenCalledWith('test-hit-id', true);
227
- });
228
-
229
- it('should handle getHit rejection gracefully', async () => {
230
- const { has } = await import('lodash-es');
231
- (has as any).mockReturnValue(false);
232
-
233
- mockGetHit.mockRejectedValue(new Error('Failed to fetch hit'));
234
-
235
- const { result } = renderHook(() => useMatchers());
236
-
237
- await expect(result.current.getMatchingDossiers(mockHit)).resolves.toEqual([]);
238
- expect(mockGetHit).toHaveBeenCalledWith('test-hit-id', true);
239
- });
240
- });
241
-
242
- describe('integration tests', () => {
243
- it('should correctly handle has function calls for different metadata properties', async () => {
244
- const { has } = await import('lodash-es');
245
-
246
- // Mock has to return true for __template, false for others
247
- (has as any).mockImplementation((_obj: any, prop: string) => {
248
- return prop === '__template';
249
- });
250
-
251
- const hitWithPartialMetadata = {
252
- ...mockHit,
253
- __template: mockTemplate
254
- };
255
-
256
- mockGetHit.mockResolvedValue({
257
- ...mockHit,
258
- __overview: mockOverview,
259
- __dossiers: mockDossiers
260
- });
261
-
262
- const { result } = renderHook(() => useMatchers());
263
-
264
- // Should return template from metadata
265
- const template = await result.current.getMatchingTemplate(hitWithPartialMetadata);
266
- expect(template).toBe(mockTemplate);
267
-
268
- // Should fetch overview
269
- const overview = await result.current.getMatchingOverview(hitWithPartialMetadata);
270
- expect(overview).toBe(mockOverview);
271
-
272
- // Should fetch dossiers
273
- const dossiers = await result.current.getMatchingDossiers(hitWithPartialMetadata);
274
- expect(dossiers).toBe(mockDossiers);
275
-
276
- // Verify has was called with correct parameters
277
- expect(has).toHaveBeenCalledWith(hitWithPartialMetadata, '__template');
278
- expect(has).toHaveBeenCalledWith(hitWithPartialMetadata, '__overview');
279
- expect(has).toHaveBeenCalledWith(hitWithPartialMetadata, '__dossiers');
280
- });
281
-
282
- it('should handle empty or undefined metadata gracefully', async () => {
283
- const { has } = await import('lodash-es');
284
- (has as any).mockReturnValue(false);
285
-
286
- mockGetHit.mockResolvedValue({
287
- ...mockHit,
288
- __template: undefined,
289
- __overview: null,
290
- __dossiers: []
291
- });
292
-
293
- const { result } = renderHook(() => useMatchers());
294
-
295
- const template = await result.current.getMatchingTemplate(mockHit);
296
- const overview = await result.current.getMatchingOverview(mockHit);
297
- const dossiers = await result.current.getMatchingDossiers(mockHit);
298
-
299
- expect(template).toBeUndefined();
300
- expect(overview).toBeNull();
301
- expect(dossiers).toEqual([]);
302
- expect(mockGetHit).toHaveBeenCalledTimes(3);
303
- });
304
-
305
- it('should maintain referential equality of returned functions', () => {
306
- const { result, rerender } = renderHook(() => useMatchers());
307
-
308
- const firstRender = {
309
- getMatchingTemplate: result.current.getMatchingTemplate,
310
- getMatchingOverview: result.current.getMatchingOverview,
311
- getMatchingDossiers: result.current.getMatchingDossiers
312
- };
313
-
314
- rerender();
315
-
316
- const secondRender = {
317
- getMatchingTemplate: result.current.getMatchingTemplate,
318
- getMatchingOverview: result.current.getMatchingOverview,
319
- getMatchingDossiers: result.current.getMatchingDossiers
320
- };
321
-
322
- // Functions should be the same reference due to useCallback
323
- expect(firstRender.getMatchingTemplate).toBe(secondRender.getMatchingTemplate);
324
- expect(firstRender.getMatchingOverview).toBe(secondRender.getMatchingOverview);
325
- expect(firstRender.getMatchingDossiers).toBe(secondRender.getMatchingDossiers);
326
- });
327
- });
328
- });
@@ -1,244 +0,0 @@
1
- import type { RenderHookResult } from '@testing-library/react';
2
- import { act, renderHook, waitFor } from '@testing-library/react';
3
- import { hget, hpost, hput } from 'api';
4
- import MockLocalStorage from 'tests/MockLocalStorage';
5
- import { MOCK_RESPONSES } from 'tests/server-handlers';
6
- import { useContextSelector } from 'use-context-selector';
7
- import { MY_LOCAL_STORAGE_PREFIX, StorageKey } from 'utils/constants';
8
- import ViewProvider, { ViewContext, type ViewContextType } from './ViewProvider';
9
-
10
- let mockUser = {
11
- favourite_views: ['favourited_view_id']
12
- };
13
-
14
- vi.mock('api', { spy: true });
15
- vi.mock('react-router-dom', () => ({
16
- useLocation: vi.fn(() => ({ pathname: '/views/searched_view_id' })),
17
- useParams: vi.fn(() => ({ id: 'searched_view_id' }))
18
- }));
19
- vi.mock('commons/components/app/hooks', () => ({
20
- useAppUser: () => ({
21
- user: mockUser,
22
- setUser: _user => (mockUser = _user)
23
- })
24
- }));
25
-
26
- const mockLocalStorage: Storage = new MockLocalStorage() as any;
27
-
28
- // Replace localStorage in global scope
29
- Object.defineProperty(window, 'localStorage', {
30
- value: mockLocalStorage,
31
- writable: true
32
- });
33
-
34
- const Wrapper = ({ children }) => {
35
- return <ViewProvider>{children}</ViewProvider>;
36
- };
37
-
38
- beforeEach(() => {
39
- mockLocalStorage.clear();
40
- });
41
-
42
- describe('ViewContext', () => {
43
- it('should fetch the defaultView on initialization', async () => {
44
- mockLocalStorage.setItem(
45
- `${MY_LOCAL_STORAGE_PREFIX}.${StorageKey.DEFAULT_VIEW}`,
46
- JSON.stringify('searched_view_id')
47
- );
48
-
49
- let hook = await act(async () =>
50
- renderHook(() => useContextSelector(ViewContext, ctx => ctx.views), { wrapper: Wrapper })
51
- );
52
-
53
- await waitFor(() => expect(hook.result.current.searched_view_id).not.toBeFalsy());
54
-
55
- expect(hook.result.current.searched_view_id).toEqual(MOCK_RESPONSES['/api/v1/search/view'].items[0]);
56
- });
57
-
58
- it('should allow the user to add and remove a favourite view', async () => {
59
- interface HookResult {
60
- addFavourite: ViewContextType['addFavourite'];
61
- removeFavourite: ViewContextType['removeFavourite'];
62
- }
63
-
64
- const hook: RenderHookResult<HookResult, any> = await act(async () => {
65
- return renderHook(
66
- () =>
67
- useContextSelector(ViewContext, ctx => ({
68
- addFavourite: ctx.addFavourite,
69
- removeFavourite: ctx.removeFavourite
70
- })),
71
- { wrapper: Wrapper }
72
- );
73
- });
74
-
75
- await hook.result.current.addFavourite('example_view_id');
76
-
77
- expect(mockUser.favourite_views).toEqual(['favourited_view_id', 'example_view_id']);
78
-
79
- await hook.result.current.removeFavourite('example_view_id');
80
-
81
- expect(mockUser.favourite_views).toEqual(['favourited_view_id']);
82
- });
83
-
84
- it('should allow the user to add and remove views', async () => {
85
- interface HookResult {
86
- addView: ViewContextType['addView'];
87
- removeView: ViewContextType['removeView'];
88
- views: ViewContextType['views'];
89
- }
90
-
91
- const hook: RenderHookResult<HookResult, any> = await act(async () => {
92
- return renderHook(
93
- () =>
94
- useContextSelector(ViewContext, ctx => ({
95
- addView: ctx.addView,
96
- removeView: ctx.removeView,
97
- views: ctx.views
98
- })),
99
- { wrapper: Wrapper }
100
- );
101
- });
102
-
103
- const result = await act(async () =>
104
- hook.result.current.addView({
105
- owner: 'user',
106
- settings: {
107
- advance_on_triage: false
108
- },
109
- view_id: 'example_created_view',
110
- query: 'howler.id:*',
111
- sort: 'event.created desc',
112
- title: 'Example View',
113
- type: 'personal',
114
- span: 'date.range.1.month'
115
- })
116
- );
117
-
118
- hook.rerender();
119
-
120
- expect(hook.result.current.views[result.view_id]).toEqual(result);
121
-
122
- await act(async () => hook.result.current.removeView(result.view_id));
123
-
124
- hook.rerender();
125
-
126
- expect(hook.result.current.views[result.view_id]).toBeFalsy();
127
- });
128
-
129
- describe('fetchViews', () => {
130
- let hook: RenderHookResult<ViewContextType['fetchViews'], any>;
131
- beforeEach(async () => {
132
- hook = await act(async () => {
133
- return renderHook(() => useContextSelector(ViewContext, ctx => ctx.fetchViews), { wrapper: Wrapper });
134
- });
135
-
136
- vi.mocked(hpost).mockClear();
137
- vi.mocked(hget).mockClear();
138
- });
139
-
140
- it('Should fetch all views when no ids are provided', async () => {
141
- const result = await act(async () => hook.result.current());
142
-
143
- expect(result.length).toBe(2);
144
- expect(result[0].view_id).toBe('example_view_id');
145
- expect(result[1].view_id).toBe('another_view_id');
146
- });
147
-
148
- it('Should search for specified views when ids are provided', async () => {
149
- const result = await act(async () => hook.result.current(['searched_view_id']));
150
-
151
- expect(hpost).toHaveBeenCalledOnce();
152
- expect(hpost).toBeCalledWith('/api/v1/search/view', {
153
- query: 'view_id:(searched_view_id)',
154
- rows: 1,
155
- sort: 'title asc'
156
- });
157
-
158
- expect(result).toEqual(MOCK_RESPONSES['/api/v1/search/view'].items);
159
- });
160
-
161
- it('Should search only for new views when ids are provided', async () => {
162
- await act(async () => hook.result.current(['searched_view_id']));
163
-
164
- expect(hpost).toHaveBeenCalledOnce();
165
- expect(hpost).toBeCalledWith('/api/v1/search/view', {
166
- query: 'view_id:(searched_view_id)',
167
- rows: 1,
168
- sort: 'title asc'
169
- });
170
-
171
- vi.mocked(hpost).mockClear();
172
- await act(async () => hook.result.current(['searched_view_id', 'searched_view_id_2']));
173
-
174
- expect(hpost).toHaveBeenCalledOnce();
175
- expect(hpost).toBeCalledWith('/api/v1/search/view', {
176
- query: 'view_id:(searched_view_id_2)',
177
- rows: 1,
178
- sort: 'title asc'
179
- });
180
- });
181
-
182
- it('Should provide cached instances as a response when the same views are requested', async () => {
183
- let result = await act(async () => hook.result.current(['searched_view_id']));
184
-
185
- expect(result).toEqual(MOCK_RESPONSES['/api/v1/search/view'].items);
186
-
187
- result = await act(async () => hook.result.current(['searched_view_id']));
188
-
189
- expect(result).toEqual(MOCK_RESPONSES['/api/v1/search/view'].items);
190
-
191
- expect(hpost).toHaveBeenCalledOnce();
192
- });
193
- });
194
-
195
- describe('getCurrentView', () => {
196
- let hook: RenderHookResult<ViewContextType['getCurrentView'], any>;
197
- beforeEach(async () => {
198
- hook = await act(async () => {
199
- return renderHook(() => useContextSelector(ViewContext, ctx => ctx.getCurrentView), { wrapper: Wrapper });
200
- });
201
- });
202
-
203
- it('should allow the user to fetch their current view based on the location', async () => {
204
- // lazy load should return nothing
205
- await expect(hook.result.current({ lazy: true })).resolves.toBeFalsy();
206
-
207
- const result = await act(async () => hook.result.current());
208
-
209
- expect(result).toEqual(MOCK_RESPONSES['/api/v1/search/view'].items[0]);
210
- });
211
-
212
- it('should allow the user to fetch their current view based on the view ID', async () => {
213
- // lazy load should return nothing
214
- await expect(hook.result.current({ lazy: true })).resolves.toBeFalsy();
215
-
216
- const result = await act(async () => hook.result.current({ viewId: 'searched_view_id' }));
217
-
218
- expect(result).toEqual(MOCK_RESPONSES['/api/v1/search/view'].items[0]);
219
- });
220
- });
221
-
222
- describe('editView', () => {
223
- let hook: RenderHookResult<ViewContextType['editView'], any>;
224
- beforeAll(async () => {
225
- hook = await act(async () => {
226
- return renderHook(() => useContextSelector(ViewContext, ctx => ctx.editView), { wrapper: Wrapper });
227
- });
228
- });
229
-
230
- beforeEach(() => {
231
- vi.mocked(hput).mockClear();
232
- vi.mocked(hpost).mockClear();
233
- });
234
-
235
- it('should allow users to edit views', async () => {
236
- const result = await act(async () => hook.result.current('example_view_id', { query: 'howler.id:*' }));
237
-
238
- expect(hput).toHaveBeenCalledOnce();
239
- expect(hput).toBeCalledWith('/api/v1/view/example_view_id', { query: 'howler.id:*' });
240
-
241
- expect(result).toEqual(MOCK_RESPONSES['/api/v1/view/example_view_id']);
242
- });
243
- });
244
- });