@cccsaurora/howler-ui 3.1.0-dev.1493 → 3.1.0-dev.1602
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/action/execute.d.ts +1 -1
- package/api/action/index.d.ts +10 -6
- package/api/action/index.js +5 -9
- package/api/action/operations.js +2 -2
- package/api/analytic/comments/index.d.ts +4 -6
- package/api/analytic/comments/react.d.ts +2 -2
- package/api/analytic/favourite.d.ts +2 -4
- package/api/analytic/index.d.ts +7 -4
- package/api/analytic/index.js +2 -2
- package/api/analytic/notebooks/index.d.ts +2 -4
- package/api/analytic/owner.d.ts +1 -1
- package/api/auth/apikey.d.ts +2 -2
- package/api/auth/login.d.ts +2 -2
- package/api/configs/index.d.ts +1 -1
- package/api/dossier.d.ts +16 -0
- package/api/{dossier/index.js → dossier.js} +6 -4
- package/api/help.d.ts +2 -2
- package/api/hit/assign.d.ts +6 -2
- package/api/hit/comments/index.d.ts +4 -6
- package/api/hit/comments/react.d.ts +2 -2
- package/api/hit/index.d.ts +3 -8
- package/api/hit/labels.d.ts +2 -2
- package/api/hit/overwrite.d.ts +1 -1
- package/api/hit/transition.d.ts +1 -1
- package/api/index.d.ts +6 -6
- package/api/index.js +7 -6
- package/api/notebook/environments.d.ts +1 -1
- package/api/notebook/index.d.ts +1 -1
- package/api/overview/index.d.ts +4 -4
- package/api/search/action.d.ts +1 -1
- package/api/search/analytic.d.ts +1 -1
- package/api/search/case.d.ts +1 -1
- package/api/search/count/hit.d.ts +1 -1
- package/api/search/dossier.d.ts +1 -1
- package/api/search/eql/hit.d.ts +1 -1
- package/api/search/explain/hit.d.ts +1 -1
- package/api/search/facet/hit.d.ts +1 -1
- package/api/search/fields/hit.js +1 -2
- package/api/search/fields/user.js +2 -4
- package/api/search/grouped/hit.d.ts +1 -1
- package/api/search/grouped/user.js +3 -0
- package/api/search/histogram/hit.d.ts +1 -1
- package/api/search/hit.d.ts +1 -1
- package/api/search/overview.d.ts +1 -1
- package/api/search/sigma/hit.d.ts +1 -1
- package/api/search/template.d.ts +1 -1
- package/api/search/user.d.ts +30 -2
- package/api/search/user.js +3 -0
- package/api/search/view.d.ts +1 -1
- package/api/socket/viewers.d.ts +1 -1
- package/api/socket/viewers.js +1 -1
- package/api/template/index.d.ts +3 -3
- package/api/template/index.js +2 -2
- package/api/user/avatar/index.d.ts +1 -1
- package/api/user/groups.d.ts +1 -1
- package/api/user/index.d.ts +2 -2
- package/api/user/whoami.d.ts +1 -1
- package/api/utils/createPermissionsApi.d.ts +10 -0
- package/api/utils/createPermissionsApi.js +10 -0
- package/api/v2/case/index.d.ts +4 -4
- package/api/v2/case/items.d.ts +3 -3
- package/api/v2/case/rules.d.ts +3 -3
- package/api/v2/fuzzy.d.ts +1 -1
- package/api/v2/search/facet.d.ts +1 -1
- package/api/v2/search/index.d.ts +1 -1
- package/api/view/favourite.d.ts +2 -4
- package/api/view/index.d.ts +9 -5
- package/api/view/index.js +3 -1
- package/branding/AppBrand.d.ts +2 -2
- package/branding/AppBrand.js +4 -6
- package/components/app/App.js +248 -51
- package/components/app/AppContainer.js +1 -1
- package/components/app/drawers/ApiKeyDrawer.js +13 -5
- package/components/app/drawers/AssignUserDrawer.js +11 -4
- package/components/app/hooks/useMatchers.d.ts +3 -3
- package/components/app/hooks/useMatchers.js +12 -12
- package/components/app/hooks/useMatchers.test.js +15 -14
- package/components/app/hooks/useTitle.js +8 -7
- package/components/app/providers/AnalyticProvider.d.ts +1 -1
- package/components/app/providers/AnalyticProvider.js +7 -4
- package/components/app/providers/ApiConfigProvider.d.ts +2 -1
- package/components/app/providers/ApiConfigProvider.js +12 -10
- package/components/app/providers/AppDrawerProvider.js +2 -2
- package/components/app/providers/AvatarProvider.js +18 -11
- package/components/app/providers/FavouritesProvider.js +56 -86
- package/components/app/providers/FieldProvider.js +1 -1
- package/components/app/providers/GridColumnsProvider.d.ts +1 -1
- package/components/app/providers/GridColumnsProvider.js +17 -4
- package/components/app/providers/GridColumnsProvider.test.js +2 -1
- package/components/app/providers/LocalStorageProvider.d.ts +2 -2
- package/components/app/providers/LocalStorageProvider.js +4 -3
- package/components/app/providers/ModalProvider.js +8 -1
- package/components/app/providers/OverviewProvider.js +10 -2
- package/components/app/providers/ParameterProvider.d.ts +7 -7
- package/components/app/providers/ParameterProvider.js +42 -5
- package/components/app/providers/ParameterProvider.test.js +1 -0
- package/components/app/providers/RecordProvider.js +7 -1
- package/components/app/providers/RecordSearchProvider.d.ts +1 -2
- package/components/app/providers/RecordSearchProvider.js +32 -23
- package/components/app/providers/RecordSearchProvider.test.js +2 -1
- package/components/app/providers/SearchResponseProvider.d.ts +9 -6
- package/components/app/providers/SearchResponseProvider.js +37 -19
- package/components/app/providers/SearchResponseProvider.test.js +37 -11
- package/components/app/providers/SocketProvider.js +6 -4
- package/components/app/providers/UserListProvider.d.ts +1 -1
- package/components/app/providers/ViewProvider.d.ts +2 -2
- package/components/app/providers/ViewProvider.js +22 -12
- package/components/app/providers/ViewProvider.test.js +2 -2
- package/components/app/providers/contextUtils.d.ts +1 -0
- package/components/app/providers/contextUtils.js +3 -0
- package/components/elements/Comment.d.ts +1 -1
- package/components/elements/Comment.js +11 -9
- package/components/elements/ContextMenu.js +1 -1
- package/components/elements/ContextMenu.test.js +2 -2
- package/components/elements/EditRow.d.ts +9 -4
- package/components/elements/EditRow.js +5 -4
- package/components/elements/MarkdownEditor.js +1 -1
- package/components/elements/MembershipManagement.test.js +178 -0
- package/components/elements/ObjectDetails.js +6 -6
- package/components/elements/ThemedEditor.js +17 -17
- package/components/elements/UserList.d.ts +2 -0
- package/components/elements/UserList.js +26 -18
- package/components/elements/UserList.test.js +24 -1
- package/components/elements/addons/buttons/CustomButton.d.ts +1 -1
- package/components/elements/addons/buttons/CustomButton.js +2 -2
- package/components/elements/addons/buttons/CustomIconButton.d.ts +1 -1
- package/components/elements/addons/buttons/CustomIconButton.js +3 -3
- package/components/elements/addons/buttons/index.d.ts +1 -1
- package/components/elements/addons/layout/FlexOne.d.ts +2 -2
- package/components/elements/addons/layout/FlexOne.test.js +1 -0
- package/components/elements/addons/layout/FlexPort.d.ts +1 -1
- package/components/elements/addons/layout/FlexPort.js +9 -2
- package/components/elements/addons/layout/FlexVertical.d.ts +2 -2
- package/components/elements/addons/layout/FlexVertical.js +1 -1
- package/components/elements/addons/layout/vsbox/VSBox.d.ts +2 -2
- package/components/elements/addons/layout/vsbox/VSBox.js +5 -4
- package/components/elements/addons/layout/vsbox/VSBoxElement.d.ts +1 -1
- package/components/elements/addons/layout/vsbox/VSBoxHeader.js +4 -3
- package/components/elements/addons/lists/TuiList.d.ts +2 -2
- package/components/elements/addons/lists/TuiList.js +1 -1
- package/components/elements/addons/lists/TuiListBase.d.ts +2 -2
- package/components/elements/addons/lists/TuiListBase.js +4 -4
- package/components/elements/addons/lists/TuiListElement.d.ts +2 -2
- package/components/elements/addons/lists/TuiListElement.js +2 -2
- package/components/elements/addons/lists/TuiListMenu.d.ts +13 -37
- package/components/elements/addons/lists/TuiListMenu.js +8 -8
- package/components/elements/addons/lists/TuiListProvider.d.ts +2 -2
- package/components/elements/addons/lists/TuiListProvider.js +4 -4
- package/components/elements/addons/lists/hooks/useTuiListKeyboard.js +1 -1
- package/components/elements/addons/lists/table/TuiTable.d.ts +1 -1
- package/components/elements/addons/lists/table/TuiTable.js +1 -1
- package/components/elements/addons/lists/table/TuiTableBody.d.ts +1 -1
- package/components/elements/addons/lists/table/TuiTableBody.js +1 -1
- package/components/elements/addons/lists/table/TuiTableHead.d.ts +1 -1
- package/components/elements/addons/lists/table/TuiTableHead.js +1 -1
- package/components/elements/addons/lists/table/TuiTableHeader.d.ts +1 -1
- package/components/elements/addons/lists/table/TuiTableLayout.js +1 -1
- package/components/elements/addons/search/SearchPagination.d.ts +1 -1
- package/components/elements/addons/search/SearchPagination.test.js +1 -1
- package/components/elements/addons/search/SearchTotal.d.ts +1 -1
- package/components/elements/addons/search/phrase/Phrase.d.ts +2 -2
- package/components/elements/addons/search/phrase/Phrase.js +7 -7
- package/components/elements/addons/search/phrase/PhraseConsumer.d.ts +2 -2
- package/components/elements/addons/search/phrase/PhraseLexer.d.ts +1 -1
- package/components/elements/addons/search/phrase/PhraseLexer.js +6 -6
- package/components/elements/addons/search/phrase/WordLexer.test.js +1 -0
- package/components/elements/addons/search/phrase/index.d.ts +2 -2
- package/components/elements/addons/search/phrase/index.js +3 -2
- package/components/elements/addons/search/phrase/word/consumers/WhitespaceConsumer.d.ts +1 -1
- package/components/elements/addons/search/phrase/word/consumers/WhitespaceConsumer.js +1 -1
- package/components/elements/addons/search/phrase/word/consumers/WordConsumer.d.ts +1 -1
- package/components/elements/case/CaseCard.js +10 -4
- package/components/elements/case/CasePreview.js +1 -1
- package/components/elements/display/ActionButton.js +3 -1
- package/components/elements/display/ChipPopper.js +1 -1
- package/components/elements/display/ChipPopper.test.js +1 -0
- package/components/elements/display/Classification.js +6 -5
- package/components/elements/display/ClassificationChip.d.ts +2 -4
- package/components/elements/display/ClassificationChip.js +5 -3
- package/components/elements/display/DocumentationButton.js +1 -1
- package/components/elements/display/DocumentationButton.test.js +1 -1
- package/components/elements/display/HandlebarsMarkdown.js +2 -2
- package/components/elements/display/HowlerAvatar.d.ts +1 -0
- package/components/elements/display/HowlerAvatar.js +5 -4
- package/components/elements/display/HowlerAvatarHeader.js +2 -2
- package/components/elements/display/Image.test.js +1 -0
- package/components/elements/display/ItemManager.d.ts +6 -6
- package/components/elements/display/ItemManager.js +1 -1
- package/components/elements/display/Markdown.js +9 -3
- package/components/elements/display/Modal.js +3 -3
- package/components/elements/display/QueryResultText.js +1 -1
- package/components/elements/display/TextDivider.test.js +1 -0
- package/components/elements/display/TypingIndicator.d.ts +1 -1
- package/components/elements/display/UserPageWrapper.js +2 -2
- package/components/elements/display/handlebars/helpers.js +1 -1
- package/components/elements/display/json/JSONViewer.js +2 -2
- package/components/elements/display/markdownPlugins/tabs.js +4 -0
- package/components/elements/display/modals/CreateActionModal.js +1 -1
- package/components/elements/display/modals/RationaleModal.js +1 -2
- package/components/elements/display/modals/RationaleModal.test.js +9 -5
- package/components/elements/event/EventPreview.js +1 -1
- package/components/elements/hit/HitActions.js +5 -7
- package/components/elements/hit/HitBanner.js +4 -16
- package/components/elements/hit/HitBanner.test.js +11 -20
- package/components/elements/hit/HitLabels.js +23 -13
- package/components/elements/hit/HitLinks.js +4 -4
- package/components/elements/hit/HitNotebooks.js +28 -10
- package/components/elements/hit/HitOutline.js +9 -15
- package/components/elements/hit/HitOutline.test.js +5 -5
- package/components/elements/hit/HitOverview.js +3 -3
- package/components/elements/hit/HitPreview.d.ts +1 -1
- package/components/elements/hit/HitPreview.js +6 -7
- package/components/elements/hit/HitSummary.js +8 -8
- package/components/elements/hit/PivotTooltip.js +1 -1
- package/components/elements/hit/actions/ButtonActions.js +2 -2
- package/components/elements/hit/actions/DropdownActions.js +4 -4
- package/components/elements/hit/aggregate/HitGraph.js +28 -11
- package/components/elements/hit/elements/AnalyticLink.js +2 -2
- package/components/elements/hit/elements/AnalyticLink.test.js +1 -1
- package/components/elements/hit/elements/Assigned.js +1 -1
- package/components/elements/hit/elements/Assigned.test.js +1 -1
- package/components/elements/hit/elements/EscalationChip.js +2 -2
- package/components/elements/hit/elements/HitTimestamp.js +2 -2
- package/components/elements/hit/grid/AddColumnModal.js +2 -2
- package/components/elements/hit/grid/ColumnHeader.js +1 -1
- package/components/elements/hit/grid/RecordRow.js +1 -1
- package/components/elements/hit/grid/RecordTable.d.ts +4 -3
- package/components/elements/hit/grid/RecordTable.js +6 -6
- package/components/elements/hit/related/PivotLink.js +2 -2
- package/components/elements/hit/related/RelatedIcon.js +2 -2
- package/components/elements/hit/related/RelatedLink.js +1 -1
- package/components/elements/hit/related/RelatedRecords.js +1 -1
- package/components/elements/membership/Members.d.ts +6 -0
- package/components/elements/membership/Members.js +14 -0
- package/components/elements/membership/MembershipManagement.d.ts +9 -0
- package/components/elements/membership/MembershipManagement.js +119 -0
- package/components/elements/membership/types.d.ts +7 -0
- package/components/elements/membership/utils.d.ts +2 -0
- package/components/elements/membership/utils.js +6 -0
- package/components/elements/record/RecordComments.js +16 -10
- package/components/elements/record/RecordContextMenu.d.ts +2 -2
- package/components/elements/record/RecordContextMenu.js +11 -5
- package/components/elements/record/RecordContextMenu.test.js +14 -6
- package/components/elements/record/RecordRelated.js +2 -2
- package/components/elements/search/FuzzySearchBar.js +1 -1
- package/components/elements/view/LayoutToggle.d.ts +1 -1
- package/components/elements/view/ViewTitle.js +3 -4
- package/components/hooks/useHitActions.d.ts +1 -1
- package/components/hooks/useHitActions.js +25 -15
- package/components/hooks/useLocalStorage.d.ts +1 -1
- package/components/hooks/useLocalStorage.js +1 -1
- package/components/hooks/useLocalStorageItem.d.ts +11 -1
- package/components/hooks/useLocalStorageItem.js +7 -5
- package/components/hooks/useLocalStorageItem.test.js +23 -0
- package/components/hooks/useMyAccessibility.d.ts +7 -0
- package/components/hooks/useMyAccessibility.js +21 -0
- package/components/hooks/useMyApi.d.ts +1 -1
- package/components/hooks/useMyApi.js +4 -4
- package/components/hooks/useMyChart.d.ts +46 -48
- package/components/hooks/useMyChart.js +30 -9
- package/components/hooks/useMyCookies.d.ts +3 -0
- package/components/hooks/useMyCookies.js +8 -0
- package/components/hooks/useMyLocalStorage.d.ts +8 -2
- package/components/hooks/useMyLocalStorage.js +1 -1
- package/components/hooks/useMyPreferences.d.ts +1 -1
- package/components/hooks/useMyPreferences.js +93 -127
- package/components/hooks/useMyRouter.d.ts +2 -0
- package/components/hooks/useMyRouter.js +24 -0
- package/components/hooks/useMySearch.d.ts +1 -1
- package/components/hooks/useMySearch.js +17 -7
- package/components/hooks/useMySnackbar.js +1 -1
- package/components/hooks/useMyTheme.d.ts +1 -1
- package/components/hooks/useMyTheme.js +13 -8
- package/components/hooks/useMyTheme.test.js +11 -6
- package/components/hooks/useMyUser.d.ts +1 -1
- package/components/hooks/useMyUser.js +6 -5
- package/components/hooks/useMyUserFunctions.d.ts +2 -2
- package/components/hooks/useMyUserFunctions.js +14 -10
- package/components/hooks/useMyUserList.d.ts +1 -1
- package/components/hooks/useMyUtils.js +1 -1
- package/components/hooks/useParamState.js +5 -3
- package/components/hooks/useParamState.test.js +1 -1
- package/components/hooks/useRecordSelection.d.ts +4 -3
- package/components/hooks/useRecordSelection.js +5 -5
- package/components/hooks/useScrollRestoration.js +3 -3
- package/components/logins/Login.d.ts +1 -1
- package/components/logins/Login.js +4 -6
- package/components/logins/auth/OAuthLogin.js +1 -1
- package/components/logins/auth/UserPassLogin.d.ts +1 -1
- package/components/logins/hooks/useLogin.js +10 -6
- package/components/routes/403.js +1 -1
- package/components/routes/403.test.js +7 -3
- package/components/routes/404.js +1 -1
- package/components/routes/404.test.js +7 -3
- package/components/routes/ErrorBoundary.d.ts +2 -2
- package/components/routes/ErrorBoundary.js +2 -2
- package/components/routes/ErrorBoundary.test.js +1 -4
- package/components/routes/ErrorOccured.js +1 -1
- package/components/routes/ErrorOccured.test.js +7 -3
- package/components/routes/Logout.js +3 -4
- package/components/routes/Logout.test.js +12 -11
- package/components/routes/action/edit/ActionEditor.js +38 -30
- package/components/routes/action/shared/ActionReportDisplay.js +1 -1
- package/components/routes/action/shared/OperationEntry.js +2 -2
- package/components/routes/action/shared/OperationStep.js +12 -10
- package/components/routes/action/useMyActionFunctions.d.ts +3 -3
- package/components/routes/action/useMyActionFunctions.js +13 -13
- package/components/routes/action/view/ActionDetails.d.ts +1 -1
- package/components/routes/action/view/ActionDetails.js +46 -26
- package/components/routes/action/view/ActionSearch.js +11 -10
- package/components/routes/action/view/Integrations.js +2 -2
- package/components/routes/action/view/markdown/integrations.en.md.js +1 -1
- package/components/routes/action/view/markdown/integrations.fr.md.js +1 -1
- package/components/routes/admin/users/UserEditor.js +21 -8
- package/components/routes/admin/users/UserSearch.js +10 -9
- package/components/routes/advanced/QueryBuilder.js +17 -11
- package/components/routes/advanced/luceneCompletionProvider.js +42 -21
- package/components/routes/analytics/AnalyticComments.js +19 -14
- package/components/routes/analytics/AnalyticDetails.d.ts +1 -1
- package/components/routes/analytics/AnalyticDetails.js +20 -16
- package/components/routes/analytics/AnalyticHitComments.js +13 -6
- package/components/routes/analytics/AnalyticHitComments.test.js +5 -4
- package/components/routes/analytics/AnalyticNotebooks.js +5 -5
- package/components/routes/analytics/AnalyticOverview.js +28 -15
- package/components/routes/analytics/AnalyticOverviews.js +2 -2
- package/components/routes/analytics/AnalyticSearch.js +11 -10
- package/components/routes/analytics/AnalyticTemplates.js +3 -3
- package/components/routes/analytics/TriageSettings.d.ts +1 -1
- package/components/routes/analytics/TriageSettings.js +1 -1
- package/components/routes/analytics/widgets/Assessment.js +1 -1
- package/components/routes/analytics/widgets/Created.js +9 -9
- package/components/routes/analytics/widgets/Escalation.js +3 -3
- package/components/routes/analytics/widgets/Stacked.js +5 -5
- package/components/routes/analytics/widgets/Status.js +2 -2
- package/components/routes/cases/CaseViewer.js +1 -1
- package/components/routes/cases/CaseViewer.test.js +2 -2
- package/components/routes/cases/Cases.d.ts +1 -1
- package/components/routes/cases/Cases.js +8 -7
- package/components/routes/cases/constants.d.ts +3 -3
- package/components/routes/cases/detail/AlertPanel.js +1 -1
- package/components/routes/cases/detail/AlertPanel.test.js +4 -6
- package/components/routes/cases/detail/CaseDashboard.js +8 -4
- package/components/routes/cases/detail/CaseDashboard.test.js +2 -2
- package/components/routes/cases/detail/CaseDetails.js +7 -2
- package/components/routes/cases/detail/CaseDetails.test.js +1 -1
- package/components/routes/cases/detail/CaseObservables.js +5 -4
- package/components/routes/cases/detail/CaseObservables.test.js +1 -1
- package/components/routes/cases/detail/CaseOverview.js +2 -2
- package/components/routes/cases/detail/CaseRules.js +10 -6
- package/components/routes/cases/detail/CaseRules.test.js +2 -2
- package/components/routes/cases/detail/CaseSearch.js +5 -5
- package/components/routes/cases/detail/CaseSearch.test.js +2 -2
- package/components/routes/cases/detail/CaseSidebar.js +12 -7
- package/components/routes/cases/detail/CaseSidebar.test.js +5 -6
- package/components/routes/cases/detail/CaseTask.js +27 -15
- package/components/routes/cases/detail/CaseTask.test.js +8 -1
- package/components/routes/cases/detail/CaseTimeline.js +8 -8
- package/components/routes/cases/detail/CaseTimeline.test.js +6 -6
- package/components/routes/cases/detail/CreateRuleDialog.js +4 -4
- package/components/routes/cases/detail/CreateRuleDialog.test.js +2 -2
- package/components/routes/cases/detail/ItemPage.js +3 -3
- package/components/routes/cases/detail/MarkdownPage.test.js +0 -4
- package/components/routes/cases/detail/RelatedCasePanel.js +1 -1
- package/components/routes/cases/detail/RelatedCasePanel.test.js +4 -6
- package/components/routes/cases/detail/TaskPanel.js +8 -8
- package/components/routes/cases/detail/TaskPanel.test.js +3 -3
- package/components/routes/cases/detail/aggregates/CaseAggregate.js +1 -1
- package/components/routes/cases/detail/aggregates/SourceAggregate.js +3 -3
- package/components/routes/cases/detail/observables/Observable.js +4 -5
- package/components/routes/cases/detail/observables/Observable.test.js +1 -1
- package/components/routes/cases/detail/observables/ObservableTable.js +3 -3
- package/components/routes/cases/detail/observables/ObservableTable.test.js +1 -1
- package/components/routes/cases/detail/sidebar/CaseFolder.js +24 -20
- package/components/routes/cases/detail/sidebar/CaseFolder.test.js +1 -1
- package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +4 -2
- package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +3 -2
- package/components/routes/cases/detail/sidebar/FolderEntry.js +3 -3
- package/components/routes/cases/detail/sidebar/FolderEntry.test.js +3 -3
- package/components/routes/cases/detail/sidebar/types.d.ts +1 -1
- package/components/routes/cases/detail/sidebar/utils.js +1 -1
- package/components/routes/cases/detail/sidebar/utils.test.js +8 -8
- package/components/routes/cases/detail/utils.d.ts +1 -1
- package/components/routes/cases/detail/utils.js +3 -2
- package/components/routes/cases/hooks/useCase.js +14 -2
- package/components/routes/cases/modals/AddRecordToCaseModal.test.js +1 -1
- package/components/routes/cases/modals/AddToCaseModal.d.ts +1 -1
- package/components/routes/cases/modals/AddToCaseModal.js +2 -2
- package/components/routes/cases/modals/CreateCaseModal.test.js +1 -1
- package/components/routes/cases/modals/ResolveModal.js +8 -5
- package/components/routes/cases/modals/ResolveModal.test.js +5 -5
- package/components/routes/cases/modals/hooks.js +1 -2
- package/components/routes/cases/modals/types.d.ts +1 -1
- package/components/routes/cases/search/CaseAssigneeFilter.js +1 -1
- package/components/routes/cases/search/CaseAssigneeFilter.test.js +8 -3
- package/components/routes/cases/search/CaseStatusFilter.test.js +1 -0
- package/components/routes/cases/utils.d.ts +0 -1
- package/components/routes/cases/utils.js +4 -13
- package/components/routes/dossiers/DossierCard.js +3 -3
- package/components/routes/dossiers/DossierCard.test.js +6 -6
- package/components/routes/dossiers/DossierEditor.js +61 -25
- package/components/routes/dossiers/DossierEditor.test.js +16 -9
- package/components/routes/dossiers/Dossiers.d.ts +1 -1
- package/components/routes/dossiers/Dossiers.js +6 -5
- package/components/routes/dossiers/LeadEditor.d.ts +1 -1
- package/components/routes/dossiers/LeadEditor.js +2 -2
- package/components/routes/dossiers/LeadForm.js +2 -2
- package/components/routes/dossiers/PivotForm.d.ts +1 -1
- package/components/routes/dossiers/PivotForm.js +10 -9
- package/components/routes/events/EventViewer.js +1 -1
- package/components/routes/help/ActionDocumentation.js +2 -2
- package/components/routes/help/ActionIntroductionDocumentation.js +2 -2
- package/components/routes/help/ApiDocumentation.js +3 -4
- package/components/routes/help/AuthDocumentation.js +1 -1
- package/components/routes/help/ClientDocumentation.js +1 -1
- package/components/routes/help/Help.d.ts +1 -1
- package/components/routes/help/Help.js +5 -4
- package/components/routes/help/HitDocumentation.js +3 -3
- package/components/routes/help/HitLabelsDocumentation.js +12 -12
- package/components/routes/help/HitLinksDocumentation.js +2 -2
- package/components/routes/help/HitSchemaDocumentation.js +14 -8
- package/components/routes/help/NotebookDocumentation.js +1 -1
- package/components/routes/help/OverviewDocumentation.js +1 -1
- package/components/routes/help/RetentionDocumentation.js +3 -3
- package/components/routes/help/SearchDocumentation.js +6 -4
- package/components/routes/help/TemplateDocumentation.js +2 -2
- package/components/routes/help/ViewDocumentation.js +1 -1
- package/components/routes/help/markdown/en/views.md.js +1 -1
- package/components/routes/help/markdown/fr/views.md.js +1 -1
- package/components/routes/hits/search/InformationPane.js +8 -8
- package/components/routes/hits/search/QuerySettings.js +1 -1
- package/components/routes/hits/search/QuerySettings.test.js +8 -4
- package/components/routes/hits/search/RecordBrowser.js +12 -9
- package/components/routes/hits/search/RecordQuery.js +13 -10
- package/components/routes/hits/search/SearchPane.js +2 -3
- package/components/routes/hits/search/ViewLink.js +4 -4
- package/components/routes/hits/search/ViewLink.test.js +1 -0
- package/components/routes/hits/search/grid/RecordGrid.js +1 -1
- package/components/routes/hits/search/shared/CustomSort.js +3 -2
- package/components/routes/hits/search/shared/CustomSpan.js +9 -1
- package/components/routes/hits/search/shared/HitFilter.js +8 -3
- package/components/routes/hits/search/shared/HitSort.js +8 -6
- package/components/routes/hits/search/shared/IndexPicker.js +1 -1
- package/components/routes/hits/search/shared/LayoutSettings.js +1 -1
- package/components/routes/hits/search/shared/SearchActionMenu.d.ts +1 -1
- package/components/routes/hits/search/shared/SearchActionMenu.js +1 -1
- package/components/routes/hits/search/shared/SearchSpan.js +1 -1
- package/components/routes/hits/view/HitViewer.js +21 -11
- package/components/routes/hits/view/HitViewer.test.js +2 -2
- package/components/routes/home/AddNewCard.d.ts +2 -1
- package/components/routes/home/AddNewCard.js +7 -4
- package/components/routes/home/AnalyticCard.js +3 -3
- package/components/routes/home/EntryWrapper.js +1 -1
- package/components/routes/home/ViewCard.js +11 -7
- package/components/routes/home/ViewCard.test.js +3 -6
- package/components/routes/home/index.js +20 -17
- package/components/routes/overviews/OverviewCard.js +6 -2
- package/components/routes/overviews/OverviewViewer.d.ts +1 -1
- package/components/routes/overviews/OverviewViewer.js +48 -39
- package/components/routes/overviews/Overviews.d.ts +1 -1
- package/components/routes/overviews/Overviews.js +7 -6
- package/components/routes/overviews/markdownExtendedTokenProvider.test.js +1 -0
- package/components/routes/overviews/startingTemplate.js +1 -1
- package/components/routes/settings/ProfileSection.d.ts +1 -1
- package/components/routes/settings/ProfileSection.js +2 -2
- package/components/routes/settings/SecuritySection.d.ts +1 -1
- package/components/routes/settings/SecuritySection.js +2 -2
- package/components/routes/settings/Settings.js +6 -6
- package/components/routes/templates/TemplateCard.js +1 -1
- package/components/routes/templates/TemplateEditor.d.ts +1 -1
- package/components/routes/templates/TemplateEditor.js +3 -3
- package/components/routes/templates/TemplateViewer.d.ts +1 -1
- package/components/routes/templates/TemplateViewer.js +54 -52
- package/components/routes/templates/Templates.d.ts +1 -1
- package/components/routes/templates/Templates.js +10 -9
- package/components/routes/views/ViewComposer.js +38 -30
- package/components/routes/views/Views.d.ts +2 -1
- package/components/routes/views/Views.js +20 -14
- package/i18n.js +4 -0
- package/locales/en/translation.json +10 -0
- package/locales/fr/translation.json +10 -0
- package/models/entities/HowlerUser.d.ts +1 -1
- package/models/entities/generated/Action.d.ts +3 -1
- package/models/entities/generated/ApiType.d.ts +2 -3
- package/models/entities/generated/Dossier.d.ts +2 -0
- package/models/entities/generated/HowlerDossier.d.ts +2 -0
- package/models/entities/generated/Item.d.ts +2 -2
- package/models/entities/generated/Settings.d.ts +1 -1
- package/models/entities/generated/View.d.ts +2 -0
- package/package.json +102 -118
- package/plugins/HowlerPlugin.d.ts +9 -50
- package/plugins/HowlerPlugin.js +7 -113
- package/plugins/clue/Provider.js +1 -1
- package/plugins/clue/components/ClueLeadForm.js +2 -2
- package/plugins/clue/components/CluePivot.js +6 -7
- package/plugins/clue/components/CluePivotForm.js +26 -15
- package/plugins/clue/components/ClueTypography.js +2 -2
- package/plugins/clue/helpers.js +5 -5
- package/plugins/clue/index.d.ts +2 -2
- package/plugins/clue/index.js +1 -1
- package/plugins/clue/setup.js +1 -1
- package/plugins/clue/utils.d.ts +1 -1
- package/plugins/store.d.ts +26 -43
- package/plugins/store.js +2 -15
- package/rest/AxiosClient.js +3 -3
- package/rest/FetchClient.d.ts +1 -1
- package/rest/FetchClient.js +8 -5
- package/rest/FetchClient.test.js +7 -4
- package/rest/index.d.ts +4 -3
- package/setupTests.d.ts +3 -0
- package/tests/MockLocalStorage.js +2 -1
- package/tests/mocks.d.ts +2 -2
- package/tests/mocks.js +3 -3
- package/tests/server-handlers.js +1 -1
- package/utils/Throttler.js +1 -1
- package/utils/actionUtils.d.ts +1 -1
- package/utils/actionUtils.js +10 -6
- package/utils/classificationParser.js +56 -63
- package/utils/constants.d.ts +0 -17
- package/utils/constants.js +1 -18
- package/utils/exampleHit.d.ts +2 -0
- package/utils/exampleHit.js +18 -0
- package/utils/localStorage.d.ts +2 -2
- package/utils/localStorage.js +1 -1
- package/utils/menuUtils.d.ts +3 -89
- package/utils/menuUtils.js +66 -227
- package/utils/menuUtils.test.js +45 -181
- package/utils/sessionStorage.js +1 -1
- package/utils/sessionStorage.test.js +1 -0
- package/utils/stringUtils.d.ts +1 -1
- package/utils/utils.d.ts +30 -6
- package/utils/utils.js +66 -9
- package/utils/utils.test.js +1 -0
- package/utils/xsrf.d.ts +1 -1
- package/utils/xsrf.js +5 -10
- package/api/dossier/hit.d.ts +0 -2
- package/api/dossier/hit.js +0 -7
- package/api/dossier/index.d.ts +0 -9
- package/commons/components/app/AppConfigs.d.ts +0 -137
- package/commons/components/app/AppConstants.d.ts +0 -10
- package/commons/components/app/AppConstants.js +0 -10
- package/commons/components/app/AppContexts.d.ts +0 -105
- package/commons/components/app/AppContexts.js +0 -21
- package/commons/components/app/AppDefaults.d.ts +0 -6
- package/commons/components/app/AppDefaults.js +0 -40
- package/commons/components/app/AppNotificationService.d.ts +0 -6
- package/commons/components/app/AppNotificationService.js +0 -1
- package/commons/components/app/AppProvider.d.ts +0 -15
- package/commons/components/app/AppProvider.js +0 -41
- package/commons/components/app/AppSearchService.d.ts +0 -21
- package/commons/components/app/AppSearchService.js +0 -1
- package/commons/components/app/AppSkeleton.d.ts +0 -5
- package/commons/components/app/AppSkeleton.js +0 -152
- package/commons/components/app/AppUserService.d.ts +0 -17
- package/commons/components/app/AppUserService.js +0 -1
- package/commons/components/app/hooks/index.d.ts +0 -18
- package/commons/components/app/hooks/index.js +0 -18
- package/commons/components/app/hooks/useApp.d.ts +0 -1
- package/commons/components/app/hooks/useApp.js +0 -5
- package/commons/components/app/hooks/useAppBanner.d.ts +0 -1
- package/commons/components/app/hooks/useAppBanner.js +0 -6
- package/commons/components/app/hooks/useAppBar.d.ts +0 -1
- package/commons/components/app/hooks/useAppBar.js +0 -5
- package/commons/components/app/hooks/useAppBarHeight.d.ts +0 -2
- package/commons/components/app/hooks/useAppBarHeight.js +0 -22
- package/commons/components/app/hooks/useAppBarScrollTrigger.d.ts +0 -1
- package/commons/components/app/hooks/useAppBarScrollTrigger.js +0 -7
- package/commons/components/app/hooks/useAppBreadcrumbs.d.ts +0 -1
- package/commons/components/app/hooks/useAppBreadcrumbs.js +0 -5
- package/commons/components/app/hooks/useAppConfigs.d.ts +0 -59
- package/commons/components/app/hooks/useAppConfigs.js +0 -44
- package/commons/components/app/hooks/useAppLanguage.d.ts +0 -6
- package/commons/components/app/hooks/useAppLanguage.js +0 -17
- package/commons/components/app/hooks/useAppLayout.d.ts +0 -1
- package/commons/components/app/hooks/useAppLayout.js +0 -5
- package/commons/components/app/hooks/useAppLeftNav.d.ts +0 -1
- package/commons/components/app/hooks/useAppLeftNav.js +0 -5
- package/commons/components/app/hooks/useAppLogo.d.ts +0 -1
- package/commons/components/app/hooks/useAppLogo.js +0 -8
- package/commons/components/app/hooks/useAppNotification.d.ts +0 -1
- package/commons/components/app/hooks/useAppNotification.js +0 -5
- package/commons/components/app/hooks/useAppQuickSearch.d.ts +0 -1
- package/commons/components/app/hooks/useAppQuickSearch.js +0 -5
- package/commons/components/app/hooks/useAppSearchService.d.ts +0 -2
- package/commons/components/app/hooks/useAppSearchService.js +0 -5
- package/commons/components/app/hooks/useAppSitemap.d.ts +0 -16
- package/commons/components/app/hooks/useAppSitemap.js +0 -70
- package/commons/components/app/hooks/useAppSwitcher.d.ts +0 -1
- package/commons/components/app/hooks/useAppSwitcher.js +0 -5
- package/commons/components/app/hooks/useAppTheme.d.ts +0 -8
- package/commons/components/app/hooks/useAppTheme.js +0 -12
- package/commons/components/app/hooks/useAppUser.d.ts +0 -2
- package/commons/components/app/hooks/useAppUser.js +0 -5
- package/commons/components/app/providers/AppBarProvider.d.ts +0 -10
- package/commons/components/app/providers/AppBarProvider.js +0 -24
- package/commons/components/app/providers/AppBreadcrumbsProvider.d.ts +0 -6
- package/commons/components/app/providers/AppBreadcrumbsProvider.js +0 -43
- package/commons/components/app/providers/AppLayoutProvider.d.ts +0 -6
- package/commons/components/app/providers/AppLayoutProvider.js +0 -73
- package/commons/components/app/providers/AppLeftNavProvider.d.ts +0 -6
- package/commons/components/app/providers/AppLeftNavProvider.js +0 -22
- package/commons/components/app/providers/AppNotificationProvider.d.ts +0 -6
- package/commons/components/app/providers/AppNotificationProvider.js +0 -31
- package/commons/components/app/providers/AppQuickSearchProvider.d.ts +0 -8
- package/commons/components/app/providers/AppQuickSearchProvider.js +0 -19
- package/commons/components/app/providers/AppSearchServiceProvider.d.ts +0 -6
- package/commons/components/app/providers/AppSearchServiceProvider.js +0 -46
- package/commons/components/app/providers/AppSnackbarProvider.d.ts +0 -3
- package/commons/components/app/providers/AppSnackbarProvider.js +0 -15
- package/commons/components/app/providers/AppSwitcherProvider.d.ts +0 -6
- package/commons/components/app/providers/AppSwitcherProvider.js +0 -10
- package/commons/components/app/providers/AppUserProvider.d.ts +0 -8
- package/commons/components/app/providers/AppUserProvider.js +0 -12
- package/commons/components/breadcrumbs/BreadcrumbIcon.d.ts +0 -6
- package/commons/components/breadcrumbs/BreadcrumbIcon.js +0 -9
- package/commons/components/breadcrumbs/BreadcrumbLastItem.d.ts +0 -7
- package/commons/components/breadcrumbs/BreadcrumbLastItem.js +0 -19
- package/commons/components/breadcrumbs/BreadcrumbLinkItem.d.ts +0 -7
- package/commons/components/breadcrumbs/BreadcrumbLinkItem.js +0 -20
- package/commons/components/breadcrumbs/BreadcrumbList.d.ts +0 -11
- package/commons/components/breadcrumbs/BreadcrumbList.js +0 -44
- package/commons/components/breadcrumbs/Breadcrumbs.d.ts +0 -5
- package/commons/components/breadcrumbs/Breadcrumbs.js +0 -31
- package/commons/components/display/AppAvatar.d.ts +0 -8
- package/commons/components/display/AppAvatar.js +0 -18
- package/commons/components/display/AppInfoPanel.d.ts +0 -5
- package/commons/components/display/AppInfoPanel.js +0 -17
- package/commons/components/display/AppListEmpty.d.ts +0 -2
- package/commons/components/display/AppListEmpty.js +0 -5
- package/commons/components/display/AppToc.d.ts +0 -20
- package/commons/components/display/AppToc.js +0 -98
- package/commons/components/display/hooks/useAppColor.d.ts +0 -5
- package/commons/components/display/hooks/useAppColor.js +0 -10
- package/commons/components/leftnav/LeftNavDrawer.d.ts +0 -3
- package/commons/components/leftnav/LeftNavDrawer.js +0 -99
- package/commons/components/leftnav/LeftNavGroup.d.ts +0 -8
- package/commons/components/leftnav/LeftNavGroup.js +0 -55
- package/commons/components/leftnav/LeftNavItem.d.ts +0 -11
- package/commons/components/leftnav/LeftNavItem.js +0 -29
- package/commons/components/notification/FeedModels.d.ts +0 -64
- package/commons/components/notification/FeedModels.js +0 -94
- package/commons/components/notification/Notification.d.ts +0 -10
- package/commons/components/notification/Notification.js +0 -95
- package/commons/components/notification/elements/NotificationCloseButton.d.ts +0 -3
- package/commons/components/notification/elements/NotificationCloseButton.js +0 -6
- package/commons/components/notification/elements/NotificationContainer.d.ts +0 -16
- package/commons/components/notification/elements/NotificationContainer.js +0 -29
- package/commons/components/notification/elements/NotificationEndOfPage.d.ts +0 -5
- package/commons/components/notification/elements/NotificationEndOfPage.js +0 -36
- package/commons/components/notification/elements/NotificationError.d.ts +0 -2
- package/commons/components/notification/elements/NotificationError.js +0 -10
- package/commons/components/notification/elements/NotificationHeader.d.ts +0 -8
- package/commons/components/notification/elements/NotificationHeader.js +0 -18
- package/commons/components/notification/elements/NotificationItems.d.ts +0 -12
- package/commons/components/notification/elements/NotificationItems.js +0 -12
- package/commons/components/notification/elements/NotificationSkeleton.d.ts +0 -2
- package/commons/components/notification/elements/NotificationSkeleton.js +0 -12
- package/commons/components/notification/elements/NotificationTopNavButton.d.ts +0 -9
- package/commons/components/notification/elements/NotificationTopNavButton.js +0 -9
- package/commons/components/notification/elements/item/NotificationItem.d.ts +0 -5
- package/commons/components/notification/elements/item/NotificationItem.js +0 -25
- package/commons/components/notification/elements/item/NotificationItemAuthor.d.ts +0 -5
- package/commons/components/notification/elements/item/NotificationItemAuthor.js +0 -31
- package/commons/components/notification/elements/item/NotificationItemContent.d.ts +0 -3
- package/commons/components/notification/elements/item/NotificationItemContent.js +0 -9
- package/commons/components/notification/elements/item/NotificationItemDate.d.ts +0 -3
- package/commons/components/notification/elements/item/NotificationItemDate.js +0 -10
- package/commons/components/notification/elements/item/NotificationItemImage.d.ts +0 -4
- package/commons/components/notification/elements/item/NotificationItemImage.js +0 -8
- package/commons/components/notification/elements/item/NotificationItemTag.d.ts +0 -4
- package/commons/components/notification/elements/item/NotificationItemTag.js +0 -12
- package/commons/components/notification/elements/item/NotificationItemTitle.d.ts +0 -3
- package/commons/components/notification/elements/item/NotificationItemTitle.js +0 -15
- package/commons/components/notification/index.d.ts +0 -2
- package/commons/components/notification/index.js +0 -2
- package/commons/components/pages/PageCardCentered.d.ts +0 -5
- package/commons/components/pages/PageCardCentered.js +0 -30
- package/commons/components/pages/PageCenter.d.ts +0 -9
- package/commons/components/pages/PageCenter.js +0 -20
- package/commons/components/pages/PageContent.d.ts +0 -8
- package/commons/components/pages/PageContent.js +0 -8
- package/commons/components/pages/PageFullScreen.d.ts +0 -11
- package/commons/components/pages/PageFullScreen.js +0 -40
- package/commons/components/pages/PageFullWidth.d.ts +0 -11
- package/commons/components/pages/PageFullWidth.js +0 -7
- package/commons/components/pages/PageHeader.d.ts +0 -23
- package/commons/components/pages/PageHeader.js +0 -27
- package/commons/components/pages/hooks/usePageProps.d.ts +0 -24
- package/commons/components/pages/hooks/usePageProps.js +0 -19
- package/commons/components/search/AppSearch.d.ts +0 -1
- package/commons/components/search/AppSearch.js +0 -135
- package/commons/components/search/AppSearchInput.d.ts +0 -12
- package/commons/components/search/AppSearchInput.js +0 -35
- package/commons/components/search/AppSearchResult.d.ts +0 -5
- package/commons/components/search/AppSearchResult.js +0 -28
- package/commons/components/topnav/AppBar.d.ts +0 -6
- package/commons/components/topnav/AppBar.js +0 -80
- package/commons/components/topnav/AppName.d.ts +0 -5
- package/commons/components/topnav/AppName.js +0 -31
- package/commons/components/topnav/AppSwitcher.d.ts +0 -3
- package/commons/components/topnav/AppSwitcher.js +0 -44
- package/commons/components/topnav/Notifications.d.ts +0 -2
- package/commons/components/topnav/Notifications.js +0 -8
- package/commons/components/topnav/ThemeSelection.d.ts +0 -3
- package/commons/components/topnav/ThemeSelection.js +0 -33
- package/commons/components/topnav/ThemeSelectionIcon.d.ts +0 -2
- package/commons/components/topnav/ThemeSelectionIcon.js +0 -16
- package/commons/components/topnav/UserProfile.d.ts +0 -6
- package/commons/components/topnav/UserProfile.js +0 -71
- package/commons/components/utils/hooks/useClipboard.d.ts +0 -3
- package/commons/components/utils/hooks/useClipboard.js +0 -29
- package/commons/components/utils/hooks/useEnv.d.ts +0 -1
- package/commons/components/utils/hooks/useEnv.js +0 -11
- package/commons/components/utils/hooks/useFullscreenStatus.d.ts +0 -2
- package/commons/components/utils/hooks/useFullscreenStatus.js +0 -41
- package/commons/components/utils/hooks/useGravatar.d.ts +0 -2
- package/commons/components/utils/hooks/useGravatar.js +0 -9
- package/commons/components/utils/hooks/useLocalStorage.d.ts +0 -12
- package/commons/components/utils/hooks/useLocalStorage.js +0 -52
- package/commons/components/utils/hooks/useLocalStorageItem.d.ts +0 -14
- package/commons/components/utils/hooks/useLocalStorageItem.js +0 -39
- package/commons/components/utils/hooks/useThemeBuilder.d.ts +0 -7
- package/commons/components/utils/hooks/useThemeBuilder.js +0 -48
- package/commons/components/utils/keyboard.d.ts +0 -30
- package/commons/components/utils/keyboard.js +0 -50
- package/components/hooks/useMySitemap.d.ts +0 -3
- package/components/hooks/useMySitemap.js +0 -219
- /package/{commons/components/app/AppConfigs.js → components/elements/MembershipManagement.test.d.ts} +0 -0
|
@@ -99,12 +99,13 @@ describe('CaseFolderContextMenu', () => {
|
|
|
99
99
|
expect(mockDel).toHaveBeenCalledWith('case-1', ['folder-id'], true);
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
|
-
it('
|
|
102
|
+
it('does not call the delete API when the item id is missing', () => {
|
|
103
103
|
renderMenu({ item: { type: 'hit', value: 'h1', name: 'hit' } });
|
|
104
104
|
act(() => {
|
|
105
105
|
fireEvent.click(screen.getByText('page.cases.sidebar.item.remove'));
|
|
106
106
|
});
|
|
107
|
-
expect(mockDel).
|
|
107
|
+
expect(mockDel).not.toHaveBeenCalled();
|
|
108
|
+
expect(mockDispatchApi).not.toHaveBeenCalled();
|
|
108
109
|
});
|
|
109
110
|
it('passes updated case to onUpdate after delete', async () => {
|
|
110
111
|
const onUpdate = vi.fn();
|
|
@@ -3,7 +3,7 @@ import { useDraggable, useDroppable } from '@dnd-kit/core';
|
|
|
3
3
|
import { CSS } from '@dnd-kit/utilities';
|
|
4
4
|
import { BookRounded, CheckCircle, ChevronRight, Description, Folder, Lightbulb, Link as LinkIcon, TableChart, Visibility } from '@mui/icons-material';
|
|
5
5
|
import { alpha, Box, Stack, Typography, useTheme } from '@mui/material';
|
|
6
|
-
import { Link, useLocation } from 'react-router
|
|
6
|
+
import { Link, useLocation } from 'react-router';
|
|
7
7
|
// Static map: item type → MUI icon component (avoids re-creating closures on each render)
|
|
8
8
|
const ICON_FOR_TYPE = {
|
|
9
9
|
folder: Folder,
|
|
@@ -42,7 +42,7 @@ const FolderEntry = ({ caseId, indent, label, iconColor = 'disabled', labelColor
|
|
|
42
42
|
});
|
|
43
43
|
const isLink = to != null && !isDragging;
|
|
44
44
|
const active = decodeURIComponent(location.pathname) === to;
|
|
45
|
-
const Icon = ICON_FOR_TYPE[entry?.type
|
|
45
|
+
const Icon = ICON_FOR_TYPE[entry?.type ?? 'folder'];
|
|
46
46
|
return (_jsxs(Stack, { ref: el => {
|
|
47
47
|
setDroppableNodeRef(el);
|
|
48
48
|
setDraggableNodeRef(el);
|
|
@@ -77,7 +77,7 @@ const FolderEntry = ({ caseId, indent, label, iconColor = 'disabled', labelColor
|
|
|
77
77
|
borderRadius: '5px',
|
|
78
78
|
transition: theme.transitions.create('border-color')
|
|
79
79
|
},
|
|
80
|
-
isOver && caseId && { borderColor: theme.palette.primary.main }
|
|
80
|
+
isOver && !!caseId && { borderColor: theme.palette.primary.main }
|
|
81
81
|
] }), _jsx(ChevronRight, { fontSize: "small", color: "disabled", sx: [
|
|
82
82
|
!(isCase || isFolder) && { opacity: 0 },
|
|
83
83
|
{
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import userEvent from '@testing-library/user-event';
|
|
4
|
-
import { MemoryRouter } from 'react-router
|
|
4
|
+
import { MemoryRouter } from 'react-router';
|
|
5
5
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
|
-
vi.mock('react-router
|
|
7
|
-
const actual = await vi.importActual('react-router
|
|
6
|
+
vi.mock('react-router', async () => {
|
|
7
|
+
const actual = await vi.importActual('react-router');
|
|
8
8
|
return {
|
|
9
9
|
...actual,
|
|
10
10
|
Link: ({ to, children, ...props }) => (_jsx("a", { href: to, ...props, children: children })),
|
|
@@ -7,7 +7,7 @@ import { sortBy } from 'lodash-es';
|
|
|
7
7
|
* Items with `parent=null` or `parent=undefined` are root-level.
|
|
8
8
|
*/
|
|
9
9
|
export const buildTree = (items = []) => {
|
|
10
|
-
const root = {
|
|
10
|
+
const root = { leaves: [], folders: {} };
|
|
11
11
|
// Index folders by id
|
|
12
12
|
const folderNodes = {};
|
|
13
13
|
const folderItems = items.filter(item => item.type === 'folder');
|
|
@@ -12,7 +12,7 @@ describe('buildTree', () => {
|
|
|
12
12
|
expect(result.folders).toEqual({});
|
|
13
13
|
});
|
|
14
14
|
it('places items at root when parent is null', () => {
|
|
15
|
-
const item = { id: 'item-1', type: 'hit', value: 'hit-001'
|
|
15
|
+
const item = { id: 'item-1', type: 'hit', value: 'hit-001' };
|
|
16
16
|
const result = buildTree([item]);
|
|
17
17
|
expect(result.leaves).toEqual([item]);
|
|
18
18
|
});
|
|
@@ -22,27 +22,27 @@ describe('buildTree', () => {
|
|
|
22
22
|
expect(result.leaves).toEqual([item]);
|
|
23
23
|
});
|
|
24
24
|
it('places items inside a folder by parent reference', () => {
|
|
25
|
-
const folder = { id: 'folder-1', type: 'folder', value: 'My Folder', name: 'My Folder'
|
|
25
|
+
const folder = { id: 'folder-1', type: 'folder', value: 'My Folder', name: 'My Folder' };
|
|
26
26
|
const item = { id: 'item-1', type: 'hit', value: 'hit-001', parent: 'folder-1' };
|
|
27
27
|
const result = buildTree([folder, item]);
|
|
28
28
|
expect(result.folders?.['My Folder']).toBeDefined();
|
|
29
29
|
expect(result.folders?.['My Folder'].leaves).toEqual([item]);
|
|
30
30
|
});
|
|
31
31
|
it('renders empty folders', () => {
|
|
32
|
-
const folder = { id: 'folder-1', type: 'folder', value: 'Empty', name: 'Empty'
|
|
32
|
+
const folder = { id: 'folder-1', type: 'folder', value: 'Empty', name: 'Empty' };
|
|
33
33
|
const result = buildTree([folder]);
|
|
34
34
|
expect(result.folders?.Empty).toBeDefined();
|
|
35
35
|
expect(result.folders?.Empty.leaves).toEqual([]);
|
|
36
36
|
});
|
|
37
37
|
it('nests folders inside other folders', () => {
|
|
38
|
-
const parent = { id: 'f1', type: 'folder', value: 'Parent', name: 'Parent'
|
|
38
|
+
const parent = { id: 'f1', type: 'folder', value: 'Parent', name: 'Parent' };
|
|
39
39
|
const child = { id: 'f2', type: 'folder', value: 'Child', name: 'Child', parent: 'f1' };
|
|
40
40
|
const item = { id: 'i1', type: 'hit', value: 'hit-1', parent: 'f2' };
|
|
41
41
|
const result = buildTree([parent, child, item]);
|
|
42
42
|
expect(result.folders?.Parent.folders?.Child.leaves).toEqual([item]);
|
|
43
43
|
});
|
|
44
44
|
it('includes folder id in tree nodes', () => {
|
|
45
|
-
const folder = { id: 'folder-1', type: 'folder', value: 'Folder', name: 'Folder'
|
|
45
|
+
const folder = { id: 'folder-1', type: 'folder', value: 'Folder', name: 'Folder' };
|
|
46
46
|
const result = buildTree([folder]);
|
|
47
47
|
expect(result.folders?.Folder.item?.id).toBe('folder-1');
|
|
48
48
|
});
|
|
@@ -52,7 +52,7 @@ describe('buildTree', () => {
|
|
|
52
52
|
expect(result.leaves).toEqual([item]);
|
|
53
53
|
});
|
|
54
54
|
it('handles markdown items', () => {
|
|
55
|
-
const markdown = { id: 'md-1', type: 'markdown', value: '# Hello'
|
|
55
|
+
const markdown = { id: 'md-1', type: 'markdown', value: '# Hello' };
|
|
56
56
|
const result = buildTree([markdown]);
|
|
57
57
|
expect(result.leaves).toEqual([markdown]);
|
|
58
58
|
});
|
|
@@ -63,7 +63,7 @@ describe('buildTree', () => {
|
|
|
63
63
|
expect(result.leaves).toHaveLength(2);
|
|
64
64
|
});
|
|
65
65
|
it('handles multiple items in the same folder', () => {
|
|
66
|
-
const folder = { id: 'f1', type: 'folder', value: 'Alerts', name: 'Alerts'
|
|
66
|
+
const folder = { id: 'f1', type: 'folder', value: 'Alerts', name: 'Alerts' };
|
|
67
67
|
const a = { id: 'a', type: 'hit', value: 'hit-a', parent: 'f1' };
|
|
68
68
|
const b = { id: 'b', type: 'hit', value: 'hit-b', parent: 'f1' };
|
|
69
69
|
const result = buildTree([folder, a, b]);
|
|
@@ -75,7 +75,7 @@ describe('buildTree', () => {
|
|
|
75
75
|
expect(result.leaves?.[0].name).toBe('My Hit');
|
|
76
76
|
});
|
|
77
77
|
it('preserves all item fields on leaves', () => {
|
|
78
|
-
const rich = { id: 'r1', type: 'reference', value: 'https://example.com', name: 'Example'
|
|
78
|
+
const rich = { id: 'r1', type: 'reference', value: 'https://example.com', name: 'Example' };
|
|
79
79
|
const result = buildTree([rich]);
|
|
80
80
|
expect(result.leaves?.[0]).toEqual(rich);
|
|
81
81
|
});
|
|
@@ -25,4 +25,4 @@ export declare const buildObservableEntries: (_case: Case, records: (Hit | Event
|
|
|
25
25
|
*/
|
|
26
26
|
export declare const classifyRole: (value: string, _case: Case, records: Partial<Hit | Event>[]) => ObservableRole;
|
|
27
27
|
/** Resolve source metadata for an observable's record IDs */
|
|
28
|
-
export declare const resolveSource: (record: Hit | Event, _case: Case) => ObservableSource;
|
|
28
|
+
export declare const resolveSource: (record: Hit | Event, _case: Case) => ObservableSource | null;
|
|
@@ -37,14 +37,15 @@ export const buildObservableEntries = (_case, records) => {
|
|
|
37
37
|
map[key] = { type, value, sources: [], role: classifyRole(value, _case, records) };
|
|
38
38
|
}
|
|
39
39
|
const entry = map[key];
|
|
40
|
-
|
|
40
|
+
const sources = (entry.sources ??= []);
|
|
41
|
+
if (sources.some(existingSource => existingSource.id === recordId)) {
|
|
41
42
|
continue;
|
|
42
43
|
}
|
|
43
44
|
const source = resolveSource(record, _case);
|
|
44
45
|
if (!source) {
|
|
45
46
|
continue;
|
|
46
47
|
}
|
|
47
|
-
|
|
48
|
+
sources.push(source);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
return Object.values(map).filter(Boolean);
|
|
@@ -20,7 +20,14 @@ const useCase = ({ caseId, case: providedCase }) => {
|
|
|
20
20
|
if (caseId) {
|
|
21
21
|
setLoading(true);
|
|
22
22
|
void dispatchApi(api.v2.case.get(caseId), { throwError: false })
|
|
23
|
-
.then(
|
|
23
|
+
.then(fetchedCase => {
|
|
24
|
+
if (!fetchedCase) {
|
|
25
|
+
setCase(undefined);
|
|
26
|
+
setMissing(true);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
setCase(fetchedCase);
|
|
30
|
+
})
|
|
24
31
|
.finally(() => setLoading(false));
|
|
25
32
|
}
|
|
26
33
|
}, [caseId, dispatchApi]);
|
|
@@ -44,7 +51,12 @@ const useCase = ({ caseId, case: providedCase }) => {
|
|
|
44
51
|
}
|
|
45
52
|
try {
|
|
46
53
|
if (publish) {
|
|
47
|
-
|
|
54
|
+
const updatedCase = await dispatchApi(api.v2.case.put(activeCaseId, _updatedCase));
|
|
55
|
+
if (!updatedCase) {
|
|
56
|
+
setMissing(true);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
setCase(updatedCase);
|
|
48
60
|
}
|
|
49
61
|
else {
|
|
50
62
|
setCase(prevCase => {
|
|
@@ -238,7 +238,7 @@ describe('AddToCaseModal', () => {
|
|
|
238
238
|
name: `${MOCK_HIT_1.howler.analytic} (${MOCK_HIT_1.howler.id})`,
|
|
239
239
|
value: MOCK_HIT_1.howler.id,
|
|
240
240
|
type: 'hit',
|
|
241
|
-
parent:
|
|
241
|
+
parent: undefined
|
|
242
242
|
}));
|
|
243
243
|
});
|
|
244
244
|
it('includes the selected folder id as parent in the submitted item', async () => {
|
|
@@ -2,7 +2,7 @@ import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case'
|
|
|
2
2
|
import { type FC } from 'react';
|
|
3
3
|
interface AddItemToCaseModalProps {
|
|
4
4
|
case: Case;
|
|
5
|
-
parentId?: string
|
|
5
|
+
parentId?: string;
|
|
6
6
|
onUpdated?: (updatedCase: Case) => void;
|
|
7
7
|
}
|
|
8
8
|
declare const AddToCaseModal: FC<AddItemToCaseModalProps>;
|
|
@@ -12,7 +12,7 @@ const ITEM_TYPES = [
|
|
|
12
12
|
{ value: 'reference', labelKey: 'modal.cases.add_item.type.link' },
|
|
13
13
|
{ value: 'markdown', labelKey: 'modal.cases.add_item.type.markdown' }
|
|
14
14
|
];
|
|
15
|
-
const AddToCaseModal = ({ case: _case, parentId
|
|
15
|
+
const AddToCaseModal = ({ case: _case, parentId, onUpdated }) => {
|
|
16
16
|
const { t } = useTranslation();
|
|
17
17
|
const theme = useTheme();
|
|
18
18
|
const monaco = useMonaco();
|
|
@@ -67,6 +67,6 @@ const AddToCaseModal = ({ case: _case, parentId = null, onUpdated }) => {
|
|
|
67
67
|
if (option) {
|
|
68
68
|
setItemType(option);
|
|
69
69
|
}
|
|
70
|
-
}, options: ITEM_TYPES, getOptionLabel: opt => t(opt.labelKey), isOptionEqualToValue: (option, choice) => option.value === choice.value, disablePortal: true, disableClearable: true, renderInput: params => (_jsx(TextField, { ...params, size: "small", label: t('modal.cases.add_item.type'), sx: { minWidth: '175px' } })) }), _jsx(TextField, { size: "small", label: t('modal.cases.add_item.title'), value: title, onChange: ev => setTitle(ev.target.value), fullWidth: true })] }), itemType.value === 'reference' && (_jsx(TextField, { size: "small", label: t('modal.cases.add_item.url'), value: value, onChange: ev => setValue(ev.target.value), fullWidth: true, placeholder: "https://example.com" })), itemType.value === 'markdown' && (_jsx(Box, { sx: { border: 'thin solid', borderColor: theme.palette.divider }, children: _jsx(ThemedEditor, { id: "add-item-markdown", height: "240px", width: "100%", language: "markdown", theme: theme.palette.mode === 'light' ? 'howler' : 'howler-dark', value: value, onChange: content => setValue(content ?? ''), options: {} }) })), folderOptions.length > 0 && (_jsx(Autocomplete, { options: folderOptions, getOptionLabel: opt => opt.label, isOptionEqualToValue: (opt, val) => opt.id === val.id, value: folderOptions.find(f => f.id === selectedParent)
|
|
70
|
+
}, options: ITEM_TYPES, getOptionLabel: opt => t(opt.labelKey), isOptionEqualToValue: (option, choice) => option.value === choice.value, disablePortal: true, disableClearable: true, renderInput: params => (_jsx(TextField, { ...params, size: "small", label: t('modal.cases.add_item.type'), sx: { minWidth: '175px' } })) }), _jsx(TextField, { size: "small", label: t('modal.cases.add_item.title'), value: title, onChange: ev => setTitle(ev.target.value), fullWidth: true })] }), itemType.value === 'reference' && (_jsx(TextField, { size: "small", label: t('modal.cases.add_item.url'), value: value, onChange: ev => setValue(ev.target.value), fullWidth: true, placeholder: "https://example.com" })), itemType.value === 'markdown' && (_jsx(Box, { sx: { border: 'thin solid', borderColor: theme.palette.divider }, children: _jsx(ThemedEditor, { id: "add-item-markdown", height: "240px", width: "100%", language: "markdown", theme: theme.palette.mode === 'light' ? 'howler' : 'howler-dark', value: value, onChange: content => setValue(content ?? ''), options: {} }) })), folderOptions.length > 0 && (_jsx(Autocomplete, { options: folderOptions, getOptionLabel: opt => opt.label, isOptionEqualToValue: (opt, val) => opt.id === val.id, value: folderOptions.find(f => f.id === selectedParent), disablePortal: true, onChange: (_ev, newVal) => setSelectedParent(newVal?.id), renderInput: params => (_jsx(TextField, { ...params, size: "small", label: t('modal.cases.add_item.folder'), placeholder: t('modal.cases.add_item.root'), fullWidth: true })) })), _jsxs(Stack, { direction: "row", spacing: 1, alignSelf: "end", children: [_jsx(Button, { variant: "outlined", color: "error", onClick: close, disabled: submitting, children: t('cancel') }), _jsx(Button, { variant: "outlined", color: "success", disabled: !isValid || submitting, startIcon: submitting ? _jsx(CircularProgress, { size: 16, color: "inherit" }) : undefined, onClick: onSubmit, children: t('confirm') })] })] }));
|
|
71
71
|
};
|
|
72
72
|
export default AddToCaseModal;
|
|
@@ -248,7 +248,7 @@ describe('CreateCaseModal', () => {
|
|
|
248
248
|
name: `${MOCK_HIT_1.howler.analytic} (${MOCK_HIT_1.howler.id})`,
|
|
249
249
|
value: MOCK_HIT_1.howler.id,
|
|
250
250
|
type: 'hit',
|
|
251
|
-
parent:
|
|
251
|
+
parent: undefined
|
|
252
252
|
}));
|
|
253
253
|
});
|
|
254
254
|
it('uses a custom edited item title in the name', async () => {
|
|
@@ -11,11 +11,12 @@ import HitCard from '@cccsaurora/howler-ui/components/elements/hit/HitCard';
|
|
|
11
11
|
import { HitLayout } from '@cccsaurora/howler-ui/components/elements/hit/HitLayout';
|
|
12
12
|
import useHitActions from '@cccsaurora/howler-ui/components/hooks/useHitActions';
|
|
13
13
|
import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
|
|
14
|
-
import {
|
|
14
|
+
import { uniq } from 'lodash-es';
|
|
15
15
|
import { useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
16
16
|
import { useTranslation } from 'react-i18next';
|
|
17
|
-
import { Link } from 'react-router
|
|
17
|
+
import { Link } from 'react-router';
|
|
18
18
|
import { useContextSelector } from 'use-context-selector';
|
|
19
|
+
import { notNil } from '@cccsaurora/howler-ui/utils/utils';
|
|
19
20
|
import useCase from '../hooks/useCase';
|
|
20
21
|
const HitEntry = ({ hit, checked, onChange }) => {
|
|
21
22
|
if (!hit) {
|
|
@@ -28,7 +29,7 @@ const HitEntry = ({ hit, checked, onChange }) => {
|
|
|
28
29
|
'& > *': {
|
|
29
30
|
margin: '0 !important'
|
|
30
31
|
}
|
|
31
|
-
}, children: _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, pr: 1, width: "100%", children: [
|
|
32
|
+
}, children: _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, pr: 1, width: "100%", children: [notNil(checked) && (_jsx(Checkbox, { size: "small", checked: checked, onClick: e => {
|
|
32
33
|
onChange?.();
|
|
33
34
|
e.preventDefault();
|
|
34
35
|
e.stopPropagation();
|
|
@@ -104,14 +105,16 @@ const ResolveModal = ({ case: _case, onConfirm }) => {
|
|
|
104
105
|
query: `howler.id:(${hitIds.join(' OR ')})`,
|
|
105
106
|
metadata: ['analytic']
|
|
106
107
|
}));
|
|
107
|
-
|
|
108
|
+
if (result) {
|
|
109
|
+
loadRecords(result.items);
|
|
110
|
+
}
|
|
108
111
|
}
|
|
109
112
|
finally {
|
|
110
113
|
setLoading(false);
|
|
111
114
|
}
|
|
112
115
|
})();
|
|
113
116
|
}, [dispatchApi, hitIds, loadRecords]);
|
|
114
|
-
return (_jsxs(Stack, { spacing: 1, alignItems: "start", sx: { minWidth: 'min(1000px, 60vw)', maxHeight: '100%', height: '100%' }, children: [_jsx(Typography, { variant: "h4", children: t('modal.cases.resolve') }), _jsx(Typography, { children: t('modal.cases.resolve.description') }), _jsxs(Stack, { spacing: 1, overflow: "auto", width: "100%", flex: 1, children: [_jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Box, { flex: 1, children: _jsx(TextField, { size: "small", fullWidth: true, placeholder: t('modal.rationale.label'), "aria-label": t('modal.rationale.label'), value: rationale, onChange: ev => setRationale(ev.target.value) }) }), _jsx(Box, { flex: 1, children: _jsx(Autocomplete, { size: "small", value: assessment, onChange: (_ev, _assessment) => setAssessment(_assessment), options: config.lookups['howler.assessment'], disablePortal: true, renderInput: params => (_jsx(TextField, { ...params, placeholder: t('hit.details.actions.assessment'), "aria-label": t('hit.details.actions.assessment'), fullWidth: true })) }) }), _jsx(Button, { variant: "outlined", color: "primary", onClick: onAssess, disabled: selectedHitIds.size < 1 || !assessment, children: t('modal.cases.alerts.assess') })] }), _jsxs(Stack, { position: "relative", children: [_jsx(Divider, {}), _jsx(LinearProgress, { sx: { opacity: +loading } })] }), hits
|
|
117
|
+
return (_jsxs(Stack, { spacing: 1, alignItems: "start", sx: { minWidth: 'min(1000px, 60vw)', maxHeight: '100%', height: '100%' }, children: [_jsx(Typography, { variant: "h4", children: t('modal.cases.resolve') }), _jsx(Typography, { children: t('modal.cases.resolve.description') }), _jsxs(Stack, { spacing: 1, overflow: "auto", width: "100%", flex: 1, children: [_jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Box, { flex: 1, children: _jsx(TextField, { size: "small", fullWidth: true, placeholder: t('modal.rationale.label'), "aria-label": t('modal.rationale.label'), value: rationale, onChange: ev => setRationale(ev.target.value) }) }), _jsx(Box, { flex: 1, children: _jsx(Autocomplete, { size: "small", value: assessment, onChange: (_ev, _assessment) => setAssessment(_assessment), options: config.lookups?.['howler.assessment'] ?? [], disablePortal: true, renderInput: params => (_jsx(TextField, { ...params, placeholder: t('hit.details.actions.assessment'), "aria-label": t('hit.details.actions.assessment'), fullWidth: true })) }) }), _jsx(Button, { variant: "outlined", color: "primary", onClick: onAssess, disabled: selectedHitIds.size < 1 || !assessment, children: t('modal.cases.alerts.assess') })] }), _jsxs(Stack, { position: "relative", children: [_jsx(Divider, {}), _jsx(LinearProgress, { sx: { opacity: +loading } })] }), hits
|
|
115
118
|
.filter(hit => unresolvedHits.includes(hit.howler.id))
|
|
116
119
|
.map(hit => (_jsx(HitEntry, { hit: hit, checked: selectedHitIds.has(hit.howler.id), onChange: () => handleToggleHit(hit.howler.id) }, hit.howler.id))), _jsxs(Accordion, { variant: "outlined", children: [_jsx(AccordionSummary, { expandIcon: _jsx(KeyboardArrowDown, {}), children: t('modal.cases.alerts.resolved') }), _jsx(AccordionDetails, { children: _jsx(Stack, { spacing: 1, children: hits
|
|
117
120
|
.filter(hit => !unresolvedHits.includes(hit.howler.id))
|
|
@@ -7,7 +7,7 @@ import { ModalContext } from '@cccsaurora/howler-ui/components/app/providers/Mod
|
|
|
7
7
|
import { RecordContext } from '@cccsaurora/howler-ui/components/app/providers/RecordProvider';
|
|
8
8
|
import i18n from '@cccsaurora/howler-ui/i18n';
|
|
9
9
|
import { I18nextProvider } from 'react-i18next';
|
|
10
|
-
import { MemoryRouter } from 'react-router
|
|
10
|
+
import { MemoryRouter } from 'react-router';
|
|
11
11
|
import { createMockCase, createMockHit } from '@cccsaurora/howler-ui/tests/utils';
|
|
12
12
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
13
13
|
import ResolveModal from './ResolveModal';
|
|
@@ -46,9 +46,6 @@ vi.mock('api', () => ({
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
}));
|
|
49
|
-
vi.mock('commons/components/app/hooks/useAppUser', () => ({
|
|
50
|
-
useAppUser: () => ({ user: { username: 'test-user' } })
|
|
51
|
-
}));
|
|
52
49
|
// ---------------------------------------------------------------------------
|
|
53
50
|
// Fixtures
|
|
54
51
|
// ---------------------------------------------------------------------------
|
|
@@ -64,7 +61,10 @@ const HIT_2 = makeUnresolvedHit('hit-2');
|
|
|
64
61
|
const HIT_RESOLVED = makeResolvedHit('hit-resolved');
|
|
65
62
|
const caseWithHits = (hitIds) => createMockCase({
|
|
66
63
|
case_id: 'case-1',
|
|
67
|
-
items: hitIds.map(id => ({
|
|
64
|
+
items: hitIds.map(id => ({
|
|
65
|
+
type: 'hit',
|
|
66
|
+
value: id
|
|
67
|
+
}))
|
|
68
68
|
});
|
|
69
69
|
// ---------------------------------------------------------------------------
|
|
70
70
|
// Wrapper factory
|
|
@@ -24,9 +24,8 @@ export const useFolderOptions = (selectedCase) => {
|
|
|
24
24
|
// Hook
|
|
25
25
|
// ---------------------------------------------------------------------------
|
|
26
26
|
export const useRecordEntries = (records) => {
|
|
27
|
-
const [entries, setEntries] = useState(() => (records ?? []).map(record => ({
|
|
27
|
+
const [entries, setEntries] = useState(() => (records ?? []).map((record) => ({
|
|
28
28
|
record,
|
|
29
|
-
parent: null,
|
|
30
29
|
name: defaultTitle(record)
|
|
31
30
|
})));
|
|
32
31
|
const updateEntry = useCallback((index, field, value) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useAppUser } from '@tui/core';
|
|
2
3
|
import { Person } from '@mui/icons-material';
|
|
3
4
|
import { AvatarGroup, Checkbox, Divider, FormControlLabel, Stack, Typography } from '@mui/material';
|
|
4
|
-
import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks';
|
|
5
5
|
import { UserListContext } from '@cccsaurora/howler-ui/components/app/providers/UserListProvider';
|
|
6
6
|
import ChipPopper from '@cccsaurora/howler-ui/components/elements/display/ChipPopper';
|
|
7
7
|
import HowlerAvatar from '@cccsaurora/howler-ui/components/elements/display/HowlerAvatar';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/// <reference types="vitest" />
|
|
3
|
+
// @ts-nocheck
|
|
3
4
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
4
5
|
import userEvent, {} from '@testing-library/user-event';
|
|
5
6
|
import { UserListContext } from '@cccsaurora/howler-ui/components/app/providers/UserListProvider';
|
|
@@ -11,9 +12,13 @@ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
|
11
12
|
// ---------------------------------------------------------------------------
|
|
12
13
|
// Hoisted mocks
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
|
-
vi.mock('
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
vi.mock('@tui/core', async () => {
|
|
16
|
+
const actual = await vi.importActual('@tui/core');
|
|
17
|
+
return {
|
|
18
|
+
...actual,
|
|
19
|
+
useAppUser: () => ({ user: { username: 'alice', name: 'Alice Smith' } })
|
|
20
|
+
};
|
|
21
|
+
});
|
|
17
22
|
// Stub HowlerAvatar to avoid avatar API calls
|
|
18
23
|
vi.mock('components/elements/display/HowlerAvatar', () => ({
|
|
19
24
|
default: ({ userId }) => _jsx("div", { id: `avatar-${userId}`, children: userId })
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
/// <reference types="vitest" />
|
|
3
|
+
// @ts-nocheck
|
|
3
4
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
4
5
|
import userEvent, {} from '@testing-library/user-event';
|
|
5
6
|
import i18n from '@cccsaurora/howler-ui/i18n';
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
export const buildPathFromID = (_case, itemId) => {
|
|
2
2
|
const item = _case.items?.find(i => i.id === itemId);
|
|
3
|
-
if (!item)
|
|
3
|
+
if (!item) {
|
|
4
4
|
return itemId;
|
|
5
|
+
}
|
|
5
6
|
const name = item.name ?? item.value ?? itemId;
|
|
6
|
-
if (!item.parent)
|
|
7
|
+
if (!item.parent) {
|
|
7
8
|
return name;
|
|
9
|
+
}
|
|
8
10
|
const parentPath = buildPathFromID(_case, item.parent);
|
|
9
11
|
return `${parentPath}/${name}`;
|
|
10
12
|
};
|
|
11
|
-
export const getIDFromPath = (_case, path) => {
|
|
12
|
-
if (!_case.items)
|
|
13
|
-
return null;
|
|
14
|
-
for (const item of _case.items) {
|
|
15
|
-
const itemPath = buildPathFromID(_case, item.id);
|
|
16
|
-
if (itemPath === path) {
|
|
17
|
-
return item.id;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return null;
|
|
21
|
-
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Delete, Language, ManageSearch, Person } from '@mui/icons-material';
|
|
3
3
|
import { Box, Card, Chip, Divider, Grid, IconButton, Stack, Tooltip, Typography } from '@mui/material';
|
|
4
|
-
import
|
|
4
|
+
import Members from '@cccsaurora/howler-ui/components/elements/membership/Members';
|
|
5
5
|
import { isEmpty } from 'lodash-es';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
|
-
import { Link } from 'react-router
|
|
7
|
+
import { Link } from 'react-router';
|
|
8
8
|
const DossierCard = ({ dossier, className, onDelete }) => {
|
|
9
9
|
const { t, i18n } = useTranslation();
|
|
10
|
-
return (_jsx(Card, { variant: "outlined", sx: { p: 1, mb: 1 }, className: className, children: _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, sx: { '& > *': { flexShrink: 0 } }, children: [_jsxs(Stack, { sx: { flex: 1 }, children: [_jsxs(Typography, { variant: "body1", display: "flex", alignItems: "start", children: [_jsx(Tooltip, { title: t(`route.dossiers.manager.${dossier.type}`), children: dossier.type === 'personal' ? _jsx(Person, { fontSize: "small" }) : _jsx(Language, { fontSize: "small" }) })
|
|
10
|
+
return (_jsx(Card, { variant: "outlined", sx: { p: 1, mb: 1 }, className: className, children: _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, sx: { '& > *': { flexShrink: 0 } }, children: [_jsxs(Stack, { sx: { flex: 1 }, children: [_jsxs(Typography, { variant: "body1", display: "flex", alignItems: "start", children: [_jsx(Box, { component: "span", mr: 1, children: dossier.title }), _jsx(Tooltip, { title: t(`route.dossiers.manager.${dossier.type}`), children: dossier.type === 'personal' ? _jsx(Person, { fontSize: "small" }) : _jsx(Language, { fontSize: "small" }) })] }), _jsx(Typography, { variant: "caption", color: "text.secondary", children: _jsx("code", { children: dossier.query }) }), _jsxs(Grid, { container: true, spacing: 1, sx: { mt: 1 }, children: [dossier.leads?.map((lead, index) => (_jsx(Grid, { children: _jsx(Chip, { sx: { maxWidth: '300px' }, clickable: true, label: `${lead.label?.[i18n.language] ?? t('unknown')} (${lead.format})`, size: "small", component: Link, to: `/dossiers/${dossier.dossier_id}/edit?tab=leads&lead=${index}`, onClick: e => e.stopPropagation() }) }, lead.format + (lead.label?.en ?? '')))), !isEmpty(dossier.leads) && !isEmpty(dossier.pivots) && (_jsx(Grid, { children: _jsx(Divider, { orientation: "vertical" }) })), dossier.pivots?.map((pivot, index) => (_jsx(Grid, { children: _jsx(Chip, { sx: { maxWidth: '300px' }, clickable: true, label: `${pivot.label?.[i18n.language] ?? t('unknown')} (${pivot.format})`, size: "small", component: Link, to: `/dossiers/${dossier.dossier_id}/edit?tab=pivots&pivot=${index}`, onClick: (e) => e.stopPropagation() }) }, pivot.format + (pivot.label?.en ?? ''))))] })] }), _jsx(Members, { item: dossier }), _jsx(Tooltip, { title: t('route.dossiers.manager.openinsearch'), children: _jsx(IconButton, { component: Link, to: `/search?query=${dossier.query}`, onClick: (e) => e.stopPropagation(), children: _jsx(ManageSearch, {}) }) }), onDelete && (_jsx(Tooltip, { title: t('route.dossiers.manager.delete'), children: _jsx(IconButton, { onClick: e => onDelete(e, dossier.dossier_id), children: _jsx(Delete, {}) }) }))] }) }, dossier.dossier_id));
|
|
11
11
|
};
|
|
12
12
|
export default DossierCard;
|
|
@@ -9,10 +9,10 @@ import { I18nextProvider } from 'react-i18next';
|
|
|
9
9
|
import { createMockDossier } from '@cccsaurora/howler-ui/tests/utils';
|
|
10
10
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
11
11
|
import DossierCard from './DossierCard';
|
|
12
|
-
// Mock react-router
|
|
12
|
+
// Mock react-router
|
|
13
13
|
const mockNavigate = vi.hoisted(() => vi.fn());
|
|
14
|
-
vi.mock('react-router
|
|
15
|
-
const actual = await vi.importActual('react-router
|
|
14
|
+
vi.mock('react-router', async () => {
|
|
15
|
+
const actual = await vi.importActual('react-router');
|
|
16
16
|
return {
|
|
17
17
|
...actual,
|
|
18
18
|
useNavigate: () => mockNavigate,
|
|
@@ -107,7 +107,7 @@ describe('DossierCard', () => {
|
|
|
107
107
|
const dossier = createMockDossier({ owner: 'john.doe' });
|
|
108
108
|
render(_jsx(DossierCard, { dossier: dossier }), { wrapper: Wrapper });
|
|
109
109
|
await waitFor(() => {
|
|
110
|
-
expect(screen.getByLabelText('john.doe')).toBeInTheDocument();
|
|
110
|
+
expect(screen.getByLabelText('Owner - john.doe')).toBeInTheDocument();
|
|
111
111
|
});
|
|
112
112
|
});
|
|
113
113
|
it('should display delete button when onDelete is provided', async () => {
|
|
@@ -457,7 +457,7 @@ describe('DossierCard', () => {
|
|
|
457
457
|
expect(screen.getByText('Complete Dossier')).toBeInTheDocument();
|
|
458
458
|
expect(screen.getByText('howler.status:open AND howler.assigned:me')).toBeInTheDocument();
|
|
459
459
|
expect(screen.getByLabelText(/personal/i)).toBeInTheDocument();
|
|
460
|
-
expect(screen.getByLabelText('admin')).toBeInTheDocument();
|
|
460
|
+
expect(screen.getByLabelText('Owner - admin')).toBeInTheDocument();
|
|
461
461
|
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
462
462
|
expect(screen.getByText(/Lead 1/)).toBeInTheDocument();
|
|
463
463
|
expect(screen.getByText(/Pivot 1/)).toBeInTheDocument();
|
|
@@ -486,7 +486,7 @@ describe('DossierCard', () => {
|
|
|
486
486
|
for (const owner of owners) {
|
|
487
487
|
rerender(_jsx(DossierCard, { dossier: createMockDossier({ owner }) }));
|
|
488
488
|
await waitFor(() => {
|
|
489
|
-
expect(screen.getByLabelText(owner)).toBeInTheDocument();
|
|
489
|
+
expect(screen.getByLabelText(`Owner - ${owner}`)).toBeInTheDocument();
|
|
490
490
|
});
|
|
491
491
|
}
|
|
492
492
|
});
|