@cccsaurora/howler-ui 2.19.0-cases.863 → 2.19.0-dev.1023
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/index.d.ts +5 -4
- package/api/action/index.js +8 -8
- package/api/analytic/index.d.ts +3 -2
- package/api/analytic/index.js +4 -4
- package/api/analytic/owner.d.ts +2 -1
- package/api/analytic/owner.js +2 -2
- package/api/analytic/rules.d.ts +2 -1
- package/api/analytic/rules.js +2 -2
- package/api/dossier/index.d.ts +4 -3
- package/api/dossier/index.js +6 -6
- package/api/hit/index.d.ts +3 -2
- package/api/hit/index.js +4 -4
- package/api/hit/labels.d.ts +3 -2
- package/api/hit/labels.js +4 -4
- package/api/hit/overwrite.d.ts +2 -1
- package/api/hit/overwrite.js +2 -2
- package/api/hit/transition.d.ts +2 -1
- package/api/hit/transition.js +2 -2
- package/api/index.d.ts +5 -8
- package/api/index.js +10 -18
- package/api/overview/index.d.ts +4 -3
- package/api/overview/index.js +6 -6
- 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/api/search/overview.d.ts +2 -2
- package/api/template/index.d.ts +4 -3
- package/api/template/index.js +6 -6
- package/api/user/index.d.ts +2 -1
- package/api/user/index.js +2 -2
- package/api/view/index.d.ts +4 -3
- package/api/view/index.js +6 -6
- package/commons/components/leftnav/LeftNavDrawer.js +1 -1
- package/components/app/App.d.ts +1 -0
- package/components/app/App.js +20 -42
- 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 -6
- package/components/app/providers/HitProvider.d.ts +22 -0
- package/components/app/providers/{RecordProvider.js → HitProvider.js} +42 -42
- 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 +1 -1
- package/components/app/providers/ModalProvider.js +5 -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/SearchResponseProvider.d.ts +21 -0
- package/components/app/providers/SearchResponseProvider.js +81 -0
- package/components/app/providers/SearchResponseProvider.test.js +406 -0
- 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/app/providers/ViewProvider.test.js +4 -1
- 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/buttons/CustomButton.test.js +106 -0
- package/components/elements/addons/layout/FlexOne.test.js +30 -0
- package/components/elements/addons/lists/TuiListBase.js +4 -0
- package/components/elements/addons/lists/TuiListElement.js +6 -3
- package/components/elements/addons/lists/index.d.ts +1 -0
- package/components/elements/addons/search/SearchPagination.d.ts +2 -1
- package/components/elements/addons/search/SearchPagination.js +4 -4
- package/components/elements/addons/search/SearchPagination.test.js +80 -0
- package/components/elements/addons/search/SearchTotal.test.js +47 -0
- 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/DocumentationButton.test.js +84 -0
- package/components/elements/display/DynamicTabs.test.js +93 -0
- package/components/elements/display/HowlerAvatar.js +2 -1
- package/components/elements/display/HowlerCard.js +1 -1
- package/components/elements/display/HowlerCard.test.js +55 -0
- package/components/elements/display/Image.test.js +79 -0
- package/components/elements/display/ItemManager.d.ts +2 -2
- package/components/elements/display/ItemManager.js +1 -1
- package/components/elements/display/Markdown.js +9 -2
- package/components/elements/display/Modal.js +0 -2
- package/components/elements/display/QueryResultText.test.js +48 -0
- package/components/elements/display/TextDivider.test.js +43 -0
- package/components/elements/display/TypingIndicator.test.js +33 -0
- package/components/elements/display/icons/BundleButton.d.ts +6 -0
- package/components/elements/display/icons/BundleButton.js +32 -0
- package/components/elements/display/modals/ConfirmDeleteModal.d.ts +4 -0
- package/components/elements/display/modals/ConfirmDeleteModal.js +4 -2
- package/components/elements/hit/HitActions.js +4 -4
- package/components/elements/hit/HitBanner.d.ts +0 -1
- package/components/elements/hit/HitBanner.js +49 -31
- 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 +8 -8
- 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.d.ts → HitUsers.d.ts} +5 -2
- package/components/elements/hit/elements/HitUsers.js +33 -0
- 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/useMyApi.d.ts +1 -1
- package/components/hooks/useMyPreferences.js +3 -11
- package/components/hooks/useMySearch.js +2 -2
- package/components/hooks/useMySitemap.js +1 -4
- package/components/hooks/useMyTheme.js +2 -9
- package/components/routes/403.test.js +27 -0
- package/components/routes/404.test.js +26 -0
- package/components/routes/ErrorBoundary.test.js +43 -0
- package/components/routes/ErrorOccured.test.js +35 -0
- package/components/routes/Logout.test.js +59 -0
- package/components/routes/action/edit/ActionEditor.js +2 -2
- package/components/routes/action/useMyActionFunctions.js +5 -2
- package/components/routes/action/view/ActionDetails.js +10 -2
- package/components/routes/action/view/ActionSearch.js +30 -19
- 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 +12 -8
- package/components/routes/analytics/AnalyticSearch.js +7 -7
- package/components/routes/dossiers/DossierEditor.js +2 -2
- package/components/routes/dossiers/DossierEditor.test.js +1 -1
- package/components/routes/dossiers/Dossiers.js +25 -19
- 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/en/client.md.js +1 -1
- package/components/routes/help/markdown/fr/bundles.md.js +1 -0
- package/components/routes/help/markdown/fr/client.md.js +1 -1
- 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} +9 -11
- package/components/routes/hits/search/shared/CustomSpan.js +7 -7
- package/components/routes/hits/search/shared/CustomSpan.test.js +170 -0
- package/components/routes/hits/view/HitViewer.js +13 -12
- package/components/routes/home/AddNewCard.test.js +86 -0
- package/components/routes/home/ViewCard.js +41 -47
- package/components/routes/home/ViewRefresh.test.js +79 -0
- package/components/routes/overviews/OverviewCard.test.js +108 -0
- package/components/{elements/MarkdownEditor.js → routes/overviews/OverviewEditor.js} +3 -3
- package/components/routes/overviews/OverviewViewer.js +18 -10
- package/components/routes/overviews/Overviews.js +25 -19
- package/components/routes/settings/LocalSection.js +2 -1
- package/components/routes/settings/SettingsSection.test.d.ts +1 -0
- package/components/routes/settings/SettingsSection.test.js +19 -0
- package/components/routes/templates/TemplateCard.d.ts +3 -1
- package/components/routes/templates/TemplateCard.js +8 -4
- package/components/routes/templates/TemplateCard.test.d.ts +1 -0
- package/components/routes/templates/TemplateCard.test.js +115 -0
- package/components/routes/templates/TemplateViewer.js +62 -16
- package/components/routes/templates/Templates.js +35 -13
- package/components/routes/views/ViewComposer.js +19 -46
- package/components/routes/views/Views.js +21 -14
- package/locales/en/translation.json +21 -118
- package/locales/fr/translation.json +23 -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 +1 -1
- package/models/entities/generated/Howler.d.ts +6 -0
- package/models/entities/generated/Rule.d.ts +9 -6
- package/models/entities/generated/Threat.d.ts +2 -2
- package/models/entities/generated/UserUser.d.ts +2 -0
- package/models/entities/generated/View.d.ts +0 -1
- package/package.json +125 -145
- package/plugins/clue/components/ClueTypography.js +2 -2
- package/plugins/clue/utils.d.ts +1 -2
- package/rest/FetchClient.test.d.ts +1 -0
- package/rest/FetchClient.test.js +81 -0
- package/setupTests.js +5 -0
- 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/Throttler.test.d.ts +1 -0
- package/utils/Throttler.test.js +135 -0
- package/utils/actionUtils.test.d.ts +1 -0
- package/utils/actionUtils.test.js +140 -0
- package/utils/constants.d.ts +4 -4
- package/utils/constants.js +1 -6
- package/utils/hitFunctions.d.ts +1 -2
- package/utils/hitFunctions.js +4 -4
- package/utils/hitFunctions.test.d.ts +1 -0
- package/utils/hitFunctions.test.js +52 -0
- package/utils/localStorage.test.d.ts +1 -0
- package/utils/localStorage.test.js +96 -0
- package/utils/menuUtils.test.d.ts +1 -0
- package/utils/menuUtils.test.js +198 -0
- package/utils/sessionStorage.test.d.ts +1 -0
- package/utils/sessionStorage.test.js +81 -0
- package/utils/socketUtils.d.ts +0 -14
- package/utils/socketUtils.js +1 -17
- package/utils/socketUtils.test.js +16 -49
- package/utils/stringUtils.test.d.ts +1 -0
- package/utils/stringUtils.test.js +159 -0
- package/utils/utils.test.d.ts +1 -0
- package/utils/utils.test.js +292 -0
- package/utils/viewUtils.js +0 -3
- package/utils/viewUtils.test.d.ts +1 -0
- package/utils/viewUtils.test.js +45 -0
- package/utils/xsrf.test.d.ts +1 -0
- package/utils/xsrf.test.js +41 -0
- 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.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.js +0 -34
- 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/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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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/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/app/providers/{RecordSearchProvider.test.d.ts → SearchResponseProvider.test.d.ts} +0 -0
- /package/components/elements/{ContextMenu.test.d.ts → addons/buttons/CustomButton.test.d.ts} +0 -0
- /package/components/elements/{hit/elements/Assigned.test.d.ts → addons/layout/FlexOne.test.d.ts} +0 -0
- /package/components/elements/{record/RecordContextMenu.test.d.ts → addons/search/SearchPagination.test.d.ts} +0 -0
- /package/components/{routes/cases/CaseViewer.test.d.ts → elements/addons/search/SearchTotal.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/CaseAssets.test.d.ts → elements/display/DocumentationButton.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/CaseRules.test.d.ts → elements/display/DynamicTabs.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/CaseSidebar.test.d.ts → elements/display/HowlerCard.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/CaseTimeline.test.d.ts → elements/display/Image.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/CreateRuleDialog.test.d.ts → elements/display/QueryResultText.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/assets/Asset.test.d.ts → elements/display/TextDivider.test.d.ts} +0 -0
- /package/components/{routes/cases/detail/sidebar/CaseFolder.test.d.ts → elements/display/TypingIndicator.test.d.ts} +0 -0
- /package/components/elements/hit/{related/RelatedRecords.d.ts → HitDetails.d.ts} +0 -0
- /package/components/routes/{cases/detail/sidebar/CaseFolderContextMenu.test.d.ts → 403.test.d.ts} +0 -0
- /package/components/routes/{cases/detail/sidebar/FolderEntry.test.d.ts → 404.test.d.ts} +0 -0
- /package/components/routes/{cases/detail/sidebar/utils.test.d.ts → ErrorBoundary.test.d.ts} +0 -0
- /package/components/routes/{cases/hooks/useCase.test.d.ts → ErrorOccured.test.d.ts} +0 -0
- /package/components/routes/{cases/modals/AddToCaseModal.test.d.ts → Logout.test.d.ts} +0 -0
- /package/components/routes/hits/search/{RecordBrowser.d.ts → HitBrowser.d.ts} +0 -0
- /package/components/routes/{cases/modals/CreateCaseModal.test.d.ts → hits/search/HitContextMenu.test.d.ts} +0 -0
- /package/components/routes/{cases/modals/ResolveModal.test.d.ts → hits/search/shared/CustomSpan.test.d.ts} +0 -0
- /package/components/routes/{cases/search/CaseAssigneeFilter.test.d.ts → home/AddNewCard.test.d.ts} +0 -0
- /package/components/routes/{cases/search/CaseDateFilter.test.d.ts → home/ViewRefresh.test.d.ts} +0 -0
- /package/components/routes/{cases/search/CaseStatusFilter.test.d.ts → overviews/OverviewCard.test.d.ts} +0 -0
- /package/components/{elements/MarkdownEditor.d.ts → routes/overviews/OverviewEditor.d.ts} +0 -0
|
@@ -4,11 +4,10 @@ import { useTranslation } from 'react-i18next';
|
|
|
4
4
|
import { HelpOutline, Save } from '@mui/icons-material';
|
|
5
5
|
import { Alert, Checkbox, CircularProgress, LinearProgress, Stack, TextField, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material';
|
|
6
6
|
import api from '@cccsaurora/howler-ui/api';
|
|
7
|
-
import {} from '@cccsaurora/howler-ui/api/search';
|
|
8
7
|
import AppListEmpty from '@cccsaurora/howler-ui/commons/components/display/AppListEmpty';
|
|
9
8
|
import PageCenter from '@cccsaurora/howler-ui/commons/components/pages/PageCenter';
|
|
9
|
+
import { HitContext } from '@cccsaurora/howler-ui/components/app/providers/HitProvider';
|
|
10
10
|
import { ParameterContext } from '@cccsaurora/howler-ui/components/app/providers/ParameterProvider';
|
|
11
|
-
import { RecordContext } from '@cccsaurora/howler-ui/components/app/providers/RecordProvider';
|
|
12
11
|
import { ViewContext } from '@cccsaurora/howler-ui/components/app/providers/ViewProvider';
|
|
13
12
|
import CustomButton from '@cccsaurora/howler-ui/components/elements/addons/buttons/CustomButton';
|
|
14
13
|
import FlexPort from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexPort';
|
|
@@ -18,7 +17,6 @@ import VSBoxHeader from '@cccsaurora/howler-ui/components/elements/addons/layout
|
|
|
18
17
|
import SearchTotal from '@cccsaurora/howler-ui/components/elements/addons/search/SearchTotal';
|
|
19
18
|
import HitCard from '@cccsaurora/howler-ui/components/elements/hit/HitCard';
|
|
20
19
|
import { HitLayout } from '@cccsaurora/howler-ui/components/elements/hit/HitLayout';
|
|
21
|
-
import ObservableCard from '@cccsaurora/howler-ui/components/elements/observable/ObservableCard';
|
|
22
20
|
import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
|
|
23
21
|
import { useMyLocalStorageItem } from '@cccsaurora/howler-ui/components/hooks/useMyLocalStorage';
|
|
24
22
|
import useMySnackbar from '@cccsaurora/howler-ui/components/hooks/useMySnackbar';
|
|
@@ -28,9 +26,8 @@ import { DEFAULT_QUERY, StorageKey } from '@cccsaurora/howler-ui/utils/constants
|
|
|
28
26
|
import { convertDateToLucene } from '@cccsaurora/howler-ui/utils/utils';
|
|
29
27
|
import { buildViewUrl } from '@cccsaurora/howler-ui/utils/viewUtils';
|
|
30
28
|
import ErrorBoundary from '../ErrorBoundary';
|
|
31
|
-
import
|
|
29
|
+
import HitQuery from '../hits/search/HitQuery';
|
|
32
30
|
import HitSort from '../hits/search/shared/HitSort';
|
|
33
|
-
import IndexPicker from '../hits/search/shared/IndexPicker';
|
|
34
31
|
import SearchSpan from '../hits/search/shared/SearchSpan';
|
|
35
32
|
const ViewComposer = () => {
|
|
36
33
|
const { t } = useTranslation();
|
|
@@ -41,10 +38,8 @@ const ViewComposer = () => {
|
|
|
41
38
|
const addView = useContextSelector(ViewContext, ctx => ctx.addView);
|
|
42
39
|
const editView = useContextSelector(ViewContext, ctx => ctx.editView);
|
|
43
40
|
const getCurrentViews = useContextSelector(ViewContext, ctx => ctx.getCurrentViews);
|
|
44
|
-
const indexes = useContextSelector(ParameterContext, ctx => ctx.indexes);
|
|
45
|
-
const setIndexes = useContextSelector(ParameterContext, ctx => ctx.setIndexes);
|
|
46
41
|
const pageCount = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25)[0];
|
|
47
|
-
const
|
|
42
|
+
const loadHits = useContextSelector(HitContext, ctx => ctx.loadHits);
|
|
48
43
|
// view state
|
|
49
44
|
const [title, setTitle] = useState('');
|
|
50
45
|
const [type, setType] = useState('global');
|
|
@@ -61,17 +56,14 @@ const ViewComposer = () => {
|
|
|
61
56
|
const [searching, setSearching] = useState(false);
|
|
62
57
|
const [error, setError] = useState(null);
|
|
63
58
|
const [response, setResponse] = useState();
|
|
64
|
-
const [isLoadingView, setIsLoadingView] = useState(!!routeParams.id);
|
|
65
59
|
const onSave = useCallback(async () => {
|
|
66
60
|
setLoading(true);
|
|
67
61
|
try {
|
|
68
|
-
const normalizedIndexes = indexes?.length > 0 ? indexes : ['hit'];
|
|
69
62
|
if (!routeParams.id) {
|
|
70
63
|
const newView = await addView({
|
|
71
64
|
title,
|
|
72
65
|
type,
|
|
73
66
|
query,
|
|
74
|
-
indexes: normalizedIndexes,
|
|
75
67
|
sort: sort || null,
|
|
76
68
|
span: span || null,
|
|
77
69
|
settings: {
|
|
@@ -85,7 +77,6 @@ const ViewComposer = () => {
|
|
|
85
77
|
title,
|
|
86
78
|
type,
|
|
87
79
|
query,
|
|
88
|
-
indexes: normalizedIndexes,
|
|
89
80
|
sort,
|
|
90
81
|
span,
|
|
91
82
|
settings: { advance_on_triage: advanceOnTriage }
|
|
@@ -110,24 +101,23 @@ const ViewComposer = () => {
|
|
|
110
101
|
sort,
|
|
111
102
|
span,
|
|
112
103
|
advanceOnTriage,
|
|
113
|
-
indexes,
|
|
114
104
|
navigate,
|
|
115
105
|
editView,
|
|
116
106
|
showErrorMessage
|
|
117
107
|
]);
|
|
118
|
-
const
|
|
108
|
+
const search = useCallback(async (_query) => {
|
|
109
|
+
setQuery(_query);
|
|
119
110
|
setSearching(true);
|
|
120
111
|
setError(null);
|
|
121
112
|
try {
|
|
122
|
-
const
|
|
123
|
-
const _response = await dispatchApi(api.v2.search.post(normalizedIndexes, {
|
|
113
|
+
const _response = await dispatchApi(api.search.hit.post({
|
|
124
114
|
rows: pageCount,
|
|
125
|
-
query:
|
|
126
|
-
sort
|
|
127
|
-
filters:
|
|
115
|
+
query: _query,
|
|
116
|
+
sort,
|
|
117
|
+
filters: span ? [`event.created:${convertDateToLucene(span)}`] : [],
|
|
128
118
|
metadata: ['template', 'analytic']
|
|
129
119
|
}), { showError: false, throwError: true });
|
|
130
|
-
|
|
120
|
+
loadHits(_response.items);
|
|
131
121
|
setResponse(_response);
|
|
132
122
|
}
|
|
133
123
|
catch (e) {
|
|
@@ -136,25 +126,18 @@ const ViewComposer = () => {
|
|
|
136
126
|
finally {
|
|
137
127
|
setSearching(false);
|
|
138
128
|
}
|
|
139
|
-
}, [dispatchApi,
|
|
140
|
-
const search = useCallback(async (_query) => {
|
|
141
|
-
setQuery(_query);
|
|
142
|
-
await performSearch(_query, indexes, sort, span);
|
|
143
|
-
}, [performSearch, indexes, sort, span, setQuery]);
|
|
129
|
+
}, [dispatchApi, loadHits, pageCount, setQuery, sort, span]);
|
|
144
130
|
useEffect(() => {
|
|
145
|
-
|
|
146
|
-
if (!routeParams.id) {
|
|
147
|
-
search(query || DEFAULT_QUERY);
|
|
148
|
-
}
|
|
131
|
+
search(query || DEFAULT_QUERY);
|
|
149
132
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
150
|
-
}, [
|
|
133
|
+
}, []);
|
|
151
134
|
// We only run this when ancillary properties (i.e. filters, sorting) change
|
|
152
135
|
useEffect(() => {
|
|
153
|
-
if (query
|
|
136
|
+
if (query) {
|
|
154
137
|
search(query);
|
|
155
138
|
}
|
|
156
139
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
157
|
-
}, [sort, span
|
|
140
|
+
}, [sort, span]);
|
|
158
141
|
useEffect(() => {
|
|
159
142
|
if (!routeParams.id) {
|
|
160
143
|
return;
|
|
@@ -170,23 +153,13 @@ const ViewComposer = () => {
|
|
|
170
153
|
}
|
|
171
154
|
setTitle(viewToEdit.title);
|
|
172
155
|
setAdvanceOnTriage(viewToEdit.settings?.advance_on_triage ?? false);
|
|
173
|
-
|
|
174
|
-
const loadedIndexes = viewToEdit.indexes || indexes;
|
|
175
|
-
const loadedSort = viewToEdit.sort || sort;
|
|
176
|
-
const loadedSpan = viewToEdit.span || span;
|
|
177
|
-
setQuery(loadedQuery);
|
|
178
|
-
if (viewToEdit.indexes) {
|
|
179
|
-
setIndexes(loadedIndexes);
|
|
180
|
-
}
|
|
156
|
+
setQuery(viewToEdit.query);
|
|
181
157
|
if (viewToEdit.sort) {
|
|
182
|
-
setSort(
|
|
158
|
+
setSort(viewToEdit.sort);
|
|
183
159
|
}
|
|
184
160
|
if (viewToEdit.span) {
|
|
185
|
-
setSpan(
|
|
161
|
+
setSpan(viewToEdit.span);
|
|
186
162
|
}
|
|
187
|
-
// Perform search with the loaded values to avoid using stale state
|
|
188
|
-
await performSearch(loadedQuery, loadedIndexes, loadedSort, loadedSpan);
|
|
189
|
-
setIsLoadingView(false);
|
|
190
163
|
})();
|
|
191
164
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
192
165
|
}, [routeParams.id]);
|
|
@@ -199,6 +172,6 @@ const ViewComposer = () => {
|
|
|
199
172
|
fontSize: '0.9em',
|
|
200
173
|
fontStyle: 'italic',
|
|
201
174
|
mb: 0.5
|
|
202
|
-
}), variant: "body2", children: t('hit.search.prompt') }), _jsx(
|
|
175
|
+
}), variant: "body2", children: t('hit.search.prompt') }), _jsx(HitQuery, { triggerSearch: search, searching: searching, onChange: (_query, isDirty) => setIsSearchDirty(isDirty) }), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(HitSort, {}), _jsx(SearchSpan, { omitCustom: true }), _jsx("div", { style: { flex: 1 } }), _jsxs(Stack, { spacing: 1, direction: "row", alignItems: "center", sx: { flex: '0 !important', minWidth: '300px' }, children: [_jsx(Typography, { component: "span", children: t('view.settings.advance_on_triage') }), _jsx(Tooltip, { title: t('view.settings.advance_on_triage.description'), children: _jsx(HelpOutline, { sx: { fontSize: '16px' } }) }), _jsx(Checkbox, { size: "small", checked: advanceOnTriage, onChange: (_event, checked) => setAdvanceOnTriage(checked) })] })] }), response?.total ? (_jsx(SearchTotal, { total: response.total, pageLength: response.items.length, offset: response.offset, sx: theme => ({ color: theme.palette.text.secondary, fontSize: '0.9em', fontStyle: 'italic' }) })) : null, _jsx(LinearProgress, { sx: [!searching && { opacity: 0 }] })] }) }), _jsx(VSBoxContent, { children: _jsxs(Stack, { spacing: 1, children: [!response?.total && _jsx(AppListEmpty, {}), response?.items.map(hit => (_jsx(HitCard, { id: hit.howler.id, layout: HitLayout.DENSE }, hit.howler.id)))] }) })] }) }) }) }));
|
|
203
176
|
};
|
|
204
177
|
export default ViewComposer;
|
|
@@ -4,6 +4,8 @@ import { Clear, Edit, SavedSearch, Star, StarBorder } from '@mui/icons-material'
|
|
|
4
4
|
import { Autocomplete, Card, Checkbox, IconButton, Skeleton, Stack, TextField, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material';
|
|
5
5
|
import api from '@cccsaurora/howler-ui/api';
|
|
6
6
|
import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks';
|
|
7
|
+
import { ModalContext } from '@cccsaurora/howler-ui/components/app/providers/ModalProvider';
|
|
8
|
+
import SearchResponseProvider, { SearchResponseContext } from '@cccsaurora/howler-ui/components/app/providers/SearchResponseProvider';
|
|
7
9
|
import { ViewContext } from '@cccsaurora/howler-ui/components/app/providers/ViewProvider';
|
|
8
10
|
import FlexOne from '@cccsaurora/howler-ui/components/elements/addons/layout/FlexOne';
|
|
9
11
|
import { TuiListProvider } from '@cccsaurora/howler-ui/components/elements/addons/lists';
|
|
@@ -11,8 +13,8 @@ import { TuiListMethodContext } from '@cccsaurora/howler-ui/components/elements/
|
|
|
11
13
|
import HowlerAvatar from '@cccsaurora/howler-ui/components/elements/display/HowlerAvatar';
|
|
12
14
|
import ItemManager from '@cccsaurora/howler-ui/components/elements/display/ItemManager';
|
|
13
15
|
import { ViewTitle } from '@cccsaurora/howler-ui/components/elements/view/ViewTitle';
|
|
14
|
-
import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
|
|
15
16
|
import { useMyLocalStorageItem } from '@cccsaurora/howler-ui/components/hooks/useMyLocalStorage';
|
|
17
|
+
import useMySnackbar from '@cccsaurora/howler-ui/components/hooks/useMySnackbar';
|
|
16
18
|
import { isNull, omitBy, size } from 'lodash-es';
|
|
17
19
|
import React, { useCallback, useContext, useEffect, useState } from 'react';
|
|
18
20
|
import { useTranslation } from 'react-i18next';
|
|
@@ -26,7 +28,8 @@ const ViewsBase = () => {
|
|
|
26
28
|
const { t } = useTranslation();
|
|
27
29
|
const { user } = useAppUser();
|
|
28
30
|
const navigate = useNavigate();
|
|
29
|
-
const {
|
|
31
|
+
const { withConfirmDeleteModal } = useContext(ModalContext);
|
|
32
|
+
const { showSuccessMessage } = useMySnackbar();
|
|
30
33
|
const fetchViews = useContextSelector(ViewContext, ctx => ctx.fetchViews);
|
|
31
34
|
const addFavourite = useContextSelector(ViewContext, ctx => ctx.addFavourite);
|
|
32
35
|
const removeFavourite = useContextSelector(ViewContext, ctx => ctx.removeFavourite);
|
|
@@ -37,9 +40,9 @@ const ViewsBase = () => {
|
|
|
37
40
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
38
41
|
const { load } = useContext(TuiListMethodContext);
|
|
39
42
|
const pageCount = useMyLocalStorageItem(StorageKey.PAGE_COUNT, 25)[0];
|
|
43
|
+
const { response, request, remove, getSearchRequestData } = useContext(SearchResponseContext);
|
|
40
44
|
const [phrase, setPhrase] = useState('');
|
|
41
45
|
const [offset, setOffset] = useState(parseInt(searchParams.get('offset')) || 0);
|
|
42
|
-
const [response, setResponse] = useState(null);
|
|
43
46
|
const [type, setType] = useState(searchParams.get('type') || null);
|
|
44
47
|
const [hasError, setHasError] = useState(false);
|
|
45
48
|
const [searching, setSearching] = useState(false);
|
|
@@ -61,11 +64,11 @@ const ViewsBase = () => {
|
|
|
61
64
|
const phraseQuery = FIELDS_TO_SEARCH.map(_field => `${_field}:${searchTerm}`).join(' OR ');
|
|
62
65
|
const typeQuery = `(type:global OR owner:(${user.username} OR none)) AND type:(${type ?? '*'}${type === 'personal' ? ' OR readonly' : ''})`;
|
|
63
66
|
const favouritesQuery = favouritesOnly && user.favourite_views.length > 0 ? ` AND view_id:(${user.favourite_views.join(' OR ')})` : '';
|
|
64
|
-
|
|
67
|
+
await request(api.search.view.post, {
|
|
65
68
|
query: `(${phraseQuery}) AND ${typeQuery}${favouritesQuery}`,
|
|
66
69
|
rows: pageCount,
|
|
67
70
|
offset
|
|
68
|
-
})
|
|
71
|
+
});
|
|
69
72
|
}
|
|
70
73
|
catch (e) {
|
|
71
74
|
setHasError(true);
|
|
@@ -81,7 +84,7 @@ const ViewsBase = () => {
|
|
|
81
84
|
user.favourite_views,
|
|
82
85
|
type,
|
|
83
86
|
favouritesOnly,
|
|
84
|
-
|
|
87
|
+
request,
|
|
85
88
|
pageCount,
|
|
86
89
|
offset
|
|
87
90
|
]);
|
|
@@ -100,17 +103,21 @@ const ViewsBase = () => {
|
|
|
100
103
|
}, [response, load]);
|
|
101
104
|
const onPageChange = useCallback((_offset) => {
|
|
102
105
|
if (_offset !== offset) {
|
|
103
|
-
|
|
106
|
+
const modifiedRequest = getSearchRequestData({ offset: _offset });
|
|
107
|
+
searchParams.set('offset', modifiedRequest.offset.toString());
|
|
104
108
|
setSearchParams(searchParams, { replace: true });
|
|
105
|
-
setOffset(
|
|
109
|
+
setOffset(modifiedRequest.offset);
|
|
106
110
|
}
|
|
107
|
-
}, [offset, searchParams, setSearchParams]);
|
|
108
|
-
const onDelete = useCallback(
|
|
111
|
+
}, [offset, searchParams, setSearchParams, getSearchRequestData]);
|
|
112
|
+
const onDelete = useCallback((event, id) => {
|
|
109
113
|
event.preventDefault();
|
|
110
114
|
event.stopPropagation();
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
withConfirmDeleteModal(async () => {
|
|
116
|
+
await removeView(id);
|
|
117
|
+
remove(id);
|
|
118
|
+
showSuccessMessage(t('route.views.manager.delete.success'));
|
|
119
|
+
});
|
|
120
|
+
}, [remove, removeView, withConfirmDeleteModal, showSuccessMessage, t]);
|
|
114
121
|
const onFavourite = useCallback(async (event, id) => {
|
|
115
122
|
event.preventDefault();
|
|
116
123
|
if (user.favourite_views?.includes(id)) {
|
|
@@ -178,6 +185,6 @@ const ViewsBase = () => {
|
|
|
178
185
|
(item.item.type === 'global' && user.is_admin)) && (_jsx(Tooltip, { title: t('button.edit'), children: _jsx(IconButton, { component: Link, to: `/views/${item.item.view_id}/edit?query=${item.item.query}`, children: _jsx(Edit, {}) }) })), item.item.owner === user.username && item.item.type !== 'readonly' && (_jsx(Tooltip, { title: t('button.delete'), children: _jsx(IconButton, { onClick: event => onDelete(event, item.item.view_id), children: _jsx(Clear, {}) }) })), item.item.type === 'global' && item.item.owner !== user.username && (_jsx(Tooltip, { title: item.item.owner, children: _jsx("div", { children: _jsx(HowlerAvatar, { sx: { width: 24, height: 24, marginRight: '8px !important', marginLeft: '8px !important' }, userId: item.item.owner }) }) })), _jsx(Tooltip, { title: t('button.pin'), children: _jsx(IconButton, { onClick: e => onFavourite(e, item.item.view_id), children: user.favourite_views?.includes(item.item.view_id) ? _jsx(Star, {}) : _jsx(StarBorder, {}) }) })] }) }, item.item.view_id)), response: response, searchPrompt: "route.views.manager.search", onCreate: () => navigate('/views/create'), createPrompt: "route.views.create", createIcon: _jsx(SavedSearch, { sx: { mr: 1 } }) }));
|
|
179
186
|
};
|
|
180
187
|
const Views = () => {
|
|
181
|
-
return (_jsx(TuiListProvider, { children: _jsx(ViewsBase, {}) }));
|
|
188
|
+
return (_jsx(TuiListProvider, { children: _jsx(SearchResponseProvider, { idField: "view_id", children: _jsx(ViewsBase, {}) }) }));
|
|
182
189
|
};
|
|
183
190
|
export default Views;
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"*": "All values",
|
|
3
3
|
"Protected B": "Protected B",
|
|
4
4
|
"Unclassified//Official Use Only": "Unclassified//Official Use Only",
|
|
5
|
+
"actions.error": "Action \"{{action}}\" had error(s): {{messages}}",
|
|
5
6
|
"actions.running": "Action \"{{action}}\" is executing.",
|
|
6
|
-
"actions.succeeded": "Action \"{{action}}\" completed successfully.",
|
|
7
7
|
"actions.skipped": "Action \"{{action}}\" was skipped: {{messages}}",
|
|
8
|
-
"actions.
|
|
8
|
+
"actions.succeeded": "Action \"{{action}}\" completed successfully.",
|
|
9
9
|
"add": "Add",
|
|
10
10
|
"adminmenu": "Admin menu",
|
|
11
11
|
"adminmenu.config": "Configuration",
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
"analytic.notebook.error.minFields": "Name and link are required.",
|
|
16
16
|
"analytic.notebook.link": "Link",
|
|
17
17
|
"analytic.notebook.name": "Name",
|
|
18
|
-
"analytic.open": "Open Analytic",
|
|
19
18
|
"any": "Any",
|
|
20
19
|
"api.user.apikey.removed": "API key removed successfully.",
|
|
21
20
|
"api.user.apikey.updated": "New API key added successfully.",
|
|
@@ -27,6 +26,9 @@
|
|
|
27
26
|
"apikey.impersonate": "Impersonate",
|
|
28
27
|
"apikey.read": "Read",
|
|
29
28
|
"apikey.write": "Write",
|
|
29
|
+
"app.drawer.hit.assessment.assessor": "Assessor",
|
|
30
|
+
"app.drawer.hit.assessment.unknown.name": "Unknown",
|
|
31
|
+
"app.drawer.hit.assignment.assignee": "Assignee",
|
|
30
32
|
"app.drawer.hit.assignment.autocomplete.label": "Choose Assignee",
|
|
31
33
|
"app.drawer.hit.assignment.description": "Choose a user to assign this hit to.",
|
|
32
34
|
"app.drawer.hit.assignment.success": "User assigned to hit sucessfully.",
|
|
@@ -84,8 +86,6 @@
|
|
|
84
86
|
"comments.edit.stop": "Stop Editing",
|
|
85
87
|
"comments.edited": "Edited",
|
|
86
88
|
"comments.quote": "Quote Reply",
|
|
87
|
-
"complete": "Complete",
|
|
88
|
-
"crisis": "Crisis",
|
|
89
89
|
"custom": "Custom",
|
|
90
90
|
"date.range.1.day": "The last day",
|
|
91
91
|
"date.range.1.month": "The last month",
|
|
@@ -111,12 +111,8 @@
|
|
|
111
111
|
"drawer.expand": "Expand Menu",
|
|
112
112
|
"duplicates.omitted": "Some duplicate entries have been omitted.",
|
|
113
113
|
"edit": "Edit",
|
|
114
|
-
"enabled": "Enabled",
|
|
115
|
-
"event.module": "Event Module",
|
|
116
|
-
"event.type": "Event Type",
|
|
117
114
|
"features.warning.description": "This feature is undergoing active development, and is not yet in a finished state. You may encounter bugs or instability.",
|
|
118
115
|
"features.warning.title": "Feature In Active Development",
|
|
119
|
-
"focus": "Main focus",
|
|
120
116
|
"global": "Global",
|
|
121
117
|
"help.actions.introduction": "Introduction to Actions",
|
|
122
118
|
"help.hit.banner.description": "See the below hit banner example for the hit keys necessary to properly populate it. If you have any additional questions, ask in the HOWLER support channel.",
|
|
@@ -173,21 +169,17 @@
|
|
|
173
169
|
"hit.header.assignment": "Assignment: {{user}}",
|
|
174
170
|
"hit.header.assignment.add": "Assign to a user",
|
|
175
171
|
"hit.header.assignment.change": "Change assignment",
|
|
172
|
+
"hit.header.bundlesize": "{{hits}} hits",
|
|
176
173
|
"hit.header.escalation": "Escalation Level: ",
|
|
177
174
|
"hit.header.indicators": "Indicators",
|
|
178
175
|
"hit.header.link": "Open Link",
|
|
179
176
|
"hit.header.rationale": "Rationale",
|
|
180
|
-
"hit.header.related": "{{count}} related records",
|
|
181
177
|
"hit.header.scrutiny": "Scrutiny: ",
|
|
182
178
|
"hit.header.status": "Status: ",
|
|
183
179
|
"hit.header.summary": "Summary",
|
|
184
180
|
"hit.header.target": "Target",
|
|
185
181
|
"hit.header.threat": "Threat",
|
|
186
|
-
"hit.header.view.case": "View case {{id}}",
|
|
187
|
-
"hit.header.view.hit": "View hit {{id}}",
|
|
188
|
-
"hit.header.view.observable": "View observable {{id}}",
|
|
189
182
|
"hit.header.votes": "Votes: ",
|
|
190
|
-
"hit.howler.related": "{{count}} related records",
|
|
191
183
|
"hit.label": "Labels",
|
|
192
184
|
"hit.label.category.assignments": "Category: Assignments - Specifies what analyst or team of analysts is assigned to triaging this hit.",
|
|
193
185
|
"hit.label.category.campaign": "Catergory: Campaign - Identifies ongoing campaigns from specific malware families or phishing initiatives. They should only be considered correct attributions if the hit is promoted to evidence.",
|
|
@@ -210,9 +202,9 @@
|
|
|
210
202
|
"hit.notebook.goTo": "Go to Jupyterhub",
|
|
211
203
|
"hit.notebook.select": "Please Select a notebook",
|
|
212
204
|
"hit.notebook.tooltip": "Open in Jupyterhub",
|
|
213
|
-
"hit.open": "Open Hit",
|
|
214
205
|
"hit.overview.missing": "No overview has been created for this hit. In order to create an overview, press the add button to the right.",
|
|
215
206
|
"hit.panel.aggregation.run": "Create Summary",
|
|
207
|
+
"hit.panel.analytic.open": "Open Analytic",
|
|
216
208
|
"hit.panel.bundles.open": "Parent Bundles",
|
|
217
209
|
"hit.panel.bundles.open.prompt": "Open Parent Bundle",
|
|
218
210
|
"hit.panel.close": "Close",
|
|
@@ -225,12 +217,9 @@
|
|
|
225
217
|
"hit.panel.exclude": "Exclude By",
|
|
226
218
|
"hit.panel.hit.noselection": "No hit has been selected",
|
|
227
219
|
"hit.panel.include": "Include By",
|
|
220
|
+
"hit.panel.open": "Open Hit Viewer",
|
|
228
221
|
"hit.panel.view.layout": "Change View Panel",
|
|
229
222
|
"hit.quicksearch": "Search by assignment, analytic, detection or status",
|
|
230
|
-
"hit.related.tab.case": "Cases",
|
|
231
|
-
"hit.related.tab.hit": "Hits",
|
|
232
|
-
"hit.related.tab.links": "Links",
|
|
233
|
-
"hit.related.tab.observable": "Observables",
|
|
234
223
|
"hit.search.aggregate.button": "Create Summary",
|
|
235
224
|
"hit.search.button": "Perform search",
|
|
236
225
|
"hit.search.custom": "Custom Sort",
|
|
@@ -239,9 +228,6 @@
|
|
|
239
228
|
"hit.search.filter.fields": "Fields",
|
|
240
229
|
"hit.search.filter.label": "Lookup Filters",
|
|
241
230
|
"hit.search.filter.values": "Values",
|
|
242
|
-
"hit.search.index": "Indexes",
|
|
243
|
-
"hit.search.index.hit": "Hits",
|
|
244
|
-
"hit.search.index.observable": "Observables",
|
|
245
231
|
"hit.search.invalid": "Invalid Query",
|
|
246
232
|
"hit.search.keyboard": "Keyboard shortcuts",
|
|
247
233
|
"hit.search.keyboard.no_shortcuts": "No shortcuts",
|
|
@@ -315,31 +301,6 @@
|
|
|
315
301
|
"modal.action.empty": "Action Name cannot be empty.",
|
|
316
302
|
"modal.action.label": "Action Name",
|
|
317
303
|
"modal.action.title": "Save Action",
|
|
318
|
-
"modal.cases.add_to_case": "Add to Case",
|
|
319
|
-
"modal.cases.add_to_case.full_path": "Full path: {{path}}",
|
|
320
|
-
"modal.cases.add_to_case.items_section": "Alert Placement",
|
|
321
|
-
"modal.cases.add_to_case.path_invalid": "Path must not start or end with a /",
|
|
322
|
-
"modal.cases.add_to_case.select_case": "Search Cases",
|
|
323
|
-
"modal.cases.add_to_case.select_path": "Select Folder Path",
|
|
324
|
-
"modal.cases.add_to_case.title": "Item Title",
|
|
325
|
-
"modal.cases.alerts.resolved": "Resolved Alerts",
|
|
326
|
-
"modal.cases.create_case": "Create Case",
|
|
327
|
-
"modal.cases.create_case.escalation": "Escalation",
|
|
328
|
-
"modal.cases.create_case.full_path": "Full path: {{path}}",
|
|
329
|
-
"modal.cases.create_case.item.path": "Folder Path (optional)",
|
|
330
|
-
"modal.cases.create_case.item.title": "Item Title",
|
|
331
|
-
"modal.cases.create_case.items_section": "Alert Placement",
|
|
332
|
-
"modal.cases.create_case.overview": "Case Overview (Markdown, optional)",
|
|
333
|
-
"modal.cases.create_case.summary": "Short Case Summary",
|
|
334
|
-
"modal.cases.create_case.title": "Case Title",
|
|
335
|
-
"modal.cases.rename_item": "Rename Item",
|
|
336
|
-
"modal.cases.rename_item.error.empty": "Name cannot be empty",
|
|
337
|
-
"modal.cases.rename_item.error.slash": "Name cannot contain '/'",
|
|
338
|
-
"modal.cases.rename_item.error.taken": "An item already exists at this path",
|
|
339
|
-
"modal.cases.rename_item.folder_path": "Folder: {{path}}",
|
|
340
|
-
"modal.cases.rename_item.new_name": "New Name",
|
|
341
|
-
"modal.cases.resolve": "Resolve Case",
|
|
342
|
-
"modal.cases.resolve.description": "When resolving a case, you must either assess all open alerts, or add an assessment to the alerts.",
|
|
343
304
|
"modal.confirm.delete.description": "Are you sure you want to delete this item?",
|
|
344
305
|
"modal.confirm.delete.title": "Confirm Deletion",
|
|
345
306
|
"modal.rationale.description": "Provide a rationale that succinctly explains to other analysts why you are confident in this assessment.",
|
|
@@ -361,8 +322,6 @@
|
|
|
361
322
|
"modal.rule.title": "Create a New Rule",
|
|
362
323
|
"no.data": "No Data",
|
|
363
324
|
"none": "None",
|
|
364
|
-
"normal": "Normal Priority",
|
|
365
|
-
"observable.open": "Open Observable",
|
|
366
325
|
"on": "on",
|
|
367
326
|
"open": "Open",
|
|
368
327
|
"operations.add_label": "Add Label",
|
|
@@ -384,60 +343,6 @@
|
|
|
384
343
|
"page.403.title": "403: Access Forbidden",
|
|
385
344
|
"page.404.description": "The page you are looking for cannot be found...",
|
|
386
345
|
"page.404.title": "404: Not found",
|
|
387
|
-
"page.cases.assets": "Assets",
|
|
388
|
-
"page.cases.assets.empty": "No assets found.",
|
|
389
|
-
"page.cases.assets.filter_by_type": "Filter by type:",
|
|
390
|
-
"page.cases.assets.seen_in": "Seen in",
|
|
391
|
-
"page.cases.assets.type.hash": "Hash",
|
|
392
|
-
"page.cases.assets.type.hosts": "Host",
|
|
393
|
-
"page.cases.assets.type.id": "ID",
|
|
394
|
-
"page.cases.assets.type.ids": "ID",
|
|
395
|
-
"page.cases.assets.type.ip": "IP",
|
|
396
|
-
"page.cases.assets.type.signature": "Signature",
|
|
397
|
-
"page.cases.assets.type.uri": "URI",
|
|
398
|
-
"page.cases.assets.type.user": "User",
|
|
399
|
-
"page.cases.created": "Created",
|
|
400
|
-
"page.cases.dashboard": "Dashboard",
|
|
401
|
-
"page.cases.dashboard.alerts": "Alerts",
|
|
402
|
-
"page.cases.dashboard.cases": "Related Cases",
|
|
403
|
-
"page.cases.dashboard.duration": "Duration",
|
|
404
|
-
"page.cases.dashboard.indicators": "Indicators",
|
|
405
|
-
"page.cases.dashboard.target": "Targets",
|
|
406
|
-
"page.cases.dashboard.tasks": "Tasks",
|
|
407
|
-
"page.cases.dashboard.threat": "Threats",
|
|
408
|
-
"page.cases.detail.participants": "Participants",
|
|
409
|
-
"page.cases.detail.properties": "Properties",
|
|
410
|
-
"page.cases.detail.status": "Status",
|
|
411
|
-
"page.cases.detail.viewers": "Active Viewers",
|
|
412
|
-
"page.cases.escalation": "Escalation",
|
|
413
|
-
"page.cases.folder.drop.root": "Place here to move to root",
|
|
414
|
-
"page.cases.rules": "Rules",
|
|
415
|
-
"page.cases.rules.author": "Author",
|
|
416
|
-
"page.cases.rules.create": "Create Rule",
|
|
417
|
-
"page.cases.rules.delete.confirm": "Delete this rule?",
|
|
418
|
-
"page.cases.rules.destination": "Alert Destination Path",
|
|
419
|
-
"page.cases.rules.destination.help": "Handlebars template for the case item path (e.g. alerts/{{howler.analytic}})",
|
|
420
|
-
"page.cases.rules.empty": "No correlation rules configured.",
|
|
421
|
-
"page.cases.rules.no_expiry": "No expiry",
|
|
422
|
-
"page.cases.rules.query": "Match Query",
|
|
423
|
-
"page.cases.rules.timeframe": "Rule Expiry",
|
|
424
|
-
"page.cases.sidebar.folder.remove": "Remove folder",
|
|
425
|
-
"page.cases.sidebar.item.open": "Open item",
|
|
426
|
-
"page.cases.sidebar.item.remove": "Remove item",
|
|
427
|
-
"page.cases.sidebar.item.rename": "Rename item",
|
|
428
|
-
"page.cases.sources": "Sources",
|
|
429
|
-
"page.cases.status.in-progress": "In Progress",
|
|
430
|
-
"page.cases.status.on-hold": "On Hold",
|
|
431
|
-
"page.cases.status.open": "Open",
|
|
432
|
-
"page.cases.status.resolved": "Resolved",
|
|
433
|
-
"page.cases.timeline": "Timeline",
|
|
434
|
-
"page.cases.timeline.empty": "No events match the selected filters.",
|
|
435
|
-
"page.cases.timeline.filter.escalation": "Escalation",
|
|
436
|
-
"page.cases.timeline.filter.escalation.empty": "No escalation levels found.",
|
|
437
|
-
"page.cases.timeline.filter.label": "Show only",
|
|
438
|
-
"page.cases.timeline.filter.mitre": "MITRE ATT&CK",
|
|
439
|
-
"page.cases.timeline.filter.mitre.empty": "No tactics or techniques found.",
|
|
440
|
-
"page.cases.updated": "Updated",
|
|
441
346
|
"page.dashboard.settings.edit": "Edit Dashboard",
|
|
442
347
|
"page.dashboard.settings.refreshRate": "Refresh Rate",
|
|
443
348
|
"page.dashboard.title": "Dashboard",
|
|
@@ -462,7 +367,6 @@
|
|
|
462
367
|
"page.help": "Help",
|
|
463
368
|
"page.help.title": "Help Dashboard",
|
|
464
369
|
"page.login.button": "Sign in",
|
|
465
|
-
"page.login.error": "Just type anything in the username and password fields...",
|
|
466
370
|
"page.login.password": "Password",
|
|
467
371
|
"page.login.username": "Username",
|
|
468
372
|
"page.logout": "Logging out current user ... ",
|
|
@@ -489,6 +393,8 @@
|
|
|
489
393
|
"page.settings.local.results.count.description": "How many results should we show per page when showing search results?",
|
|
490
394
|
"page.settings.local.search.width": "Maximum Results Width",
|
|
491
395
|
"page.settings.local.search.width.description": "The maximum size (in pixels) the results column in the search page.",
|
|
396
|
+
"page.settings.local.show.hit.summary.graph": "Show the Hit Summary Graph in Hit Search",
|
|
397
|
+
"page.settings.local.show.hit.summary.graph.description": "Shows the Hit Summary Graph in the Hit Search",
|
|
492
398
|
"page.settings.local.title": "UI Preferences",
|
|
493
399
|
"page.settings.profile.table.email": "Email",
|
|
494
400
|
"page.settings.profile.table.groups": "Groups",
|
|
@@ -509,8 +415,6 @@
|
|
|
509
415
|
"page.user.search.column.groups": "Groups",
|
|
510
416
|
"page.user.search.column.username": "Username",
|
|
511
417
|
"page.user.search.prompt": "Search by username, fullname, email or group",
|
|
512
|
-
"pages.cases.detail.participants": "Participants",
|
|
513
|
-
"pages.cases.detail.status": "Status",
|
|
514
418
|
"password": "New Password",
|
|
515
419
|
"password.confirm": "Confirm Password",
|
|
516
420
|
"password.match": "Password and Confirm Password must match",
|
|
@@ -544,6 +448,7 @@
|
|
|
544
448
|
"route.actions.edit": "Edit",
|
|
545
449
|
"route.actions.execute": "Execute",
|
|
546
450
|
"route.actions.manager": "Action Manager",
|
|
451
|
+
"route.actions.manager.delete.success": "Action removed.",
|
|
547
452
|
"route.actions.name": "Action Name",
|
|
548
453
|
"route.actions.open": "Open Query",
|
|
549
454
|
"route.actions.operation.add": "Add New Operation",
|
|
@@ -604,9 +509,11 @@
|
|
|
604
509
|
"route.analytics.deleted": "Deleted Rule!",
|
|
605
510
|
"route.analytics.detection.title": "Hits Ingested in the Last Three Months by Detection",
|
|
606
511
|
"route.analytics.detections": "Detections:",
|
|
512
|
+
"route.analytics.dropdown.detection": "Detection",
|
|
607
513
|
"route.analytics.escalation.title": "Escalation of Created Hits",
|
|
608
514
|
"route.analytics.filter.rule": "Filter on Rules",
|
|
609
515
|
"route.analytics.ingestion.title": "Number of Hits Created",
|
|
516
|
+
"route.analytics.manager.search": "Search Analytics",
|
|
610
517
|
"route.analytics.overview.description": "Description",
|
|
611
518
|
"route.analytics.overview.empty.description": "There are no existing hits for this analytic. Statistics cannot be shown.",
|
|
612
519
|
"route.analytics.overview.empty.title": "No Statistics to Show",
|
|
@@ -640,16 +547,6 @@
|
|
|
640
547
|
"route.analytics.triage.title": "Triage Settings",
|
|
641
548
|
"route.analytics.updated": "Analytic Updated!",
|
|
642
549
|
"route.analytics.view": "View Analytic",
|
|
643
|
-
"route.cases": "Cases",
|
|
644
|
-
"route.cases.create": "Create Case",
|
|
645
|
-
"route.cases.filter.assignee": "Assignee",
|
|
646
|
-
"route.cases.filter.assignees": "Assignees",
|
|
647
|
-
"route.cases.filter.date": "Date Range",
|
|
648
|
-
"route.cases.filter.myself": "Myself",
|
|
649
|
-
"route.cases.filter.status": "Status",
|
|
650
|
-
"route.cases.manager.search": "Search Cases",
|
|
651
|
-
"route.cases.search.prompt": "Search cases by title, summary, description, participants or task details",
|
|
652
|
-
"route.cases.view": "View Case",
|
|
653
550
|
"route.clear": "Clear query",
|
|
654
551
|
"route.dossiers": "Dossiers",
|
|
655
552
|
"route.dossiers.create": "New Dossier",
|
|
@@ -765,7 +662,7 @@
|
|
|
765
662
|
"route.overviews.default": "Default",
|
|
766
663
|
"route.overviews.detection": "Choose Detection",
|
|
767
664
|
"route.overviews.manager.delete": "Delete Overview",
|
|
768
|
-
"route.overviews.manager.delete.success": "Overview
|
|
665
|
+
"route.overviews.manager.delete.success": "Overview removed.",
|
|
769
666
|
"route.overviews.manager.search": "Search Overviews",
|
|
770
667
|
"route.overviews.prompt": "Activate autocomplete using [ctrl + space].",
|
|
771
668
|
"route.overviews.search.prompt": "Search by title, content, analytic or detection.",
|
|
@@ -783,6 +680,11 @@
|
|
|
783
680
|
"route.templates.default": "Default",
|
|
784
681
|
"route.templates.detection": "Choose Detection",
|
|
785
682
|
"route.templates.global": "Global",
|
|
683
|
+
"route.templates.manager.delete.success": "Template removed.",
|
|
684
|
+
"route.templates.manager.error.action": "Click to open quick fix options",
|
|
685
|
+
"route.templates.manager.error.message": "Invalid Detection",
|
|
686
|
+
"route.templates.manager.error.modal.description": "The template fields are read only and will not be used. Do you want to remove the template?",
|
|
687
|
+
"route.templates.manager.error.modal.title": "Template detection no longer exists",
|
|
786
688
|
"route.templates.manager.global": "Global",
|
|
787
689
|
"route.templates.manager.open": "Open View",
|
|
788
690
|
"route.templates.manager.personal": "Personal",
|
|
@@ -802,6 +704,7 @@
|
|
|
802
704
|
"route.views.manager": "View Manager",
|
|
803
705
|
"route.views.manager.all": "All",
|
|
804
706
|
"route.views.manager.default": "Default View",
|
|
707
|
+
"route.views.manager.delete.success": "View removed.",
|
|
805
708
|
"route.views.manager.favourites": "Show favourites only",
|
|
806
709
|
"route.views.manager.global": "Global",
|
|
807
710
|
"route.views.manager.open": "Open View",
|
|
@@ -824,11 +727,11 @@
|
|
|
824
727
|
"rule.interval.thirty.minutes": "Every thirty minutes",
|
|
825
728
|
"rule.interval.three.hours": "Every three hours",
|
|
826
729
|
"save": "Save",
|
|
730
|
+
"search.layout.settings": "Edit search result layout",
|
|
827
731
|
"search.open": "Open Search",
|
|
828
732
|
"search.result.showing": "Showing {{offset}} to {{length}} of {{total}} results",
|
|
829
733
|
"search.result.showing.single": "No results",
|
|
830
734
|
"search.total": "There are a total of {{count}} hits matching this query.",
|
|
831
|
-
"started": "Started",
|
|
832
735
|
"templates.edit.analytic": "Edit analytic template",
|
|
833
736
|
"templates.edit.detection": "Edit detection template",
|
|
834
737
|
"to": "to",
|