@cccsaurora/howler-ui 2.19.0-dev.842 → 2.19.0-dev.897
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/index.d.ts +0 -4
- package/api/index.js +2 -10
- package/api/search/facet/hit.d.ts +3 -1
- package/api/search/facet/index.d.ts +1 -3
- package/api/search/index.d.ts +1 -2
- package/api/search/index.js +1 -2
- package/commons/components/leftnav/LeftNavDrawer.js +1 -1
- package/components/app/App.js +8 -41
- package/components/app/hooks/useMatchers.d.ts +1 -1
- package/components/app/hooks/useMatchers.js +11 -23
- package/components/app/hooks/useMatchers.test.js +22 -22
- package/components/app/hooks/useTitle.js +5 -5
- package/components/app/providers/FavouritesProvider.js +2 -2
- package/components/app/providers/HitProvider.d.ts +22 -0
- package/components/app/providers/{RecordProvider.js → HitProvider.js} +41 -41
- package/components/app/providers/{RecordSearchProvider.d.ts → HitSearchProvider.d.ts} +6 -6
- package/components/app/providers/{RecordSearchProvider.js → HitSearchProvider.js} +17 -12
- package/components/app/providers/{RecordSearchProvider.test.js → HitSearchProvider.test.js} +71 -52
- package/components/app/providers/ModalProvider.d.ts +0 -1
- package/components/app/providers/ParameterProvider.d.ts +2 -9
- package/components/app/providers/ParameterProvider.js +240 -165
- package/components/app/providers/ParameterProvider.test.js +94 -346
- package/components/app/providers/SocketProvider.d.ts +2 -11
- package/components/app/providers/SocketProvider.js +5 -18
- package/components/app/providers/UserListProvider.js +8 -28
- package/components/elements/PluginTypography.d.ts +1 -2
- package/components/elements/PluginTypography.js +2 -3
- package/components/elements/UserList.d.ts +2 -5
- package/components/elements/UserList.js +8 -18
- package/components/elements/addons/search/phrase/Phrase.js +1 -1
- package/components/elements/display/ChipPopper.d.ts +1 -1
- package/components/elements/display/ChipPopper.js +5 -5
- package/components/elements/display/HowlerCard.js +1 -1
- package/components/elements/display/Modal.js +0 -2
- package/components/elements/display/icons/BundleButton.d.ts +6 -0
- package/components/elements/display/icons/BundleButton.js +32 -0
- package/components/elements/hit/HitActions.js +4 -4
- package/components/elements/hit/HitBanner.d.ts +0 -1
- package/components/elements/hit/HitBanner.js +47 -29
- package/components/elements/hit/HitCard.d.ts +0 -2
- package/components/elements/hit/HitCard.js +7 -7
- package/components/elements/{record/RecordComments.d.ts → hit/HitComments.d.ts} +4 -5
- package/components/elements/{record/RecordComments.js → hit/HitComments.js} +28 -29
- package/components/elements/{ObjectDetails.js → hit/HitDetails.js} +17 -17
- package/components/elements/hit/HitLabels.js +2 -2
- package/components/elements/hit/HitOutline.d.ts +0 -1
- package/components/elements/hit/HitOutline.js +3 -3
- package/components/elements/hit/{HitPreview.d.ts → HitQuickSearch.d.ts} +3 -3
- package/components/elements/hit/{HitPreview.js → HitQuickSearch.js} +4 -10
- package/components/elements/hit/HitRelated.d.ts +6 -0
- package/components/elements/hit/HitRelated.js +7 -0
- package/components/elements/hit/HitSummary.d.ts +1 -2
- package/components/elements/hit/HitSummary.js +5 -6
- package/components/elements/{record/RecordWorklog.d.ts → hit/HitWorklog.d.ts} +3 -4
- package/components/elements/{record/RecordWorklog.js → hit/HitWorklog.js} +13 -15
- package/components/elements/hit/aggregate/HitGraph.js +8 -8
- package/components/elements/hit/elements/Assigned.js +3 -6
- package/components/elements/hit/outlines/DefaultOutline.js +1 -1
- package/components/elements/view/ViewTitle.d.ts +0 -1
- package/components/elements/view/ViewTitle.js +2 -9
- package/components/hooks/useHitActions.d.ts +1 -1
- package/components/hooks/useHitActions.js +4 -4
- package/components/hooks/{useRecordSelection.d.ts → useHitSelection.d.ts} +2 -2
- package/components/hooks/{useRecordSelection.js → useHitSelection.js} +33 -12
- package/components/hooks/useMyPreferences.js +1 -10
- package/components/hooks/useMySearch.js +2 -2
- package/components/hooks/useMySitemap.js +1 -4
- package/components/hooks/useMyTheme.js +2 -9
- package/components/routes/action/edit/ActionEditor.js +2 -2
- package/components/routes/action/view/ActionSearch.js +1 -1
- package/components/routes/advanced/QueryBuilder.js +1 -1
- package/components/routes/advanced/QueryEditor.js +3 -3
- package/components/routes/advanced/historyCompletionProvider.js +3 -3
- package/components/routes/analytics/AnalyticDetails.js +2 -2
- package/components/routes/analytics/AnalyticSearch.js +1 -1
- package/components/routes/dossiers/DossierEditor.js +2 -2
- package/components/routes/dossiers/DossierEditor.test.js +1 -1
- package/components/routes/help/ApiDocumentation.js +1 -1
- package/components/routes/help/BundleDocumentation.d.ts +3 -0
- package/components/routes/help/BundleDocumentation.js +12 -0
- package/components/routes/help/HitBannerDocumentation.js +0 -1
- package/components/routes/help/HitDocumentation.js +3 -1
- package/components/routes/help/markdown/en/bundles.md.js +1 -0
- package/components/routes/help/markdown/fr/bundles.md.js +1 -0
- package/components/routes/hits/search/BundleParentMenu.d.ts +6 -0
- package/components/routes/hits/search/BundleParentMenu.js +32 -0
- package/components/routes/hits/search/BundleScroller.d.ts +2 -0
- package/components/routes/hits/search/BundleScroller.js +6 -0
- package/components/routes/hits/search/{RecordBrowser.js → HitBrowser.js} +9 -9
- package/components/{elements/record/RecordContextMenu.d.ts → routes/hits/search/HitContextMenu.d.ts} +3 -3
- package/components/routes/hits/search/HitContextMenu.js +239 -0
- package/components/{elements/record/RecordContextMenu.test.js → routes/hits/search/HitContextMenu.test.js} +43 -98
- package/components/routes/hits/search/{RecordQuery.d.ts → HitQuery.d.ts} +2 -2
- package/components/routes/hits/search/{RecordQuery.js → HitQuery.js} +6 -6
- package/components/routes/hits/search/InformationPane.d.ts +0 -1
- package/components/routes/hits/search/InformationPane.js +63 -50
- package/components/routes/hits/search/LayoutSettings.js +3 -3
- package/components/routes/hits/search/QuerySettings.js +1 -2
- package/components/routes/hits/search/QuerySettings.test.js +9 -14
- package/components/routes/hits/search/SearchPane.js +49 -26
- package/components/routes/hits/search/ViewLink.js +3 -3
- package/components/routes/hits/search/ViewLink.test.js +8 -8
- package/components/routes/hits/search/grid/AddColumnModal.js +4 -5
- package/components/routes/hits/search/grid/EnhancedCell.d.ts +1 -2
- package/components/routes/hits/search/grid/EnhancedCell.js +2 -2
- package/components/routes/hits/search/grid/HitGrid.js +18 -20
- package/components/routes/hits/search/grid/{RecordRow.d.ts → HitRow.d.ts} +2 -3
- package/components/routes/hits/search/grid/{RecordRow.js → HitRow.js} +8 -10
- package/components/routes/hits/view/HitViewer.js +13 -12
- package/components/routes/home/ViewCard.js +41 -47
- package/components/{elements/MarkdownEditor.js → routes/overviews/OverviewEditor.js} +3 -3
- package/components/routes/overviews/OverviewViewer.js +2 -2
- package/components/routes/views/ViewComposer.js +19 -46
- package/locales/en/translation.json +3 -122
- package/locales/fr/translation.json +3 -120
- package/models/WithMetadata.d.ts +1 -2
- package/models/entities/generated/{ThreatEnrichment.d.ts → Enrichment.d.ts} +1 -1
- package/models/entities/generated/Hit.d.ts +0 -1
- package/models/entities/generated/Howler.d.ts +5 -0
- package/models/entities/generated/Rule.d.ts +9 -6
- package/models/entities/generated/Threat.d.ts +2 -2
- package/models/entities/generated/View.d.ts +0 -1
- package/package.json +121 -141
- package/plugins/clue/components/ClueTypography.js +2 -2
- package/plugins/clue/utils.d.ts +1 -2
- package/tests/mocks.d.ts +1 -11
- package/tests/mocks.js +7 -12
- package/tests/server-handlers.js +1 -6
- package/tests/utils.d.ts +0 -4
- package/tests/utils.js +0 -20
- package/utils/constants.d.ts +3 -4
- package/utils/constants.js +0 -6
- package/utils/hitFunctions.d.ts +1 -2
- package/utils/hitFunctions.js +4 -4
- package/utils/socketUtils.d.ts +0 -14
- package/utils/socketUtils.js +1 -17
- package/utils/viewUtils.js +0 -3
- package/api/search/case.d.ts +0 -4
- package/api/search/case.js +0 -8
- package/api/socket/index.d.ts +0 -3
- package/api/socket/index.js +0 -6
- package/api/socket/viewers.d.ts +0 -2
- package/api/socket/viewers.js +0 -8
- package/api/socket/viewers.test.js +0 -44
- package/api/v2/case/index.d.ts +0 -9
- package/api/v2/case/index.js +0 -21
- package/api/v2/case/items.d.ts +0 -6
- package/api/v2/case/items.js +0 -18
- package/api/v2/case/rules.d.ts +0 -6
- package/api/v2/case/rules.js +0 -18
- package/api/v2/index.d.ts +0 -4
- package/api/v2/index.js +0 -6
- package/api/v2/search/facet.d.ts +0 -3
- package/api/v2/search/facet.js +0 -12
- package/api/v2/search/index.d.ts +0 -5
- package/api/v2/search/index.js +0 -24
- package/components/app/providers/RecordProvider.d.ts +0 -23
- package/components/elements/ContextMenu.d.ts +0 -56
- package/components/elements/ContextMenu.js +0 -109
- package/components/elements/ContextMenu.test.d.ts +0 -1
- package/components/elements/ContextMenu.test.js +0 -215
- package/components/elements/ObjectDetails.d.ts +0 -6
- package/components/elements/case/CaseCard.d.ts +0 -12
- package/components/elements/case/CaseCard.js +0 -42
- package/components/elements/case/CasePreview.d.ts +0 -6
- package/components/elements/case/CasePreview.js +0 -17
- package/components/elements/case/StatusIcon.d.ts +0 -5
- package/components/elements/case/StatusIcon.js +0 -13
- package/components/elements/hit/elements/AnalyticLink.d.ts +0 -9
- package/components/elements/hit/elements/AnalyticLink.js +0 -22
- package/components/elements/hit/elements/Assigned.test.d.ts +0 -1
- package/components/elements/hit/elements/Assigned.test.js +0 -65
- package/components/elements/hit/related/RelatedRecords.js +0 -63
- package/components/elements/observable/ObservableCard.d.ts +0 -6
- package/components/elements/observable/ObservableCard.js +0 -22
- package/components/elements/observable/ObservablePreview.d.ts +0 -6
- package/components/elements/observable/ObservablePreview.js +0 -12
- package/components/elements/record/RecordContextMenu.js +0 -268
- package/components/elements/record/RecordContextMenu.test.d.ts +0 -1
- package/components/elements/record/RecordRelated.d.ts +0 -7
- package/components/elements/record/RecordRelated.js +0 -34
- package/components/hooks/useRelatedRecords.d.ts +0 -13
- package/components/hooks/useRelatedRecords.js +0 -32
- package/components/routes/cases/CaseViewer.d.ts +0 -2
- package/components/routes/cases/CaseViewer.js +0 -44
- package/components/routes/cases/CaseViewer.test.d.ts +0 -1
- package/components/routes/cases/CaseViewer.test.js +0 -133
- package/components/routes/cases/Cases.d.ts +0 -2
- package/components/routes/cases/Cases.js +0 -148
- package/components/routes/cases/constants.d.ts +0 -6
- package/components/routes/cases/constants.js +0 -6
- package/components/routes/cases/detail/AlertPanel.d.ts +0 -6
- package/components/routes/cases/detail/AlertPanel.js +0 -33
- package/components/routes/cases/detail/CaseAssets.d.ts +0 -11
- package/components/routes/cases/detail/CaseAssets.js +0 -104
- package/components/routes/cases/detail/CaseAssets.test.d.ts +0 -1
- package/components/routes/cases/detail/CaseAssets.test.js +0 -167
- package/components/routes/cases/detail/CaseDashboard.d.ts +0 -7
- package/components/routes/cases/detail/CaseDashboard.js +0 -66
- package/components/routes/cases/detail/CaseDetails.d.ts +0 -6
- package/components/routes/cases/detail/CaseDetails.js +0 -70
- package/components/routes/cases/detail/CaseOverview.d.ts +0 -7
- package/components/routes/cases/detail/CaseOverview.js +0 -43
- package/components/routes/cases/detail/CaseRules.d.ts +0 -7
- package/components/routes/cases/detail/CaseRules.js +0 -57
- package/components/routes/cases/detail/CaseRules.test.d.ts +0 -1
- package/components/routes/cases/detail/CaseRules.test.js +0 -221
- package/components/routes/cases/detail/CaseSidebar.d.ts +0 -8
- package/components/routes/cases/detail/CaseSidebar.js +0 -107
- package/components/routes/cases/detail/CaseSidebar.test.d.ts +0 -1
- package/components/routes/cases/detail/CaseSidebar.test.js +0 -266
- package/components/routes/cases/detail/CaseTask.d.ts +0 -11
- package/components/routes/cases/detail/CaseTask.js +0 -66
- package/components/routes/cases/detail/CaseTimeline.d.ts +0 -12
- package/components/routes/cases/detail/CaseTimeline.js +0 -106
- package/components/routes/cases/detail/CaseTimeline.test.d.ts +0 -1
- package/components/routes/cases/detail/CaseTimeline.test.js +0 -320
- package/components/routes/cases/detail/CreateRuleDialog.d.ts +0 -9
- package/components/routes/cases/detail/CreateRuleDialog.js +0 -163
- package/components/routes/cases/detail/CreateRuleDialog.test.d.ts +0 -1
- package/components/routes/cases/detail/CreateRuleDialog.test.js +0 -259
- package/components/routes/cases/detail/ItemPage.d.ts +0 -6
- package/components/routes/cases/detail/ItemPage.js +0 -95
- package/components/routes/cases/detail/RelatedCasePanel.d.ts +0 -6
- package/components/routes/cases/detail/RelatedCasePanel.js +0 -34
- package/components/routes/cases/detail/TaskPanel.d.ts +0 -7
- package/components/routes/cases/detail/TaskPanel.js +0 -52
- package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +0 -11
- package/components/routes/cases/detail/aggregates/CaseAggregate.js +0 -24
- package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +0 -6
- package/components/routes/cases/detail/aggregates/SourceAggregate.js +0 -26
- package/components/routes/cases/detail/assets/Asset.d.ts +0 -14
- package/components/routes/cases/detail/assets/Asset.js +0 -12
- package/components/routes/cases/detail/assets/Asset.test.d.ts +0 -1
- package/components/routes/cases/detail/assets/Asset.test.js +0 -72
- package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +0 -20
- package/components/routes/cases/detail/sidebar/CaseFolder.js +0 -83
- package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +0 -1
- package/components/routes/cases/detail/sidebar/CaseFolder.test.js +0 -295
- package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +0 -34
- package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +0 -103
- package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +0 -1
- package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +0 -363
- package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +0 -25
- package/components/routes/cases/detail/sidebar/FolderEntry.js +0 -88
- package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +0 -1
- package/components/routes/cases/detail/sidebar/FolderEntry.test.js +0 -206
- package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +0 -5
- package/components/routes/cases/detail/sidebar/RootDropZone.js +0 -33
- package/components/routes/cases/detail/sidebar/types.d.ts +0 -9
- package/components/routes/cases/detail/sidebar/utils.d.ts +0 -3
- package/components/routes/cases/detail/sidebar/utils.js +0 -29
- package/components/routes/cases/detail/sidebar/utils.test.d.ts +0 -1
- package/components/routes/cases/detail/sidebar/utils.test.js +0 -82
- package/components/routes/cases/hooks/useCase.d.ts +0 -13
- package/components/routes/cases/hooks/useCase.js +0 -69
- package/components/routes/cases/hooks/useCase.test.d.ts +0 -1
- package/components/routes/cases/hooks/useCase.test.js +0 -141
- package/components/routes/cases/modals/AddToCaseModal.d.ts +0 -7
- package/components/routes/cases/modals/AddToCaseModal.js +0 -59
- package/components/routes/cases/modals/AddToCaseModal.test.d.ts +0 -1
- package/components/routes/cases/modals/AddToCaseModal.test.js +0 -313
- package/components/routes/cases/modals/CaseRecordRow.d.ts +0 -9
- package/components/routes/cases/modals/CaseRecordRow.js +0 -15
- package/components/routes/cases/modals/CreateCaseModal.d.ts +0 -7
- package/components/routes/cases/modals/CreateCaseModal.js +0 -55
- package/components/routes/cases/modals/CreateCaseModal.test.d.ts +0 -1
- package/components/routes/cases/modals/CreateCaseModal.test.js +0 -358
- package/components/routes/cases/modals/RenameItemModal.d.ts +0 -9
- package/components/routes/cases/modals/RenameItemModal.js +0 -48
- package/components/routes/cases/modals/ResolveModal.d.ts +0 -7
- package/components/routes/cases/modals/ResolveModal.js +0 -115
- package/components/routes/cases/modals/ResolveModal.test.d.ts +0 -1
- package/components/routes/cases/modals/ResolveModal.test.js +0 -394
- package/components/routes/cases/modals/hooks.d.ts +0 -7
- package/components/routes/cases/modals/hooks.js +0 -44
- package/components/routes/cases/modals/types.d.ts +0 -5
- package/components/routes/cases/search/CaseAssigneeFilter.d.ts +0 -6
- package/components/routes/cases/search/CaseAssigneeFilter.js +0 -33
- package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +0 -1
- package/components/routes/cases/search/CaseAssigneeFilter.test.js +0 -127
- package/components/routes/cases/search/CaseDateFilter.d.ts +0 -13
- package/components/routes/cases/search/CaseDateFilter.js +0 -26
- package/components/routes/cases/search/CaseDateFilter.test.d.ts +0 -1
- package/components/routes/cases/search/CaseDateFilter.test.js +0 -115
- package/components/routes/cases/search/CaseStatusFilter.d.ts +0 -6
- package/components/routes/cases/search/CaseStatusFilter.js +0 -13
- package/components/routes/cases/search/CaseStatusFilter.test.d.ts +0 -1
- package/components/routes/cases/search/CaseStatusFilter.test.js +0 -86
- package/components/routes/hits/search/shared/IndexPicker.d.ts +0 -2
- package/components/routes/hits/search/shared/IndexPicker.js +0 -20
- package/components/routes/observables/ObservableViewer.d.ts +0 -7
- package/components/routes/observables/ObservableViewer.js +0 -27
- package/models/entities/generated/AttachmentsFile.d.ts +0 -12
- package/models/entities/generated/Case.d.ts +0 -28
- package/models/entities/generated/DestinationOriginal.d.ts +0 -19
- package/models/entities/generated/EmailAttachment.d.ts +0 -8
- package/models/entities/generated/EmailParent.d.ts +0 -19
- package/models/entities/generated/Enrichments.d.ts +0 -7
- package/models/entities/generated/EnrichmentsIndicator.d.ts +0 -21
- package/models/entities/generated/HttpResponse.d.ts +0 -11
- package/models/entities/generated/Item.d.ts +0 -9
- package/models/entities/generated/Observable.d.ts +0 -85
- package/models/entities/generated/ObservableCloud.d.ts +0 -20
- package/models/entities/generated/ObservableDestination.d.ts +0 -23
- package/models/entities/generated/ObservableEmail.d.ts +0 -30
- package/models/entities/generated/ObservableFile.d.ts +0 -36
- package/models/entities/generated/ObservableHowler.d.ts +0 -42
- package/models/entities/generated/ObservableHttp.d.ts +0 -11
- package/models/entities/generated/ObservableObserver.d.ts +0 -21
- package/models/entities/generated/ObservableOrganization.d.ts +0 -7
- package/models/entities/generated/ObservableProcess.d.ts +0 -34
- package/models/entities/generated/ObservableSource.d.ts +0 -23
- package/models/entities/generated/ObservableThreat.d.ts +0 -21
- package/models/entities/generated/ObservableTls.d.ts +0 -12
- package/models/entities/generated/ObserverIngress.d.ts +0 -9
- package/models/entities/generated/Task.d.ts +0 -10
- package/models/socket/CaseUpdate.d.ts +0 -5
- package/models/socket/ViewersUpdate.d.ts +0 -4
- package/utils/socketUtils.test.d.ts +0 -1
- package/utils/socketUtils.test.js +0 -59
- package/utils/typeUtils.d.ts +0 -7
- package/utils/typeUtils.js +0 -27
- /package/{api/socket/viewers.test.d.ts → components/app/providers/HitSearchProvider.test.d.ts} +0 -0
- /package/components/elements/hit/{related/RelatedRecords.d.ts → HitDetails.d.ts} +0 -0
- /package/components/routes/hits/search/{RecordBrowser.d.ts → HitBrowser.d.ts} +0 -0
- /package/components/{app/providers/RecordSearchProvider.test.d.ts → routes/hits/search/HitContextMenu.test.d.ts} +0 -0
- /package/components/{elements/MarkdownEditor.d.ts → routes/overviews/OverviewEditor.d.ts} +0 -0
|
@@ -57,7 +57,6 @@ vi.mock('components/app/hooks/useMatchers', () => ({
|
|
|
57
57
|
getMatchingTemplate: mockGetMatchingTemplate
|
|
58
58
|
}))
|
|
59
59
|
}));
|
|
60
|
-
const mockShowModal = vi.fn();
|
|
61
60
|
const mockDispatchApi = vi.fn();
|
|
62
61
|
vi.mock('components/hooks/useMyApi', () => ({
|
|
63
62
|
default: vi.fn(() => ({
|
|
@@ -83,9 +82,6 @@ vi.mock('plugins/store', () => ({
|
|
|
83
82
|
plugins: ['plugin1']
|
|
84
83
|
}
|
|
85
84
|
}));
|
|
86
|
-
vi.mock('components/routes/cases/modals/AddToCaseModal', () => ({
|
|
87
|
-
default: () => null
|
|
88
|
-
}));
|
|
89
85
|
// Mock MUI components
|
|
90
86
|
vi.mock('@mui/material', async () => {
|
|
91
87
|
const actual = await vi.importActual('@mui/material');
|
|
@@ -105,14 +101,13 @@ vi.mock('@mui/material', async () => {
|
|
|
105
101
|
});
|
|
106
102
|
// Import component after mocks
|
|
107
103
|
import { ApiConfigContext } from '@cccsaurora/howler-ui/components/app/providers/ApiConfigProvider';
|
|
108
|
-
import {
|
|
104
|
+
import { HitContext } from '@cccsaurora/howler-ui/components/app/providers/HitProvider';
|
|
109
105
|
import { ParameterContext } from '@cccsaurora/howler-ui/components/app/providers/ParameterProvider';
|
|
110
|
-
import { RecordContext } from '@cccsaurora/howler-ui/components/app/providers/RecordProvider';
|
|
111
106
|
import i18n from '@cccsaurora/howler-ui/i18n';
|
|
112
107
|
import { I18nextProvider } from 'react-i18next';
|
|
113
108
|
import { createMockAction, createMockAnalytic, createMockHit, createMockTemplate } from '@cccsaurora/howler-ui/tests/utils';
|
|
114
109
|
import { DEFAULT_QUERY } from '@cccsaurora/howler-ui/utils/constants';
|
|
115
|
-
import
|
|
110
|
+
import HitContextMenu from './HitContextMenu';
|
|
116
111
|
const mockGetSelectedId = vi.fn(() => 'test-hit-1');
|
|
117
112
|
const mockConfig = {
|
|
118
113
|
lookups: {
|
|
@@ -120,16 +115,16 @@ const mockConfig = {
|
|
|
120
115
|
}
|
|
121
116
|
};
|
|
122
117
|
const mockApiContext = { config: mockConfig };
|
|
123
|
-
const
|
|
124
|
-
|
|
118
|
+
const mockHitContext = {
|
|
119
|
+
hits: {
|
|
125
120
|
'test-hit-1': createMockHit()
|
|
126
121
|
},
|
|
127
|
-
|
|
122
|
+
selectedHits: []
|
|
128
123
|
};
|
|
129
124
|
const mockParameterContext = { query: DEFAULT_QUERY, setQuery: vi.fn() };
|
|
130
125
|
// Test wrapper
|
|
131
126
|
const Wrapper = ({ children }) => {
|
|
132
|
-
return (_jsx(I18nextProvider, { i18n: i18n, children: _jsx(ApiConfigContext.Provider, { value: mockApiContext, children: _jsx(
|
|
127
|
+
return (_jsx(I18nextProvider, { i18n: i18n, children: _jsx(ApiConfigContext.Provider, { value: mockApiContext, children: _jsx(HitContext.Provider, { value: mockHitContext, children: _jsx(ParameterContext.Provider, { value: mockParameterContext, children: children }) }) }) }));
|
|
133
128
|
};
|
|
134
129
|
describe('HitContextMenu', () => {
|
|
135
130
|
let user;
|
|
@@ -137,11 +132,11 @@ describe('HitContextMenu', () => {
|
|
|
137
132
|
beforeEach(() => {
|
|
138
133
|
user = userEvent.setup();
|
|
139
134
|
vi.clearAllMocks();
|
|
140
|
-
|
|
141
|
-
|
|
135
|
+
mockHitContext.selectedHits.length = 0;
|
|
136
|
+
mockHitContext.hits['test-hit-1'] = createMockHit();
|
|
142
137
|
mockGetMatchingAnalytic.mockResolvedValue(createMockAnalytic());
|
|
143
138
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate());
|
|
144
|
-
rerender = render(_jsx(Wrapper, { children: _jsx(
|
|
139
|
+
rerender = render(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) })).rerender;
|
|
145
140
|
});
|
|
146
141
|
describe('Context Menu Initialization', () => {
|
|
147
142
|
it('should open menu on right-click', async () => {
|
|
@@ -205,13 +200,13 @@ describe('HitContextMenu', () => {
|
|
|
205
200
|
});
|
|
206
201
|
it('should disable "Open Hit" when hit is null', async () => {
|
|
207
202
|
act(() => {
|
|
208
|
-
|
|
203
|
+
mockHitContext.hits['test-hit-1'] = null;
|
|
209
204
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
210
205
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
211
206
|
});
|
|
212
207
|
await waitFor(() => {
|
|
213
208
|
const menuItems = screen.getAllByRole('menuitem');
|
|
214
|
-
const openHitItem = menuItems.find(item => item.textContent?.toLowerCase().includes('open hit'));
|
|
209
|
+
const openHitItem = menuItems.find(item => item.textContent?.toLowerCase().includes('open hit viewer'));
|
|
215
210
|
expect(openHitItem).toHaveAttribute('aria-disabled', 'true');
|
|
216
211
|
});
|
|
217
212
|
});
|
|
@@ -252,7 +247,7 @@ describe('HitContextMenu', () => {
|
|
|
252
247
|
skip_rationale: false
|
|
253
248
|
}
|
|
254
249
|
}));
|
|
255
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
250
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
256
251
|
act(() => {
|
|
257
252
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
258
253
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -310,7 +305,7 @@ describe('HitContextMenu', () => {
|
|
|
310
305
|
createMockAction({ action_id: 'action-2', name: 'Custom Action 2' })
|
|
311
306
|
];
|
|
312
307
|
mockDispatchApi.mockResolvedValue({ items: mockActions });
|
|
313
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
308
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
314
309
|
act(() => {
|
|
315
310
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
316
311
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -354,7 +349,7 @@ describe('HitContextMenu', () => {
|
|
|
354
349
|
});
|
|
355
350
|
it('should disable custom actions menu when no actions are available', async () => {
|
|
356
351
|
mockDispatchApi.mockResolvedValueOnce({ items: [] });
|
|
357
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
352
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
358
353
|
act(() => {
|
|
359
354
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
360
355
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -396,7 +391,7 @@ describe('HitContextMenu', () => {
|
|
|
396
391
|
skip_rationale: true
|
|
397
392
|
}
|
|
398
393
|
}));
|
|
399
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
394
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
400
395
|
act(() => {
|
|
401
396
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
402
397
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -464,7 +459,7 @@ describe('HitContextMenu', () => {
|
|
|
464
459
|
it('should call executeAction with action_id and hit query', async () => {
|
|
465
460
|
const mockActions = [createMockAction({ action_id: 'action-1', name: 'Custom Action' })];
|
|
466
461
|
mockDispatchApi.mockResolvedValue({ items: mockActions });
|
|
467
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
462
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
468
463
|
act(() => {
|
|
469
464
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
470
465
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -517,7 +512,7 @@ describe('HitContextMenu', () => {
|
|
|
517
512
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate({
|
|
518
513
|
keys: ['howler.detection', 'event.id']
|
|
519
514
|
}));
|
|
520
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
515
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
521
516
|
});
|
|
522
517
|
it('should render exclusion submenu with template keys', async () => {
|
|
523
518
|
act(() => {
|
|
@@ -565,7 +560,7 @@ describe('HitContextMenu', () => {
|
|
|
565
560
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate({
|
|
566
561
|
keys: ['howler.outline.indicators']
|
|
567
562
|
}));
|
|
568
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
563
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
569
564
|
act(() => {
|
|
570
565
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
571
566
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -608,7 +603,7 @@ describe('HitContextMenu', () => {
|
|
|
608
603
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate({
|
|
609
604
|
keys: []
|
|
610
605
|
}));
|
|
611
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
606
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
612
607
|
act(() => {
|
|
613
608
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
614
609
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -620,7 +615,7 @@ describe('HitContextMenu', () => {
|
|
|
620
615
|
});
|
|
621
616
|
it('should skip null field values in exclusion menu', async () => {
|
|
622
617
|
act(() => {
|
|
623
|
-
|
|
618
|
+
mockHitContext.hits['test-hit-1'].event = {};
|
|
624
619
|
});
|
|
625
620
|
act(() => {
|
|
626
621
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
@@ -643,7 +638,7 @@ describe('HitContextMenu', () => {
|
|
|
643
638
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate({
|
|
644
639
|
keys: ['howler.detection', 'event.id']
|
|
645
640
|
}));
|
|
646
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
641
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
647
642
|
});
|
|
648
643
|
it('should render inclusion submenu with template keys', async () => {
|
|
649
644
|
act(() => {
|
|
@@ -691,7 +686,7 @@ describe('HitContextMenu', () => {
|
|
|
691
686
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate({
|
|
692
687
|
keys: ['howler.outline.indicators']
|
|
693
688
|
}));
|
|
694
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
689
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
695
690
|
act(() => {
|
|
696
691
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
697
692
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -734,7 +729,7 @@ describe('HitContextMenu', () => {
|
|
|
734
729
|
mockGetMatchingTemplate.mockResolvedValue(createMockTemplate({
|
|
735
730
|
keys: []
|
|
736
731
|
}));
|
|
737
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
732
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
738
733
|
act(() => {
|
|
739
734
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
740
735
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -746,7 +741,7 @@ describe('HitContextMenu', () => {
|
|
|
746
741
|
});
|
|
747
742
|
it('should skip null field values in inclusion menu', async () => {
|
|
748
743
|
act(() => {
|
|
749
|
-
|
|
744
|
+
mockHitContext.hits['test-hit-1'].event = {};
|
|
750
745
|
});
|
|
751
746
|
act(() => {
|
|
752
747
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
@@ -765,24 +760,24 @@ describe('HitContextMenu', () => {
|
|
|
765
760
|
});
|
|
766
761
|
});
|
|
767
762
|
describe('Multiple Hit Selection', () => {
|
|
768
|
-
it('should use
|
|
763
|
+
it('should use selectedHits when current hit is included', async () => {
|
|
769
764
|
act(() => {
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
765
|
+
mockHitContext.hits['hit-1'] = createMockHit({ howler: { id: 'hit-1' } });
|
|
766
|
+
mockHitContext.hits['hit-2'] = createMockHit({ howler: { id: 'hit-2' } });
|
|
767
|
+
mockHitContext.selectedHits.push(mockHitContext.hits['hit-1'], mockHitContext.hits['hit-2']);
|
|
773
768
|
mockGetSelectedId.mockReturnValue('hit-1');
|
|
774
769
|
});
|
|
775
770
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
776
771
|
await user.pointer({ keys: '[MouseRight]', target: contextMenuWrapper });
|
|
777
|
-
// The component should use
|
|
772
|
+
// The component should use selectedHits for actions
|
|
778
773
|
// We can verify this indirectly through the useHitActions hook receiving the right data
|
|
779
774
|
expect(screen.getByRole('menu')).toBeInTheDocument();
|
|
780
775
|
expect(mockGetSelectedId).toHaveBeenCalled();
|
|
781
776
|
});
|
|
782
|
-
it('should use only current hit when not in
|
|
777
|
+
it('should use only current hit when not in selectedHits', async () => {
|
|
783
778
|
act(() => {
|
|
784
|
-
|
|
785
|
-
|
|
779
|
+
mockHitContext.hits['hit-1'] = createMockHit({ howler: { id: 'hit-1' } });
|
|
780
|
+
mockHitContext.selectedHits.push(mockHitContext.hits['hit-1']);
|
|
786
781
|
mockGetSelectedId.mockReturnValue('test-hit-1');
|
|
787
782
|
});
|
|
788
783
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
@@ -801,12 +796,12 @@ describe('HitContextMenu', () => {
|
|
|
801
796
|
});
|
|
802
797
|
it('should call getMatchingAnalytic when hit has analytic', async () => {
|
|
803
798
|
await waitFor(() => {
|
|
804
|
-
expect(mockGetMatchingAnalytic).toHaveBeenCalledWith(
|
|
799
|
+
expect(mockGetMatchingAnalytic).toHaveBeenCalledWith(mockHitContext.hits['test-hit-1']);
|
|
805
800
|
});
|
|
806
801
|
});
|
|
807
802
|
it('should call getMatchingTemplate when menu opens', async () => {
|
|
808
803
|
await waitFor(() => {
|
|
809
|
-
expect(mockGetMatchingTemplate).toHaveBeenCalledWith(
|
|
804
|
+
expect(mockGetMatchingTemplate).toHaveBeenCalledWith(mockHitContext.hits['test-hit-1']);
|
|
810
805
|
});
|
|
811
806
|
});
|
|
812
807
|
it('should reset state when menu closes', async () => {
|
|
@@ -839,7 +834,7 @@ describe('HitContextMenu', () => {
|
|
|
839
834
|
describe('Edge Cases and Error Handling', () => {
|
|
840
835
|
it('should not crash when hit is null', async () => {
|
|
841
836
|
act(() => {
|
|
842
|
-
|
|
837
|
+
mockHitContext.hits = {};
|
|
843
838
|
});
|
|
844
839
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
845
840
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -850,7 +845,7 @@ describe('HitContextMenu', () => {
|
|
|
850
845
|
});
|
|
851
846
|
it('should not render exclusion menu when template is null', async () => {
|
|
852
847
|
mockGetMatchingTemplate.mockResolvedValue(null);
|
|
853
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
848
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
854
849
|
act(() => {
|
|
855
850
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
856
851
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -864,7 +859,7 @@ describe('HitContextMenu', () => {
|
|
|
864
859
|
});
|
|
865
860
|
it('should not render inclusion menu when template is null', async () => {
|
|
866
861
|
mockGetMatchingTemplate.mockResolvedValue(null);
|
|
867
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
862
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
868
863
|
act(() => {
|
|
869
864
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
870
865
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -878,7 +873,7 @@ describe('HitContextMenu', () => {
|
|
|
878
873
|
});
|
|
879
874
|
it('should handle API failure gracefully', async () => {
|
|
880
875
|
mockDispatchApi.mockResolvedValue(null);
|
|
881
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
876
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
882
877
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
883
878
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
884
879
|
await waitFor(() => {
|
|
@@ -889,7 +884,7 @@ describe('HitContextMenu', () => {
|
|
|
889
884
|
});
|
|
890
885
|
it('should not call getMatchingAnalytic or getMatchingTemplate when hit has no analytic', async () => {
|
|
891
886
|
act(() => {
|
|
892
|
-
|
|
887
|
+
mockHitContext.hits['test-hit-1'].howler.analytic = null;
|
|
893
888
|
});
|
|
894
889
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
895
890
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -908,56 +903,6 @@ describe('HitContextMenu', () => {
|
|
|
908
903
|
expect(mockPluginStoreExecuteFunction).toHaveBeenCalled();
|
|
909
904
|
});
|
|
910
905
|
});
|
|
911
|
-
describe('Add to Case Menu Item', () => {
|
|
912
|
-
it('should render "Add to Case" item in the menu', async () => {
|
|
913
|
-
act(() => {
|
|
914
|
-
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
915
|
-
fireEvent.contextMenu(contextMenuWrapper);
|
|
916
|
-
});
|
|
917
|
-
await waitFor(() => {
|
|
918
|
-
expect(screen.getByText('Add to Case')).toBeInTheDocument();
|
|
919
|
-
});
|
|
920
|
-
});
|
|
921
|
-
it('should enable "Add to Case" when a record is present', async () => {
|
|
922
|
-
act(() => {
|
|
923
|
-
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
924
|
-
fireEvent.contextMenu(contextMenuWrapper);
|
|
925
|
-
});
|
|
926
|
-
await waitFor(() => {
|
|
927
|
-
const menuItems = screen.getAllByRole('menuitem');
|
|
928
|
-
const addToCaseItem = menuItems.find(item => item.textContent?.includes('Add to Case'));
|
|
929
|
-
expect(addToCaseItem).toHaveAttribute('aria-disabled', 'false');
|
|
930
|
-
});
|
|
931
|
-
});
|
|
932
|
-
it('should disable "Add to Case" when record is null', async () => {
|
|
933
|
-
act(() => {
|
|
934
|
-
mockRecordContext.records['test-hit-1'] = null;
|
|
935
|
-
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
936
|
-
fireEvent.contextMenu(contextMenuWrapper);
|
|
937
|
-
});
|
|
938
|
-
await waitFor(() => {
|
|
939
|
-
const menuItems = screen.getAllByRole('menuitem');
|
|
940
|
-
const addToCaseItem = menuItems.find(item => item.textContent?.includes('Add to Case'));
|
|
941
|
-
expect(addToCaseItem).toHaveAttribute('aria-disabled', 'true');
|
|
942
|
-
});
|
|
943
|
-
});
|
|
944
|
-
it('should call showModal with an AddToCaseModal element when clicked', async () => {
|
|
945
|
-
act(() => {
|
|
946
|
-
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
947
|
-
fireEvent.contextMenu(contextMenuWrapper);
|
|
948
|
-
});
|
|
949
|
-
await waitFor(() => {
|
|
950
|
-
expect(screen.getByText('Add to Case')).toBeInTheDocument();
|
|
951
|
-
});
|
|
952
|
-
await act(async () => {
|
|
953
|
-
await user.click(screen.getByText('Add to Case'));
|
|
954
|
-
});
|
|
955
|
-
await waitFor(() => {
|
|
956
|
-
expect(mockShowModal).toHaveBeenCalledOnce();
|
|
957
|
-
expect(mockShowModal).toHaveBeenCalledWith(expect.objectContaining({ type: expect.any(Function) }), expect.objectContaining({ maxHeight: expect.any(String) }));
|
|
958
|
-
});
|
|
959
|
-
});
|
|
960
|
-
});
|
|
961
906
|
describe('Role-Based Action Permissions', () => {
|
|
962
907
|
afterEach(() => {
|
|
963
908
|
// Reset to default user with required roles
|
|
@@ -977,7 +922,7 @@ describe('HitContextMenu', () => {
|
|
|
977
922
|
});
|
|
978
923
|
const mockActions = [createMockAction({ action_id: 'action-1', name: 'Custom Action 1' })];
|
|
979
924
|
mockDispatchApi.mockResolvedValue({ items: mockActions });
|
|
980
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
925
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
981
926
|
act(() => {
|
|
982
927
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
983
928
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -996,7 +941,7 @@ describe('HitContextMenu', () => {
|
|
|
996
941
|
});
|
|
997
942
|
const mockActions = [createMockAction({ action_id: 'action-1', name: 'Custom Action 1' })];
|
|
998
943
|
mockDispatchApi.mockResolvedValue({ items: mockActions });
|
|
999
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
944
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
1000
945
|
act(() => {
|
|
1001
946
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
1002
947
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -1015,7 +960,7 @@ describe('HitContextMenu', () => {
|
|
|
1015
960
|
});
|
|
1016
961
|
const mockActions = [createMockAction({ action_id: 'action-1', name: 'Custom Action 1' })];
|
|
1017
962
|
mockDispatchApi.mockResolvedValue({ items: mockActions });
|
|
1018
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
963
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
1019
964
|
act(() => {
|
|
1020
965
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
1021
966
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -1033,7 +978,7 @@ describe('HitContextMenu', () => {
|
|
|
1033
978
|
}
|
|
1034
979
|
});
|
|
1035
980
|
mockDispatchApi.mockResolvedValue({ items: [] });
|
|
1036
|
-
rerender(_jsx(Wrapper, { children: _jsx(
|
|
981
|
+
rerender(_jsx(Wrapper, { children: _jsx(HitContextMenu, { getSelectedId: mockGetSelectedId, children: _jsx("div", { children: "Test Content" }) }) }));
|
|
1037
982
|
act(() => {
|
|
1038
983
|
const contextMenuWrapper = screen.getByText('Test Content').parentElement;
|
|
1039
984
|
fireEvent.contextMenu(contextMenuWrapper);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type HitQueryProps = {
|
|
2
2
|
triggerSearch: (query: string) => void;
|
|
3
3
|
onChange?: (query: string, isDirty: boolean) => void;
|
|
4
4
|
searching?: boolean;
|
|
5
5
|
disabled?: boolean;
|
|
6
6
|
compact?: boolean;
|
|
7
7
|
};
|
|
8
|
-
declare const _default: import("react").NamedExoticComponent<
|
|
8
|
+
declare const _default: import("react").NamedExoticComponent<HitQueryProps>;
|
|
9
9
|
export default _default;
|
|
@@ -5,7 +5,7 @@ import { Badge, Box, Card, Skeleton, Tooltip, alpha, useTheme } from '@mui/mater
|
|
|
5
5
|
import { ParameterContext } from '@cccsaurora/howler-ui/components/app/providers/ParameterProvider';
|
|
6
6
|
import TuiIconButton from '@cccsaurora/howler-ui/components/elements/addons/buttons/CustomIconButton';
|
|
7
7
|
import QueryEditor from '@cccsaurora/howler-ui/components/routes/advanced/QueryEditor';
|
|
8
|
-
import {
|
|
8
|
+
import { HitSearchContext } from '@cccsaurora/howler-ui/components/app/providers/HitSearchProvider';
|
|
9
9
|
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
10
10
|
import { useTranslation } from 'react-i18next';
|
|
11
11
|
import { useLocation } from 'react-router-dom';
|
|
@@ -13,8 +13,8 @@ import { useContextSelector } from 'use-context-selector';
|
|
|
13
13
|
import { DEFAULT_QUERY } from '@cccsaurora/howler-ui/utils/constants';
|
|
14
14
|
import { sanitizeMultilineLucene } from '@cccsaurora/howler-ui/utils/stringUtils';
|
|
15
15
|
const DEFAULT_MULTILINE_HEIGHT = 250;
|
|
16
|
-
const PROMPT_CONTEXT = '
|
|
17
|
-
const
|
|
16
|
+
const PROMPT_CONTEXT = 'isHitQuery && !suggestWidgetVisible && !renameInputVisible && !inSnippetMode && !quickFixWidgetVisible';
|
|
17
|
+
const HitQuery = ({ searching = false, disabled = false, compact = false, triggerSearch, onChange }) => {
|
|
18
18
|
const { t } = useTranslation();
|
|
19
19
|
const location = useLocation();
|
|
20
20
|
const theme = useTheme();
|
|
@@ -22,7 +22,7 @@ const RecordQuery = ({ searching = false, disabled = false, compact = false, tri
|
|
|
22
22
|
const savedQuery = useContextSelector(ParameterContext, ctx => ctx.query || DEFAULT_QUERY);
|
|
23
23
|
const prevQuery = useRef(null);
|
|
24
24
|
const [query, setQuery] = useState(new URLSearchParams(window.location.search).get('query') || DEFAULT_QUERY);
|
|
25
|
-
const fzfSearch = useContextSelector(
|
|
25
|
+
const fzfSearch = useContextSelector(HitSearchContext, ctx => ctx?.fzfSearch ?? false);
|
|
26
26
|
const [loaded, setLoaded] = useState(false);
|
|
27
27
|
const [multiline, setMultiline] = useState(false);
|
|
28
28
|
const [y, setY] = useState(0);
|
|
@@ -90,7 +90,7 @@ const RecordQuery = ({ searching = false, disabled = false, compact = false, tri
|
|
|
90
90
|
window.addEventListener('mouseup', onMouseUp);
|
|
91
91
|
}, [onMouseMove, onMouseUp]);
|
|
92
92
|
const onMount = useCallback((ed) => {
|
|
93
|
-
ed.createContextKey('
|
|
93
|
+
ed.createContextKey('isHitQuery', true);
|
|
94
94
|
setLoaded(true);
|
|
95
95
|
}, []);
|
|
96
96
|
const options = useMemo(() => ({
|
|
@@ -148,4 +148,4 @@ const RecordQuery = ({ searching = false, disabled = false, compact = false, tri
|
|
|
148
148
|
zIndex: 1000
|
|
149
149
|
}, onMouseDown: onMouseDown }))] }));
|
|
150
150
|
};
|
|
151
|
-
export default memo(
|
|
151
|
+
export default memo(HitQuery);
|