From 756e5a5f6e13d3479d42779a8ca141eee62d5cde Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Tue, 9 Mar 2021 12:27:04 -0500 Subject: [PATCH 01/52] init simple case ui plugin --- x-pack/plugins/case/public/index.tsx | 19 ++++++++++ x-pack/plugins/case/public/plugin.ts | 35 +++++++++++++++++++ x-pack/plugins/cases/kibana.json | 4 +-- x-pack/plugins/security_solution/kibana.json | 1 + .../public/cases/pages/create_case.tsx | 4 ++- .../plugins/security_solution/public/types.ts | 2 ++ 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/case/public/index.tsx create mode 100644 x-pack/plugins/case/public/plugin.ts diff --git a/x-pack/plugins/case/public/index.tsx b/x-pack/plugins/case/public/index.tsx new file mode 100644 index 0000000000000..5748603a7e717 --- /dev/null +++ b/x-pack/plugins/case/public/index.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext } from 'kibana/public'; +import React from 'react'; +import { CaseUiPlugin } from './plugin'; + +export const TestComponent = () =>
{'Hello from cases plugin!'}
; + +export function plugin(initializerContext: PluginInitializerContext) { + return new CaseUiPlugin(initializerContext); +} + +export { CaseUiPlugin }; +export * from './plugin'; diff --git a/x-pack/plugins/case/public/plugin.ts b/x-pack/plugins/case/public/plugin.ts new file mode 100644 index 0000000000000..cc36c8ececda1 --- /dev/null +++ b/x-pack/plugins/case/public/plugin.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart, CoreSetup, Plugin, PluginInitializerContext } from 'src/core/public'; +import { TestComponent } from '.'; + +export interface CaseUi { + caseComponent?: () => JSX.Element; +} + +// export interface CaseUiSetup {} + +export interface CaseUiStart { + caseComponent: () => JSX.Element; +} + +export class CaseUiPlugin implements Plugin { + private readonly caseUi: CaseUi = {}; + + constructor(initializerContext: PluginInitializerContext) {} + + public setup(core: CoreSetup): void { + this.caseUi.caseComponent = TestComponent; + } + + public start(core: CoreStart): CaseUiStart { + return this.caseUi as CaseUiStart; + } + + public stop() {} +} diff --git a/x-pack/plugins/cases/kibana.json b/x-pack/plugins/cases/kibana.json index 1aaf84decbe36..03c793fe9ef06 100644 --- a/x-pack/plugins/cases/kibana.json +++ b/x-pack/plugins/cases/kibana.json @@ -2,12 +2,12 @@ "configPath": ["xpack", "cases"], "id": "cases", "kibanaVersion": "kibana", - "requiredPlugins": ["actions", "securitySolution"], + "requiredPlugins": ["actions", "kibanaReact"], "optionalPlugins": [ "spaces", "security" ], "server": true, - "ui": false, + "ui": true, "version": "8.0.0" } diff --git a/x-pack/plugins/security_solution/kibana.json b/x-pack/plugins/security_solution/kibana.json index d4551f76ae390..ee59e8235533d 100644 --- a/x-pack/plugins/security_solution/kibana.json +++ b/x-pack/plugins/security_solution/kibana.json @@ -7,6 +7,7 @@ "requiredPlugins": [ "actions", "alerting", + "case", "data", "dataEnhanced", "embeddable", diff --git a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx index 24b179f4a41bf..272ae7ee8fb67 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx @@ -12,7 +12,7 @@ import { SecurityPageName } from '../../app/types'; import { getCaseUrl } from '../../common/components/link_to'; import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; import { WrapperPage } from '../../common/components/wrapper_page'; -import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; +import { useGetUserSavedObjectPermissions, useKibana } from '../../common/lib/kibana'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { navTabs } from '../../app/home/home_navigations'; import { CaseHeaderPage } from '../components/case_header_page'; @@ -20,6 +20,7 @@ import { Create } from '../components/create'; import * as i18n from './translations'; export const CreateCasePage = React.memo(() => { + const { case: caseUi } = useKibana().services; const history = useHistory(); const userPermissions = useGetUserSavedObjectPermissions(); const search = useGetUrlSearch(navTabs.case); @@ -41,6 +42,7 @@ export const CreateCasePage = React.memo(() => { return ( <> + {caseUi.caseComponent()} diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index e88077679e1b6..32709cad1d31e 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -22,6 +22,7 @@ import { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; +import { CaseUiStart } from '../../case/public'; import { SecurityPluginSetup } from '../../security/public'; import { ResolverPluginSetup } from './resolver/types'; import { Inspect } from '../common/search_strategy'; @@ -47,6 +48,7 @@ export interface SetupPlugins { } export interface StartPlugins { + case: CaseUiStart; data: DataPublicPluginStart; embeddable: EmbeddableStart; inspector: InspectorStart; From 59756e802f512840a757e78e0360aee8b0247d08 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Tue, 9 Mar 2021 14:47:21 -0500 Subject: [PATCH 02/52] remove hello world piece --- .../security_solution/public/cases/pages/create_case.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx index 272ae7ee8fb67..24b179f4a41bf 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx @@ -12,7 +12,7 @@ import { SecurityPageName } from '../../app/types'; import { getCaseUrl } from '../../common/components/link_to'; import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; import { WrapperPage } from '../../common/components/wrapper_page'; -import { useGetUserSavedObjectPermissions, useKibana } from '../../common/lib/kibana'; +import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { navTabs } from '../../app/home/home_navigations'; import { CaseHeaderPage } from '../components/case_header_page'; @@ -20,7 +20,6 @@ import { Create } from '../components/create'; import * as i18n from './translations'; export const CreateCasePage = React.memo(() => { - const { case: caseUi } = useKibana().services; const history = useHistory(); const userPermissions = useGetUserSavedObjectPermissions(); const search = useGetUrlSearch(navTabs.case); @@ -42,7 +41,6 @@ export const CreateCasePage = React.memo(() => { return ( <> - {caseUi.caseComponent()} From 2b816e8c9e833ca2e2a361b29bc62861879982aa Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Wed, 10 Mar 2021 10:58:17 -0500 Subject: [PATCH 03/52] rename case to cases --- .../plugins/{case => cases}/public/index.tsx | 6 +++--- .../plugins/{case => cases}/public/plugin.ts | 20 +++++++------------ x-pack/plugins/security_solution/kibana.json | 2 +- .../plugins/security_solution/public/types.ts | 4 ++-- 4 files changed, 13 insertions(+), 19 deletions(-) rename x-pack/plugins/{case => cases}/public/index.tsx (81%) rename x-pack/plugins/{case => cases}/public/plugin.ts (56%) diff --git a/x-pack/plugins/case/public/index.tsx b/x-pack/plugins/cases/public/index.tsx similarity index 81% rename from x-pack/plugins/case/public/index.tsx rename to x-pack/plugins/cases/public/index.tsx index 5748603a7e717..5a96241be4621 100644 --- a/x-pack/plugins/case/public/index.tsx +++ b/x-pack/plugins/cases/public/index.tsx @@ -7,13 +7,13 @@ import { PluginInitializerContext } from 'kibana/public'; import React from 'react'; -import { CaseUiPlugin } from './plugin'; +import { CasesUiPlugin } from './plugin'; export const TestComponent = () =>
{'Hello from cases plugin!'}
; export function plugin(initializerContext: PluginInitializerContext) { - return new CaseUiPlugin(initializerContext); + return new CasesUiPlugin(initializerContext); } -export { CaseUiPlugin }; +export { CasesUiPlugin }; export * from './plugin'; diff --git a/x-pack/plugins/case/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts similarity index 56% rename from x-pack/plugins/case/public/plugin.ts rename to x-pack/plugins/cases/public/plugin.ts index cc36c8ececda1..a763e3d4fcfdf 100644 --- a/x-pack/plugins/case/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -8,27 +8,21 @@ import { CoreStart, CoreSetup, Plugin, PluginInitializerContext } from 'src/core/public'; import { TestComponent } from '.'; -export interface CaseUi { - caseComponent?: () => JSX.Element; +export interface CasesUiStart { + casesComponent: () => JSX.Element; } -// export interface CaseUiSetup {} - -export interface CaseUiStart { - caseComponent: () => JSX.Element; -} - -export class CaseUiPlugin implements Plugin { - private readonly caseUi: CaseUi = {}; +export class CasesUiPlugin implements Plugin { + private readonly casesUi = {} as CasesUiStart; constructor(initializerContext: PluginInitializerContext) {} public setup(core: CoreSetup): void { - this.caseUi.caseComponent = TestComponent; + this.casesUi.casesComponent = TestComponent; } - public start(core: CoreStart): CaseUiStart { - return this.caseUi as CaseUiStart; + public start(core: CoreStart): CasesUiStart { + return this.casesUi; } public stop() {} diff --git a/x-pack/plugins/security_solution/kibana.json b/x-pack/plugins/security_solution/kibana.json index ee59e8235533d..50a5f62740271 100644 --- a/x-pack/plugins/security_solution/kibana.json +++ b/x-pack/plugins/security_solution/kibana.json @@ -7,7 +7,7 @@ "requiredPlugins": [ "actions", "alerting", - "case", + "cases", "data", "dataEnhanced", "embeddable", diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index 32709cad1d31e..e3d2c345a2a66 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -22,7 +22,7 @@ import { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; -import { CaseUiStart } from '../../case/public'; +import { CasesUiStart } from '../../cases/public'; import { SecurityPluginSetup } from '../../security/public'; import { ResolverPluginSetup } from './resolver/types'; import { Inspect } from '../common/search_strategy'; @@ -48,7 +48,7 @@ export interface SetupPlugins { } export interface StartPlugins { - case: CaseUiStart; + cases: CasesUiStart; data: DataPublicPluginStart; embeddable: EmbeddableStart; inspector: InspectorStart; From d5cbcd1c68ba2f83e512f5e95702b6b844351e12 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 10 Mar 2021 13:43:34 -0700 Subject: [PATCH 04/52] move create --- x-pack/plugins/cases/public/common/errors.ts | 39 + x-pack/plugins/cases/public/common/kibana.ts | 14 + .../plugins/cases/public/common/mock/index.ts | 8 + .../public/common/mock/kibana_react.mock.ts | 23 + .../public/common/mock/test_providers.tsx | 58 ++ .../plugins/cases/public/common/services.ts | 42 ++ .../cases/public/common/shared_imports.ts | 33 + .../cases/public/common/translations.ts | 252 +++++++ .../cases/public/components/__mock__/form.ts | 50 ++ .../configure_cases/__mock__/index.tsx | 61 ++ .../configure_cases/closure_options.test.tsx | 58 ++ .../configure_cases/closure_options.tsx | 54 ++ .../closure_options_radio.test.tsx | 77 ++ .../configure_cases/closure_options_radio.tsx | 60 ++ .../configure_cases/connectors.test.tsx | 115 +++ .../components/configure_cases/connectors.tsx | 119 +++ .../connectors_dropdown.test.tsx | 203 ++++++ .../configure_cases/connectors_dropdown.tsx | 121 ++++ .../configure_cases/field_mapping.test.tsx | 55 ++ .../configure_cases/field_mapping.tsx | 73 ++ .../field_mapping_row_static.tsx | 60 ++ .../components/configure_cases/index.test.tsx | 593 +++++++++++++++ .../components/configure_cases/index.tsx | 224 ++++++ .../configure_cases/mapping.test.tsx | 47 ++ .../components/configure_cases/mapping.tsx | 62 ++ .../configure_cases/translations.ts | 240 ++++++ .../components/configure_cases/utils.test.tsx | 64 ++ .../components/configure_cases/utils.ts | 80 ++ .../connector_selector/form.test.tsx | 69 ++ .../components/connector_selector/form.tsx | 70 ++ .../public/components/connectors/card.tsx | 71 ++ .../connectors/case/alert_fields.tsx | 106 +++ .../connectors/case/cases_dropdown.tsx | 73 ++ .../connectors/case/existing_case.tsx | 76 ++ .../components/connectors/case/index.ts | 42 ++ .../connectors/case/translations.ts | 109 +++ .../components/connectors/case/types.ts | 18 + .../public/components/connectors/config.ts | 39 + .../connectors/connectors_registry.ts | 55 ++ .../components/connectors/fields_form.tsx | 54 ++ .../public/components/connectors/index.ts | 57 ++ .../connectors/jira/__mocks__/api.ts | 45 ++ .../components/connectors/jira/api.test.ts | 160 ++++ .../public/components/connectors/jira/api.ts | 93 +++ .../connectors/jira/case_fields.test.tsx | 263 +++++++ .../connectors/jira/case_fields.tsx | 214 ++++++ .../components/connectors/jira/index.ts | 27 + .../connectors/jira/search_issues.tsx | 95 +++ .../connectors/jira/translations.ts | 77 ++ .../components/connectors/jira/types.ts | 22 + .../use_get_fields_by_issue_type.test.tsx | 105 +++ .../jira/use_get_fields_by_issue_type.tsx | 96 +++ .../jira/use_get_issue_types.test.tsx | 107 +++ .../connectors/jira/use_get_issue_types.tsx | 102 +++ .../connectors/jira/use_get_issues.test.tsx | 80 ++ .../connectors/jira/use_get_issues.tsx | 97 +++ .../jira/use_get_single_issue.test.tsx | 80 ++ .../connectors/jira/use_get_single_issue.tsx | 95 +++ .../public/components/connectors/mock.ts | 121 ++++ .../connectors/resilient/__mocks__/api.ts | 16 + .../components/connectors/resilient/api.ts | 42 ++ .../connectors/resilient/case_fields.test.tsx | 134 ++++ .../connectors/resilient/case_fields.tsx | 189 +++++ .../components/connectors/resilient/index.ts | 26 + .../connectors/resilient/translations.ts | 43 ++ .../components/connectors/resilient/types.ts | 9 + .../resilient/use_get_incident_types.test.tsx | 71 ++ .../resilient/use_get_incident_types.tsx | 94 +++ .../resilient/use_get_severity.test.tsx | 77 ++ .../connectors/resilient/use_get_severity.tsx | 91 +++ .../connectors/servicenow/__mocks__/api.ts | 19 + .../connectors/servicenow/api.test.ts | 40 + .../components/connectors/servicenow/api.ts | 31 + .../connectors/servicenow/helpers.ts | 12 + .../components/connectors/servicenow/index.ts | 35 + .../servicenow_itsm_case_fields.test.tsx | 164 +++++ .../servicenow_itsm_case_fields.tsx | 235 ++++++ .../servicenow_sir_case_fields.test.tsx | 221 ++++++ .../servicenow/servicenow_sir_case_fields.tsx | 282 ++++++++ .../connectors/servicenow/translations.ts | 99 +++ .../components/connectors/servicenow/types.ts | 15 + .../servicenow/use_get_choices.test.tsx | 144 ++++ .../connectors/servicenow/use_get_choices.tsx | 101 +++ .../public/components/connectors/types.ts | 53 ++ .../components/create/connector.test.tsx | 187 +++++ .../public/components/create/connector.tsx | 103 +++ .../components/create/description.test.tsx | 62 ++ .../public/components/create/description.tsx | 32 + .../public/components/create/flyout.test.tsx | 116 +++ .../cases/public/components/create/flyout.tsx | 71 ++ .../public/components/create/form.test.tsx | 109 +++ .../cases/public/components/create/form.tsx | 119 +++ .../components/create/form_context.test.tsx | 682 ++++++++++++++++++ .../public/components/create/form_context.tsx | 120 +++ .../public/components/create/index.test.tsx | 157 ++++ .../cases/public/components/create/index.tsx | 55 ++ .../cases/public/components/create/mock.ts | 102 +++ .../optional_field_label/index.test.tsx | 19 + .../create/optional_field_label/index.tsx | 17 + .../cases/public/components/create/schema.tsx | 58 ++ .../components/create/submit_button.test.tsx | 88 +++ .../components/create/submit_button.tsx | 31 + .../create/sync_alerts_toggle.test.tsx | 79 ++ .../components/create/sync_alerts_toggle.tsx | 38 + .../public/components/create/tags.test.tsx | 79 ++ .../cases/public/components/create/tags.tsx | 49 ++ .../public/components/create/title.test.tsx | 72 ++ .../cases/public/components/create/title.tsx | 33 + .../public/components/create/translations.ts | 38 + .../public/components/status/button.test.tsx | 90 +++ .../cases/public/components/status/button.tsx | 52 ++ .../cases/public/components/status/config.ts | 82 +++ .../cases/public/components/status/index.ts | 11 + .../public/components/status/stats.test.tsx | 66 ++ .../cases/public/components/status/stats.tsx | 40 + .../public/components/status/status.test.tsx | 72 ++ .../cases/public/components/status/status.tsx | 43 ++ .../public/components/status/translations.ts | 72 ++ .../cases/public/components/status/types.ts | 43 ++ .../modal_all_errors.test.tsx.snap | 48 ++ .../public/components/toasters/errors.ts | 19 + .../public/components/toasters/index.test.tsx | 307 ++++++++ .../public/components/toasters/index.tsx | 136 ++++ .../toasters/modal_all_errors.test.tsx | 70 ++ .../components/toasters/modal_all_errors.tsx | 75 ++ .../components/toasters/translations.ts | 26 + .../public/components/toasters/utils.test.ts | 128 ++++ .../cases/public/components/toasters/utils.ts | 149 ++++ .../create_case_modal.test.tsx | 127 ++++ .../create_case_modal.tsx | 67 ++ .../use_create_case_modal/index.test.tsx | 156 ++++ .../use_create_case_modal/index.tsx | 60 ++ .../public/components/wrappers/index.tsx | 26 + .../cases/public/containers/__mocks__/api.ts | 114 +++ .../cases/public/containers/api.test.tsx | 465 ++++++++++++ x-pack/plugins/cases/public/containers/api.ts | 347 +++++++++ .../containers/configure/__mocks__/api.ts | 36 + .../public/containers/configure/api.test.ts | 154 ++++ .../cases/public/containers/configure/api.ts | 103 +++ .../cases/public/containers/configure/mock.ts | 160 ++++ .../containers/configure/translations.ts | 17 + .../public/containers/configure/types.ts | 46 ++ .../configure/use_action_types.test.tsx | 102 +++ .../containers/configure/use_action_types.tsx | 73 ++ .../configure/use_configure.test.tsx | 326 +++++++++ .../containers/configure/use_configure.tsx | 365 ++++++++++ .../configure/use_connectors.test.tsx | 96 +++ .../containers/configure/use_connectors.tsx | 72 ++ .../plugins/cases/public/containers/mock.ts | 377 ++++++++++ .../cases/public/containers/translations.ts | 96 +++ .../plugins/cases/public/containers/types.ts | 175 +++++ .../public/containers/use_get_cases.test.tsx | 204 ++++++ .../cases/public/containers/use_get_cases.tsx | 255 +++++++ .../public/containers/use_get_tags.test.tsx | 89 +++ .../cases/public/containers/use_get_tags.tsx | 100 +++ .../public/containers/use_post_case.test.tsx | 114 +++ .../cases/public/containers/use_post_case.tsx | 91 +++ .../use_post_push_to_service.test.tsx | 101 +++ .../containers/use_post_push_to_service.tsx | 112 +++ .../cases/public/containers/utils.test.ts | 170 +++++ .../plugins/cases/public/containers/utils.ts | 150 ++++ x-pack/plugins/cases/public/plugin.ts | 27 +- x-pack/plugins/cases/public/types.ts | 24 + .../security_solution/common/constants.ts | 7 + .../public/cases/components/create/index.tsx | 70 +- 165 files changed, 16936 insertions(+), 29 deletions(-) create mode 100644 x-pack/plugins/cases/public/common/errors.ts create mode 100644 x-pack/plugins/cases/public/common/kibana.ts create mode 100644 x-pack/plugins/cases/public/common/mock/index.ts create mode 100644 x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts create mode 100644 x-pack/plugins/cases/public/common/mock/test_providers.tsx create mode 100644 x-pack/plugins/cases/public/common/services.ts create mode 100644 x-pack/plugins/cases/public/common/shared_imports.ts create mode 100644 x-pack/plugins/cases/public/common/translations.ts create mode 100644 x-pack/plugins/cases/public/components/__mock__/form.ts create mode 100644 x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/closure_options.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/closure_options.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/connectors.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/index.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/mapping.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/mapping.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/translations.ts create mode 100644 x-pack/plugins/cases/public/components/configure_cases/utils.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/utils.ts create mode 100644 x-pack/plugins/cases/public/components/connector_selector/form.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connector_selector/form.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/card.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/case/cases_dropdown.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/case/index.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/case/translations.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/case/types.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/config.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/connectors_registry.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/fields_form.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/index.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/__mocks__/api.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/api.test.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/api.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/index.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/translations.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/types.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/mock.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/__mocks__/api.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/api.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/index.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/translations.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/types.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/__mocks__/api.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/api.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/helpers.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/index.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/types.ts create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx create mode 100644 x-pack/plugins/cases/public/components/connectors/types.ts create mode 100644 x-pack/plugins/cases/public/components/create/connector.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/connector.tsx create mode 100644 x-pack/plugins/cases/public/components/create/description.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/description.tsx create mode 100644 x-pack/plugins/cases/public/components/create/flyout.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/flyout.tsx create mode 100644 x-pack/plugins/cases/public/components/create/form.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/form.tsx create mode 100644 x-pack/plugins/cases/public/components/create/form_context.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/form_context.tsx create mode 100644 x-pack/plugins/cases/public/components/create/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/index.tsx create mode 100644 x-pack/plugins/cases/public/components/create/mock.ts create mode 100644 x-pack/plugins/cases/public/components/create/optional_field_label/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/optional_field_label/index.tsx create mode 100644 x-pack/plugins/cases/public/components/create/schema.tsx create mode 100644 x-pack/plugins/cases/public/components/create/submit_button.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/submit_button.tsx create mode 100644 x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/sync_alerts_toggle.tsx create mode 100644 x-pack/plugins/cases/public/components/create/tags.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/tags.tsx create mode 100644 x-pack/plugins/cases/public/components/create/title.test.tsx create mode 100644 x-pack/plugins/cases/public/components/create/title.tsx create mode 100644 x-pack/plugins/cases/public/components/create/translations.ts create mode 100644 x-pack/plugins/cases/public/components/status/button.test.tsx create mode 100644 x-pack/plugins/cases/public/components/status/button.tsx create mode 100644 x-pack/plugins/cases/public/components/status/config.ts create mode 100644 x-pack/plugins/cases/public/components/status/index.ts create mode 100644 x-pack/plugins/cases/public/components/status/stats.test.tsx create mode 100644 x-pack/plugins/cases/public/components/status/stats.tsx create mode 100644 x-pack/plugins/cases/public/components/status/status.test.tsx create mode 100644 x-pack/plugins/cases/public/components/status/status.tsx create mode 100644 x-pack/plugins/cases/public/components/status/translations.ts create mode 100644 x-pack/plugins/cases/public/components/status/types.ts create mode 100644 x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/toasters/errors.ts create mode 100644 x-pack/plugins/cases/public/components/toasters/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/toasters/index.tsx create mode 100644 x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx create mode 100644 x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx create mode 100644 x-pack/plugins/cases/public/components/toasters/translations.ts create mode 100644 x-pack/plugins/cases/public/components/toasters/utils.test.ts create mode 100644 x-pack/plugins/cases/public/components/toasters/utils.ts create mode 100644 x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx create mode 100644 x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx create mode 100644 x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx create mode 100644 x-pack/plugins/cases/public/components/wrappers/index.tsx create mode 100644 x-pack/plugins/cases/public/containers/__mocks__/api.ts create mode 100644 x-pack/plugins/cases/public/containers/api.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/api.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/api.test.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/api.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/mock.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/translations.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/types.ts create mode 100644 x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/configure/use_action_types.tsx create mode 100644 x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/configure/use_configure.tsx create mode 100644 x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/configure/use_connectors.tsx create mode 100644 x-pack/plugins/cases/public/containers/mock.ts create mode 100644 x-pack/plugins/cases/public/containers/translations.ts create mode 100644 x-pack/plugins/cases/public/containers/types.ts create mode 100644 x-pack/plugins/cases/public/containers/use_get_cases.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_cases.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_tags.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_tags.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_post_case.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_post_case.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx create mode 100644 x-pack/plugins/cases/public/containers/utils.test.ts create mode 100644 x-pack/plugins/cases/public/containers/utils.ts create mode 100644 x-pack/plugins/cases/public/types.ts diff --git a/x-pack/plugins/cases/public/common/errors.ts b/x-pack/plugins/cases/public/common/errors.ts new file mode 100644 index 0000000000000..198757e9ceade --- /dev/null +++ b/x-pack/plugins/cases/public/common/errors.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { has } from 'lodash/fp'; + +export interface AppError { + name: string; + message: string; + body: { + message: string; + }; +} + +export interface KibanaError extends AppError { + body: { + message: string; + statusCode: number; + }; +} + +export interface SecurityAppError extends AppError { + body: { + message: string; + status_code: number; + }; +} + +export const isKibanaError = (error: unknown): error is KibanaError => + has('message', error) && has('body.message', error) && has('body.statusCode', error); + +export const isSecurityAppError = (error: unknown): error is SecurityAppError => + has('message', error) && has('body.message', error) && has('body.status_code', error); + +export const isAppError = (error: unknown): error is AppError => + isKibanaError(error) || isSecurityAppError(error); diff --git a/x-pack/plugins/cases/public/common/kibana.ts b/x-pack/plugins/cases/public/common/kibana.ts new file mode 100644 index 0000000000000..af5cab6a3a314 --- /dev/null +++ b/x-pack/plugins/cases/public/common/kibana.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { useKibana } from '../../../../../src/plugins/kibana_react/public/context'; +import { StartServices } from '../types'; + +const useTypedKibana = () => useKibana(); + +export { useTypedKibana as useKibana }; diff --git a/x-pack/plugins/cases/public/common/mock/index.ts b/x-pack/plugins/cases/public/common/mock/index.ts new file mode 100644 index 0000000000000..add4c1c206dd4 --- /dev/null +++ b/x-pack/plugins/cases/public/common/mock/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './test_providers'; diff --git a/x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts b/x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts new file mode 100644 index 0000000000000..274462aec575d --- /dev/null +++ b/x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from 'kibana/public'; +import { coreMock } from '../../../../../../src/core/public/mocks'; +import React from 'react'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public/context'; + +export const createStartServicesMock = (): CoreStart => { + const core = coreMock.createStart(); + return (core as unknown) as CoreStart; +}; +export const createKibanaContextProviderMock = () => { + const services = coreMock.createStart(); + + return ({ children }: { children: React.ReactNode }) => + React.createElement(KibanaContextProvider, { services }, children); +}; diff --git a/x-pack/plugins/cases/public/common/mock/test_providers.tsx b/x-pack/plugins/cases/public/common/mock/test_providers.tsx new file mode 100644 index 0000000000000..4e40f3b3cb745 --- /dev/null +++ b/x-pack/plugins/cases/public/common/mock/test_providers.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; +import { I18nProvider } from '@kbn/i18n/react'; +import React from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { ThemeProvider } from 'styled-components'; +import { createKibanaContextProviderMock, createStartServicesMock } from './kibana_react.mock'; +import { FieldHook } from '../shared_imports'; + +interface Props { + children: React.ReactNode; +} + +export const kibanaObservable = new BehaviorSubject(createStartServicesMock()); + +window.scrollTo = jest.fn(); +const MockKibanaContextProvider = createKibanaContextProviderMock(); + +/** A utility for wrapping children in the providers required to run most tests */ +const TestProvidersComponent: React.FC = ({ children }) => ( + + + ({ eui: euiDarkVars, darkMode: true })}>{children} + + +); + +export const TestProviders = React.memo(TestProvidersComponent); + +export const useFormFieldMock = (options?: Partial>): FieldHook => { + return { + path: 'path', + type: 'type', + value: ('mockedValue' as unknown) as T, + isPristine: false, + isValidating: false, + isValidated: false, + isChangingValue: false, + errors: [], + isValid: true, + getErrorsMessages: jest.fn(), + onChange: jest.fn(), + setValue: jest.fn(), + setErrors: jest.fn(), + clearErrors: jest.fn(), + validate: jest.fn(), + reset: jest.fn(), + __isIncludedInOutput: true, + __serializeValue: jest.fn(), + ...options, + }; +}; diff --git a/x-pack/plugins/cases/public/common/services.ts b/x-pack/plugins/cases/public/common/services.ts new file mode 100644 index 0000000000000..f75ebb5cbcaf0 --- /dev/null +++ b/x-pack/plugins/cases/public/common/services.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from '../../../../../src/core/public'; + +type GlobalServices = Pick; // | 'uiSettings' & Pick; not sure if we need this + +export class KibanaServices { + private static kibanaVersion?: string; + private static services?: GlobalServices; + + public static init({ http, kibanaVersion }: GlobalServices & { kibanaVersion: string }) { + this.services = { http }; + this.kibanaVersion = kibanaVersion; + } + + public static get(): GlobalServices { + if (!this.services) { + this.throwUninitializedError(); + } + + return this.services; + } + + public static getKibanaVersion(): string { + if (!this.kibanaVersion) { + this.throwUninitializedError(); + } + + return this.kibanaVersion; + } + + private static throwUninitializedError(): never { + throw new Error( + 'Kibana services not initialized - are you trying to import this module from outside of the SIEM app?' + ); + } +} diff --git a/x-pack/plugins/cases/public/common/shared_imports.ts b/x-pack/plugins/cases/public/common/shared_imports.ts new file mode 100644 index 0000000000000..675204076b02a --- /dev/null +++ b/x-pack/plugins/cases/public/common/shared_imports.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { + getUseField, + getFieldValidityAndErrorMessage, + FieldHook, + FieldValidateResponse, + FIELD_TYPES, + Form, + FormData, + FormDataProvider, + FormHook, + FormSchema, + UseField, + UseMultiFields, + useForm, + useFormContext, + useFormData, + ValidationError, + ValidationFunc, + VALIDATION_TYPES, +} from '../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; +export { + Field, + SelectField, +} from '../../../../../src/plugins/es_ui_shared/static/forms/components'; +export { fieldValidators } from '../../../../../src/plugins/es_ui_shared/static/forms/helpers'; +export { ERROR_CODE } from '../../../../../src/plugins/es_ui_shared/static/forms/helpers/field_validators/types'; diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts new file mode 100644 index 0000000000000..881acb9d4c90e --- /dev/null +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -0,0 +1,252 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const SAVED_OBJECT_NO_PERMISSIONS_TITLE = i18n.translate( + 'xpack.cases.caseSavedObjectNoPermissionsTitle', + { + defaultMessage: 'Kibana feature privileges required', + } +); + +export const SAVED_OBJECT_NO_PERMISSIONS_MSG = i18n.translate( + 'xpack.cases.caseSavedObjectNoPermissionsMessage', + { + defaultMessage: + 'To view cases, you must have privileges for the Saved Object Management feature in the Kibana space. For more information, contact your Kibana administrator.', + } +); + +export const BACK_TO_ALL = i18n.translate('xpack.cases.caseView.backLabel', { + defaultMessage: 'Back to cases', +}); + +export const CANCEL = i18n.translate('xpack.cases.caseView.cancel', { + defaultMessage: 'Cancel', +}); + +export const DELETE_CASE = i18n.translate('xpack.cases.confirmDeleteCase.deleteCase', { + defaultMessage: 'Delete case', +}); + +export const DELETE_CASES = i18n.translate('xpack.cases.confirmDeleteCase.deleteCases', { + defaultMessage: 'Delete cases', +}); + +export const NAME = i18n.translate('xpack.cases.caseView.name', { + defaultMessage: 'Name', +}); + +export const OPENED_ON = i18n.translate('xpack.cases.caseView.openedOn', { + defaultMessage: 'Opened on', +}); + +export const CLOSED_ON = i18n.translate('xpack.cases.caseView.closedOn', { + defaultMessage: 'Closed on', +}); + +export const REPORTER = i18n.translate('xpack.cases.caseView.reporterLabel', { + defaultMessage: 'Reporter', +}); + +export const PARTICIPANTS = i18n.translate('xpack.cases.caseView.particpantsLabel', { + defaultMessage: 'Participants', +}); + +export const CREATE_BC_TITLE = i18n.translate('xpack.cases.caseView.breadcrumb', { + defaultMessage: 'Create', +}); + +export const CREATE_TITLE = i18n.translate('xpack.cases.caseView.create', { + defaultMessage: 'Create new case', +}); + +export const DESCRIPTION = i18n.translate('xpack.cases.caseView.description', { + defaultMessage: 'Description', +}); + +export const DESCRIPTION_REQUIRED = i18n.translate( + 'xpack.cases.createCase.descriptionFieldRequiredError', + { + defaultMessage: 'A description is required.', + } +); + +export const COMMENT_REQUIRED = i18n.translate('xpack.cases.caseView.commentFieldRequiredError', { + defaultMessage: 'A comment is required.', +}); + +export const REQUIRED_FIELD = i18n.translate('xpack.cases.caseView.fieldRequiredError', { + defaultMessage: 'Required field', +}); + +export const EDIT = i18n.translate('xpack.cases.caseView.edit', { + defaultMessage: 'Edit', +}); + +export const OPTIONAL = i18n.translate('xpack.cases.caseView.optional', { + defaultMessage: 'Optional', +}); + +export const PAGE_TITLE = i18n.translate('xpack.cases.pageTitle', { + defaultMessage: 'Cases', +}); + +export const CREATE_CASE = i18n.translate('xpack.cases.caseView.createCase', { + defaultMessage: 'Create case', +}); + +export const CLOSE_CASE = i18n.translate('xpack.cases.caseView.closeCase', { + defaultMessage: 'Close case', +}); + +export const MARK_CASE_IN_PROGRESS = i18n.translate('xpack.cases.caseView.markInProgress', { + defaultMessage: 'Mark in progress', +}); + +export const REOPEN_CASE = i18n.translate('xpack.cases.caseView.reopenCase', { + defaultMessage: 'Reopen case', +}); + +export const OPEN_CASE = i18n.translate('xpack.cases.caseView.openCase', { + defaultMessage: 'Open case', +}); + +export const CASE_NAME = i18n.translate('xpack.cases.caseView.caseName', { + defaultMessage: 'Case name', +}); + +export const TO = i18n.translate('xpack.cases.caseView.to', { + defaultMessage: 'to', +}); + +export const TAGS = i18n.translate('xpack.cases.caseView.tags', { + defaultMessage: 'Tags', +}); + +export const ACTIONS = i18n.translate('xpack.cases.allCases.actions', { + defaultMessage: 'Actions', +}); + +export const NO_TAGS_AVAILABLE = i18n.translate('xpack.cases.allCases.noTagsAvailable', { + defaultMessage: 'No tags available', +}); + +export const NO_REPORTERS_AVAILABLE = i18n.translate('xpack.cases.caseView.noReportersAvailable', { + defaultMessage: 'No reporters available.', +}); + +export const COMMENTS = i18n.translate('xpack.cases.allCases.comments', { + defaultMessage: 'Comments', +}); + +export const TAGS_HELP = i18n.translate('xpack.cases.createCase.fieldTagsHelpText', { + defaultMessage: + 'Type one or more custom identifying tags for this case. Press enter after each tag to begin a new one.', +}); + +export const NO_TAGS = i18n.translate('xpack.cases.caseView.noTags', { + defaultMessage: 'No tags are currently assigned to this case.', +}); + +export const TITLE_REQUIRED = i18n.translate('xpack.cases.createCase.titleFieldRequiredError', { + defaultMessage: 'A title is required.', +}); + +export const CONFIGURE_CASES_PAGE_TITLE = i18n.translate('xpack.cases.configureCases.headerTitle', { + defaultMessage: 'Configure cases', +}); + +export const CONFIGURE_CASES_BUTTON = i18n.translate('xpack.cases.configureCasesButton', { + defaultMessage: 'Edit external connection', +}); + +export const ADD_COMMENT = i18n.translate('xpack.cases.caseView.comment.addComment', { + defaultMessage: 'Add comment', +}); + +export const ADD_COMMENT_HELP_TEXT = i18n.translate( + 'xpack.cases.caseView.comment.addCommentHelpText', + { + defaultMessage: 'Add a new comment...', + } +); + +export const SAVE = i18n.translate('xpack.cases.caseView.description.save', { + defaultMessage: 'Save', +}); + +export const GO_TO_DOCUMENTATION = i18n.translate('xpack.cases.caseView.goToDocumentationButton', { + defaultMessage: 'View documentation', +}); + +export const CONNECTORS = i18n.translate('xpack.cases.caseView.connectors', { + defaultMessage: 'External Incident Management System', +}); + +export const EDIT_CONNECTOR = i18n.translate('xpack.cases.caseView.editConnector', { + defaultMessage: 'Change external incident management system', +}); + +export const NO_CONNECTOR = i18n.translate('xpack.cases.common.noConnector', { + defaultMessage: 'No connector selected', +}); + +export const UNKNOWN = i18n.translate('xpack.cases.caseView.unknown', { + defaultMessage: 'Unknown', +}); + +export const MARKED_CASE_AS = i18n.translate('xpack.cases.caseView.markedCaseAs', { + defaultMessage: 'marked case as', +}); + +export const OPEN_CASES = i18n.translate('xpack.cases.caseTable.openCases', { + defaultMessage: 'Open cases', +}); + +export const CLOSED_CASES = i18n.translate('xpack.cases.caseTable.closedCases', { + defaultMessage: 'Closed cases', +}); + +export const IN_PROGRESS_CASES = i18n.translate('xpack.cases.caseTable.inProgressCases', { + defaultMessage: 'In progress cases', +}); + +export const SYNC_ALERTS_SWITCH_LABEL_ON = i18n.translate( + 'xpack.cases.settings.syncAlertsSwitchLabelOn', + { + defaultMessage: 'On', + } +); + +export const SYNC_ALERTS_SWITCH_LABEL_OFF = i18n.translate( + 'xpack.cases.settings.syncAlertsSwitchLabelOff', + { + defaultMessage: 'Off', + } +); + +export const SYNC_ALERTS_HELP = i18n.translate('xpack.cases.components.create.syncAlertHelpText', { + defaultMessage: + 'Enabling this option will sync the status of alerts in this case with the case status.', +}); + +export const ALERT = i18n.translate('xpack.cases.common.alertLabel', { + defaultMessage: 'Alert', +}); + +export const ALERT_ADDED_TO_CASE = i18n.translate('xpack.cases.common.alertAddedToCase', { + defaultMessage: 'added to case', +}); + +export const SELECTABLE_MESSAGE_COLLECTIONS = i18n.translate( + 'xpack.cases.common.allCases.table.selectableMessageCollections', + { + defaultMessage: 'Cases with sub-cases cannot be selected', + } +); diff --git a/x-pack/plugins/cases/public/components/__mock__/form.ts b/x-pack/plugins/cases/public/components/__mock__/form.ts new file mode 100644 index 0000000000000..6d3e8353e630a --- /dev/null +++ b/x-pack/plugins/cases/public/components/__mock__/form.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useForm } from '../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; +import { useFormData } from '../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form_data'; + +jest.mock('../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'); +jest.mock( + '../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form_data' +); + +export const mockFormHook = { + isSubmitted: false, + isSubmitting: false, + isValid: true, + submit: jest.fn(), + subscribe: jest.fn(), + setFieldValue: jest.fn(), + setFieldErrors: jest.fn(), + getFields: jest.fn(), + getFormData: jest.fn(), + /* Returns a list of all errors in the form */ + getErrors: jest.fn(), + reset: jest.fn(), + __options: {}, + __formData$: {}, + __addField: jest.fn(), + __removeField: jest.fn(), + __validateFields: jest.fn(), + __updateFormDataAt: jest.fn(), + __readFieldConfigFromSchema: jest.fn(), + __getFieldDefaultValue: jest.fn(), +}; + +export const getFormMock = (sampleData: any) => ({ + ...mockFormHook, + submit: () => + Promise.resolve({ + data: sampleData, + isValid: true, + }), + getFormData: () => sampleData, +}); + +export const useFormMock = useForm as jest.Mock; +export const useFormDataMock = useFormData as jest.Mock; diff --git a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx new file mode 100644 index 0000000000000..83b0b71b32ccc --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ConnectorTypes } from '../../../../common/api'; +import { ActionConnector } from '../../../containers/configure/types'; +import { UseConnectorsResponse } from '../../../containers/configure/use_connectors'; +import { ReturnUseCaseConfigure } from '../../../containers/configure/use_configure'; +import { UseActionTypesResponse } from '../../../containers/configure/use_action_types'; +import { connectorsMock, actionTypesMock } from '../../../containers/configure/mock'; +export { mappings } from '../../../containers/configure/mock'; +export const connectors: ActionConnector[] = connectorsMock; + +// x - pack / plugins / triggers_actions_ui; +export const searchURL = + '?timerange=(global:(linkTo:!(),timerange:(from:1585487656371,fromStr:now-24h,kind:relative,to:1585574056371,toStr:now)),timeline:(linkTo:!(),timerange:(from:1585227005527,kind:absolute,to:1585313405527)))'; + +export const useCaseConfigureResponse: ReturnUseCaseConfigure = { + closureType: 'close-by-user', + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + closureType: 'close-by-user', + }, + firstLoad: false, + loading: false, + mappings: [], + persistCaseConfigure: jest.fn(), + persistLoading: false, + refetchCaseConfigure: jest.fn(), + setClosureType: jest.fn(), + setConnector: jest.fn(), + setCurrentConfiguration: jest.fn(), + setMappings: jest.fn(), + version: '', +}; + +export const useConnectorsResponse: UseConnectorsResponse = { + loading: false, + connectors, + refetchConnectors: jest.fn(), +}; + +export const useActionTypesResponse: UseActionTypesResponse = { + loading: false, + actionTypes: actionTypesMock, + refetchActionTypes: jest.fn(), +}; diff --git a/x-pack/plugins/cases/public/components/configure_cases/closure_options.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/closure_options.test.tsx new file mode 100644 index 0000000000000..56123a934d51f --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/closure_options.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; + +import { ClosureOptions, ClosureOptionsProps } from './closure_options'; +import { TestProviders } from '../../common/mock'; +import { ClosureOptionsRadio } from './closure_options_radio'; + +describe('ClosureOptions', () => { + let wrapper: ReactWrapper; + const onChangeClosureType = jest.fn(); + const props: ClosureOptionsProps = { + disabled: false, + closureTypeSelected: 'close-by-user', + onChangeClosureType, + }; + + beforeAll(() => { + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it shows the closure options form group', () => { + expect( + wrapper.find('[data-test-subj="case-closure-options-form-group"]').first().exists() + ).toBe(true); + }); + + test('it shows the closure options form row', () => { + expect(wrapper.find('[data-test-subj="case-closure-options-form-row"]').first().exists()).toBe( + true + ); + }); + + test('it shows closure options', () => { + expect(wrapper.find('[data-test-subj="case-closure-options-radio"]').first().exists()).toBe( + true + ); + }); + + test('it pass the correct props to child', () => { + const closureOptionsRadioComponent = wrapper.find(ClosureOptionsRadio); + expect(closureOptionsRadioComponent.props().disabled).toEqual(false); + expect(closureOptionsRadioComponent.props().closureTypeSelected).toEqual('close-by-user'); + expect(closureOptionsRadioComponent.props().onChangeClosureType).toEqual(onChangeClosureType); + }); + + test('the closure type is changed successfully', () => { + wrapper.find('input[id="close-by-pushing"]').simulate('change'); + + expect(onChangeClosureType).toHaveBeenCalledWith('close-by-pushing'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/closure_options.tsx b/x-pack/plugins/cases/public/components/configure_cases/closure_options.tsx new file mode 100644 index 0000000000000..ba892116320ce --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/closure_options.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; + +import { ClosureType } from '../../containers/configure/types'; +import { ClosureOptionsRadio } from './closure_options_radio'; +import * as i18n from './translations'; + +export interface ClosureOptionsProps { + closureTypeSelected: ClosureType; + disabled: boolean; + onChangeClosureType: (newClosureType: ClosureType) => void; +} + +const ClosureOptionsComponent: React.FC = ({ + closureTypeSelected, + disabled, + onChangeClosureType, +}) => { + return ( + {i18n.CASE_CLOSURE_OPTIONS_TITLE}} + description={ + <> +

{i18n.CASE_CLOSURE_OPTIONS_DESC}

+

{i18n.CASE_COLSURE_OPTIONS_SUB_CASES}

+ + } + data-test-subj="case-closure-options-form-group" + > + + + +
+ ); +}; + +export const ClosureOptions = React.memo(ClosureOptionsComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.test.tsx new file mode 100644 index 0000000000000..b9885b4e07d48 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.test.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ReactWrapper, mount } from 'enzyme'; + +import { ClosureOptionsRadio, ClosureOptionsRadioComponentProps } from './closure_options_radio'; +import { TestProviders } from '../../common/mock'; + +describe('ClosureOptionsRadio', () => { + let wrapper: ReactWrapper; + const onChangeClosureType = jest.fn(); + const props: ClosureOptionsRadioComponentProps = { + disabled: false, + closureTypeSelected: 'close-by-user', + onChangeClosureType, + }; + + beforeAll(() => { + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it renders', () => { + expect(wrapper.find('[data-test-subj="closure-options-radio-group"]').first().exists()).toBe( + true + ); + }); + + test('it shows the correct number of radio buttons', () => { + expect(wrapper.find('input[name="closure_options"]')).toHaveLength(2); + }); + + test('it renders close by user radio button', () => { + expect(wrapper.find('input[id="close-by-user"]').exists()).toBeTruthy(); + }); + + test('it renders close by pushing radio button', () => { + expect(wrapper.find('input[id="close-by-pushing"]').exists()).toBeTruthy(); + }); + + test('it disables the close by user radio button', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect(newWrapper.find('input[id="close-by-user"]').prop('disabled')).toEqual(true); + }); + + test('it disables correctly the close by pushing radio button', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect(newWrapper.find('input[id="close-by-pushing"]').prop('disabled')).toEqual(true); + }); + + test('it selects the correct radio button', () => { + const newWrapper = mount( + , + { + wrappingComponent: TestProviders, + } + ); + expect(newWrapper.find('input[id="close-by-pushing"]').prop('checked')).toEqual(true); + }); + + test('it calls the onChangeClosureType function', () => { + wrapper.find('input[id="close-by-pushing"]').simulate('change'); + wrapper.update(); + expect(onChangeClosureType).toHaveBeenCalled(); + expect(onChangeClosureType).toHaveBeenCalledWith('close-by-pushing'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.tsx b/x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.tsx new file mode 100644 index 0000000000000..cb6fa0953a796 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/closure_options_radio.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactNode, useCallback } from 'react'; +import { EuiRadioGroup } from '@elastic/eui'; + +import { ClosureType } from '../../containers/configure/types'; +import * as i18n from './translations'; + +interface ClosureRadios { + id: ClosureType; + label: ReactNode; +} + +const radios: ClosureRadios[] = [ + { + id: 'close-by-user', + label: i18n.CASE_CLOSURE_OPTIONS_MANUAL, + }, + { + id: 'close-by-pushing', + label: i18n.CASE_CLOSURE_OPTIONS_NEW_INCIDENT, + }, +]; + +export interface ClosureOptionsRadioComponentProps { + closureTypeSelected: ClosureType; + disabled: boolean; + onChangeClosureType: (newClosureType: ClosureType) => void; +} + +const ClosureOptionsRadioComponent: React.FC = ({ + closureTypeSelected, + disabled, + onChangeClosureType, +}) => { + const onChangeLocal = useCallback( + (id: string) => { + onChangeClosureType(id as ClosureType); + }, + [onChangeClosureType] + ); + + return ( + + ); +}; + +export const ClosureOptionsRadio = React.memo(ClosureOptionsRadioComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx new file mode 100644 index 0000000000000..e5a8362737ace --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; + +import { Connectors, Props } from './connectors'; +import { TestProviders } from '../../common/mock'; +import { ConnectorsDropdown } from './connectors_dropdown'; +import { connectors } from './__mock__'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +describe('Connectors', () => { + let wrapper: ReactWrapper; + const onChangeConnector = jest.fn(); + const handleShowEditFlyout = jest.fn(); + + const props: Props = { + connectors, + disabled: false, + handleShowEditFlyout, + isLoading: false, + mappings: [], + onChangeConnector, + selectedConnector: { id: 'none', type: ConnectorTypes.none }, + updateConnectorDisabled: false, + }; + + beforeAll(() => { + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it shows the connectors from group', () => { + expect(wrapper.find('[data-test-subj="case-connectors-form-group"]').first().exists()).toBe( + true + ); + }); + + test('it shows the connectors form row', () => { + expect(wrapper.find('[data-test-subj="case-connectors-form-row"]').first().exists()).toBe(true); + }); + + test('it shows the connectors dropdown', () => { + expect(wrapper.find('[data-test-subj="case-connectors-dropdown"]').first().exists()).toBe(true); + }); + + test('it pass the correct props to child', () => { + const connectorsDropdownProps = wrapper.find(ConnectorsDropdown).props(); + expect(connectorsDropdownProps).toMatchObject({ + disabled: false, + isLoading: false, + connectors, + selectedConnector: 'none', + onChange: props.onChangeConnector, + }); + }); + + test('the connector is changed successfully', () => { + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + + expect(onChangeConnector).toHaveBeenCalled(); + expect(onChangeConnector).toHaveBeenCalledWith('resilient-2'); + }); + + test('the connector is changed successfully to none', () => { + onChangeConnector.mockClear(); + const newWrapper = mount( + , + { + wrappingComponent: TestProviders, + } + ); + + newWrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + newWrapper.find('button[data-test-subj="dropdown-connector-no-connector"]').simulate('click'); + + expect(onChangeConnector).toHaveBeenCalled(); + expect(onChangeConnector).toHaveBeenCalledWith('none'); + }); + + test('it shows the add connector button', () => { + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + + expect( + wrapper.find('button[data-test-subj="dropdown-connector-add-connector"]').exists() + ).toBeTruthy(); + }); + + test('the text of the update button is shown correctly', () => { + const newWrapper = mount( + , + { + wrappingComponent: TestProviders, + } + ); + + expect( + newWrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .text() + ).toBe('Update My Connector'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx new file mode 100644 index 0000000000000..36a982190f3db --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { + EuiDescribedFormGroup, + EuiFormRow, + EuiFlexGroup, + EuiFlexItem, + EuiLink, +} from '@elastic/eui'; + +import styled from 'styled-components'; + +import { ConnectorsDropdown } from './connectors_dropdown'; +import * as i18n from './translations'; + +import { ActionConnector, CaseConnectorMapping } from '../../containers/configure/types'; +import { Mapping } from './mapping'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +const EuiFormRowExtended = styled(EuiFormRow)` + .euiFormRow__labelWrapper { + .euiFormRow__label { + width: 100%; + } + } +`; + +export interface Props { + connectors: ActionConnector[]; + disabled: boolean; + handleShowEditFlyout: () => void; + isLoading: boolean; + mappings: CaseConnectorMapping[]; + onChangeConnector: (id: string) => void; + selectedConnector: { id: string; type: string }; + updateConnectorDisabled: boolean; +} +const ConnectorsComponent: React.FC = ({ + connectors, + disabled, + handleShowEditFlyout, + isLoading, + mappings, + onChangeConnector, + selectedConnector, + updateConnectorDisabled, +}) => { + const connectorsName = useMemo( + () => connectors.find((c) => c.id === selectedConnector.id)?.name ?? 'none', + [connectors, selectedConnector.id] + ); + + const dropDownLabel = useMemo( + () => ( + + {i18n.INCIDENT_MANAGEMENT_SYSTEM_LABEL} + + {connectorsName !== 'none' && ( + + {i18n.UPDATE_SELECTED_CONNECTOR(connectorsName)} + + )} + + + ), + [connectorsName, handleShowEditFlyout, updateConnectorDisabled] + ); + return ( + <> + {i18n.INCIDENT_MANAGEMENT_SYSTEM_TITLE}} + description={i18n.INCIDENT_MANAGEMENT_SYSTEM_DESC} + data-test-subj="case-connectors-form-group" + > + + + + + + {selectedConnector.type !== ConnectorTypes.none ? ( + + + + ) : null} + + + + + ); +}; + +export const Connectors = React.memo(ConnectorsComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx new file mode 100644 index 0000000000000..5149052d9a4bf --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx @@ -0,0 +1,203 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { EuiSuperSelect } from '@elastic/eui'; + +import { ConnectorsDropdown, Props } from './connectors_dropdown'; +import { TestProviders } from '../../common/mock'; +import { connectors } from './__mock__'; + +describe('ConnectorsDropdown', () => { + let wrapper: ReactWrapper; + const props: Props = { + disabled: false, + connectors, + isLoading: false, + onChange: jest.fn(), + selectedConnector: 'none', + }; + + beforeAll(() => { + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it renders', () => { + expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().exists()).toBe(true); + }); + + test('it formats the connectors correctly', () => { + const selectProps = wrapper.find(EuiSuperSelect).props(); + + expect(selectProps.options).toMatchInlineSnapshot(` + Array [ + Object { + "data-test-subj": "dropdown-connector-no-connector", + "inputDisplay": + + + + + + No connector selected + + + , + "value": "none", + }, + Object { + "data-test-subj": "dropdown-connector-servicenow-1", + "inputDisplay": + + + + + + My Connector + + + , + "value": "servicenow-1", + }, + Object { + "data-test-subj": "dropdown-connector-resilient-2", + "inputDisplay": + + + + + + My Connector 2 + + + , + "value": "resilient-2", + }, + Object { + "data-test-subj": "dropdown-connector-jira-1", + "inputDisplay": + + + + + + Jira + + + , + "value": "jira-1", + }, + Object { + "data-test-subj": "dropdown-connector-servicenow-sir", + "inputDisplay": + + + + + + My Connector SIR + + + , + "value": "servicenow-sir", + }, + ] + `); + }); + + test('it disables the dropdown', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect( + newWrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled') + ).toEqual(true); + }); + + test('it loading correctly', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect( + newWrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') + ).toEqual(true); + }); + + test('it selects the correct connector', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect(newWrapper.find('button span:not([data-euiicon-type])').text()).toEqual('My Connector'); + }); + + test('if the props hideConnectorServiceNowSir is true, the connector should not be part of the list of options ', () => { + const newWrapper = mount( + , + { + wrappingComponent: TestProviders, + } + ); + const selectProps = newWrapper.find(EuiSuperSelect).props(); + const options = selectProps.options as Array<{ 'data-test-subj': string }>; + expect( + options.some((o) => o['data-test-subj'] === 'dropdown-connector-servicenow-1') + ).toBeTruthy(); + expect( + options.some((o) => o['data-test-subj'] === 'dropdown-connector-servicenow-sir') + ).toBeFalsy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx new file mode 100644 index 0000000000000..15d374a2bd8a9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSuperSelect } from '@elastic/eui'; +import styled from 'styled-components'; + +import { ConnectorTypes } from '../../../common/api'; +import { ActionConnector } from '../../containers/configure/types'; +import { connectorsConfiguration } from '../connectors'; +import * as i18n from './translations'; + +export interface Props { + connectors: ActionConnector[]; + disabled: boolean; + isLoading: boolean; + onChange: (id: string) => void; + selectedConnector: string; + appendAddConnectorButton?: boolean; + hideConnectorServiceNowSir?: boolean; +} + +const ICON_SIZE = 'm'; + +const EuiIconExtended = styled(EuiIcon)` + margin-right: 13px; + margin-bottom: 0 !important; +`; + +const noConnectorOption = { + value: 'none', + inputDisplay: ( + + + + + + {i18n.NO_CONNECTOR} + + + ), + 'data-test-subj': 'dropdown-connector-no-connector', +}; + +const addNewConnector = { + value: 'add-connector', + inputDisplay: ( + + {i18n.ADD_NEW_CONNECTOR} + + ), + 'data-test-subj': 'dropdown-connector-add-connector', +}; + +const ConnectorsDropdownComponent: React.FC = ({ + connectors, + disabled, + isLoading, + onChange, + selectedConnector, + appendAddConnectorButton = false, + hideConnectorServiceNowSir = false, +}) => { + const connectorsAsOptions = useMemo(() => { + const connectorsFormatted = connectors.reduce( + (acc, connector) => { + if (hideConnectorServiceNowSir && connector.actionTypeId === ConnectorTypes.serviceNowSIR) { + return acc; + } + + return [ + ...acc, + { + value: connector.id, + inputDisplay: ( + + + + + + {connector.name} + + + ), + 'data-test-subj': `dropdown-connector-${connector.id}`, + }, + ]; + }, + [noConnectorOption] + ); + + if (appendAddConnectorButton) { + return [...connectorsFormatted, addNewConnector]; + } + + return connectorsFormatted; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [connectors]); + + return ( + + ); +}; + +export const ConnectorsDropdown = React.memo(ConnectorsDropdownComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx new file mode 100644 index 0000000000000..33ea3c898334d --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; + +import { FieldMapping, FieldMappingProps } from './field_mapping'; +import { mappings } from './__mock__'; +import { TestProviders } from '../../common/mock'; +import { FieldMappingRowStatic } from './field_mapping_row_static'; + +describe('FieldMappingRow', () => { + let wrapper: ReactWrapper; + const props: FieldMappingProps = { + isLoading: false, + mappings, + connectorActionTypeId: '.servicenow', + }; + + beforeAll(() => { + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + test('it renders', () => { + expect( + wrapper.find('[data-test-subj="case-configure-field-mappings-row-wrapper"]').first().exists() + ).toBe(true); + + expect(wrapper.find(FieldMappingRowStatic).length).toEqual(3); + }); + + test('it does not render without mappings', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + expect( + newWrapper + .find('[data-test-subj="case-configure-field-mappings-row-wrapper"]') + .first() + .exists() + ).toBe(false); + }); + + test('it pass the corrects props to mapping row', () => { + const rows = wrapper.find(FieldMappingRowStatic); + rows.forEach((row, index) => { + expect(row.prop('securitySolutionField')).toEqual(mappings[index].source); + expect(row.prop('selectedActionType')).toEqual(mappings[index].actionType); + expect(row.prop('selectedThirdParty')).toEqual(mappings[index].target); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx new file mode 100644 index 0000000000000..25d4f9f90e02b --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; +import styled from 'styled-components'; + +import { FieldMappingRowStatic } from './field_mapping_row_static'; +import * as i18n from './translations'; + +import { CaseConnectorMapping } from '../../containers/configure/types'; +import { connectorsConfiguration } from '../connectors'; + +const FieldRowWrapper = styled.div` + margin: 10px 0; + font-size: 14px; +`; + +export interface FieldMappingProps { + connectorActionTypeId: string; + isLoading: boolean; + mappings: CaseConnectorMapping[]; +} + +const FieldMappingComponent: React.FC = ({ + connectorActionTypeId, + isLoading, + mappings, +}) => { + const selectedConnector = useMemo( + () => connectorsConfiguration[connectorActionTypeId] ?? { fields: {} }, + [connectorActionTypeId] + ); + return mappings.length ? ( + + + {' '} + + + {i18n.FIELD_MAPPING_FIRST_COL} + + + + {i18n.FIELD_MAPPING_SECOND_COL(selectedConnector.name)} + + + + {i18n.FIELD_MAPPING_THIRD_COL} + + + + + + {mappings.map((item) => ( + + ))} + + + + ) : null; +}; + +export const FieldMapping = React.memo(FieldMappingComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx new file mode 100644 index 0000000000000..a732f403ee646 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiCode, EuiFlexItem, EuiFlexGroup, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; + +import { capitalize } from 'lodash/fp'; +import { CaseField, ActionType, ThirdPartyField } from '../../containers/configure/types'; + +export interface RowProps { + isLoading: boolean; + securitySolutionField: CaseField; + selectedActionType: ActionType; + selectedThirdParty: ThirdPartyField; +} + +const FieldMappingRowComponent: React.FC = ({ + isLoading, + securitySolutionField, + selectedActionType, + selectedThirdParty, +}) => { + const selectedActionTypeCapitalized = useMemo(() => capitalize(selectedActionType), [ + selectedActionType, + ]); + return ( + + + + + {securitySolutionField} + + + + + + + + + + {isLoading ? ( + + ) : ( + {selectedThirdParty} + )} + + + + + {isLoading ? : selectedActionTypeCapitalized} + + + ); +}; + +export const FieldMappingRowStatic = React.memo(FieldMappingRowComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx new file mode 100644 index 0000000000000..00556a723362a --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -0,0 +1,593 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ReactWrapper, mount } from 'enzyme'; + +import { ConfigureCases } from '.'; +import { TestProviders } from '../../common/mock'; +import { Connectors } from './connectors'; +import { ClosureOptions } from './closure_options'; +import { + ActionConnector, + ConnectorAddFlyout, + ConnectorEditFlyout, + TriggersAndActionsUIPublicPluginStart, +} from '../../../../../triggers_actions_ui/public'; +import { actionTypeRegistryMock } from '../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; + +import { useKibana } from '../../common/kibana'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; +import { useActionTypes } from '../../containers/configure/use_action_types'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; + +import { + connectors, + searchURL, + useCaseConfigureResponse, + useConnectorsResponse, + useActionTypesResponse, +} from './__mock__'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +jest.mock('../../../common/lib/kibana'); +jest.mock('../../containers/configure/use_connectors'); +jest.mock('../../containers/configure/use_configure'); +jest.mock('../../containers/configure/use_action_types'); +jest.mock('../../../common/components/navigation/use_get_url_search'); + +const useKibanaMock = useKibana as jest.Mocked; +const useConnectorsMock = useConnectors as jest.Mock; +const useCaseConfigureMock = useCaseConfigure as jest.Mock; +const useGetUrlSearchMock = useGetUrlSearch as jest.Mock; +const useActionTypesMock = useActionTypes as jest.Mock; + +describe('ConfigureCases', () => { + beforeEach(() => { + useKibanaMock().services.triggersActionsUi = ({ + actionTypeRegistry: actionTypeRegistryMock.create(), + getAddConnectorFlyout: jest.fn().mockImplementation(() => ( + {}} + actionTypeRegistry={actionTypeRegistryMock.create()} + actionTypes={[ + { + id: '.servicenow', + name: 'servicenow', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + minimumLicenseRequired: 'gold', + }, + { + id: '.jira', + name: 'jira', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + minimumLicenseRequired: 'gold', + }, + { + id: '.resilient', + name: 'resilient', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + minimumLicenseRequired: 'gold', + }, + ]} + /> + )), + getEditConnectorFlyout: jest + .fn() + .mockImplementation(() => ( + {}} + actionTypeRegistry={actionTypeRegistryMock.create()} + initialConnector={connectors[1] as ActionConnector} + /> + )), + } as unknown) as TriggersAndActionsUIPublicPluginStart; + + useActionTypesMock.mockImplementation(() => useActionTypesResponse); + }); + + describe('rendering', () => { + let wrapper: ReactWrapper; + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); + useConnectorsMock.mockImplementation(() => ({ ...useConnectorsResponse, connectors: [] })); + useGetUrlSearchMock.mockImplementation(() => searchURL); + + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it renders the Connectors', () => { + expect(wrapper.find('[data-test-subj="dropdown-connectors"]').exists()).toBeTruthy(); + }); + + test('it renders the ClosureType', () => { + expect(wrapper.find('[data-test-subj="closure-options-radio-group"]').exists()).toBeTruthy(); + }); + + test('it does NOT render the ConnectorAddFlyout', () => { + // Components from triggersActionsUi do not have a data-test-subj + expect(wrapper.find(ConnectorAddFlyout).exists()).toBeFalsy(); + }); + + test('it does NOT render the ConnectorEditFlyout', () => { + // Components from triggersActionsUi do not have a data-test-subj + expect(wrapper.find(ConnectorEditFlyout).exists()).toBeFalsy(); + }); + + test('it does NOT render the EuiCallOut', () => { + expect( + wrapper.find('[data-test-subj="configure-cases-warning-callout"]').exists() + ).toBeFalsy(); + }); + }); + + describe('Unhappy path', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + closureType: 'close-by-user', + connector: { + id: 'not-id', + name: 'unchanged', + type: ConnectorTypes.none, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'not-id', + name: 'unchanged', + type: ConnectorTypes.none, + fields: null, + }, + closureType: 'close-by-user', + }, + })); + useConnectorsMock.mockImplementation(() => ({ ...useConnectorsResponse, connectors: [] })); + useGetUrlSearchMock.mockImplementation(() => searchURL); + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it shows the warning callout when configuration is invalid', () => { + expect( + wrapper.find('[data-test-subj="configure-cases-warning-callout"]').exists() + ).toBeTruthy(); + }); + + test('it hides the update connector button when the connectorId is invalid', () => { + expect( + wrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .exists() + ).toBeFalsy(); + }); + }); + + describe('Happy path', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + mappings: [], + closureType: 'close-by-user', + connector: { + id: 'servicenow-1', + name: 'unchanged', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'servicenow-1', + name: 'unchanged', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + closureType: 'close-by-user', + }, + })); + useConnectorsMock.mockImplementation(() => useConnectorsResponse); + useGetUrlSearchMock.mockImplementation(() => searchURL); + + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it renders with correct props', () => { + // Connector + expect(wrapper.find(Connectors).prop('connectors')).toEqual(connectors); + expect(wrapper.find(Connectors).prop('disabled')).toBe(false); + expect(wrapper.find(Connectors).prop('isLoading')).toBe(false); + expect(wrapper.find(Connectors).prop('selectedConnector').id).toBe('servicenow-1'); + + // ClosureOptions + expect(wrapper.find(ClosureOptions).prop('disabled')).toBe(false); + expect(wrapper.find(ClosureOptions).prop('closureTypeSelected')).toBe('close-by-user'); + + // Flyouts + expect(wrapper.find(ConnectorAddFlyout).exists()).toBe(false); + expect(wrapper.find(ConnectorEditFlyout).exists()).toBe(false); + }); + + test('it disables correctly when the user cannot crud', () => { + const newWrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect(newWrapper.find('button[data-test-subj="dropdown-connectors"]').prop('disabled')).toBe( + true + ); + + expect( + newWrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .prop('disabled') + ).toBe(true); + + // Two closure options + expect( + newWrapper + .find('[data-test-subj="closure-options-radio-group"] input') + .first() + .prop('disabled') + ).toBe(true); + + expect( + newWrapper + .find('[data-test-subj="closure-options-radio-group"] input') + .at(1) + .prop('disabled') + ).toBe(true); + }); + }); + + describe('loading connectors', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + mapping: null, + closureType: 'close-by-user', + connector: { + id: 'resilient-2', + name: 'unchanged', + type: ConnectorTypes.resilient, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'servicenow-1', + name: 'unchanged', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + closureType: 'close-by-user', + }, + })); + + useConnectorsMock.mockImplementation(() => ({ + ...useConnectorsResponse, + loading: true, + })); + + useGetUrlSearchMock.mockImplementation(() => searchURL); + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it disables correctly Connector when loading connectors', () => { + expect( + wrapper.find('button[data-test-subj="dropdown-connectors"]').prop('disabled') + ).toBeTruthy(); + }); + + test('it pass the correct value to isLoading attribute on Connector', () => { + expect(wrapper.find(Connectors).prop('isLoading')).toBe(true); + }); + + test('it disables correctly ClosureOptions when loading connectors', () => { + expect(wrapper.find(ClosureOptions).prop('disabled')).toBe(true); + }); + + test('it hides the update connector button when loading the connectors', () => { + expect( + wrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .prop('disabled') + ).toBe(true); + }); + + test('it shows isLoading when loading action types', () => { + useConnectorsMock.mockImplementation(() => ({ + ...useConnectorsResponse, + loading: false, + })); + + useActionTypesMock.mockImplementation(() => ({ ...useActionTypesResponse, loading: true })); + + wrapper = mount(, { wrappingComponent: TestProviders }); + expect(wrapper.find(Connectors).prop('isLoading')).toBe(true); + }); + }); + + describe('saving configuration', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + connector: { + id: 'servicenow-1', + name: 'SN', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + persistLoading: true, + })); + + useConnectorsMock.mockImplementation(() => useConnectorsResponse); + useGetUrlSearchMock.mockImplementation(() => searchURL); + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it disables correctly Connector when saving configuration', () => { + expect(wrapper.find(Connectors).prop('disabled')).toBe(true); + }); + + test('it disables correctly ClosureOptions when saving configuration', () => { + expect( + wrapper + .find('[data-test-subj="closure-options-radio-group"] input') + .first() + .prop('disabled') + ).toBe(true); + + expect( + wrapper.find('[data-test-subj="closure-options-radio-group"] input').at(1).prop('disabled') + ).toBe(true); + }); + + test('it disables the update connector button when saving the configuration', () => { + expect( + wrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .prop('disabled') + ).toBe(true); + }); + }); + + describe('loading configuration', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + loading: true, + })); + useConnectorsMock.mockImplementation(() => ({ + ...useConnectorsResponse, + })); + useGetUrlSearchMock.mockImplementation(() => searchURL); + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it hides the update connector button when loading the configuration', () => { + expect( + wrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .exists() + ).toBeFalsy(); + }); + }); + + describe('connectors', () => { + let wrapper: ReactWrapper; + let persistCaseConfigure: jest.Mock; + + beforeEach(() => { + persistCaseConfigure = jest.fn(); + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + mapping: null, + closureType: 'close-by-user', + connector: { + id: 'resilient-2', + name: 'My connector', + type: ConnectorTypes.resilient, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'My connector', + name: 'My connector', + type: ConnectorTypes.jira, + fields: null, + }, + closureType: 'close-by-user', + }, + persistCaseConfigure, + })); + useConnectorsMock.mockImplementation(() => useConnectorsResponse); + useGetUrlSearchMock.mockImplementation(() => searchURL); + + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it submits the configuration correctly when changing connector', () => { + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + + expect(persistCaseConfigure).toHaveBeenCalled(); + expect(persistCaseConfigure).toHaveBeenCalledWith({ + connector: { + id: 'resilient-2', + name: 'My Connector 2', + type: ConnectorTypes.resilient, + fields: null, + }, + closureType: 'close-by-user', + }); + }); + + test('the text of the update button is changed successfully', () => { + useCaseConfigureMock + .mockImplementationOnce(() => ({ + ...useCaseConfigureResponse, + connector: { + id: 'servicenow-1', + name: 'My connector', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + })) + .mockImplementation(() => ({ + ...useCaseConfigureResponse, + connector: { + id: 'resilient-2', + name: 'My connector 2', + type: ConnectorTypes.resilient, + fields: null, + }, + })); + + wrapper = mount(, { wrappingComponent: TestProviders }); + + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + + expect( + wrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .text() + ).toBe('Update My Connector 2'); + }); + }); +}); + +describe('closure options', () => { + let wrapper: ReactWrapper; + let persistCaseConfigure: jest.Mock; + + beforeEach(() => { + persistCaseConfigure = jest.fn(); + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + mapping: null, + closureType: 'close-by-user', + connector: { + id: 'servicenow-1', + name: 'My connector', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'My connector', + name: 'My connector', + type: ConnectorTypes.jira, + fields: null, + }, + closureType: 'close-by-user', + }, + persistCaseConfigure, + })); + useConnectorsMock.mockImplementation(() => useConnectorsResponse); + useGetUrlSearchMock.mockImplementation(() => searchURL); + + wrapper = mount(, { wrappingComponent: TestProviders }); + }); + + test('it submits the configuration correctly when changing closure type', () => { + wrapper.find('input[id="close-by-pushing"]').simulate('change'); + wrapper.update(); + + expect(persistCaseConfigure).toHaveBeenCalled(); + expect(persistCaseConfigure).toHaveBeenCalledWith({ + connector: { + id: 'servicenow-1', + name: 'My connector', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + closureType: 'close-by-pushing', + }); + }); +}); + +describe('user interactions', () => { + beforeEach(() => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + mapping: null, + closureType: 'close-by-user', + connector: { + id: 'resilient-2', + name: 'unchanged', + type: ConnectorTypes.resilient, + fields: null, + }, + currentConfiguration: { + connector: { + id: 'resilient-2', + name: 'unchanged', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + closureType: 'close-by-user', + }, + })); + useConnectorsMock.mockImplementation(() => useConnectorsResponse); + useGetUrlSearchMock.mockImplementation(() => searchURL); + }); + + test('it show the add flyout when pressing the add connector button', () => { + const wrapper = mount(, { wrappingComponent: TestProviders }); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-add-connector"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find(ConnectorAddFlyout).exists()).toBe(true); + expect(wrapper.find(ConnectorAddFlyout).prop('actionTypes')).toEqual([ + expect.objectContaining({ + id: '.servicenow', + }), + expect.objectContaining({ + id: '.jira', + }), + expect.objectContaining({ + id: '.resilient', + }), + ]); + }); + + test('it show the edit flyout when pressing the update connector button', () => { + const wrapper = mount(, { wrappingComponent: TestProviders }); + wrapper + .find('button[data-test-subj="case-configure-update-selected-connector-button"]') + .simulate('click'); + wrapper.update(); + + expect(wrapper.find(ConnectorEditFlyout).exists()).toBe(true); + expect(wrapper.find(ConnectorEditFlyout).prop('initialConnector')).toEqual(connectors[1]); + expect( + wrapper.find('[data-test-subj="case-configure-action-bottom-bar"]').exists() + ).toBeFalsy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx new file mode 100644 index 0000000000000..e6a4f86be793b --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -0,0 +1,224 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import styled, { css } from 'styled-components'; + +import { EuiCallOut } from '@elastic/eui'; + +import { SUPPORTED_CONNECTORS } from '../../../common/constants'; +import { useKibana } from '../../common/kibana'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useActionTypes } from '../../containers/configure/use_action_types'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; + +import { ClosureType } from '../../containers/configure/types'; + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ActionConnectorTableItem } from '../../../../triggers_actions_ui/public/types'; + +import { SectionWrapper } from '../wrappers'; +import { Connectors } from './connectors'; +import { ClosureOptions } from './closure_options'; +import { + getConnectorById, + getNoneConnector, + normalizeActionConnector, + normalizeCaseConnector, +} from './utils'; +import * as i18n from './translations'; + +const FormWrapper = styled.div` + ${({ theme }) => css` + & > * { + margin-top 40px; + } + + & > :first-child { + margin-top: 0; + } + + padding-top: ${theme.eui.paddingSizes.xl}; + padding-bottom: ${theme.eui.paddingSizes.xl}; + .euiFlyout { + z-index: ${theme.eui.euiZNavigation + 1}; + } + `} +`; + +interface ConfigureCasesComponentProps { + userCanCrud: boolean; +} + +const ConfigureCasesComponent: React.FC = ({ userCanCrud }) => { + const { triggersActionsUi } = useKibana().services; + + const [connectorIsValid, setConnectorIsValid] = useState(true); + const [addFlyoutVisible, setAddFlyoutVisibility] = useState(false); + const [editFlyoutVisible, setEditFlyoutVisibility] = useState(false); + const [editedConnectorItem, setEditedConnectorItem] = useState( + null + ); + + const { + connector, + closureType, + loading: loadingCaseConfigure, + mappings, + persistLoading, + persistCaseConfigure, + refetchCaseConfigure, + setConnector, + setClosureType, + } = useCaseConfigure(); + + const { loading: isLoadingConnectors, connectors, refetchConnectors } = useConnectors(); + const { loading: isLoadingActionTypes, actionTypes, refetchActionTypes } = useActionTypes(); + const supportedActionTypes = useMemo( + () => actionTypes.filter((actionType) => SUPPORTED_CONNECTORS.includes(actionType.id)), + [actionTypes] + ); + + const onConnectorUpdate = useCallback(async () => { + refetchConnectors(); + refetchActionTypes(); + refetchCaseConfigure(); + }, [refetchActionTypes, refetchCaseConfigure, refetchConnectors]); + + const isLoadingAny = + isLoadingConnectors || persistLoading || loadingCaseConfigure || isLoadingActionTypes; + const updateConnectorDisabled = isLoadingAny || !connectorIsValid || connector.id === 'none'; + const onClickUpdateConnector = useCallback(() => { + setEditFlyoutVisibility(true); + }, []); + + const onCloseAddFlyout = useCallback(() => setAddFlyoutVisibility(false), [ + setAddFlyoutVisibility, + ]); + + const onCloseEditFlyout = useCallback(() => setEditFlyoutVisibility(false), []); + + const onChangeConnector = useCallback( + (id: string) => { + if (id === 'add-connector') { + setAddFlyoutVisibility(true); + return; + } + + const actionConnector = getConnectorById(id, connectors); + const caseConnector = + actionConnector != null ? normalizeActionConnector(actionConnector) : getNoneConnector(); + + setConnector(caseConnector); + persistCaseConfigure({ + connector: caseConnector, + closureType, + }); + }, + [connectors, closureType, persistCaseConfigure, setConnector] + ); + + const onChangeClosureType = useCallback( + (type: ClosureType) => { + setClosureType(type); + persistCaseConfigure({ + connector, + closureType: type, + }); + }, + [connector, persistCaseConfigure, setClosureType] + ); + + useEffect(() => { + if ( + !isLoadingConnectors && + connector.id !== 'none' && + !connectors.some((c) => c.id === connector.id) + ) { + setConnectorIsValid(false); + } else if ( + !isLoadingConnectors && + (connector.id === 'none' || connectors.some((c) => c.id === connector.id)) + ) { + setConnectorIsValid(true); + } + }, [connectors, connector, isLoadingConnectors]); + + useEffect(() => { + if (!isLoadingConnectors && connector.id !== 'none') { + setEditedConnectorItem( + normalizeCaseConnector(connectors, connector) as ActionConnectorTableItem + ); + } + }, [connectors, connector, isLoadingConnectors]); + + const ConnectorAddFlyout = useMemo( + () => + triggersActionsUi.getAddConnectorFlyout({ + consumer: 'case', + onClose: onCloseAddFlyout, + actionTypes: supportedActionTypes, + reloadConnectors: onConnectorUpdate, + }), + // eslint-disable-next-line react-hooks/exhaustive-deps + [supportedActionTypes] + ); + + const ConnectorEditFlyout = useMemo( + () => + editedConnectorItem && editFlyoutVisible + ? triggersActionsUi.getEditConnectorFlyout({ + initialConnector: editedConnectorItem, + consumer: 'case', + onClose: onCloseEditFlyout, + reloadConnectors: onConnectorUpdate, + }) + : null, + // eslint-disable-next-line react-hooks/exhaustive-deps + [connector.id, editFlyoutVisible] + ); + + return ( + + {!connectorIsValid && ( + + + {i18n.WARNING_NO_CONNECTOR_MESSAGE} + + + )} + + + + + + + {addFlyoutVisible && ConnectorAddFlyout} + {ConnectorEditFlyout} + + ); +}; + +export const ConfigureCases = React.memo(ConfigureCasesComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/mapping.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/mapping.test.tsx new file mode 100644 index 0000000000000..75b2410dde957 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/mapping.test.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { TestProviders } from '../../common/mock'; +import { Mapping, MappingProps } from './mapping'; +import { mappings } from './__mock__'; + +describe('Mapping', () => { + const props: MappingProps = { + connectorActionTypeId: '.servicenow', + isLoading: false, + mappings, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + test('it shows mapping form group', () => { + const wrapper = mount(, { wrappingComponent: TestProviders }); + expect(wrapper.find('[data-test-subj="static-mappings"]').first().exists()).toBe(true); + }); + + test('correctly maps fields', () => { + const wrapper = mount(, { wrappingComponent: TestProviders }); + expect(wrapper.find('[data-test-subj="field-mapping-source"] code').first().text()).toBe( + 'title' + ); + expect(wrapper.find('[data-test-subj="field-mapping-target"] code').first().text()).toBe( + 'short_description' + ); + }); + test('displays connection warning when isLoading: false and mappings: []', () => { + const wrapper = mount(, { + wrappingComponent: TestProviders, + }); + expect(wrapper.find('[data-test-subj="field-mapping-desc"]').first().text()).toBe( + 'Field mappings require an established connection to ServiceNow ITSM. Please check your connection credentials.' + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/mapping.tsx b/x-pack/plugins/cases/public/components/configure_cases/mapping.tsx new file mode 100644 index 0000000000000..5ec6a33f48b6a --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/mapping.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; + +import { EuiFlexGroup, EuiFlexItem, EuiText, EuiTextColor } from '@elastic/eui'; + +import { TextColor } from '@elastic/eui/src/components/text/text_color'; +import * as i18n from './translations'; + +import { FieldMapping } from './field_mapping'; +import { CaseConnectorMapping } from '../../containers/configure/types'; +import { connectorsConfiguration } from '../connectors'; + +export interface MappingProps { + connectorActionTypeId: string; + isLoading: boolean; + mappings: CaseConnectorMapping[]; +} + +const MappingComponent: React.FC = ({ + connectorActionTypeId, + isLoading, + mappings, +}) => { + const selectedConnector = useMemo(() => connectorsConfiguration[connectorActionTypeId], [ + connectorActionTypeId, + ]); + const fieldMappingDesc: { desc: string; color: TextColor } = useMemo( + () => + mappings.length > 0 || isLoading + ? { desc: i18n.FIELD_MAPPING_DESC(selectedConnector.name), color: 'subdued' } + : { desc: i18n.FIELD_MAPPING_DESC_ERR(selectedConnector.name), color: 'danger' }, + [isLoading, mappings.length, selectedConnector.name] + ); + return ( + + + +

{i18n.FIELD_MAPPING_TITLE(selectedConnector.name)}

+ + {fieldMappingDesc.desc} + +
+
+ + + +
+ ); +}; + +export const Mapping = React.memo(MappingComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/translations.ts b/x-pack/plugins/cases/public/components/configure_cases/translations.ts new file mode 100644 index 0000000000000..9a82d0e821b4c --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/translations.ts @@ -0,0 +1,240 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../common/translations'; + +export const INCIDENT_MANAGEMENT_SYSTEM_TITLE = i18n.translate( + 'xpack.securitySolution.cases.configureCases.incidentManagementSystemTitle', + { + defaultMessage: 'Connect to external incident management system', + } +); + +export const INCIDENT_MANAGEMENT_SYSTEM_DESC = i18n.translate( + 'xpack.securitySolution.cases.configureCases.incidentManagementSystemDesc', + { + defaultMessage: + 'You may optionally connect Security cases to an external incident management system of your choosing. This will allow you to push case data as an incident in your chosen third-party system.', + } +); + +export const INCIDENT_MANAGEMENT_SYSTEM_LABEL = i18n.translate( + 'xpack.securitySolution.cases.configureCases.incidentManagementSystemLabel', + { + defaultMessage: 'Incident management system', + } +); + +export const ADD_NEW_CONNECTOR = i18n.translate( + 'xpack.securitySolution.cases.configureCases.addNewConnector', + { + defaultMessage: 'Add new connector', + } +); + +export const CASE_CLOSURE_OPTIONS_TITLE = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsTitle', + { + defaultMessage: 'Case Closures', + } +); + +export const CASE_CLOSURE_OPTIONS_DESC = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsDesc', + { + defaultMessage: + 'Define how you wish Security cases to be closed. Automated case closures require an established connection to an external incident management system.', + } +); + +export const CASE_COLSURE_OPTIONS_SUB_CASES = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsSubCases', + { + defaultMessage: 'Automated closures of sub-cases is not currently supported.', + } +); + +export const CASE_CLOSURE_OPTIONS_LABEL = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsLabel', + { + defaultMessage: 'Case closure options', + } +); + +export const CASE_CLOSURE_OPTIONS_MANUAL = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsManual', + { + defaultMessage: 'Manually close Security cases', + } +); + +export const CASE_CLOSURE_OPTIONS_NEW_INCIDENT = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsNewIncident', + { + defaultMessage: + 'Automatically close Security cases when pushing new incident to external system', + } +); + +export const CASE_CLOSURE_OPTIONS_CLOSED_INCIDENT = i18n.translate( + 'xpack.securitySolution.cases.configureCases.caseClosureOptionsClosedIncident', + { + defaultMessage: 'Automatically close Security cases when incident is closed in external system', + } +); +export const FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingTitle', { + values: { thirdPartyName }, + defaultMessage: '{ thirdPartyName } field mappings', + }); +}; + +export const FIELD_MAPPING_DESC = (thirdPartyName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingDesc', { + values: { thirdPartyName }, + defaultMessage: + 'Map Security Case fields to { thirdPartyName } fields when pushing data to { thirdPartyName }. Field mappings require an established connection to { thirdPartyName }.', + }); +}; + +export const FIELD_MAPPING_DESC_ERR = (thirdPartyName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingDescErr', { + values: { thirdPartyName }, + defaultMessage: + 'Field mappings require an established connection to { thirdPartyName }. Please check your connection credentials.', + }); +}; +export const EDIT_FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.editFieldMappingTitle', { + values: { thirdPartyName }, + defaultMessage: 'Edit { thirdPartyName } field mappings', + }); +}; + +export const FIELD_MAPPING_FIRST_COL = i18n.translate( + 'xpack.securitySolution.cases.configureCases.fieldMappingFirstCol', + { + defaultMessage: 'Security case field', + } +); + +export const FIELD_MAPPING_SECOND_COL = (thirdPartyName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingSecondCol', { + values: { thirdPartyName }, + defaultMessage: '{ thirdPartyName } field', + }); +}; + +export const FIELD_MAPPING_THIRD_COL = i18n.translate( + 'xpack.securitySolution.cases.configureCases.fieldMappingThirdCol', + { + defaultMessage: 'On edit and update', + } +); + +export const FIELD_MAPPING_EDIT_NOTHING = i18n.translate( + 'xpack.securitySolution.cases.configureCases.fieldMappingEditNothing', + { + defaultMessage: 'Nothing', + } +); + +export const FIELD_MAPPING_EDIT_OVERWRITE = i18n.translate( + 'xpack.securitySolution.cases.configureCases.fieldMappingEditOverwrite', + { + defaultMessage: 'Overwrite', + } +); + +export const FIELD_MAPPING_EDIT_APPEND = i18n.translate( + 'xpack.securitySolution.cases.configureCases.fieldMappingEditAppend', + { + defaultMessage: 'Append', + } +); + +export const CANCEL = i18n.translate('xpack.securitySolution.cases.configureCases.cancelButton', { + defaultMessage: 'Cancel', +}); + +export const SAVE = i18n.translate('xpack.securitySolution.cases.configureCases.saveButton', { + defaultMessage: 'Save', +}); + +export const SAVE_CLOSE = i18n.translate( + 'xpack.securitySolution.cases.configureCases.saveAndCloseButton', + { + defaultMessage: 'Save & close', + } +); + +export const WARNING_NO_CONNECTOR_TITLE = i18n.translate( + 'xpack.securitySolution.cases.configureCases.warningTitle', + { + defaultMessage: 'Warning', + } +); + +export const WARNING_NO_CONNECTOR_MESSAGE = i18n.translate( + 'xpack.securitySolution.cases.configureCases.warningMessage', + { + defaultMessage: + 'The selected connector has been deleted. Either select a different connector or create a new one.', + } +); + +export const MAPPING_FIELD_NOT_MAPPED = i18n.translate( + 'xpack.securitySolution.cases.configureCases.mappingFieldNotMapped', + { + defaultMessage: 'Not mapped', + } +); + +export const COMMENT = i18n.translate( + 'xpack.securitySolution.cases.configureCases.commentMapping', + { + defaultMessage: 'Comments', + } +); + +export const NO_FIELDS_ERROR = (connectorName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.noFieldsError', { + values: { connectorName }, + defaultMessage: + 'No { connectorName } fields found. Please check your { connectorName } connector settings or your { connectorName } instance settings to resolve.', + }); +}; + +export const BLANK_MAPPINGS = (connectorName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.blankMappings', { + values: { connectorName }, + defaultMessage: 'At least one field needs to be mapped to { connectorName }', + }); +}; + +export const REQUIRED_MAPPINGS = (connectorName: string, fields: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.requiredMappings', { + values: { connectorName, fields }, + defaultMessage: + 'At least one Case field needs to be mapped to the following required { connectorName } fields: { fields }', + }); +}; +export const UPDATE_FIELD_MAPPINGS = i18n.translate( + 'xpack.securitySolution.cases.configureCases.updateConnector', + { + defaultMessage: 'Update field mappings', + } +); + +export const UPDATE_SELECTED_CONNECTOR = (connectorName: string): string => { + return i18n.translate('xpack.securitySolution.cases.configureCases.updateSelectedConnector', { + values: { connectorName }, + defaultMessage: 'Update { connectorName }', + }); +}; diff --git a/x-pack/plugins/cases/public/components/configure_cases/utils.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/utils.test.tsx new file mode 100644 index 0000000000000..45bb7f1f5136d --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/utils.test.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mappings } from './__mock__'; +import { setActionTypeToMapping, setThirdPartyToMapping } from './utils'; +import { CaseConnectorMapping } from '../../containers/configure/types'; + +describe('FieldMappingRow', () => { + test('it should change the action type', () => { + const newMapping = setActionTypeToMapping('title', 'nothing', mappings); + expect(newMapping[0].actionType).toBe('nothing'); + }); + + test('it should not change other fields', () => { + const [newTitle, description, comments] = setActionTypeToMapping('title', 'nothing', mappings); + expect(newTitle).not.toEqual(mappings[0]); + expect(description).toEqual(mappings[1]); + expect(comments).toEqual(mappings[2]); + }); + + test('it should return a new array when changing action type', () => { + const newMapping = setActionTypeToMapping('title', 'nothing', mappings); + expect(newMapping).not.toBe(mappings); + }); + + test('it should change the third party', () => { + const newMapping = setThirdPartyToMapping('title', 'description', mappings); + expect(newMapping[0].target).toBe('description'); + }); + + test('it should not change other fields when there is not a conflict', () => { + const tempMapping: CaseConnectorMapping[] = [ + { + source: 'title', + target: 'short_description', + actionType: 'overwrite', + }, + { + source: 'comments', + target: 'comments', + actionType: 'append', + }, + ]; + + const [newTitle, comments] = setThirdPartyToMapping('title', 'description', tempMapping); + + expect(newTitle).not.toEqual(mappings[0]); + expect(comments).toEqual(tempMapping[1]); + }); + + test('it should return a new array when changing third party', () => { + const newMapping = setThirdPartyToMapping('title', 'description', mappings); + expect(newMapping).not.toBe(mappings); + }); + + test('it should change the target of the conflicting third party field to not_mapped', () => { + const newMapping = setThirdPartyToMapping('title', 'description', mappings); + expect(newMapping[1].target).toBe('not_mapped'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/utils.ts b/x-pack/plugins/cases/public/components/configure_cases/utils.ts new file mode 100644 index 0000000000000..19845023a7a42 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/utils.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ConnectorTypeFields, ConnectorTypes } from '../../../common/api'; +import { + CaseField, + ActionType, + ThirdPartyField, + ActionConnector, + CaseConnector, + CaseConnectorMapping, +} from '../../containers/configure/types'; + +export const setActionTypeToMapping = ( + caseField: CaseField, + newActionType: ActionType, + mapping: CaseConnectorMapping[] +): CaseConnectorMapping[] => { + const findItemIndex = mapping.findIndex((item) => item.source === caseField); + + if (findItemIndex >= 0) { + return [ + ...mapping.slice(0, findItemIndex), + { ...mapping[findItemIndex], actionType: newActionType }, + ...mapping.slice(findItemIndex + 1), + ]; + } + + return [...mapping]; +}; + +export const setThirdPartyToMapping = ( + caseField: CaseField, + newThirdPartyField: ThirdPartyField, + mapping: CaseConnectorMapping[] +): CaseConnectorMapping[] => + mapping.map((item) => { + if (item.source !== caseField && item.target === newThirdPartyField) { + return { ...item, target: 'not_mapped' }; + } else if (item.source === caseField) { + return { ...item, target: newThirdPartyField }; + } + return item; + }); + +export const getNoneConnector = (): CaseConnector => ({ + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, +}); + +export const getConnectorById = ( + id: string, + connectors: ActionConnector[] +): ActionConnector | null => connectors.find((c) => c.id === id) ?? null; + +export const normalizeActionConnector = ( + actionConnector: ActionConnector, + fields: CaseConnector['fields'] = null +): CaseConnector => { + const caseConnectorFieldsType = { + type: actionConnector.actionTypeId, + fields, + } as ConnectorTypeFields; + return { + id: actionConnector.id, + name: actionConnector.name, + ...caseConnectorFieldsType, + }; +}; + +export const normalizeCaseConnector = ( + connectors: ActionConnector[], + caseConnector: CaseConnector +): ActionConnector | null => connectors.find((c) => c.id === caseConnector.id) ?? null; diff --git a/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx b/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx new file mode 100644 index 0000000000000..179cc58a23231 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { UseField, Form, useForm, FormHook } from '../../common/shared_imports'; +import { ConnectorSelector } from './form'; +import { connectorsMock } from '../../containers/mock'; +import { getFormMock } from '../__mock__/form'; + +jest.mock( + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' +); + +const useFormMock = useForm as jest.Mock; + +describe('ConnectorSelector', () => { + const formHookMock = getFormMock({ connectorId: connectorsMock[0].id }); + + beforeEach(() => { + jest.resetAllMocks(); + useFormMock.mockImplementation(() => ({ form: formHookMock })); + }); + + it('it should render', async () => { + const wrapper = mount( +
+ + + ); + + expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeTruthy(); + }); + + it('it should not render when is not in edit mode', async () => { + const wrapper = mount( +
+ + + ); + + expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeFalsy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connector_selector/form.tsx b/x-pack/plugins/cases/public/components/connector_selector/form.tsx new file mode 100644 index 0000000000000..469ca1636b7fa --- /dev/null +++ b/x-pack/plugins/cases/public/components/connector_selector/form.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { isEmpty } from 'lodash/fp'; +import { EuiFormRow } from '@elastic/eui'; + +import { FieldHook, getFieldValidityAndErrorMessage } from '../../common/shared_imports'; +import { ConnectorsDropdown } from '../configure_cases/connectors_dropdown'; +import { ActionConnector } from '../../../common/api'; + +interface ConnectorSelectorProps { + connectors: ActionConnector[]; + dataTestSubj: string; + disabled: boolean; + field: FieldHook; + idAria: string; + isEdit: boolean; + isLoading: boolean; + handleChange?: (newValue: string) => void; + hideConnectorServiceNowSir?: boolean; +} +export const ConnectorSelector = ({ + connectors, + dataTestSubj, + disabled = false, + field, + idAria, + isEdit = true, + isLoading = false, + handleChange, + hideConnectorServiceNowSir = false, +}: ConnectorSelectorProps) => { + const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); + const onChange = useCallback( + (val: string) => { + if (handleChange) { + handleChange(val); + } + field.setValue(val); + }, + [handleChange, field] + ); + + return isEdit ? ( + + + + ) : null; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/card.tsx b/x-pack/plugins/cases/public/components/connectors/card.tsx new file mode 100644 index 0000000000000..42cbb02659a78 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/card.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo } from 'react'; +import { EuiCard, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; +import styled from 'styled-components'; + +import { connectorsConfiguration } from '.'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +interface ConnectorCardProps { + connectorType: ConnectorTypes; + title: string; + listItems: Array<{ title: string; description: React.ReactNode }>; + isLoading: boolean; +} + +const StyledText = styled.span` + span { + display: block; + } +`; + +const ConnectorCardDisplay: React.FC = ({ + connectorType, + title, + listItems, + isLoading, +}) => { + const description = useMemo( + () => ( + + {listItems.length > 0 && + listItems.map((item, i) => ( + + {`${item.title}: `} + {item.description} + + ))} + + ), + [listItems] + ); + const icon = useMemo( + () => , + [connectorType] + ); + return ( + <> + {isLoading && } + {!isLoading && ( + + )} + + ); +}; + +export const ConnectorCard = memo(ConnectorCardDisplay); diff --git a/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx b/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx new file mode 100644 index 0000000000000..56de8297c27a0 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @kbn/eslint/no-restricted-paths */ + +import React, { useCallback, useEffect, useState } from 'react'; +import styled from 'styled-components'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; + +import { ActionParamsProps } from '../../../../../triggers_actions_ui/public/types'; +import { CommentType } from '../../../../common/api'; + +import { CaseActionParams } from './types'; +import { ExistingCase } from './existing_case'; + +import * as i18n from './translations'; + +const Container = styled.div` + ${({ theme }) => ` + padding: ${theme.eui?.euiSizeS ?? '8px'} ${theme.eui?.euiSizeL ?? '24px'} ${ + theme.eui?.euiSizeL ?? '24px' + } ${theme.eui?.euiSizeL ?? '24px'}; + `} +`; + +const defaultAlertComment = { + type: CommentType.generatedAlert, + alerts: `[{{#context.alerts}}{"_id": "{{_id}}", "_index": "{{_index}}", "ruleId": "{{signal.rule.id}}", "ruleName": "{{signal.rule.name}}"}__SEPARATOR__{{/context.alerts}}]`, +}; + +const CaseParamsFields: React.FunctionComponent> = ({ + actionParams, + editAction, + index, + errors, + messageVariables, + actionConnector, +}) => { + const { caseId = null, comment = defaultAlertComment } = actionParams.subActionParams ?? {}; + + const [selectedCase, setSelectedCase] = useState(null); + + const editSubActionProperty = useCallback( + (key: string, value: unknown) => { + const newProps = { ...actionParams.subActionParams, [key]: value }; + editAction('subActionParams', newProps, index); + }, + // edit action causes re-renders + // eslint-disable-next-line react-hooks/exhaustive-deps + [actionParams.subActionParams, index] + ); + + const onCaseChanged = useCallback( + (id: string) => { + setSelectedCase(id); + editSubActionProperty('caseId', id); + }, + [editSubActionProperty] + ); + + useEffect(() => { + if (!actionParams.subAction) { + editAction('subAction', 'addComment', index); + } + + if (!actionParams.subActionParams?.caseId) { + editSubActionProperty('caseId', caseId); + } + + if (!actionParams.subActionParams?.comment) { + editSubActionProperty('comment', comment); + } + + if (caseId != null) { + setSelectedCase((prevCaseId) => (prevCaseId !== caseId ? caseId : prevCaseId)); + } + + // editAction creates an infinity loop. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + actionConnector, + index, + actionParams.subActionParams?.caseId, + actionParams.subActionParams?.comment, + caseId, + comment, + actionParams.subAction, + ]); + + return ( + + + + +

{i18n.CASE_CONNECTOR_CALL_OUT_MSG}

+
+
+ ); +}; + +// eslint-disable-next-line import/no-default-export +export { CaseParamsFields as default }; diff --git a/x-pack/plugins/cases/public/components/connectors/case/cases_dropdown.tsx b/x-pack/plugins/cases/public/components/connectors/case/cases_dropdown.tsx new file mode 100644 index 0000000000000..3f3c7d4931192 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/case/cases_dropdown.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFormRow, EuiSuperSelect, EuiSuperSelectOption } from '@elastic/eui'; +import React, { memo, useMemo, useCallback } from 'react'; +import { Case } from '../../../containers/types'; + +import * as i18n from './translations'; + +interface CaseDropdownProps { + isLoading: boolean; + cases: Case[]; + selectedCase?: string; + onCaseChanged: (id: string) => void; +} + +export const ADD_CASE_BUTTON_ID = 'add-case'; + +const addNewCase = { + value: ADD_CASE_BUTTON_ID, + inputDisplay: ( + + {i18n.CASE_CONNECTOR_ADD_NEW_CASE} + + ), + 'data-test-subj': 'dropdown-connector-add-connector', +}; + +const CasesDropdownComponent: React.FC = ({ + isLoading, + cases, + selectedCase, + onCaseChanged, +}) => { + const caseOptions: Array> = useMemo( + () => + cases.reduce>>( + (acc, theCase) => [ + ...acc, + { + value: theCase.id, + inputDisplay: {theCase.title}, + 'data-test-subj': `case-connector-cases-dropdown-${theCase.id}`, + }, + ], + [] + ), + [cases] + ); + + const options = useMemo(() => [...caseOptions, addNewCase], [caseOptions]); + const onChange = useCallback((id: string) => onCaseChanged(id), [onCaseChanged]); + + return ( + + + + ); +}; + +export const CasesDropdown = memo(CasesDropdownComponent); diff --git a/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx b/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx new file mode 100644 index 0000000000000..56cd6cfb45ba5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo, useCallback } from 'react'; +import { CaseType } from '../../../../common/api'; +import { + useGetCases, + DEFAULT_QUERY_PARAMS, + DEFAULT_FILTER_OPTIONS, +} from '../../../containers/use_get_cases'; +import { useCreateCaseModal } from '../../use_create_case_modal'; +import { CasesDropdown, ADD_CASE_BUTTON_ID } from './cases_dropdown'; + +interface ExistingCaseProps { + selectedCase: string | null; + onCaseChanged: (id: string) => void; +} + +const ExistingCaseComponent: React.FC = ({ onCaseChanged, selectedCase }) => { + const { data: cases, loading: isLoadingCases, refetchCases } = useGetCases(DEFAULT_QUERY_PARAMS, { + ...DEFAULT_FILTER_OPTIONS, + onlyCollectionType: true, + }); + + const onCaseCreated = useCallback( + (newCase) => { + refetchCases(); + onCaseChanged(newCase.id); + }, + [onCaseChanged, refetchCases] + ); + + const { modal, openModal } = useCreateCaseModal({ + onCaseCreated, + caseType: CaseType.collection, + // FUTURE DEVELOPER + // We are making the assumption that this component is only used in rules creation + // that's why we want to hide ServiceNow SIR + hideConnectorServiceNowSir: true, + }); + + const onChange = useCallback( + (id: string) => { + if (id === ADD_CASE_BUTTON_ID) { + openModal(); + return; + } + + onCaseChanged(id); + }, + [onCaseChanged, openModal] + ); + + const isCasesLoading = useMemo( + () => isLoadingCases.includes('cases') || isLoadingCases.includes('caseUpdate'), + [isLoadingCases] + ); + + return ( + <> + + {modal} + + ); +}; + +export const ExistingCase = memo(ExistingCaseComponent); diff --git a/x-pack/plugins/cases/public/components/connectors/case/index.ts b/x-pack/plugins/cases/public/components/connectors/case/index.ts new file mode 100644 index 0000000000000..c2cf4980da7ec --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/case/index.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { lazy } from 'react'; + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ActionTypeModel } from '../../../../../triggers_actions_ui/public/types'; +import { CaseActionParams } from './types'; +import * as i18n from './translations'; + +interface ValidationResult { + errors: { + caseId: string[]; + }; +} + +const validateParams = (actionParams: CaseActionParams) => { + const validationResult: ValidationResult = { errors: { caseId: [] } }; + + if (actionParams.subActionParams && !actionParams.subActionParams.caseId) { + validationResult.errors.caseId.push(i18n.CASE_CONNECTOR_CASE_REQUIRED); + } + + return validationResult; +}; + +export function getActionType(): ActionTypeModel { + return { + id: '.case', + iconClass: 'securityAnalyticsApp', + selectMessage: i18n.CASE_CONNECTOR_DESC, + actionTypeTitle: i18n.CASE_CONNECTOR_TITLE, + validateConnector: () => ({ config: { errors: {} }, secrets: { errors: {} } }), + validateParams, + actionConnectorFields: null, + actionParamsFields: lazy(() => import('./alert_fields')), + }; +} diff --git a/x-pack/plugins/cases/public/components/connectors/case/translations.ts b/x-pack/plugins/cases/public/components/connectors/case/translations.ts new file mode 100644 index 0000000000000..0581a8e84b797 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/case/translations.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../../common/translations'; + +export const CASE_CONNECTOR_DESC = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.selectMessageText', + { + defaultMessage: 'Create or update a case.', + } +); + +export const CASE_CONNECTOR_TITLE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.actionTypeTitle', + { + defaultMessage: 'Cases', + } +); + +export const CASE_CONNECTOR_COMMENT_LABEL = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.commentLabel', + { + defaultMessage: 'Comment', + } +); + +export const CASE_CONNECTOR_COMMENT_REQUIRED = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.commentRequired', + { + defaultMessage: 'Comment is required.', + } +); + +export const CASE_CONNECTOR_CASES_DROPDOWN_ROW_LABEL = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.casesDropdownRowLabel', + { + defaultMessage: 'Case allowing sub-cases', + } +); + +export const CASE_CONNECTOR_CASES_DROPDOWN_PLACEHOLDER = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.casesDropdownPlaceholder', + { + defaultMessage: 'Select case', + } +); + +export const CASE_CONNECTOR_CASES_OPTION_NEW_CASE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.optionAddNewCase', + { + defaultMessage: 'Add to a new case', + } +); + +export const CASE_CONNECTOR_CASES_OPTION_EXISTING_CASE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.optionAddToExistingCase', + { + defaultMessage: 'Add to existing case', + } +); + +export const CASE_CONNECTOR_CASE_REQUIRED = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.caseRequired', + { + defaultMessage: 'You must select a case.', + } +); + +export const CASE_CONNECTOR_CALL_OUT_TITLE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.callOutTitle', + { + defaultMessage: 'Generated alerts will be attached to sub-cases', + } +); + +export const CASE_CONNECTOR_CALL_OUT_MSG = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.callOutMsg', + { + defaultMessage: + 'A case can contain multiple sub-cases to allow grouping of generated alerts. Sub-cases will give more granular control over the status of these generated alerts and prevents having too many alerts attached to one case.', + } +); + +export const CASE_CONNECTOR_ADD_NEW_CASE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.addNewCaseOption', + { + defaultMessage: 'Add new case', + } +); + +export const CREATE_CASE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.createCaseLabel', + { + defaultMessage: 'Create case', + } +); + +export const CONNECTED_CASE = i18n.translate( + 'xpack.securitySolution.cases.components.connectors.cases.connectedCaseLabel', + { + defaultMessage: 'Connected case', + } +); diff --git a/x-pack/plugins/cases/public/components/connectors/case/types.ts b/x-pack/plugins/cases/public/components/connectors/case/types.ts new file mode 100644 index 0000000000000..aec9e09ea198c --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/case/types.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface CaseActionParams { + subAction: string; + subActionParams: { + caseId: string; + comment: { + alertId: string; + index: string; + type: 'alert'; + }; + }; +} diff --git a/x-pack/plugins/cases/public/components/connectors/config.ts b/x-pack/plugins/cases/public/components/connectors/config.ts new file mode 100644 index 0000000000000..e8d87511c7e17 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/config.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + getResilientActionType, + getServiceNowITSMActionType, + getServiceNowSIRActionType, + getJiraActionType, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../triggers_actions_ui/public/common'; +import { ConnectorConfiguration } from './types'; + +const resilient = getResilientActionType(); +const serviceNowITSM = getServiceNowITSMActionType(); +const serviceNowSIR = getServiceNowSIRActionType(); +const jira = getJiraActionType(); + +export const connectorsConfiguration: Record = { + '.servicenow': { + name: serviceNowITSM.actionTypeTitle ?? '', + logo: serviceNowITSM.iconClass, + }, + '.servicenow-sir': { + name: serviceNowSIR.actionTypeTitle ?? '', + logo: serviceNowSIR.iconClass, + }, + '.jira': { + name: jira.actionTypeTitle ?? '', + logo: jira.iconClass, + }, + '.resilient': { + name: resilient.actionTypeTitle ?? '', + logo: resilient.iconClass, + }, +}; diff --git a/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts b/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts new file mode 100644 index 0000000000000..cc8edd937cb0e --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { CaseConnector, CaseConnectorsRegistry } from './types'; + +export const createCaseConnectorsRegistry = (): CaseConnectorsRegistry => { + const connectors: Map> = new Map(); + + const registry: CaseConnectorsRegistry = { + has: (id: string) => connectors.has(id), + register: (connector: CaseConnector) => { + if (connectors.has(connector.id)) { + throw new Error( + i18n.translate( + 'xpack.securitySolution.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage', + { + defaultMessage: 'Object type "{id}" is already registered.', + values: { + id: connector.id, + }, + } + ) + ); + } + + connectors.set(connector.id, connector); + }, + get: (id: string): CaseConnector => { + if (!connectors.has(id)) { + throw new Error( + i18n.translate( + 'xpack.securitySolution.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage', + { + defaultMessage: 'Object type "{id}" is not registered.', + values: { + id, + }, + } + ) + ); + } + return connectors.get(id)!; + }, + list: () => { + return Array.from(connectors).map(([id, connector]) => connector); + }, + }; + + return registry; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/fields_form.tsx b/x-pack/plugins/cases/public/components/connectors/fields_form.tsx new file mode 100644 index 0000000000000..fcbc41bc437bd --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/fields_form.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, Suspense } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; + +import { CaseActionConnector, ConnectorFieldsProps } from './types'; +import { getCaseConnectors } from '.'; +import { ConnectorTypeFields } from '../../../common/api/connectors'; + +interface Props extends Omit, 'connector'> { + connector: CaseActionConnector | null; +} + +const ConnectorFieldsFormComponent: React.FC = ({ connector, isEdit, onChange, fields }) => { + const { caseConnectorsRegistry } = getCaseConnectors(); + + if (connector == null || connector.actionTypeId == null || connector.actionTypeId === '.none') { + return null; + } + + const { fieldsComponent: FieldsComponent } = caseConnectorsRegistry.get(connector.actionTypeId); + + return ( + <> + {FieldsComponent != null ? ( + + + + + + } + > +
+ +
+
+ ) : null} + + ); +}; + +export const ConnectorFieldsForm = memo(ConnectorFieldsFormComponent); diff --git a/x-pack/plugins/cases/public/components/connectors/index.ts b/x-pack/plugins/cases/public/components/connectors/index.ts new file mode 100644 index 0000000000000..cc7a3e5e18117 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/index.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseConnectorsRegistry } from './types'; +import { createCaseConnectorsRegistry } from './connectors_registry'; +import { getCaseConnector as getJiraCaseConnector } from './jira'; +import { getCaseConnector as getResilientCaseConnector } from './resilient'; +import { getServiceNowITSMCaseConnector, getServiceNowSIRCaseConnector } from './servicenow'; +import { + JiraFieldsType, + ServiceNowITSMFieldsType, + ServiceNowSIRFieldsType, + ResilientFieldsType, +} from '../../../common/api'; + +export { getActionType as getCaseConnectorUI } from './case'; + +export * from './config'; +export * from './types'; + +interface GetCaseConnectorsReturn { + caseConnectorsRegistry: CaseConnectorsRegistry; +} + +class CaseConnectors { + private caseConnectorsRegistry: CaseConnectorsRegistry; + + constructor() { + this.caseConnectorsRegistry = createCaseConnectorsRegistry(); + this.init(); + } + + private init() { + this.caseConnectorsRegistry.register(getJiraCaseConnector()); + this.caseConnectorsRegistry.register(getResilientCaseConnector()); + this.caseConnectorsRegistry.register( + getServiceNowITSMCaseConnector() + ); + this.caseConnectorsRegistry.register(getServiceNowSIRCaseConnector()); + } + + registry(): CaseConnectorsRegistry { + return this.caseConnectorsRegistry; + } +} + +const caseConnectors = new CaseConnectors(); + +export const getCaseConnectors = (): GetCaseConnectorsReturn => { + return { + caseConnectorsRegistry: caseConnectors.registry(), + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/__mocks__/api.ts b/x-pack/plugins/cases/public/components/connectors/jira/__mocks__/api.ts new file mode 100644 index 0000000000000..3a7b51545dfca --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/__mocks__/api.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { GetIssueTypesProps, GetFieldsByIssueTypeProps, GetIssueTypeProps } from '../api'; +import { IssueTypes, Fields, Issues, Issue } from '../types'; +import { issues } from '../../mock'; + +const issueTypes = [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, +]; + +const fieldsByIssueType = { + summary: { allowedValues: [], defaultValue: {} }, + priority: { + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + ], + defaultValue: { name: 'Medium', id: '3' }, + }, +}; + +export const getIssue = async (props: GetIssueTypeProps): Promise<{ data: Issue }> => + Promise.resolve({ data: issues[0] }); +export const getIssues = async (props: GetIssueTypesProps): Promise<{ data: Issues }> => + Promise.resolve({ data: issues }); +export const getIssueTypes = async (props: GetIssueTypesProps): Promise<{ data: IssueTypes }> => + Promise.resolve({ data: issueTypes }); + +export const getFieldsByIssueType = async ( + props: GetFieldsByIssueTypeProps +): Promise<{ data: Fields }> => Promise.resolve({ data: fieldsByIssueType }); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts b/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts new file mode 100644 index 0000000000000..7190a44f3ab1f --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts @@ -0,0 +1,160 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { getIssueTypes, getFieldsByIssueType, getIssues, getIssue } from './api'; + +const issueTypesResponse = { + data: { + projects: [ + { + issuetypes: [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, + ], + }, + ], + }, +}; + +const fieldsResponse = { + data: { + projects: [ + { + issuetypes: [ + { + id: '10006', + name: 'Task', + fields: { + summary: { fieldId: 'summary' }, + priority: { + fieldId: 'priority', + allowedValues: [ + { + name: 'Highest', + id: '1', + }, + { + name: 'High', + id: '2', + }, + { + name: 'Medium', + id: '3', + }, + { + name: 'Low', + id: '4', + }, + { + name: 'Lowest', + id: '5', + }, + ], + defaultValue: { + name: 'Medium', + id: '3', + }, + }, + }, + }, + ], + }, + ], + }, +}; + +const issueResponse = { + id: '10267', + key: 'RJ-107', + fields: { summary: 'Test title' }, +}; + +const issuesResponse = [issueResponse]; + +describe('Jira API', () => { + const http = httpServiceMock.createStartContract(); + + beforeEach(() => jest.resetAllMocks()); + + describe('getIssueTypes', () => { + test('should call get issue types API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(issueTypesResponse); + const res = await getIssueTypes({ http, signal: abortCtrl.signal, connectorId: 'test' }); + + expect(res).toEqual(issueTypesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"issueTypes","subActionParams":{}}}', + signal: abortCtrl.signal, + }); + }); + }); + + describe('getFieldsByIssueType', () => { + test('should call get fields API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(fieldsResponse); + const res = await getFieldsByIssueType({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + id: '10006', + }); + + expect(res).toEqual(fieldsResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"fieldsByIssueType","subActionParams":{"id":"10006"}}}', + signal: abortCtrl.signal, + }); + }); + }); + + describe('getIssues', () => { + test('should call get fields API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(issuesResponse); + const res = await getIssues({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + title: 'test issue', + }); + + expect(res).toEqual(issuesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"issues","subActionParams":{"title":"test issue"}}}', + signal: abortCtrl.signal, + }); + }); + }); + + describe('getIssue', () => { + test('should call get fields API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(issuesResponse); + const res = await getIssue({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + id: 'RJ-107', + }); + + expect(res).toEqual(issuesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"issue","subActionParams":{"id":"RJ-107"}}}', + signal: abortCtrl.signal, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/api.ts b/x-pack/plugins/cases/public/components/connectors/jira/api.ts new file mode 100644 index 0000000000000..4ebb06192e62d --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/api.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpSetup } from 'kibana/public'; +import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { IssueTypes, Fields, Issues, Issue } from './types'; + +export const BASE_ACTION_API_PATH = '/api/actions'; + +export interface GetIssueTypesProps { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; +} + +export async function getIssueTypes({ http, signal, connectorId }: GetIssueTypesProps) { + return http.post>( + `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, + { + body: JSON.stringify({ + params: { subAction: 'issueTypes', subActionParams: {} }, + }), + signal, + } + ); +} + +export interface GetFieldsByIssueTypeProps { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; + id: string; +} + +export async function getFieldsByIssueType({ + http, + signal, + connectorId, + id, +}: GetFieldsByIssueTypeProps): Promise> { + return http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { + body: JSON.stringify({ + params: { subAction: 'fieldsByIssueType', subActionParams: { id } }, + }), + signal, + }); +} + +export interface GetIssuesTypeProps { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; + title: string; +} + +export async function getIssues({ + http, + signal, + connectorId, + title, +}: GetIssuesTypeProps): Promise> { + return http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { + body: JSON.stringify({ + params: { subAction: 'issues', subActionParams: { title } }, + }), + signal, + }); +} + +export interface GetIssueTypeProps { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; + id: string; +} + +export async function getIssue({ + http, + signal, + connectorId, + id, +}: GetIssueTypeProps): Promise> { + return http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { + body: JSON.stringify({ + params: { subAction: 'issue', subActionParams: { id } }, + }), + signal, + }); +} diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx new file mode 100644 index 0000000000000..596d4de4a562c --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx @@ -0,0 +1,263 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { omit } from 'lodash/fp'; + +import { connector, issues } from '../mock'; +import { useGetIssueTypes } from './use_get_issue_types'; +import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; +import Fields from './case_fields'; +import { waitFor } from '@testing-library/dom'; +import { useGetSingleIssue } from './use_get_single_issue'; +import { useGetIssues } from './use_get_issues'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +jest.mock('../../../common/kibana'); +jest.mock('./use_get_issue_types'); +jest.mock('./use_get_fields_by_issue_type'); +jest.mock('./use_get_single_issue'); +jest.mock('./use_get_issues'); + +const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; +const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; +const useGetSingleIssueMock = useGetSingleIssue as jest.Mock; +const useGetIssuesMock = useGetIssues as jest.Mock; + +describe('Jira Fields', () => { + const useGetIssueTypesResponse = { + isLoading: false, + issueTypes: [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, + ], + }; + + const useGetFieldsByIssueTypeResponse = { + isLoading: false, + fields: { + summary: { allowedValues: [], defaultValue: {} }, + labels: { allowedValues: [], defaultValue: {} }, + description: { allowedValues: [], defaultValue: {} }, + priority: { + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + { + name: 'Low', + id: '2', + }, + ], + defaultValue: { name: 'Medium', id: '3' }, + }, + }, + }; + + const useGetSingleIssueResponse = { + isLoading: false, + issue: { title: 'Parent Task', key: 'parentId' }, + }; + + const fields = { + issueType: '10006', + priority: 'High', + parent: null, + }; + + const useGetIssuesResponse = { + isLoading: false, + issues, + }; + + const onChange = jest.fn(); + + beforeEach(() => { + useGetIssueTypesMock.mockReturnValue(useGetIssueTypesResponse); + useGetFieldsByIssueTypeMock.mockReturnValue(useGetFieldsByIssueTypeResponse); + useGetSingleIssueMock.mockReturnValue(useGetSingleIssueResponse); + jest.clearAllMocks(); + }); + + test('all params fields are rendered - isEdit: true', () => { + const wrapper = mount(); + expect(wrapper.find('[data-test-subj="issueTypeSelect"]').first().prop('value')).toStrictEqual( + '10006' + ); + expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('value')).toStrictEqual( + 'High' + ); + expect(wrapper.find('[data-test-subj="search-parent-issues"]').first().exists()).toBeFalsy(); + }); + + test('all params fields are rendered - isEdit: false', () => { + const wrapper = mount( + + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(0).text()).toEqual( + 'Issue type: Task' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(1).text()).toEqual( + 'Parent issue: Parent Task' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(2).text()).toEqual( + 'Priority: High' + ); + }); + + test('it sets parent correctly', async () => { + useGetFieldsByIssueTypeMock.mockReturnValue({ + ...useGetFieldsByIssueTypeResponse, + fields: { + ...useGetFieldsByIssueTypeResponse.fields, + parent: {}, + }, + }); + useGetIssuesMock.mockReturnValue(useGetIssuesResponse); + const wrapper = mount(); + + await waitFor(() => + ((wrapper.find(EuiComboBox).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange([{ label: 'parentId', value: 'parentId' }]) + ); + wrapper.update(); + expect(onChange).toHaveBeenCalledWith({ + issueType: '10006', + parent: 'parentId', + priority: 'High', + }); + }); + test('it searches parent correctly', async () => { + useGetFieldsByIssueTypeMock.mockReturnValue({ + ...useGetFieldsByIssueTypeResponse, + fields: { + ...useGetFieldsByIssueTypeResponse.fields, + parent: {}, + }, + }); + useGetSingleIssueMock.mockReturnValue({ useGetSingleIssueResponse, issue: null }); + useGetIssuesMock.mockReturnValue(useGetIssuesResponse); + const wrapper = mount(); + + await waitFor(() => + ((wrapper.find(EuiComboBox).props() as unknown) as { + onSearchChange: (a: string) => void; + }).onSearchChange('womanId') + ); + wrapper.update(); + expect(useGetIssuesMock.mock.calls[2][0].query).toEqual('womanId'); + }); + + test('it disabled the fields when loading issue types', () => { + useGetIssueTypesMock.mockReturnValue({ ...useGetIssueTypesResponse, isLoading: true }); + + const wrapper = mount(); + + expect( + wrapper.find('[data-test-subj="issueTypeSelect"]').first().prop('disabled') + ).toBeTruthy(); + expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('disabled')).toBeTruthy(); + }); + + test('it disabled the fields when loading fields', () => { + useGetFieldsByIssueTypeMock.mockReturnValue({ + ...useGetFieldsByIssueTypeResponse, + isLoading: true, + }); + + const wrapper = mount(); + + expect( + wrapper.find('[data-test-subj="issueTypeSelect"]').first().prop('disabled') + ).toBeTruthy(); + expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('disabled')).toBeTruthy(); + }); + + test('it hides the priority if not supported', () => { + const response = omit('fields.priority', useGetFieldsByIssueTypeResponse); + + useGetFieldsByIssueTypeMock.mockReturnValue(response); + + const wrapper = mount(); + + expect(wrapper.find('[data-test-subj="prioritySelect"]').first().exists()).toBeFalsy(); + }); + + test('it sets issue type correctly', () => { + const wrapper = mount(); + + wrapper + .find('select[data-test-subj="issueTypeSelect"]') + .first() + .simulate('change', { + target: { value: '10007' }, + }); + + expect(onChange).toHaveBeenCalledWith({ issueType: '10007', parent: null, priority: null }); + }); + + test('it sets issue type when it comes as null', () => { + const wrapper = mount( + + ); + expect(wrapper.find('select[data-test-subj="issueTypeSelect"]').first().props().value).toEqual( + '10006' + ); + }); + + test('it sets issue type when it comes as unknown value', () => { + const wrapper = mount( + + ); + expect(wrapper.find('select[data-test-subj="issueTypeSelect"]').first().props().value).toEqual( + '10006' + ); + }); + + test('it sets priority correctly', () => { + const wrapper = mount(); + + wrapper + .find('select[data-test-subj="prioritySelect"]') + .first() + .simulate('change', { + target: { value: '2' }, + }); + + expect(onChange).toHaveBeenCalledWith({ issueType: '10006', parent: null, priority: '2' }); + }); + + test('it resets priority when changing issue type', () => { + const wrapper = mount(); + wrapper + .find('select[data-test-subj="issueTypeSelect"]') + .first() + .simulate('change', { + target: { value: '10007' }, + }); + + expect(onChange).toBeCalledWith({ issueType: '10007', parent: null, priority: null }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx new file mode 100644 index 0000000000000..08cf1fe02f3b5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx @@ -0,0 +1,214 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useMemo, useEffect, useRef } from 'react'; +import { map } from 'lodash/fp'; +import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; +import * as i18n from './translations'; + +import { ConnectorTypes, JiraFieldsType } from '../../../../common/api/connectors'; +import { useKibana } from '../../../common/kibana'; +import { ConnectorFieldsProps } from '../types'; +import { useGetIssueTypes } from './use_get_issue_types'; +import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; +import { SearchIssues } from './search_issues'; +import { ConnectorCard } from '../card'; + +const JiraFieldsComponent: React.FunctionComponent> = ({ + connector, + fields, + isEdit = true, + onChange, +}) => { + const init = useRef(true); + const { issueType = null, priority = null, parent = null } = fields ?? {}; + const { http, notifications } = useKibana().services; + + const handleIssueType = useCallback( + (issueTypeSelectOptions: Array<{ value: string; text: string }>) => { + if (issueType == null && issueTypeSelectOptions.length > 0) { + // if there is no issue type set in the edit view, set it to default + if (isEdit) { + onChange({ + issueType: issueTypeSelectOptions[0].value, + parent, + priority, + }); + } + } + }, + [isEdit, issueType, onChange, parent, priority] + ); + const { isLoading: isLoadingIssueTypes, issueTypes } = useGetIssueTypes({ + connector, + http, + toastNotifications: notifications.toasts, + handleIssueType, + }); + + const issueTypesSelectOptions = useMemo( + () => + issueTypes.map((type) => ({ + text: type.name ?? '', + value: type.id ?? '', + })), + [issueTypes] + ); + + const currentIssueType = useMemo(() => { + if (!issueType && issueTypesSelectOptions.length > 0) { + return issueTypesSelectOptions[0].value; + } else if ( + issueTypesSelectOptions.length > 0 && + !issueTypesSelectOptions.some(({ value }) => value === issueType) + ) { + return issueTypesSelectOptions[0].value; + } + return issueType; + }, [issueType, issueTypesSelectOptions]); + + const { isLoading: isLoadingFields, fields: fieldsByIssueType } = useGetFieldsByIssueType({ + connector, + http, + issueType: currentIssueType, + toastNotifications: notifications.toasts, + }); + + const hasPriority = useMemo(() => fieldsByIssueType.priority != null, [fieldsByIssueType]); + + const hasParent = useMemo(() => fieldsByIssueType.parent != null, [fieldsByIssueType]); + + const prioritiesSelectOptions = useMemo(() => { + const priorities = fieldsByIssueType.priority?.allowedValues ?? []; + return map( + (p) => ({ + text: p.name, + value: p.name, + }), + priorities + ); + }, [fieldsByIssueType]); + + const listItems = useMemo( + () => [ + ...(issueType != null && issueType.length > 0 + ? [ + { + title: i18n.ISSUE_TYPE, + description: issueTypes.find((issue) => issue.id === issueType)?.name ?? '', + }, + ] + : []), + ...(parent != null && parent.length > 0 + ? [ + { + title: i18n.PARENT_ISSUE, + description: parent, + }, + ] + : []), + ...(priority != null && priority.length > 0 + ? [ + { + title: i18n.PRIORITY, + description: priority, + }, + ] + : []), + ], + [issueType, issueTypes, parent, priority] + ); + + const onFieldChange = useCallback( + (key, value) => { + if (key === 'issueType') { + return onChange({ ...fields, issueType: value, priority: null, parent: null }); + } + return onChange({ + ...fields, + issueType: currentIssueType, + parent, + priority, + [key]: value, + }); + }, + [currentIssueType, fields, onChange, parent, priority] + ); + + // Set field at initialization + useEffect(() => { + if (init.current) { + init.current = false; + onChange({ issueType, priority, parent }); + } + }, [issueType, onChange, parent, priority]); + + return isEdit ? ( +
+ + onFieldChange('issueType', e.target.value)} + options={issueTypesSelectOptions} + value={currentIssueType ?? ''} + /> + + + <> + {hasParent && ( + <> + + + + onFieldChange('parent', parentIssueKey)} + selectedValue={parent} + /> + + + + + + )} + {hasPriority && ( + <> + + + + onFieldChange('priority', e.target.value)} + options={prioritiesSelectOptions} + value={priority ?? ''} + /> + + + + + )} + +
+ ) : ( + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { JiraFieldsComponent as default }; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/index.ts b/x-pack/plugins/cases/public/components/connectors/jira/index.ts new file mode 100644 index 0000000000000..899434eccc306 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/index.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { lazy } from 'react'; + +import { CaseConnector } from '../types'; +import { JiraFieldsType } from '../../../../common/api/connectors'; +import * as i18n from './translations'; + +export * from './types'; + +export const getCaseConnector = (): CaseConnector => { + return { + id: '.jira', + fieldsComponent: lazy(() => import('./case_fields')), + }; +}; + +export const fieldLabels = { + issueType: i18n.ISSUE_TYPE, + priority: i18n.PRIORITY, + parent: i18n.PARENT_ISSUE, +}; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx new file mode 100644 index 0000000000000..db8f80af883d1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +import { useKibana } from '../../../common/kibana'; +import { ActionConnector } from '../../../containers/types'; +import { useGetIssues } from './use_get_issues'; +import { useGetSingleIssue } from './use_get_single_issue'; +import * as i18n from './translations'; + +interface Props { + selectedValue: string | null; + actionConnector?: ActionConnector; + onChange: (parentIssueKey: string) => void; +} + +const SearchIssuesComponent: React.FC = ({ selectedValue, actionConnector, onChange }) => { + const [query, setQuery] = useState(null); + const [selectedOptions, setSelectedOptions] = useState>>( + [] + ); + const [options, setOptions] = useState>>([]); + const { http, notifications } = useKibana().services; + + const { isLoading: isLoadingIssues, issues } = useGetIssues({ + http, + toastNotifications: notifications.toasts, + actionConnector, + query, + }); + + const { isLoading: isLoadingSingleIssue, issue: singleIssue } = useGetSingleIssue({ + http, + toastNotifications: notifications.toasts, + actionConnector, + id: selectedValue, + }); + + useEffect(() => setOptions(issues.map((issue) => ({ label: issue.title, value: issue.key }))), [ + issues, + ]); + + useEffect(() => { + if (isLoadingSingleIssue || singleIssue == null) { + return; + } + + const singleIssueAsOptions = [{ label: singleIssue.title, value: singleIssue.key }]; + setOptions(singleIssueAsOptions); + setSelectedOptions(singleIssueAsOptions); + }, [singleIssue, isLoadingSingleIssue]); + + const onSearchChange = useCallback((searchVal: string) => { + setQuery(searchVal); + }, []); + + const onChangeComboBox = useCallback( + (changedOptions) => { + setSelectedOptions(changedOptions); + onChange(changedOptions[0].value); + }, + [onChange] + ); + + const inputPlaceholder = useMemo( + (): string => + isLoadingIssues || isLoadingSingleIssue + ? i18n.SEARCH_ISSUES_LOADING + : i18n.SEARCH_ISSUES_PLACEHOLDER, + [isLoadingIssues, isLoadingSingleIssue] + ); + + return ( + + ); +}; + +export const SearchIssues = memo(SearchIssuesComponent); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/translations.ts b/x-pack/plugins/cases/public/components/connectors/jira/translations.ts new file mode 100644 index 0000000000000..a4948d61f952c --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/translations.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const ISSUE_TYPES_API_ERROR = i18n.translate( + 'xpack.securitySolution.components.connectors.jira.unableToGetIssueTypesMessage', + { + defaultMessage: 'Unable to get issue types', + } +); + +export const FIELDS_API_ERROR = i18n.translate( + 'xpack.securitySolution.components.connectors.jira.unableToGetFieldsMessage', + { + defaultMessage: 'Unable to get connectors', + } +); + +export const ISSUES_API_ERROR = i18n.translate( + 'xpack.securitySolution.components.connectors.jira.unableToGetIssuesMessage', + { + defaultMessage: 'Unable to get issues', + } +); + +export const GET_ISSUE_API_ERROR = (id: string) => + i18n.translate('xpack.securitySolution.components.connectors.jira.unableToGetIssueMessage', { + defaultMessage: 'Unable to get issue with id {id}', + values: { id }, + }); + +export const SEARCH_ISSUES_COMBO_BOX_ARIA_LABEL = i18n.translate( + 'xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxAriaLabel', + { + defaultMessage: 'Type to search', + } +); + +export const SEARCH_ISSUES_PLACEHOLDER = i18n.translate( + 'xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxPlaceholder', + { + defaultMessage: 'Type to search', + } +); + +export const SEARCH_ISSUES_LOADING = i18n.translate( + 'xpack.securitySolution.components.connectors.jira.searchIssuesLoading', + { + defaultMessage: 'Loading...', + } +); + +export const PRIORITY = i18n.translate( + 'xpack.securitySolution.cases.connectors.jira.prioritySelectFieldLabel', + { + defaultMessage: 'Priority', + } +); + +export const ISSUE_TYPE = i18n.translate( + 'xpack.securitySolution.cases.connectors.jira.issueTypesSelectFieldLabel', + { + defaultMessage: 'Issue type', + } +); + +export const PARENT_ISSUE = i18n.translate( + 'xpack.securitySolution.cases.connectors.jira.parentIssueSearchLabel', + { + defaultMessage: 'Parent issue', + } +); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/types.ts b/x-pack/plugins/cases/public/components/connectors/jira/types.ts new file mode 100644 index 0000000000000..76c08a852c679 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/types.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type IssueTypes = Array<{ id: string; name: string }>; +export interface Fields { + [key: string]: { + allowedValues: Array<{ name: string; id: string }> | []; + defaultValue: { name: string; id: string } | {}; + }; +} + +export interface Issue { + id: string; + key: string; + title: string; +} + +export type Issues = Issue[]; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx new file mode 100644 index 0000000000000..6df674e7def57 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { connector } from '../mock'; +import { useGetFieldsByIssueType, UseGetFieldsByIssueType } from './use_get_fields_by_issue_type'; +import * as api from './api'; + +jest.mock('../../../common/kibana'); +jest.mock('./api'); + +const useKibanaMock = useKibana as jest.Mocked; + +describe('useGetFieldsByIssueType', () => { + const { http, notifications } = useKibanaMock().services; + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetFieldsByIssueType({ http, toastNotifications: notifications.toasts, issueType: null }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ isLoading: true, fields: {} }); + }); + }); + + test('does not fetch when issueType is not provided', async () => { + const spyOnGetFieldsByIssueType = jest.spyOn(api, 'getFieldsByIssueType'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetFieldsByIssueType({ + http, + toastNotifications: notifications.toasts, + connector, + issueType: null, + }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetFieldsByIssueType).not.toHaveBeenCalled(); + expect(result.current).toEqual({ isLoading: false, fields: {} }); + }); + }); + + test('fetch fields', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetFieldsByIssueType({ + http, + toastNotifications: notifications.toasts, + connector, + issueType: 'Task', + }) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + fields: { + summary: { allowedValues: [], defaultValue: {} }, + priority: { + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + ], + defaultValue: { name: 'Medium', id: '3' }, + }, + }, + }); + }); + }); + + test('unhappy path', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getFieldsByIssueType'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetFieldsByIssueType({ + http, + toastNotifications: notifications.toasts, + connector, + issueType: null, + }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ isLoading: false, fields: {} }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx new file mode 100644 index 0000000000000..03000e8916617 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getFieldsByIssueType } from './api'; +import { Fields } from './types'; +import * as i18n from './translations'; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + issueType: string | null; + connector?: ActionConnector; +} + +export interface UseGetFieldsByIssueType { + fields: Fields; + isLoading: boolean; +} + +export const useGetFieldsByIssueType = ({ + http, + toastNotifications, + connector, + issueType, +}: Props): UseGetFieldsByIssueType => { + const [isLoading, setIsLoading] = useState(true); + const [fields, setFields] = useState({}); + const didCancel = useRef(false); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + const fetchData = async () => { + if (!connector || !issueType) { + setIsLoading(false); + return; + } + + try { + abortCtrl.current = new AbortController(); + setIsLoading(true); + + const res = await getFieldsByIssueType({ + http, + signal: abortCtrl.current.signal, + connectorId: connector.id, + id: issueType, + }); + + if (!didCancel.current) { + setIsLoading(false); + setFields(res.data ?? {}); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.FIELDS_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.FIELDS_API_ERROR, + text: error.message, + }); + } + } + } + }; + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + }, [http, connector, issueType, toastNotifications]); + + return { + isLoading, + fields, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx new file mode 100644 index 0000000000000..83a60c7f5b3ce --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { connector } from '../mock'; +import { useGetIssueTypes, UseGetIssueTypes } from './use_get_issue_types'; +import * as api from './api'; + +jest.mock('../../../common/kibana'); +jest.mock('./api'); + +const useKibanaMock = useKibana as jest.Mocked; + +describe('useGetIssueTypes', () => { + const { http, notifications } = useKibanaMock().services; + const handleIssueType = jest.fn(); + + beforeEach(() => jest.clearAllMocks()); + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIssueTypes({ http, toastNotifications: notifications.toasts, handleIssueType }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ isLoading: true, issueTypes: [] }); + }); + }); + + test('fetch issue types', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIssueTypes({ + http, + toastNotifications: notifications.toasts, + connector, + handleIssueType, + }) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + issueTypes: [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, + ], + }); + }); + }); + + test('handleIssueType is called', async () => { + await act(async () => { + const { waitForNextUpdate } = renderHook(() => + useGetIssueTypes({ + http, + toastNotifications: notifications.toasts, + connector, + handleIssueType, + }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(handleIssueType).toHaveBeenCalledWith([ + { text: 'Task', value: '10006' }, + { text: 'Bug', value: '10007' }, + ]); + }); + }); + + test('unhappy path', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getIssueTypes'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIssueTypes({ + http, + toastNotifications: notifications.toasts, + connector, + handleIssueType, + }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ isLoading: false, issueTypes: [] }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx new file mode 100644 index 0000000000000..3c35d315a2bcd --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getIssueTypes } from './api'; +import { IssueTypes } from './types'; +import * as i18n from './translations'; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + connector?: ActionConnector; + handleIssueType: (options: Array<{ value: string; text: string }>) => void; +} + +export interface UseGetIssueTypes { + issueTypes: IssueTypes; + isLoading: boolean; +} + +export const useGetIssueTypes = ({ + http, + connector, + toastNotifications, + handleIssueType, +}: Props): UseGetIssueTypes => { + const [isLoading, setIsLoading] = useState(true); + const [issueTypes, setIssueTypes] = useState([]); + const didCancel = useRef(false); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + const fetchData = async () => { + if (!connector) { + setIsLoading(false); + return; + } + + try { + abortCtrl.current = new AbortController(); + setIsLoading(true); + + const res = await getIssueTypes({ + http, + signal: abortCtrl.current.signal, + connectorId: connector.id, + }); + + if (!didCancel.current) { + setIsLoading(false); + const asOptions = (res.data ?? []).map((type) => ({ + text: type.name ?? '', + value: type.id ?? '', + })); + setIssueTypes(res.data ?? []); + handleIssueType(asOptions); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.ISSUE_TYPES_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.ISSUE_TYPES_API_ERROR, + text: error.message, + }); + } + } + } + }; + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + // handleIssueType unmounts the component at init causing the request to be aborted + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [http, connector, toastNotifications]); + + return { + issueTypes, + isLoading, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx new file mode 100644 index 0000000000000..3d0c9614831da --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { connector as actionConnector, issues } from '../mock'; +import { useGetIssues, UseGetIssues } from './use_get_issues'; +import * as api from './api'; + +jest.mock('../../../common/kibana'); +jest.mock('./api'); + +const useKibanaMock = useKibana as jest.Mocked; + +describe('useGetIssues', () => { + const { http, notifications } = useKibanaMock().services; + beforeEach(() => jest.clearAllMocks()); + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIssues({ + http, + toastNotifications: notifications.toasts, + actionConnector, + query: null, + }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ isLoading: false, issues: [] }); + }); + }); + + test('fetch issues', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIssues({ + http, + toastNotifications: notifications.toasts, + actionConnector, + query: 'Task', + }) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + issues, + }); + }); + }); + + test('unhappy path', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getIssues'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIssues({ + http, + toastNotifications: notifications.toasts, + actionConnector, + query: 'oh no', + }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ isLoading: false, issues: [] }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx new file mode 100644 index 0000000000000..b44b0558f1536 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty, debounce } from 'lodash/fp'; +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getIssues } from './api'; +import { Issues } from './types'; +import * as i18n from './translations'; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + actionConnector?: ActionConnector; + query: string | null; +} + +export interface UseGetIssues { + issues: Issues; + isLoading: boolean; +} + +export const useGetIssues = ({ + http, + actionConnector, + toastNotifications, + query, +}: Props): UseGetIssues => { + const [isLoading, setIsLoading] = useState(false); + const [issues, setIssues] = useState([]); + const didCancel = useRef(false); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + const fetchData = debounce(500, async () => { + if (!actionConnector || isEmpty(query)) { + setIsLoading(false); + return; + } + + try { + abortCtrl.current = new AbortController(); + setIsLoading(true); + + const res = await getIssues({ + http, + signal: abortCtrl.current.signal, + connectorId: actionConnector.id, + title: query ?? '', + }); + + if (!didCancel.current) { + setIsLoading(false); + setIssues(res.data ?? []); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.ISSUES_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.ISSUES_API_ERROR, + text: error.message, + }); + } + } + } + }); + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + }, [http, actionConnector, toastNotifications, query]); + + return { + issues, + isLoading, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx new file mode 100644 index 0000000000000..d5152545707b1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { connector as actionConnector, issues } from '../mock'; +import { useGetSingleIssue, UseGetSingleIssue } from './use_get_single_issue'; +import * as api from './api'; + +jest.mock('../../../common/kibana'); +jest.mock('./api'); + +const useKibanaMock = useKibana as jest.Mocked; + +describe('useGetSingleIssue', () => { + const { http, notifications } = useKibanaMock().services; + beforeEach(() => jest.clearAllMocks()); + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetSingleIssue({ + http, + toastNotifications: notifications.toasts, + actionConnector, + id: null, + }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ isLoading: false, issue: null }); + }); + }); + + test('fetch issues', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetSingleIssue({ + http, + toastNotifications: notifications.toasts, + actionConnector, + id: '123', + }) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + issue: issues[0], + }); + }); + }); + + test('unhappy path', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getIssue'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetSingleIssue({ + http, + toastNotifications: notifications.toasts, + actionConnector, + id: '123', + }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ isLoading: false, issue: null }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx new file mode 100644 index 0000000000000..6c70286426168 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getIssue } from './api'; +import { Issue } from './types'; +import * as i18n from './translations'; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + id: string | null; + actionConnector?: ActionConnector; +} + +export interface UseGetSingleIssue { + issue: Issue | null; + isLoading: boolean; +} + +export const useGetSingleIssue = ({ + http, + toastNotifications, + actionConnector, + id, +}: Props): UseGetSingleIssue => { + const [isLoading, setIsLoading] = useState(false); + const [issue, setIssue] = useState(null); + const didCancel = useRef(false); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + const fetchData = async () => { + if (!actionConnector || !id) { + setIsLoading(false); + return; + } + + abortCtrl.current = new AbortController(); + setIsLoading(true); + try { + const res = await getIssue({ + http, + signal: abortCtrl.current.signal, + connectorId: actionConnector.id, + id, + }); + + if (!didCancel.current) { + setIsLoading(false); + setIssue(res.data ?? null); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.GET_ISSUE_API_ERROR(id), + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.GET_ISSUE_API_ERROR(id), + text: error.message, + }); + } + } + } + }; + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + }, [http, actionConnector, id, toastNotifications]); + + return { + isLoading, + issue, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/mock.ts b/x-pack/plugins/cases/public/components/connectors/mock.ts new file mode 100644 index 0000000000000..f5429fa2396aa --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/mock.ts @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const connector = { + id: '123', + name: 'My connector', + actionTypeId: '.jira', + config: {}, + isPreconfigured: false, +}; + +export const issues = [ + { id: 'personId', title: 'Person Task', key: 'personKey' }, + { id: 'womanId', title: 'Woman Task', key: 'womanKey' }, + { id: 'manId', title: 'Man Task', key: 'manKey' }, + { id: 'cameraId', title: 'Camera Task', key: 'cameraKey' }, + { id: 'tvId', title: 'TV Task', key: 'tvKey' }, +]; + +export const choices = [ + { + dependent_value: '', + label: 'Priviledge Escalation', + value: 'Priviledge Escalation', + element: 'category', + }, + { + dependent_value: '', + label: 'Criminal activity/investigation', + value: 'Criminal activity/investigation', + element: 'category', + }, + { + dependent_value: '', + label: 'Denial of Service', + value: 'Denial of Service', + element: 'category', + }, + { + dependent_value: 'Denial of Service', + label: 'Inbound or outbound', + value: '12', + element: 'subcategory', + }, + { + dependent_value: 'Denial of Service', + label: 'Single or distributed (DoS or DDoS)', + value: '26', + element: 'subcategory', + }, + { + dependent_value: 'Denial of Service', + label: 'Inbound DDos', + value: 'inbound_ddos', + element: 'subcategory', + }, + { + dependent_value: '', + label: 'Software', + value: 'software', + element: 'category', + }, + { + dependent_value: 'software', + label: 'Operation System', + value: 'os', + element: 'subcategory', + }, + ...['severity', 'urgency', 'impact', 'priority'] + .map((element) => [ + { + dependent_value: '', + label: '1 - Critical', + value: '1', + element, + }, + { + dependent_value: '', + label: '2 - High', + value: '2', + element, + }, + { + dependent_value: '', + label: '3 - Moderate', + value: '3', + element, + }, + { + dependent_value: '', + label: '4 - Low', + value: '4', + element, + }, + ]) + .flat(), +]; + +export const severity = [ + { + id: 4, + name: 'Low', + }, + { + id: 5, + name: 'Medium', + }, + { + id: 6, + name: 'High', + }, +]; + +export const incidentTypes = [ + { id: 17, name: 'Communication error (fax; email)' }, + { id: 1001, name: 'Custom type' }, +]; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/__mocks__/api.ts b/x-pack/plugins/cases/public/components/connectors/resilient/__mocks__/api.ts new file mode 100644 index 0000000000000..c27248288907d --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/__mocks__/api.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { incidentTypes, severity } from '../../mock'; +import { Props } from '../api'; +import { ResilientIncidentTypes, ResilientSeverity } from '../types'; + +export const getIncidentTypes = async (props: Props): Promise<{ data: ResilientIncidentTypes }> => + Promise.resolve({ data: incidentTypes }); + +export const getSeverity = async (props: Props): Promise<{ data: ResilientSeverity }> => + Promise.resolve({ data: severity }); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/api.ts b/x-pack/plugins/cases/public/components/connectors/resilient/api.ts new file mode 100644 index 0000000000000..6d57f38fa961c --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/api.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpSetup } from 'kibana/public'; +import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { ResilientIncidentTypes, ResilientSeverity } from './types'; + +export const BASE_ACTION_API_PATH = '/api/actions'; + +export interface Props { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; +} + +export async function getIncidentTypes({ http, signal, connectorId }: Props) { + return http.post>( + `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, + { + body: JSON.stringify({ + params: { subAction: 'incidentTypes', subActionParams: {} }, + }), + signal, + } + ); +} + +export async function getSeverity({ http, signal, connectorId }: Props) { + return http.post>( + `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, + { + body: JSON.stringify({ + params: { subAction: 'severity', subActionParams: {} }, + }), + signal, + } + ); +} diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx new file mode 100644 index 0000000000000..cf8aa87c65440 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; +import { waitFor } from '@testing-library/react'; + +import { connector } from '../mock'; +import { useGetIncidentTypes } from './use_get_incident_types'; +import { useGetSeverity } from './use_get_severity'; +import Fields from './case_fields'; + +jest.mock('../../../common/kibana'); +jest.mock('./use_get_incident_types'); +jest.mock('./use_get_severity'); + +const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; +const useGetSeverityMock = useGetSeverity as jest.Mock; + +describe('ResilientParamsFields renders', () => { + const useGetIncidentTypesResponse = { + isLoading: false, + incidentTypes: [ + { + id: 19, + name: 'Malware', + }, + { + id: 21, + name: 'Denial of Service', + }, + ], + }; + + const useGetSeverityResponse = { + isLoading: false, + severity: [ + { + id: 4, + name: 'Low', + }, + { + id: 5, + name: 'Medium', + }, + { + id: 6, + name: 'High', + }, + ], + }; + + const fields = { + severityCode: '6', + incidentTypes: ['19'], + }; + + const onChange = jest.fn(); + + beforeEach(() => { + useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); + useGetSeverityMock.mockReturnValue(useGetSeverityResponse); + jest.clearAllMocks(); + }); + + test('all params fields are rendered', () => { + const wrapper = mount(); + expect(wrapper.find('[data-test-subj="incidentTypeComboBox"]').first().prop('options')).toEqual( + [ + { label: 'Malware', value: '19' }, + { label: 'Denial of Service', value: '21' }, + ] + ); + + expect( + wrapper.find('[data-test-subj="incidentTypeComboBox"]').first().prop('selectedOptions') + ).toEqual([{ label: 'Malware', value: '19' }]); + + expect(wrapper.find('[data-test-subj="severitySelect"]').first().prop('value')).toStrictEqual( + '6' + ); + }); + + test('it disabled the fields when loading incident types', () => { + useGetIncidentTypesMock.mockReturnValue({ ...useGetIncidentTypesResponse, isLoading: true }); + + const wrapper = mount(); + + expect( + wrapper.find('[data-test-subj="incidentTypeComboBox"]').first().prop('isDisabled') + ).toBeTruthy(); + }); + + test('it disabled the fields when loading severity', () => { + useGetSeverityMock.mockReturnValue({ + ...useGetSeverityResponse, + isLoading: true, + }); + + const wrapper = mount(); + + expect(wrapper.find('[data-test-subj="severitySelect"]').first().prop('disabled')).toBeTruthy(); + }); + + test('it sets issue type correctly', async () => { + const wrapper = mount(); + + await waitFor(() => { + ((wrapper.find(EuiComboBox).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange([{ value: '19', label: 'Denial of Service' }]); + }); + + expect(onChange).toHaveBeenCalledWith({ incidentTypes: ['19'], severityCode: '6' }); + }); + + test('it sets severity correctly', async () => { + const wrapper = mount(); + + wrapper + .find('select[data-test-subj="severitySelect"]') + .first() + .simulate('change', { + target: { value: '4' }, + }); + + expect(onChange).toHaveBeenCalledWith({ incidentTypes: ['19'], severityCode: '4' }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx new file mode 100644 index 0000000000000..88fb907b16cde --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx @@ -0,0 +1,189 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useCallback, useEffect, useRef } from 'react'; +import { + EuiComboBox, + EuiComboBoxOptionOption, + EuiFormRow, + EuiSelect, + EuiSelectOption, + EuiSpacer, +} from '@elastic/eui'; + +import { useKibana } from '../../../common/kibana'; +import { ConnectorFieldsProps } from '../types'; +import { useGetIncidentTypes } from './use_get_incident_types'; +import { useGetSeverity } from './use_get_severity'; + +import * as i18n from './translations'; +import { ConnectorTypes, ResilientFieldsType } from '../../../../common/api/connectors'; +import { ConnectorCard } from '../card'; + +const ResilientFieldsComponent: React.FunctionComponent< + ConnectorFieldsProps +> = ({ isEdit = true, fields, connector, onChange }) => { + const init = useRef(true); + const { incidentTypes = null, severityCode = null } = fields ?? {}; + + const { http, notifications } = useKibana().services; + + const { + isLoading: isLoadingIncidentTypes, + incidentTypes: allIncidentTypes, + } = useGetIncidentTypes({ + http, + toastNotifications: notifications.toasts, + connector, + }); + + const { isLoading: isLoadingSeverity, severity } = useGetSeverity({ + http, + toastNotifications: notifications.toasts, + connector, + }); + + const severitySelectOptions: EuiSelectOption[] = useMemo( + () => + severity.map((s) => ({ + value: s.id.toString(), + text: s.name, + })), + [severity] + ); + + const incidentTypesComboBoxOptions: Array> = useMemo( + () => + allIncidentTypes + ? allIncidentTypes.map((type: { id: number; name: string }) => ({ + label: type.name, + value: type.id.toString(), + })) + : [], + [allIncidentTypes] + ); + const listItems = useMemo( + () => [ + ...(incidentTypes != null && incidentTypes.length > 0 + ? [ + { + title: i18n.INCIDENT_TYPES_LABEL, + description: allIncidentTypes + .filter((type) => incidentTypes.includes(type.id.toString())) + .map((type) => type.name) + .join(', '), + }, + ] + : []), + ...(severityCode != null && severityCode.length > 0 + ? [ + { + title: i18n.SEVERITY_LABEL, + description: + severity.find((severityObj) => severityObj.id.toString() === severityCode)?.name ?? + '', + }, + ] + : []), + ], + [incidentTypes, severityCode, allIncidentTypes, severity] + ); + + const onFieldChange = useCallback( + (key, value) => { + onChange({ + ...fields, + incidentTypes, + severityCode, + [key]: value, + }); + }, + [incidentTypes, severityCode, onChange, fields] + ); + + const selectedIncidentTypesComboBoxOptionsMemo = useMemo(() => { + const allIncidentTypesAsObject = allIncidentTypes.reduce( + (acc, type) => ({ ...acc, [type.id.toString()]: type.name }), + {} as Record + ); + return incidentTypes + ? incidentTypes + .map((type) => ({ + label: allIncidentTypesAsObject[type.toString()], + value: type.toString(), + })) + .filter((type) => type.label != null) + : []; + }, [allIncidentTypes, incidentTypes]); + + const onIncidentChange = useCallback( + (selectedOptions: Array<{ label: string; value?: string }>) => { + onFieldChange( + 'incidentTypes', + selectedOptions.map((selectedOption) => selectedOption.value ?? selectedOption.label) + ); + }, + [onFieldChange] + ); + + const onIncidentBlur = useCallback(() => { + if (!incidentTypes) { + onFieldChange('incidentTypes', []); + } + }, [incidentTypes, onFieldChange]); + + // Set field at initialization + useEffect(() => { + if (init.current) { + init.current = false; + onChange({ incidentTypes, severityCode }); + } + }, [incidentTypes, onChange, severityCode]); + + return isEdit ? ( + + + + + + + onFieldChange('severityCode', e.target.value)} + options={severitySelectOptions} + value={severityCode ?? undefined} + /> + + + + ) : ( + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { ResilientFieldsComponent as default }; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/index.ts b/x-pack/plugins/cases/public/components/connectors/resilient/index.ts new file mode 100644 index 0000000000000..216bdde89ba48 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { lazy } from 'react'; + +import { CaseConnector } from '../types'; +import { ResilientFieldsType } from '../../../../common/api/connectors'; +import * as i18n from './translations'; + +export * from './types'; + +export const getCaseConnector = (): CaseConnector => { + return { + id: '.resilient', + fieldsComponent: lazy(() => import('./case_fields')), + }; +}; + +export const fieldLabels = { + incidentTypes: i18n.INCIDENT_TYPES_LABEL, + severityCode: i18n.SEVERITY_LABEL, +}; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts b/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts new file mode 100644 index 0000000000000..4f8061f48aa68 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const INCIDENT_TYPES_API_ERROR = i18n.translate( + 'xpack.securitySolution.cases.connectors.resilient.unableToGetIncidentTypesMessage', + { + defaultMessage: 'Unable to get incident types', + } +); + +export const SEVERITY_API_ERROR = i18n.translate( + 'xpack.securitySolution.cases.connectors.resilient.unableToGetSeverityMessage', + { + defaultMessage: 'Unable to get severity', + } +); + +export const INCIDENT_TYPES_PLACEHOLDER = i18n.translate( + 'xpack.securitySolution.cases.connectors.resilient.incidentTypesPlaceholder', + { + defaultMessage: 'Choose types', + } +); + +export const INCIDENT_TYPES_LABEL = i18n.translate( + 'xpack.securitySolution.cases.connectors.resilient.incidentTypesLabel', + { + defaultMessage: 'Incident Types', + } +); + +export const SEVERITY_LABEL = i18n.translate( + 'xpack.securitySolution.cases.connectors.resilient.severityLabel', + { + defaultMessage: 'Severity', + } +); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/types.ts b/x-pack/plugins/cases/public/components/connectors/resilient/types.ts new file mode 100644 index 0000000000000..06506d2c0d2f9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/types.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type ResilientIncidentTypes = Array<{ id: number; name: string }>; +export type ResilientSeverity = ResilientIncidentTypes; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx new file mode 100644 index 0000000000000..e3050cd68659b --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { connector } from '../mock'; +import { useGetIncidentTypes, UseGetIncidentTypes } from './use_get_incident_types'; +import * as api from './api'; + +jest.mock('../../../common/kibana'); +jest.mock('./api'); + +const useKibanaMock = useKibana as jest.Mocked; + +describe('useGetIncidentTypes', () => { + const { http, notifications } = useKibanaMock().services; + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIncidentTypes({ http, toastNotifications: notifications.toasts }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ isLoading: true, incidentTypes: [] }); + }); + }); + + test('fetch incident types', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIncidentTypes({ + http, + toastNotifications: notifications.toasts, + connector, + }) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + incidentTypes: [ + { id: 17, name: 'Communication error (fax; email)' }, + { id: 1001, name: 'Custom type' }, + ], + }); + }); + }); + + test('unhappy path', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getIncidentTypes'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetIncidentTypes({ http, toastNotifications: notifications.toasts, connector }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ isLoading: false, incidentTypes: [] }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx new file mode 100644 index 0000000000000..34cbb0a69b0f4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getIncidentTypes } from './api'; +import * as i18n from './translations'; + +type IncidentTypes = Array<{ id: number; name: string }>; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + connector?: ActionConnector; +} + +export interface UseGetIncidentTypes { + incidentTypes: IncidentTypes; + isLoading: boolean; +} + +export const useGetIncidentTypes = ({ + http, + toastNotifications, + connector, +}: Props): UseGetIncidentTypes => { + const [isLoading, setIsLoading] = useState(true); + const [incidentTypes, setIncidentTypes] = useState([]); + const didCancel = useRef(false); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + const fetchData = async () => { + if (!connector) { + setIsLoading(false); + return; + } + + try { + abortCtrl.current = new AbortController(); + setIsLoading(true); + + const res = await getIncidentTypes({ + http, + signal: abortCtrl.current.signal, + connectorId: connector.id, + }); + + if (!didCancel.current) { + setIsLoading(false); + setIncidentTypes(res.data ?? []); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.INCIDENT_TYPES_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.INCIDENT_TYPES_API_ERROR, + text: error.message, + }); + } + } + } + }; + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + }, [http, connector, toastNotifications]); + + return { + incidentTypes, + isLoading, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx new file mode 100644 index 0000000000000..db67f722fd17a --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { connector } from '../mock'; +import { useGetSeverity, UseGetSeverity } from './use_get_severity'; +import * as api from './api'; + +jest.mock('../../../common/kibana'); +jest.mock('./api'); + +const useKibanaMock = useKibana as jest.Mocked; + +describe('useGetSeverity', () => { + const { http, notifications } = useKibanaMock().services; + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetSeverity({ http, toastNotifications: notifications.toasts }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ isLoading: true, severity: [] }); + }); + }); + + test('fetch severity', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetSeverity({ http, toastNotifications: notifications.toasts, connector }) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + severity: [ + { + id: 4, + name: 'Low', + }, + { + id: 5, + name: 'Medium', + }, + { + id: 6, + name: 'High', + }, + ], + }); + }); + }); + + test('unhappy path', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getSeverity'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetSeverity({ http, toastNotifications: notifications.toasts, connector }) + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ isLoading: false, severity: [] }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx new file mode 100644 index 0000000000000..5b44c6b4a32b2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getSeverity } from './api'; +import * as i18n from './translations'; + +type Severity = Array<{ id: number; name: string }>; + +interface Props { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + connector?: ActionConnector; +} + +export interface UseGetSeverity { + severity: Severity; + isLoading: boolean; +} + +export const useGetSeverity = ({ http, toastNotifications, connector }: Props): UseGetSeverity => { + const [isLoading, setIsLoading] = useState(true); + const [severity, setSeverity] = useState([]); + const abortCtrl = useRef(new AbortController()); + const didCancel = useRef(false); + + useEffect(() => { + const fetchData = async () => { + if (!connector) { + setIsLoading(false); + return; + } + + try { + abortCtrl.current = new AbortController(); + setIsLoading(true); + + const res = await getSeverity({ + http, + signal: abortCtrl.current.signal, + connectorId: connector.id, + }); + + if (!didCancel.current) { + setIsLoading(false); + setSeverity(res.data ?? []); + + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.SEVERITY_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.SEVERITY_API_ERROR, + text: error.message, + }); + } + } + } + }; + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + }, [http, connector, toastNotifications]); + + return { + severity, + isLoading, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/__mocks__/api.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/__mocks__/api.ts new file mode 100644 index 0000000000000..215e3d6f92e6d --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/__mocks__/api.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { choices } from '../../mock'; +import { GetChoicesProps } from '../api'; +import { Choice } from '../types'; + +export const choicesResponse = { + status: 'ok', + data: choices, +}; + +export const getChoices = async ( + props: GetChoicesProps +): Promise<{ status: string; data: Choice[] }> => Promise.resolve(choicesResponse); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts new file mode 100644 index 0000000000000..6a6bb7e947997 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { getChoices } from './api'; +import { choices } from '../mock'; + +const choicesResponse = { + status: 'ok', + data: choices, +}; + +describe('ServiceNow API', () => { + const http = httpServiceMock.createStartContract(); + + beforeEach(() => jest.resetAllMocks()); + + describe('getChoices', () => { + test('should call get choices API', async () => { + const abortCtrl = new AbortController(); + http.post.mockResolvedValueOnce(choicesResponse); + const res = await getChoices({ + http, + signal: abortCtrl.signal, + connectorId: 'test', + fields: ['priority'], + }); + + expect(res).toEqual(choicesResponse); + expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { + body: '{"params":{"subAction":"getChoices","subActionParams":{"fields":["priority"]}}}', + signal: abortCtrl.signal, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts new file mode 100644 index 0000000000000..d91ad9f8762bd --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpSetup } from 'kibana/public'; +import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { Choice } from './types'; + +export const BASE_ACTION_API_PATH = '/api/actions'; + +export interface GetChoicesProps { + http: HttpSetup; + signal: AbortSignal; + connectorId: string; + fields: string[]; +} + +export async function getChoices({ http, signal, connectorId, fields }: GetChoicesProps) { + return http.post>( + `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, + { + body: JSON.stringify({ + params: { subAction: 'getChoices', subActionParams: { fields } }, + }), + signal, + } + ); +} diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/helpers.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/helpers.ts new file mode 100644 index 0000000000000..314d224491128 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/helpers.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiSelectOption } from '@elastic/eui'; +import { Choice } from './types'; + +export const choicesToEuiOptions = (choices: Choice[]): EuiSelectOption[] => + choices.map((choice) => ({ value: choice.value, text: choice.label })); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts new file mode 100644 index 0000000000000..9ba7603ac64ba --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { lazy } from 'react'; + +import { CaseConnector } from '../types'; +import { + ServiceNowITSMFieldsType, + ServiceNowSIRFieldsType, +} from '../../../../common/api/connectors'; +import * as i18n from './translations'; + +export const getServiceNowITSMCaseConnector = (): CaseConnector => { + return { + id: '.servicenow', + fieldsComponent: lazy(() => import('./servicenow_itsm_case_fields')), + }; +}; + +export const getServiceNowSIRCaseConnector = (): CaseConnector => { + return { + id: '.servicenow-sir', + fieldsComponent: lazy(() => import('./servicenow_sir_case_fields')), + }; +}; + +export const serviceNowITSMFieldLabels = { + impact: i18n.IMPACT, + severity: i18n.SEVERITY, + urgency: i18n.URGENCY, +}; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx new file mode 100644 index 0000000000000..489570b22f187 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx @@ -0,0 +1,164 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { waitFor, act } from '@testing-library/react'; +import { EuiSelect } from '@elastic/eui'; +import { mount } from 'enzyme'; + +import { connector, choices as mockChoices } from '../mock'; +import { Choice } from './types'; +import Fields from './servicenow_itsm_case_fields'; + +let onChoicesSuccess = (c: Choice[]) => {}; + +jest.mock('../../../common/kibana'); +jest.mock('./use_get_choices', () => ({ + useGetChoices: (args: { onSuccess: () => void }) => { + onChoicesSuccess = args.onSuccess; + return { isLoading: false, choices: mockChoices }; + }, +})); + +describe('ServiceNowITSM Fields', () => { + const fields = { + severity: '1', + urgency: '2', + impact: '3', + category: 'software', + subcategory: 'os', + }; + const onChange = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('all params fields are rendered - isEdit: true', () => { + const wrapper = mount(); + expect(wrapper.find('[data-test-subj="severitySelect"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="urgencySelect"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="impactSelect"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="categorySelect"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="subcategorySelect"]').exists()).toBeTruthy(); + }); + + it('all params fields are rendered - isEdit: false', () => { + const wrapper = mount( + + ); + act(() => { + onChoicesSuccess(mockChoices); + }); + + expect(wrapper.find('[data-test-subj="card-list-item"]').at(0).text()).toEqual( + 'Urgency: 2 - High' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(1).text()).toEqual( + 'Severity: 1 - Critical' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(2).text()).toEqual( + 'Impact: 3 - Moderate' + ); + }); + + test('it transforms the categories to options correctly', async () => { + const wrapper = mount(); + act(() => { + onChoicesSuccess(mockChoices); + }); + + wrapper.update(); + expect(wrapper.find('[data-test-subj="categorySelect"]').first().prop('options')).toEqual([ + { value: 'Priviledge Escalation', text: 'Priviledge Escalation' }, + { + value: 'Criminal activity/investigation', + text: 'Criminal activity/investigation', + }, + { value: 'Denial of Service', text: 'Denial of Service' }, + { + value: 'software', + text: 'Software', + }, + ]); + }); + + test('it transforms the subcategories to options correctly', async () => { + const wrapper = mount(); + act(() => { + onChoicesSuccess(mockChoices); + }); + + wrapper.update(); + expect(wrapper.find('[data-test-subj="subcategorySelect"]').first().prop('options')).toEqual([ + { + text: 'Operation System', + value: 'os', + }, + ]); + }); + + it('it transforms the options correctly', async () => { + const wrapper = mount(); + act(() => { + onChoicesSuccess(mockChoices); + }); + + wrapper.update(); + const testers = ['severity', 'urgency', 'impact']; + testers.forEach((subj) => + expect(wrapper.find(`[data-test-subj="${subj}Select"]`).first().prop('options')).toEqual([ + { value: '1', text: '1 - Critical' }, + { value: '2', text: '2 - High' }, + { value: '3', text: '3 - Moderate' }, + { value: '4', text: '4 - Low' }, + ]) + ); + }); + + describe('onChange calls', () => { + const wrapper = mount(); + + expect(onChange).toHaveBeenCalledWith(fields); + + const testers = ['severity', 'urgency', 'impact', 'subcategory']; + testers.forEach((subj) => + test(`${subj.toUpperCase()}`, async () => { + await waitFor(() => { + const select = wrapper.find(EuiSelect).filter(`[data-test-subj="${subj}Select"]`)!; + select.prop('onChange')!({ + target: { + value: '9', + }, + } as React.ChangeEvent); + }); + wrapper.update(); + expect(onChange).toHaveBeenCalledWith({ + ...fields, + [subj]: '9', + }); + }) + ); + + test('it should set subcategory to null when changing category', async () => { + await waitFor(() => { + const select = wrapper.find(EuiSelect).filter(`[data-test-subj="categorySelect"]`)!; + select.prop('onChange')!({ + target: { + value: 'network', + }, + } as React.ChangeEvent); + }); + wrapper.update(); + expect(onChange).toHaveBeenCalledWith({ + ...fields, + subcategory: null, + category: 'network', + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx new file mode 100644 index 0000000000000..4587b4b321a8f --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx @@ -0,0 +1,235 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; +import { EuiFormRow, EuiSelect, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import * as i18n from './translations'; + +import { ConnectorFieldsProps } from '../types'; +import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../common/api/connectors'; +import { useKibana } from '../../../common/kibana'; +import { ConnectorCard } from '../card'; +import { useGetChoices } from './use_get_choices'; +import { Fields, Choice } from './types'; +import { choicesToEuiOptions } from './helpers'; + +const useGetChoicesFields = ['urgency', 'severity', 'impact', 'category', 'subcategory']; +const defaultFields: Fields = { + urgency: [], + severity: [], + impact: [], + category: [], + subcategory: [], +}; + +const ServiceNowITSMFieldsComponent: React.FunctionComponent< + ConnectorFieldsProps +> = ({ isEdit = true, fields, connector, onChange }) => { + const init = useRef(true); + const { severity = null, urgency = null, impact = null, category = null, subcategory = null } = + fields ?? {}; + const { http, notifications } = useKibana().services; + const [choices, setChoices] = useState(defaultFields); + + const categoryOptions = useMemo(() => choicesToEuiOptions(choices.category), [choices.category]); + const urgencyOptions = useMemo(() => choicesToEuiOptions(choices.urgency), [choices.urgency]); + const severityOptions = useMemo(() => choicesToEuiOptions(choices.severity), [choices.severity]); + const impactOptions = useMemo(() => choicesToEuiOptions(choices.impact), [choices.impact]); + + const subcategoryOptions = useMemo( + () => + choicesToEuiOptions( + choices.subcategory.filter((choice) => choice.dependent_value === category) + ), + [choices.subcategory, category] + ); + + const listItems = useMemo( + () => [ + ...(urgency != null && urgency.length > 0 + ? [ + { + title: i18n.URGENCY, + description: urgencyOptions.find((option) => `${option.value}` === urgency)?.text, + }, + ] + : []), + ...(severity != null && severity.length > 0 + ? [ + { + title: i18n.SEVERITY, + description: severityOptions.find((option) => `${option.value}` === severity)?.text, + }, + ] + : []), + ...(impact != null && impact.length > 0 + ? [ + { + title: i18n.IMPACT, + description: impactOptions.find((option) => `${option.value}` === impact)?.text, + }, + ] + : []), + ...(category != null && category.length > 0 + ? [ + { + title: i18n.CATEGORY, + description: categoryOptions.find((option) => `${option.value}` === category)?.text, + }, + ] + : []), + ...(subcategory != null && subcategory.length > 0 + ? [ + { + title: i18n.SUBCATEGORY, + description: subcategoryOptions.find((option) => `${option.value}` === subcategory) + ?.text, + }, + ] + : []), + ], + [ + category, + categoryOptions, + impact, + impactOptions, + severity, + severityOptions, + subcategory, + subcategoryOptions, + urgency, + urgencyOptions, + ] + ); + + const onChoicesSuccess = (values: Choice[]) => { + setChoices( + values.reduce( + (acc, value) => ({ + ...acc, + [value.element]: [...(acc[value.element] != null ? acc[value.element] : []), value], + }), + defaultFields + ) + ); + }; + + const { isLoading: isLoadingChoices } = useGetChoices({ + http, + toastNotifications: notifications.toasts, + connector, + fields: useGetChoicesFields, + onSuccess: onChoicesSuccess, + }); + + const onChangeCb = useCallback( + ( + key: keyof ServiceNowITSMFieldsType, + value: ServiceNowITSMFieldsType[keyof ServiceNowITSMFieldsType] + ) => { + onChange({ ...fields, [key]: value }); + }, + [fields, onChange] + ); + + // Set field at initialization + useEffect(() => { + if (init.current) { + init.current = false; + onChange({ urgency, severity, impact, category, subcategory }); + } + }, [category, impact, onChange, severity, subcategory, urgency]); + + return isEdit ? ( +
+ + onChangeCb('urgency', e.target.value)} + /> + + + + + + onChangeCb('severity', e.target.value)} + /> + + + + + onChangeCb('impact', e.target.value)} + /> + + + + + + + onChange({ ...fields, category: e.target.value, subcategory: null })} + /> + + + + + onChangeCb('subcategory', e.target.value)} + /> + + + +
+ ) : ( + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { ServiceNowITSMFieldsComponent as default }; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx new file mode 100644 index 0000000000000..9bf74bfd5feaf --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx @@ -0,0 +1,221 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor, act } from '@testing-library/react'; +import { EuiSelect } from '@elastic/eui'; + +import { connector, choices as mockChoices } from '../mock'; +import { Choice } from './types'; +import Fields from './servicenow_sir_case_fields'; + +let onChoicesSuccess = (c: Choice[]) => {}; + +jest.mock('../../../common/kibana'); +jest.mock('./use_get_choices', () => ({ + useGetChoices: (args: { onSuccess: () => void }) => { + onChoicesSuccess = args.onSuccess; + return { isLoading: false, mockChoices }; + }, +})); + +describe('ServiceNowSIR Fields', () => { + const fields = { + destIp: true, + sourceIp: true, + malwareHash: true, + malwareUrl: true, + priority: '1', + category: 'Denial of Service', + subcategory: '26', + }; + const onChange = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('all params fields are rendered - isEdit: true', () => { + const wrapper = mount(); + expect(wrapper.find('[data-test-subj="destIpCheckbox"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="sourceIpCheckbox"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="malwareUrlCheckbox"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="malwareHashCheckbox"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="prioritySelect"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="categorySelect"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="subcategorySelect"]').exists()).toBeTruthy(); + }); + + test('all params fields are rendered - isEdit: false', () => { + const wrapper = mount( + + ); + act(() => { + onChoicesSuccess(mockChoices); + }); + wrapper.update(); + + expect(wrapper.find('[data-test-subj="card-list-item"]').at(0).text()).toEqual( + 'Destination IP: Yes' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(1).text()).toEqual( + 'Source IP: Yes' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(2).text()).toEqual( + 'Malware URL: Yes' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(3).text()).toEqual( + 'Malware Hash: Yes' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(4).text()).toEqual( + 'Priority: 1 - Critical' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(5).text()).toEqual( + 'Category: Denial of Service' + ); + expect(wrapper.find('[data-test-subj="card-list-item"]').at(6).text()).toEqual( + 'Subcategory: Single or distributed (DoS or DDoS)' + ); + }); + + test('it transforms the categories to options correctly', async () => { + const wrapper = mount(); + act(() => { + onChoicesSuccess(mockChoices); + }); + + wrapper.update(); + expect(wrapper.find('[data-test-subj="categorySelect"]').first().prop('options')).toEqual([ + { value: 'Priviledge Escalation', text: 'Priviledge Escalation' }, + { + value: 'Criminal activity/investigation', + text: 'Criminal activity/investigation', + }, + { value: 'Denial of Service', text: 'Denial of Service' }, + { + text: 'Software', + value: 'software', + }, + ]); + }); + + test('it transforms the subcategories to options correctly', async () => { + const wrapper = mount(); + act(() => { + onChoicesSuccess(mockChoices); + }); + + wrapper.update(); + expect(wrapper.find('[data-test-subj="subcategorySelect"]').first().prop('options')).toEqual([ + { + text: 'Inbound or outbound', + value: '12', + }, + { + text: 'Single or distributed (DoS or DDoS)', + value: '26', + }, + { + text: 'Inbound DDos', + value: 'inbound_ddos', + }, + ]); + }); + + test('it transforms the priorities to options correctly', async () => { + const wrapper = mount(); + act(() => { + onChoicesSuccess(mockChoices); + }); + + wrapper.update(); + expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('options')).toEqual([ + { + text: '1 - Critical', + value: '1', + }, + { + text: '2 - High', + value: '2', + }, + { + text: '3 - Moderate', + value: '3', + }, + { + text: '4 - Low', + value: '4', + }, + ]); + }); + + describe('onChange calls', () => { + const wrapper = mount(); + + act(() => { + onChoicesSuccess(mockChoices); + }); + wrapper.update(); + + expect(onChange).toHaveBeenCalledWith(fields); + + const checkbox = ['destIp', 'sourceIp', 'malwareHash', 'malwareUrl']; + checkbox.forEach((subj) => + test(`${subj.toUpperCase()}`, async () => { + await waitFor(() => { + wrapper + .find(`[data-test-subj="${subj}Checkbox"] input`) + .first() + .simulate('change', { target: { checked: false } }); + expect(onChange).toHaveBeenCalledWith({ + ...fields, + [subj]: false, + }); + }); + }) + ); + + const testers = ['priority', 'subcategory']; + testers.forEach((subj) => + test(`${subj.toUpperCase()}`, async () => { + await waitFor(() => { + const select = wrapper.find(EuiSelect).filter(`[data-test-subj="${subj}Select"]`)!; + select.prop('onChange')!({ + target: { + value: '9', + }, + } as React.ChangeEvent); + }); + wrapper.update(); + expect(onChange).toHaveBeenCalledWith({ + ...fields, + [subj]: '9', + }); + }) + ); + + test('it should set subcategory to null when changing category', async () => { + const select = wrapper.find(EuiSelect).filter(`[data-test-subj="categorySelect"]`)!; + select.prop('onChange')!({ + target: { + value: 'network', + }, + } as React.ChangeEvent); + + wrapper.update(); + + await waitFor(() => { + expect(onChange).toHaveBeenCalledWith({ + ...fields, + subcategory: null, + category: 'network', + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx new file mode 100644 index 0000000000000..3b59aa1d3eb3c --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx @@ -0,0 +1,282 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; +import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; + +import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../common/api/connectors'; +import { useKibana } from '../../../common/kibana'; +import { ConnectorFieldsProps } from '../types'; +import { ConnectorCard } from '../card'; +import { useGetChoices } from './use_get_choices'; +import { Choice, Fields } from './types'; +import { choicesToEuiOptions } from './helpers'; + +import * as i18n from './translations'; + +const useGetChoicesFields = ['category', 'subcategory', 'priority']; +const defaultFields: Fields = { + category: [], + subcategory: [], + priority: [], +}; + +const ServiceNowSIRFieldsComponent: React.FunctionComponent< + ConnectorFieldsProps +> = ({ isEdit = true, fields, connector, onChange }) => { + const init = useRef(true); + const { + category = null, + destIp = true, + malwareHash = true, + malwareUrl = true, + priority = null, + sourceIp = true, + subcategory = null, + } = fields ?? {}; + + const { http, notifications } = useKibana().services; + + const [choices, setChoices] = useState(defaultFields); + + const onChangeCb = useCallback( + ( + key: keyof ServiceNowSIRFieldsType, + value: ServiceNowSIRFieldsType[keyof ServiceNowSIRFieldsType] + ) => { + onChange({ ...fields, [key]: value }); + }, + [fields, onChange] + ); + + const onChoicesSuccess = (values: Choice[]) => { + setChoices( + values.reduce( + (acc, value) => ({ + ...acc, + [value.element]: [...(acc[value.element] != null ? acc[value.element] : []), value], + }), + defaultFields + ) + ); + }; + + const { isLoading: isLoadingChoices } = useGetChoices({ + http, + toastNotifications: notifications.toasts, + connector, + fields: useGetChoicesFields, + onSuccess: onChoicesSuccess, + }); + + const categoryOptions = useMemo(() => choicesToEuiOptions(choices.category), [choices.category]); + const priorityOptions = useMemo(() => choicesToEuiOptions(choices.priority), [choices.priority]); + + const subcategoryOptions = useMemo( + () => + choicesToEuiOptions( + choices.subcategory.filter((choice) => choice.dependent_value === category) + ), + [choices.subcategory, category] + ); + + const listItems = useMemo( + () => [ + ...(destIp != null && destIp + ? [ + { + title: i18n.DEST_IP, + description: i18n.ALERT_FIELD_ENABLED_TEXT, + }, + ] + : []), + ...(sourceIp != null && sourceIp + ? [ + { + title: i18n.SOURCE_IP, + description: i18n.ALERT_FIELD_ENABLED_TEXT, + }, + ] + : []), + ...(malwareUrl != null && malwareUrl + ? [ + { + title: i18n.MALWARE_URL, + description: i18n.ALERT_FIELD_ENABLED_TEXT, + }, + ] + : []), + ...(malwareHash != null && malwareHash + ? [ + { + title: i18n.MALWARE_HASH, + description: i18n.ALERT_FIELD_ENABLED_TEXT, + }, + ] + : []), + ...(priority != null && priority.length > 0 + ? [ + { + title: i18n.PRIORITY, + description: priorityOptions.find((option) => `${option.value}` === priority)?.text, + }, + ] + : []), + ...(category != null && category.length > 0 + ? [ + { + title: i18n.CATEGORY, + description: categoryOptions.find((option) => `${option.value}` === category)?.text, + }, + ] + : []), + ...(subcategory != null && subcategory.length > 0 + ? [ + { + title: i18n.SUBCATEGORY, + description: subcategoryOptions.find((option) => `${option.value}` === subcategory) + ?.text, + }, + ] + : []), + ], + [ + category, + categoryOptions, + destIp, + malwareHash, + malwareUrl, + priority, + priorityOptions, + sourceIp, + subcategory, + subcategoryOptions, + ] + ); + + // Set field at initialization + useEffect(() => { + if (init.current) { + init.current = false; + onChange({ category, destIp, malwareHash, malwareUrl, priority, sourceIp, subcategory }); + } + }, [category, destIp, malwareHash, malwareUrl, onChange, priority, sourceIp, subcategory]); + + return isEdit ? ( +
+ + + + <> + + + onChangeCb('destIp', e.target.checked)} + /> + + + onChangeCb('sourceIp', e.target.checked)} + /> + + + + + onChangeCb('malwareUrl', e.target.checked)} + /> + + + onChangeCb('malwareHash', e.target.checked)} + /> + + + + + + + + + + onChangeCb('priority', e.target.value)} + /> + + + + + + + onChange({ ...fields, category: e.target.value, subcategory: null })} + /> + + + + + onChangeCb('subcategory', e.target.value)} + /> + + + +
+ ) : ( + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { ServiceNowSIRFieldsComponent as default }; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts new file mode 100644 index 0000000000000..77c263385df0a --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const URGENCY = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.urgencySelectFieldLabel', + { + defaultMessage: 'Urgency', + } +); + +export const SEVERITY = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.severitySelectFieldLabel', + { + defaultMessage: 'Severity', + } +); + +export const IMPACT = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.impactSelectFieldLabel', + { + defaultMessage: 'Impact', + } +); + +export const CHOICES_API_ERROR = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.unableToGetChoicesMessage', + { + defaultMessage: 'Unable to get choices', + } +); + +export const MALWARE_URL = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.malwareURLTitle', + { + defaultMessage: 'Malware URL', + } +); + +export const MALWARE_HASH = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.malwareHashTitle', + { + defaultMessage: 'Malware Hash', + } +); + +export const CATEGORY = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.categoryTitle', + { + defaultMessage: 'Category', + } +); + +export const SUBCATEGORY = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.subcategoryTitle', + { + defaultMessage: 'Subcategory', + } +); + +export const SOURCE_IP = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.sourceIPTitle', + { + defaultMessage: 'Source IP', + } +); + +export const DEST_IP = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.destinationIPTitle', + { + defaultMessage: 'Destination IP', + } +); + +export const PRIORITY = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.prioritySelectFieldTitle', + { + defaultMessage: 'Priority', + } +); + +export const ALERT_FIELDS_LABEL = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.alertFieldsTitle', + { + defaultMessage: 'Select Observables to push', + } +); + +export const ALERT_FIELD_ENABLED_TEXT = i18n.translate( + 'xpack.securitySolution.components.connectors.serviceNow.alertFieldEnabledText', + { + defaultMessage: 'Yes', + } +); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/types.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/types.ts new file mode 100644 index 0000000000000..fd1af62f7bb2a --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/types.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface Choice { + value: string; + label: string; + dependent_value: string; + element: string; +} + +export type Fields = Record; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx new file mode 100644 index 0000000000000..6a956f6327388 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/kibana'; +import { ActionConnector } from '../../../containers/types'; +import { choices } from '../mock'; +import { useGetChoices, UseGetChoices, UseGetChoicesProps } from './use_get_choices'; +import * as api from './api'; + +jest.mock('./api'); +jest.mock('../../../common/kibana'); + +const useKibanaMock = useKibana as jest.Mocked; +const onSuccess = jest.fn(); +const fields = ['priority']; + +const connector = { + secrets: { + username: 'user', + password: 'pass', + }, + id: 'test', + actionTypeId: '.servicenow', + name: 'ServiceNow', + isPreconfigured: false, + config: { + apiUrl: 'https://dev94428.service-now.com/', + }, +} as ActionConnector; + +describe('useGetChoices', () => { + const { services } = useKibanaMock(); + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('init', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetChoices({ + http: services.http, + connector, + toastNotifications: services.notifications.toasts, + fields, + onSuccess, + }) + ); + + await waitForNextUpdate(); + + expect(result.current).toEqual({ + isLoading: false, + choices, + }); + }); + + it('returns an empty array when connector is not presented', async () => { + const { result } = renderHook(() => + useGetChoices({ + http: services.http, + connector: undefined, + toastNotifications: services.notifications.toasts, + fields, + onSuccess, + }) + ); + + expect(result.current).toEqual({ + isLoading: false, + choices: [], + }); + }); + + it('it calls onSuccess', async () => { + const { waitForNextUpdate } = renderHook(() => + useGetChoices({ + http: services.http, + connector, + toastNotifications: services.notifications.toasts, + fields, + onSuccess, + }) + ); + + await waitForNextUpdate(); + + expect(onSuccess).toHaveBeenCalledWith(choices); + }); + + it('it displays an error when service fails', async () => { + const spyOnGetChoices = jest.spyOn(api, 'getChoices'); + spyOnGetChoices.mockResolvedValue( + Promise.resolve({ + actionId: 'test', + status: 'error', + serviceMessage: 'An error occurred', + }) + ); + + const { waitForNextUpdate } = renderHook(() => + useGetChoices({ + http: services.http, + connector, + toastNotifications: services.notifications.toasts, + fields, + onSuccess, + }) + ); + + await waitForNextUpdate(); + + expect(services.notifications.toasts.addDanger).toHaveBeenCalledWith({ + text: 'An error occurred', + title: 'Unable to get choices', + }); + }); + + it('it displays an error when http throws an error', async () => { + const spyOnGetChoices = jest.spyOn(api, 'getChoices'); + spyOnGetChoices.mockImplementation(() => { + throw new Error('An error occurred'); + }); + + renderHook(() => + useGetChoices({ + http: services.http, + connector, + toastNotifications: services.notifications.toasts, + fields, + onSuccess, + }) + ); + + expect(services.notifications.toasts.addDanger).toHaveBeenCalledWith({ + text: 'An error occurred', + title: 'Unable to get choices', + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx new file mode 100644 index 0000000000000..a979f96d84ab2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useRef } from 'react'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { ActionConnector } from '../../../containers/types'; +import { getChoices } from './api'; +import { Choice } from './types'; +import * as i18n from './translations'; + +export interface UseGetChoicesProps { + http: HttpSetup; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + connector?: ActionConnector; + fields: string[]; + onSuccess?: (choices: Choice[]) => void; +} + +export interface UseGetChoices { + choices: Choice[]; + isLoading: boolean; +} + +export const useGetChoices = ({ + http, + connector, + toastNotifications, + fields, + onSuccess, +}: UseGetChoicesProps): UseGetChoices => { + const [isLoading, setIsLoading] = useState(false); + const [choices, setChoices] = useState([]); + const didCancel = useRef(false); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + const fetchData = async () => { + if (!connector) { + setIsLoading(false); + return; + } + + try { + abortCtrl.current = new AbortController(); + setIsLoading(true); + + const res = await getChoices({ + http, + signal: abortCtrl.current.signal, + connectorId: connector.id, + fields, + }); + + if (!didCancel.current) { + setIsLoading(false); + setChoices(res.data ?? []); + if (res.status && res.status === 'error') { + toastNotifications.addDanger({ + title: i18n.CHOICES_API_ERROR, + text: `${res.serviceMessage ?? res.message}`, + }); + } else if (onSuccess) { + onSuccess(res.data ?? []); + } + } + } catch (error) { + if (!didCancel.current) { + setIsLoading(false); + if (error.name !== 'AbortError') { + toastNotifications.addDanger({ + title: i18n.CHOICES_API_ERROR, + text: error.message, + }); + } + } + } + }; + + didCancel.current = false; + abortCtrl.current.abort(); + fetchData(); + + return () => { + didCancel.current = true; + abortCtrl.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [http, connector, toastNotifications, fields]); + + return { + choices, + isLoading, + }; +}; diff --git a/x-pack/plugins/cases/public/components/connectors/types.ts b/x-pack/plugins/cases/public/components/connectors/types.ts new file mode 100644 index 0000000000000..5bae2beab229e --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/types.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { + ActionType as ThirdPartySupportedActions, + CaseField, + ActionConnector, + ConnectorTypeFields, +} from '../../../common/api'; + +export { ThirdPartyField as AllThirdPartyFields } from '../../../common/api'; +export type CaseActionConnector = ActionConnector; + +export interface ThirdPartyField { + label: string; + validSourceFields: CaseField[]; + defaultSourceField: CaseField; + defaultActionType: ThirdPartySupportedActions; +} + +export interface ConnectorConfiguration { + name: string; + logo: string; +} + +export interface CaseConnector { + id: string; + fieldsComponent: React.LazyExoticComponent< + React.ComponentType> + > | null; +} + +export interface CaseConnectorsRegistry { + has: (id: string) => boolean; + register: ( + connector: CaseConnector + ) => void; + get: (id: string) => CaseConnector; + list: () => CaseConnector[]; +} + +export interface ConnectorFieldsProps { + isEdit?: boolean; + connector: CaseActionConnector; + fields: TFields; + onChange: (fields: TFields) => void; +} diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx new file mode 100644 index 0000000000000..9c5a4a0784af1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -0,0 +1,187 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { act, waitFor } from '@testing-library/react'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +import { useForm, Form, FormHook } from '../../../shared_imports'; +import { connectorsMock } from '../../containers/mock'; +import { Connector } from './connector'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; +import { useGetSeverity } from '../connectors/resilient/use_get_severity'; +import { useGetChoices } from '../connectors/servicenow/use_get_choices'; +import { incidentTypes, severity, choices } from '../connectors/mock'; +import { schema, FormProps } from './schema'; + +jest.mock('../../../common/lib/kibana', () => { + return { + useKibana: () => ({ + services: { + notifications: {}, + http: {}, + }, + }), + }; +}); +jest.mock('../../containers/configure/use_connectors'); +jest.mock('../connectors/resilient/use_get_incident_types'); +jest.mock('../connectors/resilient/use_get_severity'); +jest.mock('../connectors/servicenow/use_get_choices'); + +const useConnectorsMock = useConnectors as jest.Mock; +const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; +const useGetSeverityMock = useGetSeverity as jest.Mock; +const useGetChoicesMock = useGetChoices as jest.Mock; + +const useGetIncidentTypesResponse = { + isLoading: false, + incidentTypes, +}; + +const useGetSeverityResponse = { + isLoading: false, + severity, +}; + +const useGetChoicesResponse = { + isLoading: false, + choices, +}; + +describe('Connector', () => { + let globalForm: FormHook; + + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm({ + defaultValue: { connectorId: connectorsMock[0].id, fields: null }, + schema: { + connectorId: schema.connectorId, + fields: schema.fields, + }, + }); + + globalForm = form; + + return
{children}
; + }; + + beforeEach(() => { + jest.resetAllMocks(); + useConnectorsMock.mockReturnValue({ loading: false, connectors: connectorsMock }); + useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); + useGetSeverityMock.mockReturnValue(useGetSeverityResponse); + useGetChoicesMock.mockReturnValue(useGetChoicesResponse); + }); + + it('it renders', async () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="connector-fields"]`).exists()).toBeTruthy(); + + await waitFor(() => { + expect(wrapper.find(`button[data-test-subj="dropdown-connectors"]`).first().text()).toBe( + 'My Connector' + ); + }); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-sn-itsm"]`).exists()).toBeTruthy(); + }); + }); + + it('it is loading when fetching connectors', async () => { + useConnectorsMock.mockReturnValue({ loading: true, connectors: connectorsMock }); + const wrapper = mount( + + + + ); + + expect( + wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') + ).toEqual(true); + }); + + it('it is disabled when fetching connectors', async () => { + useConnectorsMock.mockReturnValue({ loading: true, connectors: connectorsMock }); + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled')).toEqual( + true + ); + }); + + it('it is disabled and loading when passing loading as true', async () => { + const wrapper = mount( + + + + ); + + expect( + wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') + ).toEqual(true); + expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled')).toEqual( + true + ); + }); + + it(`it should change connector`, async () => { + const wrapper = mount( + + + + ); + + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-resilient-2"]`).simulate('click'); + wrapper.update(); + }); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeTruthy(); + }); + + act(() => { + ((wrapper.find(EuiComboBox).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange([{ value: '19', label: 'Denial of Service' }]); + }); + + act(() => { + wrapper + .find('select[data-test-subj="severitySelect"]') + .first() + .simulate('change', { + target: { value: '4' }, + }); + }); + + await waitFor(() => { + expect(globalForm.getFormData()).toEqual({ + connectorId: 'resilient-2', + fields: { incidentTypes: ['19'], severityCode: '4' }, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/connector.tsx b/x-pack/plugins/cases/public/components/create/connector.tsx new file mode 100644 index 0000000000000..8a5c6cf422d8e --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/connector.tsx @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { ConnectorTypes } from '../../../common/api'; +import { UseField, useFormData, FieldHook, useFormContext } from '../../common/shared_imports'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { ConnectorSelector } from '../connector_selector/form'; +import { ConnectorFieldsForm } from '../connectors/fields_form'; +import { ActionConnector } from '../../containers/types'; +import { getConnectorById } from '../configure_cases/utils'; +import { FormProps } from './schema'; + +interface Props { + isLoading: boolean; + hideConnectorServiceNowSir?: boolean; +} + +interface ConnectorsFieldProps { + connectors: ActionConnector[]; + field: FieldHook; + isEdit: boolean; + hideConnectorServiceNowSir?: boolean; +} + +const ConnectorFields = ({ + connectors, + isEdit, + field, + hideConnectorServiceNowSir = false, +}: ConnectorsFieldProps) => { + const [{ connectorId }] = useFormData({ watch: ['connectorId'] }); + const { setValue } = field; + let connector = getConnectorById(connectorId, connectors) ?? null; + if ( + connector && + hideConnectorServiceNowSir && + connector.actionTypeId === ConnectorTypes.serviceNowSIR + ) { + connector = null; + } + return ( + + ); +}; + +const ConnectorComponent: React.FC = ({ hideConnectorServiceNowSir = false, isLoading }) => { + const { getFields } = useFormContext(); + const { loading: isLoadingConnectors, connectors } = useConnectors(); + const handleConnectorChange = useCallback( + (newConnector) => { + const { fields } = getFields(); + fields.setValue(null); + }, + [getFields] + ); + + return ( + + + + + + + + + ); +}; + +ConnectorComponent.displayName = 'ConnectorComponent'; + +export const Connector = memo(ConnectorComponent); diff --git a/x-pack/plugins/cases/public/components/create/description.test.tsx b/x-pack/plugins/cases/public/components/create/description.test.tsx new file mode 100644 index 0000000000000..7d7b5278bf8a7 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/description.test.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { act } from '@testing-library/react'; + +import { useForm, Form, FormHook } from '../../../shared_imports'; +import { Description } from './description'; +import { schema, FormProps } from './schema'; + +describe('Description', () => { + let globalForm: FormHook; + + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm({ + defaultValue: { description: 'My description' }, + schema: { + description: schema.description, + }, + }); + + globalForm = form; + + return
{children}
; + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('it renders', async () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj="caseDescription"]`).exists()).toBeTruthy(); + }); + + it('it changes the description', async () => { + const wrapper = mount( + + + + ); + + await act(async () => { + wrapper + .find(`[data-test-subj="caseDescription"] textarea`) + .first() + .simulate('change', { target: { value: 'My new description' } }); + }); + + expect(globalForm.getFormData()).toEqual({ description: 'My new description' }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/description.tsx b/x-pack/plugins/cases/public/components/create/description.tsx new file mode 100644 index 0000000000000..b1032ab0c7528 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/description.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; +import { UseField } from '../../common/shared_imports'; + +interface Props { + isLoading: boolean; +} + +export const fieldName = 'description'; + +const DescriptionComponent: React.FC = ({ isLoading }) => ( + +); + +DescriptionComponent.displayName = 'DescriptionComponent'; + +export const Description = memo(DescriptionComponent); diff --git a/x-pack/plugins/cases/public/components/create/flyout.test.tsx b/x-pack/plugins/cases/public/components/create/flyout.test.tsx new file mode 100644 index 0000000000000..fa322cd7019c8 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/flyout.test.tsx @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactNode } from 'react'; +import { mount } from 'enzyme'; + +import '../../../common/mock/match_media'; +import { CreateCaseFlyout } from './flyout'; +import { TestProviders } from '../../common/mock'; + +jest.mock('../create/form_context', () => { + return { + FormContext: ({ + children, + onSuccess, + }: { + children: ReactNode; + onSuccess: ({ id }: { id: string }) => Promise; + }) => { + return ( + <> + + {children} + + ); + }, + }; +}); + +jest.mock('../create/form', () => { + return { + CreateCaseForm: () => { + return <>{'form'}; + }, + }; +}); + +jest.mock('../create/submit_button', () => { + return { + SubmitCaseButton: () => { + return <>{'Submit'}; + }, + }; +}); + +const onCloseFlyout = jest.fn(); +const onSuccess = jest.fn(); +const defaultProps = { + onCloseFlyout, + onSuccess, +}; + +describe('CreateCaseFlyout', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('renders', () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj='create-case-flyout']`).exists()).toBeTruthy(); + }); + + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + + + + ); + + wrapper.find('.euiFlyout__closeButton').first().simulate('click'); + expect(onCloseFlyout).toBeCalled(); + }); + + it('pass the correct props to FormContext component', () => { + const wrapper = mount( + + + + ); + + const props = wrapper.find('FormContext').props(); + expect(props).toEqual( + expect.objectContaining({ + onSuccess, + }) + ); + }); + + it('onSuccess called when creating a case', () => { + const wrapper = mount( + + + + ); + + wrapper.find(`[data-test-subj='form-context-on-success']`).first().simulate('click'); + expect(onSuccess).toHaveBeenCalledWith({ id: 'case-id' }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/flyout.tsx b/x-pack/plugins/cases/public/components/create/flyout.tsx new file mode 100644 index 0000000000000..8ed09865e9eab --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/flyout.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import styled from 'styled-components'; +import { EuiFlyout, EuiFlyoutHeader, EuiTitle, EuiFlyoutBody } from '@elastic/eui'; + +import { FormContext } from '../create/form_context'; +import { CreateCaseForm } from '../create/form'; +import { SubmitCaseButton } from '../create/submit_button'; +import { Case } from '../../containers/types'; +import * as i18n from '../../common/translations'; + +export interface CreateCaseModalProps { + onCloseFlyout: () => void; + onSuccess: (theCase: Case) => Promise; + afterCaseCreated?: (theCase: Case) => Promise; +} + +const Container = styled.div` + ${({ theme }) => ` + margin-top: ${theme.eui.euiSize}; + text-align: right; + `} +`; + +const StyledFlyout = styled(EuiFlyout)` + ${({ theme }) => ` + z-index: ${theme.eui.euiZModal}; + `} +`; + +// Adding bottom padding because timeline's +// bottom bar gonna hide the submit button. +const FormWrapper = styled.div` + padding-bottom: 50px; +`; + +const CreateCaseFlyoutComponent: React.FC = ({ + onSuccess, + afterCaseCreated, + onCloseFlyout, +}) => { + return ( + + + +

{i18n.CREATE_TITLE}

+
+
+ + + + + + + + + + +
+ ); +}; + +export const CreateCaseFlyout = memo(CreateCaseFlyoutComponent); + +CreateCaseFlyout.displayName = 'CreateCaseFlyout'; diff --git a/x-pack/plugins/cases/public/components/create/form.test.tsx b/x-pack/plugins/cases/public/components/create/form.test.tsx new file mode 100644 index 0000000000000..029965444929b --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/form.test.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { act, waitFor } from '@testing-library/react'; + +import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useGetTags } from '../../containers/use_get_tags'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { connectorsMock } from '../../containers/mock'; +import { schema, FormProps } from './schema'; +import { CreateCaseForm } from './form'; + +jest.mock('../../containers/use_get_tags'); +jest.mock('../../containers/configure/use_connectors'); +const useGetTagsMock = useGetTags as jest.Mock; +const useConnectorsMock = useConnectors as jest.Mock; + +const initialCaseValue: FormProps = { + description: '', + tags: [], + title: '', + connectorId: 'none', + fields: null, + syncAlerts: true, +}; + +describe('CreateCaseForm', () => { + let globalForm: FormHook; + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm({ + defaultValue: initialCaseValue, + options: { stripEmptyFields: false }, + schema, + }); + + globalForm = form; + + return
{children}
; + }; + + beforeEach(() => { + jest.resetAllMocks(); + useGetTagsMock.mockReturnValue({ tags: ['test'] }); + useConnectorsMock.mockReturnValue({ loading: false, connectors: connectorsMock }); + }); + + it('it renders with steps', async () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj="case-creation-form-steps"]`).exists()).toBeTruthy(); + }); + + it('it renders without steps', async () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj="case-creation-form-steps"]`).exists()).toBeFalsy(); + }); + + it('it renders all form fields', async () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj="caseTitle"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseTags"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseDescription"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseSyncAlerts"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeTruthy(); + }); + + it('should render spinner when loading', async () => { + const wrapper = mount( + + + + ); + + await act(async () => { + globalForm.setFieldValue('title', 'title'); + globalForm.setFieldValue('description', 'description'); + globalForm.submit(); + // For some weird reason this is needed to pass the test. + // It does not do anything useful + await wrapper.find(`[data-test-subj="caseTitle"]`); + await wrapper.update(); + await waitFor(() => { + expect( + wrapper.find(`[data-test-subj="create-case-loading-spinner"]`).exists() + ).toBeTruthy(); + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/form.tsx b/x-pack/plugins/cases/public/components/create/form.tsx new file mode 100644 index 0000000000000..a81ecf32576a9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/form.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiLoadingSpinner, EuiSteps } from '@elastic/eui'; +import styled, { css } from 'styled-components'; + +import { useFormContext } from '../../common/shared_imports'; + +import { Title } from './title'; +import { Description } from './description'; +import { Tags } from './tags'; +import { Connector } from './connector'; +import * as i18n from './translations'; +import { SyncAlertsToggle } from './sync_alerts_toggle'; + +interface ContainerProps { + big?: boolean; +} + +const Container = styled.div.attrs((props) => props)` + ${({ big, theme }) => css` + margin-top: ${big ? theme.eui?.euiSizeXL ?? '32px' : theme.eui?.euiSize ?? '16px'}; + `} +`; + +const MySpinner = styled(EuiLoadingSpinner)` + position: absolute; + top: 50%; + left: 50%; + z-index: 99; +`; + +interface Props { + hideConnectorServiceNowSir?: boolean; + withSteps?: boolean; +} + +export const CreateCaseForm: React.FC = React.memo( + ({ hideConnectorServiceNowSir = false, withSteps = true }) => { + const { isSubmitting } = useFormContext(); + + const firstStep = useMemo( + () => ({ + title: i18n.STEP_ONE_TITLE, + children: ( + <> + + <Container> + <Tags isLoading={isSubmitting} /> + </Container> + <Container big> + <Description isLoading={isSubmitting} /> + </Container> + </> + ), + }), + [isSubmitting] + ); + + const secondStep = useMemo( + () => ({ + title: i18n.STEP_TWO_TITLE, + children: ( + <Container> + <SyncAlertsToggle isLoading={isSubmitting} /> + </Container> + ), + }), + [isSubmitting] + ); + + const thirdStep = useMemo( + () => ({ + title: i18n.STEP_THREE_TITLE, + children: ( + <Container> + <Connector + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + isLoading={isSubmitting} + /> + </Container> + ), + }), + [hideConnectorServiceNowSir, isSubmitting] + ); + + const allSteps = useMemo(() => [firstStep, secondStep, thirdStep], [ + firstStep, + secondStep, + thirdStep, + ]); + + return ( + <> + {isSubmitting && <MySpinner data-test-subj="create-case-loading-spinner" size="xl" />} + {withSteps ? ( + <EuiSteps + headingElement="h2" + steps={allSteps} + data-test-subj={'case-creation-form-steps'} + /> + ) : ( + <> + {firstStep.children} + {secondStep.children} + {thirdStep.children} + </> + )} + </> + ); + } +); + +CreateCaseForm.displayName = 'CreateCaseForm'; diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx new file mode 100644 index 0000000000000..9ca735dae0978 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -0,0 +1,682 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { act, waitFor } from '@testing-library/react'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +import { ConnectorTypes } from '../../../common/api'; +import { TestProviders } from '../../../common/mock'; +import { usePostCase } from '../../containers/use_post_case'; +import { useGetTags } from '../../containers/use_get_tags'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; +import { connectorsMock } from '../../containers/configure/mock'; +import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; +import { useGetSeverity } from '../connectors/resilient/use_get_severity'; +import { useGetIssueTypes } from '../connectors/jira/use_get_issue_types'; +import { useGetChoices } from '../connectors/servicenow/use_get_choices'; +import { useGetFieldsByIssueType } from '../connectors/jira/use_get_fields_by_issue_type'; +import { useCaseConfigureResponse } from '../configure_cases/__mock__'; +import { + sampleConnectorData, + sampleData, + sampleTags, + useGetIncidentTypesResponse, + useGetSeverityResponse, + useGetIssueTypesResponse, + useGetFieldsByIssueTypeResponse, + useGetChoicesResponse, +} from './mock'; +import { FormContext } from './form_context'; +import { CreateCaseForm } from './form'; +import { SubmitCaseButton } from './submit_button'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; + +const sampleId = 'case-id'; + +jest.mock('../../containers/use_post_case'); +jest.mock('../../containers/use_post_push_to_service'); +jest.mock('../../containers/use_get_tags'); +jest.mock('../../containers/configure/use_connectors'); +jest.mock('../../containers/configure/use_configure'); +jest.mock('../connectors/resilient/use_get_incident_types'); +jest.mock('../connectors/resilient/use_get_severity'); +jest.mock('../connectors/jira/use_get_issue_types'); +jest.mock('../connectors/jira/use_get_fields_by_issue_type'); +jest.mock('../connectors/jira/use_get_single_issue'); +jest.mock('../connectors/jira/use_get_issues'); +jest.mock('../connectors/servicenow/use_get_choices'); + +const useConnectorsMock = useConnectors as jest.Mock; +const useCaseConfigureMock = useCaseConfigure as jest.Mock; +const usePostCaseMock = usePostCase as jest.Mock; +const usePostPushToServiceMock = usePostPushToService as jest.Mock; +const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; +const useGetSeverityMock = useGetSeverity as jest.Mock; +const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; +const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; +const useGetChoicesMock = useGetChoices as jest.Mock; +const postCase = jest.fn(); +const pushCaseToExternalService = jest.fn(); + +const defaultPostCase = { + isLoading: false, + isError: false, + postCase, +}; + +const defaultPostPushToService = { + isLoading: false, + isError: false, + pushCaseToExternalService, +}; + +const fillForm = (wrapper: ReactWrapper) => { + wrapper + .find(`[data-test-subj="caseTitle"] input`) + .first() + .simulate('change', { target: { value: sampleData.title } }); + + wrapper + .find(`[data-test-subj="caseDescription"] textarea`) + .first() + .simulate('change', { target: { value: sampleData.description } }); + + act(() => { + ((wrapper.find(EuiComboBox).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange(sampleTags.map((tag) => ({ label: tag }))); + }); +}; + +describe('Create case', () => { + const fetchTags = jest.fn(); + const onFormSubmitSuccess = jest.fn(); + const afterCaseCreated = jest.fn(); + + beforeEach(() => { + jest.resetAllMocks(); + postCase.mockResolvedValue({ + id: sampleId, + ...sampleData, + }); + usePostCaseMock.mockImplementation(() => defaultPostCase); + usePostPushToServiceMock.mockImplementation(() => defaultPostPushToService); + useConnectorsMock.mockReturnValue(sampleConnectorData); + useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); + useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); + useGetSeverityMock.mockReturnValue(useGetSeverityResponse); + useGetIssueTypesMock.mockReturnValue(useGetIssueTypesResponse); + useGetFieldsByIssueTypeMock.mockReturnValue(useGetFieldsByIssueTypeResponse); + useGetChoicesMock.mockReturnValue(useGetChoicesResponse); + + (useGetTags as jest.Mock).mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); + }); + + describe('Step 1 - Case Fields', () => { + it('it renders', async () => { + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="caseTitle"]`).first().exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseDescription"]`).first().exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseTags"]`).first().exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="caseConnectors"]`).first().exists()).toBeTruthy(); + expect( + wrapper.find(`[data-test-subj="case-creation-form-steps"]`).first().exists() + ).toBeTruthy(); + }); + + it('should post case on submit click', async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + await waitFor(() => expect(postCase).toBeCalledWith(sampleData)); + }); + + it('should toggle sync settings', async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + wrapper.find('[data-test-subj="caseSyncAlerts"] button').first().simulate('click'); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + + await waitFor(() => + expect(postCase).toBeCalledWith({ ...sampleData, settings: { syncAlerts: false } }) + ); + }); + + it('it should select the default connector set in the configuration', async () => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + connector: { + id: 'servicenow-1', + name: 'SN', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + persistLoading: false, + })); + + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + await act(async () => { + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + }); + + await waitFor(() => + expect(postCase).toBeCalledWith({ + ...sampleData, + connector: { + fields: { + impact: null, + severity: null, + urgency: null, + category: null, + subcategory: null, + }, + id: 'servicenow-1', + name: 'My Connector', + type: '.servicenow', + }, + }) + ); + }); + + it('it should default to none if the default connector does not exist in connectors', async () => { + useCaseConfigureMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + connector: { + id: 'not-exist', + name: 'SN', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + persistLoading: false, + })); + + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + await waitFor(() => { + expect(postCase).toBeCalledWith(sampleData); + expect(pushCaseToExternalService).not.toHaveBeenCalled(); + }); + }); + }); + + describe('Step 2 - Connector Fields', () => { + it(`it should submit and push to Jira connector`, async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-jira-1"]`).simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeTruthy(); + }); + + wrapper + .find('select[data-test-subj="issueTypeSelect"]') + .first() + .simulate('change', { + target: { value: '10007' }, + }); + + wrapper + .find('select[data-test-subj="prioritySelect"]') + .first() + .simulate('change', { + target: { value: '2' }, + }); + + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + + await waitFor(() => { + expect(postCase).toBeCalledWith({ + ...sampleData, + connector: { + id: 'jira-1', + name: 'Jira', + type: '.jira', + fields: { issueType: '10007', parent: null, priority: '2' }, + }, + }); + expect(pushCaseToExternalService).toHaveBeenCalledWith({ + caseId: sampleId, + connector: { + id: 'jira-1', + name: 'Jira', + type: '.jira', + fields: { issueType: '10007', parent: null, priority: '2' }, + }, + }); + expect(onFormSubmitSuccess).toHaveBeenCalledWith({ + id: sampleId, + ...sampleData, + }); + }); + }); + + it(`it should submit and push to resilient connector`, async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-resilient-2"]`).simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeTruthy(); + }); + + act(() => { + ((wrapper.find(EuiComboBox).at(1).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange([{ value: '19', label: 'Denial of Service' }]); + }); + + wrapper + .find('select[data-test-subj="severitySelect"]') + .first() + .simulate('change', { + target: { value: '4' }, + }); + + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + + await waitFor(() => { + expect(postCase).toBeCalledWith({ + ...sampleData, + connector: { + id: 'resilient-2', + name: 'My Connector 2', + type: '.resilient', + fields: { incidentTypes: ['19'], severityCode: '4' }, + }, + }); + + expect(pushCaseToExternalService).toHaveBeenCalledWith({ + caseId: sampleId, + connector: { + id: 'resilient-2', + name: 'My Connector 2', + type: '.resilient', + fields: { incidentTypes: ['19'], severityCode: '4' }, + }, + }); + + expect(onFormSubmitSuccess).toHaveBeenCalledWith({ + id: sampleId, + ...sampleData, + }); + }); + }); + + it(`it should submit and push to servicenow itsm connector`, async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + expect(wrapper.find(`[data-test-subj="connector-fields-sn-itsm"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-servicenow-1"]`).simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-sn-itsm"]`).exists()).toBeTruthy(); + }); + + ['severitySelect', 'urgencySelect', 'impactSelect'].forEach((subj) => { + wrapper + .find(`select[data-test-subj="${subj}"]`) + .first() + .simulate('change', { + target: { value: '2' }, + }); + }); + + wrapper + .find('select[data-test-subj="categorySelect"]') + .first() + .simulate('change', { + target: { value: 'software' }, + }); + + wrapper + .find('select[data-test-subj="subcategorySelect"]') + .first() + .simulate('change', { + target: { value: 'os' }, + }); + + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + + await waitFor(() => { + expect(postCase).toBeCalledWith({ + ...sampleData, + connector: { + id: 'servicenow-1', + name: 'My Connector', + type: '.servicenow', + fields: { + impact: '2', + severity: '2', + urgency: '2', + category: 'software', + subcategory: 'os', + }, + }, + }); + + expect(pushCaseToExternalService).toHaveBeenCalledWith({ + caseId: sampleId, + connector: { + id: 'servicenow-1', + name: 'My Connector', + type: '.servicenow', + fields: { + impact: '2', + severity: '2', + urgency: '2', + category: 'software', + subcategory: 'os', + }, + }, + }); + + expect(onFormSubmitSuccess).toHaveBeenCalledWith({ + id: sampleId, + ...sampleData, + }); + }); + }); + + it(`it should submit and push to servicenow sir connector`, async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + expect(wrapper.find(`[data-test-subj="connector-fields-sn-sir"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-servicenow-sir"]`).simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-sn-sir"]`).exists()).toBeTruthy(); + }); + + wrapper + .find('[data-test-subj="destIpCheckbox"] input') + .first() + .simulate('change', { target: { checked: false } }); + + wrapper + .find('select[data-test-subj="prioritySelect"]') + .first() + .simulate('change', { + target: { value: '1' }, + }); + + wrapper + .find('select[data-test-subj="categorySelect"]') + .first() + .simulate('change', { + target: { value: 'Denial of Service' }, + }); + + wrapper + .find('select[data-test-subj="subcategorySelect"]') + .first() + .simulate('change', { + target: { value: '26' }, + }); + + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + + await waitFor(() => { + expect(postCase).toBeCalledWith({ + ...sampleData, + connector: { + id: 'servicenow-sir', + name: 'My Connector SIR', + type: '.servicenow-sir', + fields: { + destIp: false, + sourceIp: true, + malwareHash: true, + malwareUrl: true, + priority: '1', + category: 'Denial of Service', + subcategory: '26', + }, + }, + }); + + expect(pushCaseToExternalService).toHaveBeenCalledWith({ + caseId: sampleId, + connector: { + id: 'servicenow-sir', + name: 'My Connector SIR', + type: '.servicenow-sir', + fields: { + destIp: false, + sourceIp: true, + malwareHash: true, + malwareUrl: true, + priority: '1', + category: 'Denial of Service', + subcategory: '26', + }, + }, + }); + + expect(onFormSubmitSuccess).toHaveBeenCalledWith({ + id: sampleId, + ...sampleData, + }); + }); + }); + }); + + it(`it should call afterCaseCreated`, async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess} afterCaseCreated={afterCaseCreated}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-jira-1"]`).simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeTruthy(); + }); + + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + await waitFor(() => { + expect(afterCaseCreated).toHaveBeenCalledWith({ + id: sampleId, + ...sampleData, + }); + }); + }); + + it(`it should call callbacks in correct order`, async () => { + useConnectorsMock.mockReturnValue({ + ...sampleConnectorData, + connectors: connectorsMock, + }); + + const wrapper = mount( + <TestProviders> + <FormContext onSuccess={onFormSubmitSuccess} afterCaseCreated={afterCaseCreated}> + <CreateCaseForm /> + <SubmitCaseButton /> + </FormContext> + </TestProviders> + ); + + fillForm(wrapper); + expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-jira-1"]`).simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeTruthy(); + }); + + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + await waitFor(() => { + expect(postCase).toHaveBeenCalled(); + expect(afterCaseCreated).toHaveBeenCalled(); + expect(pushCaseToExternalService).toHaveBeenCalled(); + expect(onFormSubmitSuccess).toHaveBeenCalled(); + }); + + const postCaseOrder = postCase.mock.invocationCallOrder[0]; + const afterCaseOrder = afterCaseCreated.mock.invocationCallOrder[0]; + const pushCaseToExternalServiceOrder = pushCaseToExternalService.mock.invocationCallOrder[0]; + const onFormSubmitSuccessOrder = onFormSubmitSuccess.mock.invocationCallOrder[0]; + + expect( + postCaseOrder < afterCaseOrder && + postCaseOrder < pushCaseToExternalServiceOrder && + postCaseOrder < onFormSubmitSuccessOrder + ).toBe(true); + + expect( + afterCaseOrder < pushCaseToExternalServiceOrder && afterCaseOrder < onFormSubmitSuccessOrder + ).toBe(true); + + expect(pushCaseToExternalServiceOrder < onFormSubmitSuccessOrder).toBe(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/form_context.tsx b/x-pack/plugins/cases/public/components/create/form_context.tsx new file mode 100644 index 0000000000000..dc3a2d3a8102d --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/form_context.tsx @@ -0,0 +1,120 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo } from 'react'; +import { schema, FormProps } from './schema'; +import { Form, useForm } from '../../common/shared_imports'; +import { + getConnectorById, + getNoneConnector, + normalizeActionConnector, +} from '../configure_cases/utils'; +import { usePostCase } from '../../containers/use_post_case'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; + +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; +import { Case } from '../../containers/types'; +import { CaseType, ConnectorTypes } from '../../../common/api'; + +const initialCaseValue: FormProps = { + description: '', + tags: [], + title: '', + connectorId: 'none', + fields: null, + syncAlerts: true, +}; + +interface Props { + afterCaseCreated?: (theCase: Case) => Promise<void>; + caseType?: CaseType; + hideConnectorServiceNowSir?: boolean; + onSuccess?: (theCase: Case) => Promise<void>; +} + +export const FormContext: React.FC<Props> = ({ + afterCaseCreated, + caseType = CaseType.individual, + children, + hideConnectorServiceNowSir, + onSuccess, +}) => { + const { connectors } = useConnectors(); + const { connector: configurationConnector } = useCaseConfigure(); + const { postCase } = usePostCase(); + const { pushCaseToExternalService } = usePostPushToService(); + + const connectorId = useMemo(() => { + if ( + hideConnectorServiceNowSir && + configurationConnector.type === ConnectorTypes.serviceNowSIR + ) { + return 'none'; + } + return connectors.some((connector) => connector.id === configurationConnector.id) + ? configurationConnector.id + : 'none'; + }, [ + configurationConnector.id, + configurationConnector.type, + connectors, + hideConnectorServiceNowSir, + ]); + + const submitCase = useCallback( + async ( + { connectorId: dataConnectorId, fields, syncAlerts, ...dataWithoutConnectorId }, + isValid + ) => { + if (isValid) { + const caseConnector = getConnectorById(dataConnectorId, connectors); + + const connectorToUpdate = caseConnector + ? normalizeActionConnector(caseConnector, fields) + : getNoneConnector(); + + const updatedCase = await postCase({ + ...dataWithoutConnectorId, + type: caseType, + connector: connectorToUpdate, + settings: { syncAlerts }, + }); + + if (afterCaseCreated && updatedCase) { + await afterCaseCreated(updatedCase); + } + + if (updatedCase?.id && dataConnectorId !== 'none') { + await pushCaseToExternalService({ + caseId: updatedCase.id, + connector: connectorToUpdate, + }); + } + + if (onSuccess && updatedCase) { + await onSuccess(updatedCase); + } + } + }, + [caseType, connectors, postCase, onSuccess, pushCaseToExternalService, afterCaseCreated] + ); + + const { form } = useForm<FormProps>({ + defaultValue: initialCaseValue, + options: { stripEmptyFields: false }, + schema, + onSubmit: submitCase, + }); + const { setFieldValue } = form; + // Set the selected connector to the configuration connector + useEffect(() => setFieldValue('connectorId', connectorId), [connectorId, setFieldValue]); + + return <Form form={form}>{children}</Form>; +}; + +FormContext.displayName = 'FormContext'; diff --git a/x-pack/plugins/cases/public/components/create/index.test.tsx b/x-pack/plugins/cases/public/components/create/index.test.tsx new file mode 100644 index 0000000000000..7172d227f492e --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/index.test.tsx @@ -0,0 +1,157 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { act, waitFor } from '@testing-library/react'; +import { noop } from 'lodash/fp'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +import { TestProviders } from '../../../common/mock'; +import { useGetTags } from '../../containers/use_get_tags'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; +import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; +import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; +import { useGetSeverity } from '../connectors/resilient/use_get_severity'; +import { useGetIssueTypes } from '../connectors/jira/use_get_issue_types'; +import { useGetFieldsByIssueType } from '../connectors/jira/use_get_fields_by_issue_type'; +import { useCaseConfigureResponse } from '../configure_cases/__mock__'; +import { useInsertTimeline } from '../use_insert_timeline'; +import { + sampleConnectorData, + sampleData, + sampleTags, + useGetIncidentTypesResponse, + useGetSeverityResponse, + useGetIssueTypesResponse, + useGetFieldsByIssueTypeResponse, +} from './mock'; +import { Create } from '.'; + +jest.mock('../../containers/api'); +jest.mock('../../containers/use_get_tags'); +jest.mock('../../containers/configure/use_connectors'); +jest.mock('../../containers/configure/use_configure'); +jest.mock('../connectors/resilient/use_get_incident_types'); +jest.mock('../connectors/resilient/use_get_severity'); +jest.mock('../connectors/jira/use_get_issue_types'); +jest.mock('../connectors/jira/use_get_fields_by_issue_type'); +jest.mock('../connectors/jira/use_get_single_issue'); +jest.mock('../connectors/jira/use_get_issues'); +jest.mock('../use_insert_timeline'); + +const useConnectorsMock = useConnectors as jest.Mock; +const useCaseConfigureMock = useCaseConfigure as jest.Mock; +const useGetTagsMock = useGetTags as jest.Mock; +const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; +const useGetSeverityMock = useGetSeverity as jest.Mock; +const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; +const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; +const useInsertTimelineMock = useInsertTimeline as jest.Mock; +const fetchTags = jest.fn(); + +const fillForm = (wrapper: ReactWrapper) => { + wrapper + .find(`[data-test-subj="caseTitle"] input`) + .first() + .simulate('change', { target: { value: sampleData.title } }); + + wrapper + .find(`[data-test-subj="caseDescription"] textarea`) + .first() + .simulate('change', { target: { value: sampleData.description } }); + + act(() => { + ((wrapper.find(EuiComboBox).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange(sampleTags.map((tag) => ({ label: tag }))); + }); +}; + +describe('Create case', () => { + beforeEach(() => { + jest.resetAllMocks(); + jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); + useConnectorsMock.mockReturnValue(sampleConnectorData); + useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); + useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); + useGetSeverityMock.mockReturnValue(useGetSeverityResponse); + useGetIssueTypesMock.mockReturnValue(useGetIssueTypesResponse); + useGetFieldsByIssueTypeMock.mockReturnValue(useGetFieldsByIssueTypeResponse); + useGetTagsMock.mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); + }); + + it('it renders', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <Create /> + </Router> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="create-case-submit"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="create-case-cancel"]`).exists()).toBeTruthy(); + }); + + it('should redirect to all cases on cancel click', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <Create /> + </Router> + </TestProviders> + ); + + wrapper.find(`[data-test-subj="create-case-cancel"]`).first().simulate('click'); + await waitFor(() => expect(mockHistory.push).toHaveBeenCalledWith('/')); + }); + + it('should redirect to new case when posting the case', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <Create /> + </Router> + </TestProviders> + ); + + fillForm(wrapper); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + + await waitFor(() => expect(mockHistory.push).toHaveBeenNthCalledWith(1, '/basic-case-id')); + }); + + it('it should insert a timeline', async () => { + let attachTimeline = noop; + useInsertTimelineMock.mockImplementation((value, onTimelineAttached) => { + attachTimeline = onTimelineAttached; + }); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <Create /> + </Router> + </TestProviders> + ); + + act(() => { + attachTimeline('[title](url)'); + }); + + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="caseDescription"] textarea`).text()).toBe( + '[title](url)' + ); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx new file mode 100644 index 0000000000000..df360b708aa08 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import styled from 'styled-components'; + +import { Field, getUseField } from '../../common/shared_imports'; +import * as i18n from './translations'; +import { CreateCaseForm } from './form'; +import { FormContext } from './form_context'; +import { SubmitCaseButton } from './submit_button'; +import { Case } from '../../containers/types'; + +export const CommonUseField = getUseField({ component: Field }); + +const Container = styled.div` + ${({ theme }) => ` + margin-top: ${theme.eui.euiSize}; + `} +`; + +export interface CreateCaseProps { + onCancel: () => void; + onSuccess: (theCase: Case) => Promise<void>; +} + +export const CreateCase = ({ onCancel, onSuccess }: CreateCaseProps) => ( + <FormContext onSuccess={onSuccess}> + <CreateCaseForm /> + <Container> + <EuiFlexGroup alignItems="center" justifyContent="flexEnd" gutterSize="xs" responsive={false}> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="create-case-cancel" + size="s" + onClick={onCancel} + iconType="cross" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <SubmitCaseButton /> + </EuiFlexItem> + </EuiFlexGroup> + </Container> + </FormContext> +); + +CreateCase.displayName = 'CreateCase'; diff --git a/x-pack/plugins/cases/public/components/create/mock.ts b/x-pack/plugins/cases/public/components/create/mock.ts new file mode 100644 index 0000000000000..e3f57fe763635 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/mock.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CasePostRequest, CaseType } from '../../../common/api'; +import { ConnectorTypes } from '../../../common/api/connectors'; +import { choices } from '../connectors/mock'; + +export const sampleTags = ['coke', 'pepsi']; +export const sampleData: CasePostRequest = { + description: 'what a great description', + tags: sampleTags, + title: 'what a cool title', + type: CaseType.individual, + connector: { + fields: null, + id: 'none', + name: 'none', + type: ConnectorTypes.none, + }, + settings: { + syncAlerts: true, + }, +}; + +export const sampleConnectorData = { loading: false, connectors: [] }; + +export const useGetIncidentTypesResponse = { + isLoading: false, + incidentTypes: [ + { + id: 19, + name: 'Malware', + }, + { + id: 21, + name: 'Denial of Service', + }, + ], +}; + +export const useGetSeverityResponse = { + isLoading: false, + severity: [ + { + id: 4, + name: 'Low', + }, + { + id: 5, + name: 'Medium', + }, + { + id: 6, + name: 'High', + }, + ], +}; + +export const useGetIssueTypesResponse = { + isLoading: false, + issueTypes: [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, + ], +}; + +export const useGetFieldsByIssueTypeResponse = { + isLoading: false, + fields: { + summary: { allowedValues: [], defaultValue: {} }, + labels: { allowedValues: [], defaultValue: {} }, + description: { allowedValues: [], defaultValue: {} }, + priority: { + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + { + name: 'Low', + id: '2', + }, + ], + defaultValue: { name: 'Medium', id: '3' }, + }, + }, +}; + +export const useGetChoicesResponse = { + isLoading: false, + choices, +}; diff --git a/x-pack/plugins/cases/public/components/create/optional_field_label/index.test.tsx b/x-pack/plugins/cases/public/components/create/optional_field_label/index.test.tsx new file mode 100644 index 0000000000000..4b6d5f90513ef --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/optional_field_label/index.test.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount } from 'enzyme'; + +import { OptionalFieldLabel } from '.'; + +describe('OptionalFieldLabel', () => { + it('it renders correctly', async () => { + const wrapper = mount(OptionalFieldLabel); + expect(wrapper.find('[data-test-subj="form-optional-field-label"]').first().text()).toBe( + 'Optional' + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/optional_field_label/index.tsx b/x-pack/plugins/cases/public/components/create/optional_field_label/index.tsx new file mode 100644 index 0000000000000..ea994b2219961 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/optional_field_label/index.tsx @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiText } from '@elastic/eui'; +import React from 'react'; + +import * as i18n from '../../../common/translations'; + +export const OptionalFieldLabel = ( + <EuiText color="subdued" size="xs" data-test-subj="form-optional-field-label"> + {i18n.OPTIONAL} + </EuiText> +); diff --git a/x-pack/plugins/cases/public/components/create/schema.tsx b/x-pack/plugins/cases/public/components/create/schema.tsx new file mode 100644 index 0000000000000..d9b1df4c7475d --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/schema.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CasePostRequest, ConnectorTypeFields } from '../../../common/api'; +import { FIELD_TYPES, fieldValidators, FormSchema } from '../../common/shared_imports'; +import * as i18n from './translations'; + +import { OptionalFieldLabel } from './optional_field_label'; +const { emptyField } = fieldValidators; + +export const schemaTags = { + type: FIELD_TYPES.COMBO_BOX, + label: i18n.TAGS, + helpText: i18n.TAGS_HELP, + labelAppend: OptionalFieldLabel, +}; + +export type FormProps = Omit<CasePostRequest, 'connector' | 'settings'> & { + connectorId: string; + fields: ConnectorTypeFields['fields']; + syncAlerts: boolean; +}; + +export const schema: FormSchema<FormProps> = { + title: { + type: FIELD_TYPES.TEXT, + label: i18n.NAME, + validations: [ + { + validator: emptyField(i18n.TITLE_REQUIRED), + }, + ], + }, + description: { + label: i18n.DESCRIPTION, + validations: [ + { + validator: emptyField(i18n.DESCRIPTION_REQUIRED), + }, + ], + }, + tags: schemaTags, + connectorId: { + type: FIELD_TYPES.SUPER_SELECT, + label: i18n.CONNECTORS, + defaultValue: 'none', + }, + fields: {}, + syncAlerts: { + helpText: i18n.SYNC_ALERTS_HELP, + type: FIELD_TYPES.TOGGLE, + defaultValue: true, + }, +}; diff --git a/x-pack/plugins/cases/public/components/create/submit_button.test.tsx b/x-pack/plugins/cases/public/components/create/submit_button.test.tsx new file mode 100644 index 0000000000000..ab98e75b6058e --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/submit_button.test.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { act, waitFor } from '@testing-library/react'; + +import { useForm, Form } from '../../../shared_imports'; +import { SubmitCaseButton } from './submit_button'; +import { schema, FormProps } from './schema'; + +describe('SubmitCaseButton', () => { + const onSubmit = jest.fn(); + + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm<FormProps>({ + defaultValue: { title: 'My title' }, + schema: { + title: schema.title, + }, + onSubmit, + }); + + return <Form form={form}>{children}</Form>; + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('it renders', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SubmitCaseButton /> + </MockHookWrapperComponent> + ); + + expect(wrapper.find(`[data-test-subj="create-case-submit"]`).exists()).toBeTruthy(); + }); + + it('it submits', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SubmitCaseButton /> + </MockHookWrapperComponent> + ); + + await act(async () => { + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + }); + + await waitFor(() => expect(onSubmit).toBeCalled()); + }); + + it('it disables when submitting', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SubmitCaseButton /> + </MockHookWrapperComponent> + ); + + await waitFor(() => { + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + expect( + wrapper.find(`[data-test-subj="create-case-submit"]`).first().prop('isDisabled') + ).toBeTruthy(); + }); + }); + + it('it is loading when submitting', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SubmitCaseButton /> + </MockHookWrapperComponent> + ); + + await waitFor(() => { + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + expect( + wrapper.find(`[data-test-subj="create-case-submit"]`).first().prop('isLoading') + ).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/submit_button.tsx b/x-pack/plugins/cases/public/components/create/submit_button.tsx new file mode 100644 index 0000000000000..b5e58517e6ec1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/submit_button.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiButton } from '@elastic/eui'; + +import { useFormContext } from '../../common/shared_imports'; +import * as i18n from './translations'; + +const SubmitCaseButtonComponent: React.FC = () => { + const { submit, isSubmitting } = useFormContext(); + + return ( + <EuiButton + data-test-subj="create-case-submit" + fill + iconType="plusInCircle" + isDisabled={isSubmitting} + isLoading={isSubmitting} + onClick={submit} + > + {i18n.CREATE_CASE} + </EuiButton> + ); +}; + +export const SubmitCaseButton = memo(SubmitCaseButtonComponent); diff --git a/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx b/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx new file mode 100644 index 0000000000000..eadec1525ed90 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor } from '@testing-library/react'; + +import { useForm, Form, FormHook } from '../../../shared_imports'; +import { SyncAlertsToggle } from './sync_alerts_toggle'; +import { schema, FormProps } from './schema'; + +describe('SyncAlertsToggle', () => { + let globalForm: FormHook; + + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm<FormProps>({ + defaultValue: { syncAlerts: true }, + schema: { + syncAlerts: schema.syncAlerts, + }, + }); + + globalForm = form; + + return <Form form={form}>{children}</Form>; + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('it renders', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SyncAlertsToggle isLoading={false} /> + </MockHookWrapperComponent> + ); + + expect(wrapper.find(`[data-test-subj="caseSyncAlerts"]`).exists()).toBeTruthy(); + }); + + it('it toggles the switch', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SyncAlertsToggle isLoading={false} /> + </MockHookWrapperComponent> + ); + + wrapper.find('[data-test-subj="caseSyncAlerts"] button').first().simulate('click'); + + await waitFor(() => { + expect(globalForm.getFormData()).toEqual({ syncAlerts: false }); + }); + }); + + it('it shows the correct labels', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <SyncAlertsToggle isLoading={false} /> + </MockHookWrapperComponent> + ); + + expect(wrapper.find(`[data-test-subj="caseSyncAlerts"] .euiSwitch__label`).first().text()).toBe( + 'On' + ); + + wrapper.find('[data-test-subj="caseSyncAlerts"] button').first().simulate('click'); + + await waitFor(() => { + expect( + wrapper.find(`[data-test-subj="caseSyncAlerts"] .euiSwitch__label`).first().text() + ).toBe('Off'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.tsx b/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.tsx new file mode 100644 index 0000000000000..bed8e6d18f5e3 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { Field, getUseField, useFormData } from '../../common/shared_imports'; +import * as i18n from './translations'; + +const CommonUseField = getUseField({ component: Field }); + +interface Props { + isLoading: boolean; +} + +const SyncAlertsToggleComponent: React.FC<Props> = ({ isLoading }) => { + const [{ syncAlerts }] = useFormData({ watch: ['syncAlerts'] }); + return ( + <CommonUseField + path="syncAlerts" + componentProps={{ + idAria: 'caseSyncAlerts', + 'data-test-subj': 'caseSyncAlerts', + label: i18n.SYNC_ALERTS_LABEL, + euiFieldProps: { + disabled: isLoading, + label: syncAlerts ? i18n.SYNC_ALERTS_SWITCH_LABEL_ON : i18n.SYNC_ALERTS_SWITCH_LABEL_OFF, + }, + }} + /> + ); +}; + +SyncAlertsToggleComponent.displayName = 'SyncAlertsToggleComponent'; + +export const SyncAlertsToggle = memo(SyncAlertsToggleComponent); diff --git a/x-pack/plugins/cases/public/components/create/tags.test.tsx b/x-pack/plugins/cases/public/components/create/tags.test.tsx new file mode 100644 index 0000000000000..c723d456afe73 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/tags.test.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; +import { waitFor } from '@testing-library/react'; + +import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useGetTags } from '../../containers/use_get_tags'; +import { Tags } from './tags'; +import { schema, FormProps } from './schema'; + +jest.mock('../../containers/use_get_tags'); +const useGetTagsMock = useGetTags as jest.Mock; + +describe('Tags', () => { + let globalForm: FormHook; + + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm<FormProps>({ + defaultValue: { tags: [] }, + schema: { + tags: schema.tags, + }, + }); + + globalForm = form; + + return <Form form={form}>{children}</Form>; + }; + + beforeEach(() => { + jest.resetAllMocks(); + useGetTagsMock.mockReturnValue({ tags: ['test'] }); + }); + + it('it renders', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <Tags isLoading={false} /> + </MockHookWrapperComponent> + ); + + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="caseTags"]`).exists()).toBeTruthy(); + }); + }); + + it('it disables the input when loading', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <Tags isLoading={true} /> + </MockHookWrapperComponent> + ); + + expect(wrapper.find(EuiComboBox).prop('disabled')).toBeTruthy(); + }); + + it('it changes the tags', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <Tags isLoading={false} /> + </MockHookWrapperComponent> + ); + + await waitFor(() => { + ((wrapper.find(EuiComboBox).props() as unknown) as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + }).onChange(['test', 'case'].map((tag) => ({ label: tag }))); + }); + + expect(globalForm.getFormData()).toEqual({ tags: ['test', 'case'] }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/tags.tsx b/x-pack/plugins/cases/public/components/create/tags.tsx new file mode 100644 index 0000000000000..ac0b67529e15a --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/tags.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo } from 'react'; + +import { Field, getUseField } from '../../common/shared_imports'; +import { useGetTags } from '../../containers/use_get_tags'; + +const CommonUseField = getUseField({ component: Field }); + +interface Props { + isLoading: boolean; +} + +const TagsComponent: React.FC<Props> = ({ isLoading }) => { + const { tags: tagOptions, isLoading: isLoadingTags } = useGetTags(); + const options = useMemo( + () => + tagOptions.map((label) => ({ + label, + })), + [tagOptions] + ); + + return ( + <CommonUseField + path="tags" + componentProps={{ + idAria: 'caseTags', + 'data-test-subj': 'caseTags', + euiFieldProps: { + fullWidth: true, + placeholder: '', + disabled: isLoading || isLoadingTags, + options, + noSuggestions: false, + }, + }} + /> + ); +}; + +TagsComponent.displayName = 'TagsComponent'; + +export const Tags = memo(TagsComponent); diff --git a/x-pack/plugins/cases/public/components/create/title.test.tsx b/x-pack/plugins/cases/public/components/create/title.test.tsx new file mode 100644 index 0000000000000..2ac14ccd1b254 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/title.test.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { act } from '@testing-library/react'; + +import { useForm, Form, FormHook } from '../../../shared_imports'; +import { Title } from './title'; +import { schema, FormProps } from './schema'; + +describe('Title', () => { + let globalForm: FormHook; + + const MockHookWrapperComponent: React.FC = ({ children }) => { + const { form } = useForm<FormProps>({ + defaultValue: { title: 'My title' }, + schema: { + title: schema.title, + }, + }); + + globalForm = form; + + return <Form form={form}>{children}</Form>; + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('it renders', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <Title isLoading={false} /> + </MockHookWrapperComponent> + ); + + expect(wrapper.find(`[data-test-subj="caseTitle"]`).exists()).toBeTruthy(); + }); + + it('it disables the input when loading', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <Title isLoading={true} /> + </MockHookWrapperComponent> + ); + + expect(wrapper.find(`[data-test-subj="caseTitle"] input`).prop('disabled')).toBeTruthy(); + }); + + it('it changes the title', async () => { + const wrapper = mount( + <MockHookWrapperComponent> + <Title isLoading={false} /> + </MockHookWrapperComponent> + ); + + await act(async () => { + wrapper + .find(`[data-test-subj="caseTitle"] input`) + .first() + .simulate('change', { target: { value: 'My new title' } }); + }); + + expect(globalForm.getFormData()).toEqual({ title: 'My new title' }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/create/title.tsx b/x-pack/plugins/cases/public/components/create/title.tsx new file mode 100644 index 0000000000000..cc51a805b5c38 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/title.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { Field, getUseField } from '../../common/shared_imports'; + +const CommonUseField = getUseField({ component: Field }); + +interface Props { + isLoading: boolean; +} + +const TitleComponent: React.FC<Props> = ({ isLoading }) => ( + <CommonUseField + path="title" + componentProps={{ + idAria: 'caseTitle', + 'data-test-subj': 'caseTitle', + euiFieldProps: { + fullWidth: true, + disabled: isLoading, + }, + }} + /> +); + +TitleComponent.displayName = 'TitleComponent'; + +export const Title = memo(TitleComponent); diff --git a/x-pack/plugins/cases/public/components/create/translations.ts b/x-pack/plugins/cases/public/components/create/translations.ts new file mode 100644 index 0000000000000..fec8cc8e7a7d5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/create/translations.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../common/translations'; + +export const STEP_ONE_TITLE = i18n.translate( + 'xpack.securitySolution.components.create.stepOneTitle', + { + defaultMessage: 'Case fields', + } +); + +export const STEP_TWO_TITLE = i18n.translate( + 'xpack.securitySolution.components.create.stepTwoTitle', + { + defaultMessage: 'Case settings', + } +); + +export const STEP_THREE_TITLE = i18n.translate( + 'xpack.securitySolution.components.create.stepThreeTitle', + { + defaultMessage: 'External Connector Fields', + } +); + +export const SYNC_ALERTS_LABEL = i18n.translate( + 'xpack.securitySolution.components.create.syncAlertsLabel', + { + defaultMessage: 'Sync alert status with case status', + } +); diff --git a/x-pack/plugins/cases/public/components/status/button.test.tsx b/x-pack/plugins/cases/public/components/status/button.test.tsx new file mode 100644 index 0000000000000..32df83b4b2ddf --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/button.test.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CaseStatuses } from '../../../common/api'; +import { StatusActionButton } from './button'; + +describe('StatusActionButton', () => { + const onStatusChanged = jest.fn(); + const defaultProps = { + status: CaseStatuses.open, + disabled: false, + isLoading: false, + onStatusChanged, + }; + + it('it renders', async () => { + const wrapper = mount(<StatusActionButton {...defaultProps} />); + + expect(wrapper.find(`[data-test-subj="case-view-status-action-button"]`).exists()).toBeTruthy(); + }); + + describe('Button icons', () => { + it('it renders the correct button icon: status open', () => { + const wrapper = mount(<StatusActionButton {...defaultProps} />); + + expect( + wrapper.find(`[data-test-subj="case-view-status-action-button"]`).first().prop('iconType') + ).toBe('folderExclamation'); + }); + + it('it renders the correct button icon: status in-progress', () => { + const wrapper = mount( + <StatusActionButton {...defaultProps} status={CaseStatuses['in-progress']} /> + ); + + expect( + wrapper.find(`[data-test-subj="case-view-status-action-button"]`).first().prop('iconType') + ).toBe('folderCheck'); + }); + + it('it renders the correct button icon: status closed', () => { + const wrapper = mount(<StatusActionButton {...defaultProps} status={CaseStatuses.closed} />); + + expect( + wrapper.find(`[data-test-subj="case-view-status-action-button"]`).first().prop('iconType') + ).toBe('folderOpen'); + }); + }); + + describe('Status rotation', () => { + it('rotates correctly to in-progress when status is open', () => { + const wrapper = mount(<StatusActionButton {...defaultProps} />); + + wrapper + .find(`button[data-test-subj="case-view-status-action-button"]`) + .first() + .simulate('click'); + expect(onStatusChanged).toHaveBeenCalledWith('in-progress'); + }); + + it('rotates correctly to closed when status is in-progress', () => { + const wrapper = mount( + <StatusActionButton {...defaultProps} status={CaseStatuses['in-progress']} /> + ); + + wrapper + .find(`button[data-test-subj="case-view-status-action-button"]`) + .first() + .simulate('click'); + expect(onStatusChanged).toHaveBeenCalledWith('closed'); + }); + + it('rotates correctly to open when status is closed', () => { + const wrapper = mount(<StatusActionButton {...defaultProps} status={CaseStatuses.closed} />); + + wrapper + .find(`button[data-test-subj="case-view-status-action-button"]`) + .first() + .simulate('click'); + expect(onStatusChanged).toHaveBeenCalledWith('open'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/status/button.tsx b/x-pack/plugins/cases/public/components/status/button.tsx new file mode 100644 index 0000000000000..b9d9cdc04743a --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/button.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback, useMemo } from 'react'; +import { EuiButton } from '@elastic/eui'; + +import { CaseStatuses, caseStatuses } from '../../../common/api'; +import { statuses } from './config'; + +interface Props { + status: CaseStatuses; + disabled: boolean; + isLoading: boolean; + onStatusChanged: (status: CaseStatuses) => void; +} + +// Rotate over the statuses. open -> in-progress -> closes -> open... +const getNextItem = (item: number) => (item + 1) % caseStatuses.length; + +const StatusActionButtonComponent: React.FC<Props> = ({ + status, + onStatusChanged, + disabled, + isLoading, +}) => { + const indexOfCurrentStatus = useMemo( + () => caseStatuses.findIndex((caseStatus) => caseStatus === status), + [status] + ); + const nextStatusIndex = useMemo(() => getNextItem(indexOfCurrentStatus), [indexOfCurrentStatus]); + + const onClick = useCallback(() => { + onStatusChanged(caseStatuses[nextStatusIndex]); + }, [nextStatusIndex, onStatusChanged]); + + return ( + <EuiButton + data-test-subj="case-view-status-action-button" + iconType={statuses[caseStatuses[nextStatusIndex]].icon} + isDisabled={disabled} + isLoading={isLoading} + onClick={onClick} + > + {statuses[caseStatuses[nextStatusIndex]].button.label} + </EuiButton> + ); +}; +export const StatusActionButton = memo(StatusActionButtonComponent); diff --git a/x-pack/plugins/cases/public/components/status/config.ts b/x-pack/plugins/cases/public/components/status/config.ts new file mode 100644 index 0000000000000..21decfffbbb45 --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/config.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { CaseStatuses } from '../../../common/api'; +import * as i18n from './translations'; +import { AllCaseStatus, Statuses, StatusAll } from './types'; + +export const allCaseStatus: AllCaseStatus = { + [StatusAll]: { color: 'hollow', label: i18n.ALL }, +}; + +export const statuses: Statuses = { + [CaseStatuses.open]: { + color: 'primary', + label: i18n.OPEN, + icon: 'folderOpen' as const, + actions: { + bulk: { + title: i18n.BULK_ACTION_OPEN_SELECTED, + }, + single: { + title: i18n.OPEN_CASE, + }, + }, + actionBar: { + title: i18n.CASE_OPENED, + }, + button: { + label: i18n.REOPEN_CASE, + }, + stats: { + title: i18n.OPEN_CASES, + }, + }, + [CaseStatuses['in-progress']]: { + color: 'warning', + label: i18n.IN_PROGRESS, + icon: 'folderExclamation' as const, + actions: { + bulk: { + title: i18n.BULK_ACTION_MARK_IN_PROGRESS, + }, + single: { + title: i18n.MARK_CASE_IN_PROGRESS, + }, + }, + actionBar: { + title: i18n.CASE_IN_PROGRESS, + }, + button: { + label: i18n.MARK_CASE_IN_PROGRESS, + }, + stats: { + title: i18n.IN_PROGRESS_CASES, + }, + }, + [CaseStatuses.closed]: { + color: 'default', + label: i18n.CLOSED, + icon: 'folderCheck' as const, + actions: { + bulk: { + title: i18n.BULK_ACTION_CLOSE_SELECTED, + }, + single: { + title: i18n.CLOSE_CASE, + }, + }, + actionBar: { + title: i18n.CASE_CLOSED, + }, + button: { + label: i18n.CLOSE_CASE, + }, + stats: { + title: i18n.CLOSED_CASES, + }, + }, +}; diff --git a/x-pack/plugins/cases/public/components/status/index.ts b/x-pack/plugins/cases/public/components/status/index.ts new file mode 100644 index 0000000000000..94d7cb6a31830 --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './status'; +export * from './config'; +export * from './stats'; +export * from './types'; diff --git a/x-pack/plugins/cases/public/components/status/stats.test.tsx b/x-pack/plugins/cases/public/components/status/stats.test.tsx new file mode 100644 index 0000000000000..ea0f54bf8055b --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/stats.test.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CaseStatuses } from '../../../common/api'; +import { Stats } from './stats'; + +describe('Stats', () => { + const defaultProps = { + caseStatus: CaseStatuses.open, + caseCount: 2, + isLoading: false, + dataTestSubj: 'test-stats', + }; + it('it renders', async () => { + const wrapper = mount(<Stats {...defaultProps} />); + + expect(wrapper.find(`[data-test-subj="test-stats"]`).exists()).toBeTruthy(); + }); + + it('shows the count', async () => { + const wrapper = mount(<Stats {...defaultProps} />); + + expect( + wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__description`).first().text() + ).toBe('2'); + }); + + it('shows the loading spinner', async () => { + const wrapper = mount(<Stats {...defaultProps} isLoading={true} />); + + expect(wrapper.find(`[data-test-subj="test-stats-loading-spinner"]`).exists()).toBeTruthy(); + }); + + describe('Status title', () => { + it('shows the correct title for status open', async () => { + const wrapper = mount(<Stats {...defaultProps} />); + + expect( + wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__title`).first().text() + ).toBe('Open cases'); + }); + + it('shows the correct title for status in-progress', async () => { + const wrapper = mount(<Stats {...defaultProps} caseStatus={CaseStatuses['in-progress']} />); + + expect( + wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__title`).first().text() + ).toBe('In progress cases'); + }); + + it('shows the correct title for status closed', async () => { + const wrapper = mount(<Stats {...defaultProps} caseStatus={CaseStatuses.closed} />); + + expect( + wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__title`).first().text() + ).toBe('Closed cases'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/status/stats.tsx b/x-pack/plugins/cases/public/components/status/stats.tsx new file mode 100644 index 0000000000000..98720ad75a656 --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/stats.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo } from 'react'; +import { EuiDescriptionList, EuiLoadingSpinner } from '@elastic/eui'; +import { CaseStatuses } from '../../../common/api'; +import { statuses } from './config'; + +export interface Props { + caseCount: number | null; + caseStatus: CaseStatuses; + isLoading: boolean; + dataTestSubj?: string; +} + +const StatsComponent: React.FC<Props> = ({ caseCount, caseStatus, isLoading, dataTestSubj }) => { + const statusStats = useMemo( + () => [ + { + title: statuses[caseStatus].stats.title, + description: isLoading ? ( + <EuiLoadingSpinner data-test-subj={`${dataTestSubj}-loading-spinner`} /> + ) : ( + caseCount ?? 'N/A' + ), + }, + ], + [caseCount, caseStatus, dataTestSubj, isLoading] + ); + return ( + <EuiDescriptionList data-test-subj={dataTestSubj} textStyle="reverse" listItems={statusStats} /> + ); +}; + +StatsComponent.displayName = 'StatsComponent'; +export const Stats = memo(StatsComponent); diff --git a/x-pack/plugins/cases/public/components/status/status.test.tsx b/x-pack/plugins/cases/public/components/status/status.test.tsx new file mode 100644 index 0000000000000..3ac2a662059de --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/status.test.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CaseStatuses } from '../../../common/api'; +import { Status } from './status'; + +describe('Stats', () => { + const onClick = jest.fn(); + + it('it renders', async () => { + const wrapper = mount(<Status type={CaseStatuses.open} withArrow={false} onClick={onClick} />); + + expect(wrapper.find(`[data-test-subj="status-badge-open"]`).exists()).toBeTruthy(); + expect( + wrapper.find(`[data-test-subj="status-badge-open"] .euiBadge__iconButton`).exists() + ).toBeFalsy(); + }); + + it('it renders with arrow', async () => { + const wrapper = mount(<Status type={CaseStatuses.open} withArrow={true} onClick={onClick} />); + + expect( + wrapper.find(`[data-test-subj="status-badge-open"] .euiBadge__iconButton`).exists() + ).toBeTruthy(); + }); + + it('it calls onClick when pressing the badge', async () => { + const wrapper = mount(<Status type={CaseStatuses.open} withArrow={true} onClick={onClick} />); + + wrapper.find(`[data-test-subj="status-badge-open"] .euiBadge__iconButton`).simulate('click'); + expect(onClick).toHaveBeenCalled(); + }); + + describe('Colors', () => { + it('shows the correct color when status is open', async () => { + const wrapper = mount( + <Status type={CaseStatuses.open} withArrow={false} onClick={onClick} /> + ); + + expect(wrapper.find(`[data-test-subj="status-badge-open"]`).first().prop('color')).toBe( + 'primary' + ); + }); + + it('shows the correct color when status is in-progress', async () => { + const wrapper = mount( + <Status type={CaseStatuses['in-progress']} withArrow={false} onClick={onClick} /> + ); + + expect( + wrapper.find(`[data-test-subj="status-badge-in-progress"]`).first().prop('color') + ).toBe('warning'); + }); + + it('shows the correct color when status is closed', async () => { + const wrapper = mount( + <Status type={CaseStatuses.closed} withArrow={false} onClick={onClick} /> + ); + + expect(wrapper.find(`[data-test-subj="status-badge-closed"]`).first().prop('color')).toBe( + 'default' + ); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/status/status.tsx b/x-pack/plugins/cases/public/components/status/status.tsx new file mode 100644 index 0000000000000..de4c979daf4c1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/status.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo } from 'react'; +import { noop } from 'lodash/fp'; +import { EuiBadge } from '@elastic/eui'; + +import { allCaseStatus, statuses } from './config'; +import { CaseStatusWithAllStatus, StatusAll } from './types'; +import * as i18n from './translations'; + +interface Props { + type: CaseStatusWithAllStatus; + withArrow?: boolean; + onClick?: () => void; +} + +const StatusComponent: React.FC<Props> = ({ type, withArrow = false, onClick = noop }) => { + const props = useMemo( + () => ({ + color: type === StatusAll ? allCaseStatus[StatusAll].color : statuses[type].color, + ...(withArrow ? { iconType: 'arrowDown', iconSide: 'right' as const } : {}), + }), + [withArrow, type] + ); + + return ( + <EuiBadge + {...props} + iconOnClick={onClick} + iconOnClickAriaLabel={i18n.STATUS_ICON_ARIA} + data-test-subj={`status-badge-${type}`} + > + {type === StatusAll ? allCaseStatus[StatusAll].label : statuses[type].label} + </EuiBadge> + ); +}; + +export const Status = memo(StatusComponent); diff --git a/x-pack/plugins/cases/public/components/status/translations.ts b/x-pack/plugins/cases/public/components/status/translations.ts new file mode 100644 index 0000000000000..639254f96f573 --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/translations.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +export * from '../../common/translations'; + +export const ALL = i18n.translate('xpack.securitySolution.cases.status.all', { + defaultMessage: 'All', +}); + +export const OPEN = i18n.translate('xpack.securitySolution.cases.status.open', { + defaultMessage: 'Open', +}); + +export const IN_PROGRESS = i18n.translate('xpack.securitySolution.cases.status.inProgress', { + defaultMessage: 'In progress', +}); + +export const CLOSED = i18n.translate('xpack.securitySolution.cases.status.closed', { + defaultMessage: 'Closed', +}); + +export const STATUS_ICON_ARIA = i18n.translate('xpack.securitySolution.cases.status.iconAria', { + defaultMessage: 'Change status', +}); + +export const CASE_OPENED = i18n.translate('xpack.securitySolution.cases.caseView.caseOpened', { + defaultMessage: 'Case opened', +}); + +export const CASE_IN_PROGRESS = i18n.translate( + 'xpack.securitySolution.cases.caseView.caseInProgress', + { + defaultMessage: 'Case in progress', + } +); + +export const CASE_CLOSED = i18n.translate('xpack.securitySolution.cases.caseView.caseClosed', { + defaultMessage: 'Case closed', +}); + +export const BULK_ACTION_CLOSE_SELECTED = i18n.translate( + 'xpack.securitySolution.cases.caseTable.bulkActions.closeSelectedTitle', + { + defaultMessage: 'Close selected', + } +); + +export const BULK_ACTION_OPEN_SELECTED = i18n.translate( + 'xpack.securitySolution.cases.caseTable.bulkActions.openSelectedTitle', + { + defaultMessage: 'Open selected', + } +); + +export const BULK_ACTION_DELETE_SELECTED = i18n.translate( + 'xpack.securitySolution.cases.caseTable.bulkActions.deleteSelectedTitle', + { + defaultMessage: 'Delete selected', + } +); + +export const BULK_ACTION_MARK_IN_PROGRESS = i18n.translate( + 'xpack.securitySolution.cases.caseTable.bulkActions.markInProgressTitle', + { + defaultMessage: 'Mark in progress', + } +); diff --git a/x-pack/plugins/cases/public/components/status/types.ts b/x-pack/plugins/cases/public/components/status/types.ts new file mode 100644 index 0000000000000..d88901fdbf6c9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/status/types.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; +import { CaseStatuses } from '../../../common/api'; + +export const StatusAll = 'all' as const; +type StatusAllType = typeof StatusAll; + +export type CaseStatusWithAllStatus = CaseStatuses | StatusAllType; + +export type AllCaseStatus = Record<StatusAllType, { color: string; label: string }>; + +export type Statuses = Record< + CaseStatuses, + { + color: string; + label: string; + icon: EuiIconType; + actions: { + bulk: { + title: string; + }; + single: { + title: string; + description?: string; + }; + }; + actionBar: { + title: string; + }; + button: { + label: string; + }; + stats: { + title: string; + }; + } +>; diff --git a/x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap b/x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap new file mode 100644 index 0000000000000..5e008e28073de --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap @@ -0,0 +1,48 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Modal all errors rendering it renders the default all errors modal when isShowing is positive 1`] = ` +<EuiModal + onClose={[Function]} +> + <EuiModalHeader> + <EuiModalHeaderTitle> + Your visualization has error(s) + </EuiModalHeaderTitle> + </EuiModalHeader> + <EuiModalBody> + <EuiCallOut + color="danger" + iconType="alert" + size="s" + title="Test & Test" + /> + <EuiSpacer + size="s" + /> + <EuiAccordion + arrowDisplay="left" + buttonContent="Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt u ..." + data-test-subj="modal-all-errors-accordion" + id="accordion1" + initialIsOpen={true} + isLoading={false} + isLoadingMessage={false} + key="id-super-id-0" + paddingSize="none" + > + <MyEuiCodeBlock> + Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </MyEuiCodeBlock> + </EuiAccordion> + </EuiModalBody> + <EuiModalFooter> + <EuiButton + data-test-subj="modal-all-errors-close" + fill={true} + onClick={[Function]} + > + Close + </EuiButton> + </EuiModalFooter> +</EuiModal> +`; diff --git a/x-pack/plugins/cases/public/components/toasters/errors.ts b/x-pack/plugins/cases/public/components/toasters/errors.ts new file mode 100644 index 0000000000000..0a672aeee8b7c --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/errors.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export class ToasterError extends Error { + public readonly messages: string[]; + + constructor(messages: string[]) { + super(messages[0]); + this.name = 'ToasterError'; + this.messages = messages; + } +} + +export const isToasterError = (error: unknown): error is ToasterError => + error instanceof ToasterError; diff --git a/x-pack/plugins/cases/public/components/toasters/index.test.tsx b/x-pack/plugins/cases/public/components/toasters/index.test.tsx new file mode 100644 index 0000000000000..1d78570e18a59 --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/index.test.tsx @@ -0,0 +1,307 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { set } from '@elastic/safer-lodash-set/fp'; +import { cloneDeep } from 'lodash/fp'; +import { mount } from 'enzyme'; +import React, { useEffect } from 'react'; + +import { + AppToast, + useStateToaster, + ManageGlobalToaster, + GlobalToaster, + displayErrorToast, +} from '.'; + +jest.mock('uuid', () => { + return { + v1: jest.fn(() => '27261ae0-0bbb-11ea-b0ea-db767b07ea47'), + v4: jest.fn(() => '9e1f72a9-7c73-4b7f-a562-09940f7daf4a'), + }; +}); + +const mockToast: AppToast = { + color: 'danger', + id: 'id-super-id', + iconType: 'alert', + title: 'Test & Test', + toastLifeTimeMs: 100, + text: + 'Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', +}; + +describe('Toaster', () => { + describe('Manage Global Toaster Reducer', () => { + test('we can add a toast in the reducer', () => { + const AddToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + return ( + <> + <button + data-test-subj="add-toast" + type="button" + onClick={() => dispatch({ type: 'addToaster', toast: mockToast })} + /> + {toasts.map((toast) => ( + <span + data-test-subj={`add-toaster-${toast.id}`} + key={`add-toaster-${toast.id}`} + >{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <AddToaster /> + </ManageGlobalToaster> + ); + wrapper.find('[data-test-subj="add-toast"]').simulate('click'); + expect(wrapper.find('[data-test-subj="add-toaster-id-super-id"]').exists()).toBe(true); + }); + test('we can delete a toast in the reducer', () => { + const DeleteToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + useEffect(() => { + if (toasts.length === 0) { + dispatch({ type: 'addToaster', toast: mockToast }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( + <> + <button + data-test-subj="delete-toast" + type="button" + onClick={() => dispatch({ type: 'deleteToaster', id: mockToast.id })} + /> + {toasts.map((toast) => ( + <span + data-test-subj={`delete-toaster-${toast.id}`} + key={`delete-toaster-${toast.id}`} + >{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <DeleteToaster /> + </ManageGlobalToaster> + ); + + expect(wrapper.find('[data-test-subj="delete-toaster-id-super-id"]').exists()).toBe(true); + wrapper.find('[data-test-subj="delete-toast"]').simulate('click'); + expect(wrapper.find('[data-test-subj="delete-toaster-id-super-id"]').exists()).toBe(false); + }); + }); + + describe('Global Toaster', () => { + test('Render a basic toaster', () => { + const AddToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + return ( + <> + <button + data-test-subj="add-toast" + type="button" + onClick={() => dispatch({ type: 'addToaster', toast: mockToast })} + /> + {toasts.map((toast) => ( + <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <AddToaster /> + <GlobalToaster /> + </ManageGlobalToaster> + ); + wrapper.find('[data-test-subj="add-toast"]').simulate('click'); + + expect(wrapper.find('.euiGlobalToastList').exists()).toBe(true); + expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test'); + }); + + test('Render an error toaster', () => { + let mockErrorToast: AppToast = cloneDeep(mockToast); + mockErrorToast.title = 'Test & Test ERROR'; + mockErrorToast = set('errors', [mockErrorToast.text], mockErrorToast); + + const AddToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + return ( + <> + <button + data-test-subj="add-toast" + type="button" + onClick={() => dispatch({ type: 'addToaster', toast: mockErrorToast })} + /> + {toasts.map((toast) => ( + <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <AddToaster /> + <GlobalToaster /> + </ManageGlobalToaster> + ); + wrapper.find('[data-test-subj="add-toast"]').simulate('click'); + + expect(wrapper.find('.euiGlobalToastList').exists()).toBe(true); + expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test ERROR'); + expect(wrapper.find('button[data-test-subj="toaster-show-all-error-modal"]').exists()).toBe( + true + ); + }); + + test('Only show one toast at the time', () => { + const mockOneMoreToast: AppToast = cloneDeep(mockToast); + mockOneMoreToast.id = 'id-super-id-II'; + mockOneMoreToast.title = 'Test & Test II'; + + const AddToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + return ( + <> + <button + data-test-subj="add-toast" + type="button" + onClick={() => { + dispatch({ type: 'addToaster', toast: mockToast }); + dispatch({ type: 'addToaster', toast: mockOneMoreToast }); + }} + /> + <button + data-test-subj="delete-toast" + type="button" + onClick={() => { + dispatch({ type: 'deleteToaster', id: mockToast.id }); + }} + /> + {toasts.map((toast) => ( + <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <AddToaster /> + <GlobalToaster /> + </ManageGlobalToaster> + ); + wrapper.find('[data-test-subj="add-toast"]').simulate('click'); + + expect(wrapper.find('button[data-test-subj="toastCloseButton"]').length).toBe(1); + expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test'); + wrapper.find('button[data-test-subj="delete-toast"]').simulate('click'); + expect(wrapper.find('.euiToast').length).toBe(1); + expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test II'); + }); + + test('Do not show anymore toaster when modal error is open', () => { + let mockErrorToast: AppToast = cloneDeep(mockToast); + mockErrorToast.id = 'id-super-id-error'; + mockErrorToast = set('errors', [mockErrorToast.text], mockErrorToast); + + const AddToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + return ( + <> + <button + data-test-subj="add-toast" + type="button" + onClick={() => { + dispatch({ type: 'addToaster', toast: mockErrorToast }); + dispatch({ type: 'addToaster', toast: mockToast }); + }} + /> + {toasts.map((toast) => ( + <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <AddToaster /> + <GlobalToaster /> + </ManageGlobalToaster> + ); + wrapper.find('[data-test-subj="add-toast"]').simulate('click'); + wrapper.find('button[data-test-subj="toaster-show-all-error-modal"]').simulate('click'); + + expect(wrapper.find('.euiToast').length).toBe(0); + }); + + test('Show new toaster when modal error is closing', () => { + let mockErrorToast: AppToast = cloneDeep(mockToast); + mockErrorToast.title = 'Test & Test II'; + mockErrorToast.id = 'id-super-id-error'; + mockErrorToast = set('errors', [mockErrorToast.text], mockErrorToast); + + const AddToaster = () => { + const [{ toasts }, dispatch] = useStateToaster(); + return ( + <> + <button + data-test-subj="add-toast" + type="button" + onClick={() => { + dispatch({ type: 'addToaster', toast: mockErrorToast }); + dispatch({ type: 'addToaster', toast: mockToast }); + }} + /> + {toasts.map((toast) => ( + <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> + ))} + </> + ); + }; + const wrapper = mount( + <ManageGlobalToaster> + <AddToaster /> + <GlobalToaster /> + </ManageGlobalToaster> + ); + wrapper.find('[data-test-subj="add-toast"]').simulate('click'); + expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test II'); + + wrapper.find('button[data-test-subj="toaster-show-all-error-modal"]').simulate('click'); + expect(wrapper.find('.euiToast').length).toBe(0); + + wrapper.find('button[data-test-subj="modal-all-errors-close"]').simulate('click'); + expect(wrapper.find('.euiToast').length).toBe(1); + expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test'); + }); + }); + + describe('displayErrorToast', () => { + test('dispatches toast with correct title and message', () => { + const mockErrorToast = { + toast: { + color: 'danger', + errors: ['message'], + iconType: 'alert', + id: '9e1f72a9-7c73-4b7f-a562-09940f7daf4a', + title: 'Title', + }, + type: 'addToaster', + }; + const dispatchToasterMock = jest.fn(); + displayErrorToast('Title', ['message'], dispatchToasterMock); + expect(dispatchToasterMock.mock.calls[0][0]).toEqual(mockErrorToast); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/toasters/index.tsx b/x-pack/plugins/cases/public/components/toasters/index.tsx new file mode 100644 index 0000000000000..ea17b03082751 --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/index.tsx @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiGlobalToastList, EuiGlobalToastListToast as Toast } from '@elastic/eui'; +import { noop } from 'lodash/fp'; +import React, { createContext, Dispatch, useContext, useReducer, useState } from 'react'; +import styled from 'styled-components'; + +import { ModalAllErrors } from './modal_all_errors'; +import * as i18n from './translations'; + +export * from './utils'; +export * from './errors'; + +export interface AppToast extends Toast { + errors?: string[]; +} + +interface ToastState { + toasts: AppToast[]; +} + +const initialToasterState: ToastState = { + toasts: [], +}; + +export type ActionToaster = + | { type: 'addToaster'; toast: AppToast } + | { type: 'deleteToaster'; id: string } + | { type: 'toggleWaitToShowNextToast' }; + +export const StateToasterContext = createContext<[ToastState, Dispatch<ActionToaster>]>([ + initialToasterState, + () => noop, +]); + +export const useStateToaster = () => useContext(StateToasterContext); + +interface ManageGlobalToasterProps { + children: React.ReactNode; +} + +export const ManageGlobalToaster = ({ children }: ManageGlobalToasterProps) => { + const reducerToaster = (state: ToastState, action: ActionToaster) => { + switch (action.type) { + case 'addToaster': + return { ...state, toasts: [...state.toasts, action.toast] }; + case 'deleteToaster': + return { ...state, toasts: state.toasts.filter((msg) => msg.id !== action.id) }; + default: + return state; + } + }; + + return ( + <StateToasterContext.Provider value={useReducer(reducerToaster, initialToasterState)}> + {children} + </StateToasterContext.Provider> + ); +}; + +const GlobalToasterListContainer = styled.div` + position: absolute; + right: 0; + bottom: 0; +`; + +interface GlobalToasterProps { + toastLifeTimeMs?: number; +} + +export const GlobalToaster = ({ toastLifeTimeMs = 5000 }: GlobalToasterProps) => { + const [{ toasts }, dispatch] = useStateToaster(); + const [isShowing, setIsShowing] = useState(false); + const [toastInModal, setToastInModal] = useState<AppToast | null>(null); + + const toggle = (toast: AppToast) => { + if (isShowing) { + dispatch({ type: 'deleteToaster', id: toast.id }); + setToastInModal(null); + } else { + setToastInModal(toast); + } + setIsShowing(!isShowing); + }; + + return ( + <> + {toasts.length > 0 && !isShowing && ( + <GlobalToasterListContainer> + <EuiGlobalToastList + toasts={[formatToErrorToastIfNeeded(toasts[0], toggle)]} + dismissToast={({ id }) => { + dispatch({ type: 'deleteToaster', id }); + }} + toastLifeTimeMs={toastLifeTimeMs} + /> + </GlobalToasterListContainer> + )} + {toastInModal != null && ( + <ModalAllErrors isShowing={isShowing} toast={toastInModal} toggle={toggle} /> + )} + </> + ); +}; + +const formatToErrorToastIfNeeded = ( + toast: AppToast, + toggle: (toast: AppToast) => void +): AppToast => { + if (toast != null && toast.errors != null && toast.errors.length > 0) { + toast.text = ( + <ErrorToastContainer> + <EuiButton + data-test-subj="toaster-show-all-error-modal" + size="s" + color="danger" + onClick={() => toast != null && toggle(toast)} + > + {i18n.SEE_ALL_ERRORS} + </EuiButton> + </ErrorToastContainer> + ); + } + return toast; +}; + +const ErrorToastContainer = styled.div` + text-align: right; +`; + +ErrorToastContainer.displayName = 'ErrorToastContainer'; diff --git a/x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx b/x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx new file mode 100644 index 0000000000000..7ec0553591103 --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { shallow } from 'enzyme'; + +import React from 'react'; + +import { ModalAllErrors } from './modal_all_errors'; +import { AppToast } from '.'; +import { cloneDeep } from 'lodash/fp'; + +const mockToast: AppToast = { + color: 'danger', + id: 'id-super-id', + iconType: 'alert', + title: 'Test & Test', + errors: [ + 'Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', + ], +}; + +describe('Modal all errors', () => { + const toggle = jest.fn(); + describe('rendering', () => { + test('it renders the default all errors modal when isShowing is positive', () => { + const wrapper = shallow( + <ModalAllErrors isShowing={true} toast={mockToast} toggle={toggle} /> + ); + expect(wrapper).toMatchSnapshot(); + }); + + test('it renders null when isShowing is negative', () => { + const wrapper = shallow( + <ModalAllErrors isShowing={false} toast={mockToast} toggle={toggle} /> + ); + expect(wrapper.html()).toEqual(null); + }); + + test('it renders multiple errors in modal', () => { + const mockToastWithTwoError = cloneDeep(mockToast); + mockToastWithTwoError.errors = [ + 'Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', + 'Error 2, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', + 'Error 3, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', + ]; + const wrapper = shallow( + <ModalAllErrors isShowing={true} toast={mockToastWithTwoError} toggle={toggle} /> + ); + expect(wrapper.find('[data-test-subj="modal-all-errors-accordion"]').length).toBe( + mockToastWithTwoError.errors.length + ); + }); + }); + + describe('events', () => { + test('Make sure that toggle function has been called when you click on the close button', () => { + const wrapper = shallow( + <ModalAllErrors isShowing={true} toast={mockToast} toggle={toggle} /> + ); + + wrapper.find('[data-test-subj="modal-all-errors-close"]').simulate('click'); + wrapper.update(); + expect(toggle).toHaveBeenCalledWith(mockToast); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx b/x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx new file mode 100644 index 0000000000000..0a78139f5fe3a --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButton, + EuiModal, + EuiModalHeader, + EuiModalHeaderTitle, + EuiModalBody, + EuiCallOut, + EuiSpacer, + EuiCodeBlock, + EuiModalFooter, + EuiAccordion, +} from '@elastic/eui'; +import React, { useCallback } from 'react'; +import styled from 'styled-components'; + +import { AppToast } from '.'; +import * as i18n from './translations'; + +interface FullErrorProps { + isShowing: boolean; + toast: AppToast; + toggle: (toast: AppToast) => void; +} + +const ModalAllErrorsComponent: React.FC<FullErrorProps> = ({ isShowing, toast, toggle }) => { + const handleClose = useCallback(() => toggle(toast), [toggle, toast]); + + if (!isShowing || toast == null) return null; + + return ( + <EuiModal onClose={handleClose}> + <EuiModalHeader> + <EuiModalHeaderTitle>{i18n.TITLE_ERROR_MODAL}</EuiModalHeaderTitle> + </EuiModalHeader> + + <EuiModalBody> + <EuiCallOut title={toast.title} color="danger" size="s" iconType="alert" /> + <EuiSpacer size="s" /> + {toast.errors != null && + toast.errors.map((error, index) => ( + <EuiAccordion + key={`${toast.id}-${index}`} + id="accordion1" + initialIsOpen={index === 0 ? true : false} + buttonContent={error.length > 100 ? `${error.substring(0, 100)} ...` : error} + data-test-subj="modal-all-errors-accordion" + > + <MyEuiCodeBlock>{error}</MyEuiCodeBlock> + </EuiAccordion> + ))} + </EuiModalBody> + + <EuiModalFooter> + <EuiButton onClick={handleClose} fill data-test-subj="modal-all-errors-close"> + {i18n.CLOSE_ERROR_MODAL} + </EuiButton> + </EuiModalFooter> + </EuiModal> + ); +}; + +export const ModalAllErrors = React.memo(ModalAllErrorsComponent); + +const MyEuiCodeBlock = styled(EuiCodeBlock)` + margin-top: 4px; +`; + +MyEuiCodeBlock.displayName = 'MyEuiCodeBlock'; diff --git a/x-pack/plugins/cases/public/components/toasters/translations.ts b/x-pack/plugins/cases/public/components/toasters/translations.ts new file mode 100644 index 0000000000000..0d5bbbf944fc5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/translations.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const SEE_ALL_ERRORS = i18n.translate( + 'xpack.securitySolution.modalAllErrors.seeAllErrors.button', + { + defaultMessage: 'See the full error(s)', + } +); + +export const TITLE_ERROR_MODAL = i18n.translate('xpack.securitySolution.modalAllErrors.title', { + defaultMessage: 'Your visualization has error(s)', +}); + +export const CLOSE_ERROR_MODAL = i18n.translate( + 'xpack.securitySolution.modalAllErrors.close.button', + { + defaultMessage: 'Close', + } +); diff --git a/x-pack/plugins/cases/public/components/toasters/utils.test.ts b/x-pack/plugins/cases/public/components/toasters/utils.test.ts new file mode 100644 index 0000000000000..34871b2e68efa --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/utils.test.ts @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { errorToToaster } from './utils'; +import { ToasterError } from './errors'; + +const ApiError = class extends Error { + public body: {} = {}; +}; + +describe('error_to_toaster', () => { + let dispatchToaster = jest.fn(); + + beforeEach(() => { + dispatchToaster = jest.fn(); + }); + + describe('#errorToToaster', () => { + test('dispatches an error toast given a ToasterError with multiple error messages', () => { + const error = new ToasterError(['some error 1', 'some error 2']); + errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); + expect(dispatchToaster.mock.calls[0]).toEqual([ + { + toast: { + color: 'danger', + errors: ['some error 1', 'some error 2'], + iconType: 'alert', + id: 'some-made-up-id', + title: 'some title', + }, + type: 'addToaster', + }, + ]); + }); + + test('dispatches an error toast given a ToasterError with a single error message', () => { + const error = new ToasterError(['some error 1']); + errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); + expect(dispatchToaster.mock.calls[0]).toEqual([ + { + toast: { + color: 'danger', + errors: ['some error 1'], + iconType: 'alert', + id: 'some-made-up-id', + title: 'some title', + }, + type: 'addToaster', + }, + ]); + }); + + test('dispatches an error toast given an ApiError with a message', () => { + const error = new ApiError('Internal Server Error'); + error.body = { message: 'something bad happened', status_code: 500 }; + + errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); + expect(dispatchToaster.mock.calls[0]).toEqual([ + { + toast: { + color: 'danger', + errors: ['something bad happened'], + iconType: 'alert', + id: 'some-made-up-id', + title: 'some title', + }, + type: 'addToaster', + }, + ]); + }); + + test('dispatches an error toast given an ApiError with no message', () => { + const error = new ApiError('Internal Server Error'); + + errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); + expect(dispatchToaster.mock.calls[0]).toEqual([ + { + toast: { + color: 'danger', + errors: ['Internal Server Error'], + iconType: 'alert', + id: 'some-made-up-id', + title: 'some title', + }, + type: 'addToaster', + }, + ]); + }); + + test('dispatches an error toast given a standard Error', () => { + const error = new Error('some error 1'); + errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); + expect(dispatchToaster.mock.calls[0]).toEqual([ + { + toast: { + color: 'danger', + errors: ['some error 1'], + iconType: 'alert', + id: 'some-made-up-id', + title: 'some title', + }, + type: 'addToaster', + }, + ]); + }); + + test('adds a generic Network Error given a non Error object such as a string', () => { + const error = 'terrible string'; + errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); + expect(dispatchToaster.mock.calls[0]).toEqual([ + { + toast: { + color: 'danger', + errors: ['Network Error'], + iconType: 'alert', + id: 'some-made-up-id', + title: 'some title', + }, + type: 'addToaster', + }, + ]); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/toasters/utils.ts b/x-pack/plugins/cases/public/components/toasters/utils.ts new file mode 100644 index 0000000000000..0575c40107668 --- /dev/null +++ b/x-pack/plugins/cases/public/components/toasters/utils.ts @@ -0,0 +1,149 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type React from 'react'; +import uuid from 'uuid'; +import { isError } from 'lodash/fp'; + +import { AppToast, ActionToaster } from './'; +import { isToasterError } from './errors'; +import { isAppError } from '../../common/errors'; + +/** + * Displays an error toast for the provided title and message + * + * @param errorTitle Title of error to display in toaster and modal + * @param errorMessages Message to display in error modal when clicked + * @param dispatchToaster provided by useStateToaster() + */ +export const displayErrorToast = ( + errorTitle: string, + errorMessages: string[], + dispatchToaster: React.Dispatch<ActionToaster>, + id: string = uuid.v4() +): void => { + const toast: AppToast = { + id, + title: errorTitle, + color: 'danger', + iconType: 'alert', + errors: errorMessages, + }; + dispatchToaster({ + type: 'addToaster', + toast, + }); +}; + +/** + * Displays a warning toast for the provided title and message + * + * @param title warning message to display in toaster and modal + * @param dispatchToaster provided by useStateToaster() + * @param id unique ID if necessary + */ +export const displayWarningToast = ( + title: string, + dispatchToaster: React.Dispatch<ActionToaster>, + id: string = uuid.v4() +): void => { + const toast: AppToast = { + id, + title, + color: 'warning', + iconType: 'help', + }; + dispatchToaster({ + type: 'addToaster', + toast, + }); +}; + +/** + * Displays a success toast for the provided title and message + * + * @param title success message to display in toaster and modal + * @param dispatchToaster provided by useStateToaster() + */ +export const displaySuccessToast = ( + title: string, + dispatchToaster: React.Dispatch<ActionToaster>, + id: string = uuid.v4() +): void => { + const toast: AppToast = { + id, + title, + color: 'success', + iconType: 'check', + }; + dispatchToaster({ + type: 'addToaster', + toast, + }); +}; + +export type ErrorToToasterArgs = Partial<AppToast> & { + error: unknown; + dispatchToaster: React.Dispatch<ActionToaster>; +}; + +/** + * Displays an error toast with messages parsed from the error + * + * @param title error message to display in toaster and modal + * @param error the error from which messages will be parsed + * @param dispatchToaster provided by useStateToaster() + */ +export const errorToToaster = ({ + id = uuid.v4(), + title, + error, + color = 'danger', + iconType = 'alert', + dispatchToaster, +}: ErrorToToasterArgs) => { + let toast: AppToast; + + if (isToasterError(error)) { + toast = { + id, + title, + color, + iconType, + errors: error.messages, + }; + } else if (isAppError(error)) { + toast = { + id, + title, + color, + iconType, + errors: [error.body.message], + }; + } else if (isError(error)) { + toast = { + id, + title, + color, + iconType, + errors: [error.message], + }; + } else { + toast = { + id, + title, + color, + iconType, + errors: ['Network Error'], + }; + } + + dispatchToaster({ + type: 'addToaster', + toast, + }); +}; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx new file mode 100644 index 0000000000000..0c996e9bab589 --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactNode } from 'react'; +import { mount } from 'enzyme'; + +import '../../../common/mock/match_media'; +import { CreateCaseModal } from './create_case_modal'; +import { TestProviders } from '../../../common/mock'; + +jest.mock('../create/form_context', () => { + return { + FormContext: ({ + children, + onSuccess, + }: { + children: ReactNode; + onSuccess: ({ id }: { id: string }) => Promise<void>; + }) => { + return ( + <> + <button + type="button" + data-test-subj="form-context-on-success" + onClick={async () => { + await onSuccess({ id: 'case-id' }); + }} + > + {'submit'} + </button> + {children} + </> + ); + }, + }; +}); + +jest.mock('../create/form', () => { + return { + CreateCaseForm: () => { + return <>{'form'}</>; + }, + }; +}); + +jest.mock('../create/submit_button', () => { + return { + SubmitCaseButton: () => { + return <>{'Submit'}</>; + }, + }; +}); + +const onCloseCaseModal = jest.fn(); +const onSuccess = jest.fn(); +const defaultProps = { + isModalOpen: true, + onCloseCaseModal, + onSuccess, +}; + +describe('CreateCaseModal', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('renders', () => { + const wrapper = mount( + <TestProviders> + <CreateCaseModal {...defaultProps} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + }); + + it('it does not render the modal isModalOpen=false ', () => { + const wrapper = mount( + <TestProviders> + <CreateCaseModal {...defaultProps} isModalOpen={false} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); + }); + + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + <TestProviders> + <CreateCaseModal {...defaultProps} /> + </TestProviders> + ); + + wrapper.find('.euiModal__closeIcon').first().simulate('click'); + expect(onCloseCaseModal).toBeCalled(); + }); + + it('pass the correct props to FormContext component', () => { + const wrapper = mount( + <TestProviders> + <CreateCaseModal {...defaultProps} /> + </TestProviders> + ); + + const props = wrapper.find('FormContext').props(); + expect(props).toEqual( + expect.objectContaining({ + onSuccess, + }) + ); + }); + + it('onSuccess called when creating a case', () => { + const wrapper = mount( + <TestProviders> + <CreateCaseModal {...defaultProps} /> + </TestProviders> + ); + + wrapper.find(`[data-test-subj='form-context-on-success']`).first().simulate('click'); + expect(onSuccess).toHaveBeenCalledWith({ id: 'case-id' }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx new file mode 100644 index 0000000000000..a54f9a3862b09 --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import styled from 'styled-components'; +import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; + +import { FormContext } from '../create/form_context'; +import { CreateCaseForm } from '../create/form'; +import { SubmitCaseButton } from '../create/submit_button'; +import { Case } from '../../containers/types'; +import * as i18n from '../../common/translations'; +import { CaseType } from '../../../common/api'; + +export interface CreateCaseModalProps { + isModalOpen: boolean; + onCloseCaseModal: () => void; + onSuccess: (theCase: Case) => Promise<void>; + caseType?: CaseType; + hideConnectorServiceNowSir?: boolean; +} + +const Container = styled.div` + ${({ theme }) => ` + margin-top: ${theme.eui.euiSize}; + text-align: right; + `} +`; + +const CreateModalComponent: React.FC<CreateCaseModalProps> = ({ + isModalOpen, + onCloseCaseModal, + onSuccess, + caseType = CaseType.individual, + hideConnectorServiceNowSir = false, +}) => { + return isModalOpen ? ( + <EuiModal onClose={onCloseCaseModal} data-test-subj="all-cases-modal"> + <EuiModalHeader> + <EuiModalHeaderTitle>{i18n.CREATE_TITLE}</EuiModalHeaderTitle> + </EuiModalHeader> + <EuiModalBody> + <FormContext + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + caseType={caseType} + onSuccess={onSuccess} + > + <CreateCaseForm + withSteps={false} + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + /> + <Container> + <SubmitCaseButton /> + </Container> + </FormContext> + </EuiModalBody> + </EuiModal> + ) : null; +}; + +export const CreateCaseModal = memo(CreateModalComponent); + +CreateCaseModal.displayName = 'CreateCaseModal'; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx new file mode 100644 index 0000000000000..bfe3bad46c09a --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -0,0 +1,156 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactNode } from 'react'; +import { renderHook, act } from '@testing-library/react-hooks'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { useKibana } from '../../../common/lib/kibana'; +import '../../../common/mock/match_media'; +import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; +import { mockTimelineModel, TestProviders } from '../../../common/mock'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; + +jest.mock('../../../common/lib/kibana'); +jest.mock('../create/form_context', () => { + return { + FormContext: ({ + children, + onSuccess, + }: { + children: ReactNode; + onSuccess: ({ id }: { id: string }) => Promise<void>; + }) => { + return ( + <> + <button + type="button" + data-test-subj="form-context-on-success" + onClick={async () => { + await onSuccess({ id: 'case-id' }); + }} + > + {'Form submit'} + </button> + {children} + </> + ); + }, + }; +}); + +jest.mock('../create/form', () => { + return { + CreateCaseForm: () => { + return <>{'form'}</>; + }, + }; +}); + +jest.mock('../create/submit_button', () => { + return { + SubmitCaseButton: () => { + return <>{'Submit'}</>; + }, + }; +}); + +jest.mock('../../../common/hooks/use_selector'); + +const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; +const onCaseCreated = jest.fn(); + +describe('useCreateCaseModal', () => { + let navigateToApp: jest.Mock; + + beforeEach(() => { + navigateToApp = jest.fn(); + useKibanaMock().services.application.navigateToApp = navigateToApp; + (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); + }); + + it('init', async () => { + const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( + () => useCreateCaseModal({ onCaseCreated }), + { + wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, + } + ); + + expect(result.current.isModalOpen).toBe(false); + }); + + it('opens the modal', async () => { + const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( + () => useCreateCaseModal({ onCaseCreated }), + { + wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, + } + ); + + act(() => { + result.current.openModal(); + }); + + expect(result.current.isModalOpen).toBe(true); + }); + + it('closes the modal', async () => { + const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( + () => useCreateCaseModal({ onCaseCreated }), + { + wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, + } + ); + + act(() => { + result.current.openModal(); + result.current.closeModal(); + }); + + expect(result.current.isModalOpen).toBe(false); + }); + + it('returns a memoized value', async () => { + const { result, rerender } = renderHook< + UseCreateCaseModalProps, + UseCreateCaseModalReturnedValues + >(() => useCreateCaseModal({ onCaseCreated }), { + wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, + }); + + const result1 = result.current; + act(() => rerender()); + const result2 = result.current; + + expect(Object.is(result1, result2)).toBe(true); + }); + + it('closes the modal when creating a case', async () => { + const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( + () => useCreateCaseModal({ onCaseCreated }), + { + wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, + } + ); + + act(() => { + result.current.openModal(); + }); + + const modal = result.current.modal; + render(<TestProviders>{modal}</TestProviders>); + + act(() => { + userEvent.click(screen.getByText('Form submit')); + }); + + expect(result.current.isModalOpen).toBe(false); + expect(onCaseCreated).toHaveBeenCalledWith({ id: 'case-id' }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx new file mode 100644 index 0000000000000..29195e776ceac --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useCallback, useMemo } from 'react'; +import { CaseType } from '../../../common/api'; +import { Case } from '../../containers/types'; +import { CreateCaseModal } from './create_case_modal'; + +export interface UseCreateCaseModalProps { + onCaseCreated: (theCase: Case) => void; + caseType?: CaseType; + hideConnectorServiceNowSir?: boolean; +} +export interface UseCreateCaseModalReturnedValues { + modal: JSX.Element; + isModalOpen: boolean; + closeModal: () => void; + openModal: () => void; +} + +export const useCreateCaseModal = ({ + caseType = CaseType.individual, + onCaseCreated, + hideConnectorServiceNowSir = false, +}: UseCreateCaseModalProps) => { + const [isModalOpen, setIsModalOpen] = useState<boolean>(false); + const closeModal = useCallback(() => setIsModalOpen(false), []); + const openModal = useCallback(() => setIsModalOpen(true), []); + const onSuccess = useCallback( + async (theCase) => { + onCaseCreated(theCase); + closeModal(); + }, + [onCaseCreated, closeModal] + ); + + const state = useMemo( + () => ({ + modal: ( + <CreateCaseModal + caseType={caseType} + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + isModalOpen={isModalOpen} + onCloseCaseModal={closeModal} + onSuccess={onSuccess} + /> + ), + isModalOpen, + closeModal, + openModal, + }), + [caseType, closeModal, hideConnectorServiceNowSir, isModalOpen, onSuccess, openModal] + ); + + return state; +}; diff --git a/x-pack/plugins/cases/public/components/wrappers/index.tsx b/x-pack/plugins/cases/public/components/wrappers/index.tsx new file mode 100644 index 0000000000000..3b33e9304da83 --- /dev/null +++ b/x-pack/plugins/cases/public/components/wrappers/index.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import styled from 'styled-components'; + +export const WhitePageWrapper = styled.div` + background-color: ${({ theme }) => theme.eui.euiColorEmptyShade}; + border-top: ${({ theme }) => theme.eui.euiBorderThin}; + flex: 1 1 auto; +`; + +export const SectionWrapper = styled.div` + box-sizing: content-box; + margin: 0 auto; + max-width: 1175px; + width: 100%; +`; + +export const HeaderWrapper = styled.div` + padding: ${({ theme }) => + `${theme.eui.paddingSizes.l} ${theme.eui.paddingSizes.l} 0 ${theme.eui.paddingSizes.l}`}; +`; diff --git a/x-pack/plugins/cases/public/containers/__mocks__/api.ts b/x-pack/plugins/cases/public/containers/__mocks__/api.ts new file mode 100644 index 0000000000000..4c324fe61f4a7 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/__mocks__/api.ts @@ -0,0 +1,114 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ActionLicense, + AllCases, + BulkUpdateStatus, + Case, + CasesStatus, + CaseUserActions, + FetchCasesProps, + SortFieldCase, +} from '../types'; +import { + actionLicenses, + allCases, + basicCase, + basicCaseCommentPatch, + basicCasePost, + casesStatus, + caseUserActions, + pushedCase, + respReporters, + tags, +} from '../mock'; +import { + CasePatchRequest, + CasePostRequest, + CommentRequest, + User, + CaseStatuses, +} from '../../../common/api'; + +export const getCase = async ( + caseId: string, + includeComments: boolean = true, + signal: AbortSignal +): Promise<Case> => { + return Promise.resolve(basicCase); +}; + +export const getCasesStatus = async (signal: AbortSignal): Promise<CasesStatus> => + Promise.resolve(casesStatus); + +export const getTags = async (signal: AbortSignal): Promise<string[]> => Promise.resolve(tags); + +export const getReporters = async (signal: AbortSignal): Promise<User[]> => + Promise.resolve(respReporters); + +export const getCaseUserActions = async ( + caseId: string, + signal: AbortSignal +): Promise<CaseUserActions[]> => Promise.resolve(caseUserActions); + +export const getCases = async ({ + filterOptions = { + search: '', + reporters: [], + status: CaseStatuses.open, + tags: [], + }, + queryParams = { + page: 1, + perPage: 5, + sortField: SortFieldCase.createdAt, + sortOrder: 'desc', + }, + signal, +}: FetchCasesProps): Promise<AllCases> => Promise.resolve(allCases); + +export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise<Case> => + Promise.resolve(basicCasePost); + +export const patchCase = async ( + caseId: string, + updatedCase: Pick<CasePatchRequest, 'description' | 'status' | 'tags' | 'title'>, + version: string, + signal: AbortSignal +): Promise<Case[]> => Promise.resolve([basicCase]); + +export const patchCasesStatus = async ( + cases: BulkUpdateStatus[], + signal: AbortSignal +): Promise<Case[]> => Promise.resolve(allCases.cases); + +export const postComment = async ( + newComment: CommentRequest, + caseId: string, + signal: AbortSignal +): Promise<Case> => Promise.resolve(basicCase); + +export const patchComment = async ( + caseId: string, + commentId: string, + commentUpdate: string, + version: string, + signal: AbortSignal +): Promise<Case> => Promise.resolve(basicCaseCommentPatch); + +export const deleteCases = async (caseIds: string[], signal: AbortSignal): Promise<boolean> => + Promise.resolve(true); + +export const pushCase = async ( + caseId: string, + connectorId: string, + signal: AbortSignal +): Promise<Case> => Promise.resolve(pushedCase); + +export const getActionLicense = async (signal: AbortSignal): Promise<ActionLicense[]> => + Promise.resolve(actionLicenses); diff --git a/x-pack/plugins/cases/public/containers/api.test.tsx b/x-pack/plugins/cases/public/containers/api.test.tsx new file mode 100644 index 0000000000000..7d3615a498bc8 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/api.test.tsx @@ -0,0 +1,465 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { KibanaServices } from '../../common/lib/kibana'; + +import { ConnectorTypes, CommentType, CaseStatuses } from '../../common/api'; +import { CASES_URL } from '../../common/constants'; + +import { + deleteCases, + getActionLicense, + getCase, + getCases, + getCasesStatus, + getCaseUserActions, + getReporters, + getTags, + patchCase, + patchCasesStatus, + patchComment, + postCase, + postComment, + pushCase, +} from './api'; + +import { + actionLicenses, + allCases, + basicCase, + allCasesSnake, + basicCaseSnake, + pushedCaseSnake, + casesStatus, + casesSnake, + cases, + caseUserActions, + pushedCase, + reporters, + respReporters, + tags, + caseUserActionsSnake, + casesStatusSnake, +} from './mock'; + +import { DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; + +const abortCtrl = new AbortController(); +const mockKibanaServices = KibanaServices.get as jest.Mock; +jest.mock('../../common/lib/kibana'); + +const fetchMock = jest.fn(); +mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); + +describe('Case Configuration API', () => { + describe('deleteCases', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(''); + }); + const data = ['1', '2']; + + test('check url, method, signal', async () => { + await deleteCases(data, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { + method: 'DELETE', + query: { ids: JSON.stringify(data) }, + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await deleteCases(data, abortCtrl.signal); + expect(resp).toEqual(''); + }); + }); + + describe('getActionLicense', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(actionLicenses); + }); + + test('check url, method, signal', async () => { + await getActionLicense(abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`/api/actions/list_action_types`, { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getActionLicense(abortCtrl.signal); + expect(resp).toEqual(actionLicenses); + }); + }); + + describe('getCase', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(basicCaseSnake); + }); + const data = basicCase.id; + + test('check url, method, signal', async () => { + await getCase(data, true, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}`, { + method: 'GET', + query: { includeComments: true }, + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getCase(data, true, abortCtrl.signal); + expect(resp).toEqual(basicCase); + }); + }); + + describe('getCases', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(allCasesSnake); + }); + test('check url, method, signal', async () => { + await getCases({ + filterOptions: DEFAULT_FILTER_OPTIONS, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { + method: 'GET', + query: { + ...DEFAULT_QUERY_PARAMS, + reporters: [], + tags: [], + }, + signal: abortCtrl.signal, + }); + }); + + test('correctly applies filters', async () => { + await getCases({ + filterOptions: { + ...DEFAULT_FILTER_OPTIONS, + reporters: [...respReporters, { username: null, full_name: null, email: null }], + tags, + status: CaseStatuses.open, + search: 'hello', + }, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { + method: 'GET', + query: { + ...DEFAULT_QUERY_PARAMS, + reporters, + tags: ['"coke"', '"pepsi"'], + search: 'hello', + status: CaseStatuses.open, + }, + signal: abortCtrl.signal, + }); + }); + + test('tags with weird chars get handled gracefully', async () => { + const weirdTags: string[] = ['(', '"double"']; + + await getCases({ + filterOptions: { + ...DEFAULT_FILTER_OPTIONS, + reporters: [...respReporters, { username: null, full_name: null, email: null }], + tags: weirdTags, + status: CaseStatuses.open, + search: 'hello', + }, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { + method: 'GET', + query: { + ...DEFAULT_QUERY_PARAMS, + reporters, + tags: ['"("', '"\\"double\\""'], + search: 'hello', + status: CaseStatuses.open, + }, + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getCases({ + filterOptions: DEFAULT_FILTER_OPTIONS, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + expect(resp).toEqual({ ...allCases }); + }); + }); + + describe('getCasesStatus', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(casesStatusSnake); + }); + test('check url, method, signal', async () => { + await getCasesStatus(abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/status`, { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getCasesStatus(abortCtrl.signal); + expect(resp).toEqual(casesStatus); + }); + }); + + describe('getCaseUserActions', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(caseUserActionsSnake); + }); + + test('check url, method, signal', async () => { + await getCaseUserActions(basicCase.id, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}/user_actions`, { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getCaseUserActions(basicCase.id, abortCtrl.signal); + expect(resp).toEqual(caseUserActions); + }); + }); + + describe('getReporters', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(respReporters); + }); + + test('check url, method, signal', async () => { + await getReporters(abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/reporters`, { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getReporters(abortCtrl.signal); + expect(resp).toEqual(respReporters); + }); + }); + + describe('getTags', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(tags); + }); + + test('check url, method, signal', async () => { + await getTags(abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/tags`, { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getTags(abortCtrl.signal); + expect(resp).toEqual(tags); + }); + }); + + describe('patchCase', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue([basicCaseSnake]); + }); + const data = { description: 'updated description' }; + test('check url, method, signal', async () => { + await patchCase(basicCase.id, data, basicCase.version, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { + method: 'PATCH', + body: JSON.stringify({ + cases: [{ ...data, id: basicCase.id, version: basicCase.version }], + }), + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await patchCase( + basicCase.id, + { description: 'updated description' }, + basicCase.version, + abortCtrl.signal + ); + expect(resp).toEqual({ ...[basicCase] }); + }); + }); + + describe('patchCasesStatus', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(casesSnake); + }); + const data = [ + { + status: CaseStatuses.closed, + id: basicCase.id, + version: basicCase.version, + }, + ]; + + test('check url, method, signal', async () => { + await patchCasesStatus(data, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { + method: 'PATCH', + body: JSON.stringify({ cases: data }), + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await patchCasesStatus(data, abortCtrl.signal); + expect(resp).toEqual({ ...cases }); + }); + }); + + describe('patchComment', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(basicCaseSnake); + }); + + test('check url, method, signal', async () => { + await patchComment( + basicCase.id, + basicCase.comments[0].id, + 'updated comment', + basicCase.comments[0].version, + abortCtrl.signal + ); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}/comments`, { + method: 'PATCH', + body: JSON.stringify({ + comment: 'updated comment', + type: CommentType.user, + id: basicCase.comments[0].id, + version: basicCase.comments[0].version, + }), + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await patchComment( + basicCase.id, + basicCase.comments[0].id, + 'updated comment', + basicCase.comments[0].version, + abortCtrl.signal + ); + expect(resp).toEqual(basicCase); + }); + }); + + describe('postCase', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(basicCaseSnake); + }); + const data = { + description: 'description', + tags: ['tag'], + title: 'title', + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + settings: { + syncAlerts: true, + }, + }; + + test('check url, method, signal', async () => { + await postCase(data, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { + method: 'POST', + body: JSON.stringify(data), + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await postCase(data, abortCtrl.signal); + expect(resp).toEqual(basicCase); + }); + }); + + describe('postComment', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(basicCaseSnake); + }); + const data = { + comment: 'comment', + type: CommentType.user as const, + }; + + test('check url, method, signal', async () => { + await postComment(data, basicCase.id, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}/comments`, { + method: 'POST', + body: JSON.stringify(data), + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await postComment(data, basicCase.id, abortCtrl.signal); + expect(resp).toEqual(basicCase); + }); + }); + + describe('pushCase', () => { + const connectorId = 'connectorId'; + + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(pushedCaseSnake); + }); + + test('check url, method, signal', async () => { + await pushCase(basicCase.id, connectorId, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith( + `${CASES_URL}/${basicCase.id}/connector/${connectorId}/_push`, + { + method: 'POST', + body: JSON.stringify({}), + signal: abortCtrl.signal, + } + ); + }); + + test('happy path', async () => { + const resp = await pushCase(basicCase.id, connectorId, abortCtrl.signal); + expect(resp).toEqual(pushedCase); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts new file mode 100644 index 0000000000000..3baf0f32f7105 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -0,0 +1,347 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { assign, omit } from 'lodash'; + +import { + CasePatchRequest, + CasePostRequest, + CaseResponse, + CasesFindResponse, + CasesResponse, + CasesStatusResponse, + CaseType, + CaseUserActionsResponse, + CommentRequest, + CommentType, + SubCasePatchRequest, + SubCaseResponse, + SubCasesResponse, + User, +} from '../../common/api'; + +import { + ACTION_TYPES_URL, + CASE_REPORTERS_URL, + CASE_STATUS_URL, + CASE_TAGS_URL, + CASES_URL, + SUB_CASE_DETAILS_URL, + SUB_CASES_PATCH_DEL_URL, +} from '../../common/constants'; + +import { + getCaseCommentsUrl, + getCasePushUrl, + getCaseDetailsUrl, + getCaseUserActionUrl, + getSubCaseDetailsUrl, + getSubCaseUserActionUrl, +} from '../../common/api/helpers'; + +import { KibanaServices } from '../common/services'; +import { StatusAll } from '../components/status'; + +import { + ActionLicense, + AllCases, + BulkUpdateStatus, + Case, + CasesStatus, + FetchCasesProps, + SortFieldCase, + CaseUserActions, +} from './types'; + +import { + convertToCamelCase, + convertAllCasesToCamel, + convertArrayToCamelCase, + decodeCaseResponse, + decodeCasesResponse, + decodeCasesFindResponse, + decodeCasesStatusResponse, + decodeCaseUserActionsResponse, +} from './utils'; + +export const getCase = async ( + caseId: string, + includeComments: boolean = true, + signal: AbortSignal +): Promise<Case> => { + const response = await KibanaServices.get().http.fetch<CaseResponse>(getCaseDetailsUrl(caseId), { + method: 'GET', + query: { + includeComments, + }, + signal, + }); + return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); +}; + +export const getSubCase = async ( + caseId: string, + subCaseId: string, + includeComments: boolean = true, + signal: AbortSignal +): Promise<Case> => { + const [caseResponse, subCaseResponse] = await Promise.all([ + KibanaServices.get().http.fetch<CaseResponse>(getCaseDetailsUrl(caseId), { + method: 'GET', + query: { + includeComments: false, + }, + signal, + }), + KibanaServices.get().http.fetch<SubCaseResponse>(getSubCaseDetailsUrl(caseId, subCaseId), { + method: 'GET', + query: { + includeComments, + }, + signal, + }), + ]); + const response = assign<CaseResponse, SubCaseResponse>(caseResponse, subCaseResponse); + const subCaseIndex = response.subCaseIds?.findIndex((scId) => scId === response.id) ?? -1; + response.title = `${response.title}${subCaseIndex >= 0 ? ` ${subCaseIndex + 1}` : ''}`; + return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); +}; + +export const getCasesStatus = async (signal: AbortSignal): Promise<CasesStatus> => { + const response = await KibanaServices.get().http.fetch<CasesStatusResponse>(CASE_STATUS_URL, { + method: 'GET', + signal, + }); + return convertToCamelCase<CasesStatusResponse, CasesStatus>(decodeCasesStatusResponse(response)); +}; + +export const getTags = async (signal: AbortSignal): Promise<string[]> => { + const response = await KibanaServices.get().http.fetch<string[]>(CASE_TAGS_URL, { + method: 'GET', + signal, + }); + return response ?? []; +}; + +export const getReporters = async (signal: AbortSignal): Promise<User[]> => { + const response = await KibanaServices.get().http.fetch<User[]>(CASE_REPORTERS_URL, { + method: 'GET', + signal, + }); + return response ?? []; +}; + +export const getCaseUserActions = async ( + caseId: string, + signal: AbortSignal +): Promise<CaseUserActions[]> => { + const response = await KibanaServices.get().http.fetch<CaseUserActionsResponse>( + getCaseUserActionUrl(caseId), + { + method: 'GET', + signal, + } + ); + return convertArrayToCamelCase(decodeCaseUserActionsResponse(response)) as CaseUserActions[]; +}; + +export const getSubCaseUserActions = async ( + caseId: string, + subCaseId: string, + signal: AbortSignal +): Promise<CaseUserActions[]> => { + const response = await KibanaServices.get().http.fetch<CaseUserActionsResponse>( + getSubCaseUserActionUrl(caseId, subCaseId), + { + method: 'GET', + signal, + } + ); + return convertArrayToCamelCase(decodeCaseUserActionsResponse(response)) as CaseUserActions[]; +}; + +export const getCases = async ({ + filterOptions = { + onlyCollectionType: false, + search: '', + reporters: [], + status: StatusAll, + tags: [], + }, + queryParams = { + page: 1, + perPage: 20, + sortField: SortFieldCase.createdAt, + sortOrder: 'desc', + }, + signal, +}: FetchCasesProps): Promise<AllCases> => { + const query = { + reporters: filterOptions.reporters.map((r) => r.username ?? '').filter((r) => r !== ''), + tags: filterOptions.tags.map((t) => `"${t.replace(/"/g, '\\"')}"`), + status: filterOptions.status, + ...(filterOptions.search.length > 0 ? { search: filterOptions.search } : {}), + ...(filterOptions.onlyCollectionType ? { type: CaseType.collection } : {}), + ...queryParams, + }; + const response = await KibanaServices.get().http.fetch<CasesFindResponse>(`${CASES_URL}/_find`, { + method: 'GET', + query: query.status === StatusAll ? omit(query, ['status']) : query, + signal, + }); + return convertAllCasesToCamel(decodeCasesFindResponse(response)); +}; + +export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise<Case> => { + const response = await KibanaServices.get().http.fetch<CaseResponse>(CASES_URL, { + method: 'POST', + body: JSON.stringify(newCase), + signal, + }); + return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); +}; + +export const patchCase = async ( + caseId: string, + updatedCase: Pick< + CasePatchRequest, + 'description' | 'status' | 'tags' | 'title' | 'settings' | 'connector' + >, + version: string, + signal: AbortSignal +): Promise<Case[]> => { + const response = await KibanaServices.get().http.fetch<CasesResponse>(CASES_URL, { + method: 'PATCH', + body: JSON.stringify({ cases: [{ ...updatedCase, id: caseId, version }] }), + signal, + }); + return convertToCamelCase<CasesResponse, Case[]>(decodeCasesResponse(response)); +}; + +export const patchSubCase = async ( + caseId: string, + subCaseId: string, + updatedSubCase: Pick<SubCasePatchRequest, 'status'>, + version: string, + signal: AbortSignal +): Promise<Case[]> => { + const subCaseResponse = await KibanaServices.get().http.fetch<SubCasesResponse>( + SUB_CASE_DETAILS_URL, + { + method: 'PATCH', + body: JSON.stringify({ cases: [{ ...updatedSubCase, id: caseId, version }] }), + signal, + } + ); + const caseResponse = await KibanaServices.get().http.fetch<CaseResponse>( + getCaseDetailsUrl(caseId), + { + method: 'GET', + query: { + includeComments: false, + }, + signal, + } + ); + const response = subCaseResponse.map((subCaseResp) => assign(caseResponse, subCaseResp)); + return convertToCamelCase<CasesResponse, Case[]>(decodeCasesResponse(response)); +}; + +export const patchCasesStatus = async ( + cases: BulkUpdateStatus[], + signal: AbortSignal +): Promise<Case[]> => { + const response = await KibanaServices.get().http.fetch<CasesResponse>(CASES_URL, { + method: 'PATCH', + body: JSON.stringify({ cases }), + signal, + }); + return convertToCamelCase<CasesResponse, Case[]>(decodeCasesResponse(response)); +}; + +export const postComment = async ( + newComment: CommentRequest, + caseId: string, + signal: AbortSignal, + subCaseId?: string +): Promise<Case> => { + const response = await KibanaServices.get().http.fetch<CaseResponse>( + `${CASES_URL}/${caseId}/comments`, + { + method: 'POST', + body: JSON.stringify(newComment), + ...(subCaseId ? { query: { subCaseId } } : {}), + signal, + } + ); + return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); +}; + +export const patchComment = async ( + caseId: string, + commentId: string, + commentUpdate: string, + version: string, + signal: AbortSignal, + subCaseId?: string +): Promise<Case> => { + const response = await KibanaServices.get().http.fetch<CaseResponse>(getCaseCommentsUrl(caseId), { + method: 'PATCH', + body: JSON.stringify({ + comment: commentUpdate, + type: CommentType.user, + id: commentId, + version, + }), + ...(subCaseId ? { query: { subCaseId } } : {}), + signal, + }); + return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); +}; + +export const deleteCases = async (caseIds: string[], signal: AbortSignal): Promise<string> => { + const response = await KibanaServices.get().http.fetch<string>(CASES_URL, { + method: 'DELETE', + query: { ids: JSON.stringify(caseIds) }, + signal, + }); + return response; +}; + +export const deleteSubCases = async (caseIds: string[], signal: AbortSignal): Promise<string> => { + const response = await KibanaServices.get().http.fetch<string>(SUB_CASES_PATCH_DEL_URL, { + method: 'DELETE', + query: { ids: JSON.stringify(caseIds) }, + signal, + }); + return response; +}; + +export const pushCase = async ( + caseId: string, + connectorId: string, + signal: AbortSignal +): Promise<Case> => { + const response = await KibanaServices.get().http.fetch<CaseResponse>( + getCasePushUrl(caseId, connectorId), + { + method: 'POST', + body: JSON.stringify({}), + signal, + } + ); + + return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); +}; + +export const getActionLicense = async (signal: AbortSignal): Promise<ActionLicense[]> => { + const response = await KibanaServices.get().http.fetch<ActionLicense[]>(ACTION_TYPES_URL, { + method: 'GET', + signal, + }); + return response; +}; diff --git a/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts b/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts new file mode 100644 index 0000000000000..10cfde0c5ef9c --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + CasesConfigurePatch, + CasesConfigureRequest, + ActionConnector, + ActionTypeConnector, +} from '../../../../common/api'; + +import { ApiProps } from '../../types'; +import { CaseConfigure } from '../types'; +import { connectorsMock, caseConfigurationCamelCaseResponseMock, actionTypesMock } from '../mock'; + +export const fetchConnectors = async ({ signal }: ApiProps): Promise<ActionConnector[]> => + Promise.resolve(connectorsMock); + +export const getCaseConfigure = async ({ signal }: ApiProps): Promise<CaseConfigure> => + Promise.resolve(caseConfigurationCamelCaseResponseMock); + +export const postCaseConfigure = async ( + caseConfiguration: CasesConfigureRequest, + signal: AbortSignal +): Promise<CaseConfigure> => Promise.resolve(caseConfigurationCamelCaseResponseMock); + +export const patchCaseConfigure = async ( + caseConfiguration: CasesConfigurePatch, + signal: AbortSignal +): Promise<CaseConfigure> => Promise.resolve(caseConfigurationCamelCaseResponseMock); + +export const fetchActionTypes = async ({ signal }: ApiProps): Promise<ActionTypeConnector[]> => + Promise.resolve(actionTypesMock); diff --git a/x-pack/plugins/cases/public/containers/configure/api.test.ts b/x-pack/plugins/cases/public/containers/configure/api.test.ts new file mode 100644 index 0000000000000..08bda07814711 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/api.test.ts @@ -0,0 +1,154 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { KibanaServices } from '../../../common/lib/kibana'; +import { + fetchConnectors, + getCaseConfigure, + postCaseConfigure, + patchCaseConfigure, + fetchActionTypes, +} from './api'; +import { + connectorsMock, + actionTypesMock, + caseConfigurationMock, + caseConfigurationResposeMock, + caseConfigurationCamelCaseResponseMock, +} from './mock'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +const abortCtrl = new AbortController(); +const mockKibanaServices = KibanaServices.get as jest.Mock; +jest.mock('../../../common/lib/kibana'); + +const fetchMock = jest.fn(); +mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); + +describe('Case Configuration API', () => { + describe('fetch connectors', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(connectorsMock); + }); + + test('check url, method, signal', async () => { + await fetchConnectors({ signal: abortCtrl.signal }); + expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure/connectors/_find', { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await fetchConnectors({ signal: abortCtrl.signal }); + expect(resp).toEqual(connectorsMock); + }); + }); + + describe('fetch configuration', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(caseConfigurationResposeMock); + }); + + test('check url, method, signal', async () => { + await getCaseConfigure({ signal: abortCtrl.signal }); + expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await getCaseConfigure({ signal: abortCtrl.signal }); + expect(resp).toEqual(caseConfigurationCamelCaseResponseMock); + }); + + test('return null on empty response', async () => { + fetchMock.mockResolvedValue({}); + const resp = await getCaseConfigure({ signal: abortCtrl.signal }); + expect(resp).toBe(null); + }); + }); + + describe('create configuration', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(caseConfigurationResposeMock); + }); + + test('check url, body, method, signal', async () => { + await postCaseConfigure(caseConfigurationMock, abortCtrl.signal); + expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { + body: + '{"connector":{"id":"123","name":"My connector","type":".jira","fields":null},"closure_type":"close-by-user"}', + method: 'POST', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await postCaseConfigure(caseConfigurationMock, abortCtrl.signal); + expect(resp).toEqual(caseConfigurationCamelCaseResponseMock); + }); + }); + + describe('update configuration', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(caseConfigurationResposeMock); + }); + + test('check url, body, method, signal', async () => { + await patchCaseConfigure( + { + connector: { id: '456', name: 'My Connector 2', type: ConnectorTypes.none, fields: null }, + version: 'WzHJ12', + }, + abortCtrl.signal + ); + expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { + body: + '{"connector":{"id":"456","name":"My Connector 2","type":".none","fields":null},"version":"WzHJ12"}', + method: 'PATCH', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await patchCaseConfigure( + { + connector: { id: '456', name: 'My Connector 2', type: ConnectorTypes.none, fields: null }, + version: 'WzHJ12', + }, + abortCtrl.signal + ); + expect(resp).toEqual(caseConfigurationCamelCaseResponseMock); + }); + }); + + describe('fetch actionTypes', () => { + beforeEach(() => { + fetchMock.mockClear(); + fetchMock.mockResolvedValue(actionTypesMock); + }); + + test('check url, method, signal', async () => { + await fetchActionTypes({ signal: abortCtrl.signal }); + expect(fetchMock).toHaveBeenCalledWith('/api/actions/list_action_types', { + method: 'GET', + signal: abortCtrl.signal, + }); + }); + + test('happy path', async () => { + const resp = await fetchActionTypes({ signal: abortCtrl.signal }); + expect(resp).toEqual(actionTypesMock); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/configure/api.ts b/x-pack/plugins/cases/public/containers/configure/api.ts new file mode 100644 index 0000000000000..d92906c9c2ab3 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/api.ts @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty } from 'lodash/fp'; +import { + ActionConnector, + ActionTypeConnector, + CasesConfigurePatch, + CasesConfigureResponse, + CasesConfigureRequest, +} from '../../../common/api'; +import { KibanaServices } from '../../../common/lib/kibana'; + +import { + CASE_CONFIGURE_CONNECTORS_URL, + CASE_CONFIGURE_URL, + ACTION_TYPES_URL, +} from '../../../common/constants'; + +import { ApiProps } from '../types'; +import { convertToCamelCase, decodeCaseConfigureResponse } from '../utils'; +import { CaseConfigure } from './types'; + +export const fetchConnectors = async ({ signal }: ApiProps): Promise<ActionConnector[]> => { + const response = await KibanaServices.get().http.fetch(`${CASE_CONFIGURE_CONNECTORS_URL}/_find`, { + method: 'GET', + signal, + }); + + return response; +}; + +export const getCaseConfigure = async ({ signal }: ApiProps): Promise<CaseConfigure | null> => { + const response = await KibanaServices.get().http.fetch<CasesConfigureResponse>( + CASE_CONFIGURE_URL, + { + method: 'GET', + signal, + } + ); + + return !isEmpty(response) + ? convertToCamelCase<CasesConfigureResponse, CaseConfigure>( + decodeCaseConfigureResponse(response) + ) + : null; +}; + +export const getConnectorMappings = async ({ signal }: ApiProps): Promise<ActionConnector[]> => { + const response = await KibanaServices.get().http.fetch(`${CASE_CONFIGURE_CONNECTORS_URL}/_find`, { + method: 'GET', + signal, + }); + + return response; +}; + +export const postCaseConfigure = async ( + caseConfiguration: CasesConfigureRequest, + signal: AbortSignal +): Promise<CaseConfigure> => { + const response = await KibanaServices.get().http.fetch<CasesConfigureResponse>( + CASE_CONFIGURE_URL, + { + method: 'POST', + body: JSON.stringify(caseConfiguration), + signal, + } + ); + return convertToCamelCase<CasesConfigureResponse, CaseConfigure>( + decodeCaseConfigureResponse(response) + ); +}; + +export const patchCaseConfigure = async ( + caseConfiguration: CasesConfigurePatch, + signal: AbortSignal +): Promise<CaseConfigure> => { + const response = await KibanaServices.get().http.fetch<CasesConfigureResponse>( + CASE_CONFIGURE_URL, + { + method: 'PATCH', + body: JSON.stringify(caseConfiguration), + signal, + } + ); + return convertToCamelCase<CasesConfigureResponse, CaseConfigure>( + decodeCaseConfigureResponse(response) + ); +}; + +export const fetchActionTypes = async ({ signal }: ApiProps): Promise<ActionTypeConnector[]> => { + const response = await KibanaServices.get().http.fetch(ACTION_TYPES_URL, { + method: 'GET', + signal, + }); + + return response; +}; diff --git a/x-pack/plugins/cases/public/containers/configure/mock.ts b/x-pack/plugins/cases/public/containers/configure/mock.ts new file mode 100644 index 0000000000000..16f4f5cda5d50 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/mock.ts @@ -0,0 +1,160 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ActionConnector, + ActionTypeConnector, + CasesConfigureResponse, + CasesConfigureRequest, + ConnectorTypes, +} from '../../../common/api'; +import { CaseConfigure, CaseConnectorMapping } from './types'; + +export const mappings: CaseConnectorMapping[] = [ + { + source: 'title', + target: 'short_description', + actionType: 'overwrite', + }, + { + source: 'description', + target: 'description', + actionType: 'overwrite', + }, + { + source: 'comments', + target: 'comments', + actionType: 'append', + }, +]; + +export const connectorsMock: ActionConnector[] = [ + { + id: 'servicenow-1', + actionTypeId: '.servicenow', + name: 'My Connector', + config: { + apiUrl: 'https://instance1.service-now.com', + }, + isPreconfigured: false, + }, + { + id: 'resilient-2', + actionTypeId: '.resilient', + name: 'My Connector 2', + config: { + apiUrl: 'https://test/', + orgId: '201', + }, + isPreconfigured: false, + }, + { + id: 'jira-1', + actionTypeId: '.jira', + name: 'Jira', + config: { + apiUrl: 'https://instance.atlassian.ne', + }, + isPreconfigured: false, + }, + { + id: 'servicenow-sir', + actionTypeId: '.servicenow-sir', + name: 'My Connector SIR', + config: { + apiUrl: 'https://instance1.service-now.com', + }, + isPreconfigured: false, + }, +]; + +export const actionTypesMock: ActionTypeConnector[] = [ + { + id: '.email', + name: 'Email', + minimumLicenseRequired: 'gold', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }, + { + id: '.index', + name: 'Index', + minimumLicenseRequired: 'basic', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }, + { + id: '.servicenow', + name: 'ServiceNow', + minimumLicenseRequired: 'platinum', + enabled: false, + enabledInConfig: true, + enabledInLicense: true, + }, + { + id: '.jira', + name: 'Jira', + minimumLicenseRequired: 'gold', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }, + { + id: '.resilient', + name: 'IBM Resilient', + minimumLicenseRequired: 'platinum', + enabled: false, + enabledInConfig: true, + enabledInLicense: true, + }, +]; + +export const caseConfigurationResposeMock: CasesConfigureResponse = { + created_at: '2020-04-06T13:03:18.657Z', + created_by: { username: 'elastic', full_name: 'Elastic', email: 'elastic@elastic.co' }, + connector: { + id: '123', + name: 'My connector', + type: ConnectorTypes.jira, + fields: null, + }, + closure_type: 'close-by-pushing', + error: null, + mappings: [], + updated_at: '2020-04-06T14:03:18.657Z', + updated_by: { username: 'elastic', full_name: 'Elastic', email: 'elastic@elastic.co' }, + version: 'WzHJ12', +}; + +export const caseConfigurationMock: CasesConfigureRequest = { + connector: { + id: '123', + name: 'My connector', + type: ConnectorTypes.jira, + fields: null, + }, + closure_type: 'close-by-user', +}; + +export const caseConfigurationCamelCaseResponseMock: CaseConfigure = { + createdAt: '2020-04-06T13:03:18.657Z', + createdBy: { username: 'elastic', fullName: 'Elastic', email: 'elastic@elastic.co' }, + connector: { + id: '123', + name: 'My connector', + type: ConnectorTypes.jira, + fields: null, + }, + closureType: 'close-by-pushing', + error: null, + mappings: [], + updatedAt: '2020-04-06T14:03:18.657Z', + updatedBy: { username: 'elastic', fullName: 'Elastic', email: 'elastic@elastic.co' }, + version: 'WzHJ12', +}; diff --git a/x-pack/plugins/cases/public/containers/configure/translations.ts b/x-pack/plugins/cases/public/containers/configure/translations.ts new file mode 100644 index 0000000000000..455293b217679 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/translations.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../translations'; + +export const SUCCESS_CONFIGURE = i18n.translate( + 'xpack.securitySolution.cases.configure.successSaveToast', + { + defaultMessage: 'Saved external connection settings', + } +); diff --git a/x-pack/plugins/cases/public/containers/configure/types.ts b/x-pack/plugins/cases/public/containers/configure/types.ts new file mode 100644 index 0000000000000..23d2846f76bcf --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/types.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticUser } from '../types'; +import { + ActionConnector, + ActionTypeConnector, + ActionType, + CaseConnector, + CaseField, + CasesConfigure, + ClosureType, + ThirdPartyField, +} from '../../../common/api'; + +export { + ActionConnector, + ActionTypeConnector, + ActionType, + CaseConnector, + CaseField, + ClosureType, + ThirdPartyField, +}; + +export interface CaseConnectorMapping { + actionType: ActionType; + source: CaseField; + target: string; +} + +export interface CaseConfigure { + closureType: ClosureType; + connector: CasesConfigure['connector']; + createdAt: string; + createdBy: ElasticUser; + error: string | null; + mappings: CaseConnectorMapping[]; + updatedAt: string; + updatedBy: ElasticUser; + version: string; +} diff --git a/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx new file mode 100644 index 0000000000000..25017f7931db8 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useActionTypes, UseActionTypesResponse } from './use_action_types'; +import { actionTypesMock } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useActionTypes', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => + useActionTypes() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + loading: true, + actionTypes: [], + refetchActionTypes: result.current.refetchActionTypes, + }); + }); + }); + + test('fetch action types', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => + useActionTypes() + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + loading: false, + actionTypes: actionTypesMock, + refetchActionTypes: result.current.refetchActionTypes, + }); + }); + }); + + test('refetch actionTypes', async () => { + const spyOnfetchActionTypes = jest.spyOn(api, 'fetchActionTypes'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => + useActionTypes() + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + result.current.refetchActionTypes(); + expect(spyOnfetchActionTypes).toHaveBeenCalledTimes(2); + }); + }); + + test('set isLoading to true when refetching actionTypes', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => + useActionTypes() + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + result.current.refetchActionTypes(); + + expect(result.current.loading).toBe(true); + }); + }); + + test('unhappy path', async () => { + const spyOnfetchActionTypes = jest.spyOn(api, 'fetchActionTypes'); + spyOnfetchActionTypes.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => + useActionTypes() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + loading: false, + actionTypes: [], + refetchActionTypes: result.current.refetchActionTypes, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx b/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx new file mode 100644 index 0000000000000..3590fffdef5b2 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useCallback, useRef } from 'react'; + +import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; +import * as i18n from '../translations'; +import { fetchActionTypes } from './api'; +import { ActionTypeConnector } from './types'; + +export interface UseActionTypesResponse { + loading: boolean; + actionTypes: ActionTypeConnector[]; + refetchActionTypes: () => void; +} + +export const useActionTypes = (): UseActionTypesResponse => { + const [, dispatchToaster] = useStateToaster(); + const [loading, setLoading] = useState(true); + const [actionTypes, setActionTypes] = useState<ActionTypeConnector[]>([]); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + const queryFirstTime = useRef(true); + + const refetchActionTypes = useCallback(async () => { + try { + setLoading(true); + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + + const res = await fetchActionTypes({ signal: abortCtrlRef.current.signal }); + + if (!isCancelledRef.current) { + setLoading(false); + setActionTypes(res); + } + } catch (error) { + if (!isCancelledRef.current) { + setLoading(false); + setActionTypes([]); + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + } + }, [dispatchToaster]); + + useEffect(() => { + if (queryFirstTime.current) { + refetchActionTypes(); + queryFirstTime.current = false; + } + + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + queryFirstTime.current = true; + }; + }, [refetchActionTypes]); + + return { + loading, + actionTypes, + refetchActionTypes, + }; +}; diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx new file mode 100644 index 0000000000000..8d726e3f72c01 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx @@ -0,0 +1,326 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { + initialState, + useCaseConfigure, + ReturnUseCaseConfigure, + ConnectorConfiguration, +} from './use_configure'; +import { mappings, caseConfigurationCamelCaseResponseMock } from './mock'; +import * as api from './api'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +jest.mock('./api'); +const mockErrorToToaster = jest.fn(); +jest.mock('../../../common/components/toasters', () => { + const original = jest.requireActual('../../../common/components/toasters'); + return { + ...original, + errorToToaster: () => mockErrorToToaster(), + }; +}); +const configuration: ConnectorConfiguration = { + connector: { + id: '456', + name: 'My connector 2', + type: ConnectorTypes.none, + fields: null, + }, + closureType: 'close-by-pushing', +}; + +describe('useConfigure', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + ...initialState, + refetchCaseConfigure: result.current.refetchCaseConfigure, + persistCaseConfigure: result.current.persistCaseConfigure, + setCurrentConfiguration: result.current.setCurrentConfiguration, + setConnector: result.current.setConnector, + setClosureType: result.current.setClosureType, + setMappings: result.current.setMappings, + }); + }); + }); + + test('fetch case configuration', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + ...initialState, + closureType: caseConfigurationCamelCaseResponseMock.closureType, + connector: caseConfigurationCamelCaseResponseMock.connector, + currentConfiguration: { + closureType: caseConfigurationCamelCaseResponseMock.closureType, + connector: caseConfigurationCamelCaseResponseMock.connector, + }, + mappings: [], + firstLoad: true, + loading: false, + persistCaseConfigure: result.current.persistCaseConfigure, + refetchCaseConfigure: result.current.refetchCaseConfigure, + setClosureType: result.current.setClosureType, + setConnector: result.current.setConnector, + setCurrentConfiguration: result.current.setCurrentConfiguration, + setMappings: result.current.setMappings, + version: caseConfigurationCamelCaseResponseMock.version, + }); + }); + }); + + test('refetch case configuration', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.refetchCaseConfigure(); + expect(spyOnGetCaseConfigure).toHaveBeenCalledTimes(2); + }); + }); + + test('correctly sets mappings', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current.mappings).toEqual([]); + result.current.setMappings(mappings); + expect(result.current.mappings).toEqual(mappings); + }); + }); + + test('set isLoading to true when fetching case configuration', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.refetchCaseConfigure(); + + expect(result.current.loading).toBe(true); + }); + }); + + test('persist case configuration', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.persistCaseConfigure(configuration); + expect(result.current.persistLoading).toBeTruthy(); + }); + }); + + test('save case configuration - postCaseConfigure', async () => { + // When there is no version, a configuration is created. Otherwise is updated. + const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); + spyOnGetCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + version: '', + }) + ); + + const spyOnPostCaseConfigure = jest.spyOn(api, 'postCaseConfigure'); + spyOnPostCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + ...configuration, + }) + ); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(mockErrorToToaster).not.toHaveBeenCalled(); + + result.current.persistCaseConfigure(configuration); + + expect(result.current.connector.id).toEqual('123'); + await waitForNextUpdate(); + expect(result.current.connector.id).toEqual('456'); + }); + }); + + test('Displays error when present - getCaseConfigure', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); + spyOnGetCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + error: 'uh oh homeboy', + version: '', + }) + ); + + await act(async () => { + const { waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(mockErrorToToaster).toHaveBeenCalled(); + }); + }); + + test('Displays error when present - postCaseConfigure', async () => { + // When there is no version, a configuration is created. Otherwise is updated. + const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); + spyOnGetCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + version: '', + }) + ); + + const spyOnPostCaseConfigure = jest.spyOn(api, 'postCaseConfigure'); + spyOnPostCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + ...configuration, + error: 'uh oh homeboy', + }) + ); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(mockErrorToToaster).not.toHaveBeenCalled(); + + result.current.persistCaseConfigure(configuration); + expect(mockErrorToToaster).not.toHaveBeenCalled(); + await waitForNextUpdate(); + expect(mockErrorToToaster).toHaveBeenCalled(); + }); + }); + + test('save case configuration - patchCaseConfigure', async () => { + const spyOnPatchCaseConfigure = jest.spyOn(api, 'patchCaseConfigure'); + spyOnPatchCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + ...configuration, + }) + ); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + result.current.persistCaseConfigure(configuration); + + expect(result.current.connector.id).toEqual('123'); + await waitForNextUpdate(); + expect(result.current.connector.id).toEqual('456'); + }); + }); + + test('unhappy path - fetch case configuration', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); + spyOnGetCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + ...initialState, + loading: false, + persistCaseConfigure: result.current.persistCaseConfigure, + persistLoading: false, + refetchCaseConfigure: result.current.refetchCaseConfigure, + setClosureType: result.current.setClosureType, + setConnector: result.current.setConnector, + setCurrentConfiguration: result.current.setCurrentConfiguration, + setMappings: result.current.setMappings, + }); + }); + }); + + test('unhappy path - persist case configuration', async () => { + const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); + spyOnGetCaseConfigure.mockImplementation(() => + Promise.resolve({ + ...caseConfigurationCamelCaseResponseMock, + version: '', + }) + ); + const spyOnPostCaseConfigure = jest.spyOn(api, 'postCaseConfigure'); + spyOnPostCaseConfigure.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => + useCaseConfigure() + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + result.current.persistCaseConfigure(configuration); + + expect(result.current).toEqual({ + ...initialState, + closureType: caseConfigurationCamelCaseResponseMock.closureType, + connector: caseConfigurationCamelCaseResponseMock.connector, + currentConfiguration: { + closureType: caseConfigurationCamelCaseResponseMock.closureType, + connector: caseConfigurationCamelCaseResponseMock.connector, + }, + firstLoad: true, + loading: false, + mappings: [], + persistCaseConfigure: result.current.persistCaseConfigure, + refetchCaseConfigure: result.current.refetchCaseConfigure, + setClosureType: result.current.setClosureType, + setConnector: result.current.setConnector, + setCurrentConfiguration: result.current.setCurrentConfiguration, + setMappings: result.current.setMappings, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx new file mode 100644 index 0000000000000..f1b06bbd7860c --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx @@ -0,0 +1,365 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useCallback, useReducer, useRef } from 'react'; +import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; + +import { + useStateToaster, + errorToToaster, + displaySuccessToast, +} from '../../../common/components/toasters'; +import * as i18n from './translations'; +import { ClosureType, CaseConfigure, CaseConnector, CaseConnectorMapping } from './types'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +export type ConnectorConfiguration = { connector: CaseConnector } & { + closureType: CaseConfigure['closureType']; +}; + +export interface State extends ConnectorConfiguration { + currentConfiguration: ConnectorConfiguration; + firstLoad: boolean; + loading: boolean; + mappings: CaseConnectorMapping[]; + persistLoading: boolean; + version: string; +} +export type Action = + | { + type: 'setCurrentConfiguration'; + currentConfiguration: ConnectorConfiguration; + } + | { + type: 'setConnector'; + connector: CaseConnector; + } + | { + type: 'setLoading'; + payload: boolean; + } + | { + type: 'setFirstLoad'; + payload: boolean; + } + | { + type: 'setPersistLoading'; + payload: boolean; + } + | { + type: 'setVersion'; + payload: string; + } + | { + type: 'setClosureType'; + closureType: ClosureType; + } + | { + type: 'setMappings'; + mappings: CaseConnectorMapping[]; + }; + +export const configureCasesReducer = (state: State, action: Action) => { + switch (action.type) { + case 'setLoading': + return { + ...state, + loading: action.payload, + }; + case 'setFirstLoad': + return { + ...state, + firstLoad: action.payload, + }; + case 'setPersistLoading': + return { + ...state, + persistLoading: action.payload, + }; + case 'setVersion': + return { + ...state, + version: action.payload, + }; + case 'setCurrentConfiguration': { + return { + ...state, + currentConfiguration: { ...action.currentConfiguration }, + }; + } + case 'setConnector': { + return { + ...state, + connector: action.connector, + }; + } + case 'setClosureType': { + return { + ...state, + closureType: action.closureType, + }; + } + case 'setMappings': { + return { + ...state, + mappings: action.mappings, + }; + } + default: + return state; + } +}; + +export interface ReturnUseCaseConfigure extends State { + persistCaseConfigure: ({ connector, closureType }: ConnectorConfiguration) => unknown; + refetchCaseConfigure: () => void; + setClosureType: (closureType: ClosureType) => void; + setConnector: (connector: CaseConnector) => void; + setCurrentConfiguration: (configuration: ConnectorConfiguration) => void; + setMappings: (newMapping: CaseConnectorMapping[]) => void; +} + +export const initialState: State = { + closureType: 'close-by-user', + connector: { + fields: null, + id: 'none', + name: 'none', + type: ConnectorTypes.none, + }, + currentConfiguration: { + closureType: 'close-by-user', + connector: { + fields: null, + id: 'none', + name: 'none', + type: ConnectorTypes.none, + }, + }, + firstLoad: false, + loading: true, + mappings: [], + persistLoading: false, + version: '', +}; + +export const useCaseConfigure = (): ReturnUseCaseConfigure => { + const [state, dispatch] = useReducer(configureCasesReducer, initialState); + + const setCurrentConfiguration = useCallback((configuration: ConnectorConfiguration) => { + dispatch({ + currentConfiguration: configuration, + type: 'setCurrentConfiguration', + }); + }, []); + + const setConnector = useCallback((connector: CaseConnector) => { + dispatch({ + connector, + type: 'setConnector', + }); + }, []); + + const setClosureType = useCallback((closureType: ClosureType) => { + dispatch({ + closureType, + type: 'setClosureType', + }); + }, []); + + const setMappings = useCallback((mappings: CaseConnectorMapping[]) => { + dispatch({ + mappings, + type: 'setMappings', + }); + }, []); + + const setLoading = useCallback((isLoading: boolean) => { + dispatch({ + payload: isLoading, + type: 'setLoading', + }); + }, []); + + const setFirstLoad = useCallback((isFirstLoad: boolean) => { + dispatch({ + payload: isFirstLoad, + type: 'setFirstLoad', + }); + }, []); + + const setPersistLoading = useCallback((isPersistLoading: boolean) => { + dispatch({ + payload: isPersistLoading, + type: 'setPersistLoading', + }); + }, []); + + const setVersion = useCallback((version: string) => { + dispatch({ + payload: version, + type: 'setVersion', + }); + }, []); + + const [, dispatchToaster] = useStateToaster(); + const isCancelledRefetchRef = useRef(false); + const abortCtrlRefetchRef = useRef(new AbortController()); + + const isCancelledPersistRef = useRef(false); + const abortCtrlPersistRef = useRef(new AbortController()); + + const refetchCaseConfigure = useCallback(async () => { + try { + isCancelledRefetchRef.current = false; + abortCtrlRefetchRef.current.abort(); + abortCtrlRefetchRef.current = new AbortController(); + + setLoading(true); + const res = await getCaseConfigure({ signal: abortCtrlRefetchRef.current.signal }); + + if (!isCancelledRefetchRef.current) { + if (res != null) { + setConnector(res.connector); + if (setClosureType != null) { + setClosureType(res.closureType); + } + setVersion(res.version); + setMappings(res.mappings); + + if (!state.firstLoad) { + setFirstLoad(true); + if (setCurrentConfiguration != null) { + setCurrentConfiguration({ + closureType: res.closureType, + connector: { + ...res.connector, + }, + }); + } + } + if (res.error != null) { + errorToToaster({ + dispatchToaster, + error: new Error(res.error), + title: i18n.ERROR_TITLE, + }); + } + } + setLoading(false); + } + } catch (error) { + if (!isCancelledRefetchRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + dispatchToaster, + error: error.body && error.body.message ? new Error(error.body.message) : error, + title: i18n.ERROR_TITLE, + }); + } + setLoading(false); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [state.firstLoad]); + + const persistCaseConfigure = useCallback( + async ({ connector, closureType }: ConnectorConfiguration) => { + try { + isCancelledPersistRef.current = false; + abortCtrlPersistRef.current.abort(); + abortCtrlPersistRef.current = new AbortController(); + setPersistLoading(true); + + const connectorObj = { + connector, + closure_type: closureType, + }; + + const res = + state.version.length === 0 + ? await postCaseConfigure(connectorObj, abortCtrlPersistRef.current.signal) + : await patchCaseConfigure( + { + ...connectorObj, + version: state.version, + }, + abortCtrlPersistRef.current.signal + ); + + if (!isCancelledPersistRef.current) { + setConnector(res.connector); + if (setClosureType) { + setClosureType(res.closureType); + } + setVersion(res.version); + setMappings(res.mappings); + if (setCurrentConfiguration != null) { + setCurrentConfiguration({ + closureType: res.closureType, + connector: { + ...res.connector, + }, + }); + } + if (res.error != null) { + errorToToaster({ + dispatchToaster, + error: new Error(res.error), + title: i18n.ERROR_TITLE, + }); + } + displaySuccessToast(i18n.SUCCESS_CONFIGURE, dispatchToaster); + setPersistLoading(false); + } + } catch (error) { + if (!isCancelledPersistRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + setConnector(state.currentConfiguration.connector); + setPersistLoading(false); + } + } + }, + [ + dispatchToaster, + setClosureType, + setConnector, + setCurrentConfiguration, + setMappings, + setPersistLoading, + setVersion, + state, + ] + ); + + useEffect(() => { + refetchCaseConfigure(); + return () => { + isCancelledRefetchRef.current = true; + abortCtrlRefetchRef.current.abort(); + isCancelledPersistRef.current = true; + abortCtrlPersistRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + ...state, + refetchCaseConfigure, + persistCaseConfigure, + setCurrentConfiguration, + setConnector, + setClosureType, + setMappings, + }; +}; diff --git a/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx new file mode 100644 index 0000000000000..ed1dfcbc40c87 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useConnectors, UseConnectorsResponse } from './use_connectors'; +import { connectorsMock } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useConnectors', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => + useConnectors() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + loading: true, + connectors: [], + refetchConnectors: result.current.refetchConnectors, + }); + }); + }); + + test('fetch connectors', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => + useConnectors() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + loading: false, + connectors: connectorsMock, + refetchConnectors: result.current.refetchConnectors, + }); + }); + }); + + test('refetch connectors', async () => { + const spyOnfetchConnectors = jest.spyOn(api, 'fetchConnectors'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => + useConnectors() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.refetchConnectors(); + expect(spyOnfetchConnectors).toHaveBeenCalledTimes(2); + }); + }); + + test('set isLoading to true when refetching connectors', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => + useConnectors() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.refetchConnectors(); + + expect(result.current.loading).toBe(true); + }); + }); + + test('unhappy path', async () => { + const spyOnfetchConnectors = jest.spyOn(api, 'fetchConnectors'); + spyOnfetchConnectors.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => + useConnectors() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + loading: false, + connectors: [], + refetchConnectors: result.current.refetchConnectors, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx new file mode 100644 index 0000000000000..338d04f702c63 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect, useCallback, useRef } from 'react'; + +import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; +import * as i18n from '../translations'; +import { fetchConnectors } from './api'; +import { ActionConnector } from './types'; + +export interface UseConnectorsResponse { + loading: boolean; + connectors: ActionConnector[]; + refetchConnectors: () => void; +} + +export const useConnectors = (): UseConnectorsResponse => { + const [, dispatchToaster] = useStateToaster(); + const [loading, setLoading] = useState(true); + const [connectors, setConnectors] = useState<ActionConnector[]>([]); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const refetchConnectors = useCallback(async () => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + + setLoading(true); + const res = await fetchConnectors({ signal: abortCtrlRef.current.signal }); + + if (!isCancelledRef.current) { + setLoading(false); + setConnectors(res); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + + setLoading(false); + setConnectors([]); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + refetchConnectors(); + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + loading, + connectors, + refetchConnectors, + }; +}; diff --git a/x-pack/plugins/cases/public/containers/mock.ts b/x-pack/plugins/cases/public/containers/mock.ts new file mode 100644 index 0000000000000..8e1bf2d8f4b3c --- /dev/null +++ b/x-pack/plugins/cases/public/containers/mock.ts @@ -0,0 +1,377 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ActionLicense, AllCases, Case, CasesStatus, CaseUserActions, Comment } from './types'; + +import { + CommentResponse, + CaseStatuses, + UserAction, + UserActionField, + CaseResponse, + CasesStatusResponse, + CaseUserActionsResponse, + CasesResponse, + CasesFindResponse, + CommentType, + AssociationType, + CaseType, +} from '../../common/api'; +import { UseGetCasesState, DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; +import { ConnectorTypes } from '../../common/api/connectors'; +export { connectorsMock } from './configure/mock'; + +export const basicCaseId = 'basic-case-id'; +export const basicSubCaseId = 'basic-sub-case-id'; +const basicCommentId = 'basic-comment-id'; +const basicCreatedAt = '2020-02-19T23:06:33.798Z'; +const basicUpdatedAt = '2020-02-20T15:02:57.995Z'; +const laterTime = '2020-02-28T15:02:57.995Z'; + +export const elasticUser = { + fullName: 'Leslie Knope', + username: 'lknope', + email: 'leslie.knope@elastic.co', +}; + +export const tags: string[] = ['coke', 'pepsi']; + +export const basicComment: Comment = { + associationType: AssociationType.case, + comment: 'Solve this fast!', + type: CommentType.user, + id: basicCommentId, + createdAt: basicCreatedAt, + createdBy: elasticUser, + pushedAt: null, + pushedBy: null, + updatedAt: null, + updatedBy: null, + version: 'WzQ3LDFc', +}; + +export const alertComment: Comment = { + alertId: 'alert-id-1', + associationType: AssociationType.case, + index: 'alert-index-1', + type: CommentType.alert, + id: 'alert-comment-id', + createdAt: basicCreatedAt, + createdBy: elasticUser, + pushedAt: null, + pushedBy: null, + rule: { + id: 'rule-id-1', + name: 'Awesome rule', + }, + updatedAt: null, + updatedBy: null, + version: 'WzQ3LDFc', +}; + +export const basicCase: Case = { + type: CaseType.individual, + closedAt: null, + closedBy: null, + id: basicCaseId, + comments: [basicComment], + createdAt: basicCreatedAt, + createdBy: elasticUser, + connector: { + id: '123', + name: 'My Connector', + type: ConnectorTypes.none, + fields: null, + }, + description: 'Security banana Issue', + externalService: null, + status: CaseStatuses.open, + tags, + title: 'Another horrible breach!!', + totalComment: 1, + totalAlerts: 0, + updatedAt: basicUpdatedAt, + updatedBy: elasticUser, + version: 'WzQ3LDFd', + settings: { + syncAlerts: true, + }, + subCaseIds: [], +}; + +export const collectionCase: Case = { + type: CaseType.collection, + closedAt: null, + closedBy: null, + id: 'collection-id', + comments: [basicComment], + createdAt: basicCreatedAt, + createdBy: elasticUser, + connector: { + id: '123', + name: 'My Connector', + type: ConnectorTypes.none, + fields: null, + }, + description: 'Security banana Issue', + externalService: null, + status: CaseStatuses.open, + tags, + title: 'Another horrible breach in a collection!!', + totalComment: 1, + totalAlerts: 0, + updatedAt: basicUpdatedAt, + updatedBy: elasticUser, + version: 'WzQ3LDFd', + settings: { + syncAlerts: true, + }, + subCases: [], + subCaseIds: [], +}; + +export const basicCasePost: Case = { + ...basicCase, + updatedAt: null, + updatedBy: null, +}; + +export const basicCommentPatch: Comment = { + ...basicComment, + updatedAt: basicUpdatedAt, + updatedBy: { + username: 'elastic', + }, +}; + +export const basicCaseCommentPatch = { + ...basicCase, + comments: [basicCommentPatch], +}; + +export const casesStatus: CasesStatus = { + countOpenCases: 20, + countInProgressCases: 40, + countClosedCases: 130, +}; + +export const basicPush = { + connectorId: '123', + connectorName: 'connector name', + externalId: 'external_id', + externalTitle: 'external title', + externalUrl: 'basicPush.com', + pushedAt: basicUpdatedAt, + pushedBy: elasticUser, +}; + +export const pushedCase: Case = { + ...basicCase, + externalService: basicPush, +}; + +const basicAction = { + actionAt: basicCreatedAt, + actionBy: elasticUser, + oldValue: null, + newValue: 'what a cool value', + caseId: basicCaseId, + commentId: null, +}; + +export const cases: Case[] = [ + basicCase, + { ...pushedCase, id: '1', totalComment: 0, comments: [] }, + { ...pushedCase, updatedAt: laterTime, id: '2', totalComment: 0, comments: [] }, + { ...basicCase, id: '3', totalComment: 0, comments: [] }, + { ...basicCase, id: '4', totalComment: 0, comments: [] }, +]; + +export const allCases: AllCases = { + cases, + page: 1, + perPage: 5, + total: 10, + ...casesStatus, +}; + +export const actionLicenses: ActionLicense[] = [ + { + id: '.servicenow', + name: 'ServiceNow', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }, + { + id: '.jira', + name: 'Jira', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }, +]; + +// Snake case for mock api responses +export const elasticUserSnake = { + full_name: 'Leslie Knope', + username: 'lknope', + email: 'leslie.knope@elastic.co', +}; + +export const basicCommentSnake: CommentResponse = { + associationType: AssociationType.case, + comment: 'Solve this fast!', + type: CommentType.user, + id: basicCommentId, + created_at: basicCreatedAt, + created_by: elasticUserSnake, + pushed_at: null, + pushed_by: null, + updated_at: null, + updated_by: null, + version: 'WzQ3LDFc', +}; + +export const basicCaseSnake: CaseResponse = { + ...basicCase, + status: CaseStatuses.open, + closed_at: null, + closed_by: null, + comments: [basicCommentSnake], + connector: { + id: '123', + name: 'My Connector', + type: ConnectorTypes.none, + fields: null, + }, + created_at: basicCreatedAt, + created_by: elasticUserSnake, + external_service: null, + updated_at: basicUpdatedAt, + updated_by: elasticUserSnake, +} as CaseResponse; + +export const casesStatusSnake: CasesStatusResponse = { + count_closed_cases: 130, + count_in_progress_cases: 40, + count_open_cases: 20, +}; + +export const pushSnake = { + connector_id: '123', + connector_name: 'connector name', + external_id: 'external_id', + external_title: 'external title', + external_url: 'basicPush.com', +}; + +export const basicPushSnake = { + ...pushSnake, + pushed_at: basicUpdatedAt, + pushed_by: elasticUserSnake, +}; + +export const pushedCaseSnake = { + ...basicCaseSnake, + external_service: basicPushSnake, +}; + +export const reporters: string[] = ['alexis', 'kim', 'maria', 'steph']; +export const respReporters = [ + { username: 'alexis', full_name: null, email: null }, + { username: 'kim', full_name: null, email: null }, + { username: 'maria', full_name: null, email: null }, + { username: 'steph', full_name: null, email: null }, +]; +export const casesSnake: CasesResponse = [ + basicCaseSnake, + { ...pushedCaseSnake, id: '1', totalComment: 0, comments: [] }, + { ...pushedCaseSnake, updated_at: laterTime, id: '2', totalComment: 0, comments: [] }, + { ...basicCaseSnake, id: '3', totalComment: 0, comments: [] }, + { ...basicCaseSnake, id: '4', totalComment: 0, comments: [] }, +]; + +export const allCasesSnake: CasesFindResponse = { + cases: casesSnake, + page: 1, + per_page: 5, + total: 10, + ...casesStatusSnake, +}; + +const basicActionSnake = { + action_at: basicCreatedAt, + action_by: elasticUserSnake, + old_value: null, + new_value: 'what a cool value', + case_id: basicCaseId, + comment_id: null, +}; +export const getUserActionSnake = (af: UserActionField, a: UserAction) => ({ + ...basicActionSnake, + action_id: `${af[0]}-${a}`, + action_field: af, + action: a, + comment_id: af[0] === 'comment' ? basicCommentId : null, + new_value: + a === 'push-to-service' && af[0] === 'pushed' + ? JSON.stringify(basicPushSnake) + : basicAction.newValue, +}); + +export const caseUserActionsSnake: CaseUserActionsResponse = [ + getUserActionSnake(['description'], 'create'), + getUserActionSnake(['comment'], 'create'), + getUserActionSnake(['description'], 'update'), +]; + +// user actions + +export const getUserAction = (af: UserActionField, a: UserAction) => ({ + ...basicAction, + actionId: `${af[0]}-${a}`, + actionField: af, + action: a, + commentId: af[0] === 'comment' ? basicCommentId : null, + newValue: + a === 'push-to-service' && af[0] === 'pushed' + ? JSON.stringify(basicPushSnake) + : basicAction.newValue, +}); + +export const getAlertUserAction = () => ({ + ...basicAction, + actionId: 'alert-action-id', + actionField: ['comment'], + action: 'create', + commentId: 'alert-comment-id', + newValue: '{"type":"alert","alertId":"alert-id-1","index":"index-id-1"}', +}); + +export const caseUserActions: CaseUserActions[] = [ + getUserAction(['description'], 'create'), + getUserAction(['comment'], 'create'), + getUserAction(['description'], 'update'), +]; + +// components tests +export const useGetCasesMockState: UseGetCasesState = { + data: allCases, + loading: [], + selectedCases: [], + isError: false, + queryParams: DEFAULT_QUERY_PARAMS, + filterOptions: DEFAULT_FILTER_OPTIONS, +}; + +export const basicCaseClosed: Case = { + ...basicCase, + closedAt: '2020-02-25T23:06:33.798Z', + closedBy: elasticUser, + status: CaseStatuses.closed, +}; diff --git a/x-pack/plugins/cases/public/containers/translations.ts b/x-pack/plugins/cases/public/containers/translations.ts new file mode 100644 index 0000000000000..2158c96906948 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/translations.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../common/translations'; + +export const ERROR_TITLE = i18n.translate('xpack.securitySolution.containers.cases.errorTitle', { + defaultMessage: 'Error fetching data', +}); + +export const ERROR_DELETING = i18n.translate( + 'xpack.securitySolution.containers.cases.errorDeletingTitle', + { + defaultMessage: 'Error deleting data', + } +); + +export const UPDATED_CASE = (caseTitle: string) => + i18n.translate('xpack.securitySolution.containers.cases.updatedCase', { + values: { caseTitle }, + defaultMessage: 'Updated "{caseTitle}"', + }); + +export const DELETED_CASES = (totalCases: number, caseTitle?: string) => + i18n.translate('xpack.securitySolution.containers.cases.deletedCases', { + values: { caseTitle, totalCases }, + defaultMessage: 'Deleted {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', + }); + +export const CLOSED_CASES = ({ + totalCases, + caseTitle, +}: { + totalCases: number; + caseTitle?: string; +}) => + i18n.translate('xpack.securitySolution.containers.cases.closedCases', { + values: { caseTitle, totalCases }, + defaultMessage: 'Closed {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', + }); + +export const REOPENED_CASES = ({ + totalCases, + caseTitle, +}: { + totalCases: number; + caseTitle?: string; +}) => + i18n.translate('xpack.securitySolution.containers.cases.reopenedCases', { + values: { caseTitle, totalCases }, + defaultMessage: 'Opened {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', + }); + +export const MARK_IN_PROGRESS_CASES = ({ + totalCases, + caseTitle, +}: { + totalCases: number; + caseTitle?: string; +}) => + i18n.translate('xpack.securitySolution.containers.cases.markInProgressCases', { + values: { caseTitle, totalCases }, + defaultMessage: + 'Marked {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}} as in progress', + }); + +export const SUCCESS_SEND_TO_EXTERNAL_SERVICE = (serviceName: string) => + i18n.translate('xpack.securitySolution.containers.cases.pushToExternalService', { + values: { serviceName }, + defaultMessage: 'Successfully sent to { serviceName }', + }); + +export const ERROR_GET_FIELDS = i18n.translate( + 'xpack.securitySolution.cases.configure.errorGetFields', + { + defaultMessage: 'Error getting fields from service', + } +); + +export const SYNC_CASE = (caseTitle: string) => + i18n.translate('xpack.securitySolution.containers.cases.syncCase', { + values: { caseTitle }, + defaultMessage: 'Alerts in "{caseTitle}" have been synced', + }); + +export const STATUS_CHANGED_TOASTER_TEXT = i18n.translate( + 'xpack.securitySolution.cases.containers.statusChangeToasterText', + { + defaultMessage: 'Alerts in this case have been also had their status updated', + } +); diff --git a/x-pack/plugins/cases/public/containers/types.ts b/x-pack/plugins/cases/public/containers/types.ts new file mode 100644 index 0000000000000..db1e902fe9150 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/types.ts @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + User, + UserActionField, + UserAction, + CaseConnector, + CommentRequest, + CaseStatuses, + CaseAttributes, + CasePatchRequest, + CaseType, + AssociationType, +} from '../../common/api'; +import { CaseStatusWithAllStatus } from '../components/status'; + +export { CaseConnector, ActionConnector, CaseStatuses } from '../../common/api'; + +export type Comment = CommentRequest & { + associationType: AssociationType; + id: string; + createdAt: string; + createdBy: ElasticUser; + pushedAt: string | null; + pushedBy: string | null; + updatedAt: string | null; + updatedBy: ElasticUser | null; + version: string; +}; +export interface CaseUserActions { + actionId: string; + actionField: UserActionField; + action: UserAction; + actionAt: string; + actionBy: ElasticUser; + caseId: string; + commentId: string | null; + newValue: string | null; + oldValue: string | null; +} + +export interface CaseExternalService { + pushedAt: string; + pushedBy: ElasticUser; + connectorId: string; + connectorName: string; + externalId: string; + externalTitle: string; + externalUrl: string; +} + +interface BasicCase { + id: string; + closedAt: string | null; + closedBy: ElasticUser | null; + comments: Comment[]; + createdAt: string; + createdBy: ElasticUser; + status: CaseStatuses; + title: string; + totalAlerts: number; + totalComment: number; + updatedAt: string | null; + updatedBy: ElasticUser | null; + version: string; +} + +export interface SubCase extends BasicCase { + associationType: AssociationType; + caseParentId: string; +} + +export interface Case extends BasicCase { + connector: CaseConnector; + description: string; + externalService: CaseExternalService | null; + subCases?: SubCase[] | null; + subCaseIds: string[]; + settings: CaseAttributes['settings']; + tags: string[]; + type: CaseType; +} + +export interface QueryParams { + page: number; + perPage: number; + sortField: SortFieldCase; + sortOrder: 'asc' | 'desc'; +} + +export interface FilterOptions { + search: string; + status: CaseStatusWithAllStatus; + tags: string[]; + reporters: User[]; + onlyCollectionType?: boolean; +} + +export interface CasesStatus { + countClosedCases: number | null; + countOpenCases: number | null; + countInProgressCases: number | null; +} + +export interface AllCases extends CasesStatus { + cases: Case[]; + page: number; + perPage: number; + total: number; +} + +export enum SortFieldCase { + createdAt = 'createdAt', + closedAt = 'closedAt', + updatedAt = 'updatedAt', +} + +export interface ElasticUser { + readonly email?: string | null; + readonly fullName?: string | null; + readonly username?: string | null; +} + +export interface FetchCasesProps extends ApiProps { + queryParams?: QueryParams; + filterOptions?: FilterOptions; +} + +export interface ApiProps { + signal: AbortSignal; +} + +export interface BulkUpdateStatus { + status: string; + id: string; + version: string; +} +export interface ActionLicense { + id: string; + name: string; + enabled: boolean; + enabledInConfig: boolean; + enabledInLicense: boolean; +} + +export interface DeleteCase { + id: string; + type: CaseType | null; + title?: string; +} + +export interface FieldMappings { + id: string; + title?: string; +} + +export type UpdateKey = keyof Pick< + CasePatchRequest, + 'connector' | 'description' | 'status' | 'tags' | 'title' | 'settings' +>; + +export interface UpdateByKey { + updateKey: UpdateKey; + updateValue: CasePatchRequest[UpdateKey]; + fetchCaseUserActions?: (caseId: string, caseConnectorId: string, subCaseId?: string) => void; + updateCase?: (newCase: Case) => void; + caseData: Case; + onSuccess?: () => void; + onError?: () => void; +} diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx new file mode 100644 index 0000000000000..834b4974a5018 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx @@ -0,0 +1,204 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { CaseStatuses } from '../../common/api'; +import { + DEFAULT_FILTER_OPTIONS, + DEFAULT_QUERY_PARAMS, + initialData, + useGetCases, + UseGetCases, +} from './use_get_cases'; +import { UpdateKey } from './types'; +import { allCases, basicCase } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetCases', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + expect(result.current).toEqual({ + data: initialData, + dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty, + filterOptions: DEFAULT_FILTER_OPTIONS, + isError: false, + loading: [], + queryParams: DEFAULT_QUERY_PARAMS, + refetchCases: result.current.refetchCases, + selectedCases: [], + setFilters: result.current.setFilters, + setQueryParams: result.current.setQueryParams, + setSelectedCases: result.current.setSelectedCases, + }); + }); + }); + + it('calls getCases with correct arguments', async () => { + const spyOnGetCases = jest.spyOn(api, 'getCases'); + await act(async () => { + const { waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetCases).toBeCalledWith({ + filterOptions: DEFAULT_FILTER_OPTIONS, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + }); + }); + + it('fetch cases', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + data: allCases, + dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty, + filterOptions: DEFAULT_FILTER_OPTIONS, + isError: false, + loading: [], + queryParams: DEFAULT_QUERY_PARAMS, + refetchCases: result.current.refetchCases, + selectedCases: [], + setFilters: result.current.setFilters, + setQueryParams: result.current.setQueryParams, + setSelectedCases: result.current.setSelectedCases, + }); + }); + }); + it('dispatch update case property', async () => { + const spyOnPatchCase = jest.spyOn(api, 'patchCase'); + await act(async () => { + const updateCase = { + updateKey: 'description' as UpdateKey, + updateValue: 'description update', + caseId: basicCase.id, + refetchCasesStatus: jest.fn(), + version: '99999', + }; + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.dispatchUpdateCaseProperty(updateCase); + expect(result.current.loading).toEqual(['caseUpdate']); + expect(spyOnPatchCase).toBeCalledWith( + basicCase.id, + { [updateCase.updateKey]: updateCase.updateValue }, + updateCase.version, + abortCtrl.signal + ); + }); + }); + + it('refetch cases', async () => { + const spyOnGetCases = jest.spyOn(api, 'getCases'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.refetchCases(); + expect(spyOnGetCases).toHaveBeenCalledTimes(2); + }); + }); + + it('set isLoading to true when refetching case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.refetchCases(); + + expect(result.current.loading).toEqual(['cases']); + }); + }); + + it('unhappy path', async () => { + const spyOnGetCases = jest.spyOn(api, 'getCases'); + spyOnGetCases.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + data: initialData, + dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty, + filterOptions: DEFAULT_FILTER_OPTIONS, + isError: true, + loading: [], + queryParams: DEFAULT_QUERY_PARAMS, + refetchCases: result.current.refetchCases, + selectedCases: [], + setFilters: result.current.setFilters, + setQueryParams: result.current.setQueryParams, + setSelectedCases: result.current.setSelectedCases, + }); + }); + }); + it('set filters', async () => { + await act(async () => { + const spyOnGetCases = jest.spyOn(api, 'getCases'); + const newFilters = { + search: 'new', + tags: ['new'], + status: CaseStatuses.closed, + }; + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.setFilters(newFilters); + await waitForNextUpdate(); + expect(spyOnGetCases.mock.calls[1][0]).toEqual({ + filterOptions: { ...DEFAULT_FILTER_OPTIONS, ...newFilters }, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + }); + }); + it('set query params', async () => { + await act(async () => { + const spyOnGetCases = jest.spyOn(api, 'getCases'); + const newQueryParams = { + page: 2, + }; + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.setQueryParams(newQueryParams); + await waitForNextUpdate(); + expect(spyOnGetCases.mock.calls[1][0]).toEqual({ + filterOptions: DEFAULT_FILTER_OPTIONS, + queryParams: { ...DEFAULT_QUERY_PARAMS, ...newQueryParams }, + signal: abortCtrl.signal, + }); + }); + }); + it('set selected cases', async () => { + await act(async () => { + const selectedCases = [basicCase]; + const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.setSelectedCases(selectedCases); + expect(result.current.selectedCases).toEqual(selectedCases); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.tsx new file mode 100644 index 0000000000000..d27bb5ab1b462 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_cases.tsx @@ -0,0 +1,255 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useEffect, useReducer, useRef } from 'react'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; +import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case, UpdateByKey } from './types'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; +import * as i18n from './translations'; +import { getCases, patchCase } from './api'; +import { StatusAll } from '../components/status'; + +export interface UseGetCasesState { + data: AllCases; + filterOptions: FilterOptions; + isError: boolean; + loading: string[]; + queryParams: QueryParams; + selectedCases: Case[]; +} + +export interface UpdateCase extends Omit<UpdateByKey, 'caseData'> { + caseId: string; + version: string; + refetchCasesStatus: () => void; +} + +export type Action = + | { type: 'FETCH_INIT'; payload: string } + | { + type: 'FETCH_CASES_SUCCESS'; + payload: AllCases; + } + | { type: 'FETCH_FAILURE'; payload: string } + | { type: 'FETCH_UPDATE_CASE_SUCCESS' } + | { type: 'UPDATE_FILTER_OPTIONS'; payload: Partial<FilterOptions> } + | { type: 'UPDATE_QUERY_PARAMS'; payload: Partial<QueryParams> } + | { type: 'UPDATE_TABLE_SELECTIONS'; payload: Case[] }; + +const dataFetchReducer = (state: UseGetCasesState, action: Action): UseGetCasesState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isError: false, + loading: [...state.loading.filter((e) => e !== action.payload), action.payload], + }; + case 'FETCH_UPDATE_CASE_SUCCESS': + return { + ...state, + loading: state.loading.filter((e) => e !== 'caseUpdate'), + }; + case 'FETCH_CASES_SUCCESS': + return { + ...state, + data: action.payload, + isError: false, + loading: state.loading.filter((e) => e !== 'cases'), + }; + case 'FETCH_FAILURE': + return { + ...state, + isError: true, + loading: state.loading.filter((e) => e !== action.payload), + }; + case 'UPDATE_FILTER_OPTIONS': + return { + ...state, + filterOptions: { + ...state.filterOptions, + ...action.payload, + }, + }; + case 'UPDATE_QUERY_PARAMS': + return { + ...state, + queryParams: { + ...state.queryParams, + ...action.payload, + }, + }; + case 'UPDATE_TABLE_SELECTIONS': + return { + ...state, + selectedCases: action.payload, + }; + default: + return state; + } +}; + +export const DEFAULT_FILTER_OPTIONS: FilterOptions = { + search: '', + reporters: [], + status: StatusAll, + tags: [], + onlyCollectionType: false, +}; + +export const DEFAULT_QUERY_PARAMS: QueryParams = { + page: DEFAULT_TABLE_ACTIVE_PAGE, + perPage: DEFAULT_TABLE_LIMIT, + sortField: SortFieldCase.createdAt, + sortOrder: 'desc', +}; + +export const initialData: AllCases = { + cases: [], + countClosedCases: null, + countInProgressCases: null, + countOpenCases: null, + page: 0, + perPage: 0, + total: 0, +}; +export interface UseGetCases extends UseGetCasesState { + dispatchUpdateCaseProperty: ({ + updateKey, + updateValue, + caseId, + version, + refetchCasesStatus, + }: UpdateCase) => void; + refetchCases: () => void; + setFilters: (filters: Partial<FilterOptions>) => void; + setQueryParams: (queryParams: Partial<QueryParams>) => void; + setSelectedCases: (mySelectedCases: Case[]) => void; +} + +export const useGetCases = ( + initialQueryParams?: QueryParams, + initialFilterOptions?: FilterOptions +): UseGetCases => { + const [state, dispatch] = useReducer(dataFetchReducer, { + data: initialData, + filterOptions: initialFilterOptions ?? DEFAULT_FILTER_OPTIONS, + isError: false, + loading: [], + queryParams: initialQueryParams ?? DEFAULT_QUERY_PARAMS, + selectedCases: [], + }); + const [, dispatchToaster] = useStateToaster(); + const didCancelFetchCases = useRef(false); + const didCancelUpdateCases = useRef(false); + const abortCtrlFetchCases = useRef(new AbortController()); + const abortCtrlUpdateCases = useRef(new AbortController()); + + const setSelectedCases = useCallback((mySelectedCases: Case[]) => { + dispatch({ type: 'UPDATE_TABLE_SELECTIONS', payload: mySelectedCases }); + }, []); + + const setQueryParams = useCallback((newQueryParams: Partial<QueryParams>) => { + dispatch({ type: 'UPDATE_QUERY_PARAMS', payload: newQueryParams }); + }, []); + + const setFilters = useCallback((newFilters: Partial<FilterOptions>) => { + dispatch({ type: 'UPDATE_FILTER_OPTIONS', payload: newFilters }); + }, []); + + const fetchCases = useCallback(async (filterOptions: FilterOptions, queryParams: QueryParams) => { + try { + didCancelFetchCases.current = false; + abortCtrlFetchCases.current.abort(); + abortCtrlFetchCases.current = new AbortController(); + dispatch({ type: 'FETCH_INIT', payload: 'cases' }); + + const response = await getCases({ + filterOptions, + queryParams, + signal: abortCtrlFetchCases.current.signal, + }); + + if (!didCancelFetchCases.current) { + dispatch({ + type: 'FETCH_CASES_SUCCESS', + payload: response, + }); + } + } catch (error) { + if (!didCancelFetchCases.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE', payload: 'cases' }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const dispatchUpdateCaseProperty = useCallback( + async ({ updateKey, updateValue, caseId, refetchCasesStatus, version }: UpdateCase) => { + try { + didCancelUpdateCases.current = false; + abortCtrlUpdateCases.current.abort(); + abortCtrlUpdateCases.current = new AbortController(); + dispatch({ type: 'FETCH_INIT', payload: 'caseUpdate' }); + + await patchCase( + caseId, + { [updateKey]: updateValue }, + // saved object versions are typed as string | undefined, hope that's not true + version ?? '', + abortCtrlUpdateCases.current.signal + ); + + if (!didCancelUpdateCases.current) { + dispatch({ type: 'FETCH_UPDATE_CASE_SUCCESS' }); + fetchCases(state.filterOptions, state.queryParams); + refetchCasesStatus(); + } + } catch (error) { + if (!didCancelUpdateCases.current) { + if (error.name !== 'AbortError') { + errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + } + dispatch({ type: 'FETCH_FAILURE', payload: 'caseUpdate' }); + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [state.filterOptions, state.queryParams] + ); + + const refetchCases = useCallback(() => { + fetchCases(state.filterOptions, state.queryParams); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [state.filterOptions, state.queryParams]); + + useEffect(() => { + fetchCases(state.filterOptions, state.queryParams); + return () => { + didCancelFetchCases.current = true; + didCancelUpdateCases.current = true; + abortCtrlFetchCases.current.abort(); + abortCtrlUpdateCases.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [state.queryParams, state.filterOptions]); + + return { + ...state, + dispatchUpdateCaseProperty, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx b/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx new file mode 100644 index 0000000000000..8042e560df350 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useGetTags, UseGetTags } from './use_get_tags'; +import { tags } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetTags', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); + await waitForNextUpdate(); + expect(result.current).toEqual({ + tags: [], + isLoading: true, + isError: false, + fetchTags: result.current.fetchTags, + }); + }); + }); + + it('calls getTags api', async () => { + const spyOnGetTags = jest.spyOn(api, 'getTags'); + await act(async () => { + const { waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetTags).toBeCalledWith(abortCtrl.signal); + }); + }); + + it('fetch tags', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + tags, + isLoading: false, + isError: false, + fetchTags: result.current.fetchTags, + }); + }); + }); + + it('refetch tags', async () => { + const spyOnGetTags = jest.spyOn(api, 'getTags'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchTags(); + expect(spyOnGetTags).toHaveBeenCalledTimes(2); + }); + }); + + it('unhappy path', async () => { + const spyOnGetTags = jest.spyOn(api, 'getTags'); + spyOnGetTags.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + tags: [], + isLoading: false, + isError: true, + fetchTags: result.current.fetchTags, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_tags.tsx b/x-pack/plugins/cases/public/containers/use_get_tags.tsx new file mode 100644 index 0000000000000..33b863fba5da3 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_tags.tsx @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useReducer, useRef, useCallback } from 'react'; +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { getTags } from './api'; +import * as i18n from './translations'; + +export interface TagsState { + tags: string[]; + isLoading: boolean; + isError: boolean; +} +type Action = + | { type: 'FETCH_INIT' } + | { type: 'FETCH_SUCCESS'; payload: string[] } + | { type: 'FETCH_FAILURE' }; + +export interface UseGetTags extends TagsState { + fetchTags: () => void; +} + +const dataFetchReducer = (state: TagsState, action: Action): TagsState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + tags: action.payload, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + }; + default: + return state; + } +}; +const initialData: string[] = []; + +export const useGetTags = (): UseGetTags => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: true, + isError: false, + tags: initialData, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const callFetch = useCallback(async () => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT' }); + + const response = await getTags(abortCtrlRef.current.signal); + + if (!isCancelledRef.current) { + dispatch({ type: 'FETCH_SUCCESS', payload: response }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + callFetch(); + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return { ...state, fetchTags: callFetch }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_post_case.test.tsx b/x-pack/plugins/cases/public/containers/use_post_case.test.tsx new file mode 100644 index 0000000000000..86dad6ef6d78d --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_post_case.test.tsx @@ -0,0 +1,114 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { usePostCase, UsePostCase } from './use_post_case'; +import * as api from './api'; +import { ConnectorTypes } from '../../common/api/connectors'; +import { basicCasePost } from './mock'; + +jest.mock('./api'); + +describe('usePostCase', () => { + const abortCtrl = new AbortController(); + const samplePost = { + description: 'description', + tags: ['tags'], + title: 'title', + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + settings: { + syncAlerts: true, + }, + }; + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + postCase: result.current.postCase, + }); + }); + }); + + it('calls postCase with correct arguments', async () => { + const spyOnPostCase = jest.spyOn(api, 'postCase'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); + await waitForNextUpdate(); + + result.current.postCase(samplePost); + await waitForNextUpdate(); + expect(spyOnPostCase).toBeCalledWith(samplePost, abortCtrl.signal); + }); + }); + + it('calls postCase with correct result', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); + await waitForNextUpdate(); + + const postData = await result.current.postCase(samplePost); + expect(postData).toEqual(basicCasePost); + }); + }); + + it('post case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); + await waitForNextUpdate(); + result.current.postCase(samplePost); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + postCase: result.current.postCase, + }); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); + await waitForNextUpdate(); + result.current.postCase(samplePost); + + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnPostCase = jest.spyOn(api, 'postCase'); + spyOnPostCase.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); + await waitForNextUpdate(); + result.current.postCase(samplePost); + + expect(result.current).toEqual({ + isLoading: false, + isError: true, + postCase: result.current.postCase, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_post_case.tsx b/x-pack/plugins/cases/public/containers/use_post_case.tsx new file mode 100644 index 0000000000000..4733b8927f5bc --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_post_case.tsx @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useReducer, useCallback, useRef, useEffect } from 'react'; +import { CasePostRequest } from '../../common/api'; +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { postCase } from './api'; +import * as i18n from './translations'; +import { Case } from './types'; +interface NewCaseState { + isLoading: boolean; + isError: boolean; +} +type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; + +const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + }; + default: + return state; + } +}; +export interface UsePostCase extends NewCaseState { + postCase: (data: CasePostRequest) => Promise<Case | undefined>; +} +export const usePostCase = (): UsePostCase => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: false, + isError: false, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const postMyCase = useCallback(async (data: CasePostRequest) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + + dispatch({ type: 'FETCH_INIT' }); + const response = await postCase(data, abortCtrlRef.current.signal); + + if (!isCancelledRef.current) { + dispatch({ type: 'FETCH_SUCCESS' }); + } + return response; + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + }, []); + return { ...state, postCase: postMyCase }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx new file mode 100644 index 0000000000000..030677e175cb6 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { usePostPushToService, UsePostPushToService } from './use_post_push_to_service'; +import { pushedCase } from './mock'; +import * as api from './api'; +import { CaseConnector, ConnectorTypes } from '../../common/api'; + +jest.mock('./api'); + +describe('usePostPushToService', () => { + const abortCtrl = new AbortController(); + const connector = { + id: '123', + name: 'connector name', + type: ConnectorTypes.jira, + fields: { issueType: 'Task', priority: 'Low', parent: null }, + } as CaseConnector; + const caseId = pushedCase.id; + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => + usePostPushToService() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + pushCaseToExternalService: result.current.pushCaseToExternalService, + }); + }); + }); + + it('calls pushCase with correct arguments', async () => { + const spyOnPushToService = jest.spyOn(api, 'pushCase'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => + usePostPushToService() + ); + await waitForNextUpdate(); + result.current.pushCaseToExternalService({ caseId, connector }); + await waitForNextUpdate(); + expect(spyOnPushToService).toBeCalledWith(caseId, connector.id, abortCtrl.signal); + }); + }); + + it('post push to service', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => + usePostPushToService() + ); + await waitForNextUpdate(); + result.current.pushCaseToExternalService({ caseId, connector }); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + pushCaseToExternalService: result.current.pushCaseToExternalService, + }); + }); + }); + + it('set isLoading to true when pushing case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => + usePostPushToService() + ); + await waitForNextUpdate(); + result.current.pushCaseToExternalService({ caseId, connector }); + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnPushToService = jest.spyOn(api, 'pushCase'); + spyOnPushToService.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => + usePostPushToService() + ); + await waitForNextUpdate(); + result.current.pushCaseToExternalService({ caseId, connector }); + + expect(result.current).toEqual({ + isLoading: false, + isError: true, + pushCaseToExternalService: result.current.pushCaseToExternalService, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx new file mode 100644 index 0000000000000..b220c4f871e50 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useReducer, useCallback, useRef, useEffect } from 'react'; +import { CaseConnector } from '../../common/api'; +import { errorToToaster, useStateToaster, displaySuccessToast } from '../components/toasters'; + +import { pushCase } from './api'; +import * as i18n from './translations'; +import { Case } from './types'; + +interface PushToServiceState { + isLoading: boolean; + isError: boolean; +} +type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; + +const dataFetchReducer = (state: PushToServiceState, action: Action): PushToServiceState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + }; + default: + return state; + } +}; + +interface PushToServiceRequest { + caseId: string; + connector: CaseConnector; +} + +export interface UsePostPushToService extends PushToServiceState { + pushCaseToExternalService: ({ + caseId, + connector, + }: PushToServiceRequest) => Promise<Case | undefined>; +} + +export const usePostPushToService = (): UsePostPushToService => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: false, + isError: false, + }); + const [, dispatchToaster] = useStateToaster(); + const cancel = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const pushCaseToExternalService = useCallback( + async ({ caseId, connector }: PushToServiceRequest) => { + try { + abortCtrlRef.current.abort(); + cancel.current = false; + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT' }); + + const response = await pushCase(caseId, connector.id, abortCtrlRef.current.signal); + + if (!cancel.current) { + dispatch({ type: 'FETCH_SUCCESS' }); + displaySuccessToast( + i18n.SUCCESS_SEND_TO_EXTERNAL_SERVICE(connector.name), + dispatchToaster + ); + } + + return response; + } catch (error) { + if (!cancel.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + + useEffect(() => { + return () => { + abortCtrlRef.current.abort(); + cancel.current = true; + }; + }, []); + + return { ...state, pushCaseToExternalService }; +}; diff --git a/x-pack/plugins/cases/public/containers/utils.test.ts b/x-pack/plugins/cases/public/containers/utils.test.ts new file mode 100644 index 0000000000000..6c1fb60298938 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/utils.test.ts @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + valueToUpdateIsSettings, + valueToUpdateIsStatus, + createUpdateSuccessToaster, +} from './utils'; + +import { Case } from './types'; + +const caseBeforeUpdate = { + comments: [ + { + type: 'alert', + }, + ], + settings: { + syncAlerts: true, + }, +} as Case; + +const caseAfterUpdate = { title: 'My case' } as Case; + +describe('utils', () => { + describe('valueToUpdateIsSettings', () => { + it('returns true if key is settings', () => { + expect(valueToUpdateIsSettings('settings', 'value')).toBe(true); + }); + + it('returns false if key is NOT settings', () => { + expect(valueToUpdateIsSettings('tags', 'value')).toBe(false); + }); + }); + + describe('valueToUpdateIsStatus', () => { + it('returns true if key is status', () => { + expect(valueToUpdateIsStatus('status', 'value')).toBe(true); + }); + + it('returns false if key is NOT status', () => { + expect(valueToUpdateIsStatus('tags', 'value')).toBe(false); + }); + }); + + describe('createUpdateSuccessToaster', () => { + it('creates the correct toast when sync alerts is turned on and case has alerts', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + caseBeforeUpdate, + caseAfterUpdate, + 'settings', + { + syncAlerts: true, + } + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Alerts in "My case" have been synced', + }); + }); + + it('creates the correct toast when sync alerts is turned on and case does NOT have alerts', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + { ...caseBeforeUpdate, comments: [] }, + caseAfterUpdate, + 'settings', + { + syncAlerts: true, + } + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Updated "My case"', + }); + }); + + it('creates the correct toast when sync alerts is turned off and case has alerts', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + caseBeforeUpdate, + caseAfterUpdate, + 'settings', + { + syncAlerts: false, + } + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Updated "My case"', + }); + }); + + it('creates the correct toast when the status change, case has alerts, and sync alerts is on', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + caseBeforeUpdate, + caseAfterUpdate, + 'status', + 'closed' + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Updated "My case"', + text: 'Alerts in this case have been also had their status updated', + }); + }); + + it('creates the correct toast when the status change, case has alerts, and sync alerts is off', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + { ...caseBeforeUpdate, settings: { syncAlerts: false } }, + caseAfterUpdate, + 'status', + 'closed' + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Updated "My case"', + }); + }); + + it('creates the correct toast when the status change, case does NOT have alerts, and sync alerts is on', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + { ...caseBeforeUpdate, comments: [] }, + caseAfterUpdate, + 'status', + 'closed' + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Updated "My case"', + }); + }); + + it('creates the correct toast if not a status or a setting', () => { + // We remove the id as is randomly generated + const { id, ...toast } = createUpdateSuccessToaster( + caseBeforeUpdate, + caseAfterUpdate, + 'title', + 'My new title' + ); + + expect(toast).toEqual({ + color: 'success', + iconType: 'check', + title: 'Updated "My case"', + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/utils.ts b/x-pack/plugins/cases/public/containers/utils.ts new file mode 100644 index 0000000000000..104a25fa97958 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/utils.ts @@ -0,0 +1,150 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import uuid from 'uuid'; +import { set } from '@elastic/safer-lodash-set'; +import { camelCase, isArray, isObject } from 'lodash'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; +import { pipe } from 'fp-ts/lib/pipeable'; + +import { + CasesFindResponse, + CasesFindResponseRt, + CaseResponse, + CaseResponseRt, + CasesResponse, + CasesResponseRt, + CasesStatusResponseRt, + CasesStatusResponse, + throwErrors, + CasesConfigureResponse, + CaseConfigureResponseRt, + CaseUserActionsResponse, + CaseUserActionsResponseRt, + CommentType, + CasePatchRequest, +} from '../../common/api'; +import { AppToast, ToasterError } from '../components/toasters'; +import { AllCases, Case, UpdateByKey } from './types'; +import * as i18n from './translations'; + +export const getTypedPayload = <T>(a: unknown): T => a as T; + +export const parseString = (params: string) => { + try { + return JSON.parse(params); + } catch { + return null; + } +}; + +export const convertArrayToCamelCase = (arrayOfSnakes: unknown[]): unknown[] => + arrayOfSnakes.reduce((acc: unknown[], value) => { + if (isArray(value)) { + return [...acc, convertArrayToCamelCase(value)]; + } else if (isObject(value)) { + return [...acc, convertToCamelCase(value)]; + } else { + return [...acc, value]; + } + }, []); + +export const convertToCamelCase = <T, U extends {}>(snakeCase: T): U => + Object.entries(snakeCase).reduce((acc, [key, value]) => { + if (isArray(value)) { + set(acc, camelCase(key), convertArrayToCamelCase(value)); + } else if (isObject(value)) { + set(acc, camelCase(key), convertToCamelCase(value)); + } else { + set(acc, camelCase(key), value); + } + return acc; + }, {} as U); + +export const convertAllCasesToCamel = (snakeCases: CasesFindResponse): AllCases => ({ + cases: snakeCases.cases.map((snakeCase) => convertToCamelCase<CaseResponse, Case>(snakeCase)), + countOpenCases: snakeCases.count_open_cases, + countInProgressCases: snakeCases.count_in_progress_cases, + countClosedCases: snakeCases.count_closed_cases, + page: snakeCases.page, + perPage: snakeCases.per_page, + total: snakeCases.total, +}); + +export const decodeCasesStatusResponse = (respCase?: CasesStatusResponse) => + pipe( + CasesStatusResponseRt.decode(respCase), + fold(throwErrors(createToasterPlainError), identity) + ); + +export const createToasterPlainError = (message: string) => new ToasterError([message]); + +export const decodeCaseResponse = (respCase?: CaseResponse) => + pipe(CaseResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); + +export const decodeCasesResponse = (respCase?: CasesResponse) => + pipe(CasesResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); + +export const decodeCasesFindResponse = (respCases?: CasesFindResponse) => + pipe(CasesFindResponseRt.decode(respCases), fold(throwErrors(createToasterPlainError), identity)); + +export const decodeCaseConfigureResponse = (respCase?: CasesConfigureResponse) => + pipe( + CaseConfigureResponseRt.decode(respCase), + fold(throwErrors(createToasterPlainError), identity) + ); + +export const decodeCaseUserActionsResponse = (respUserActions?: CaseUserActionsResponse) => + pipe( + CaseUserActionsResponseRt.decode(respUserActions), + fold(throwErrors(createToasterPlainError), identity) + ); + +export const valueToUpdateIsSettings = ( + key: UpdateByKey['updateKey'], + value: UpdateByKey['updateValue'] +): value is CasePatchRequest['settings'] => key === 'settings'; + +export const valueToUpdateIsStatus = ( + key: UpdateByKey['updateKey'], + value: UpdateByKey['updateValue'] +): value is CasePatchRequest['status'] => key === 'status'; + +export const createUpdateSuccessToaster = ( + caseBeforeUpdate: Case, + caseAfterUpdate: Case, + key: UpdateByKey['updateKey'], + value: UpdateByKey['updateValue'] +): AppToast => { + const caseHasAlerts = caseBeforeUpdate.comments.some( + (comment) => comment.type === CommentType.alert + ); + + const toast: AppToast = { + id: uuid.v4(), + color: 'success', + iconType: 'check', + title: i18n.UPDATED_CASE(caseAfterUpdate.title), + }; + + if (valueToUpdateIsSettings(key, value) && value?.syncAlerts && caseHasAlerts) { + return { + ...toast, + title: i18n.SYNC_CASE(caseAfterUpdate.title), + }; + } + + if (valueToUpdateIsStatus(key, value) && caseHasAlerts && caseBeforeUpdate.settings.syncAlerts) { + return { + ...toast, + text: i18n.STATUS_CHANGED_TOASTER_TEXT, + }; + } + + return toast; +}; diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index a763e3d4fcfdf..638b423f5f845 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -6,19 +6,42 @@ */ import { CoreStart, CoreSetup, Plugin, PluginInitializerContext } from 'src/core/public'; +import { ReactElement } from 'react'; import { TestComponent } from '.'; +import { CreateCase, CreateCaseProps } from './components/create'; +import { PluginStart, SetupPlugins, StartPlugins, StartServices } from './types'; export interface CasesUiStart { casesComponent: () => JSX.Element; + getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; } -export class CasesUiPlugin implements Plugin<void, CasesUiStart> { +export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { private readonly casesUi = {} as CasesUiStart; constructor(initializerContext: PluginInitializerContext) {} - public setup(core: CoreSetup): void { + public setup(core: CoreSetup<StartPlugins, PluginStart>, plugins: SetupPlugins): void { this.casesUi.casesComponent = TestComponent; + this.casesUi.getCreateCase = CreateCase; + + /** + * `StartServices` which are needed by the `renderApp` function when mounting any of the subPlugin applications. + * This is a promise because these aren't available until the `start` lifecycle phase but they are referenced + * in the `setup` lifecycle phase. + */ + const startServices: Promise<StartServices> = (async () => { + const [coreStart, startPlugins] = await core.getStartServices(); + + const services: StartServices = { + ...coreStart, + ...startPlugins, + }; + return services; + })(); + + // need to figure out how to put startServices in components + console.log('heyo startServices', startServices); } public start(core: CoreStart): CasesUiStart { diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts new file mode 100644 index 0000000000000..0b94f6f17817b --- /dev/null +++ b/x-pack/plugins/cases/public/types.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from 'kibana/public'; +import { + TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, + TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, +} from '../../triggers_actions_ui/public'; + +export interface SetupPlugins { + triggersActionsUi: TriggersActionsSetup; +} + +export interface StartPlugins { + triggersActionsUi: TriggersActionsStart; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginStart {} +export type StartServices = CoreStart & StartPlugins; diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 143384d160471..9fb686ec6619a 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -206,3 +206,10 @@ export const showAllOthersBucket: string[] = [ 'destination.ip', 'user.name', ]; + +/* + Feature Flag for Cases RAC UI + DO NOT MERGE to master as true, dev only +*/ + +export const USE_RAC_CASES_UI = true; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index 9f904350b772e..cfb6259fb7999 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; @@ -18,6 +18,8 @@ import { FormContext } from './form_context'; import { useInsertTimeline } from '../use_insert_timeline'; import { fieldName as descriptionFieldName } from './description'; import { SubmitCaseButton } from './submit_button'; +import { USE_RAC_CASES_UI } from '../../../../common/constants'; +import { useKibana } from '../../../common/lib/kibana'; export const CommonUseField = getUseField({ component: Field }); @@ -39,6 +41,7 @@ const InsertTimeline = () => { }; export const Create = React.memo(() => { + const { cases } = useKibana().services; const history = useHistory(); const onSuccess = useCallback( async ({ id }) => { @@ -51,34 +54,47 @@ export const Create = React.memo(() => { history.push('/'); }, [history]); + const CreateCase = useMemo( + () => + cases.getCreateCase({ + onCancel: handleSetIsCancel, + onSuccess, + }), + [cases, handleSetIsCancel, onSuccess] + ); + return ( <EuiPanel> - <FormContext onSuccess={onSuccess}> - <CreateCaseForm /> - <Container> - <EuiFlexGroup - alignItems="center" - justifyContent="flexEnd" - gutterSize="xs" - responsive={false} - > - <EuiFlexItem grow={false}> - <EuiButtonEmpty - data-test-subj="create-case-cancel" - size="s" - onClick={handleSetIsCancel} - iconType="cross" - > - {i18n.CANCEL} - </EuiButtonEmpty> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <SubmitCaseButton /> - </EuiFlexItem> - </EuiFlexGroup> - </Container> - <InsertTimeline /> - </FormContext> + {USE_RAC_CASES_UI ? ( + <p>{'HELLO CRUEL WORLD'}</p> // <CreateCase /> + ) : ( + <FormContext onSuccess={onSuccess}> + <CreateCaseForm /> + <Container> + <EuiFlexGroup + alignItems="center" + justifyContent="flexEnd" + gutterSize="xs" + responsive={false} + > + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="create-case-cancel" + size="s" + onClick={handleSetIsCancel} + iconType="cross" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <SubmitCaseButton /> + </EuiFlexItem> + </EuiFlexGroup> + </Container> + </FormContext> + )} + <InsertTimeline /> </EuiPanel> ); }); From 841659bb3e7fded7a9463b54cd864c77002d0de6 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 10 Mar 2021 14:01:13 -0700 Subject: [PATCH 05/52] clearing type errs --- x-pack/plugins/cases/public/common/kibana.ts | 35 ++++++++++++++++ .../plugins/cases/public/common/services.ts | 42 ------------------- .../components/configure_cases/index.test.tsx | 4 +- .../components/connectors/jira/api.test.ts | 2 +- .../public/components/connectors/jira/api.ts | 2 +- .../components/connectors/resilient/api.ts | 2 +- .../connectors/servicenow/api.test.ts | 2 +- .../components/connectors/servicenow/api.ts | 2 +- .../components/create/connector.test.tsx | 4 +- .../components/create/description.test.tsx | 2 +- .../public/components/create/form.test.tsx | 2 +- .../components/create/form_context.test.tsx | 2 +- .../public/components/create/index.test.tsx | 32 ++++---------- .../components/create/submit_button.test.tsx | 2 +- .../create/sync_alerts_toggle.test.tsx | 2 +- .../public/components/create/tags.test.tsx | 2 +- .../public/components/create/title.test.tsx | 2 +- .../create_case_modal.test.tsx | 2 +- .../use_create_case_modal/index.test.tsx | 6 +-- .../cases/public/containers/api.test.tsx | 2 +- x-pack/plugins/cases/public/containers/api.ts | 2 +- .../containers/configure/use_action_types.tsx | 2 +- .../containers/configure/use_configure.tsx | 6 +-- .../containers/configure/use_connectors.tsx | 2 +- .../cases/public/containers/constants.ts | 9 ++++ .../cases/public/containers/use_get_cases.tsx | 2 +- 26 files changed, 78 insertions(+), 96 deletions(-) delete mode 100644 x-pack/plugins/cases/public/common/services.ts create mode 100644 x-pack/plugins/cases/public/containers/constants.ts diff --git a/x-pack/plugins/cases/public/common/kibana.ts b/x-pack/plugins/cases/public/common/kibana.ts index af5cab6a3a314..6c71778d2e743 100644 --- a/x-pack/plugins/cases/public/common/kibana.ts +++ b/x-pack/plugins/cases/public/common/kibana.ts @@ -8,7 +8,42 @@ // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { useKibana } from '../../../../../src/plugins/kibana_react/public/context'; import { StartServices } from '../types'; +import { CoreStart } from '../../../../../src/core/public'; const useTypedKibana = () => useKibana<StartServices>(); export { useTypedKibana as useKibana }; + +type GlobalServices = Pick<CoreStart, 'http'>; // | 'uiSettings' & Pick<StartPlugins, 'data'>; not sure if we need this + +export class KibanaServices { + private static kibanaVersion?: string; + private static services?: GlobalServices; + + public static init({ http, kibanaVersion }: GlobalServices & { kibanaVersion: string }) { + this.services = { http }; + this.kibanaVersion = kibanaVersion; + } + + public static get(): GlobalServices { + if (!this.services) { + this.throwUninitializedError(); + } + + return this.services; + } + + public static getKibanaVersion(): string { + if (!this.kibanaVersion) { + this.throwUninitializedError(); + } + + return this.kibanaVersion; + } + + private static throwUninitializedError(): never { + throw new Error( + 'Kibana services not initialized - are you trying to import this module from outside of the SIEM app?' + ); + } +} diff --git a/x-pack/plugins/cases/public/common/services.ts b/x-pack/plugins/cases/public/common/services.ts deleted file mode 100644 index f75ebb5cbcaf0..0000000000000 --- a/x-pack/plugins/cases/public/common/services.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CoreStart } from '../../../../../src/core/public'; - -type GlobalServices = Pick<CoreStart, 'http'>; // | 'uiSettings' & Pick<StartPlugins, 'data'>; not sure if we need this - -export class KibanaServices { - private static kibanaVersion?: string; - private static services?: GlobalServices; - - public static init({ http, kibanaVersion }: GlobalServices & { kibanaVersion: string }) { - this.services = { http }; - this.kibanaVersion = kibanaVersion; - } - - public static get(): GlobalServices { - if (!this.services) { - this.throwUninitializedError(); - } - - return this.services; - } - - public static getKibanaVersion(): string { - if (!this.kibanaVersion) { - this.throwUninitializedError(); - } - - return this.kibanaVersion; - } - - private static throwUninitializedError(): never { - throw new Error( - 'Kibana services not initialized - are you trying to import this module from outside of the SIEM app?' - ); - } -} diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index 00556a723362a..d0af5e7e892e3 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -17,8 +17,8 @@ import { ConnectorAddFlyout, ConnectorEditFlyout, TriggersAndActionsUIPublicPluginStart, -} from '../../../../../triggers_actions_ui/public'; -import { actionTypeRegistryMock } from '../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; +} from '../../../../triggers_actions_ui/public'; +import { actionTypeRegistryMock } from '../../../../triggers_actions_ui/public/application/action_type_registry.mock'; import { useKibana } from '../../common/kibana'; import { useConnectors } from '../../containers/configure/use_connectors'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts b/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts index 7190a44f3ab1f..bbab8a14b5ed9 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; import { getIssueTypes, getFieldsByIssueType, getIssues, getIssue } from './api'; const issueTypesResponse = { diff --git a/x-pack/plugins/cases/public/components/connectors/jira/api.ts b/x-pack/plugins/cases/public/components/connectors/jira/api.ts index 4ebb06192e62d..dff3e3a5b41ab 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/api.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/api.ts @@ -6,7 +6,7 @@ */ import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { ActionTypeExecutorResult } from '../../../../../actions/common'; import { IssueTypes, Fields, Issues, Issue } from './types'; export const BASE_ACTION_API_PATH = '/api/actions'; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/api.ts b/x-pack/plugins/cases/public/components/connectors/resilient/api.ts index 6d57f38fa961c..5fec83f303950 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/api.ts +++ b/x-pack/plugins/cases/public/components/connectors/resilient/api.ts @@ -6,7 +6,7 @@ */ import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { ActionTypeExecutorResult } from '../../../../../actions/common'; import { ResilientIncidentTypes, ResilientSeverity } from './types'; export const BASE_ACTION_API_PATH = '/api/actions'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts index 6a6bb7e947997..461823036ed21 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/api.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { httpServiceMock } from '../../../../../../../src/core/public/mocks'; import { getChoices } from './api'; import { choices } from '../mock'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts index d91ad9f8762bd..e68eb18860ae3 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts @@ -6,7 +6,7 @@ */ import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { ActionTypeExecutorResult } from '../../../../../actions/common'; import { Choice } from './types'; export const BASE_ACTION_API_PATH = '/api/actions'; diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx index 9c5a4a0784af1..7c155b064b9bc 100644 --- a/x-pack/plugins/cases/public/components/create/connector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useForm, Form, FormHook } from '../../common/shared_imports'; import { connectorsMock } from '../../containers/mock'; import { Connector } from './connector'; import { useConnectors } from '../../containers/configure/use_connectors'; @@ -20,7 +20,7 @@ import { useGetChoices } from '../connectors/servicenow/use_get_choices'; import { incidentTypes, severity, choices } from '../connectors/mock'; import { schema, FormProps } from './schema'; -jest.mock('../../../common/lib/kibana', () => { +jest.mock('../../common/kibana', () => { return { useKibana: () => ({ services: { diff --git a/x-pack/plugins/cases/public/components/create/description.test.tsx b/x-pack/plugins/cases/public/components/create/description.test.tsx index 7d7b5278bf8a7..fcd1f82d64a53 100644 --- a/x-pack/plugins/cases/public/components/create/description.test.tsx +++ b/x-pack/plugins/cases/public/components/create/description.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { act } from '@testing-library/react'; -import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useForm, Form, FormHook } from '../../common/shared_imports'; import { Description } from './description'; import { schema, FormProps } from './schema'; diff --git a/x-pack/plugins/cases/public/components/create/form.test.tsx b/x-pack/plugins/cases/public/components/create/form.test.tsx index 029965444929b..9e59924bdf483 100644 --- a/x-pack/plugins/cases/public/components/create/form.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; -import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useForm, Form, FormHook } from '../../common/shared_imports'; import { useGetTags } from '../../containers/use_get_tags'; import { useConnectors } from '../../containers/configure/use_connectors'; import { connectorsMock } from '../../containers/mock'; diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 9ca735dae0978..53683467b90b3 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -11,7 +11,7 @@ import { act, waitFor } from '@testing-library/react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { ConnectorTypes } from '../../../common/api'; -import { TestProviders } from '../../../common/mock'; +import { TestProviders } from '../../common/mock'; import { usePostCase } from '../../containers/use_post_case'; import { useGetTags } from '../../containers/use_get_tags'; import { useConnectors } from '../../containers/configure/use_connectors'; diff --git a/x-pack/plugins/cases/public/components/create/index.test.tsx b/x-pack/plugins/cases/public/components/create/index.test.tsx index 7172d227f492e..201582775bbc4 100644 --- a/x-pack/plugins/cases/public/components/create/index.test.tsx +++ b/x-pack/plugins/cases/public/components/create/index.test.tsx @@ -11,17 +11,15 @@ import { act, waitFor } from '@testing-library/react'; import { noop } from 'lodash/fp'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { TestProviders } from '../../../common/mock'; +import { TestProviders } from '../../common/mock'; import { useGetTags } from '../../containers/use_get_tags'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; -import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; import { useGetSeverity } from '../connectors/resilient/use_get_severity'; import { useGetIssueTypes } from '../connectors/jira/use_get_issue_types'; import { useGetFieldsByIssueType } from '../connectors/jira/use_get_fields_by_issue_type'; import { useCaseConfigureResponse } from '../configure_cases/__mock__'; -import { useInsertTimeline } from '../use_insert_timeline'; import { sampleConnectorData, sampleData, @@ -31,7 +29,7 @@ import { useGetIssueTypesResponse, useGetFieldsByIssueTypeResponse, } from './mock'; -import { Create } from '.'; +import { CreateCase } from '.'; jest.mock('../../containers/api'); jest.mock('../../containers/use_get_tags'); @@ -52,7 +50,6 @@ const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; const useGetSeverityMock = useGetSeverity as jest.Mock; const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; -const useInsertTimelineMock = useInsertTimeline as jest.Mock; const fetchTags = jest.fn(); const fillForm = (wrapper: ReactWrapper) => { @@ -73,7 +70,7 @@ const fillForm = (wrapper: ReactWrapper) => { }); }; -describe('Create case', () => { +describe('CreateCase case', () => { beforeEach(() => { jest.resetAllMocks(); jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); @@ -92,9 +89,7 @@ describe('Create case', () => { it('it renders', async () => { const wrapper = mount( <TestProviders> - <Router history={mockHistory}> - <Create /> - </Router> + <CreateCase /> </TestProviders> ); @@ -105,9 +100,7 @@ describe('Create case', () => { it('should redirect to all cases on cancel click', async () => { const wrapper = mount( <TestProviders> - <Router history={mockHistory}> - <Create /> - </Router> + <CreateCase /> </TestProviders> ); @@ -118,29 +111,20 @@ describe('Create case', () => { it('should redirect to new case when posting the case', async () => { const wrapper = mount( <TestProviders> - <Router history={mockHistory}> - <Create /> - </Router> + <CreateCase /> </TestProviders> ); fillForm(wrapper); wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - - await waitFor(() => expect(mockHistory.push).toHaveBeenNthCalledWith(1, '/basic-case-id')); }); it('it should insert a timeline', async () => { - let attachTimeline = noop; - useInsertTimelineMock.mockImplementation((value, onTimelineAttached) => { - attachTimeline = onTimelineAttached; - }); + const attachTimeline = noop; const wrapper = mount( <TestProviders> - <Router history={mockHistory}> - <Create /> - </Router> + <CreateCase /> </TestProviders> ); diff --git a/x-pack/plugins/cases/public/components/create/submit_button.test.tsx b/x-pack/plugins/cases/public/components/create/submit_button.test.tsx index ab98e75b6058e..dd67c8170dc3f 100644 --- a/x-pack/plugins/cases/public/components/create/submit_button.test.tsx +++ b/x-pack/plugins/cases/public/components/create/submit_button.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; -import { useForm, Form } from '../../../shared_imports'; +import { useForm, Form } from '../../common/shared_imports'; import { SubmitCaseButton } from './submit_button'; import { schema, FormProps } from './schema'; diff --git a/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx b/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx index eadec1525ed90..b4a37f0abb518 100644 --- a/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx +++ b/x-pack/plugins/cases/public/components/create/sync_alerts_toggle.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { waitFor } from '@testing-library/react'; -import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useForm, Form, FormHook } from '../../common/shared_imports'; import { SyncAlertsToggle } from './sync_alerts_toggle'; import { schema, FormProps } from './schema'; diff --git a/x-pack/plugins/cases/public/components/create/tags.test.tsx b/x-pack/plugins/cases/public/components/create/tags.test.tsx index c723d456afe73..2eddb83dcac29 100644 --- a/x-pack/plugins/cases/public/components/create/tags.test.tsx +++ b/x-pack/plugins/cases/public/components/create/tags.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { waitFor } from '@testing-library/react'; -import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useForm, Form, FormHook } from '../../common/shared_imports'; import { useGetTags } from '../../containers/use_get_tags'; import { Tags } from './tags'; import { schema, FormProps } from './schema'; diff --git a/x-pack/plugins/cases/public/components/create/title.test.tsx b/x-pack/plugins/cases/public/components/create/title.test.tsx index 2ac14ccd1b254..a41d5afbb4038 100644 --- a/x-pack/plugins/cases/public/components/create/title.test.tsx +++ b/x-pack/plugins/cases/public/components/create/title.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { act } from '@testing-library/react'; -import { useForm, Form, FormHook } from '../../../shared_imports'; +import { useForm, Form, FormHook } from '../../common/shared_imports'; import { Title } from './title'; import { schema, FormProps } from './schema'; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx index 0c996e9bab589..99c6d06d78aae 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import '../../../common/mock/match_media'; import { CreateCaseModal } from './create_case_modal'; -import { TestProviders } from '../../../common/mock'; +import { TestProviders } from '../../common/mock'; jest.mock('../create/form_context', () => { return { diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index bfe3bad46c09a..e555670b237e5 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -10,13 +10,13 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { useKibana } from '../../../common/lib/kibana'; +import { useKibana } from '../../common/kibana'; import '../../../common/mock/match_media'; import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; -import { mockTimelineModel, TestProviders } from '../../../common/mock'; +import { mockTimelineModel, TestProviders } from '../../common/mock'; import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; -jest.mock('../../../common/lib/kibana'); +jest.mock('../../common/kibana'); jest.mock('../create/form_context', () => { return { FormContext: ({ diff --git a/x-pack/plugins/cases/public/containers/api.test.tsx b/x-pack/plugins/cases/public/containers/api.test.tsx index 7d3615a498bc8..cadb0f44ae64e 100644 --- a/x-pack/plugins/cases/public/containers/api.test.tsx +++ b/x-pack/plugins/cases/public/containers/api.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaServices } from '../../common/lib/kibana'; +import { KibanaServices } from '../common/kibana'; import { ConnectorTypes, CommentType, CaseStatuses } from '../../common/api'; import { CASES_URL } from '../../common/constants'; diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts index 3baf0f32f7105..1954a690f04b8 100644 --- a/x-pack/plugins/cases/public/containers/api.ts +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -43,7 +43,7 @@ import { getSubCaseUserActionUrl, } from '../../common/api/helpers'; -import { KibanaServices } from '../common/services'; +import { KibanaServices } from '../common/kibana'; import { StatusAll } from '../components/status'; import { diff --git a/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx b/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx index 3590fffdef5b2..206952661e672 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; -import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; +import { useStateToaster, errorToToaster } from '../../components/toasters'; import * as i18n from '../translations'; import { fetchActionTypes } from './api'; import { ActionTypeConnector } from './types'; diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx index f1b06bbd7860c..6dd58ee92b741 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx @@ -8,11 +8,7 @@ import { useEffect, useCallback, useReducer, useRef } from 'react'; import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; -import { - useStateToaster, - errorToToaster, - displaySuccessToast, -} from '../../../common/components/toasters'; +import { useStateToaster, errorToToaster, displaySuccessToast } from '../../components/toasters'; import * as i18n from './translations'; import { ClosureType, CaseConfigure, CaseConnector, CaseConnectorMapping } from './types'; import { ConnectorTypes } from '../../../common/api/connectors'; diff --git a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx index 338d04f702c63..b385a2676e044 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; -import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; +import { useStateToaster, errorToToaster } from '../../components/toasters'; import * as i18n from '../translations'; import { fetchConnectors } from './api'; import { ActionConnector } from './types'; diff --git a/x-pack/plugins/cases/public/containers/constants.ts b/x-pack/plugins/cases/public/containers/constants.ts new file mode 100644 index 0000000000000..be030f4d2f75b --- /dev/null +++ b/x-pack/plugins/cases/public/containers/constants.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const DEFAULT_TABLE_ACTIVE_PAGE = 1; +export const DEFAULT_TABLE_LIMIT = 5; diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.tsx index d27bb5ab1b462..e06a47954cdd4 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.tsx @@ -8,7 +8,7 @@ import { useCallback, useEffect, useReducer, useRef } from 'react'; import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case, UpdateByKey } from './types'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; +import { errorToToaster, useStateToaster } from '../components/toasters'; import * as i18n from './translations'; import { getCases, patchCase } from './api'; import { StatusAll } from '../components/status'; From ead2da02dc5d0cf1f95beed56fcfc2f284f3fc54 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 10 Mar 2021 14:07:15 -0700 Subject: [PATCH 06/52] clearing type errs --- x-pack/plugins/cases/public/components/create/index.test.tsx | 2 -- .../public/components/use_create_case_modal/index.test.tsx | 4 +--- x-pack/plugins/cases/public/containers/configure/api.test.ts | 2 +- x-pack/plugins/cases/public/containers/configure/api.ts | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/cases/public/components/create/index.test.tsx b/x-pack/plugins/cases/public/components/create/index.test.tsx index 201582775bbc4..458f9a44079e8 100644 --- a/x-pack/plugins/cases/public/components/create/index.test.tsx +++ b/x-pack/plugins/cases/public/components/create/index.test.tsx @@ -73,7 +73,6 @@ const fillForm = (wrapper: ReactWrapper) => { describe('CreateCase case', () => { beforeEach(() => { jest.resetAllMocks(); - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); useConnectorsMock.mockReturnValue(sampleConnectorData); useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); @@ -105,7 +104,6 @@ describe('CreateCase case', () => { ); wrapper.find(`[data-test-subj="create-case-cancel"]`).first().simulate('click'); - await waitFor(() => expect(mockHistory.push).toHaveBeenCalledWith('/')); }); it('should redirect to new case when posting the case', async () => { diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index e555670b237e5..44af85873cebf 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -13,8 +13,7 @@ import userEvent from '@testing-library/user-event'; import { useKibana } from '../../common/kibana'; import '../../../common/mock/match_media'; import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; -import { mockTimelineModel, TestProviders } from '../../common/mock'; -import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import { TestProviders } from '../../common/mock'; jest.mock('../../common/kibana'); jest.mock('../create/form_context', () => { @@ -71,7 +70,6 @@ describe('useCreateCaseModal', () => { beforeEach(() => { navigateToApp = jest.fn(); useKibanaMock().services.application.navigateToApp = navigateToApp; - (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); }); it('init', async () => { diff --git a/x-pack/plugins/cases/public/containers/configure/api.test.ts b/x-pack/plugins/cases/public/containers/configure/api.test.ts index 08bda07814711..94cf5192bf514 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.test.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaServices } from '../../../common/lib/kibana'; +import { KibanaServices } from '../../common/kibana'; import { fetchConnectors, getCaseConfigure, diff --git a/x-pack/plugins/cases/public/containers/configure/api.ts b/x-pack/plugins/cases/public/containers/configure/api.ts index d92906c9c2ab3..659c7404521cf 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.ts @@ -13,7 +13,7 @@ import { CasesConfigureResponse, CasesConfigureRequest, } from '../../../common/api'; -import { KibanaServices } from '../../../common/lib/kibana'; +import { KibanaServices } from '../../common/kibana'; import { CASE_CONFIGURE_CONNECTORS_URL, From 7a320423a05d0369e4b47da46d4206b5801bc93f Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 10 Mar 2021 16:23:42 -0700 Subject: [PATCH 07/52] resolve issue w exports --- x-pack/plugins/cases/common/api/index.ts | 1 + x-pack/plugins/cases/common/constants.ts | 4 ++-- x-pack/plugins/cases/common/index.ts | 9 +++++++ x-pack/plugins/cases/kibana.json | 3 ++- .../common/{kibana.ts => lib/kibana_react.ts} | 12 ++++++---- .../components/configure_cases/index.test.tsx | 2 +- .../components/configure_cases/index.tsx | 2 +- .../connectors/jira/case_fields.test.tsx | 2 +- .../connectors/jira/case_fields.tsx | 2 +- .../connectors/jira/search_issues.tsx | 2 +- .../use_get_fields_by_issue_type.test.tsx | 4 ++-- .../jira/use_get_issue_types.test.tsx | 4 ++-- .../connectors/jira/use_get_issues.test.tsx | 4 ++-- .../jira/use_get_single_issue.test.tsx | 4 ++-- .../connectors/resilient/case_fields.test.tsx | 2 +- .../connectors/resilient/case_fields.tsx | 2 +- .../resilient/use_get_incident_types.test.tsx | 4 ++-- .../resilient/use_get_severity.test.tsx | 4 ++-- .../servicenow_itsm_case_fields.test.tsx | 2 +- .../servicenow_itsm_case_fields.tsx | 2 +- .../servicenow_sir_case_fields.test.tsx | 2 +- .../servicenow/servicenow_sir_case_fields.tsx | 2 +- .../servicenow/use_get_choices.test.tsx | 4 ++-- .../components/create/connector.test.tsx | 2 +- .../public/components/create/description.tsx | 4 ++-- .../use_create_case_modal/index.test.tsx | 4 ++-- .../cases/public/containers/api.test.tsx | 2 +- x-pack/plugins/cases/public/containers/api.ts | 2 +- .../public/containers/configure/api.test.ts | 2 +- .../cases/public/containers/configure/api.ts | 2 +- .../components/configure_cases/connectors.tsx | 2 +- .../connectors/jira/case_fields.tsx | 2 +- .../connectors/resilient/case_fields.tsx | 2 +- .../servicenow_itsm_case_fields.tsx | 5 +--- .../servicenow/servicenow_sir_case_fields.tsx | 5 +--- .../cases/components/connectors/types.ts | 4 ++-- .../public/cases/components/create/index.tsx | 24 +++++++++---------- .../public/cases/containers/api.ts | 5 +--- .../containers/configure/use_configure.tsx | 2 +- 39 files changed, 76 insertions(+), 72 deletions(-) create mode 100644 x-pack/plugins/cases/common/index.ts rename x-pack/plugins/cases/public/common/{kibana.ts => lib/kibana_react.ts} (80%) diff --git a/x-pack/plugins/cases/common/api/index.ts b/x-pack/plugins/cases/common/api/index.ts index 7780564089d3d..2ef03dd96e315 100644 --- a/x-pack/plugins/cases/common/api/index.ts +++ b/x-pack/plugins/cases/common/api/index.ts @@ -7,6 +7,7 @@ export * from './cases'; export * from './connectors'; +export * from './helpers'; export * from './runtime_types'; export * from './saved_object'; export * from './user'; diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index 1e7cff99a00bd..405552140db0f 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { DEFAULT_MAX_SIGNALS } from '../../security_solution/common/constants'; - +// import { DEFAULT_MAX_SIGNALS } from '../../security_solution/common/constants'; +const DEFAULT_MAX_SIGNALS = 100; export const APP_ID = 'cases'; /** diff --git a/x-pack/plugins/cases/common/index.ts b/x-pack/plugins/cases/common/index.ts new file mode 100644 index 0000000000000..37c11172b50b2 --- /dev/null +++ b/x-pack/plugins/cases/common/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './constants'; +export * from './api'; diff --git a/x-pack/plugins/cases/kibana.json b/x-pack/plugins/cases/kibana.json index 03c793fe9ef06..27b36d7e86e1f 100644 --- a/x-pack/plugins/cases/kibana.json +++ b/x-pack/plugins/cases/kibana.json @@ -2,7 +2,8 @@ "configPath": ["xpack", "cases"], "id": "cases", "kibanaVersion": "kibana", - "requiredPlugins": ["actions", "kibanaReact"], + "extraPublicDirs": ["common"], + "requiredPlugins": ["actions", "esUiShared", "kibanaReact", "triggersActionsUi"], "optionalPlugins": [ "spaces", "security" diff --git a/x-pack/plugins/cases/public/common/kibana.ts b/x-pack/plugins/cases/public/common/lib/kibana_react.ts similarity index 80% rename from x-pack/plugins/cases/public/common/kibana.ts rename to x-pack/plugins/cases/public/common/lib/kibana_react.ts index 6c71778d2e743..be915b1499f2c 100644 --- a/x-pack/plugins/cases/public/common/kibana.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana_react.ts @@ -5,14 +5,16 @@ * 2.0. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { useKibana } from '../../../../../src/plugins/kibana_react/public/context'; -import { StartServices } from '../types'; -import { CoreStart } from '../../../../../src/core/public'; +import { CoreStart } from 'kibana/public'; +import { + KibanaContextProvider, + useKibana, +} from '../../../../../../src/plugins/kibana_react/public'; +import { StartServices } from '../../types'; const useTypedKibana = () => useKibana<StartServices>(); -export { useTypedKibana as useKibana }; +export { KibanaContextProvider, useTypedKibana as useKibana }; type GlobalServices = Pick<CoreStart, 'http'>; // | 'uiSettings' & Pick<StartPlugins, 'data'>; not sure if we need this diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index d0af5e7e892e3..7c4813ead37a8 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -20,7 +20,7 @@ import { } from '../../../../triggers_actions_ui/public'; import { actionTypeRegistryMock } from '../../../../triggers_actions_ui/public/application/action_type_registry.mock'; -import { useKibana } from '../../common/kibana'; +import { useKibana } from '../../common/lib/kibana_react'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; import { useActionTypes } from '../../containers/configure/use_action_types'; diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index e6a4f86be793b..4f4c5fd058d5f 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -11,7 +11,7 @@ import styled, { css } from 'styled-components'; import { EuiCallOut } from '@elastic/eui'; import { SUPPORTED_CONNECTORS } from '../../../common/constants'; -import { useKibana } from '../../common/kibana'; +import { useKibana } from '../../common/lib/kibana_react'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useActionTypes } from '../../containers/configure/use_action_types'; import { useCaseConfigure } from '../../containers/configure/use_configure'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx index 596d4de4a562c..0c80a0b77ec65 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx @@ -18,7 +18,7 @@ import { useGetSingleIssue } from './use_get_single_issue'; import { useGetIssues } from './use_get_issues'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./use_get_issue_types'); jest.mock('./use_get_fields_by_issue_type'); jest.mock('./use_get_single_issue'); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx index 08cf1fe02f3b5..484c94dfae39a 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx @@ -11,7 +11,7 @@ import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@el import * as i18n from './translations'; import { ConnectorTypes, JiraFieldsType } from '../../../../common/api/connectors'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { ConnectorFieldsProps } from '../types'; import { useGetIssueTypes } from './use_get_issue_types'; import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx index db8f80af883d1..6c650b9a55b77 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx @@ -8,7 +8,7 @@ import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { ActionConnector } from '../../../containers/types'; import { useGetIssues } from './use_get_issues'; import { useGetSingleIssue } from './use_get_single_issue'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx index 6df674e7def57..815cbdd550aa4 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { connector } from '../mock'; import { useGetFieldsByIssueType, UseGetFieldsByIssueType } from './use_get_fields_by_issue_type'; import * as api from './api'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx index 83a60c7f5b3ce..80836169d30a7 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { connector } from '../mock'; import { useGetIssueTypes, UseGetIssueTypes } from './use_get_issue_types'; import * as api from './api'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx index 3d0c9614831da..68b18beaa62d4 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { connector as actionConnector, issues } from '../mock'; import { useGetIssues, UseGetIssues } from './use_get_issues'; import * as api from './api'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx index d5152545707b1..24339b3446ddf 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { connector as actionConnector, issues } from '../mock'; import { useGetSingleIssue, UseGetSingleIssue } from './use_get_single_issue'; import * as api from './api'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx index cf8aa87c65440..ea3ead496a6e6 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx @@ -15,7 +15,7 @@ import { useGetIncidentTypes } from './use_get_incident_types'; import { useGetSeverity } from './use_get_severity'; import Fields from './case_fields'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./use_get_incident_types'); jest.mock('./use_get_severity'); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx index 88fb907b16cde..0f43cabbb5d52 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx @@ -15,7 +15,7 @@ import { EuiSpacer, } from '@elastic/eui'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { ConnectorFieldsProps } from '../types'; import { useGetIncidentTypes } from './use_get_incident_types'; import { useGetSeverity } from './use_get_severity'; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx index e3050cd68659b..c43fa3ec56e80 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { connector } from '../mock'; import { useGetIncidentTypes, UseGetIncidentTypes } from './use_get_incident_types'; import * as api from './api'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx index db67f722fd17a..d8ea591c2edbe 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { connector } from '../mock'; import { useGetSeverity, UseGetSeverity } from './use_get_severity'; import * as api from './api'; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx index 489570b22f187..509a0289c6160 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx @@ -16,7 +16,7 @@ import Fields from './servicenow_itsm_case_fields'; let onChoicesSuccess = (c: Choice[]) => {}; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./use_get_choices', () => ({ useGetChoices: (args: { onSuccess: () => void }) => { onChoicesSuccess = args.onSuccess; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx index 4587b4b321a8f..81113eee78104 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx @@ -11,7 +11,7 @@ import * as i18n from './translations'; import { ConnectorFieldsProps } from '../types'; import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../common/api/connectors'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { ConnectorCard } from '../card'; import { useGetChoices } from './use_get_choices'; import { Fields, Choice } from './types'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx index 9bf74bfd5feaf..1fd54ae985c13 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx @@ -16,7 +16,7 @@ import Fields from './servicenow_sir_case_fields'; let onChoicesSuccess = (c: Choice[]) => {}; -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); jest.mock('./use_get_choices', () => ({ useGetChoices: (args: { onSuccess: () => void }) => { onChoicesSuccess = args.onSuccess; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx index 3b59aa1d3eb3c..c2bda4caa5d98 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx @@ -9,7 +9,7 @@ import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react' import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../common/api/connectors'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { ConnectorFieldsProps } from '../types'; import { ConnectorCard } from '../card'; import { useGetChoices } from './use_get_choices'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx index 6a956f6327388..bdc634ae57bf9 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx @@ -7,14 +7,14 @@ import { renderHook } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/kibana'; +import { useKibana } from '../../../common/lib/kibana_react'; import { ActionConnector } from '../../../containers/types'; import { choices } from '../mock'; import { useGetChoices, UseGetChoices, UseGetChoicesProps } from './use_get_choices'; import * as api from './api'; jest.mock('./api'); -jest.mock('../../../common/kibana'); +jest.mock('../../../common/lib/kibana_react'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; const onSuccess = jest.fn(); diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx index 7c155b064b9bc..b228418a8e221 100644 --- a/x-pack/plugins/cases/public/components/create/connector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -20,7 +20,7 @@ import { useGetChoices } from '../connectors/servicenow/use_get_choices'; import { incidentTypes, severity, choices } from '../connectors/mock'; import { schema, FormProps } from './schema'; -jest.mock('../../common/kibana', () => { +jest.mock('../../common/lib/kibana_react', () => { return { useKibana: () => ({ services: { diff --git a/x-pack/plugins/cases/public/components/create/description.tsx b/x-pack/plugins/cases/public/components/create/description.tsx index b1032ab0c7528..b5aab267b38e2 100644 --- a/x-pack/plugins/cases/public/components/create/description.tsx +++ b/x-pack/plugins/cases/public/components/create/description.tsx @@ -6,9 +6,9 @@ */ import React, { memo } from 'react'; -import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; +// import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; import { UseField } from '../../common/shared_imports'; - +const MarkdownEditorForm = () => <>{'formyform'}</>; interface Props { isLoading: boolean; } diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index 44af85873cebf..009e950f81ee3 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -10,12 +10,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { useKibana } from '../../common/kibana'; +import { useKibana } from '../../common/lib/kibana_react'; import '../../../common/mock/match_media'; import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; import { TestProviders } from '../../common/mock'; -jest.mock('../../common/kibana'); +jest.mock('../../common/lib/kibana_react'); jest.mock('../create/form_context', () => { return { FormContext: ({ diff --git a/x-pack/plugins/cases/public/containers/api.test.tsx b/x-pack/plugins/cases/public/containers/api.test.tsx index cadb0f44ae64e..33e088b9cff04 100644 --- a/x-pack/plugins/cases/public/containers/api.test.tsx +++ b/x-pack/plugins/cases/public/containers/api.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaServices } from '../common/kibana'; +import { KibanaServices } from '../common/lib/kibana_react'; import { ConnectorTypes, CommentType, CaseStatuses } from '../../common/api'; import { CASES_URL } from '../../common/constants'; diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts index 1954a690f04b8..7af616cf8e0c1 100644 --- a/x-pack/plugins/cases/public/containers/api.ts +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -43,7 +43,7 @@ import { getSubCaseUserActionUrl, } from '../../common/api/helpers'; -import { KibanaServices } from '../common/kibana'; +import { KibanaServices } from '../common/lib/kibana_react'; import { StatusAll } from '../components/status'; import { diff --git a/x-pack/plugins/cases/public/containers/configure/api.test.ts b/x-pack/plugins/cases/public/containers/configure/api.test.ts index 94cf5192bf514..64db5092cd883 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.test.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaServices } from '../../common/kibana'; +import { KibanaServices } from '../../common/lib/kibana_react'; import { fetchConnectors, getCaseConfigure, diff --git a/x-pack/plugins/cases/public/containers/configure/api.ts b/x-pack/plugins/cases/public/containers/configure/api.ts index 659c7404521cf..3da2405c719bb 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.ts @@ -13,7 +13,7 @@ import { CasesConfigureResponse, CasesConfigureRequest, } from '../../../common/api'; -import { KibanaServices } from '../../common/kibana'; +import { KibanaServices } from '../../common/lib/kibana_react'; import { CASE_CONFIGURE_CONNECTORS_URL, diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx index 1e0ae95ff901c..c0a5e3c4c8f72 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx @@ -21,7 +21,7 @@ import * as i18n from './translations'; import { ActionConnector, CaseConnectorMapping } from '../../containers/configure/types'; import { Mapping } from './mapping'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; +import { ConnectorTypes } from '../../../../../cases/common'; const EuiFormRowExtended = styled(EuiFormRow)` .euiFormRow__labelWrapper { diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx index 22e80d43f34e1..985537e799596 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx @@ -10,7 +10,7 @@ import { map } from 'lodash/fp'; import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import * as i18n from './translations'; -import { ConnectorTypes, JiraFieldsType } from '../../../../../../cases/common/api/connectors'; +import { ConnectorTypes, JiraFieldsType } from '../../../../../../cases/common'; import { useKibana } from '../../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { useGetIssueTypes } from './use_get_issue_types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx index b1fbfb1169d08..ae9b5a4dd6f49 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx @@ -21,7 +21,7 @@ import { useGetIncidentTypes } from './use_get_incident_types'; import { useGetSeverity } from './use_get_severity'; import * as i18n from './translations'; -import { ConnectorTypes, ResilientFieldsType } from '../../../../../../cases/common/api/connectors'; +import { ConnectorTypes, ResilientFieldsType } from '../../../../../../cases/common'; import { ConnectorCard } from '../card'; const ResilientFieldsComponent: React.FunctionComponent< diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx index accb8450802d4..f705c9005e480 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx @@ -10,10 +10,7 @@ import { EuiFormRow, EuiSelect, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@el import * as i18n from './translations'; import { ConnectorFieldsProps } from '../types'; -import { - ConnectorTypes, - ServiceNowITSMFieldsType, -} from '../../../../../../cases/common/api/connectors'; +import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../../../cases/common'; import { useKibana } from '../../../../common/lib/kibana'; import { ConnectorCard } from '../card'; import { useGetChoices } from './use_get_choices'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx index 63502e3454fcf..50e317e8350fa 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx @@ -8,10 +8,7 @@ import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; -import { - ConnectorTypes, - ServiceNowSIRFieldsType, -} from '../../../../../../cases/common/api/connectors'; +import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../../../cases/common/api'; import { useKibana } from '../../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { ConnectorCard } from '../card'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts index 11452b966670b..86f0238dd450f 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts @@ -12,9 +12,9 @@ import { CaseField, ActionConnector, ConnectorTypeFields, -} from '../../../../../cases/common/api'; +} from '../../../../../cases/common'; -export { ThirdPartyField as AllThirdPartyFields } from '../../../../../cases/common/api'; +export { ThirdPartyField as AllThirdPartyFields } from '../../../../../cases/common'; export type CaseActionConnector = ActionConnector; export interface ThirdPartyField { diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index cfb6259fb7999..222070985ead6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -28,17 +28,17 @@ const Container = styled.div` margin-top: ${theme.eui.euiSize}; `} `; - -const InsertTimeline = () => { - const { setFieldValue, getFormData } = useFormContext(); - const formData = getFormData(); - const onTimelineAttached = useCallback( - (newValue: string) => setFieldValue(descriptionFieldName, newValue), - [setFieldValue] - ); - useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); - return null; -}; +// +// const InsertTimeline = () => { +// const { setFieldValue, getFormData } = useFormContext(); +// const formData = getFormData(); +// const onTimelineAttached = useCallback( +// (newValue: string) => setFieldValue(descriptionFieldName, newValue), +// [setFieldValue] +// ); +// useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); +// return null; +// }; export const Create = React.memo(() => { const { cases } = useKibana().services; @@ -94,7 +94,7 @@ export const Create = React.memo(() => { </Container> </FormContext> )} - <InsertTimeline /> + {/* <InsertTimeline />*/} </EuiPanel> ); }); diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.ts b/x-pack/plugins/security_solution/public/cases/containers/api.ts index 644c7dbf716bf..7f3a34fb789fe 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/api.ts +++ b/x-pack/plugins/security_solution/public/cases/containers/api.ts @@ -32,16 +32,13 @@ import { CASES_URL, SUB_CASE_DETAILS_URL, SUB_CASES_PATCH_DEL_URL, -} from '../../../../cases/common/constants'; - -import { getCaseCommentsUrl, getCasePushUrl, getCaseDetailsUrl, getCaseUserActionUrl, getSubCaseDetailsUrl, getSubCaseUserActionUrl, -} from '../../../../cases/common/api/helpers'; +} from '../../../../cases/common'; import { KibanaServices } from '../../common/lib/kibana'; import { StatusAll } from '../components/status'; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx index 2ec2a73363bfe..2087753b26039 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx @@ -15,7 +15,7 @@ import { } from '../../../common/components/toasters'; import * as i18n from './translations'; import { ClosureType, CaseConfigure, CaseConnector, CaseConnectorMapping } from './types'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; +import { ConnectorTypes } from '../../../../../cases/common'; export type ConnectorConfiguration = { connector: CaseConnector } & { closureType: CaseConfigure['closureType']; From 359e8d1af264847709f23b5a153c2ceb2ea99cef Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 07:50:37 -0700 Subject: [PATCH 08/52] its working --- .../cases/public/components/create/index.tsx | 9 +- .../components/markdown_editor/constants.ts | 8 ++ .../components/markdown_editor/editor.tsx | 57 +++++++++ .../components/markdown_editor/eui_form.tsx | 66 ++++++++++ .../components/markdown_editor/index.tsx | 11 ++ .../markdown_editor/markdown_link.tsx | 35 +++++ .../markdown_editor/plugins/index.ts | 25 ++++ .../plugins/timeline/constants.ts | 9 ++ .../markdown_editor/plugins/timeline/index.ts | 12 ++ .../plugins/timeline/parser.ts | 120 ++++++++++++++++++ .../plugins/timeline/plugin.tsx | 97 ++++++++++++++ .../plugins/timeline/processor.tsx | 35 +++++ .../plugins/timeline/translations.ts | 55 ++++++++ .../markdown_editor/plugins/timeline/types.ts | 19 +++ .../markdown_editor/renderer.test.tsx | 63 +++++++++ .../components/markdown_editor/renderer.tsx | 41 ++++++ .../markdown_editor/translations.ts | 22 ++++ .../components/markdown_editor/types.ts | 11 ++ .../plugins/cases/public/get_create_case.tsx | 18 +++ x-pack/plugins/cases/public/plugin.ts | 45 ++----- .../public/cases/components/create/index.tsx | 15 +-- 21 files changed, 727 insertions(+), 46 deletions(-) create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/constants.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/editor.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/index.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/markdown_link.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/translations.ts create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/types.ts create mode 100644 x-pack/plugins/cases/public/get_create_case.tsx diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index df360b708aa08..3f92140529ef9 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { ReactElement } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import styled from 'styled-components'; @@ -28,8 +28,8 @@ export interface CreateCaseProps { onCancel: () => void; onSuccess: (theCase: Case) => Promise<void>; } - -export const CreateCase = ({ onCancel, onSuccess }: CreateCaseProps) => ( +type CC = (props: CreateCaseProps) => ReactElement<CreateCaseProps>; +export const CreateCase: CC = ({ onCancel, onSuccess }: CreateCaseProps) => ( <FormContext onSuccess={onSuccess}> <CreateCaseForm /> <Container> @@ -52,4 +52,5 @@ export const CreateCase = ({ onCancel, onSuccess }: CreateCaseProps) => ( </FormContext> ); -CreateCase.displayName = 'CreateCase'; +// eslint-disable-next-line import/no-default-export +export { CreateCase as default }; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/constants.ts b/x-pack/plugins/cases/public/components/markdown_editor/constants.ts new file mode 100644 index 0000000000000..58b99f47271fc --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/constants.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const MARKDOWN_HELP_LINK = 'https://www.markdownguide.org/cheat-sheet/'; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx new file mode 100644 index 0000000000000..12084a17e888a --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useEffect, useState, useCallback } from 'react'; +import { EuiMarkdownEditor } from '@elastic/eui'; + +import { uiPlugins, parsingPlugins, processingPlugins } from './plugins'; + +interface MarkdownEditorProps { + onChange: (content: string) => void; + value: string; + ariaLabel: string; + editorId?: string; + dataTestSubj?: string; + height?: number; +} + +const MarkdownEditorComponent: React.FC<MarkdownEditorProps> = ({ + onChange, + value, + ariaLabel, + editorId, + dataTestSubj, + height, +}) => { + const [markdownErrorMessages, setMarkdownErrorMessages] = useState([]); + const onParse = useCallback((err, { messages }) => { + setMarkdownErrorMessages(err ? [err] : messages); + }, []); + + useEffect( + () => document.querySelector<HTMLElement>('textarea.euiMarkdownEditorTextArea')?.focus(), + [] + ); + + return ( + <EuiMarkdownEditor + aria-label={ariaLabel} + editorId={editorId} + onChange={onChange} + value={value} + uiPlugins={uiPlugins} + parsingPluginList={parsingPlugins} + processingPluginList={processingPlugins} + onParse={onParse} + errors={markdownErrorMessages} + data-test-subj={dataTestSubj} + height={height} + /> + ); +}; + +export const MarkdownEditor = memo(MarkdownEditorComponent); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx b/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx new file mode 100644 index 0000000000000..1c407b3b8f8c2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import styled from 'styled-components'; +import { EuiMarkdownEditorProps, EuiFormRow, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../shared_imports'; + +import { MarkdownEditor } from './editor'; + +type MarkdownEditorFormProps = EuiMarkdownEditorProps & { + id: string; + field: FieldHook; + dataTestSubj: string; + idAria: string; + isDisabled?: boolean; + bottomRightContent?: React.ReactNode; +}; + +const BottomContentWrapper = styled(EuiFlexGroup)` + ${({ theme }) => ` + padding: ${theme.eui.ruleMargins.marginSmall} 0; + `} +`; + +export const MarkdownEditorForm: React.FC<MarkdownEditorFormProps> = ({ + id, + field, + dataTestSubj, + idAria, + bottomRightContent, +}) => { + const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); + + return ( + <EuiFormRow + data-test-subj={dataTestSubj} + describedByIds={idAria ? [idAria] : undefined} + error={errorMessage} + fullWidth + helpText={field.helpText} + isInvalid={isInvalid} + label={field.label} + labelAppend={field.labelAppend} + > + <> + <MarkdownEditor + ariaLabel={idAria} + editorId={id} + onChange={field.setValue} + value={field.value as string} + data-test-subj={`${dataTestSubj}-markdown-editor`} + /> + {bottomRightContent && ( + <BottomContentWrapper justifyContent={'flexEnd'}> + <EuiFlexItem grow={false}>{bottomRightContent}</EuiFlexItem> + </BottomContentWrapper> + )} + </> + </EuiFormRow> + ); +}; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/index.tsx b/x-pack/plugins/cases/public/components/markdown_editor/index.tsx new file mode 100644 index 0000000000000..e77a36d48f7d9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/index.tsx @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './types'; +export * from './renderer'; +export * from './editor'; +export * from './eui_form'; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/markdown_link.tsx b/x-pack/plugins/cases/public/components/markdown_editor/markdown_link.tsx new file mode 100644 index 0000000000000..7cc8a07c8c04e --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/markdown_link.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiLink, EuiLinkAnchorProps, EuiToolTip } from '@elastic/eui'; + +type MarkdownLinkProps = { disableLinks?: boolean } & EuiLinkAnchorProps; + +/** prevents search engine manipulation by noting the linked document is not trusted or endorsed by us */ +const REL_NOFOLLOW = 'nofollow'; + +const MarkdownLinkComponent: React.FC<MarkdownLinkProps> = ({ + disableLinks, + href, + target, + children, + ...props +}) => ( + <EuiToolTip content={href}> + <EuiLink + href={disableLinks ? undefined : href} + data-test-subj="markdown-link" + rel={`${REL_NOFOLLOW}`} + target="_blank" + > + {children} + </EuiLink> + </EuiToolTip> +); + +export const MarkdownLink = memo(MarkdownLinkComponent); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts new file mode 100644 index 0000000000000..bc0da84133e68 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiMarkdownEditorUiPlugin, + getDefaultEuiMarkdownParsingPlugins, + getDefaultEuiMarkdownProcessingPlugins, + getDefaultEuiMarkdownUiPlugins, +} from '@elastic/eui'; + +import * as timelineMarkdownPlugin from './timeline'; +const uiPlugins: EuiMarkdownEditorUiPlugin[] = getDefaultEuiMarkdownUiPlugins(); +uiPlugins.push(timelineMarkdownPlugin.plugin); +export { uiPlugins }; +export const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); +export const processingPlugins = getDefaultEuiMarkdownProcessingPlugins(); + +parsingPlugins.push(timelineMarkdownPlugin.parser); + +// This line of code is TS-compatible and it will break if [1][1] change in the future. +processingPlugins[1][1].components.timeline = timelineMarkdownPlugin.renderer; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts new file mode 100644 index 0000000000000..91ff733736ea7 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const ID = 'timeline'; +export const PREFIX = `[`; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts new file mode 100644 index 0000000000000..70e4cab7d6858 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { plugin } from './plugin'; +import { TimelineParser } from './parser'; +import { TimelineMarkDownRenderer } from './processor'; + +export { plugin, TimelineParser as parser, TimelineMarkDownRenderer as renderer }; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts new file mode 100644 index 0000000000000..358c5171f67b6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts @@ -0,0 +1,120 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Plugin } from 'unified'; +import { RemarkTokenizer } from '@elastic/eui'; +import { parse } from 'query-string'; +import { decodeRisonUrlState } from '../../../url_state/helpers'; +import { ID, PREFIX } from './constants'; +import * as i18n from './translations'; + +export const TimelineParser: Plugin = function () { + const Parser = this.Parser; + const tokenizers = Parser.prototype.inlineTokenizers; + const methods = Parser.prototype.inlineMethods; + + const parseTimeline: RemarkTokenizer = function (eat, value, silent) { + let index = 0; + const nextChar = value[index]; + + if (nextChar !== '[') { + return false; + } + + if (silent) { + return true; + } + + function readArg(open: string, close: string) { + if (value[index] !== open) { + throw new Error(i18n.NO_PARENTHESES); + } + + index++; + + let body = ''; + let openBrackets = 0; + + for (; index < value.length; index++) { + const char = value[index]; + + if (char === close && openBrackets === 0) { + index++; + return body; + } else if (char === close) { + openBrackets--; + } else if (char === open) { + openBrackets++; + } + + body += char; + } + + return ''; + } + + const timelineTitle = readArg('[', ']'); + const timelineUrl = readArg('(', ')'); + const now = eat.now(); + + if (!timelineTitle) { + this.file.info(i18n.NO_TIMELINE_NAME_FOUND, { + line: now.line, + column: now.column, + }); + return false; + } + + try { + const timelineSearch = timelineUrl.split('?'); + const parseTimelineUrlSearch = parse(timelineSearch[1]) as { timeline: string }; + const { id: timelineId = '', graphEventId = '' } = decodeRisonUrlState( + parseTimelineUrlSearch.timeline ?? '' + ) ?? { id: null, graphEventId: '' }; + + if (!timelineId) { + this.file.info(i18n.NO_TIMELINE_ID_FOUND, { + line: now.line, + column: now.column + timelineUrl.indexOf('id'), + }); + return false; + } + + return eat(`[${timelineTitle}](${timelineUrl})`)({ + type: ID, + id: timelineId, + title: timelineTitle, + graphEventId, + }); + } catch { + this.file.info(i18n.TIMELINE_URL_IS_NOT_VALID(timelineUrl), { + line: now.line, + column: now.column, + }); + } + + return false; + }; + + const tokenizeTimeline: RemarkTokenizer = function tokenizeTimeline(eat, value, silent) { + if ( + value.startsWith(PREFIX) === false || + (value.startsWith(PREFIX) === true && !value.includes('timelines?timeline=(id')) + ) { + return false; + } + + return parseTimeline.call(this, eat, value, silent); + }; + + tokenizeTimeline.locator = (value: string, fromIndex: number) => { + return value.indexOf(PREFIX, fromIndex); + }; + + tokenizers.timeline = tokenizeTimeline; + methods.splice(methods.indexOf('url'), 0, ID); +}; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx new file mode 100644 index 0000000000000..0c9270f4a8d30 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, memo } from 'react'; +import { + EuiSelectableOption, + EuiModalBody, + EuiModalHeader, + EuiMarkdownEditorUiPlugin, + EuiCodeBlock, +} from '@elastic/eui'; + +import { TimelineType } from '../../../../../../common/types/timeline'; +import { SelectableTimeline } from '../../../../../timelines/components/timeline/selectable_timeline'; +import { OpenTimelineResult } from '../../../../../timelines/components/open_timeline/types'; +import { getTimelineUrl, useFormatUrl } from '../../../link_to'; + +import { ID } from './constants'; +import * as i18n from './translations'; +import { SecurityPageName } from '../../../../../app/types'; + +interface TimelineEditorProps { + onClosePopover: () => void; + onInsert: (markdown: string, config: { block: boolean }) => void; +} + +const TimelineEditorComponent: React.FC<TimelineEditorProps> = ({ onClosePopover, onInsert }) => { + const { formatUrl } = useFormatUrl(SecurityPageName.timelines); + + const handleGetSelectableOptions = useCallback( + ({ timelines }: { timelines: OpenTimelineResult[] }) => [ + ...timelines.map( + (t: OpenTimelineResult, index: number) => + ({ + description: t.description, + favorite: t.favorite, + label: t.title, + id: t.savedObjectId, + key: `${t.title}-${index}`, + title: t.title, + checked: undefined, + } as EuiSelectableOption) + ), + ], + [] + ); + + const handleTimelineChange = useCallback( + (timelineTitle, timelineId, graphEventId) => { + const url = formatUrl(getTimelineUrl(timelineId ?? '', graphEventId), { + absolute: true, + skipSearch: true, + }); + onInsert(`[${timelineTitle}](${url})`, { + block: false, + }); + }, + [formatUrl, onInsert] + ); + + return ( + <> + <EuiModalHeader /> + <EuiModalBody> + <SelectableTimeline + hideUntitled={true} + getSelectableOptions={handleGetSelectableOptions} + onTimelineChange={handleTimelineChange} + onClosePopover={onClosePopover} + timelineType={TimelineType.default} + /> + </EuiModalBody> + </> + ); +}; + +const TimelineEditor = memo(TimelineEditorComponent); + +export const plugin: EuiMarkdownEditorUiPlugin = { + name: ID, + button: { + label: i18n.INSERT_TIMELINE, + iconType: 'timeline', + }, + helpText: ( + <EuiCodeBlock language="md" paddingSize="s" fontSize="l"> + {'[title](url)'} + </EuiCodeBlock> + ), + editor: function editor({ node, onSave, onCancel }) { + return <TimelineEditor onClosePopover={onCancel} onInsert={onSave} />; + }, +}; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx new file mode 100644 index 0000000000000..3d9c7f0a09cd7 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, memo } from 'react'; +import { EuiToolTip, EuiLink, EuiMarkdownAstNodePosition } from '@elastic/eui'; + +import { useTimelineClick } from '../../../../utils/timeline/use_timeline_click'; +import { TimelineProps } from './types'; +import * as i18n from './translations'; + +export const TimelineMarkDownRendererComponent: React.FC< + TimelineProps & { + position: EuiMarkdownAstNodePosition; + } +> = ({ id, title, graphEventId }) => { + const handleTimelineClick = useTimelineClick(); + const onClickTimeline = useCallback(() => handleTimelineClick(id ?? '', graphEventId), [ + id, + graphEventId, + handleTimelineClick, + ]); + return ( + <EuiToolTip content={i18n.TIMELINE_ID(id ?? '')}> + <EuiLink onClick={onClickTimeline} data-test-subj={`markdown-timeline-link-${id}`}> + {title} + </EuiLink> + </EuiToolTip> + ); +}; + +export const TimelineMarkDownRenderer = memo(TimelineMarkDownRendererComponent); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts new file mode 100644 index 0000000000000..a32f9c263be49 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const INSERT_TIMELINE = i18n.translate( + 'xpack.securitySolution.markdownEditor.plugins.timeline.insertTimelineButtonLabel', + { + defaultMessage: 'Insert timeline link', + } +); + +export const TIMELINE_ID = (timelineId: string) => + i18n.translate('xpack.securitySolution.markdownEditor.plugins.timeline.toolTip.timelineId', { + defaultMessage: 'Timeline id: { timelineId }', + values: { + timelineId, + }, + }); + +export const NO_TIMELINE_NAME_FOUND = i18n.translate( + 'xpack.securitySolution.markdownEditor.plugins.timeline.noTimelineNameFoundErrorMsg', + { + defaultMessage: 'No timeline name found', + } +); + +export const NO_TIMELINE_ID_FOUND = i18n.translate( + 'xpack.securitySolution.markdownEditor.plugins.timeline.noTimelineIdFoundErrorMsg', + { + defaultMessage: 'No timeline id found', + } +); + +export const TIMELINE_URL_IS_NOT_VALID = (timelineUrl: string) => + i18n.translate( + 'xpack.securitySolution.markdownEditor.plugins.timeline.toolTip.timelineUrlIsNotValidErrorMsg', + { + defaultMessage: 'Timeline URL is not valid => {timelineUrl}', + values: { + timelineUrl, + }, + } + ); + +export const NO_PARENTHESES = i18n.translate( + 'xpack.securitySolution.markdownEditor.plugins.timeline.noParenthesesErrorMsg', + { + defaultMessage: 'Expected left parentheses', + } +); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts new file mode 100644 index 0000000000000..e233a41160006 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ID } from './constants'; + +export interface TimelineConfiguration { + id: string | null; + title: string; + graphEventId?: string; + [key: string]: string | null | undefined; +} + +export interface TimelineProps extends TimelineConfiguration { + type: typeof ID; +} diff --git a/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx b/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx new file mode 100644 index 0000000000000..490392c237e19 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { removeExternalLinkText } from '../../../../common/test_utils'; +import { MarkdownRenderer } from './renderer'; + +describe('Markdown', () => { + describe('markdown links', () => { + const markdownWithLink = 'A link to an external site [External Site](https://google.com)'; + + test('it renders the expected link text', () => { + const wrapper = mount(<MarkdownRenderer>{markdownWithLink}</MarkdownRenderer>); + + expect( + removeExternalLinkText(wrapper.find('[data-test-subj="markdown-link"]').first().text()) + ).toEqual('External Site'); + }); + + test('it renders the expected href', () => { + const wrapper = mount(<MarkdownRenderer>{markdownWithLink}</MarkdownRenderer>); + + expect(wrapper.find('[data-test-subj="markdown-link"]').first().getDOMNode()).toHaveProperty( + 'href', + 'https://google.com/' + ); + }); + + test('it does NOT render the href if links are disabled', () => { + const wrapper = mount( + <MarkdownRenderer disableLinks={true}>{markdownWithLink}</MarkdownRenderer> + ); + + expect( + wrapper.find('[data-test-subj="markdown-link"]').first().getDOMNode() + ).not.toHaveProperty('href'); + }); + + test('it opens links in a new tab via target="_blank"', () => { + const wrapper = mount(<MarkdownRenderer>{markdownWithLink}</MarkdownRenderer>); + + expect(wrapper.find('[data-test-subj="markdown-link"]').first().getDOMNode()).toHaveProperty( + 'target', + '_blank' + ); + }); + + test('it sets the link `rel` attribute to `noopener` to prevent the new page from accessing `window.opener`, `nofollow` to note the link is not endorsed by us, and noreferrer to prevent the browser from sending the current address', () => { + const wrapper = mount(<MarkdownRenderer>{markdownWithLink}</MarkdownRenderer>); + + expect(wrapper.find('[data-test-subj="markdown-link"]').first().getDOMNode()).toHaveProperty( + 'rel', + 'nofollow noopener noreferrer' + ); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx new file mode 100644 index 0000000000000..5fa84affe8f99 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo } from 'react'; +import { cloneDeep } from 'lodash/fp'; +import { EuiMarkdownFormat, EuiLinkAnchorProps } from '@elastic/eui'; + +import { parsingPlugins, processingPlugins } from './plugins'; +import { MarkdownLink } from './markdown_link'; + +interface Props { + children: string; + disableLinks?: boolean; +} + +const MarkdownRendererComponent: React.FC<Props> = ({ children, disableLinks }) => { + const MarkdownLinkProcessingComponent: React.FC<EuiLinkAnchorProps> = useMemo( + () => (props) => <MarkdownLink {...props} disableLinks={disableLinks} />, + [disableLinks] + ); + + // Deep clone of the processing plugins to prevent affecting the markdown editor. + const processingPluginList = cloneDeep(processingPlugins); + // This line of code is TS-compatible and it will break if [1][1] change in the future. + processingPluginList[1][1].components.a = MarkdownLinkProcessingComponent; + + return ( + <EuiMarkdownFormat + parsingPluginList={parsingPlugins} + processingPluginList={processingPluginList} + > + {children} + </EuiMarkdownFormat> + ); +}; + +export const MarkdownRenderer = memo(MarkdownRendererComponent); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/translations.ts b/x-pack/plugins/cases/public/components/markdown_editor/translations.ts new file mode 100644 index 0000000000000..17abddb339e1a --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/translations.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const MARKDOWN_SYNTAX_HELP = i18n.translate( + 'xpack.securitySolution.markdownEditor.markdownInputHelp', + { + defaultMessage: 'Markdown syntax help', + } +); + +export const MARKDOWN = i18n.translate('xpack.securitySolution.markdownEditor.markdown', { + defaultMessage: 'Markdown', +}); +export const PREVIEW = i18n.translate('xpack.securitySolution.markdownEditor.preview', { + defaultMessage: 'Preview', +}); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/types.ts b/x-pack/plugins/cases/public/components/markdown_editor/types.ts new file mode 100644 index 0000000000000..8a30a4a143f54 --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/types.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface CursorPosition { + start: number; + end: number; +} diff --git a/x-pack/plugins/cases/public/get_create_case.tsx b/x-pack/plugins/cases/public/get_create_case.tsx new file mode 100644 index 0000000000000..7f0e3e527b552 --- /dev/null +++ b/x-pack/plugins/cases/public/get_create_case.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { lazy, Suspense } from 'react'; +import { CreateCaseProps } from './components/create'; + +export const getCreateCaseLazy = (props: CreateCaseProps) => { + const CreateCaseLazy = lazy(() => import('./components/create')); + return ( + <Suspense fallback={null}> + <CreateCaseLazy {...props} /> + </Suspense> + ); +}; diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 638b423f5f845..66582b0d094fe 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -5,11 +5,12 @@ * 2.0. */ -import { CoreStart, CoreSetup, Plugin, PluginInitializerContext } from 'src/core/public'; +import { Plugin } from 'src/core/public'; import { ReactElement } from 'react'; import { TestComponent } from '.'; -import { CreateCase, CreateCaseProps } from './components/create'; -import { PluginStart, SetupPlugins, StartPlugins, StartServices } from './types'; +import { CreateCaseProps } from './components/create'; +import { SetupPlugins, StartPlugins } from './types'; +import { getCreateCaseLazy } from './get_create_case'; export interface CasesUiStart { casesComponent: () => JSX.Element; @@ -17,35 +18,15 @@ export interface CasesUiStart { } export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { - private readonly casesUi = {} as CasesUiStart; - - constructor(initializerContext: PluginInitializerContext) {} - - public setup(core: CoreSetup<StartPlugins, PluginStart>, plugins: SetupPlugins): void { - this.casesUi.casesComponent = TestComponent; - this.casesUi.getCreateCase = CreateCase; - - /** - * `StartServices` which are needed by the `renderApp` function when mounting any of the subPlugin applications. - * This is a promise because these aren't available until the `start` lifecycle phase but they are referenced - * in the `setup` lifecycle phase. - */ - const startServices: Promise<StartServices> = (async () => { - const [coreStart, startPlugins] = await core.getStartServices(); - - const services: StartServices = { - ...coreStart, - ...startPlugins, - }; - return services; - })(); - - // need to figure out how to put startServices in components - console.log('heyo startServices', startServices); - } - - public start(core: CoreStart): CasesUiStart { - return this.casesUi; + public setup() {} + + public start(): CasesUiStart { + return { + casesComponent: TestComponent, + getCreateCase: (props) => { + return getCreateCaseLazy(props); + }, + }; } public stop() {} diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index 222070985ead6..477ff61899d9d 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -20,6 +20,7 @@ import { fieldName as descriptionFieldName } from './description'; import { SubmitCaseButton } from './submit_button'; import { USE_RAC_CASES_UI } from '../../../../common/constants'; import { useKibana } from '../../../common/lib/kibana'; +import { TestComponent } from '../../../../../cases/public'; export const CommonUseField = getUseField({ component: Field }); @@ -54,19 +55,13 @@ export const Create = React.memo(() => { history.push('/'); }, [history]); - const CreateCase = useMemo( - () => - cases.getCreateCase({ - onCancel: handleSetIsCancel, - onSuccess, - }), - [cases, handleSetIsCancel, onSuccess] - ); - return ( <EuiPanel> {USE_RAC_CASES_UI ? ( - <p>{'HELLO CRUEL WORLD'}</p> // <CreateCase /> + cases.getCreateCase({ + onCancel: handleSetIsCancel, + onSuccess, + }) ) : ( <FormContext onSuccess={onSuccess}> <CreateCaseForm /> From 83f6517836283ab67681087e26097313786054f4 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 08:23:08 -0700 Subject: [PATCH 09/52] we are so good at this --- .../public/components/create/description.tsx | 3 +- .../cases/public/components/create/index.tsx | 6 +- .../components/markdown_editor/editor.tsx | 15 ++- .../components/markdown_editor/eui_form.tsx | 2 +- .../markdown_editor/plugins/index.ts | 25 ---- .../plugins/timeline/constants.ts | 9 -- .../markdown_editor/plugins/timeline/index.ts | 12 -- .../plugins/timeline/parser.ts | 120 ------------------ .../plugins/timeline/plugin.tsx | 97 -------------- .../plugins/timeline/processor.tsx | 35 ----- .../plugins/timeline/translations.ts | 55 -------- .../markdown_editor/plugins/timeline/types.ts | 19 --- .../components/markdown_editor/renderer.tsx | 75 ++++++----- x-pack/plugins/cases/public/plugin.ts | 11 +- .../public/cases/components/create/index.tsx | 27 ++-- 15 files changed, 80 insertions(+), 431 deletions(-) delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts diff --git a/x-pack/plugins/cases/public/components/create/description.tsx b/x-pack/plugins/cases/public/components/create/description.tsx index b5aab267b38e2..0a7102cff1ad5 100644 --- a/x-pack/plugins/cases/public/components/create/description.tsx +++ b/x-pack/plugins/cases/public/components/create/description.tsx @@ -6,9 +6,8 @@ */ import React, { memo } from 'react'; -// import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; +import { MarkdownEditorForm } from '../markdown_editor'; import { UseField } from '../../common/shared_imports'; -const MarkdownEditorForm = () => <>{'formyform'}</>; interface Props { isLoading: boolean; } diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index 3f92140529ef9..a3bf0b517fa06 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { ReactElement } from 'react'; +import React from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import styled from 'styled-components'; @@ -28,8 +28,8 @@ export interface CreateCaseProps { onCancel: () => void; onSuccess: (theCase: Case) => Promise<void>; } -type CC = (props: CreateCaseProps) => ReactElement<CreateCaseProps>; -export const CreateCase: CC = ({ onCancel, onSuccess }: CreateCaseProps) => ( + +export const CreateCase = ({ onCancel, onSuccess }: CreateCaseProps) => ( <FormContext onSuccess={onSuccess}> <CreateCaseForm /> <Container> diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx index 12084a17e888a..932ec6141e3d0 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx @@ -6,9 +6,12 @@ */ import React, { memo, useEffect, useState, useCallback } from 'react'; -import { EuiMarkdownEditor } from '@elastic/eui'; - -import { uiPlugins, parsingPlugins, processingPlugins } from './plugins'; +import { + EuiMarkdownEditor, + getDefaultEuiMarkdownParsingPlugins, + getDefaultEuiMarkdownProcessingPlugins, + getDefaultEuiMarkdownUiPlugins, +} from '@elastic/eui'; interface MarkdownEditorProps { onChange: (content: string) => void; @@ -19,6 +22,12 @@ interface MarkdownEditorProps { height?: number; } +// create plugin stuff here +const { uiPlugins, parsingPlugins, processingPlugins } = { + uiPlugins: getDefaultEuiMarkdownUiPlugins(), + parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), + processingPlugins: getDefaultEuiMarkdownProcessingPlugins(), +}; const MarkdownEditorComponent: React.FC<MarkdownEditorProps> = ({ onChange, value, diff --git a/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx b/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx index 1c407b3b8f8c2..858e79ff65baf 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx @@ -8,7 +8,7 @@ import React from 'react'; import styled from 'styled-components'; import { EuiMarkdownEditorProps, EuiFormRow, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../shared_imports'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../common/shared_imports'; import { MarkdownEditor } from './editor'; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts deleted file mode 100644 index bc0da84133e68..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiMarkdownEditorUiPlugin, - getDefaultEuiMarkdownParsingPlugins, - getDefaultEuiMarkdownProcessingPlugins, - getDefaultEuiMarkdownUiPlugins, -} from '@elastic/eui'; - -import * as timelineMarkdownPlugin from './timeline'; -const uiPlugins: EuiMarkdownEditorUiPlugin[] = getDefaultEuiMarkdownUiPlugins(); -uiPlugins.push(timelineMarkdownPlugin.plugin); -export { uiPlugins }; -export const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); -export const processingPlugins = getDefaultEuiMarkdownProcessingPlugins(); - -parsingPlugins.push(timelineMarkdownPlugin.parser); - -// This line of code is TS-compatible and it will break if [1][1] change in the future. -processingPlugins[1][1].components.timeline = timelineMarkdownPlugin.renderer; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts deleted file mode 100644 index 91ff733736ea7..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/constants.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export const ID = 'timeline'; -export const PREFIX = `[`; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts deleted file mode 100644 index 70e4cab7d6858..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { plugin } from './plugin'; -import { TimelineParser } from './parser'; -import { TimelineMarkDownRenderer } from './processor'; - -export { plugin, TimelineParser as parser, TimelineMarkDownRenderer as renderer }; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts deleted file mode 100644 index 358c5171f67b6..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/parser.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { Plugin } from 'unified'; -import { RemarkTokenizer } from '@elastic/eui'; -import { parse } from 'query-string'; -import { decodeRisonUrlState } from '../../../url_state/helpers'; -import { ID, PREFIX } from './constants'; -import * as i18n from './translations'; - -export const TimelineParser: Plugin = function () { - const Parser = this.Parser; - const tokenizers = Parser.prototype.inlineTokenizers; - const methods = Parser.prototype.inlineMethods; - - const parseTimeline: RemarkTokenizer = function (eat, value, silent) { - let index = 0; - const nextChar = value[index]; - - if (nextChar !== '[') { - return false; - } - - if (silent) { - return true; - } - - function readArg(open: string, close: string) { - if (value[index] !== open) { - throw new Error(i18n.NO_PARENTHESES); - } - - index++; - - let body = ''; - let openBrackets = 0; - - for (; index < value.length; index++) { - const char = value[index]; - - if (char === close && openBrackets === 0) { - index++; - return body; - } else if (char === close) { - openBrackets--; - } else if (char === open) { - openBrackets++; - } - - body += char; - } - - return ''; - } - - const timelineTitle = readArg('[', ']'); - const timelineUrl = readArg('(', ')'); - const now = eat.now(); - - if (!timelineTitle) { - this.file.info(i18n.NO_TIMELINE_NAME_FOUND, { - line: now.line, - column: now.column, - }); - return false; - } - - try { - const timelineSearch = timelineUrl.split('?'); - const parseTimelineUrlSearch = parse(timelineSearch[1]) as { timeline: string }; - const { id: timelineId = '', graphEventId = '' } = decodeRisonUrlState( - parseTimelineUrlSearch.timeline ?? '' - ) ?? { id: null, graphEventId: '' }; - - if (!timelineId) { - this.file.info(i18n.NO_TIMELINE_ID_FOUND, { - line: now.line, - column: now.column + timelineUrl.indexOf('id'), - }); - return false; - } - - return eat(`[${timelineTitle}](${timelineUrl})`)({ - type: ID, - id: timelineId, - title: timelineTitle, - graphEventId, - }); - } catch { - this.file.info(i18n.TIMELINE_URL_IS_NOT_VALID(timelineUrl), { - line: now.line, - column: now.column, - }); - } - - return false; - }; - - const tokenizeTimeline: RemarkTokenizer = function tokenizeTimeline(eat, value, silent) { - if ( - value.startsWith(PREFIX) === false || - (value.startsWith(PREFIX) === true && !value.includes('timelines?timeline=(id')) - ) { - return false; - } - - return parseTimeline.call(this, eat, value, silent); - }; - - tokenizeTimeline.locator = (value: string, fromIndex: number) => { - return value.indexOf(PREFIX, fromIndex); - }; - - tokenizers.timeline = tokenizeTimeline; - methods.splice(methods.indexOf('url'), 0, ID); -}; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx deleted file mode 100644 index 0c9270f4a8d30..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/plugin.tsx +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, memo } from 'react'; -import { - EuiSelectableOption, - EuiModalBody, - EuiModalHeader, - EuiMarkdownEditorUiPlugin, - EuiCodeBlock, -} from '@elastic/eui'; - -import { TimelineType } from '../../../../../../common/types/timeline'; -import { SelectableTimeline } from '../../../../../timelines/components/timeline/selectable_timeline'; -import { OpenTimelineResult } from '../../../../../timelines/components/open_timeline/types'; -import { getTimelineUrl, useFormatUrl } from '../../../link_to'; - -import { ID } from './constants'; -import * as i18n from './translations'; -import { SecurityPageName } from '../../../../../app/types'; - -interface TimelineEditorProps { - onClosePopover: () => void; - onInsert: (markdown: string, config: { block: boolean }) => void; -} - -const TimelineEditorComponent: React.FC<TimelineEditorProps> = ({ onClosePopover, onInsert }) => { - const { formatUrl } = useFormatUrl(SecurityPageName.timelines); - - const handleGetSelectableOptions = useCallback( - ({ timelines }: { timelines: OpenTimelineResult[] }) => [ - ...timelines.map( - (t: OpenTimelineResult, index: number) => - ({ - description: t.description, - favorite: t.favorite, - label: t.title, - id: t.savedObjectId, - key: `${t.title}-${index}`, - title: t.title, - checked: undefined, - } as EuiSelectableOption) - ), - ], - [] - ); - - const handleTimelineChange = useCallback( - (timelineTitle, timelineId, graphEventId) => { - const url = formatUrl(getTimelineUrl(timelineId ?? '', graphEventId), { - absolute: true, - skipSearch: true, - }); - onInsert(`[${timelineTitle}](${url})`, { - block: false, - }); - }, - [formatUrl, onInsert] - ); - - return ( - <> - <EuiModalHeader /> - <EuiModalBody> - <SelectableTimeline - hideUntitled={true} - getSelectableOptions={handleGetSelectableOptions} - onTimelineChange={handleTimelineChange} - onClosePopover={onClosePopover} - timelineType={TimelineType.default} - /> - </EuiModalBody> - </> - ); -}; - -const TimelineEditor = memo(TimelineEditorComponent); - -export const plugin: EuiMarkdownEditorUiPlugin = { - name: ID, - button: { - label: i18n.INSERT_TIMELINE, - iconType: 'timeline', - }, - helpText: ( - <EuiCodeBlock language="md" paddingSize="s" fontSize="l"> - {'[title](url)'} - </EuiCodeBlock> - ), - editor: function editor({ node, onSave, onCancel }) { - return <TimelineEditor onClosePopover={onCancel} onInsert={onSave} />; - }, -}; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx deleted file mode 100644 index 3d9c7f0a09cd7..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/processor.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, memo } from 'react'; -import { EuiToolTip, EuiLink, EuiMarkdownAstNodePosition } from '@elastic/eui'; - -import { useTimelineClick } from '../../../../utils/timeline/use_timeline_click'; -import { TimelineProps } from './types'; -import * as i18n from './translations'; - -export const TimelineMarkDownRendererComponent: React.FC< - TimelineProps & { - position: EuiMarkdownAstNodePosition; - } -> = ({ id, title, graphEventId }) => { - const handleTimelineClick = useTimelineClick(); - const onClickTimeline = useCallback(() => handleTimelineClick(id ?? '', graphEventId), [ - id, - graphEventId, - handleTimelineClick, - ]); - return ( - <EuiToolTip content={i18n.TIMELINE_ID(id ?? '')}> - <EuiLink onClick={onClickTimeline} data-test-subj={`markdown-timeline-link-${id}`}> - {title} - </EuiLink> - </EuiToolTip> - ); -}; - -export const TimelineMarkDownRenderer = memo(TimelineMarkDownRendererComponent); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts deleted file mode 100644 index a32f9c263be49..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/translations.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const INSERT_TIMELINE = i18n.translate( - 'xpack.securitySolution.markdownEditor.plugins.timeline.insertTimelineButtonLabel', - { - defaultMessage: 'Insert timeline link', - } -); - -export const TIMELINE_ID = (timelineId: string) => - i18n.translate('xpack.securitySolution.markdownEditor.plugins.timeline.toolTip.timelineId', { - defaultMessage: 'Timeline id: { timelineId }', - values: { - timelineId, - }, - }); - -export const NO_TIMELINE_NAME_FOUND = i18n.translate( - 'xpack.securitySolution.markdownEditor.plugins.timeline.noTimelineNameFoundErrorMsg', - { - defaultMessage: 'No timeline name found', - } -); - -export const NO_TIMELINE_ID_FOUND = i18n.translate( - 'xpack.securitySolution.markdownEditor.plugins.timeline.noTimelineIdFoundErrorMsg', - { - defaultMessage: 'No timeline id found', - } -); - -export const TIMELINE_URL_IS_NOT_VALID = (timelineUrl: string) => - i18n.translate( - 'xpack.securitySolution.markdownEditor.plugins.timeline.toolTip.timelineUrlIsNotValidErrorMsg', - { - defaultMessage: 'Timeline URL is not valid => {timelineUrl}', - values: { - timelineUrl, - }, - } - ); - -export const NO_PARENTHESES = i18n.translate( - 'xpack.securitySolution.markdownEditor.plugins.timeline.noParenthesesErrorMsg', - { - defaultMessage: 'Expected left parentheses', - } -); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts b/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts deleted file mode 100644 index e233a41160006..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/timeline/types.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ID } from './constants'; - -export interface TimelineConfiguration { - id: string | null; - title: string; - graphEventId?: string; - [key: string]: string | null | undefined; -} - -export interface TimelineProps extends TimelineConfiguration { - type: typeof ID; -} diff --git a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx index 5fa84affe8f99..b2c08b65546aa 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx @@ -5,37 +5,44 @@ * 2.0. */ -import React, { memo, useMemo } from 'react'; -import { cloneDeep } from 'lodash/fp'; -import { EuiMarkdownFormat, EuiLinkAnchorProps } from '@elastic/eui'; - -import { parsingPlugins, processingPlugins } from './plugins'; -import { MarkdownLink } from './markdown_link'; - -interface Props { - children: string; - disableLinks?: boolean; -} - -const MarkdownRendererComponent: React.FC<Props> = ({ children, disableLinks }) => { - const MarkdownLinkProcessingComponent: React.FC<EuiLinkAnchorProps> = useMemo( - () => (props) => <MarkdownLink {...props} disableLinks={disableLinks} />, - [disableLinks] - ); - - // Deep clone of the processing plugins to prevent affecting the markdown editor. - const processingPluginList = cloneDeep(processingPlugins); - // This line of code is TS-compatible and it will break if [1][1] change in the future. - processingPluginList[1][1].components.a = MarkdownLinkProcessingComponent; - - return ( - <EuiMarkdownFormat - parsingPluginList={parsingPlugins} - processingPluginList={processingPluginList} - > - {children} - </EuiMarkdownFormat> - ); -}; - -export const MarkdownRenderer = memo(MarkdownRendererComponent); +// /* +// * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// * or more contributor license agreements. Licensed under the Elastic License +// * 2.0; you may not use this file except in compliance with the Elastic License +// * 2.0. +// */ +// +// import React, { memo, useMemo } from 'react'; +// import { cloneDeep } from 'lodash/fp'; +// import { EuiMarkdownFormat, EuiLinkAnchorProps } from '@elastic/eui'; +// +// import { parsingPlugins, processingPlugins } from './plugins'; +// import { MarkdownLink } from './markdown_link'; +// +// interface Props { +// children: string; +// disableLinks?: boolean; +// } +// +// const MarkdownRendererComponent: React.FC<Props> = ({ children, disableLinks }) => { +// const MarkdownLinkProcessingComponent: React.FC<EuiLinkAnchorProps> = useMemo( +// () => (props) => <MarkdownLink {...props} disableLinks={disableLinks} />, +// [disableLinks] +// ); +// +// // Deep clone of the processing plugins to prevent affecting the markdown editor. +// const processingPluginList = cloneDeep(processingPlugins); +// // This line of code is TS-compatible and it will break if [1][1] change in the future. +// processingPluginList[1][1].components.a = MarkdownLinkProcessingComponent; +// +// return ( +// <EuiMarkdownFormat +// parsingPluginList={parsingPlugins} +// processingPluginList={processingPluginList} +// > +// {children} +// </EuiMarkdownFormat> +// ); +// }; +// +// export const MarkdownRenderer = memo(MarkdownRendererComponent); diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 66582b0d094fe..40e503c280a40 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -5,12 +5,13 @@ * 2.0. */ -import { Plugin } from 'src/core/public'; +import { CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; import { ReactElement } from 'react'; import { TestComponent } from '.'; import { CreateCaseProps } from './components/create'; import { SetupPlugins, StartPlugins } from './types'; import { getCreateCaseLazy } from './get_create_case'; +import { KibanaServices } from './common/lib/kibana_react'; export interface CasesUiStart { casesComponent: () => JSX.Element; @@ -18,9 +19,15 @@ export interface CasesUiStart { } export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { + private kibanaVersion: string; + + constructor(initializerContext: PluginInitializerContext) { + this.kibanaVersion = initializerContext.env.packageInfo.version; + } public setup() {} - public start(): CasesUiStart { + public start(core: CoreStart, plugins: StartPlugins): CasesUiStart { + KibanaServices.init({ ...core, ...plugins, kibanaVersion: this.kibanaVersion }); return { casesComponent: TestComponent, getCreateCase: (props) => { diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index 477ff61899d9d..484a45248d8c0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; @@ -20,7 +20,6 @@ import { fieldName as descriptionFieldName } from './description'; import { SubmitCaseButton } from './submit_button'; import { USE_RAC_CASES_UI } from '../../../../common/constants'; import { useKibana } from '../../../common/lib/kibana'; -import { TestComponent } from '../../../../../cases/public'; export const CommonUseField = getUseField({ component: Field }); @@ -29,17 +28,17 @@ const Container = styled.div` margin-top: ${theme.eui.euiSize}; `} `; -// -// const InsertTimeline = () => { -// const { setFieldValue, getFormData } = useFormContext(); -// const formData = getFormData(); -// const onTimelineAttached = useCallback( -// (newValue: string) => setFieldValue(descriptionFieldName, newValue), -// [setFieldValue] -// ); -// useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); -// return null; -// }; + +const InsertTimeline = () => { + const { setFieldValue, getFormData } = useFormContext(); + const formData = getFormData(); + const onTimelineAttached = useCallback( + (newValue: string) => setFieldValue(descriptionFieldName, newValue), + [setFieldValue] + ); + useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); + return null; +}; export const Create = React.memo(() => { const { cases } = useKibana().services; @@ -87,9 +86,9 @@ export const Create = React.memo(() => { </EuiFlexItem> </EuiFlexGroup> </Container> + <InsertTimeline /> </FormContext> )} - {/* <InsertTimeline />*/} </EuiPanel> ); }); From 3ab3352f1c3dce861e936fe01494306a6a2d8d3a Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 09:06:45 -0700 Subject: [PATCH 10/52] add mock --- .../common/lib/kibana/__mocks__/index.ts | 30 ++++++++++++++++ .../cases/public/common/lib/kibana/index.ts | 9 +++++ .../common/lib/kibana/kibana_react.mock.ts | 35 +++++++++++++++++++ .../public/common/lib/kibana/kibana_react.ts | 16 +++++++++ .../{kibana_react.ts => kibana/services.ts} | 9 ----- .../components/configure_cases/index.test.tsx | 2 +- .../components/configure_cases/index.tsx | 2 +- .../connectors/jira/case_fields.test.tsx | 3 +- .../connectors/jira/case_fields.tsx | 2 +- .../connectors/jira/search_issues.tsx | 2 +- .../use_get_fields_by_issue_type.test.tsx | 4 +-- .../jira/use_get_issue_types.test.tsx | 4 +-- .../connectors/jira/use_get_issues.test.tsx | 4 +-- .../jira/use_get_single_issue.test.tsx | 4 +-- .../connectors/resilient/case_fields.test.tsx | 2 +- .../connectors/resilient/case_fields.tsx | 2 +- .../resilient/use_get_incident_types.test.tsx | 4 +-- .../resilient/use_get_severity.test.tsx | 4 +-- .../servicenow_itsm_case_fields.test.tsx | 2 +- .../servicenow_itsm_case_fields.tsx | 2 +- .../servicenow_sir_case_fields.test.tsx | 2 +- .../servicenow/servicenow_sir_case_fields.tsx | 2 +- .../servicenow/use_get_choices.test.tsx | 4 +-- .../components/create/connector.test.tsx | 2 +- .../use_create_case_modal/index.test.tsx | 4 +-- .../cases/public/containers/api.test.tsx | 2 +- x-pack/plugins/cases/public/containers/api.ts | 2 +- .../public/containers/configure/api.test.ts | 2 +- .../cases/public/containers/configure/api.ts | 2 +- x-pack/plugins/cases/public/plugin.ts | 2 +- 30 files changed, 123 insertions(+), 43 deletions(-) create mode 100644 x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts create mode 100644 x-pack/plugins/cases/public/common/lib/kibana/index.ts create mode 100644 x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts create mode 100644 x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts rename x-pack/plugins/cases/public/common/lib/{kibana_react.ts => kibana/services.ts} (81%) diff --git a/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts new file mode 100644 index 0000000000000..392b71befe2b4 --- /dev/null +++ b/x-pack/plugins/cases/public/common/lib/kibana/__mocks__/index.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { notificationServiceMock } from '../../../../../../../../src/core/public/mocks'; +import { + createKibanaContextProviderMock, + createStartServicesMock, + createWithKibanaMock, +} from '../kibana_react.mock'; + +export const KibanaServices = { get: jest.fn(), getKibanaVersion: jest.fn(() => '8.0.0') }; +export const useKibana = jest.fn().mockReturnValue({ + services: createStartServicesMock(), +}); + +export const useHttp = jest.fn().mockReturnValue(createStartServicesMock().http); +export const useTimeZone = jest.fn(); +export const useDateFormat = jest.fn(); +export const useBasePath = jest.fn(() => '/test/base/path'); +export const useToasts = jest + .fn() + .mockReturnValue(notificationServiceMock.createStartContract().toasts); +export const useCurrentUser = jest.fn(); +export const withKibana = jest.fn(createWithKibanaMock()); +export const KibanaContextProvider = jest.fn(createKibanaContextProviderMock()); +export const useGetUserSavedObjectPermissions = jest.fn(); diff --git a/x-pack/plugins/cases/public/common/lib/kibana/index.ts b/x-pack/plugins/cases/public/common/lib/kibana/index.ts new file mode 100644 index 0000000000000..a7f3c1e70ced5 --- /dev/null +++ b/x-pack/plugins/cases/public/common/lib/kibana/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './kibana_react'; +export * from './services'; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts new file mode 100644 index 0000000000000..326163f6cdc03 --- /dev/null +++ b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { RecursivePartial } from '@elastic/eui/src/components/common'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { StartServices } from '../../../types'; +import { EuiTheme } from '../../../../../../../src/plugins/kibana_react/common'; + +export const createStartServicesMock = (): StartServices => + (coreMock.createStart() as unknown) as StartServices; + +export const createWithKibanaMock = () => { + const services = createStartServicesMock(); + + return (Component: unknown) => (props: unknown) => { + return React.createElement(Component as string, { ...(props as object), kibana: { services } }); + }; +}; + +export const createKibanaContextProviderMock = () => { + const services = createStartServicesMock(); + + return ({ children }: { children: React.ReactNode }) => + React.createElement(KibanaContextProvider, { services }, children); +}; + +export const getMockTheme = (partialTheme: RecursivePartial<EuiTheme>): EuiTheme => + partialTheme as EuiTheme; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts new file mode 100644 index 0000000000000..e23fad392040c --- /dev/null +++ b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + KibanaContextProvider, + useKibana, +} from '../../../../../../../src/plugins/kibana_react/public'; +import { StartServices } from '../../../types'; + +const useTypedKibana = () => useKibana<StartServices>(); + +export { KibanaContextProvider, useTypedKibana as useKibana }; diff --git a/x-pack/plugins/cases/public/common/lib/kibana_react.ts b/x-pack/plugins/cases/public/common/lib/kibana/services.ts similarity index 81% rename from x-pack/plugins/cases/public/common/lib/kibana_react.ts rename to x-pack/plugins/cases/public/common/lib/kibana/services.ts index be915b1499f2c..b9e49ab466c3a 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana_react.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/services.ts @@ -6,15 +6,6 @@ */ import { CoreStart } from 'kibana/public'; -import { - KibanaContextProvider, - useKibana, -} from '../../../../../../src/plugins/kibana_react/public'; -import { StartServices } from '../../types'; - -const useTypedKibana = () => useKibana<StartServices>(); - -export { KibanaContextProvider, useTypedKibana as useKibana }; type GlobalServices = Pick<CoreStart, 'http'>; // | 'uiSettings' & Pick<StartPlugins, 'data'>; not sure if we need this diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index 7c4813ead37a8..0e1dcf8d951d5 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -20,7 +20,7 @@ import { } from '../../../../triggers_actions_ui/public'; import { actionTypeRegistryMock } from '../../../../triggers_actions_ui/public/application/action_type_registry.mock'; -import { useKibana } from '../../common/lib/kibana_react'; +import { useKibana } from '../../common/lib/kibana'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; import { useActionTypes } from '../../containers/configure/use_action_types'; diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index 4f4c5fd058d5f..594683e89b7b7 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -11,7 +11,7 @@ import styled, { css } from 'styled-components'; import { EuiCallOut } from '@elastic/eui'; import { SUPPORTED_CONNECTORS } from '../../../common/constants'; -import { useKibana } from '../../common/lib/kibana_react'; +import { useKibana } from '../../common/lib/kibana'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useActionTypes } from '../../containers/configure/use_action_types'; import { useCaseConfigure } from '../../containers/configure/use_configure'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx index 0c80a0b77ec65..38a1e30616200 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx @@ -18,12 +18,11 @@ import { useGetSingleIssue } from './use_get_single_issue'; import { useGetIssues } from './use_get_issues'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -jest.mock('../../../common/lib/kibana_react'); jest.mock('./use_get_issue_types'); jest.mock('./use_get_fields_by_issue_type'); jest.mock('./use_get_single_issue'); jest.mock('./use_get_issues'); - +jest.mock('../../../common/lib/kibana'); const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; const useGetSingleIssueMock = useGetSingleIssue as jest.Mock; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx index 484c94dfae39a..7accdfa199bd2 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx @@ -11,7 +11,7 @@ import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@el import * as i18n from './translations'; import { ConnectorTypes, JiraFieldsType } from '../../../../common/api/connectors'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { useGetIssueTypes } from './use_get_issue_types'; import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx index 6c650b9a55b77..9270abed0881f 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx @@ -8,7 +8,7 @@ import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { ActionConnector } from '../../../containers/types'; import { useGetIssues } from './use_get_issues'; import { useGetSingleIssue } from './use_get_single_issue'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx index 815cbdd550aa4..b4c2c848d79ed 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { connector } from '../mock'; import { useGetFieldsByIssueType, UseGetFieldsByIssueType } from './use_get_fields_by_issue_type'; import * as api from './api'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx index 80836169d30a7..6c1a9b5fcab08 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { connector } from '../mock'; import { useGetIssueTypes, UseGetIssueTypes } from './use_get_issue_types'; import * as api from './api'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx index 68b18beaa62d4..2308fe604e710 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { connector as actionConnector, issues } from '../mock'; import { useGetIssues, UseGetIssues } from './use_get_issues'; import * as api from './api'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx index 24339b3446ddf..28949b456ecdd 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { connector as actionConnector, issues } from '../mock'; import { useGetSingleIssue, UseGetSingleIssue } from './use_get_single_issue'; import * as api from './api'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx index ea3ead496a6e6..dda6ba5de95cc 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx @@ -15,7 +15,7 @@ import { useGetIncidentTypes } from './use_get_incident_types'; import { useGetSeverity } from './use_get_severity'; import Fields from './case_fields'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./use_get_incident_types'); jest.mock('./use_get_severity'); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx index 0f43cabbb5d52..9b2f97036516c 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx @@ -15,7 +15,7 @@ import { EuiSpacer, } from '@elastic/eui'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { useGetIncidentTypes } from './use_get_incident_types'; import { useGetSeverity } from './use_get_severity'; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx index c43fa3ec56e80..59c1f8e9b40d0 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { connector } from '../mock'; import { useGetIncidentTypes, UseGetIncidentTypes } from './use_get_incident_types'; import * as api from './api'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx index d8ea591c2edbe..f646dd7e8f7c2 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx @@ -7,12 +7,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { connector } from '../mock'; import { useGetSeverity, UseGetSeverity } from './use_get_severity'; import * as api from './api'; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx index 509a0289c6160..9688ca191d672 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx @@ -16,7 +16,7 @@ import Fields from './servicenow_itsm_case_fields'; let onChoicesSuccess = (c: Choice[]) => {}; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./use_get_choices', () => ({ useGetChoices: (args: { onSuccess: () => void }) => { onChoicesSuccess = args.onSuccess; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx index 81113eee78104..6b211e3fe0bc1 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx @@ -11,7 +11,7 @@ import * as i18n from './translations'; import { ConnectorFieldsProps } from '../types'; import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../common/api/connectors'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { ConnectorCard } from '../card'; import { useGetChoices } from './use_get_choices'; import { Fields, Choice } from './types'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx index 1fd54ae985c13..4a5b34cd3c3cb 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx @@ -16,7 +16,7 @@ import Fields from './servicenow_sir_case_fields'; let onChoicesSuccess = (c: Choice[]) => {}; -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); jest.mock('./use_get_choices', () => ({ useGetChoices: (args: { onSuccess: () => void }) => { onChoicesSuccess = args.onSuccess; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx index c2bda4caa5d98..838f824d9332c 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx @@ -9,7 +9,7 @@ import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react' import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../common/api/connectors'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { ConnectorCard } from '../card'; import { useGetChoices } from './use_get_choices'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx index bdc634ae57bf9..ed4577dd0114b 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx @@ -7,14 +7,14 @@ import { renderHook } from '@testing-library/react-hooks'; -import { useKibana } from '../../../common/lib/kibana_react'; +import { useKibana } from '../../../common/lib/kibana'; import { ActionConnector } from '../../../containers/types'; import { choices } from '../mock'; import { useGetChoices, UseGetChoices, UseGetChoicesProps } from './use_get_choices'; import * as api from './api'; jest.mock('./api'); -jest.mock('../../../common/lib/kibana_react'); +jest.mock('../../../common/lib/kibana'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; const onSuccess = jest.fn(); diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx index b228418a8e221..db9e5ffac1533 100644 --- a/x-pack/plugins/cases/public/components/create/connector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -20,7 +20,7 @@ import { useGetChoices } from '../connectors/servicenow/use_get_choices'; import { incidentTypes, severity, choices } from '../connectors/mock'; import { schema, FormProps } from './schema'; -jest.mock('../../common/lib/kibana_react', () => { +jest.mock('../../common/lib/kibana', () => { return { useKibana: () => ({ services: { diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index 009e950f81ee3..50b8af2dfbd3f 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -10,12 +10,12 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { useKibana } from '../../common/lib/kibana_react'; +import { useKibana } from '../../common/lib/kibana'; import '../../../common/mock/match_media'; import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; import { TestProviders } from '../../common/mock'; -jest.mock('../../common/lib/kibana_react'); +jest.mock('../../common/lib/kibana'); jest.mock('../create/form_context', () => { return { FormContext: ({ diff --git a/x-pack/plugins/cases/public/containers/api.test.tsx b/x-pack/plugins/cases/public/containers/api.test.tsx index 33e088b9cff04..adad70c224719 100644 --- a/x-pack/plugins/cases/public/containers/api.test.tsx +++ b/x-pack/plugins/cases/public/containers/api.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaServices } from '../common/lib/kibana_react'; +import { KibanaServices } from '../common/lib/kibana'; import { ConnectorTypes, CommentType, CaseStatuses } from '../../common/api'; import { CASES_URL } from '../../common/constants'; diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts index 7af616cf8e0c1..69a7b5fdd3307 100644 --- a/x-pack/plugins/cases/public/containers/api.ts +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -43,7 +43,7 @@ import { getSubCaseUserActionUrl, } from '../../common/api/helpers'; -import { KibanaServices } from '../common/lib/kibana_react'; +import { KibanaServices } from '../common/lib/kibana'; import { StatusAll } from '../components/status'; import { diff --git a/x-pack/plugins/cases/public/containers/configure/api.test.ts b/x-pack/plugins/cases/public/containers/configure/api.test.ts index 64db5092cd883..1bd8598254cb9 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.test.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaServices } from '../../common/lib/kibana_react'; +import { KibanaServices } from '../../common/lib/kibana'; import { fetchConnectors, getCaseConfigure, diff --git a/x-pack/plugins/cases/public/containers/configure/api.ts b/x-pack/plugins/cases/public/containers/configure/api.ts index 3da2405c719bb..14a3b65ea1ab7 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.ts @@ -13,7 +13,7 @@ import { CasesConfigureResponse, CasesConfigureRequest, } from '../../../common/api'; -import { KibanaServices } from '../../common/lib/kibana_react'; +import { KibanaServices } from '../../common/lib/kibana'; import { CASE_CONFIGURE_CONNECTORS_URL, diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 40e503c280a40..c0ec1073d9bad 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -11,7 +11,7 @@ import { TestComponent } from '.'; import { CreateCaseProps } from './components/create'; import { SetupPlugins, StartPlugins } from './types'; import { getCreateCaseLazy } from './get_create_case'; -import { KibanaServices } from './common/lib/kibana_react'; +import { KibanaServices } from './common/lib/kibana'; export interface CasesUiStart { casesComponent: () => JSX.Element; From 51f6f4d47a13c5f488495e4f3a1e71ab8975882d Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 09:31:19 -0700 Subject: [PATCH 11/52] fixed components tests --- .../plugins/cases/public/common/test_utils.ts | 12 +++ .../components/configure_cases/index.test.tsx | 6 +- .../components/configure_cases/index.tsx | 2 +- .../connector_selector/form.test.tsx | 4 +- .../public/components/create/flyout.test.tsx | 1 - .../public/components/create/index.test.tsx | 35 +++------ .../components/markdown_editor/editor.tsx | 2 +- .../markdown_editor/renderer.test.tsx | 2 +- .../components/markdown_editor/renderer.tsx | 75 +++++++++---------- .../create_case_modal.test.tsx | 1 - .../use_create_case_modal/index.test.tsx | 3 - 11 files changed, 63 insertions(+), 80 deletions(-) create mode 100644 x-pack/plugins/cases/public/common/test_utils.ts diff --git a/x-pack/plugins/cases/public/common/test_utils.ts b/x-pack/plugins/cases/public/common/test_utils.ts new file mode 100644 index 0000000000000..f6ccf28bcb643 --- /dev/null +++ b/x-pack/plugins/cases/public/common/test_utils.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Convenience utility to remove text appended to links by EUI + */ +export const removeExternalLinkText = (str: string) => + str.replace(/\(opens in a new tab or window\)/g, ''); diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index 0e1dcf8d951d5..0a8a2a39636dc 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -24,7 +24,6 @@ import { useKibana } from '../../common/lib/kibana'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; import { useActionTypes } from '../../containers/configure/use_action_types'; -import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; import { connectors, @@ -35,16 +34,15 @@ import { } from './__mock__'; import { ConnectorTypes } from '../../../common/api/connectors'; -jest.mock('../../../common/lib/kibana'); +jest.mock('../../common/lib/kibana'); jest.mock('../../containers/configure/use_connectors'); jest.mock('../../containers/configure/use_configure'); jest.mock('../../containers/configure/use_action_types'); -jest.mock('../../../common/components/navigation/use_get_url_search'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; const useConnectorsMock = useConnectors as jest.Mock; const useCaseConfigureMock = useCaseConfigure as jest.Mock; -const useGetUrlSearchMock = useGetUrlSearch as jest.Mock; +const useGetUrlSearchMock = jest.fn(); const useActionTypesMock = useActionTypes as jest.Mock; describe('ConfigureCases', () => { diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index 594683e89b7b7..3e352f119e840 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -10,7 +10,7 @@ import styled, { css } from 'styled-components'; import { EuiCallOut } from '@elastic/eui'; -import { SUPPORTED_CONNECTORS } from '../../../common/constants'; +import { SUPPORTED_CONNECTORS } from '../../../common'; import { useKibana } from '../../common/lib/kibana'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useActionTypes } from '../../containers/configure/use_action_types'; diff --git a/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx b/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx index 179cc58a23231..ec136989dd937 100644 --- a/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx +++ b/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx @@ -12,9 +12,7 @@ import { ConnectorSelector } from './form'; import { connectorsMock } from '../../containers/mock'; import { getFormMock } from '../__mock__/form'; -jest.mock( - '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' -); +jest.mock('../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'); const useFormMock = useForm as jest.Mock; diff --git a/x-pack/plugins/cases/public/components/create/flyout.test.tsx b/x-pack/plugins/cases/public/components/create/flyout.test.tsx index fa322cd7019c8..5187029ab60c7 100644 --- a/x-pack/plugins/cases/public/components/create/flyout.test.tsx +++ b/x-pack/plugins/cases/public/components/create/flyout.test.tsx @@ -8,7 +8,6 @@ import React, { ReactNode } from 'react'; import { mount } from 'enzyme'; -import '../../../common/mock/match_media'; import { CreateCaseFlyout } from './flyout'; import { TestProviders } from '../../common/mock'; diff --git a/x-pack/plugins/cases/public/components/create/index.test.tsx b/x-pack/plugins/cases/public/components/create/index.test.tsx index 458f9a44079e8..e82af8edc6337 100644 --- a/x-pack/plugins/cases/public/components/create/index.test.tsx +++ b/x-pack/plugins/cases/public/components/create/index.test.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; -import { noop } from 'lodash/fp'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { TestProviders } from '../../common/mock'; @@ -41,7 +40,6 @@ jest.mock('../connectors/jira/use_get_issue_types'); jest.mock('../connectors/jira/use_get_fields_by_issue_type'); jest.mock('../connectors/jira/use_get_single_issue'); jest.mock('../connectors/jira/use_get_issues'); -jest.mock('../use_insert_timeline'); const useConnectorsMock = useConnectors as jest.Mock; const useCaseConfigureMock = useCaseConfigure as jest.Mock; @@ -70,6 +68,11 @@ const fillForm = (wrapper: ReactWrapper) => { }); }; +const defaultProps = { + onCancel: jest.fn(), + onSuccess: jest.fn(), +}; + describe('CreateCase case', () => { beforeEach(() => { jest.resetAllMocks(); @@ -88,7 +91,7 @@ describe('CreateCase case', () => { it('it renders', async () => { const wrapper = mount( <TestProviders> - <CreateCase /> + <CreateCase {...defaultProps} /> </TestProviders> ); @@ -96,44 +99,28 @@ describe('CreateCase case', () => { expect(wrapper.find(`[data-test-subj="create-case-cancel"]`).exists()).toBeTruthy(); }); - it('should redirect to all cases on cancel click', async () => { + it('should call cancel on cancel click', async () => { const wrapper = mount( <TestProviders> - <CreateCase /> + <CreateCase {...defaultProps} /> </TestProviders> ); wrapper.find(`[data-test-subj="create-case-cancel"]`).first().simulate('click'); + expect(defaultProps.onCancel).toHaveBeenCalled(); }); it('should redirect to new case when posting the case', async () => { const wrapper = mount( <TestProviders> - <CreateCase /> + <CreateCase {...defaultProps} /> </TestProviders> ); fillForm(wrapper); wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - }); - - it('it should insert a timeline', async () => { - const attachTimeline = noop; - - const wrapper = mount( - <TestProviders> - <CreateCase /> - </TestProviders> - ); - - act(() => { - attachTimeline('[title](url)'); - }); - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="caseDescription"] textarea`).text()).toBe( - '[title](url)' - ); + expect(defaultProps.onSuccess).toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx index 932ec6141e3d0..a7d37fdda3085 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx @@ -23,7 +23,7 @@ interface MarkdownEditorProps { } // create plugin stuff here -const { uiPlugins, parsingPlugins, processingPlugins } = { +export const { uiPlugins, parsingPlugins, processingPlugins } = { uiPlugins: getDefaultEuiMarkdownUiPlugins(), parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), processingPlugins: getDefaultEuiMarkdownProcessingPlugins(), diff --git a/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx b/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx index 490392c237e19..5d299529561ba 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/renderer.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { removeExternalLinkText } from '../../../../common/test_utils'; +import { removeExternalLinkText } from '../../common/test_utils'; import { MarkdownRenderer } from './renderer'; describe('Markdown', () => { diff --git a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx index b2c08b65546aa..c321c794c1e77 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx @@ -5,44 +5,37 @@ * 2.0. */ -// /* -// * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// * or more contributor license agreements. Licensed under the Elastic License -// * 2.0; you may not use this file except in compliance with the Elastic License -// * 2.0. -// */ -// -// import React, { memo, useMemo } from 'react'; -// import { cloneDeep } from 'lodash/fp'; -// import { EuiMarkdownFormat, EuiLinkAnchorProps } from '@elastic/eui'; -// -// import { parsingPlugins, processingPlugins } from './plugins'; -// import { MarkdownLink } from './markdown_link'; -// -// interface Props { -// children: string; -// disableLinks?: boolean; -// } -// -// const MarkdownRendererComponent: React.FC<Props> = ({ children, disableLinks }) => { -// const MarkdownLinkProcessingComponent: React.FC<EuiLinkAnchorProps> = useMemo( -// () => (props) => <MarkdownLink {...props} disableLinks={disableLinks} />, -// [disableLinks] -// ); -// -// // Deep clone of the processing plugins to prevent affecting the markdown editor. -// const processingPluginList = cloneDeep(processingPlugins); -// // This line of code is TS-compatible and it will break if [1][1] change in the future. -// processingPluginList[1][1].components.a = MarkdownLinkProcessingComponent; -// -// return ( -// <EuiMarkdownFormat -// parsingPluginList={parsingPlugins} -// processingPluginList={processingPluginList} -// > -// {children} -// </EuiMarkdownFormat> -// ); -// }; -// -// export const MarkdownRenderer = memo(MarkdownRendererComponent); +import React, { memo, useMemo } from 'react'; +import { cloneDeep } from 'lodash/fp'; +import { EuiMarkdownFormat, EuiLinkAnchorProps } from '@elastic/eui'; + +import { parsingPlugins, processingPlugins } from './'; +import { MarkdownLink } from './markdown_link'; + +interface Props { + children: string; + disableLinks?: boolean; +} + +const MarkdownRendererComponent: React.FC<Props> = ({ children, disableLinks }) => { + const MarkdownLinkProcessingComponent: React.FC<EuiLinkAnchorProps> = useMemo( + () => (props) => <MarkdownLink {...props} disableLinks={disableLinks} />, + [disableLinks] + ); + + // Deep clone of the processing plugins to prevent affecting the markdown editor. + const processingPluginList = cloneDeep(processingPlugins); + // This line of code is TS-compatible and it will break if [1][1] change in the future. + processingPluginList[1][1].components.a = MarkdownLinkProcessingComponent; + + return ( + <EuiMarkdownFormat + parsingPluginList={parsingPlugins} + processingPluginList={processingPluginList} + > + {children} + </EuiMarkdownFormat> + ); +}; + +export const MarkdownRenderer = memo(MarkdownRendererComponent); diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx index 99c6d06d78aae..fcdc2f8e58774 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx @@ -8,7 +8,6 @@ import React, { ReactNode } from 'react'; import { mount } from 'enzyme'; -import '../../../common/mock/match_media'; import { CreateCaseModal } from './create_case_modal'; import { TestProviders } from '../../common/mock'; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index 50b8af2dfbd3f..df9e6f0af60d9 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -11,7 +11,6 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { useKibana } from '../../common/lib/kibana'; -import '../../../common/mock/match_media'; import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; import { TestProviders } from '../../common/mock'; @@ -59,8 +58,6 @@ jest.mock('../create/submit_button', () => { }; }); -jest.mock('../../../common/hooks/use_selector'); - const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; const onCaseCreated = jest.fn(); From 8f1e82d3338a6d625b1d40ba310af9347f0d2e0d Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 09:35:24 -0700 Subject: [PATCH 12/52] flip USE_RAC_CASES_UI to false --- x-pack/plugins/security_solution/common/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 9fb686ec6619a..3b23539f3ac0f 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -212,4 +212,4 @@ export const showAllOthersBucket: string[] = [ DO NOT MERGE to master as true, dev only */ -export const USE_RAC_CASES_UI = true; +export const USE_RAC_CASES_UI = false; From 4763023342af59bb276efcee82581424bbc1abd0 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Thu, 11 Mar 2021 11:42:57 -0500 Subject: [PATCH 13/52] fix container tests --- x-pack/plugins/cases/public/containers/api.test.tsx | 2 +- x-pack/plugins/cases/public/containers/configure/api.test.ts | 2 +- .../cases/public/containers/configure/use_configure.test.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/cases/public/containers/api.test.tsx b/x-pack/plugins/cases/public/containers/api.test.tsx index adad70c224719..849b85f2157f6 100644 --- a/x-pack/plugins/cases/public/containers/api.test.tsx +++ b/x-pack/plugins/cases/public/containers/api.test.tsx @@ -50,7 +50,7 @@ import { DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../common/lib/kibana'); +jest.mock('../common/lib/kibana'); const fetchMock = jest.fn(); mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); diff --git a/x-pack/plugins/cases/public/containers/configure/api.test.ts b/x-pack/plugins/cases/public/containers/configure/api.test.ts index 1bd8598254cb9..72d315cb6e0d3 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.test.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.test.ts @@ -24,7 +24,7 @@ import { ConnectorTypes } from '../../../common/api/connectors'; const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../../common/lib/kibana'); +jest.mock('../../common/lib/kibana'); const fetchMock = jest.fn(); mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx index 8d726e3f72c01..e050a4be85bb3 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx @@ -18,8 +18,8 @@ import { ConnectorTypes } from '../../../common/api/connectors'; jest.mock('./api'); const mockErrorToToaster = jest.fn(); -jest.mock('../../../common/components/toasters', () => { - const original = jest.requireActual('../../../common/components/toasters'); +jest.mock('../../components/toasters', () => { + const original = jest.requireActual('../../components/toasters'); return { ...original, errorToToaster: () => mockErrorToToaster(), From 8f3424bb91562a823d034879d5b6c53fcb0862fa Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 09:49:26 -0700 Subject: [PATCH 14/52] rm some comments --- x-pack/plugins/cases/common/constants.ts | 1 - x-pack/plugins/cases/public/common/lib/kibana/services.ts | 2 +- .../cases/public/components/configure_cases/__mock__/index.tsx | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index 405552140db0f..337804dd23692 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -5,7 +5,6 @@ * 2.0. */ -// import { DEFAULT_MAX_SIGNALS } from '../../security_solution/common/constants'; const DEFAULT_MAX_SIGNALS = 100; export const APP_ID = 'cases'; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/services.ts b/x-pack/plugins/cases/public/common/lib/kibana/services.ts index b9e49ab466c3a..3b492fb45c87f 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/services.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/services.ts @@ -7,7 +7,7 @@ import { CoreStart } from 'kibana/public'; -type GlobalServices = Pick<CoreStart, 'http'>; // | 'uiSettings' & Pick<StartPlugins, 'data'>; not sure if we need this +type GlobalServices = Pick<CoreStart, 'http'>; export class KibanaServices { private static kibanaVersion?: string; diff --git a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx index 83b0b71b32ccc..2f770d913aff5 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx @@ -14,7 +14,6 @@ import { connectorsMock, actionTypesMock } from '../../../containers/configure/m export { mappings } from '../../../containers/configure/mock'; export const connectors: ActionConnector[] = connectorsMock; -// x - pack / plugins / triggers_actions_ui; export const searchURL = '?timerange=(global:(linkTo:!(),timerange:(from:1585487656371,fromStr:now-24h,kind:relative,to:1585574056371,toStr:now)),timeline:(linkTo:!(),timerange:(from:1585227005527,kind:absolute,to:1585313405527)))'; From 4ff74fba88b1a7362ea4dac526306ad9914a31d2 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 11 Mar 2021 14:51:53 -0700 Subject: [PATCH 15/52] fix more imports --- .../configure_cases/__mock__/index.tsx | 2 +- .../configure_cases/connectors.test.tsx | 2 +- .../components/configure_cases/connectors.tsx | 2 +- .../configure_cases/connectors_dropdown.tsx | 2 +- .../components/configure_cases/index.test.tsx | 2 +- .../components/configure_cases/utils.ts | 2 +- .../components/connector_selector/form.tsx | 2 +- .../public/components/connectors/card.tsx | 2 +- .../connectors/case/alert_fields.tsx | 2 +- .../connectors/case/existing_case.tsx | 2 +- .../components/connectors/fields_form.tsx | 2 +- .../public/components/connectors/index.ts | 2 +- .../connectors/jira/case_fields.tsx | 2 +- .../components/connectors/jira/index.ts | 2 +- .../connectors/resilient/case_fields.tsx | 2 +- .../components/connectors/resilient/index.ts | 2 +- .../components/connectors/servicenow/index.ts | 5 +---- .../servicenow_itsm_case_fields.tsx | 2 +- .../servicenow/servicenow_sir_case_fields.tsx | 2 +- .../public/components/connectors/types.ts | 4 ++-- .../public/components/create/connector.tsx | 2 +- .../components/create/form_context.test.tsx | 2 +- .../public/components/create/form_context.tsx | 2 +- .../cases/public/components/create/mock.ts | 3 +-- .../cases/public/components/create/schema.tsx | 2 +- .../public/components/status/button.test.tsx | 2 +- .../cases/public/components/status/button.tsx | 2 +- .../cases/public/components/status/config.ts | 2 +- .../public/components/status/stats.test.tsx | 2 +- .../cases/public/components/status/stats.tsx | 2 +- .../public/components/status/status.test.tsx | 2 +- .../cases/public/components/status/types.ts | 2 +- .../create_case_modal.tsx | 2 +- .../use_create_case_modal/index.tsx | 2 +- .../cases/public/containers/__mocks__/api.ts | 2 +- .../cases/public/containers/api.test.tsx | 4 ++-- x-pack/plugins/cases/public/containers/api.ts | 6 +++--- .../containers/configure/__mocks__/api.ts | 2 +- .../public/containers/configure/api.test.ts | 4 ++-- .../cases/public/containers/configure/api.ts | 4 ++-- .../cases/public/containers/configure/mock.ts | 2 +- .../public/containers/configure/types.ts | 2 +- .../configure/use_configure.test.tsx | 2 +- .../containers/configure/use_configure.tsx | 2 +- .../plugins/cases/public/containers/mock.ts | 20 +++++++++---------- .../plugins/cases/public/containers/types.ts | 4 ++-- .../public/containers/use_get_cases.test.tsx | 2 +- .../public/containers/use_post_case.test.tsx | 2 +- .../cases/public/containers/use_post_case.tsx | 2 +- .../use_post_push_to_service.test.tsx | 2 +- .../containers/use_post_push_to_service.tsx | 2 +- .../plugins/cases/public/containers/utils.ts | 2 +- .../client/alerts/update_status.test.ts | 2 +- .../cases/server/client/cases/create.test.ts | 7 +------ .../cases/server/client/cases/create.ts | 2 +- .../plugins/cases/server/client/cases/get.ts | 2 +- .../plugins/cases/server/client/cases/mock.ts | 2 +- .../plugins/cases/server/client/cases/push.ts | 2 +- .../cases/server/client/cases/types.ts | 2 +- .../cases/server/client/cases/update.test.ts | 2 +- .../cases/server/client/cases/update.ts | 2 +- .../cases/server/client/cases/utils.ts | 2 +- x-pack/plugins/cases/server/client/client.ts | 2 +- .../cases/server/client/comments/add.test.ts | 2 +- .../cases/server/client/comments/add.ts | 4 ++-- .../client/configure/get_fields.test.ts | 2 +- .../server/client/configure/get_fields.ts | 2 +- .../client/configure/get_mappings.test.ts | 2 +- .../server/client/configure/get_mappings.ts | 2 +- .../cases/server/client/configure/mock.ts | 6 +----- .../server/client/configure/utils.test.ts | 2 +- .../cases/server/client/configure/utils.ts | 6 +----- x-pack/plugins/cases/server/client/types.ts | 2 +- .../cases/server/client/user_actions/get.ts | 2 +- .../server/common/models/commentable_case.ts | 2 +- .../plugins/cases/server/common/utils.test.ts | 2 +- x-pack/plugins/cases/server/common/utils.ts | 8 +------- .../server/connectors/case/index.test.ts | 2 +- .../cases/server/connectors/case/index.ts | 7 +------ .../cases/server/connectors/case/schema.ts | 2 +- .../cases/server/connectors/case/types.ts | 2 +- .../plugins/cases/server/connectors/index.ts | 2 +- .../jira/external_service_formatter.test.ts | 2 +- .../jira/external_service_formatter.ts | 2 +- .../external_service_formatter.test.ts | 2 +- .../resilient/external_service_formatter.ts | 2 +- .../connectors/servicenow/itsm_formatter.ts | 2 +- .../servicenow/itsm_formmater.test.ts | 2 +- .../servicenow/sir_formatter.test.ts | 2 +- .../connectors/servicenow/sir_formatter.ts | 2 +- .../plugins/cases/server/connectors/types.ts | 2 +- x-pack/plugins/cases/server/plugin.ts | 2 +- .../api/__fixtures__/mock_saved_objects.ts | 2 +- .../routes/api/__mocks__/request_responses.ts | 2 +- .../api/cases/comments/delete_all_comments.ts | 3 +-- .../api/cases/comments/delete_comment.test.ts | 2 +- .../api/cases/comments/delete_comment.ts | 2 +- .../api/cases/comments/find_comments.ts | 4 ++-- .../api/cases/comments/get_all_comment.ts | 4 ++-- .../api/cases/comments/get_comment.test.ts | 2 +- .../routes/api/cases/comments/get_comment.ts | 4 ++-- .../api/cases/comments/patch_comment.test.ts | 4 ++-- .../api/cases/comments/patch_comment.ts | 4 ++-- .../api/cases/comments/post_comment.test.ts | 4 ++-- .../routes/api/cases/comments/post_comment.ts | 4 ++-- .../api/cases/configure/get_configure.test.ts | 3 +-- .../api/cases/configure/get_configure.ts | 4 ++-- .../cases/configure/get_connectors.test.ts | 2 +- .../api/cases/configure/get_connectors.ts | 5 +---- .../cases/configure/patch_configure.test.ts | 3 +-- .../api/cases/configure/patch_configure.ts | 4 ++-- .../cases/configure/post_configure.test.ts | 3 +-- .../api/cases/configure/post_configure.ts | 4 ++-- .../routes/api/cases/delete_cases.test.ts | 2 +- .../server/routes/api/cases/delete_cases.ts | 2 +- .../routes/api/cases/find_cases.test.ts | 2 +- .../server/routes/api/cases/find_cases.ts | 4 ++-- .../server/routes/api/cases/get_case.test.ts | 4 ++-- .../cases/server/routes/api/cases/get_case.ts | 2 +- .../server/routes/api/cases/helpers.test.ts | 2 +- .../cases/server/routes/api/cases/helpers.ts | 11 +++++----- .../routes/api/cases/patch_cases.test.ts | 2 +- .../server/routes/api/cases/patch_cases.ts | 4 ++-- .../server/routes/api/cases/post_case.test.ts | 4 ++-- .../server/routes/api/cases/post_case.ts | 4 ++-- .../server/routes/api/cases/push_case.test.ts | 2 +- .../server/routes/api/cases/push_case.ts | 4 ++-- .../api/cases/reporters/get_reporters.ts | 4 ++-- .../api/cases/status/get_status.test.ts | 4 ++-- .../routes/api/cases/status/get_status.ts | 4 ++-- .../api/cases/sub_case/delete_sub_cases.ts | 2 +- .../api/cases/sub_case/find_sub_cases.ts | 4 ++-- .../routes/api/cases/sub_case/get_sub_case.ts | 4 ++-- .../api/cases/sub_case/patch_sub_cases.ts | 4 ++-- .../server/routes/api/cases/tags/get_tags.ts | 2 +- .../user_actions/get_all_user_actions.ts | 2 +- .../cases/server/routes/api/utils.test.ts | 2 +- .../plugins/cases/server/routes/api/utils.ts | 2 +- .../server/saved_object_types/migrations.ts | 2 +- .../cases/server/scripts/sub_cases/index.ts | 4 +--- .../server/services/alerts/index.test.ts | 2 +- .../cases/server/services/alerts/index.ts | 2 +- .../cases/server/services/configure/index.ts | 2 +- .../services/connector_mappings/index.ts | 2 +- x-pack/plugins/cases/server/services/index.ts | 2 +- .../services/reporters/read_reporters.ts | 2 +- .../cases/server/services/tags/read_tags.ts | 2 +- .../server/services/user_actions/helpers.ts | 2 +- .../server/services/user_actions/index.ts | 2 +- .../components/add_comment/index.test.tsx | 2 +- .../cases/components/add_comment/index.tsx | 4 ++-- .../cases/components/add_comment/schema.tsx | 2 +- .../cases/components/all_cases/actions.tsx | 2 +- .../cases/components/all_cases/columns.tsx | 2 +- .../components/all_cases/expanded_row.tsx | 2 +- .../cases/components/all_cases/helpers.ts | 2 +- .../cases/components/all_cases/index.test.tsx | 2 +- .../cases/components/all_cases/index.tsx | 2 +- .../all_cases/status_filter.test.tsx | 2 +- .../all_cases/table_filters.test.tsx | 2 +- .../components/all_cases/table_filters.tsx | 2 +- .../cases/components/bulk_actions/index.tsx | 2 +- .../case_action_bar/helpers.test.ts | 2 +- .../components/case_action_bar/helpers.ts | 2 +- .../components/case_action_bar/index.tsx | 2 +- .../status_context_menu.test.tsx | 2 +- .../case_action_bar/status_context_menu.tsx | 2 +- .../components/case_view/helpers.test.tsx | 2 +- .../cases/components/case_view/helpers.ts | 2 +- .../cases/components/case_view/index.test.tsx | 3 +-- .../cases/components/case_view/index.tsx | 2 +- .../configure_cases/__mock__/index.tsx | 2 +- .../configure_cases/connectors.test.tsx | 2 +- .../configure_cases/connectors_dropdown.tsx | 2 +- .../components/configure_cases/index.test.tsx | 2 +- .../components/configure_cases/index.tsx | 2 +- .../cases/components/configure_cases/utils.ts | 2 +- .../components/connector_selector/form.tsx | 2 +- .../cases/components/connectors/card.tsx | 2 +- .../connectors/case/alert_fields.tsx | 2 +- .../connectors/case/existing_case.tsx | 2 +- .../components/connectors/fields_form.tsx | 2 +- .../cases/components/connectors/index.ts | 2 +- .../cases/components/connectors/jira/index.ts | 2 +- .../components/connectors/resilient/index.ts | 2 +- .../components/connectors/servicenow/index.ts | 5 +---- .../servicenow/servicenow_sir_case_fields.tsx | 2 +- .../cases/components/create/connector.tsx | 2 +- .../components/create/form_context.test.tsx | 2 +- .../cases/components/create/form_context.tsx | 2 +- .../public/cases/components/create/mock.ts | 3 +-- .../public/cases/components/create/schema.tsx | 2 +- .../cases/components/edit_connector/index.tsx | 3 +-- .../cases/components/status/button.test.tsx | 2 +- .../public/cases/components/status/button.tsx | 2 +- .../public/cases/components/status/config.ts | 2 +- .../cases/components/status/stats.test.tsx | 2 +- .../public/cases/components/status/stats.tsx | 2 +- .../cases/components/status/status.test.tsx | 2 +- .../public/cases/components/status/types.ts | 2 +- .../timeline_actions/add_to_case_action.tsx | 2 +- .../use_all_cases_modal/all_cases_modal.tsx | 2 +- .../components/use_all_cases_modal/index.tsx | 2 +- .../create_case_modal.tsx | 2 +- .../use_create_case_modal/index.tsx | 2 +- .../use_push_to_service/index.test.tsx | 3 +-- .../components/use_push_to_service/index.tsx | 2 +- .../user_action_tree/helpers.test.tsx | 2 +- .../components/user_action_tree/helpers.tsx | 2 +- .../components/user_action_tree/index.tsx | 2 +- .../user_action_alert_comment_event.test.tsx | 2 +- .../user_action_alert_comment_event.tsx | 2 +- 212 files changed, 257 insertions(+), 300 deletions(-) diff --git a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx index 2f770d913aff5..e3abbeadd2d3c 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/__mock__/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypes } from '../../../../common/api'; +import { ConnectorTypes } from '../../../../common'; import { ActionConnector } from '../../../containers/configure/types'; import { UseConnectorsResponse } from '../../../containers/configure/use_connectors'; import { ReturnUseCaseConfigure } from '../../../containers/configure/use_configure'; diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx index e5a8362737ace..d5b9a885f2c6d 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx @@ -12,7 +12,7 @@ import { Connectors, Props } from './connectors'; import { TestProviders } from '../../common/mock'; import { ConnectorsDropdown } from './connectors_dropdown'; import { connectors } from './__mock__'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; describe('Connectors', () => { let wrapper: ReactWrapper; diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx index 36a982190f3db..45be02e05e1f0 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx @@ -21,7 +21,7 @@ import * as i18n from './translations'; import { ActionConnector, CaseConnectorMapping } from '../../containers/configure/types'; import { Mapping } from './mapping'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; const EuiFormRowExtended = styled(EuiFormRow)` .euiFormRow__labelWrapper { diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx index 15d374a2bd8a9..21ef5c490b17a 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx @@ -9,7 +9,7 @@ import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSuperSelect } from '@elastic/eui'; import styled from 'styled-components'; -import { ConnectorTypes } from '../../../common/api'; +import { ConnectorTypes } from '../../../common'; import { ActionConnector } from '../../containers/configure/types'; import { connectorsConfiguration } from '../connectors'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index 0a8a2a39636dc..898d6cde19a77 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -32,7 +32,7 @@ import { useConnectorsResponse, useActionTypesResponse, } from './__mock__'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; jest.mock('../../common/lib/kibana'); jest.mock('../../containers/configure/use_connectors'); diff --git a/x-pack/plugins/cases/public/components/configure_cases/utils.ts b/x-pack/plugins/cases/public/components/configure_cases/utils.ts index 19845023a7a42..ade1a5e0c2bba 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/utils.ts +++ b/x-pack/plugins/cases/public/components/configure_cases/utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypeFields, ConnectorTypes } from '../../../common/api'; +import { ConnectorTypeFields, ConnectorTypes } from '../../../common'; import { CaseField, ActionType, diff --git a/x-pack/plugins/cases/public/components/connector_selector/form.tsx b/x-pack/plugins/cases/public/components/connector_selector/form.tsx index 469ca1636b7fa..210334e93adb8 100644 --- a/x-pack/plugins/cases/public/components/connector_selector/form.tsx +++ b/x-pack/plugins/cases/public/components/connector_selector/form.tsx @@ -11,7 +11,7 @@ import { EuiFormRow } from '@elastic/eui'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../common/shared_imports'; import { ConnectorsDropdown } from '../configure_cases/connectors_dropdown'; -import { ActionConnector } from '../../../common/api'; +import { ActionConnector } from '../../../common'; interface ConnectorSelectorProps { connectors: ActionConnector[]; diff --git a/x-pack/plugins/cases/public/components/connectors/card.tsx b/x-pack/plugins/cases/public/components/connectors/card.tsx index 42cbb02659a78..82a508ccf3432 100644 --- a/x-pack/plugins/cases/public/components/connectors/card.tsx +++ b/x-pack/plugins/cases/public/components/connectors/card.tsx @@ -10,7 +10,7 @@ import { EuiCard, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; import styled from 'styled-components'; import { connectorsConfiguration } from '.'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; interface ConnectorCardProps { connectorType: ConnectorTypes; diff --git a/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx b/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx index 56de8297c27a0..10955db69461c 100644 --- a/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx @@ -12,7 +12,7 @@ import styled from 'styled-components'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { ActionParamsProps } from '../../../../../triggers_actions_ui/public/types'; -import { CommentType } from '../../../../common/api'; +import { CommentType } from '../../../../common'; import { CaseActionParams } from './types'; import { ExistingCase } from './existing_case'; diff --git a/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx b/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx index 56cd6cfb45ba5..22798843dd856 100644 --- a/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx +++ b/x-pack/plugins/cases/public/components/connectors/case/existing_case.tsx @@ -6,7 +6,7 @@ */ import React, { memo, useMemo, useCallback } from 'react'; -import { CaseType } from '../../../../common/api'; +import { CaseType } from '../../../../common'; import { useGetCases, DEFAULT_QUERY_PARAMS, diff --git a/x-pack/plugins/cases/public/components/connectors/fields_form.tsx b/x-pack/plugins/cases/public/components/connectors/fields_form.tsx index fcbc41bc437bd..d71da6f87689d 100644 --- a/x-pack/plugins/cases/public/components/connectors/fields_form.tsx +++ b/x-pack/plugins/cases/public/components/connectors/fields_form.tsx @@ -10,7 +10,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import { CaseActionConnector, ConnectorFieldsProps } from './types'; import { getCaseConnectors } from '.'; -import { ConnectorTypeFields } from '../../../common/api/connectors'; +import { ConnectorTypeFields } from '../../../common'; interface Props extends Omit<ConnectorFieldsProps<ConnectorTypeFields['fields']>, 'connector'> { connector: CaseActionConnector | null; diff --git a/x-pack/plugins/cases/public/components/connectors/index.ts b/x-pack/plugins/cases/public/components/connectors/index.ts index cc7a3e5e18117..7444c403a3b60 100644 --- a/x-pack/plugins/cases/public/components/connectors/index.ts +++ b/x-pack/plugins/cases/public/components/connectors/index.ts @@ -15,7 +15,7 @@ import { ServiceNowITSMFieldsType, ServiceNowSIRFieldsType, ResilientFieldsType, -} from '../../../common/api'; +} from '../../../common'; export { getActionType as getCaseConnectorUI } from './case'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx index 7accdfa199bd2..6aff81f380015 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.tsx @@ -10,7 +10,7 @@ import { map } from 'lodash/fp'; import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import * as i18n from './translations'; -import { ConnectorTypes, JiraFieldsType } from '../../../../common/api/connectors'; +import { ConnectorTypes, JiraFieldsType } from '../../../../common'; import { useKibana } from '../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { useGetIssueTypes } from './use_get_issue_types'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/index.ts b/x-pack/plugins/cases/public/components/connectors/jira/index.ts index 899434eccc306..ea408a1bd6664 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/index.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/index.ts @@ -8,7 +8,7 @@ import { lazy } from 'react'; import { CaseConnector } from '../types'; -import { JiraFieldsType } from '../../../../common/api/connectors'; +import { JiraFieldsType } from '../../../../common'; import * as i18n from './translations'; export * from './types'; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx index 9b2f97036516c..e1eeb13bf684c 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx @@ -21,7 +21,7 @@ import { useGetIncidentTypes } from './use_get_incident_types'; import { useGetSeverity } from './use_get_severity'; import * as i18n from './translations'; -import { ConnectorTypes, ResilientFieldsType } from '../../../../common/api/connectors'; +import { ConnectorTypes, ResilientFieldsType } from '../../../../common'; import { ConnectorCard } from '../card'; const ResilientFieldsComponent: React.FunctionComponent< diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/index.ts b/x-pack/plugins/cases/public/components/connectors/resilient/index.ts index 216bdde89ba48..c8e7ad9a063cb 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/index.ts +++ b/x-pack/plugins/cases/public/components/connectors/resilient/index.ts @@ -8,7 +8,7 @@ import { lazy } from 'react'; import { CaseConnector } from '../types'; -import { ResilientFieldsType } from '../../../../common/api/connectors'; +import { ResilientFieldsType } from '../../../../common'; import * as i18n from './translations'; export * from './types'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts index 9ba7603ac64ba..a6f0795fe4d8f 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/index.ts @@ -8,10 +8,7 @@ import { lazy } from 'react'; import { CaseConnector } from '../types'; -import { - ServiceNowITSMFieldsType, - ServiceNowSIRFieldsType, -} from '../../../../common/api/connectors'; +import { ServiceNowITSMFieldsType, ServiceNowSIRFieldsType } from '../../../../common'; import * as i18n from './translations'; export const getServiceNowITSMCaseConnector = (): CaseConnector<ServiceNowITSMFieldsType> => { diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx index 6b211e3fe0bc1..710e230958354 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx @@ -10,7 +10,7 @@ import { EuiFormRow, EuiSelect, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@el import * as i18n from './translations'; import { ConnectorFieldsProps } from '../types'; -import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../common/api/connectors'; +import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../common'; import { useKibana } from '../../../common/lib/kibana'; import { ConnectorCard } from '../card'; import { useGetChoices } from './use_get_choices'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx index 838f824d9332c..1f9a7cf7acd64 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.tsx @@ -8,7 +8,7 @@ import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; -import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../common/api/connectors'; +import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../common'; import { useKibana } from '../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { ConnectorCard } from '../card'; diff --git a/x-pack/plugins/cases/public/components/connectors/types.ts b/x-pack/plugins/cases/public/components/connectors/types.ts index 5bae2beab229e..fc2f66d331700 100644 --- a/x-pack/plugins/cases/public/components/connectors/types.ts +++ b/x-pack/plugins/cases/public/components/connectors/types.ts @@ -12,9 +12,9 @@ import { CaseField, ActionConnector, ConnectorTypeFields, -} from '../../../common/api'; +} from '../../../common'; -export { ThirdPartyField as AllThirdPartyFields } from '../../../common/api'; +export { ThirdPartyField as AllThirdPartyFields } from '../../../common'; export type CaseActionConnector = ActionConnector; export interface ThirdPartyField { diff --git a/x-pack/plugins/cases/public/components/create/connector.tsx b/x-pack/plugins/cases/public/components/create/connector.tsx index 8a5c6cf422d8e..9b6063a7bf9b9 100644 --- a/x-pack/plugins/cases/public/components/create/connector.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.tsx @@ -8,7 +8,7 @@ import React, { memo, useCallback } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { ConnectorTypes } from '../../../common/api'; +import { ConnectorTypes } from '../../../common'; import { UseField, useFormData, FieldHook, useFormContext } from '../../common/shared_imports'; import { useConnectors } from '../../containers/configure/use_connectors'; import { ConnectorSelector } from '../connector_selector/form'; diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 53683467b90b3..207ff6207e09d 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -10,7 +10,7 @@ import { mount, ReactWrapper } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { ConnectorTypes } from '../../../common/api'; +import { ConnectorTypes } from '../../../common'; import { TestProviders } from '../../common/mock'; import { usePostCase } from '../../containers/use_post_case'; import { useGetTags } from '../../containers/use_get_tags'; diff --git a/x-pack/plugins/cases/public/components/create/form_context.tsx b/x-pack/plugins/cases/public/components/create/form_context.tsx index dc3a2d3a8102d..e84f451ab4215 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.tsx @@ -19,7 +19,7 @@ import { usePostPushToService } from '../../containers/use_post_push_to_service' import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; import { Case } from '../../containers/types'; -import { CaseType, ConnectorTypes } from '../../../common/api'; +import { CaseType, ConnectorTypes } from '../../../common'; const initialCaseValue: FormProps = { description: '', diff --git a/x-pack/plugins/cases/public/components/create/mock.ts b/x-pack/plugins/cases/public/components/create/mock.ts index e3f57fe763635..eb40fa097d3cc 100644 --- a/x-pack/plugins/cases/public/components/create/mock.ts +++ b/x-pack/plugins/cases/public/components/create/mock.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { CasePostRequest, CaseType } from '../../../common/api'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { CasePostRequest, CaseType, ConnectorTypes } from '../../../common'; import { choices } from '../connectors/mock'; export const sampleTags = ['coke', 'pepsi']; diff --git a/x-pack/plugins/cases/public/components/create/schema.tsx b/x-pack/plugins/cases/public/components/create/schema.tsx index d9b1df4c7475d..7ca1e2e061545 100644 --- a/x-pack/plugins/cases/public/components/create/schema.tsx +++ b/x-pack/plugins/cases/public/components/create/schema.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { CasePostRequest, ConnectorTypeFields } from '../../../common/api'; +import { CasePostRequest, ConnectorTypeFields } from '../../../common'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../common/shared_imports'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/status/button.test.tsx b/x-pack/plugins/cases/public/components/status/button.test.tsx index 32df83b4b2ddf..a4d4a53ff4a62 100644 --- a/x-pack/plugins/cases/public/components/status/button.test.tsx +++ b/x-pack/plugins/cases/public/components/status/button.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import { StatusActionButton } from './button'; describe('StatusActionButton', () => { diff --git a/x-pack/plugins/cases/public/components/status/button.tsx b/x-pack/plugins/cases/public/components/status/button.tsx index b9d9cdc04743a..623afeb43c596 100644 --- a/x-pack/plugins/cases/public/components/status/button.tsx +++ b/x-pack/plugins/cases/public/components/status/button.tsx @@ -8,7 +8,7 @@ import React, { memo, useCallback, useMemo } from 'react'; import { EuiButton } from '@elastic/eui'; -import { CaseStatuses, caseStatuses } from '../../../common/api'; +import { CaseStatuses, caseStatuses } from '../../../common'; import { statuses } from './config'; interface Props { diff --git a/x-pack/plugins/cases/public/components/status/config.ts b/x-pack/plugins/cases/public/components/status/config.ts index 21decfffbbb45..e85d429067724 100644 --- a/x-pack/plugins/cases/public/components/status/config.ts +++ b/x-pack/plugins/cases/public/components/status/config.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import * as i18n from './translations'; import { AllCaseStatus, Statuses, StatusAll } from './types'; diff --git a/x-pack/plugins/cases/public/components/status/stats.test.tsx b/x-pack/plugins/cases/public/components/status/stats.test.tsx index ea0f54bf8055b..b2da828da77b0 100644 --- a/x-pack/plugins/cases/public/components/status/stats.test.tsx +++ b/x-pack/plugins/cases/public/components/status/stats.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import { Stats } from './stats'; describe('Stats', () => { diff --git a/x-pack/plugins/cases/public/components/status/stats.tsx b/x-pack/plugins/cases/public/components/status/stats.tsx index 98720ad75a656..071ea43746fdc 100644 --- a/x-pack/plugins/cases/public/components/status/stats.tsx +++ b/x-pack/plugins/cases/public/components/status/stats.tsx @@ -7,7 +7,7 @@ import React, { memo, useMemo } from 'react'; import { EuiDescriptionList, EuiLoadingSpinner } from '@elastic/eui'; -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import { statuses } from './config'; export interface Props { diff --git a/x-pack/plugins/cases/public/components/status/status.test.tsx b/x-pack/plugins/cases/public/components/status/status.test.tsx index 3ac2a662059de..7cddbf5ca4a1d 100644 --- a/x-pack/plugins/cases/public/components/status/status.test.tsx +++ b/x-pack/plugins/cases/public/components/status/status.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import { Status } from './status'; describe('Stats', () => { diff --git a/x-pack/plugins/cases/public/components/status/types.ts b/x-pack/plugins/cases/public/components/status/types.ts index d88901fdbf6c9..674838067b0ac 100644 --- a/x-pack/plugins/cases/public/components/status/types.ts +++ b/x-pack/plugins/cases/public/components/status/types.ts @@ -6,7 +6,7 @@ */ import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; export const StatusAll = 'all' as const; type StatusAllType = typeof StatusAll; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx index a54f9a3862b09..fc397b24e7046 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx @@ -14,7 +14,7 @@ import { CreateCaseForm } from '../create/form'; import { SubmitCaseButton } from '../create/submit_button'; import { Case } from '../../containers/types'; import * as i18n from '../../common/translations'; -import { CaseType } from '../../../common/api'; +import { CaseType } from '../../../common'; export interface CreateCaseModalProps { isModalOpen: boolean; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx index 29195e776ceac..7da3f49be721d 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx @@ -6,7 +6,7 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import { CaseType } from '../../../common/api'; +import { CaseType } from '../../../common'; import { Case } from '../../containers/types'; import { CreateCaseModal } from './create_case_modal'; diff --git a/x-pack/plugins/cases/public/containers/__mocks__/api.ts b/x-pack/plugins/cases/public/containers/__mocks__/api.ts index 4c324fe61f4a7..4dbb10da95b2d 100644 --- a/x-pack/plugins/cases/public/containers/__mocks__/api.ts +++ b/x-pack/plugins/cases/public/containers/__mocks__/api.ts @@ -33,7 +33,7 @@ import { CommentRequest, User, CaseStatuses, -} from '../../../common/api'; +} from '../../../common'; export const getCase = async ( caseId: string, diff --git a/x-pack/plugins/cases/public/containers/api.test.tsx b/x-pack/plugins/cases/public/containers/api.test.tsx index 849b85f2157f6..3e71a05df7cc1 100644 --- a/x-pack/plugins/cases/public/containers/api.test.tsx +++ b/x-pack/plugins/cases/public/containers/api.test.tsx @@ -7,8 +7,8 @@ import { KibanaServices } from '../common/lib/kibana'; -import { ConnectorTypes, CommentType, CaseStatuses } from '../../common/api'; -import { CASES_URL } from '../../common/constants'; +import { ConnectorTypes, CommentType, CaseStatuses } from '../../common'; +import { CASES_URL } from '../../common'; import { deleteCases, diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts index 69a7b5fdd3307..5827083bfdbd2 100644 --- a/x-pack/plugins/cases/public/containers/api.ts +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -22,7 +22,7 @@ import { SubCaseResponse, SubCasesResponse, User, -} from '../../common/api'; +} from '../../common'; import { ACTION_TYPES_URL, @@ -32,7 +32,7 @@ import { CASES_URL, SUB_CASE_DETAILS_URL, SUB_CASES_PATCH_DEL_URL, -} from '../../common/constants'; +} from '../../common'; import { getCaseCommentsUrl, @@ -41,7 +41,7 @@ import { getCaseUserActionUrl, getSubCaseDetailsUrl, getSubCaseUserActionUrl, -} from '../../common/api/helpers'; +} from '../../common'; import { KibanaServices } from '../common/lib/kibana'; import { StatusAll } from '../components/status'; diff --git a/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts b/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts index 10cfde0c5ef9c..ea4b92706b4d1 100644 --- a/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts +++ b/x-pack/plugins/cases/public/containers/configure/__mocks__/api.ts @@ -10,7 +10,7 @@ import { CasesConfigureRequest, ActionConnector, ActionTypeConnector, -} from '../../../../common/api'; +} from '../../../../common'; import { ApiProps } from '../../types'; import { CaseConfigure } from '../types'; diff --git a/x-pack/plugins/cases/public/containers/configure/api.test.ts b/x-pack/plugins/cases/public/containers/configure/api.test.ts index 72d315cb6e0d3..ae749b4391776 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.test.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.test.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { KibanaServices } from '../../common/lib/kibana'; import { fetchConnectors, getCaseConfigure, @@ -20,7 +19,8 @@ import { caseConfigurationResposeMock, caseConfigurationCamelCaseResponseMock, } from './mock'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; +import { KibanaServices } from '../../common/lib/kibana'; const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; diff --git a/x-pack/plugins/cases/public/containers/configure/api.ts b/x-pack/plugins/cases/public/containers/configure/api.ts index 14a3b65ea1ab7..006370fcb5533 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.ts @@ -12,14 +12,14 @@ import { CasesConfigurePatch, CasesConfigureResponse, CasesConfigureRequest, -} from '../../../common/api'; +} from '../../../common'; import { KibanaServices } from '../../common/lib/kibana'; import { CASE_CONFIGURE_CONNECTORS_URL, CASE_CONFIGURE_URL, ACTION_TYPES_URL, -} from '../../../common/constants'; +} from '../../../common'; import { ApiProps } from '../types'; import { convertToCamelCase, decodeCaseConfigureResponse } from '../utils'; diff --git a/x-pack/plugins/cases/public/containers/configure/mock.ts b/x-pack/plugins/cases/public/containers/configure/mock.ts index 16f4f5cda5d50..766452e3e58e7 100644 --- a/x-pack/plugins/cases/public/containers/configure/mock.ts +++ b/x-pack/plugins/cases/public/containers/configure/mock.ts @@ -11,7 +11,7 @@ import { CasesConfigureResponse, CasesConfigureRequest, ConnectorTypes, -} from '../../../common/api'; +} from '../../../common'; import { CaseConfigure, CaseConnectorMapping } from './types'; export const mappings: CaseConnectorMapping[] = [ diff --git a/x-pack/plugins/cases/public/containers/configure/types.ts b/x-pack/plugins/cases/public/containers/configure/types.ts index 23d2846f76bcf..b021ae2163fa2 100644 --- a/x-pack/plugins/cases/public/containers/configure/types.ts +++ b/x-pack/plugins/cases/public/containers/configure/types.ts @@ -15,7 +15,7 @@ import { CasesConfigure, ClosureType, ThirdPartyField, -} from '../../../common/api'; +} from '../../../common'; export { ActionConnector, diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx index e050a4be85bb3..4e4db4cb5e82e 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx @@ -14,7 +14,7 @@ import { } from './use_configure'; import { mappings, caseConfigurationCamelCaseResponseMock } from './mock'; import * as api from './api'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; jest.mock('./api'); const mockErrorToToaster = jest.fn(); diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx index 6dd58ee92b741..3d5e43b2772a9 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx @@ -11,7 +11,7 @@ import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; import { useStateToaster, errorToToaster, displaySuccessToast } from '../../components/toasters'; import * as i18n from './translations'; import { ClosureType, CaseConfigure, CaseConnector, CaseConnectorMapping } from './types'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; export type ConnectorConfiguration = { connector: CaseConnector } & { closureType: CaseConfigure['closureType']; diff --git a/x-pack/plugins/cases/public/containers/mock.ts b/x-pack/plugins/cases/public/containers/mock.ts index 8e1bf2d8f4b3c..1e7cec29de56b 100644 --- a/x-pack/plugins/cases/public/containers/mock.ts +++ b/x-pack/plugins/cases/public/containers/mock.ts @@ -8,21 +8,21 @@ import { ActionLicense, AllCases, Case, CasesStatus, CaseUserActions, Comment } from './types'; import { - CommentResponse, - CaseStatuses, - UserAction, - UserActionField, + AssociationType, CaseResponse, + CasesFindResponse, + CasesResponse, CasesStatusResponse, + CaseStatuses, + CaseType, CaseUserActionsResponse, - CasesResponse, - CasesFindResponse, + CommentResponse, CommentType, - AssociationType, - CaseType, -} from '../../common/api'; + ConnectorTypes, + UserAction, + UserActionField, +} from '../../common'; import { UseGetCasesState, DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; -import { ConnectorTypes } from '../../common/api/connectors'; export { connectorsMock } from './configure/mock'; export const basicCaseId = 'basic-case-id'; diff --git a/x-pack/plugins/cases/public/containers/types.ts b/x-pack/plugins/cases/public/containers/types.ts index db1e902fe9150..db6c6e678d188 100644 --- a/x-pack/plugins/cases/public/containers/types.ts +++ b/x-pack/plugins/cases/public/containers/types.ts @@ -16,10 +16,10 @@ import { CasePatchRequest, CaseType, AssociationType, -} from '../../common/api'; +} from '../../common'; import { CaseStatusWithAllStatus } from '../components/status'; -export { CaseConnector, ActionConnector, CaseStatuses } from '../../common/api'; +export { CaseConnector, ActionConnector, CaseStatuses } from '../../common'; export type Comment = CommentRequest & { associationType: AssociationType; diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx index 834b4974a5018..8b5993255552a 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx @@ -6,7 +6,7 @@ */ import { renderHook, act } from '@testing-library/react-hooks'; -import { CaseStatuses } from '../../common/api'; +import { CaseStatuses } from '../../common'; import { DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS, diff --git a/x-pack/plugins/cases/public/containers/use_post_case.test.tsx b/x-pack/plugins/cases/public/containers/use_post_case.test.tsx index 86dad6ef6d78d..72ea368f10317 100644 --- a/x-pack/plugins/cases/public/containers/use_post_case.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_case.test.tsx @@ -8,7 +8,7 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { usePostCase, UsePostCase } from './use_post_case'; import * as api from './api'; -import { ConnectorTypes } from '../../common/api/connectors'; +import { ConnectorTypes } from '../../common'; import { basicCasePost } from './mock'; jest.mock('./api'); diff --git a/x-pack/plugins/cases/public/containers/use_post_case.tsx b/x-pack/plugins/cases/public/containers/use_post_case.tsx index 4733b8927f5bc..503ac8bf0209d 100644 --- a/x-pack/plugins/cases/public/containers/use_post_case.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_case.tsx @@ -6,7 +6,7 @@ */ import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { CasePostRequest } from '../../common/api'; +import { CasePostRequest } from '../../common'; import { errorToToaster, useStateToaster } from '../components/toasters'; import { postCase } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx index 030677e175cb6..3d43180d60aff 100644 --- a/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx @@ -9,7 +9,7 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { usePostPushToService, UsePostPushToService } from './use_post_push_to_service'; import { pushedCase } from './mock'; import * as api from './api'; -import { CaseConnector, ConnectorTypes } from '../../common/api'; +import { CaseConnector, ConnectorTypes } from '../../common'; jest.mock('./api'); diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx index b220c4f871e50..636edd33b5e92 100644 --- a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx @@ -6,7 +6,7 @@ */ import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { CaseConnector } from '../../common/api'; +import { CaseConnector } from '../../common'; import { errorToToaster, useStateToaster, displaySuccessToast } from '../components/toasters'; import { pushCase } from './api'; diff --git a/x-pack/plugins/cases/public/containers/utils.ts b/x-pack/plugins/cases/public/containers/utils.ts index 104a25fa97958..a7eeaff1c2637 100644 --- a/x-pack/plugins/cases/public/containers/utils.ts +++ b/x-pack/plugins/cases/public/containers/utils.ts @@ -28,7 +28,7 @@ import { CaseUserActionsResponseRt, CommentType, CasePatchRequest, -} from '../../common/api'; +} from '../../common'; import { AppToast, ToasterError } from '../components/toasters'; import { AllCases, Case, UpdateByKey } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/server/client/alerts/update_status.test.ts b/x-pack/plugins/cases/server/client/alerts/update_status.test.ts index 5dfe6060da1db..d6456cb3183ef 100644 --- a/x-pack/plugins/cases/server/client/alerts/update_status.test.ts +++ b/x-pack/plugins/cases/server/client/alerts/update_status.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import { createMockSavedObjectsRepository } from '../../routes/api/__fixtures__'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks'; diff --git a/x-pack/plugins/cases/server/client/cases/create.test.ts b/x-pack/plugins/cases/server/client/cases/create.test.ts index fe301dcca37ac..9cbe2a448d3b4 100644 --- a/x-pack/plugins/cases/server/client/cases/create.test.ts +++ b/x-pack/plugins/cases/server/client/cases/create.test.ts @@ -5,12 +5,7 @@ * 2.0. */ -import { - ConnectorTypes, - CaseStatuses, - CaseType, - CasesClientPostRequest, -} from '../../../common/api'; +import { ConnectorTypes, CaseStatuses, CaseType, CasesClientPostRequest } from '../../../common'; import { isCaseError } from '../../common/error'; import { diff --git a/x-pack/plugins/cases/server/client/cases/create.ts b/x-pack/plugins/cases/server/client/cases/create.ts index 59f9688836341..1dbb2dc496a99 100644 --- a/x-pack/plugins/cases/server/client/cases/create.ts +++ b/x-pack/plugins/cases/server/client/cases/create.ts @@ -22,7 +22,7 @@ import { CasePostRequest, CaseType, User, -} from '../../../common/api'; +} from '../../../common'; import { buildCaseUserActionItem } from '../../services/user_actions/helpers'; import { getConnectorFromConfiguration, diff --git a/x-pack/plugins/cases/server/client/cases/get.ts b/x-pack/plugins/cases/server/client/cases/get.ts index fa556986ee8d3..e230e665da865 100644 --- a/x-pack/plugins/cases/server/client/cases/get.ts +++ b/x-pack/plugins/cases/server/client/cases/get.ts @@ -7,7 +7,7 @@ import { SavedObjectsClientContract, Logger } from 'kibana/server'; import { flattenCaseSavedObject } from '../../routes/api/utils'; -import { CaseResponseRt, CaseResponse } from '../../../common/api'; +import { CaseResponseRt, CaseResponse } from '../../../common'; import { CaseServiceSetup } from '../../services'; import { countAlertsForID } from '../../common'; import { createCaseError } from '../../common/error'; diff --git a/x-pack/plugins/cases/server/client/cases/mock.ts b/x-pack/plugins/cases/server/client/cases/mock.ts index 490519187f49e..0e589b901c8d1 100644 --- a/x-pack/plugins/cases/server/client/cases/mock.ts +++ b/x-pack/plugins/cases/server/client/cases/mock.ts @@ -12,7 +12,7 @@ import { CaseUserActionsResponse, AssociationType, CommentResponseAlertsType, -} from '../../../common/api'; +} from '../../../common'; import { BasicParams } from './types'; diff --git a/x-pack/plugins/cases/server/client/cases/push.ts b/x-pack/plugins/cases/server/client/cases/push.ts index 3217178768f89..eeaf91b13fa89 100644 --- a/x-pack/plugins/cases/server/client/cases/push.ts +++ b/x-pack/plugins/cases/server/client/cases/push.ts @@ -29,7 +29,7 @@ import { User, ESCasesConfigureAttributes, CaseType, -} from '../../../common/api'; +} from '../../../common'; import { buildCaseUserActionItem } from '../../services/user_actions/helpers'; import { createIncident, getCommentContextFromAttributes } from './utils'; diff --git a/x-pack/plugins/cases/server/client/cases/types.ts b/x-pack/plugins/cases/server/client/cases/types.ts index f1d56e7132bd1..fb400675136ef 100644 --- a/x-pack/plugins/cases/server/client/cases/types.ts +++ b/x-pack/plugins/cases/server/client/cases/types.ts @@ -19,7 +19,7 @@ import { PushToServiceApiParamsSIR as ServiceNowSIRPushToServiceApiParams, ServiceNowITSMIncident, } from '../../../../actions/server/builtin_action_types/servicenow/types'; -import { CaseResponse, ConnectorMappingsAttributes } from '../../../common/api'; +import { CaseResponse, ConnectorMappingsAttributes } from '../../../common'; export type Incident = JiraIncident | ResilientIncident | ServiceNowITSMIncident; export type PushToServiceApiParams = diff --git a/x-pack/plugins/cases/server/client/cases/update.test.ts b/x-pack/plugins/cases/server/client/cases/update.test.ts index 79c3b2838c3b2..18b4e8d9d7b66 100644 --- a/x-pack/plugins/cases/server/client/cases/update.test.ts +++ b/x-pack/plugins/cases/server/client/cases/update.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypes, CasesPatchRequest, CaseStatuses } from '../../../common/api'; +import { ConnectorTypes, CasesPatchRequest, CaseStatuses } from '../../../common'; import { isCaseError } from '../../common/error'; import { createMockSavedObjectsRepository, diff --git a/x-pack/plugins/cases/server/client/cases/update.ts b/x-pack/plugins/cases/server/client/cases/update.ts index ff3c0a62407a1..6a59bf60a4ece 100644 --- a/x-pack/plugins/cases/server/client/cases/update.ts +++ b/x-pack/plugins/cases/server/client/cases/update.ts @@ -38,7 +38,7 @@ import { AssociationType, CommentAttributes, User, -} from '../../../common/api'; +} from '../../../common'; import { buildCaseUserActions } from '../../services/user_actions/helpers'; import { getCaseToUpdate, diff --git a/x-pack/plugins/cases/server/client/cases/utils.ts b/x-pack/plugins/cases/server/client/cases/utils.ts index 7e77bf4ac84cc..a0a0b8f0eae3c 100644 --- a/x-pack/plugins/cases/server/client/cases/utils.ts +++ b/x-pack/plugins/cases/server/client/cases/utils.ts @@ -20,7 +20,7 @@ import { CommentAttributes, CommentRequestUserType, CommentRequestAlertType, -} from '../../../common/api'; +} from '../../../common'; import { ActionsClient } from '../../../../actions/server'; import { externalServiceFormatters, FormatterConnectorTypes } from '../../connectors'; import { CasesClientGetAlertsResponse } from '../../client/alerts/types'; diff --git a/x-pack/plugins/cases/server/client/client.ts b/x-pack/plugins/cases/server/client/client.ts index 8f9058654d6fd..3bd25b6b61bc5 100644 --- a/x-pack/plugins/cases/server/client/client.ts +++ b/x-pack/plugins/cases/server/client/client.ts @@ -31,7 +31,7 @@ import { CaseUserActionServiceSetup, AlertServiceContract, } from '../services'; -import { CasesPatchRequest, CasePostRequest, User } from '../../common/api'; +import { CasesPatchRequest, CasePostRequest, User } from '../../common'; import { get } from './cases/get'; import { get as getUserActions } from './user_actions/get'; import { get as getAlerts } from './alerts/get'; diff --git a/x-pack/plugins/cases/server/client/comments/add.test.ts b/x-pack/plugins/cases/server/client/comments/add.test.ts index 23b7bc37dc814..bd04e0ea6ef14 100644 --- a/x-pack/plugins/cases/server/client/comments/add.test.ts +++ b/x-pack/plugins/cases/server/client/comments/add.test.ts @@ -6,7 +6,7 @@ */ import { omit } from 'lodash/fp'; -import { CommentType } from '../../../common/api'; +import { CommentType } from '../../../common'; import { isCaseError } from '../../common/error'; import { createMockSavedObjectsRepository, diff --git a/x-pack/plugins/cases/server/client/comments/add.ts b/x-pack/plugins/cases/server/client/comments/add.ts index 45746613dc1d4..98b914fb7486b 100644 --- a/x-pack/plugins/cases/server/client/comments/add.ts +++ b/x-pack/plugins/cases/server/client/comments/add.ts @@ -25,7 +25,7 @@ import { User, CommentRequestAlertType, AlertCommentRequestRt, -} from '../../../common/api'; +} from '../../../common'; import { buildCaseUserActionItem, buildCommentUserActionItem, @@ -36,7 +36,7 @@ import { CommentableCase, createAlertUpdateRequest } from '../../common'; import { CasesClientHandler } from '..'; import { createCaseError } from '../../common/error'; import { CASE_COMMENT_SAVED_OBJECT } from '../../saved_object_types'; -import { MAX_GENERATED_ALERTS_PER_SUB_CASE } from '../../../common/constants'; +import { MAX_GENERATED_ALERTS_PER_SUB_CASE } from '../../../common'; async function getSubCase({ caseService, diff --git a/x-pack/plugins/cases/server/client/configure/get_fields.test.ts b/x-pack/plugins/cases/server/client/configure/get_fields.test.ts index 2e2973516d0fd..c474361293da4 100644 --- a/x-pack/plugins/cases/server/client/configure/get_fields.test.ts +++ b/x-pack/plugins/cases/server/client/configure/get_fields.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypes } from '../../../common/api'; +import { ConnectorTypes } from '../../../common'; import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks'; diff --git a/x-pack/plugins/cases/server/client/configure/get_fields.ts b/x-pack/plugins/cases/server/client/configure/get_fields.ts index deabae33810b2..8d899f0df1a76 100644 --- a/x-pack/plugins/cases/server/client/configure/get_fields.ts +++ b/x-pack/plugins/cases/server/client/configure/get_fields.ts @@ -7,7 +7,7 @@ import Boom from '@hapi/boom'; -import { GetFieldsResponse } from '../../../common/api'; +import { GetFieldsResponse } from '../../../common'; import { ConfigureFields } from '../types'; import { createDefaultMapping, formatFields } from './utils'; diff --git a/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts b/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts index 0ec2fc8b4621d..7d9593899bb2e 100644 --- a/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts +++ b/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypes } from '../../../common/api'; +import { ConnectorTypes } from '../../../common'; import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks'; diff --git a/x-pack/plugins/cases/server/client/configure/get_mappings.ts b/x-pack/plugins/cases/server/client/configure/get_mappings.ts index 558c961f89e5b..1f767ea682843 100644 --- a/x-pack/plugins/cases/server/client/configure/get_mappings.ts +++ b/x-pack/plugins/cases/server/client/configure/get_mappings.ts @@ -7,7 +7,7 @@ import { SavedObjectsClientContract, Logger } from 'src/core/server'; import { ActionsClient } from '../../../../actions/server'; -import { ConnectorMappingsAttributes, ConnectorTypes } from '../../../common/api'; +import { ConnectorMappingsAttributes, ConnectorTypes } from '../../../common'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ACTION_SAVED_OBJECT_TYPE } from '../../../../actions/server/saved_objects'; import { ConnectorMappingsServiceSetup } from '../../services'; diff --git a/x-pack/plugins/cases/server/client/configure/mock.ts b/x-pack/plugins/cases/server/client/configure/mock.ts index ee214de9b51d4..ad982a5cc1243 100644 --- a/x-pack/plugins/cases/server/client/configure/mock.ts +++ b/x-pack/plugins/cases/server/client/configure/mock.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { - ConnectorField, - ConnectorMappingsAttributes, - ConnectorTypes, -} from '../../../common/api/connectors'; +import { ConnectorField, ConnectorMappingsAttributes, ConnectorTypes } from '../../../common'; import { JiraGetFieldsResponse, ResilientGetFieldsResponse, diff --git a/x-pack/plugins/cases/server/client/configure/utils.test.ts b/x-pack/plugins/cases/server/client/configure/utils.test.ts index 403854693e36c..bf571388994c0 100644 --- a/x-pack/plugins/cases/server/client/configure/utils.test.ts +++ b/x-pack/plugins/cases/server/client/configure/utils.test.ts @@ -11,7 +11,7 @@ export { ServiceNowGetFieldsResponse, } from '../../../../actions/server/types'; import { createDefaultMapping, formatFields } from './utils'; -import { ConnectorTypes } from '../../../common/api/connectors'; +import { ConnectorTypes } from '../../../common'; import { mappings, formatFieldsTestData } from './mock'; describe('client/configure/utils', () => { diff --git a/x-pack/plugins/cases/server/client/configure/utils.ts b/x-pack/plugins/cases/server/client/configure/utils.ts index 80e6c7a3b886c..b9ef813735e25 100644 --- a/x-pack/plugins/cases/server/client/configure/utils.ts +++ b/x-pack/plugins/cases/server/client/configure/utils.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { - ConnectorField, - ConnectorMappingsAttributes, - ConnectorTypes, -} from '../../../common/api/connectors'; +import { ConnectorField, ConnectorMappingsAttributes, ConnectorTypes } from '../../../common'; import { JiraGetFieldsResponse, ResilientGetFieldsResponse, diff --git a/x-pack/plugins/cases/server/client/types.ts b/x-pack/plugins/cases/server/client/types.ts index c62b3913da763..3311b7ac6f921 100644 --- a/x-pack/plugins/cases/server/client/types.ts +++ b/x-pack/plugins/cases/server/client/types.ts @@ -18,7 +18,7 @@ import { GetFieldsResponse, CaseUserActionsResponse, User, -} from '../../common/api'; +} from '../../common'; import { AlertInfo } from '../common'; import { CaseConfigureServiceSetup, diff --git a/x-pack/plugins/cases/server/client/user_actions/get.ts b/x-pack/plugins/cases/server/client/user_actions/get.ts index f6371b8e8b1e7..79b8ef25ab0f6 100644 --- a/x-pack/plugins/cases/server/client/user_actions/get.ts +++ b/x-pack/plugins/cases/server/client/user_actions/get.ts @@ -11,7 +11,7 @@ import { CASE_COMMENT_SAVED_OBJECT, SUB_CASE_SAVED_OBJECT, } from '../../saved_object_types'; -import { CaseUserActionsResponseRt, CaseUserActionsResponse } from '../../../common/api'; +import { CaseUserActionsResponseRt, CaseUserActionsResponse } from '../../../common'; import { CaseUserActionServiceSetup } from '../../services'; interface GetParams { diff --git a/x-pack/plugins/cases/server/common/models/commentable_case.ts b/x-pack/plugins/cases/server/common/models/commentable_case.ts index 1ff5b7beadcaf..3daccf87bdc19 100644 --- a/x-pack/plugins/cases/server/common/models/commentable_case.ts +++ b/x-pack/plugins/cases/server/common/models/commentable_case.ts @@ -27,7 +27,7 @@ import { ESCaseAttributes, SubCaseAttributes, User, -} from '../../../common/api'; +} from '../../../common'; import { transformESConnectorToCaseConnector } from '../../routes/api/cases/helpers'; import { flattenCommentSavedObjects, diff --git a/x-pack/plugins/cases/server/common/utils.test.ts b/x-pack/plugins/cases/server/common/utils.test.ts index 5e6a86358de25..df16fe4f0a67d 100644 --- a/x-pack/plugins/cases/server/common/utils.test.ts +++ b/x-pack/plugins/cases/server/common/utils.test.ts @@ -6,7 +6,7 @@ */ import { SavedObjectsFindResponse } from 'kibana/server'; -import { AssociationType, CommentAttributes, CommentRequest, CommentType } from '../../common/api'; +import { AssociationType, CommentAttributes, CommentRequest, CommentType } from '../../common'; import { transformNewComment } from '../routes/api/utils'; import { combineFilters, countAlerts, countAlertsForID, groupTotalAlertsByID } from './utils'; diff --git a/x-pack/plugins/cases/server/common/utils.ts b/x-pack/plugins/cases/server/common/utils.ts index dce26f3d5998a..d3bc3850e4210 100644 --- a/x-pack/plugins/cases/server/common/utils.ts +++ b/x-pack/plugins/cases/server/common/utils.ts @@ -6,13 +6,7 @@ */ import { SavedObjectsFindResult, SavedObjectsFindResponse } from 'kibana/server'; -import { - CaseStatuses, - CommentAttributes, - CommentRequest, - CommentType, - User, -} from '../../common/api'; +import { CaseStatuses, CommentAttributes, CommentRequest, CommentType, User } from '../../common'; import { UpdateAlertRequest } from '../client/types'; import { getAlertInfoFromComments } from '../routes/api/utils'; diff --git a/x-pack/plugins/cases/server/connectors/case/index.test.ts b/x-pack/plugins/cases/server/connectors/case/index.test.ts index 122f6bd77c693..e1a322c4b1c94 100644 --- a/x-pack/plugins/cases/server/connectors/case/index.test.ts +++ b/x-pack/plugins/cases/server/connectors/case/index.test.ts @@ -18,7 +18,7 @@ import { AssociationType, CaseResponse, CasesResponse, -} from '../../../common/api'; +} from '../../../common'; import { connectorMappingsServiceMock, createCaseServiceMock, diff --git a/x-pack/plugins/cases/server/connectors/case/index.ts b/x-pack/plugins/cases/server/connectors/case/index.ts index da993faf0ef5c..d223c70221e37 100644 --- a/x-pack/plugins/cases/server/connectors/case/index.ts +++ b/x-pack/plugins/cases/server/connectors/case/index.ts @@ -8,12 +8,7 @@ import { curry } from 'lodash'; import { Logger } from 'src/core/server'; import { ActionTypeExecutorResult } from '../../../../actions/common'; -import { - CasePatchRequest, - CasePostRequest, - CommentRequest, - CommentType, -} from '../../../common/api'; +import { CasePatchRequest, CasePostRequest, CommentRequest, CommentType } from '../../../common'; import { createExternalCasesClient } from '../../client'; import { CaseExecutorParamsSchema, CaseConfigurationSchema, CommentSchemaType } from './schema'; import { diff --git a/x-pack/plugins/cases/server/connectors/case/schema.ts b/x-pack/plugins/cases/server/connectors/case/schema.ts index ac34ad40cfa13..dce18119d1704 100644 --- a/x-pack/plugins/cases/server/connectors/case/schema.ts +++ b/x-pack/plugins/cases/server/connectors/case/schema.ts @@ -6,7 +6,7 @@ */ import { schema } from '@kbn/config-schema'; -import { CommentType } from '../../../common/api'; +import { CommentType } from '../../../common'; import { validateConnector } from './validators'; // Reserved for future implementation diff --git a/x-pack/plugins/cases/server/connectors/case/types.ts b/x-pack/plugins/cases/server/connectors/case/types.ts index 6a7dfd9c2e687..a71007f0b4946 100644 --- a/x-pack/plugins/cases/server/connectors/case/types.ts +++ b/x-pack/plugins/cases/server/connectors/case/types.ts @@ -16,7 +16,7 @@ import { ConnectorSchema, CommentSchema, } from './schema'; -import { CaseResponse, CasesResponse } from '../../../common/api'; +import { CaseResponse, CasesResponse } from '../../../common'; export type CaseConfiguration = TypeOf<typeof CaseConfigurationSchema>; export type Connector = TypeOf<typeof ConnectorSchema>; diff --git a/x-pack/plugins/cases/server/connectors/index.ts b/x-pack/plugins/cases/server/connectors/index.ts index a6b6e193361be..ecf04e4f7b0f1 100644 --- a/x-pack/plugins/cases/server/connectors/index.ts +++ b/x-pack/plugins/cases/server/connectors/index.ts @@ -17,7 +17,7 @@ import { serviceNowITSMExternalServiceFormatter } from './servicenow/itsm_format import { serviceNowSIRExternalServiceFormatter } from './servicenow/sir_formatter'; import { jiraExternalServiceFormatter } from './jira/external_service_formatter'; import { resilientExternalServiceFormatter } from './resilient/external_service_formatter'; -import { CommentRequest, CommentType } from '../../common/api'; +import { CommentRequest, CommentType } from '../../common'; export * from './types'; export { transformConnectorComment } from './case'; diff --git a/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.test.ts b/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.test.ts index 0bfaf7cdbd9e3..f5d76aeddf313 100644 --- a/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.test.ts +++ b/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseResponse } from '../../../common/api'; +import { CaseResponse } from '../../../common'; import { jiraExternalServiceFormatter } from './external_service_formatter'; describe('Jira formatter', () => { diff --git a/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.ts b/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.ts index 74376d295fea5..15ee2fd468dda 100644 --- a/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.ts +++ b/x-pack/plugins/cases/server/connectors/jira/external_service_formatter.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { JiraFieldsType, ConnectorJiraTypeFields } from '../../../common/api'; +import { JiraFieldsType, ConnectorJiraTypeFields } from '../../../common'; import { ExternalServiceFormatter } from '../types'; interface ExternalServiceParams extends JiraFieldsType { diff --git a/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.test.ts b/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.test.ts index 01280e9692b5e..b7096179b0fab 100644 --- a/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.test.ts +++ b/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseResponse } from '../../../common/api'; +import { CaseResponse } from '../../../common'; import { resilientExternalServiceFormatter } from './external_service_formatter'; describe('IBM Resilient formatter', () => { diff --git a/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.ts b/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.ts index 76554dce32797..6dea452565d7c 100644 --- a/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.ts +++ b/x-pack/plugins/cases/server/connectors/resilient/external_service_formatter.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ResilientFieldsType, ConnectorResillientTypeFields } from '../../../common/api'; +import { ResilientFieldsType, ConnectorResillientTypeFields } from '../../../common'; import { ExternalServiceFormatter } from '../types'; const format: ExternalServiceFormatter<ResilientFieldsType>['format'] = (theCase) => { diff --git a/x-pack/plugins/cases/server/connectors/servicenow/itsm_formatter.ts b/x-pack/plugins/cases/server/connectors/servicenow/itsm_formatter.ts index b49eed6a4ad26..a4fa8a198fea7 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/itsm_formatter.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/itsm_formatter.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ServiceNowITSMFieldsType, ConnectorServiceNowITSMTypeFields } from '../../../common/api'; +import { ServiceNowITSMFieldsType, ConnectorServiceNowITSMTypeFields } from '../../../common'; import { ExternalServiceFormatter } from '../types'; const format: ExternalServiceFormatter<ServiceNowITSMFieldsType>['format'] = (theCase) => { diff --git a/x-pack/plugins/cases/server/connectors/servicenow/itsm_formmater.test.ts b/x-pack/plugins/cases/server/connectors/servicenow/itsm_formmater.test.ts index ea3a4e41e17b8..78242e4c3848a 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/itsm_formmater.test.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/itsm_formmater.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseResponse } from '../../../common/api'; +import { CaseResponse } from '../../../common'; import { serviceNowITSMExternalServiceFormatter } from './itsm_formatter'; describe('ITSM formatter', () => { diff --git a/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.test.ts b/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.test.ts index 4faca62c6e706..1f7716424cfa9 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.test.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseResponse } from '../../../common/api'; +import { CaseResponse } from '../../../common'; import { serviceNowSIRExternalServiceFormatter } from './sir_formatter'; describe('ITSM formatter', () => { diff --git a/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.ts b/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.ts index d2458e6c7ae53..1c528cd2b47bf 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/sir_formatter.ts @@ -5,7 +5,7 @@ * 2.0. */ import { get } from 'lodash/fp'; -import { ConnectorServiceNowSIRTypeFields } from '../../../common/api'; +import { ConnectorServiceNowSIRTypeFields } from '../../../common'; import { ExternalServiceFormatter } from '../types'; interface ExternalServiceParams { dest_ip: string | null; diff --git a/x-pack/plugins/cases/server/connectors/types.ts b/x-pack/plugins/cases/server/connectors/types.ts index f6c284b74667b..fae1ec2976bc0 100644 --- a/x-pack/plugins/cases/server/connectors/types.ts +++ b/x-pack/plugins/cases/server/connectors/types.ts @@ -13,7 +13,7 @@ import { ActionType, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../actions/server/types'; -import { CaseResponse, ConnectorTypes } from '../../common/api'; +import { CaseResponse, ConnectorTypes } from '../../common'; import { CasesClientGetAlertsResponse } from '../client/alerts/types'; import { CaseServiceSetup, diff --git a/x-pack/plugins/cases/server/plugin.ts b/x-pack/plugins/cases/server/plugin.ts index 0c661cc18c21b..82e2e0b10e771 100644 --- a/x-pack/plugins/cases/server/plugin.ts +++ b/x-pack/plugins/cases/server/plugin.ts @@ -10,7 +10,7 @@ import { CoreSetup, CoreStart } from 'src/core/server'; import { SecurityPluginSetup } from '../../security/server'; import { PluginSetupContract as ActionsPluginSetup } from '../../actions/server'; -import { APP_ID } from '../common/constants'; +import { APP_ID } from '../common'; import { ConfigType } from './config'; import { initCaseApi } from './routes/api'; diff --git a/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts b/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts index f2318c45e6ed3..c9d7ac4125141 100644 --- a/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts +++ b/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts @@ -17,7 +17,7 @@ import { ConnectorTypes, ESCaseAttributes, ESCasesConfigureAttributes, -} from '../../../../common/api'; +} from '../../../../common'; import { CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, CASE_USER_ACTION_SAVED_OBJECT, diff --git a/x-pack/plugins/cases/server/routes/api/__mocks__/request_responses.ts b/x-pack/plugins/cases/server/routes/api/__mocks__/request_responses.ts index ae14b44e7dffe..9df94cd0923c9 100644 --- a/x-pack/plugins/cases/server/routes/api/__mocks__/request_responses.ts +++ b/x-pack/plugins/cases/server/routes/api/__mocks__/request_responses.ts @@ -10,7 +10,7 @@ import { CasePostRequest, CasesConfigureRequest, ConnectorTypes, -} from '../../../../common/api'; +} from '../../../../common'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { FindActionResult } from '../../../../../actions/server/types'; diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/delete_all_comments.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/delete_all_comments.ts index fd250b74fff1e..77db06680fd59 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/delete_all_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/delete_all_comments.ts @@ -10,8 +10,7 @@ import { schema } from '@kbn/config-schema'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; -import { AssociationType } from '../../../../../common/api'; +import { AssociationType, CASE_COMMENTS_URL } from '../../../../../common'; export function initDeleteAllCommentsApi({ caseService, diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.test.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.test.ts index dcbcd7b9e246d..d0968c3232459 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.test.ts @@ -16,7 +16,7 @@ import { mockCaseComments, } from '../../__fixtures__'; import { initDeleteCommentApi } from './delete_comment'; -import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common'; describe('DELETE comment', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.ts index f1c5fdc2b7cc8..3ba93142bdcce 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/delete_comment.ts @@ -12,7 +12,7 @@ import { CASE_SAVED_OBJECT, SUB_CASE_SAVED_OBJECT } from '../../../../saved_obje import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common'; export function initDeleteCommentApi({ caseService, diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/find_comments.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/find_comments.ts index 57ddd84e8742c..75d0f9f59657a 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/find_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/find_comments.ts @@ -19,10 +19,10 @@ import { CommentsResponseRt, SavedObjectFindOptionsRt, throwErrors, -} from '../../../../../common/api'; +} from '../../../../../common'; import { RouteDeps } from '../../types'; import { escapeHatch, transformComments, wrapError } from '../../utils'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; +import { CASE_COMMENTS_URL } from '../../../../../common'; import { defaultPage, defaultPerPage } from '../..'; const FindQueryParamsRt = rt.partial({ diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/get_all_comment.ts index 770efe0109744..a400f944dddfa 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/get_all_comment.ts @@ -8,10 +8,10 @@ import { schema } from '@kbn/config-schema'; import { SavedObjectsFindResponse } from 'kibana/server'; -import { AllCommentsResponseRt, CommentAttributes } from '../../../../../common/api'; +import { AllCommentsResponseRt, CommentAttributes } from '../../../../../common'; import { RouteDeps } from '../../types'; import { flattenCommentSavedObjects, wrapError } from '../../utils'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; +import { CASE_COMMENTS_URL } from '../../../../../common'; import { defaultSortField } from '../../../../common'; export function initGetAllCommentsApi({ caseService, router, logger }: RouteDeps) { diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.test.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.test.ts index 8ee43eaba8a82..46accdc58d460 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.test.ts @@ -17,7 +17,7 @@ import { } from '../../__fixtures__'; import { flattenCommentSavedObject } from '../../utils'; import { initGetCommentApi } from './get_comment'; -import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common'; describe('GET comment', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.ts index 9dedfccd3a250..f86f733306043 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/get_comment.ts @@ -7,10 +7,10 @@ import { schema } from '@kbn/config-schema'; -import { CommentResponseRt } from '../../../../../common/api'; +import { CommentResponseRt } from '../../../../../common'; import { RouteDeps } from '../../types'; import { flattenCommentSavedObject, wrapError } from '../../utils'; -import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common'; export function initGetCommentApi({ caseService, router, logger }: RouteDeps) { router.get( diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.test.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.test.ts index 9cc0575f9bb94..32a0133d455c2 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.test.ts @@ -17,8 +17,8 @@ import { mockCases, } from '../../__fixtures__'; import { initPatchCommentApi } from './patch_comment'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; -import { CommentType } from '../../../../../common/api'; +import { CASE_COMMENTS_URL } from '../../../../../common'; +import { CommentType } from '../../../../../common'; describe('PATCH comment', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.ts index f5db2dc004a1d..b47236f4693cf 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/patch_comment.ts @@ -14,12 +14,12 @@ import Boom from '@hapi/boom'; import { SavedObjectsClientContract, Logger } from 'kibana/server'; import { CommentableCase } from '../../../../common'; -import { CommentPatchRequestRt, throwErrors, User } from '../../../../../common/api'; +import { CommentPatchRequestRt, throwErrors, User } from '../../../../../common'; import { CASE_SAVED_OBJECT, SUB_CASE_SAVED_OBJECT } from '../../../../saved_object_types'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { escapeHatch, wrapError, decodeCommentRequest } from '../../utils'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; +import { CASE_COMMENTS_URL } from '../../../../../common'; import { CaseServiceSetup } from '../../../../services'; interface CombinedCaseParams { diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.test.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.test.ts index 807ec0d089a52..27d5c47d47399 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.test.ts @@ -17,8 +17,8 @@ import { mockCaseComments, } from '../../__fixtures__'; import { initPostCommentApi } from './post_comment'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; -import { CommentType } from '../../../../../common/api'; +import { CASE_COMMENTS_URL } from '../../../../../common'; +import { CommentType } from '../../../../../common'; describe('POST comment', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.ts b/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.ts index 110a16a610014..47d41b60165d7 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/comments/post_comment.ts @@ -8,8 +8,8 @@ import { schema } from '@kbn/config-schema'; import { escapeHatch, wrapError } from '../../utils'; import { RouteDeps } from '../../types'; -import { CASE_COMMENTS_URL } from '../../../../../common/constants'; -import { CommentRequest } from '../../../../../common/api'; +import { CASE_COMMENTS_URL } from '../../../../../common'; +import { CommentRequest } from '../../../../../common'; export function initPostCommentApi({ router, logger }: RouteDeps) { router.post( diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.test.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.test.ts index f328844acfd00..626f53cdf4263 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.test.ts @@ -17,9 +17,8 @@ import { } from '../../__fixtures__'; import { initGetCaseConfigure } from './get_configure'; -import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; +import { CASE_CONFIGURE_URL, ConnectorTypes } from '../../../../../common'; import { mappings } from '../../../../client/configure/mock'; -import { ConnectorTypes } from '../../../../../common/api/connectors'; import { CasesClient } from '../../../../client'; describe('GET configuration', () => { diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.ts index c916bd8f4140b..03ac3dd8b13b3 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/get_configure.ts @@ -6,10 +6,10 @@ */ import Boom from '@hapi/boom'; -import { CaseConfigureResponseRt, ConnectorMappingsAttributes } from '../../../../../common/api'; +import { CaseConfigureResponseRt, ConnectorMappingsAttributes } from '../../../../../common'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; +import { CASE_CONFIGURE_URL } from '../../../../../common'; import { transformESConnectorToCaseConnector } from '../helpers'; export function initGetCaseConfigure({ caseConfigureService, router, logger }: RouteDeps) { diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.test.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.test.ts index 3fa0fe2f83f79..082adf7b4803f 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.test.ts @@ -17,7 +17,7 @@ import { } from '../../__fixtures__'; import { initCaseConfigureGetActionConnector } from './get_connectors'; -import { CASE_CONFIGURE_CONNECTORS_URL } from '../../../../../common/constants'; +import { CASE_CONFIGURE_CONNECTORS_URL } from '../../../../../common'; import { getActions } from '../../__mocks__/request_responses'; describe('GET connectors', () => { diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.ts index 81ffc06355ff5..7aec7e4f086b4 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/get_connectors.ts @@ -12,10 +12,7 @@ import { ActionType } from '../../../../../../actions/common'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { FindActionResult } from '../../../../../../actions/server/types'; -import { - CASE_CONFIGURE_CONNECTORS_URL, - SUPPORTED_CONNECTORS, -} from '../../../../../common/constants'; +import { CASE_CONFIGURE_CONNECTORS_URL, SUPPORTED_CONNECTORS } from '../../../../../common'; const isConnectorSupported = ( action: FindActionResult, diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.test.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.test.ts index 48d88e0f622f5..c4e2b6af1cd6b 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.test.ts @@ -17,8 +17,7 @@ import { import { mockCaseConfigure } from '../../__fixtures__/mock_saved_objects'; import { initPatchCaseConfigure } from './patch_configure'; -import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; -import { ConnectorTypes } from '../../../../../common/api/connectors'; +import { CASE_CONFIGURE_URL, ConnectorTypes } from '../../../../../common'; import { CasesClient } from '../../../../client'; describe('PATCH configuration', () => { diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.ts index ba0ea6eb17936..5fe38cf0efe48 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/patch_configure.ts @@ -15,10 +15,10 @@ import { CaseConfigureResponseRt, throwErrors, ConnectorMappingsAttributes, -} from '../../../../../common/api'; +} from '../../../../../common'; import { RouteDeps } from '../../types'; import { wrapError, escapeHatch } from '../../utils'; -import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; +import { CASE_CONFIGURE_URL } from '../../../../../common'; import { transformCaseConnectorToEsConnector, transformESConnectorToCaseConnector, diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.test.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.test.ts index 882a10742d733..35b662078fe9c 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.test.ts @@ -18,8 +18,7 @@ import { import { initPostCaseConfigure } from './post_configure'; import { newConfiguration } from '../../__mocks__/request_responses'; -import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; -import { ConnectorTypes } from '../../../../../common/api/connectors'; +import { CASE_CONFIGURE_URL, ConnectorTypes } from '../../../../../common'; import { CasesClient } from '../../../../client'; describe('POST configuration', () => { diff --git a/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.ts b/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.ts index 469151a126898..74ad02f47e178 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/configure/post_configure.ts @@ -15,10 +15,10 @@ import { CaseConfigureResponseRt, throwErrors, ConnectorMappingsAttributes, -} from '../../../../../common/api'; +} from '../../../../../common'; import { RouteDeps } from '../../types'; import { wrapError, escapeHatch } from '../../utils'; -import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; +import { CASE_CONFIGURE_URL } from '../../../../../common'; import { transformCaseConnectorToEsConnector, transformESConnectorToCaseConnector, diff --git a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.test.ts b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.test.ts index a441a027769bf..7748a079ceb4d 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.test.ts @@ -17,7 +17,7 @@ import { mockCaseComments, } from '../__fixtures__'; import { initDeleteCasesApi } from './delete_cases'; -import { CASES_URL } from '../../../../common/constants'; +import { CASES_URL } from '../../../../common'; describe('DELETE case', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts index 5f2a6c67220c3..43710dfab93eb 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts @@ -11,7 +11,7 @@ import { SavedObjectsClientContract } from 'src/core/server'; import { buildCaseUserActionItem } from '../../../services/user_actions/helpers'; import { RouteDeps } from '../types'; import { wrapError } from '../utils'; -import { CASES_URL } from '../../../../common/constants'; +import { CASES_URL } from '../../../../common'; import { CaseServiceSetup } from '../../../services'; async function deleteSubCases({ diff --git a/x-pack/plugins/cases/server/routes/api/cases/find_cases.test.ts b/x-pack/plugins/cases/server/routes/api/cases/find_cases.test.ts index ca9f731ca5010..75586896390fc 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/find_cases.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/find_cases.test.ts @@ -15,7 +15,7 @@ import { mockCases, } from '../__fixtures__'; import { initFindCasesApi } from './find_cases'; -import { CASES_URL } from '../../../../common/constants'; +import { CASES_URL } from '../../../../common'; import { mockCaseConfigure, mockCaseNoConnectorId } from '../__fixtures__/mock_saved_objects'; describe('FIND all cases', () => { diff --git a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts index bc6907f52b9eb..97455e9e08f7b 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts @@ -16,10 +16,10 @@ import { CasesFindRequestRt, throwErrors, caseStatuses, -} from '../../../../common/api'; +} from '../../../../common'; import { transformCases, wrapError, escapeHatch } from '../utils'; import { RouteDeps } from '../types'; -import { CASES_URL } from '../../../../common/constants'; +import { CASES_URL } from '../../../../common'; import { constructQueryOptions } from './helpers'; export function initFindCasesApi({ caseService, router, logger }: RouteDeps) { diff --git a/x-pack/plugins/cases/server/routes/api/cases/get_case.test.ts b/x-pack/plugins/cases/server/routes/api/cases/get_case.test.ts index b9312331b4df2..768bbca62f3fe 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/get_case.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/get_case.test.ts @@ -8,7 +8,7 @@ import { kibanaResponseFactory, RequestHandler, SavedObject } from 'src/core/server'; import { httpServerMock } from 'src/core/server/mocks'; -import { ConnectorTypes, ESCaseAttributes } from '../../../../common/api'; +import { ConnectorTypes, ESCaseAttributes } from '../../../../common'; import { createMockSavedObjectsRepository, createRoute, @@ -21,7 +21,7 @@ import { } from '../__fixtures__'; import { flattenCaseSavedObject } from '../utils'; import { initGetCaseApi } from './get_case'; -import { CASE_DETAILS_URL } from '../../../../common/constants'; +import { CASE_DETAILS_URL } from '../../../../common'; describe('GET case', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts index f464f7e47fe7a..e2d08dcd23f2e 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts @@ -9,7 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDeps } from '../types'; import { wrapError } from '../utils'; -import { CASE_DETAILS_URL } from '../../../../common/constants'; +import { CASE_DETAILS_URL } from '../../../../common'; export function initGetCaseApi({ router, logger }: RouteDeps) { router.get( diff --git a/x-pack/plugins/cases/server/routes/api/cases/helpers.test.ts b/x-pack/plugins/cases/server/routes/api/cases/helpers.test.ts index f7cfebeaea749..a1d25aa295799 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/helpers.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/helpers.test.ts @@ -11,7 +11,7 @@ import { ConnectorTypes, ESCaseConnector, ESCasesConfigureAttributes, -} from '../../../../common/api'; +} from '../../../../common'; import { mockCaseConfigure } from '../__fixtures__'; import { transformCaseConnectorToEsConnector, diff --git a/x-pack/plugins/cases/server/routes/api/cases/helpers.ts b/x-pack/plugins/cases/server/routes/api/cases/helpers.ts index 8659ab02d6d53..5f51c9b1f8d8c 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/helpers.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/helpers.ts @@ -11,14 +11,15 @@ import deepEqual from 'fast-deep-equal'; import { SavedObjectsFindResponse } from 'kibana/server'; import { CaseConnector, - ESCaseConnector, - ESCasesConfigureAttributes, - ConnectorTypes, CaseStatuses, CaseType, + ConnectorTypeFields, + ConnectorTypes, + ESCaseConnector, + ESCasesConfigureAttributes, + ESConnectorFields, SavedObjectFindOptions, -} from '../../../../common/api'; -import { ESConnectorFields, ConnectorTypeFields } from '../../../../common/api/connectors'; +} from '../../../../common'; import { CASE_SAVED_OBJECT, SUB_CASE_SAVED_OBJECT } from '../../../saved_object_types'; import { sortToSnake } from '../utils'; import { combineFilters } from '../../../common'; diff --git a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.test.ts b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.test.ts index b3f87211c9547..96a891441ea5f 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.test.ts @@ -17,7 +17,7 @@ import { } from '../__fixtures__'; import { initPatchCasesApi } from './patch_cases'; import { mockCaseConfigure, mockCaseNoConnectorId } from '../__fixtures__/mock_saved_objects'; -import { CaseStatuses } from '../../../../common/api'; +import { CaseStatuses } from '../../../../common'; describe('PATCH cases', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts index 8e779087bcafe..092f88c1a8a20 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts @@ -7,8 +7,8 @@ import { escapeHatch, wrapError } from '../utils'; import { RouteDeps } from '../types'; -import { CASES_URL } from '../../../../common/constants'; -import { CasesPatchRequest } from '../../../../common/api'; +import { CASES_URL } from '../../../../common'; +import { CasesPatchRequest } from '../../../../common'; export function initPatchCasesApi({ router, logger }: RouteDeps) { router.patch( diff --git a/x-pack/plugins/cases/server/routes/api/cases/post_case.test.ts b/x-pack/plugins/cases/server/routes/api/cases/post_case.test.ts index e1669203d3ded..669d3a5e58874 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/post_case.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/post_case.test.ts @@ -15,9 +15,9 @@ import { mockCases, } from '../__fixtures__'; import { initPostCaseApi } from './post_case'; -import { CASES_URL } from '../../../../common/constants'; +import { CASES_URL } from '../../../../common'; import { mockCaseConfigure } from '../__fixtures__/mock_saved_objects'; -import { ConnectorTypes, CaseStatuses } from '../../../../common/api'; +import { ConnectorTypes, CaseStatuses } from '../../../../common'; describe('POST cases', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts index e2d71c5837353..a7951a1a71344 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts @@ -8,8 +8,8 @@ import { wrapError, escapeHatch } from '../utils'; import { RouteDeps } from '../types'; -import { CASES_URL } from '../../../../common/constants'; -import { CasePostRequest } from '../../../../common/api'; +import { CASES_URL } from '../../../../common'; +import { CasePostRequest } from '../../../../common'; export function initPostCaseApi({ router, logger }: RouteDeps) { router.post( diff --git a/x-pack/plugins/cases/server/routes/api/cases/push_case.test.ts b/x-pack/plugins/cases/server/routes/api/cases/push_case.test.ts index fb0ba5e3b5d9a..378d092c8be0b 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/push_case.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/push_case.test.ts @@ -20,7 +20,7 @@ import { } from '../__fixtures__'; import { initPushCaseApi } from './push_case'; import { CasesRequestHandlerContext } from '../../../types'; -import { getCasePushUrl } from '../../../../common/api/helpers'; +import { getCasePushUrl } from '../../../../common'; describe('Push case', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts index 7395758210cf4..9bfb30e0d63ad 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts @@ -12,9 +12,9 @@ import { identity } from 'fp-ts/lib/function'; import { wrapError, escapeHatch } from '../utils'; -import { throwErrors, CasePushRequestParamsRt } from '../../../../common/api'; +import { throwErrors, CasePushRequestParamsRt } from '../../../../common'; import { RouteDeps } from '../types'; -import { CASE_PUSH_URL } from '../../../../common/constants'; +import { CASE_PUSH_URL } from '../../../../common'; export function initPushCaseApi({ router, logger }: RouteDeps) { router.post( diff --git a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts index e5433f4972239..53fdc298ef267 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { UsersRt } from '../../../../../common/api'; +import { UsersRt } from '../../../../../common'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CASE_REPORTERS_URL } from '../../../../../common/constants'; +import { CASE_REPORTERS_URL } from '../../../../../common'; export function initGetReportersApi({ caseService, router, logger }: RouteDeps) { router.get( diff --git a/x-pack/plugins/cases/server/routes/api/cases/status/get_status.test.ts b/x-pack/plugins/cases/server/routes/api/cases/status/get_status.test.ts index 1c399a415e470..60ad0c60f944f 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/status/get_status.test.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/status/get_status.test.ts @@ -15,8 +15,8 @@ import { mockCases, } from '../../__fixtures__'; import { initGetCasesStatusApi } from './get_status'; -import { CASE_STATUS_URL } from '../../../../../common/constants'; -import { CaseType } from '../../../../../common/api'; +import { CASE_STATUS_URL } from '../../../../../common'; +import { CaseType } from '../../../../../common'; describe('GET status', () => { let routeHandler: RequestHandler<any, any, any>; diff --git a/x-pack/plugins/cases/server/routes/api/cases/status/get_status.ts b/x-pack/plugins/cases/server/routes/api/cases/status/get_status.ts index d0addfff09124..73642fdee0eac 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/status/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/status/get_status.ts @@ -8,8 +8,8 @@ import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CasesStatusResponseRt, caseStatuses } from '../../../../../common/api'; -import { CASE_STATUS_URL } from '../../../../../common/constants'; +import { CasesStatusResponseRt, caseStatuses } from '../../../../../common'; +import { CASE_STATUS_URL } from '../../../../../common'; import { constructQueryOptions } from '../helpers'; export function initGetCasesStatusApi({ caseService, router, logger }: RouteDeps) { diff --git a/x-pack/plugins/cases/server/routes/api/cases/sub_case/delete_sub_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/sub_case/delete_sub_cases.ts index fd33afbd7df8e..ef60c743ec822 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/sub_case/delete_sub_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/sub_case/delete_sub_cases.ts @@ -10,7 +10,7 @@ import { schema } from '@kbn/config-schema'; import { buildCaseUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { SUB_CASES_PATCH_DEL_URL } from '../../../../../common/constants'; +import { SUB_CASES_PATCH_DEL_URL } from '../../../../../common'; import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; export function initDeleteSubCasesApi({ diff --git a/x-pack/plugins/cases/server/routes/api/cases/sub_case/find_sub_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/sub_case/find_sub_cases.ts index c24dde1944f83..81d5517b8ce59 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/sub_case/find_sub_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/sub_case/find_sub_cases.ts @@ -17,10 +17,10 @@ import { SubCasesFindRequestRt, SubCasesFindResponseRt, throwErrors, -} from '../../../../../common/api'; +} from '../../../../../common'; import { RouteDeps } from '../../types'; import { escapeHatch, transformSubCases, wrapError } from '../../utils'; -import { SUB_CASES_URL } from '../../../../../common/constants'; +import { SUB_CASES_URL } from '../../../../../common'; import { constructQueryOptions } from '../helpers'; import { defaultPage, defaultPerPage } from '../..'; diff --git a/x-pack/plugins/cases/server/routes/api/cases/sub_case/get_sub_case.ts b/x-pack/plugins/cases/server/routes/api/cases/sub_case/get_sub_case.ts index 32dcc924e1a08..b5ebfb4de348b 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/sub_case/get_sub_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/sub_case/get_sub_case.ts @@ -7,10 +7,10 @@ import { schema } from '@kbn/config-schema'; -import { SubCaseResponseRt } from '../../../../../common/api'; +import { SubCaseResponseRt } from '../../../../../common'; import { RouteDeps } from '../../types'; import { flattenSubCaseSavedObject, wrapError } from '../../utils'; -import { SUB_CASE_DETAILS_URL } from '../../../../../common/constants'; +import { SUB_CASE_DETAILS_URL } from '../../../../../common'; import { countAlertsForID } from '../../../../common'; export function initGetSubCaseApi({ caseService, router, logger }: RouteDeps) { diff --git a/x-pack/plugins/cases/server/routes/api/cases/sub_case/patch_sub_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/sub_case/patch_sub_cases.ts index 08836615e1d39..0b142fb5279e5 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/sub_case/patch_sub_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/sub_case/patch_sub_cases.ts @@ -35,8 +35,8 @@ import { SubCasesResponseRt, User, CommentAttributes, -} from '../../../../../common/api'; -import { SUB_CASES_PATCH_DEL_URL } from '../../../../../common/constants'; +} from '../../../../../common'; +import { SUB_CASES_PATCH_DEL_URL } from '../../../../../common'; import { RouteDeps } from '../../types'; import { escapeHatch, diff --git a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts index f066aa70ec472..d70d6e0b57ee9 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts @@ -7,7 +7,7 @@ import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CASE_TAGS_URL } from '../../../../../common/constants'; +import { CASE_TAGS_URL } from '../../../../../common'; export function initGetTagsApi({ caseService, router }: RouteDeps) { router.get( diff --git a/x-pack/plugins/cases/server/routes/api/cases/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/cases/user_actions/get_all_user_actions.ts index b5c564648c185..48393b6af34ae 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/user_actions/get_all_user_actions.ts @@ -9,7 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; -import { CASE_USER_ACTIONS_URL, SUB_CASE_USER_ACTIONS_URL } from '../../../../../common/constants'; +import { CASE_USER_ACTIONS_URL, SUB_CASE_USER_ACTIONS_URL } from '../../../../../common'; export function initGetAllCaseUserActionsApi({ router, logger }: RouteDeps) { router.get( diff --git a/x-pack/plugins/cases/server/routes/api/utils.test.ts b/x-pack/plugins/cases/server/routes/api/utils.test.ts index f6bc1e4f71897..2df17e3abacfa 100644 --- a/x-pack/plugins/cases/server/routes/api/utils.test.ts +++ b/x-pack/plugins/cases/server/routes/api/utils.test.ts @@ -30,7 +30,7 @@ import { AssociationType, CaseType, CaseResponse, -} from '../../../common/api'; +} from '../../../common'; describe('Utils', () => { describe('transformNewCase', () => { diff --git a/x-pack/plugins/cases/server/routes/api/utils.ts b/x-pack/plugins/cases/server/routes/api/utils.ts index 8e8862f4157f1..9234472c13f5d 100644 --- a/x-pack/plugins/cases/server/routes/api/utils.ts +++ b/x-pack/plugins/cases/server/routes/api/utils.ts @@ -41,7 +41,7 @@ import { SubCasesFindResponse, User, AlertCommentRequestRt, -} from '../../../common/api'; +} from '../../../common'; import { transformESConnectorToCaseConnector } from './cases/helpers'; import { SortFieldCase } from './types'; diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations.ts b/x-pack/plugins/cases/server/saved_object_types/migrations.ts index bf9694d7e6bb0..8bbc481124870 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations.ts @@ -14,7 +14,7 @@ import { CaseType, AssociationType, ESConnectorFields, -} from '../../common/api'; +} from '../../common'; interface UnsanitizedCaseConnector { connector_id: string; diff --git a/x-pack/plugins/cases/server/scripts/sub_cases/index.ts b/x-pack/plugins/cases/server/scripts/sub_cases/index.ts index ba3bcaa65091c..56f842c10e8f5 100644 --- a/x-pack/plugins/cases/server/scripts/sub_cases/index.ts +++ b/x-pack/plugins/cases/server/scripts/sub_cases/index.ts @@ -8,9 +8,7 @@ import yargs from 'yargs'; import { ToolingLog } from '@kbn/dev-utils'; import { KbnClient } from '@kbn/test'; -import { CaseResponse, CaseType, ConnectorTypes } from '../../../common/api'; -import { CommentType } from '../../../common/api/cases/comment'; -import { CASES_URL } from '../../../common/constants'; +import { CaseResponse, CaseType, CommentType, ConnectorTypes, CASES_URL } from '../../../common'; import { ActionResult, ActionTypeExecutorResult } from '../../../../actions/common'; import { ContextTypeGeneratedAlertType, createAlertsString } from '../../connectors'; diff --git a/x-pack/plugins/cases/server/services/alerts/index.test.ts b/x-pack/plugins/cases/server/services/alerts/index.test.ts index 042e415b77e43..28c3a6278d544 100644 --- a/x-pack/plugins/cases/server/services/alerts/index.test.ts +++ b/x-pack/plugins/cases/server/services/alerts/index.test.ts @@ -6,7 +6,7 @@ */ import { KibanaRequest } from 'kibana/server'; -import { CaseStatuses } from '../../../common/api'; +import { CaseStatuses } from '../../../common'; import { AlertService, AlertServiceContract } from '.'; import { elasticsearchServiceMock, loggingSystemMock } from 'src/core/server/mocks'; diff --git a/x-pack/plugins/cases/server/services/alerts/index.ts b/x-pack/plugins/cases/server/services/alerts/index.ts index 6ce4db61ab956..876814719442c 100644 --- a/x-pack/plugins/cases/server/services/alerts/index.ts +++ b/x-pack/plugins/cases/server/services/alerts/index.ts @@ -10,7 +10,7 @@ import { isEmpty } from 'lodash'; import type { PublicMethodsOf } from '@kbn/utility-types'; import { ElasticsearchClient, Logger } from 'kibana/server'; -import { MAX_ALERTS_PER_SUB_CASE } from '../../../common/constants'; +import { MAX_ALERTS_PER_SUB_CASE } from '../../../common'; import { UpdateAlertRequest } from '../../client/types'; import { AlertInfo } from '../../common'; import { createCaseError } from '../../common/error'; diff --git a/x-pack/plugins/cases/server/services/configure/index.ts b/x-pack/plugins/cases/server/services/configure/index.ts index 46dca4d9a0d0e..0ca63bce2d1d0 100644 --- a/x-pack/plugins/cases/server/services/configure/index.ts +++ b/x-pack/plugins/cases/server/services/configure/index.ts @@ -13,7 +13,7 @@ import { SavedObjectsUpdateResponse, } from 'kibana/server'; -import { ESCasesConfigureAttributes, SavedObjectFindOptions } from '../../../common/api'; +import { ESCasesConfigureAttributes, SavedObjectFindOptions } from '../../../common'; import { CASE_CONFIGURE_SAVED_OBJECT } from '../../saved_object_types'; interface ClientArgs { diff --git a/x-pack/plugins/cases/server/services/connector_mappings/index.ts b/x-pack/plugins/cases/server/services/connector_mappings/index.ts index d4fda10276d2b..82f37190b4ecc 100644 --- a/x-pack/plugins/cases/server/services/connector_mappings/index.ts +++ b/x-pack/plugins/cases/server/services/connector_mappings/index.ts @@ -13,7 +13,7 @@ import { SavedObjectsFindResponse, } from 'kibana/server'; -import { ConnectorMappings, SavedObjectFindOptions } from '../../../common/api'; +import { ConnectorMappings, SavedObjectFindOptions } from '../../../common'; import { CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT } from '../../saved_object_types'; interface ClientArgs { diff --git a/x-pack/plugins/cases/server/services/index.ts b/x-pack/plugins/cases/server/services/index.ts index 11ceb48d11e9f..18b78300e6632 100644 --- a/x-pack/plugins/cases/server/services/index.ts +++ b/x-pack/plugins/cases/server/services/index.ts @@ -33,7 +33,7 @@ import { CaseResponse, caseTypeField, CasesFindRequest, -} from '../../common/api'; +} from '../../common'; import { combineFilters, defaultSortField, groupTotalAlertsByID } from '../common'; import { defaultPage, defaultPerPage } from '../routes/api'; import { diff --git a/x-pack/plugins/cases/server/services/reporters/read_reporters.ts b/x-pack/plugins/cases/server/services/reporters/read_reporters.ts index d2708780b2ccf..b47fa185ff78e 100644 --- a/x-pack/plugins/cases/server/services/reporters/read_reporters.ts +++ b/x-pack/plugins/cases/server/services/reporters/read_reporters.ts @@ -7,7 +7,7 @@ import { SavedObject, SavedObjectsClientContract } from 'kibana/server'; -import { CaseAttributes, User } from '../../../common/api'; +import { CaseAttributes, User } from '../../../common'; import { CASE_SAVED_OBJECT } from '../../saved_object_types'; export const convertToReporters = (caseObjects: Array<SavedObject<CaseAttributes>>): User[] => diff --git a/x-pack/plugins/cases/server/services/tags/read_tags.ts b/x-pack/plugins/cases/server/services/tags/read_tags.ts index 4c4a948453730..a00b0b6f26fb7 100644 --- a/x-pack/plugins/cases/server/services/tags/read_tags.ts +++ b/x-pack/plugins/cases/server/services/tags/read_tags.ts @@ -7,7 +7,7 @@ import { SavedObject, SavedObjectsClientContract } from 'kibana/server'; -import { CaseAttributes } from '../../../common/api'; +import { CaseAttributes } from '../../../common'; import { CASE_SAVED_OBJECT } from '../../saved_object_types'; export const convertToTags = (tagObjects: Array<SavedObject<CaseAttributes>>): string[] => diff --git a/x-pack/plugins/cases/server/services/user_actions/helpers.ts b/x-pack/plugins/cases/server/services/user_actions/helpers.ts index c600a96234b3d..be32717039d9d 100644 --- a/x-pack/plugins/cases/server/services/user_actions/helpers.ts +++ b/x-pack/plugins/cases/server/services/user_actions/helpers.ts @@ -17,7 +17,7 @@ import { User, UserActionFieldType, SubCaseAttributes, -} from '../../../common/api'; +} from '../../../common'; import { isTwoArraysDifference, transformESConnectorToCaseConnector, diff --git a/x-pack/plugins/cases/server/services/user_actions/index.ts b/x-pack/plugins/cases/server/services/user_actions/index.ts index 785c81021b584..a038d843a5331 100644 --- a/x-pack/plugins/cases/server/services/user_actions/index.ts +++ b/x-pack/plugins/cases/server/services/user_actions/index.ts @@ -12,7 +12,7 @@ import { SavedObjectReference, } from 'kibana/server'; -import { CaseUserActionAttributes } from '../../../common/api'; +import { CaseUserActionAttributes } from '../../../common'; import { CASE_USER_ACTION_SAVED_OBJECT, CASE_SAVED_OBJECT, diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx index 9c06fc032f819..6ffce4f2af454 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx @@ -13,7 +13,7 @@ import { noop } from 'lodash/fp'; import { TestProviders } from '../../../common/mock'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { CommentRequest, CommentType } from '../../../../../cases/common/api'; +import { CommentRequest, CommentType } from '../../../../../cases/common'; import { useInsertTimeline } from '../use_insert_timeline'; import { usePostComment } from '../../containers/use_post_comment'; import { AddComment, AddCommentRefObject } from '.'; diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index acd27e99a857f..ff5ef11fd923f 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -9,10 +9,10 @@ import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; import React, { useCallback, forwardRef, useImperativeHandle } from 'react'; import styled from 'styled-components'; -import { CommentType } from '../../../../../cases/common/api'; +import { CommentType } from '../../../../../cases/common'; import { usePostComment } from '../../containers/use_post_comment'; import { Case } from '../../containers/types'; -import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; +import { MarkdownEditorForm } from '../../../common/components/markdown_editor'; import { Form, useForm, UseField, useFormData } from '../../../shared_imports'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx index 2cf7d3c6c555b..bf625fc065089 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { CommentRequestUserType } from '../../../../../cases/common/api'; +import { CommentRequestUserType } from '../../../../../cases/common'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx index daa988641fbab..0353f48e6ee38 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx @@ -8,7 +8,7 @@ import { Dispatch } from 'react'; import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { Case, SubCase } from '../../containers/types'; import { UpdateCase } from '../../containers/use_get_cases'; import { statuses } from '../status'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx index 86f854fd0a145..079943d8cbd3b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx @@ -19,7 +19,7 @@ import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services'; import styled from 'styled-components'; import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; -import { CaseStatuses, CaseType } from '../../../../../cases/common/api'; +import { CaseStatuses, CaseType } from '../../../../../cases/common'; import { getEmptyTagValue } from '../../../common/components/empty_value'; import { Case, SubCase } from '../../containers/types'; import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx index 43f0d9df49e94..f40e159306e92 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx @@ -10,7 +10,7 @@ import { EuiBasicTable as _EuiBasicTable } from '@elastic/eui'; import styled from 'styled-components'; import { Case, SubCase } from '../../containers/types'; import { CasesColumns } from './columns'; -import { AssociationType } from '../../../../../cases/common/api'; +import { AssociationType } from '../../../../../cases/common'; type ExpandedRowMap = Record<string, Element> | {}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts index 8962d67319371..0d5eb2c9ba407 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts @@ -6,7 +6,7 @@ */ import { filter } from 'lodash/fp'; -import { AssociationType, CaseStatuses, CaseType } from '../../../../../cases/common/api'; +import { AssociationType, CaseStatuses, CaseType } from '../../../../../cases/common'; import { Case, SubCase } from '../../containers/types'; import { statuses } from '../status'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx index 0fafdaf81f095..c079bbc991601 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx @@ -14,7 +14,7 @@ import { TestProviders } from '../../../common/mock'; import { casesStatus, useGetCasesMockState, collectionCase } from '../../containers/mock'; import * as i18n from './translations'; -import { CaseStatuses, CaseType } from '../../../../../cases/common/api'; +import { CaseStatuses, CaseType } from '../../../../../cases/common'; import { useKibana } from '../../../common/lib/kibana'; import { getEmptyTagValue } from '../../../common/components/empty_value'; import { useDeleteCases } from '../../containers/use_delete_cases'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index c5748a321c19b..a0820486f423f 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -22,7 +22,7 @@ import styled, { css } from 'styled-components'; import classnames from 'classnames'; import * as i18n from './translations'; -import { CaseStatuses, CaseType } from '../../../../../cases/common/api'; +import { CaseStatuses, CaseType } from '../../../../../cases/common'; import { getCasesColumns } from './columns'; import { Case, DeleteCase, FilterOptions, SortFieldCase, SubCase } from '../../containers/types'; import { useGetCases, UpdateCase } from '../../containers/use_get_cases'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx index 5c9f11d1e3a83..f31eda12b3399 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { waitFor } from '@testing-library/react'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { StatusFilter } from './status_filter'; import { StatusAll } from '../status'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx index 48a642aaf51a9..c4486365cd292 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { TestProviders } from '../../../common/mock'; import { useGetTags } from '../../containers/use_get_tags'; import { useGetReporters } from '../../containers/use_get_reporters'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx index ff5b511ef9026..434ae46fcfb7a 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx @@ -10,7 +10,7 @@ import { isEqual } from 'lodash/fp'; import styled from 'styled-components'; import { EuiFlexGroup, EuiFlexItem, EuiFieldSearch, EuiFilterGroup } from '@elastic/eui'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { FilterOptions } from '../../containers/types'; import { useGetTags } from '../../containers/use_get_tags'; import { useGetReporters } from '../../containers/use_get_reporters'; diff --git a/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx b/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx index 24897a14f0754..e90ae2b036866 100644 --- a/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { statuses, CaseStatusWithAllStatus } from '../status'; import * as i18n from './translations'; import { Case } from '../../containers/types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts index 8e26c0fd7a7ff..64d37de0a6ea9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { basicCase } from '../../containers/mock'; import { getStatusDate, getStatusTitle } from './helpers'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts index 68a243040145a..9dd666c72335b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts +++ b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { Case } from '../../containers/types'; import { statuses } from '../status'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx index 63ce441732251..fd4e49400d464 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx @@ -16,7 +16,7 @@ import { EuiFlexItem, EuiIconTip, } from '@elastic/eui'; -import { CaseStatuses, CaseType } from '../../../../../cases/common/api'; +import { CaseStatuses, CaseType } from '../../../../../cases/common'; import * as i18n from '../case_view/translations'; import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; import { Actions } from './actions'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx index 4e414706d1fd7..1f3b9c39017d9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { StatusContextMenu } from './status_context_menu'; describe('SyncAlertsSwitch', () => { diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx index 92dcd16a86193..298d0d7695e8e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx @@ -8,7 +8,7 @@ import React, { memo, useCallback, useMemo, useState } from 'react'; import { memoize } from 'lodash/fp'; import { EuiPopover, EuiContextMenuPanel, EuiContextMenuItem } from '@elastic/eui'; -import { caseStatuses, CaseStatuses } from '../../../../../cases/common/api'; +import { caseStatuses, CaseStatuses } from '../../../../../cases/common'; import { Status } from '../status'; interface Props { diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx index 18a76e2766d8d..657a19d40fdd9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { AssociationType, CommentType } from '../../../../../cases/common/api'; +import { AssociationType, CommentType } from '../../../../../cases/common'; import { Comment } from '../../containers/types'; import { getManualAlertIdsWithNoRuleId, buildAlertsQuery } from './helpers'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts index 7211f4bca6a37..741880d886c89 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts @@ -6,7 +6,7 @@ */ import { isEmpty } from 'lodash'; -import { CommentType } from '../../../../../cases/common/api'; +import { CommentType } from '../../../../../cases/common'; import { Comment } from '../../containers/types'; export const getManualAlertIdsWithNoRuleId = (comments: Comment[]): string[] => { diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx index f28c7791d0110..75f91c8ef3035 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx @@ -28,8 +28,7 @@ import { useConnectors } from '../../containers/configure/use_connectors'; import { connectorsMock } from '../../containers/configure/mock'; import { usePostPushToService } from '../../containers/use_post_push_to_service'; import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; -import { CaseType } from '../../../../../cases/common/api'; +import { CaseType, ConnectorTypes } from '../../../../../cases/common'; const mockDispatch = jest.fn(); jest.mock('react-redux', () => { diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index 892663c783293..e16f1d7683abc 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -17,7 +17,7 @@ import { EuiHorizontalRule, } from '@elastic/eui'; -import { CaseStatuses, CaseAttributes, CaseType } from '../../../../../cases/common/api'; +import { CaseStatuses, CaseAttributes, CaseType } from '../../../../../cases/common'; import { Case, CaseConnector } from '../../containers/types'; import { getCaseDetailsUrl, getCaseUrl, useFormatUrl } from '../../../common/components/link_to'; import { gutterTimeline } from '../../../common/lib/helpers'; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx index ccc697a2ae84e..e18e0ef004ceb 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypes } from '../../../../../../cases/common/api'; +import { ConnectorTypes } from '../../../../../../cases/common'; import { ActionConnector } from '../../../containers/configure/types'; import { UseConnectorsResponse } from '../../../containers/configure/use_connectors'; import { ReturnUseCaseConfigure } from '../../../containers/configure/use_configure'; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx index c34651c3e1dc4..1c01bb3fdeb7b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx @@ -12,7 +12,7 @@ import { Connectors, Props } from './connectors'; import { TestProviders } from '../../../common/mock'; import { ConnectorsDropdown } from './connectors_dropdown'; import { connectors } from './__mock__'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; +import { ConnectorTypes } from '../../../../../cases/common'; describe('Connectors', () => { let wrapper: ReactWrapper; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx index 01d975a445ab4..27f7f4d50a0c9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx @@ -9,7 +9,7 @@ import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSuperSelect } from '@elastic/eui'; import styled from 'styled-components'; -import { ConnectorTypes } from '../../../../../cases/common/api'; +import { ConnectorTypes } from '../../../../../cases/common'; import { ActionConnector } from '../../containers/configure/types'; import { connectorsConfiguration } from '../connectors'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx index 8dbefdb731141..e78cd4c509d5d 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx @@ -33,7 +33,7 @@ import { useConnectorsResponse, useActionTypesResponse, } from './__mock__'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; +import { ConnectorTypes } from '../../../../../cases/common'; jest.mock('../../../common/lib/kibana'); jest.mock('../../containers/configure/use_connectors'); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx index 25155ff77c2d0..e951498c6c3c9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx @@ -10,7 +10,7 @@ import styled, { css } from 'styled-components'; import { EuiCallOut } from '@elastic/eui'; -import { SUPPORTED_CONNECTORS } from '../../../../../cases/common/constants'; +import { SUPPORTED_CONNECTORS } from '../../../../../cases/common'; import { useKibana } from '../../../common/lib/kibana'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useActionTypes } from '../../containers/configure/use_action_types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts b/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts index db14371b625d8..dfb19250f5bd6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorTypeFields, ConnectorTypes } from '../../../../../cases/common/api'; +import { ConnectorTypeFields, ConnectorTypes } from '../../../../../cases/common'; import { CaseField, ActionType, diff --git a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx index 63c6f265b1ab2..f0e77648cee6c 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx @@ -11,7 +11,7 @@ import { EuiFormRow } from '@elastic/eui'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../../shared_imports'; import { ConnectorsDropdown } from '../configure_cases/connectors_dropdown'; -import { ActionConnector } from '../../../../../cases/common/api'; +import { ActionConnector } from '../../../../../cases/common'; interface ConnectorSelectorProps { connectors: ActionConnector[]; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx index af9a86b0b711b..dded090eb3f98 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx @@ -10,7 +10,7 @@ import { EuiCard, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; import styled from 'styled-components'; import { connectorsConfiguration } from '.'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; +import { ConnectorTypes } from '../../../../../cases/common'; interface ConnectorCardProps { connectorType: ConnectorTypes; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx index 05161456976c6..b182c878d78e6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx @@ -12,7 +12,7 @@ import styled from 'styled-components'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { ActionParamsProps } from '../../../../../../triggers_actions_ui/public/types'; -import { CommentType } from '../../../../../../cases/common/api'; +import { CommentType } from '../../../../../../cases/common'; import { CaseActionParams } from './types'; import { ExistingCase } from './existing_case'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx index 3c6c5f47c6d12..c503a62ef515e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx @@ -6,7 +6,7 @@ */ import React, { memo, useMemo, useCallback } from 'react'; -import { CaseType } from '../../../../../../cases/common/api'; +import { CaseType } from '../../../../../../cases/common'; import { useGetCases, DEFAULT_QUERY_PARAMS, diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx index 841c2a9e38f6d..035f1fa2b63ac 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx @@ -10,7 +10,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import { CaseActionConnector, ConnectorFieldsProps } from './types'; import { getCaseConnectors } from '.'; -import { ConnectorTypeFields } from '../../../../../cases/common/api/connectors'; +import { ConnectorTypeFields } from '../../../../../cases/common'; interface Props extends Omit<ConnectorFieldsProps<ConnectorTypeFields['fields']>, 'connector'> { connector: CaseActionConnector | null; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts index dad7070aad705..76f6ccb6a1adb 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts @@ -15,7 +15,7 @@ import { ServiceNowITSMFieldsType, ServiceNowSIRFieldsType, ResilientFieldsType, -} from '../../../../../cases/common/api/connectors'; +} from '../../../../../cases/common'; export { getActionType as getCaseConnectorUI } from './case'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts index 40e59a081a449..1069e489ada09 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts @@ -8,7 +8,7 @@ import { lazy } from 'react'; import { CaseConnector } from '../types'; -import { JiraFieldsType } from '../../../../../../cases/common/api/connectors'; +import { JiraFieldsType } from '../../../../../../cases/common'; import * as i18n from './translations'; export * from './types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts index 8a2603f39e102..21850cdfe4d92 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts @@ -8,7 +8,7 @@ import { lazy } from 'react'; import { CaseConnector } from '../types'; -import { ResilientFieldsType } from '../../../../../../cases/common/api/connectors'; +import { ResilientFieldsType } from '../../../../../../cases/common'; import * as i18n from './translations'; export * from './types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts index b342095c39ff0..02441b2b9f7aa 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts @@ -8,10 +8,7 @@ import { lazy } from 'react'; import { CaseConnector } from '../types'; -import { - ServiceNowITSMFieldsType, - ServiceNowSIRFieldsType, -} from '../../../../../../cases/common/api/connectors'; +import { ServiceNowITSMFieldsType, ServiceNowSIRFieldsType } from '../../../../../../cases/common'; import * as i18n from './translations'; export const getServiceNowITSMCaseConnector = (): CaseConnector<ServiceNowITSMFieldsType> => { diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx index 50e317e8350fa..2bac7e01a00b2 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx @@ -8,7 +8,7 @@ import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; -import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../../../cases/common/api'; +import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../../../cases/common'; import { useKibana } from '../../../../common/lib/kibana'; import { ConnectorFieldsProps } from '../types'; import { ConnectorCard } from '../card'; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx b/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx index 7912d97528cd2..516cc5a0d23a5 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx @@ -8,7 +8,7 @@ import React, { memo, useCallback } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { ConnectorTypes } from '../../../../../cases/common/api'; +import { ConnectorTypes } from '../../../../../cases/common'; import { UseField, useFormData, FieldHook, useFormContext } from '../../../shared_imports'; import { useConnectors } from '../../containers/configure/use_connectors'; import { ConnectorSelector } from '../connector_selector/form'; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx index 99626c4cfb797..9d14acc96c192 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx @@ -10,7 +10,7 @@ import { mount, ReactWrapper } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { ConnectorTypes } from '../../../../../cases/common/api'; +import { ConnectorTypes } from '../../../../../cases/common'; import { TestProviders } from '../../../common/mock'; import { usePostCase } from '../../containers/use_post_case'; import { useGetTags } from '../../containers/use_get_tags'; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx b/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx index b575dfe42f074..597726e7bb3f3 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx @@ -19,7 +19,7 @@ import { usePostPushToService } from '../../containers/use_post_push_to_service' import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; import { Case } from '../../containers/types'; -import { CaseType, ConnectorTypes } from '../../../../../cases/common/api'; +import { CaseType, ConnectorTypes } from '../../../../../cases/common'; const initialCaseValue: FormProps = { description: '', diff --git a/x-pack/plugins/security_solution/public/cases/components/create/mock.ts b/x-pack/plugins/security_solution/public/cases/components/create/mock.ts index 6e17be8d53e5a..a983add030a1e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/mock.ts +++ b/x-pack/plugins/security_solution/public/cases/components/create/mock.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { CasePostRequest, CaseType } from '../../../../../cases/common/api'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; +import { CasePostRequest, CaseType, ConnectorTypes } from '../../../../../cases/common'; import { choices } from '../connectors/mock'; export const sampleTags = ['coke', 'pepsi']; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx b/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx index b069a484d314c..38321cdbeab50 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { CasePostRequest, ConnectorTypeFields } from '../../../../../cases/common/api'; +import { CasePostRequest, ConnectorTypeFields } from '../../../../../cases/common'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx b/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx index f76adfd2a840f..0ecb66d542334 100644 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx @@ -21,9 +21,8 @@ import styled from 'styled-components'; import { noop } from 'lodash/fp'; import { Form, UseField, useForm } from '../../../shared_imports'; -import { ConnectorTypeFields } from '../../../../../cases/common/api/connectors'; +import { ActionConnector, ConnectorTypeFields } from '../../../../../cases/common'; import { ConnectorSelector } from '../connector_selector/form'; -import { ActionConnector } from '../../../../../cases/common/api'; import { ConnectorFieldsForm } from '../connectors/fields_form'; import { getConnectorById } from '../configure_cases/utils'; import { CaseUserActions } from '../../containers/types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx b/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx index 6bf4eb95bc049..3c019369fa08b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { StatusActionButton } from './button'; describe('StatusActionButton', () => { diff --git a/x-pack/plugins/security_solution/public/cases/components/status/button.tsx b/x-pack/plugins/security_solution/public/cases/components/status/button.tsx index 5a0d98fc8a11a..6aa8f540e2e95 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/button.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/status/button.tsx @@ -8,7 +8,7 @@ import React, { memo, useCallback, useMemo } from 'react'; import { EuiButton } from '@elastic/eui'; -import { CaseStatuses, caseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses, caseStatuses } from '../../../../../cases/common'; import { statuses } from './config'; interface Props { diff --git a/x-pack/plugins/security_solution/public/cases/components/status/config.ts b/x-pack/plugins/security_solution/public/cases/components/status/config.ts index 47a74549f03cc..b7bc7dfa36110 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/config.ts +++ b/x-pack/plugins/security_solution/public/cases/components/status/config.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import * as i18n from './translations'; import { AllCaseStatus, Statuses, StatusAll } from './types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx b/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx index 266ceb04e4335..0bf3297361446 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { Stats } from './stats'; describe('Stats', () => { diff --git a/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx b/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx index 43001c2cf5947..93b8479a55d71 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx @@ -7,7 +7,7 @@ import React, { memo, useMemo } from 'react'; import { EuiDescriptionList, EuiLoadingSpinner } from '@elastic/eui'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { statuses } from './config'; export interface Props { diff --git a/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx b/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx index eff9d73c2adf9..05c3b95e163e6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { Status } from './status'; describe('Stats', () => { diff --git a/x-pack/plugins/security_solution/public/cases/components/status/types.ts b/x-pack/plugins/security_solution/public/cases/components/status/types.ts index 5618e7802579d..bbe44bce55515 100644 --- a/x-pack/plugins/security_solution/public/cases/components/status/types.ts +++ b/x-pack/plugins/security_solution/public/cases/components/status/types.ts @@ -6,7 +6,7 @@ */ import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; export const StatusAll = 'all' as const; type StatusAllType = typeof StatusAll; diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx index decd37a7646e7..ec5a3825ff652 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx @@ -16,7 +16,7 @@ import { EuiToolTip, } from '@elastic/eui'; -import { CommentType, CaseStatuses } from '../../../../../cases/common/api'; +import { CommentType, CaseStatuses } from '../../../../../cases/common'; import { Ecs } from '../../../../common/ecs'; import { ActionIconItem } from '../../../timelines/components/timeline/body/actions/action_icon_item'; import { usePostComment } from '../../containers/use_post_comment'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx index 10ad3d35004ba..54a5dd1263961 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx @@ -10,7 +10,7 @@ import styled from 'styled-components'; import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { Case, SubCase } from '../../containers/types'; import { AllCases } from '../all_cases'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx index 0b30f6ac94e03..23cc11ef2ef28 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx @@ -6,7 +6,7 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { Case, SubCase } from '../../containers/types'; import { AllCasesModal } from './all_cases_modal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx index 4b5eb00d95a80..627dc61c36b0c 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx @@ -14,7 +14,7 @@ import { CreateCaseForm } from '../create/form'; import { SubmitCaseButton } from '../create/submit_button'; import { Case } from '../../containers/types'; import * as i18n from '../../translations'; -import { CaseType } from '../../../../../cases/common/api'; +import { CaseType } from '../../../../../cases/common'; export interface CreateCaseModalProps { isModalOpen: boolean; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx index 5d2f54bd1f142..e29ee3f8712da 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx @@ -6,7 +6,7 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import { CaseType } from '../../../../../cases/common/api'; +import { CaseType } from '../../../../../cases/common'; import { Case } from '../../containers/types'; import { CreateCaseModal } from './create_case_modal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx index c058473bbfe3f..928d0167bbe85 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx @@ -13,12 +13,11 @@ import '../../../common/mock/match_media'; import { usePushToService, ReturnUsePushToService, UsePushToService } from '.'; import { TestProviders } from '../../../common/mock'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses, ConnectorTypes } from '../../../../../cases/common'; import { usePostPushToService } from '../../containers/use_post_push_to_service'; import { basicPush, actionLicenses } from '../../containers/mock'; import { useGetActionLicense } from '../../containers/use_get_action_license'; import { connectorsMock } from '../../containers/configure/mock'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; jest.mock('react-router-dom', () => { const original = jest.requireActual('react-router-dom'); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx index d83ddb08b51d2..42284cfa7da49 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx @@ -17,7 +17,7 @@ import { getConfigureCasesUrl, useFormatUrl } from '../../../common/components/l import { CaseCallOut } from '../callout'; import { getLicenseError, getKibanaConfigError } from './helpers'; import * as i18n from './translations'; -import { CaseConnector, ActionConnector, CaseStatuses } from '../../../../../cases/common/api'; +import { CaseConnector, ActionConnector, CaseStatuses } from '../../../../../cases/common'; import { CaseServices } from '../../containers/use_get_case_user_actions'; import { LinkAnchor } from '../../../common/components/links'; import { SecurityPageName } from '../../../app/types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx index a62c6c0ef682d..84408557eb5ae 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseStatuses } from '../../../../../cases/common/api'; +import { CaseStatuses } from '../../../../../cases/common'; import { basicPush, getUserAction } from '../../containers/mock'; import { getLabelTitle, getPushedServiceLabelTitle, getConnectorLabelTitle } from './helpers'; import { connectorsMock } from '../../containers/configure/mock'; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx index cc8d560f91b1f..a97e2e98cb9af 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx @@ -15,7 +15,7 @@ import { ActionConnector, CaseStatuses, CommentType, -} from '../../../../../cases/common/api'; +} from '../../../../../cases/common'; import { CaseUserActions } from '../../containers/types'; import { CaseServices } from '../../containers/use_get_case_user_actions'; import { parseString } from '../../containers/utils'; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx index f8d6872a4b740..d372d62ab16bb 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx @@ -30,7 +30,7 @@ import { AlertCommentRequestRt, CommentType, ContextTypeUserRt, -} from '../../../../../cases/common/api'; +} from '../../../../../cases/common'; import { CaseServices } from '../../containers/use_get_case_user_actions'; import { parseString } from '../../containers/utils'; import { OnUpdateFields } from '../case_view'; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx index 3bfdf2d2c5e62..25080d61a951b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx @@ -11,7 +11,7 @@ import { mount } from 'enzyme'; import { TestProviders } from '../../../common/mock'; import { useKibana } from '../../../common/lib/kibana'; import { AlertCommentEvent } from './user_action_alert_comment_event'; -import { CommentType } from '../../../../../cases/common/api'; +import { CommentType } from '../../../../../cases/common'; const props = { alertId: 'alert-id-1', diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx index a72bebbaf0999..a1b6587cfeecb 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx @@ -15,7 +15,7 @@ import { getRuleDetailsUrl, useFormatUrl } from '../../../common/components/link import { SecurityPageName } from '../../../app/types'; import * as i18n from './translations'; -import { CommentType } from '../../../../../cases/common/api'; +import { CommentType } from '../../../../../cases/common'; import { LinkAnchor } from '../../../common/components/links'; interface Props { From 84714f9e80c4640684c132b6de875ddf9431b3f7 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Sat, 13 Mar 2021 10:49:58 -0700 Subject: [PATCH 16/52] fix more imports --- .../public/cases/containers/api.ts | 27 +++++++++---------- .../public/cases/containers/configure/api.ts | 14 ++++------ .../public/cases/containers/types.ts | 18 ++++++------- .../cases/containers/use_bulk_update_case.tsx | 2 +- .../public/cases/containers/utils.ts | 16 +++++------ .../use_manage_case_action.tsx | 2 +- .../public/timelines/containers/api.ts | 8 +++--- 7 files changed, 40 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.ts b/x-pack/plugins/security_solution/public/cases/containers/api.ts index 7f3a34fb789fe..ca7ab5eb9d7dd 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/api.ts +++ b/x-pack/plugins/security_solution/public/cases/containers/api.ts @@ -8,9 +8,14 @@ import { assign, omit } from 'lodash'; import { + ACTION_TYPES_URL, + CASE_REPORTERS_URL, + CASE_STATUS_URL, + CASE_TAGS_URL, CasePatchRequest, CasePostRequest, CaseResponse, + CASES_URL, CasesFindResponse, CasesResponse, CasesStatusResponse, @@ -18,26 +23,18 @@ import { CaseUserActionsResponse, CommentRequest, CommentType, - SubCasePatchRequest, - SubCaseResponse, - SubCasesResponse, - User, -} from '../../../../cases/common/api'; - -import { - ACTION_TYPES_URL, - CASE_REPORTERS_URL, - CASE_STATUS_URL, - CASE_TAGS_URL, - CASES_URL, - SUB_CASE_DETAILS_URL, - SUB_CASES_PATCH_DEL_URL, getCaseCommentsUrl, - getCasePushUrl, getCaseDetailsUrl, + getCasePushUrl, getCaseUserActionUrl, getSubCaseDetailsUrl, getSubCaseUserActionUrl, + SUB_CASE_DETAILS_URL, + SUB_CASES_PATCH_DEL_URL, + SubCasePatchRequest, + SubCaseResponse, + SubCasesResponse, + User, } from '../../../../cases/common'; import { KibanaServices } from '../../common/lib/kibana'; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts index 943724ef08398..c165c493c16d9 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts +++ b/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts @@ -7,20 +7,16 @@ import { isEmpty } from 'lodash/fp'; import { + ACTION_TYPES_URL, ActionConnector, ActionTypeConnector, + CASE_CONFIGURE_CONNECTORS_URL, + CASE_CONFIGURE_URL, CasesConfigurePatch, - CasesConfigureResponse, CasesConfigureRequest, -} from '../../../../../cases/common/api'; + CasesConfigureResponse, +} from '../../../../../cases/common'; import { KibanaServices } from '../../../common/lib/kibana'; - -import { - CASE_CONFIGURE_CONNECTORS_URL, - CASE_CONFIGURE_URL, - ACTION_TYPES_URL, -} from '../../../../../cases/common/constants'; - import { ApiProps } from '../types'; import { convertToCamelCase, decodeCaseConfigureResponse } from '../utils'; import { CaseConfigure } from './types'; diff --git a/x-pack/plugins/security_solution/public/cases/containers/types.ts b/x-pack/plugins/security_solution/public/cases/containers/types.ts index 6feb5a1501a76..d1c17ea56df65 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/types.ts +++ b/x-pack/plugins/security_solution/public/cases/containers/types.ts @@ -6,20 +6,20 @@ */ import { - User, - UserActionField, - UserAction, - CaseConnector, - CommentRequest, - CaseStatuses, + AssociationType, CaseAttributes, + CaseConnector, CasePatchRequest, + CaseStatuses, CaseType, - AssociationType, -} from '../../../../cases/common/api'; + CommentRequest, + User, + UserAction, + UserActionField, +} from '../../../../cases/common'; import { CaseStatusWithAllStatus } from '../components/status'; -export { CaseConnector, ActionConnector, CaseStatuses } from '../../../../cases/common/api'; +export { CaseConnector, ActionConnector, CaseStatuses } from '../../../../cases/common'; export type Comment = CommentRequest & { associationType: AssociationType; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx index d39da93a06a48..ffb964982d302 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx @@ -6,7 +6,7 @@ */ import { useCallback, useReducer, useRef, useEffect } from 'react'; -import { CaseStatuses } from '../../../../cases/common/api'; +import { CaseStatuses } from '../../../../cases/common'; import { displaySuccessToast, errorToToaster, diff --git a/x-pack/plugins/security_solution/public/cases/containers/utils.ts b/x-pack/plugins/security_solution/public/cases/containers/utils.ts index 7c33e4481b2aa..e447476d02282 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/utils.ts +++ b/x-pack/plugins/security_solution/public/cases/containers/utils.ts @@ -13,22 +13,22 @@ import { identity } from 'fp-ts/lib/function'; import { pipe } from 'fp-ts/lib/pipeable'; import { - CasesFindResponse, - CasesFindResponseRt, + CaseConfigureResponseRt, + CasePatchRequest, CaseResponse, CaseResponseRt, + CasesConfigureResponse, + CasesFindResponse, + CasesFindResponseRt, CasesResponse, CasesResponseRt, - CasesStatusResponseRt, CasesStatusResponse, - throwErrors, - CasesConfigureResponse, - CaseConfigureResponseRt, + CasesStatusResponseRt, CaseUserActionsResponse, CaseUserActionsResponseRt, CommentType, - CasePatchRequest, -} from '../../../../cases/common/api'; + throwErrors, +} from '../../../../cases/common'; import { AppToast, ToasterError } from '../../common/components/toasters'; import { AllCases, Case, UpdateByKey } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/use_manage_case_action.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/use_manage_case_action.tsx index 875bc5e647077..c19e5c26bdc94 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/use_manage_case_action.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/use_manage_case_action.tsx @@ -6,7 +6,7 @@ */ import { useEffect, useRef, useState } from 'react'; -import { ACTION_URL } from '../../../../../../cases/common/constants'; +import { ACTION_URL } from '../../../../../../cases/common'; import { KibanaServices } from '../../../../common/lib/kibana'; interface CaseAction { diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index 01a85f6309c3f..a45b9c0fb302f 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -12,7 +12,6 @@ import { pipe } from 'fp-ts/lib/pipeable'; // eslint-disable-next-line no-restricted-imports import isEmpty from 'lodash/isEmpty'; -import { throwErrors } from '../../../../cases/common/api'; import { TimelineResponse, TimelineResponseType, @@ -24,12 +23,13 @@ import { } from '../../../common/types/timeline'; import { TimelineInput, TimelineType } from '../../graphql/types'; import { - TIMELINE_URL, + throwErrors, TIMELINE_DRAFT_URL, - TIMELINE_IMPORT_URL, TIMELINE_EXPORT_URL, + TIMELINE_IMPORT_URL, TIMELINE_PREPACKAGED_URL, -} from '../../../common/constants'; + TIMELINE_URL, +} from '../../../common'; import { KibanaServices } from '../../common/lib/kibana'; import { ExportSelectedData } from '../../common/components/generic_downloader'; From 5f5021df7a3628a33726ab08599220b79c68df01 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Sat, 13 Mar 2021 13:22:12 -0700 Subject: [PATCH 17/52] fix mistake --- .../configure_cases/field_mapping.test.tsx | 2 +- .../configure_cases/field_mapping.tsx | 2 +- .../field_mapping_row_static.tsx | 6 +- .../configure_cases/translations.ts | 94 ++++++++----------- .../connectors/case/translations.ts | 28 +++--- .../connectors/connectors_registry.ts | 17 ++-- .../connectors/jira/translations.ts | 41 ++++---- .../connectors/resilient/translations.ts | 17 ++-- .../connectors/servicenow/translations.ts | 47 ++++------ .../public/components/create/translations.ts | 36 +++---- .../markdown_editor/translations.ts | 13 +-- .../public/components/status/translations.ts | 31 +++--- .../components/toasters/translations.ts | 20 ++-- .../containers/configure/translations.ts | 9 +- .../cases/public/containers/translations.ts | 36 +++---- .../public/timelines/containers/api.ts | 8 +- 16 files changed, 169 insertions(+), 238 deletions(-) diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx index 33ea3c898334d..8c2a66ad7ee53 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.test.tsx @@ -47,7 +47,7 @@ describe('FieldMappingRow', () => { test('it pass the corrects props to mapping row', () => { const rows = wrapper.find(FieldMappingRowStatic); rows.forEach((row, index) => { - expect(row.prop('securitySolutionField')).toEqual(mappings[index].source); + expect(row.prop('casesField')).toEqual(mappings[index].source); expect(row.prop('selectedActionType')).toEqual(mappings[index].actionType); expect(row.prop('selectedThirdParty')).toEqual(mappings[index].target); }); diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx index 25d4f9f90e02b..ef7e8ecda0c87 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping.tsx @@ -58,7 +58,7 @@ const FieldMappingComponent: React.FC<FieldMappingProps> = ({ {mappings.map((item) => ( <FieldMappingRowStatic key={`${item.source}`} - securitySolutionField={item.source} + casesField={item.source} isLoading={isLoading} selectedActionType={item.actionType} selectedThirdParty={item.target ?? 'not_mapped'} diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx index a732f403ee646..52672197ecb55 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx @@ -13,14 +13,14 @@ import { CaseField, ActionType, ThirdPartyField } from '../../containers/configu export interface RowProps { isLoading: boolean; - securitySolutionField: CaseField; + casesField: CaseField; selectedActionType: ActionType; selectedThirdParty: ThirdPartyField; } const FieldMappingRowComponent: React.FC<RowProps> = ({ isLoading, - securitySolutionField, + casesField, selectedActionType, selectedThirdParty, }) => { @@ -32,7 +32,7 @@ const FieldMappingRowComponent: React.FC<RowProps> = ({ <EuiFlexItem> <EuiFlexGroup component="span" justifyContent="spaceBetween"> <EuiFlexItem component="span" grow={false}> - <EuiCode data-test-subj="field-mapping-source">{securitySolutionField}</EuiCode> + <EuiCode data-test-subj="field-mapping-source">{casesField}</EuiCode> </EuiFlexItem> <EuiFlexItem component="span" grow={false}> <EuiIcon type="sortRight" /> diff --git a/x-pack/plugins/cases/public/components/configure_cases/translations.ts b/x-pack/plugins/cases/public/components/configure_cases/translations.ts index 9a82d0e821b4c..1155c54e043b0 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/translations.ts +++ b/x-pack/plugins/cases/public/components/configure_cases/translations.ts @@ -10,14 +10,14 @@ import { i18n } from '@kbn/i18n'; export * from '../../common/translations'; export const INCIDENT_MANAGEMENT_SYSTEM_TITLE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.incidentManagementSystemTitle', + 'xpack.cases.configureCases.incidentManagementSystemTitle', { defaultMessage: 'Connect to external incident management system', } ); export const INCIDENT_MANAGEMENT_SYSTEM_DESC = i18n.translate( - 'xpack.securitySolution.cases.configureCases.incidentManagementSystemDesc', + 'xpack.cases.configureCases.incidentManagementSystemDesc', { defaultMessage: 'You may optionally connect Security cases to an external incident management system of your choosing. This will allow you to push case data as an incident in your chosen third-party system.', @@ -25,28 +25,25 @@ export const INCIDENT_MANAGEMENT_SYSTEM_DESC = i18n.translate( ); export const INCIDENT_MANAGEMENT_SYSTEM_LABEL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.incidentManagementSystemLabel', + 'xpack.cases.configureCases.incidentManagementSystemLabel', { defaultMessage: 'Incident management system', } ); -export const ADD_NEW_CONNECTOR = i18n.translate( - 'xpack.securitySolution.cases.configureCases.addNewConnector', - { - defaultMessage: 'Add new connector', - } -); +export const ADD_NEW_CONNECTOR = i18n.translate('xpack.cases.configureCases.addNewConnector', { + defaultMessage: 'Add new connector', +}); export const CASE_CLOSURE_OPTIONS_TITLE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsTitle', + 'xpack.cases.configureCases.caseClosureOptionsTitle', { defaultMessage: 'Case Closures', } ); export const CASE_CLOSURE_OPTIONS_DESC = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsDesc', + 'xpack.cases.configureCases.caseClosureOptionsDesc', { defaultMessage: 'Define how you wish Security cases to be closed. Automated case closures require an established connection to an external incident management system.', @@ -54,28 +51,28 @@ export const CASE_CLOSURE_OPTIONS_DESC = i18n.translate( ); export const CASE_COLSURE_OPTIONS_SUB_CASES = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsSubCases', + 'xpack.cases.configureCases.caseClosureOptionsSubCases', { defaultMessage: 'Automated closures of sub-cases is not currently supported.', } ); export const CASE_CLOSURE_OPTIONS_LABEL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsLabel', + 'xpack.cases.configureCases.caseClosureOptionsLabel', { defaultMessage: 'Case closure options', } ); export const CASE_CLOSURE_OPTIONS_MANUAL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsManual', + 'xpack.cases.configureCases.caseClosureOptionsManual', { defaultMessage: 'Manually close Security cases', } ); export const CASE_CLOSURE_OPTIONS_NEW_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsNewIncident', + 'xpack.cases.configureCases.caseClosureOptionsNewIncident', { defaultMessage: 'Automatically close Security cases when pushing new incident to external system', @@ -83,20 +80,20 @@ export const CASE_CLOSURE_OPTIONS_NEW_INCIDENT = i18n.translate( ); export const CASE_CLOSURE_OPTIONS_CLOSED_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsClosedIncident', + 'xpack.cases.configureCases.caseClosureOptionsClosedIncident', { defaultMessage: 'Automatically close Security cases when incident is closed in external system', } ); export const FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingTitle', { + return i18n.translate('xpack.cases.configureCases.fieldMappingTitle', { values: { thirdPartyName }, defaultMessage: '{ thirdPartyName } field mappings', }); }; export const FIELD_MAPPING_DESC = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingDesc', { + return i18n.translate('xpack.cases.configureCases.fieldMappingDesc', { values: { thirdPartyName }, defaultMessage: 'Map Security Case fields to { thirdPartyName } fields when pushing data to { thirdPartyName }. Field mappings require an established connection to { thirdPartyName }.', @@ -104,85 +101,82 @@ export const FIELD_MAPPING_DESC = (thirdPartyName: string): string => { }; export const FIELD_MAPPING_DESC_ERR = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingDescErr', { + return i18n.translate('xpack.cases.configureCases.fieldMappingDescErr', { values: { thirdPartyName }, defaultMessage: 'Field mappings require an established connection to { thirdPartyName }. Please check your connection credentials.', }); }; export const EDIT_FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.editFieldMappingTitle', { + return i18n.translate('xpack.cases.configureCases.editFieldMappingTitle', { values: { thirdPartyName }, defaultMessage: 'Edit { thirdPartyName } field mappings', }); }; export const FIELD_MAPPING_FIRST_COL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingFirstCol', + 'xpack.cases.configureCases.fieldMappingFirstCol', { defaultMessage: 'Security case field', } ); export const FIELD_MAPPING_SECOND_COL = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingSecondCol', { + return i18n.translate('xpack.cases.configureCases.fieldMappingSecondCol', { values: { thirdPartyName }, defaultMessage: '{ thirdPartyName } field', }); }; export const FIELD_MAPPING_THIRD_COL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingThirdCol', + 'xpack.cases.configureCases.fieldMappingThirdCol', { defaultMessage: 'On edit and update', } ); export const FIELD_MAPPING_EDIT_NOTHING = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingEditNothing', + 'xpack.cases.configureCases.fieldMappingEditNothing', { defaultMessage: 'Nothing', } ); export const FIELD_MAPPING_EDIT_OVERWRITE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingEditOverwrite', + 'xpack.cases.configureCases.fieldMappingEditOverwrite', { defaultMessage: 'Overwrite', } ); export const FIELD_MAPPING_EDIT_APPEND = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingEditAppend', + 'xpack.cases.configureCases.fieldMappingEditAppend', { defaultMessage: 'Append', } ); -export const CANCEL = i18n.translate('xpack.securitySolution.cases.configureCases.cancelButton', { +export const CANCEL = i18n.translate('xpack.cases.configureCases.cancelButton', { defaultMessage: 'Cancel', }); -export const SAVE = i18n.translate('xpack.securitySolution.cases.configureCases.saveButton', { +export const SAVE = i18n.translate('xpack.cases.configureCases.saveButton', { defaultMessage: 'Save', }); -export const SAVE_CLOSE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.saveAndCloseButton', - { - defaultMessage: 'Save & close', - } -); +export const SAVE_CLOSE = i18n.translate('xpack.cases.configureCases.saveAndCloseButton', { + defaultMessage: 'Save & close', +}); export const WARNING_NO_CONNECTOR_TITLE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.warningTitle', + 'xpack.cases.configureCases.warningTitle', { defaultMessage: 'Warning', } ); export const WARNING_NO_CONNECTOR_MESSAGE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.warningMessage', + 'xpack.cases.configureCases.warningMessage', { defaultMessage: 'The selected connector has been deleted. Either select a different connector or create a new one.', @@ -190,21 +184,18 @@ export const WARNING_NO_CONNECTOR_MESSAGE = i18n.translate( ); export const MAPPING_FIELD_NOT_MAPPED = i18n.translate( - 'xpack.securitySolution.cases.configureCases.mappingFieldNotMapped', + 'xpack.cases.configureCases.mappingFieldNotMapped', { defaultMessage: 'Not mapped', } ); -export const COMMENT = i18n.translate( - 'xpack.securitySolution.cases.configureCases.commentMapping', - { - defaultMessage: 'Comments', - } -); +export const COMMENT = i18n.translate('xpack.cases.configureCases.commentMapping', { + defaultMessage: 'Comments', +}); export const NO_FIELDS_ERROR = (connectorName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.noFieldsError', { + return i18n.translate('xpack.cases.configureCases.noFieldsError', { values: { connectorName }, defaultMessage: 'No { connectorName } fields found. Please check your { connectorName } connector settings or your { connectorName } instance settings to resolve.', @@ -212,28 +203,25 @@ export const NO_FIELDS_ERROR = (connectorName: string): string => { }; export const BLANK_MAPPINGS = (connectorName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.blankMappings', { + return i18n.translate('xpack.cases.configureCases.blankMappings', { values: { connectorName }, defaultMessage: 'At least one field needs to be mapped to { connectorName }', }); }; export const REQUIRED_MAPPINGS = (connectorName: string, fields: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.requiredMappings', { + return i18n.translate('xpack.cases.configureCases.requiredMappings', { values: { connectorName, fields }, defaultMessage: 'At least one Case field needs to be mapped to the following required { connectorName } fields: { fields }', }); }; -export const UPDATE_FIELD_MAPPINGS = i18n.translate( - 'xpack.securitySolution.cases.configureCases.updateConnector', - { - defaultMessage: 'Update field mappings', - } -); +export const UPDATE_FIELD_MAPPINGS = i18n.translate('xpack.cases.configureCases.updateConnector', { + defaultMessage: 'Update field mappings', +}); export const UPDATE_SELECTED_CONNECTOR = (connectorName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.updateSelectedConnector', { + return i18n.translate('xpack.cases.configureCases.updateSelectedConnector', { values: { connectorName }, defaultMessage: 'Update { connectorName }', }); diff --git a/x-pack/plugins/cases/public/components/connectors/case/translations.ts b/x-pack/plugins/cases/public/components/connectors/case/translations.ts index 0581a8e84b797..8304aaef5765c 100644 --- a/x-pack/plugins/cases/public/components/connectors/case/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/case/translations.ts @@ -10,77 +10,77 @@ import { i18n } from '@kbn/i18n'; export * from '../../../common/translations'; export const CASE_CONNECTOR_DESC = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.selectMessageText', + 'xpack.cases.components.connectors.cases.selectMessageText', { defaultMessage: 'Create or update a case.', } ); export const CASE_CONNECTOR_TITLE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.actionTypeTitle', + 'xpack.cases.components.connectors.cases.actionTypeTitle', { defaultMessage: 'Cases', } ); export const CASE_CONNECTOR_COMMENT_LABEL = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.commentLabel', + 'xpack.cases.components.connectors.cases.commentLabel', { defaultMessage: 'Comment', } ); export const CASE_CONNECTOR_COMMENT_REQUIRED = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.commentRequired', + 'xpack.cases.components.connectors.cases.commentRequired', { defaultMessage: 'Comment is required.', } ); export const CASE_CONNECTOR_CASES_DROPDOWN_ROW_LABEL = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.casesDropdownRowLabel', + 'xpack.cases.components.connectors.cases.casesDropdownRowLabel', { defaultMessage: 'Case allowing sub-cases', } ); export const CASE_CONNECTOR_CASES_DROPDOWN_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.casesDropdownPlaceholder', + 'xpack.cases.components.connectors.cases.casesDropdownPlaceholder', { defaultMessage: 'Select case', } ); export const CASE_CONNECTOR_CASES_OPTION_NEW_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.optionAddNewCase', + 'xpack.cases.components.connectors.cases.optionAddNewCase', { defaultMessage: 'Add to a new case', } ); export const CASE_CONNECTOR_CASES_OPTION_EXISTING_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.optionAddToExistingCase', + 'xpack.cases.components.connectors.cases.optionAddToExistingCase', { defaultMessage: 'Add to existing case', } ); export const CASE_CONNECTOR_CASE_REQUIRED = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.caseRequired', + 'xpack.cases.components.connectors.cases.caseRequired', { defaultMessage: 'You must select a case.', } ); export const CASE_CONNECTOR_CALL_OUT_TITLE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.callOutTitle', + 'xpack.cases.components.connectors.cases.callOutTitle', { defaultMessage: 'Generated alerts will be attached to sub-cases', } ); export const CASE_CONNECTOR_CALL_OUT_MSG = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.callOutMsg', + 'xpack.cases.components.connectors.cases.callOutMsg', { defaultMessage: 'A case can contain multiple sub-cases to allow grouping of generated alerts. Sub-cases will give more granular control over the status of these generated alerts and prevents having too many alerts attached to one case.', @@ -88,21 +88,21 @@ export const CASE_CONNECTOR_CALL_OUT_MSG = i18n.translate( ); export const CASE_CONNECTOR_ADD_NEW_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.addNewCaseOption', + 'xpack.cases.components.connectors.cases.addNewCaseOption', { defaultMessage: 'Add new case', } ); export const CREATE_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.createCaseLabel', + 'xpack.cases.components.connectors.cases.createCaseLabel', { defaultMessage: 'Create case', } ); export const CONNECTED_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.connectedCaseLabel', + 'xpack.cases.components.connectors.cases.connectedCaseLabel', { defaultMessage: 'Connected case', } diff --git a/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts b/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts index cc8edd937cb0e..34e0b37d96dbd 100644 --- a/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts +++ b/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts @@ -17,7 +17,7 @@ export const createCaseConnectorsRegistry = (): CaseConnectorsRegistry => { if (connectors.has(connector.id)) { throw new Error( i18n.translate( - 'xpack.securitySolution.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage', + 'xpack.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage', { defaultMessage: 'Object type "{id}" is already registered.', values: { @@ -33,15 +33,12 @@ export const createCaseConnectorsRegistry = (): CaseConnectorsRegistry => { get: <UIProps>(id: string): CaseConnector<UIProps> => { if (!connectors.has(id)) { throw new Error( - i18n.translate( - 'xpack.securitySolution.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage', - { - defaultMessage: 'Object type "{id}" is not registered.', - values: { - id, - }, - } - ) + i18n.translate('xpack.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage', { + defaultMessage: 'Object type "{id}" is not registered.', + values: { + id, + }, + }) ); } return connectors.get(id)!; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/translations.ts b/x-pack/plugins/cases/public/components/connectors/jira/translations.ts index a4948d61f952c..889a7b1ec222b 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/translations.ts @@ -8,70 +8,61 @@ import { i18n } from '@kbn/i18n'; export const ISSUE_TYPES_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.unableToGetIssueTypesMessage', + 'xpack.components.connectors.jira.unableToGetIssueTypesMessage', { defaultMessage: 'Unable to get issue types', } ); export const FIELDS_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.unableToGetFieldsMessage', + 'xpack.components.connectors.jira.unableToGetFieldsMessage', { defaultMessage: 'Unable to get connectors', } ); export const ISSUES_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.unableToGetIssuesMessage', + 'xpack.components.connectors.jira.unableToGetIssuesMessage', { defaultMessage: 'Unable to get issues', } ); export const GET_ISSUE_API_ERROR = (id: string) => - i18n.translate('xpack.securitySolution.components.connectors.jira.unableToGetIssueMessage', { + i18n.translate('xpack.components.connectors.jira.unableToGetIssueMessage', { defaultMessage: 'Unable to get issue with id {id}', values: { id }, }); export const SEARCH_ISSUES_COMBO_BOX_ARIA_LABEL = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxAriaLabel', + 'xpack.components.connectors.jira.searchIssuesComboBoxAriaLabel', { defaultMessage: 'Type to search', } ); export const SEARCH_ISSUES_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxPlaceholder', + 'xpack.components.connectors.jira.searchIssuesComboBoxPlaceholder', { defaultMessage: 'Type to search', } ); export const SEARCH_ISSUES_LOADING = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.searchIssuesLoading', + 'xpack.components.connectors.jira.searchIssuesLoading', { defaultMessage: 'Loading...', } ); -export const PRIORITY = i18n.translate( - 'xpack.securitySolution.cases.connectors.jira.prioritySelectFieldLabel', - { - defaultMessage: 'Priority', - } -); +export const PRIORITY = i18n.translate('xpack.cases.connectors.jira.prioritySelectFieldLabel', { + defaultMessage: 'Priority', +}); -export const ISSUE_TYPE = i18n.translate( - 'xpack.securitySolution.cases.connectors.jira.issueTypesSelectFieldLabel', - { - defaultMessage: 'Issue type', - } -); +export const ISSUE_TYPE = i18n.translate('xpack.cases.connectors.jira.issueTypesSelectFieldLabel', { + defaultMessage: 'Issue type', +}); -export const PARENT_ISSUE = i18n.translate( - 'xpack.securitySolution.cases.connectors.jira.parentIssueSearchLabel', - { - defaultMessage: 'Parent issue', - } -); +export const PARENT_ISSUE = i18n.translate('xpack.cases.connectors.jira.parentIssueSearchLabel', { + defaultMessage: 'Parent issue', +}); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts b/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts index 4f8061f48aa68..1b63a5098e92a 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/resilient/translations.ts @@ -8,36 +8,33 @@ import { i18n } from '@kbn/i18n'; export const INCIDENT_TYPES_API_ERROR = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.unableToGetIncidentTypesMessage', + 'xpack.cases.connectors.resilient.unableToGetIncidentTypesMessage', { defaultMessage: 'Unable to get incident types', } ); export const SEVERITY_API_ERROR = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.unableToGetSeverityMessage', + 'xpack.cases.connectors.resilient.unableToGetSeverityMessage', { defaultMessage: 'Unable to get severity', } ); export const INCIDENT_TYPES_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.incidentTypesPlaceholder', + 'xpack.cases.connectors.resilient.incidentTypesPlaceholder', { defaultMessage: 'Choose types', } ); export const INCIDENT_TYPES_LABEL = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.incidentTypesLabel', + 'xpack.cases.connectors.resilient.incidentTypesLabel', { defaultMessage: 'Incident Types', } ); -export const SEVERITY_LABEL = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.severityLabel', - { - defaultMessage: 'Severity', - } -); +export const SEVERITY_LABEL = i18n.translate('xpack.cases.connectors.resilient.severityLabel', { + defaultMessage: 'Severity', +}); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts index 77c263385df0a..f99957d0f12dd 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts @@ -8,91 +8,82 @@ import { i18n } from '@kbn/i18n'; export const URGENCY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.urgencySelectFieldLabel', + 'xpack.components.connectors.serviceNow.urgencySelectFieldLabel', { defaultMessage: 'Urgency', } ); export const SEVERITY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.severitySelectFieldLabel', + 'xpack.components.connectors.serviceNow.severitySelectFieldLabel', { defaultMessage: 'Severity', } ); export const IMPACT = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.impactSelectFieldLabel', + 'xpack.components.connectors.serviceNow.impactSelectFieldLabel', { defaultMessage: 'Impact', } ); export const CHOICES_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.unableToGetChoicesMessage', + 'xpack.components.connectors.serviceNow.unableToGetChoicesMessage', { defaultMessage: 'Unable to get choices', } ); export const MALWARE_URL = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.malwareURLTitle', + 'xpack.components.connectors.serviceNow.malwareURLTitle', { defaultMessage: 'Malware URL', } ); export const MALWARE_HASH = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.malwareHashTitle', + 'xpack.components.connectors.serviceNow.malwareHashTitle', { defaultMessage: 'Malware Hash', } ); -export const CATEGORY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.categoryTitle', - { - defaultMessage: 'Category', - } -); +export const CATEGORY = i18n.translate('xpack.components.connectors.serviceNow.categoryTitle', { + defaultMessage: 'Category', +}); export const SUBCATEGORY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.subcategoryTitle', + 'xpack.components.connectors.serviceNow.subcategoryTitle', { defaultMessage: 'Subcategory', } ); -export const SOURCE_IP = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.sourceIPTitle', - { - defaultMessage: 'Source IP', - } -); +export const SOURCE_IP = i18n.translate('xpack.components.connectors.serviceNow.sourceIPTitle', { + defaultMessage: 'Source IP', +}); -export const DEST_IP = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.destinationIPTitle', - { - defaultMessage: 'Destination IP', - } -); +export const DEST_IP = i18n.translate('xpack.components.connectors.serviceNow.destinationIPTitle', { + defaultMessage: 'Destination IP', +}); export const PRIORITY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.prioritySelectFieldTitle', + 'xpack.components.connectors.serviceNow.prioritySelectFieldTitle', { defaultMessage: 'Priority', } ); export const ALERT_FIELDS_LABEL = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.alertFieldsTitle', + 'xpack.components.connectors.serviceNow.alertFieldsTitle', { defaultMessage: 'Select Observables to push', } ); export const ALERT_FIELD_ENABLED_TEXT = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.alertFieldEnabledText', + 'xpack.components.connectors.serviceNow.alertFieldEnabledText', { defaultMessage: 'Yes', } diff --git a/x-pack/plugins/cases/public/components/create/translations.ts b/x-pack/plugins/cases/public/components/create/translations.ts index fec8cc8e7a7d5..d24d699dbb0f4 100644 --- a/x-pack/plugins/cases/public/components/create/translations.ts +++ b/x-pack/plugins/cases/public/components/create/translations.ts @@ -9,30 +9,18 @@ import { i18n } from '@kbn/i18n'; export * from '../../common/translations'; -export const STEP_ONE_TITLE = i18n.translate( - 'xpack.securitySolution.components.create.stepOneTitle', - { - defaultMessage: 'Case fields', - } -); +export const STEP_ONE_TITLE = i18n.translate('xpack.components.create.stepOneTitle', { + defaultMessage: 'Case fields', +}); -export const STEP_TWO_TITLE = i18n.translate( - 'xpack.securitySolution.components.create.stepTwoTitle', - { - defaultMessage: 'Case settings', - } -); +export const STEP_TWO_TITLE = i18n.translate('xpack.components.create.stepTwoTitle', { + defaultMessage: 'Case settings', +}); -export const STEP_THREE_TITLE = i18n.translate( - 'xpack.securitySolution.components.create.stepThreeTitle', - { - defaultMessage: 'External Connector Fields', - } -); +export const STEP_THREE_TITLE = i18n.translate('xpack.components.create.stepThreeTitle', { + defaultMessage: 'External Connector Fields', +}); -export const SYNC_ALERTS_LABEL = i18n.translate( - 'xpack.securitySolution.components.create.syncAlertsLabel', - { - defaultMessage: 'Sync alert status with case status', - } -); +export const SYNC_ALERTS_LABEL = i18n.translate('xpack.components.create.syncAlertsLabel', { + defaultMessage: 'Sync alert status with case status', +}); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/translations.ts b/x-pack/plugins/cases/public/components/markdown_editor/translations.ts index 17abddb339e1a..c0dd13cef665b 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/translations.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/translations.ts @@ -7,16 +7,13 @@ import { i18n } from '@kbn/i18n'; -export const MARKDOWN_SYNTAX_HELP = i18n.translate( - 'xpack.securitySolution.markdownEditor.markdownInputHelp', - { - defaultMessage: 'Markdown syntax help', - } -); +export const MARKDOWN_SYNTAX_HELP = i18n.translate('xpack.markdownEditor.markdownInputHelp', { + defaultMessage: 'Markdown syntax help', +}); -export const MARKDOWN = i18n.translate('xpack.securitySolution.markdownEditor.markdown', { +export const MARKDOWN = i18n.translate('xpack.markdownEditor.markdown', { defaultMessage: 'Markdown', }); -export const PREVIEW = i18n.translate('xpack.securitySolution.markdownEditor.preview', { +export const PREVIEW = i18n.translate('xpack.markdownEditor.preview', { defaultMessage: 'Preview', }); diff --git a/x-pack/plugins/cases/public/components/status/translations.ts b/x-pack/plugins/cases/public/components/status/translations.ts index 639254f96f573..b3eadfd681ba5 100644 --- a/x-pack/plugins/cases/public/components/status/translations.ts +++ b/x-pack/plugins/cases/public/components/status/translations.ts @@ -8,64 +8,61 @@ import { i18n } from '@kbn/i18n'; export * from '../../common/translations'; -export const ALL = i18n.translate('xpack.securitySolution.cases.status.all', { +export const ALL = i18n.translate('xpack.cases.status.all', { defaultMessage: 'All', }); -export const OPEN = i18n.translate('xpack.securitySolution.cases.status.open', { +export const OPEN = i18n.translate('xpack.cases.status.open', { defaultMessage: 'Open', }); -export const IN_PROGRESS = i18n.translate('xpack.securitySolution.cases.status.inProgress', { +export const IN_PROGRESS = i18n.translate('xpack.cases.status.inProgress', { defaultMessage: 'In progress', }); -export const CLOSED = i18n.translate('xpack.securitySolution.cases.status.closed', { +export const CLOSED = i18n.translate('xpack.cases.status.closed', { defaultMessage: 'Closed', }); -export const STATUS_ICON_ARIA = i18n.translate('xpack.securitySolution.cases.status.iconAria', { +export const STATUS_ICON_ARIA = i18n.translate('xpack.cases.status.iconAria', { defaultMessage: 'Change status', }); -export const CASE_OPENED = i18n.translate('xpack.securitySolution.cases.caseView.caseOpened', { +export const CASE_OPENED = i18n.translate('xpack.cases.caseView.caseOpened', { defaultMessage: 'Case opened', }); -export const CASE_IN_PROGRESS = i18n.translate( - 'xpack.securitySolution.cases.caseView.caseInProgress', - { - defaultMessage: 'Case in progress', - } -); +export const CASE_IN_PROGRESS = i18n.translate('xpack.cases.caseView.caseInProgress', { + defaultMessage: 'Case in progress', +}); -export const CASE_CLOSED = i18n.translate('xpack.securitySolution.cases.caseView.caseClosed', { +export const CASE_CLOSED = i18n.translate('xpack.cases.caseView.caseClosed', { defaultMessage: 'Case closed', }); export const BULK_ACTION_CLOSE_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.closeSelectedTitle', + 'xpack.cases.caseTable.bulkActions.closeSelectedTitle', { defaultMessage: 'Close selected', } ); export const BULK_ACTION_OPEN_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.openSelectedTitle', + 'xpack.cases.caseTable.bulkActions.openSelectedTitle', { defaultMessage: 'Open selected', } ); export const BULK_ACTION_DELETE_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.deleteSelectedTitle', + 'xpack.cases.caseTable.bulkActions.deleteSelectedTitle', { defaultMessage: 'Delete selected', } ); export const BULK_ACTION_MARK_IN_PROGRESS = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.markInProgressTitle', + 'xpack.cases.caseTable.bulkActions.markInProgressTitle', { defaultMessage: 'Mark in progress', } diff --git a/x-pack/plugins/cases/public/components/toasters/translations.ts b/x-pack/plugins/cases/public/components/toasters/translations.ts index 0d5bbbf944fc5..4b91eaa3d3ec1 100644 --- a/x-pack/plugins/cases/public/components/toasters/translations.ts +++ b/x-pack/plugins/cases/public/components/toasters/translations.ts @@ -7,20 +7,14 @@ import { i18n } from '@kbn/i18n'; -export const SEE_ALL_ERRORS = i18n.translate( - 'xpack.securitySolution.modalAllErrors.seeAllErrors.button', - { - defaultMessage: 'See the full error(s)', - } -); +export const SEE_ALL_ERRORS = i18n.translate('xpack.modalAllErrors.seeAllErrors.button', { + defaultMessage: 'See the full error(s)', +}); -export const TITLE_ERROR_MODAL = i18n.translate('xpack.securitySolution.modalAllErrors.title', { +export const TITLE_ERROR_MODAL = i18n.translate('xpack.modalAllErrors.title', { defaultMessage: 'Your visualization has error(s)', }); -export const CLOSE_ERROR_MODAL = i18n.translate( - 'xpack.securitySolution.modalAllErrors.close.button', - { - defaultMessage: 'Close', - } -); +export const CLOSE_ERROR_MODAL = i18n.translate('xpack.modalAllErrors.close.button', { + defaultMessage: 'Close', +}); diff --git a/x-pack/plugins/cases/public/containers/configure/translations.ts b/x-pack/plugins/cases/public/containers/configure/translations.ts index 455293b217679..e77b9f57c8f4c 100644 --- a/x-pack/plugins/cases/public/containers/configure/translations.ts +++ b/x-pack/plugins/cases/public/containers/configure/translations.ts @@ -9,9 +9,6 @@ import { i18n } from '@kbn/i18n'; export * from '../translations'; -export const SUCCESS_CONFIGURE = i18n.translate( - 'xpack.securitySolution.cases.configure.successSaveToast', - { - defaultMessage: 'Saved external connection settings', - } -); +export const SUCCESS_CONFIGURE = i18n.translate('xpack.cases.configure.successSaveToast', { + defaultMessage: 'Saved external connection settings', +}); diff --git a/x-pack/plugins/cases/public/containers/translations.ts b/x-pack/plugins/cases/public/containers/translations.ts index 2158c96906948..1302f3aae34c2 100644 --- a/x-pack/plugins/cases/public/containers/translations.ts +++ b/x-pack/plugins/cases/public/containers/translations.ts @@ -9,25 +9,22 @@ import { i18n } from '@kbn/i18n'; export * from '../common/translations'; -export const ERROR_TITLE = i18n.translate('xpack.securitySolution.containers.cases.errorTitle', { +export const ERROR_TITLE = i18n.translate('xpack.containers.cases.errorTitle', { defaultMessage: 'Error fetching data', }); -export const ERROR_DELETING = i18n.translate( - 'xpack.securitySolution.containers.cases.errorDeletingTitle', - { - defaultMessage: 'Error deleting data', - } -); +export const ERROR_DELETING = i18n.translate('xpack.containers.cases.errorDeletingTitle', { + defaultMessage: 'Error deleting data', +}); export const UPDATED_CASE = (caseTitle: string) => - i18n.translate('xpack.securitySolution.containers.cases.updatedCase', { + i18n.translate('xpack.containers.cases.updatedCase', { values: { caseTitle }, defaultMessage: 'Updated "{caseTitle}"', }); export const DELETED_CASES = (totalCases: number, caseTitle?: string) => - i18n.translate('xpack.securitySolution.containers.cases.deletedCases', { + i18n.translate('xpack.containers.cases.deletedCases', { values: { caseTitle, totalCases }, defaultMessage: 'Deleted {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', }); @@ -39,7 +36,7 @@ export const CLOSED_CASES = ({ totalCases: number; caseTitle?: string; }) => - i18n.translate('xpack.securitySolution.containers.cases.closedCases', { + i18n.translate('xpack.containers.cases.closedCases', { values: { caseTitle, totalCases }, defaultMessage: 'Closed {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', }); @@ -51,7 +48,7 @@ export const REOPENED_CASES = ({ totalCases: number; caseTitle?: string; }) => - i18n.translate('xpack.securitySolution.containers.cases.reopenedCases', { + i18n.translate('xpack.containers.cases.reopenedCases', { values: { caseTitle, totalCases }, defaultMessage: 'Opened {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', }); @@ -63,33 +60,30 @@ export const MARK_IN_PROGRESS_CASES = ({ totalCases: number; caseTitle?: string; }) => - i18n.translate('xpack.securitySolution.containers.cases.markInProgressCases', { + i18n.translate('xpack.containers.cases.markInProgressCases', { values: { caseTitle, totalCases }, defaultMessage: 'Marked {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}} as in progress', }); export const SUCCESS_SEND_TO_EXTERNAL_SERVICE = (serviceName: string) => - i18n.translate('xpack.securitySolution.containers.cases.pushToExternalService', { + i18n.translate('xpack.containers.cases.pushToExternalService', { values: { serviceName }, defaultMessage: 'Successfully sent to { serviceName }', }); -export const ERROR_GET_FIELDS = i18n.translate( - 'xpack.securitySolution.cases.configure.errorGetFields', - { - defaultMessage: 'Error getting fields from service', - } -); +export const ERROR_GET_FIELDS = i18n.translate('xpack.cases.configure.errorGetFields', { + defaultMessage: 'Error getting fields from service', +}); export const SYNC_CASE = (caseTitle: string) => - i18n.translate('xpack.securitySolution.containers.cases.syncCase', { + i18n.translate('xpack.containers.cases.syncCase', { values: { caseTitle }, defaultMessage: 'Alerts in "{caseTitle}" have been synced', }); export const STATUS_CHANGED_TOASTER_TEXT = i18n.translate( - 'xpack.securitySolution.cases.containers.statusChangeToasterText', + 'xpack.cases.containers.statusChangeToasterText', { defaultMessage: 'Alerts in this case have been also had their status updated', } diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index a45b9c0fb302f..4443688fd249d 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -12,6 +12,7 @@ import { pipe } from 'fp-ts/lib/pipeable'; // eslint-disable-next-line no-restricted-imports import isEmpty from 'lodash/isEmpty'; +import { throwErrors } from '../../../../cases/common'; import { TimelineResponse, TimelineResponseType, @@ -23,13 +24,12 @@ import { } from '../../../common/types/timeline'; import { TimelineInput, TimelineType } from '../../graphql/types'; import { - throwErrors, + TIMELINE_URL, TIMELINE_DRAFT_URL, - TIMELINE_EXPORT_URL, TIMELINE_IMPORT_URL, + TIMELINE_EXPORT_URL, TIMELINE_PREPACKAGED_URL, - TIMELINE_URL, -} from '../../../common'; +} from '../../../common/constants'; import { KibanaServices } from '../../common/lib/kibana'; import { ExportSelectedData } from '../../common/components/generic_downloader'; From 731039a58d6557b23548518cefa0c01914d92f04 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Sat, 13 Mar 2021 17:04:04 -0700 Subject: [PATCH 18/52] add cases to kbn-optimizer/limits.yml --- packages/kbn-optimizer/limits.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index f228f5e93e5ce..345eeccfdddf5 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -107,3 +107,4 @@ pageLoadAssetSize: osquery: 107090 fileUpload: 25664 banners: 17946 + cases: 102558 From debbcb0dfeb124907b443834040f485f4c983c7e Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Sun, 14 Mar 2021 08:00:43 -0600 Subject: [PATCH 19/52] Fix i18n --- .../connectors/connectors_registry.ts | 17 +++--- .../connectors/jira/translations.ts | 14 ++--- .../connectors/servicenow/translations.ts | 61 +++++++------------ .../public/components/create/translations.ts | 8 +-- .../markdown_editor/translations.ts | 6 +- .../components/toasters/translations.ts | 6 +- .../cases/public/containers/translations.ts | 18 +++--- 7 files changed, 56 insertions(+), 74 deletions(-) diff --git a/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts b/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts index 34e0b37d96dbd..2e02cb290c3c8 100644 --- a/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts +++ b/x-pack/plugins/cases/public/components/connectors/connectors_registry.ts @@ -16,15 +16,12 @@ export const createCaseConnectorsRegistry = (): CaseConnectorsRegistry => { register: <UIProps>(connector: CaseConnector<UIProps>) => { if (connectors.has(connector.id)) { throw new Error( - i18n.translate( - 'xpack.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage', - { - defaultMessage: 'Object type "{id}" is already registered.', - values: { - id: connector.id, - }, - } - ) + i18n.translate('xpack.cases.connecors.register.duplicateCaseConnectorErrorMessage', { + defaultMessage: 'Object type "{id}" is already registered.', + values: { + id: connector.id, + }, + }) ); } @@ -33,7 +30,7 @@ export const createCaseConnectorsRegistry = (): CaseConnectorsRegistry => { get: <UIProps>(id: string): CaseConnector<UIProps> => { if (!connectors.has(id)) { throw new Error( - i18n.translate('xpack.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage', { + i18n.translate('xpack.cases.connecors.get.missingCaseConnectorErrorMessage', { defaultMessage: 'Object type "{id}" is not registered.', values: { id, diff --git a/x-pack/plugins/cases/public/components/connectors/jira/translations.ts b/x-pack/plugins/cases/public/components/connectors/jira/translations.ts index 889a7b1ec222b..88dd7d0c7c27b 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/translations.ts @@ -8,48 +8,48 @@ import { i18n } from '@kbn/i18n'; export const ISSUE_TYPES_API_ERROR = i18n.translate( - 'xpack.components.connectors.jira.unableToGetIssueTypesMessage', + 'xpack.cases.connectors.jira.unableToGetIssueTypesMessage', { defaultMessage: 'Unable to get issue types', } ); export const FIELDS_API_ERROR = i18n.translate( - 'xpack.components.connectors.jira.unableToGetFieldsMessage', + 'xpack.cases.connectors.jira.unableToGetFieldsMessage', { defaultMessage: 'Unable to get connectors', } ); export const ISSUES_API_ERROR = i18n.translate( - 'xpack.components.connectors.jira.unableToGetIssuesMessage', + 'xpack.cases.connectors.jira.unableToGetIssuesMessage', { defaultMessage: 'Unable to get issues', } ); export const GET_ISSUE_API_ERROR = (id: string) => - i18n.translate('xpack.components.connectors.jira.unableToGetIssueMessage', { + i18n.translate('xpack.cases.connectors.jira.unableToGetIssueMessage', { defaultMessage: 'Unable to get issue with id {id}', values: { id }, }); export const SEARCH_ISSUES_COMBO_BOX_ARIA_LABEL = i18n.translate( - 'xpack.components.connectors.jira.searchIssuesComboBoxAriaLabel', + 'xpack.cases.connectors.jira.searchIssuesComboBoxAriaLabel', { defaultMessage: 'Type to search', } ); export const SEARCH_ISSUES_PLACEHOLDER = i18n.translate( - 'xpack.components.connectors.jira.searchIssuesComboBoxPlaceholder', + 'xpack.cases.connectors.jira.searchIssuesComboBoxPlaceholder', { defaultMessage: 'Type to search', } ); export const SEARCH_ISSUES_LOADING = i18n.translate( - 'xpack.components.connectors.jira.searchIssuesLoading', + 'xpack.cases.connectors.jira.searchIssuesLoading', { defaultMessage: 'Loading...', } diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts index f99957d0f12dd..fc48ecf17f2c6 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/translations.ts @@ -7,83 +7,68 @@ import { i18n } from '@kbn/i18n'; -export const URGENCY = i18n.translate( - 'xpack.components.connectors.serviceNow.urgencySelectFieldLabel', - { - defaultMessage: 'Urgency', - } -); +export const URGENCY = i18n.translate('xpack.cases.connectors.serviceNow.urgencySelectFieldLabel', { + defaultMessage: 'Urgency', +}); export const SEVERITY = i18n.translate( - 'xpack.components.connectors.serviceNow.severitySelectFieldLabel', + 'xpack.cases.connectors.serviceNow.severitySelectFieldLabel', { defaultMessage: 'Severity', } ); -export const IMPACT = i18n.translate( - 'xpack.components.connectors.serviceNow.impactSelectFieldLabel', - { - defaultMessage: 'Impact', - } -); +export const IMPACT = i18n.translate('xpack.cases.connectors.serviceNow.impactSelectFieldLabel', { + defaultMessage: 'Impact', +}); export const CHOICES_API_ERROR = i18n.translate( - 'xpack.components.connectors.serviceNow.unableToGetChoicesMessage', + 'xpack.cases.connectors.serviceNow.unableToGetChoicesMessage', { defaultMessage: 'Unable to get choices', } ); -export const MALWARE_URL = i18n.translate( - 'xpack.components.connectors.serviceNow.malwareURLTitle', - { - defaultMessage: 'Malware URL', - } -); +export const MALWARE_URL = i18n.translate('xpack.cases.connectors.serviceNow.malwareURLTitle', { + defaultMessage: 'Malware URL', +}); -export const MALWARE_HASH = i18n.translate( - 'xpack.components.connectors.serviceNow.malwareHashTitle', - { - defaultMessage: 'Malware Hash', - } -); +export const MALWARE_HASH = i18n.translate('xpack.cases.connectors.serviceNow.malwareHashTitle', { + defaultMessage: 'Malware Hash', +}); -export const CATEGORY = i18n.translate('xpack.components.connectors.serviceNow.categoryTitle', { +export const CATEGORY = i18n.translate('xpack.cases.connectors.serviceNow.categoryTitle', { defaultMessage: 'Category', }); -export const SUBCATEGORY = i18n.translate( - 'xpack.components.connectors.serviceNow.subcategoryTitle', - { - defaultMessage: 'Subcategory', - } -); +export const SUBCATEGORY = i18n.translate('xpack.cases.connectors.serviceNow.subcategoryTitle', { + defaultMessage: 'Subcategory', +}); -export const SOURCE_IP = i18n.translate('xpack.components.connectors.serviceNow.sourceIPTitle', { +export const SOURCE_IP = i18n.translate('xpack.cases.connectors.serviceNow.sourceIPTitle', { defaultMessage: 'Source IP', }); -export const DEST_IP = i18n.translate('xpack.components.connectors.serviceNow.destinationIPTitle', { +export const DEST_IP = i18n.translate('xpack.cases.connectors.serviceNow.destinationIPTitle', { defaultMessage: 'Destination IP', }); export const PRIORITY = i18n.translate( - 'xpack.components.connectors.serviceNow.prioritySelectFieldTitle', + 'xpack.cases.connectors.serviceNow.prioritySelectFieldTitle', { defaultMessage: 'Priority', } ); export const ALERT_FIELDS_LABEL = i18n.translate( - 'xpack.components.connectors.serviceNow.alertFieldsTitle', + 'xpack.cases.connectors.serviceNow.alertFieldsTitle', { defaultMessage: 'Select Observables to push', } ); export const ALERT_FIELD_ENABLED_TEXT = i18n.translate( - 'xpack.components.connectors.serviceNow.alertFieldEnabledText', + 'xpack.cases.connectors.serviceNow.alertFieldEnabledText', { defaultMessage: 'Yes', } diff --git a/x-pack/plugins/cases/public/components/create/translations.ts b/x-pack/plugins/cases/public/components/create/translations.ts index d24d699dbb0f4..7e0f7e5a6b9d5 100644 --- a/x-pack/plugins/cases/public/components/create/translations.ts +++ b/x-pack/plugins/cases/public/components/create/translations.ts @@ -9,18 +9,18 @@ import { i18n } from '@kbn/i18n'; export * from '../../common/translations'; -export const STEP_ONE_TITLE = i18n.translate('xpack.components.create.stepOneTitle', { +export const STEP_ONE_TITLE = i18n.translate('xpack.cases.create.stepOneTitle', { defaultMessage: 'Case fields', }); -export const STEP_TWO_TITLE = i18n.translate('xpack.components.create.stepTwoTitle', { +export const STEP_TWO_TITLE = i18n.translate('xpack.cases.create.stepTwoTitle', { defaultMessage: 'Case settings', }); -export const STEP_THREE_TITLE = i18n.translate('xpack.components.create.stepThreeTitle', { +export const STEP_THREE_TITLE = i18n.translate('xpack.cases.create.stepThreeTitle', { defaultMessage: 'External Connector Fields', }); -export const SYNC_ALERTS_LABEL = i18n.translate('xpack.components.create.syncAlertsLabel', { +export const SYNC_ALERTS_LABEL = i18n.translate('xpack.cases.create.syncAlertsLabel', { defaultMessage: 'Sync alert status with case status', }); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/translations.ts b/x-pack/plugins/cases/public/components/markdown_editor/translations.ts index c0dd13cef665b..365738f53ef8a 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/translations.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/translations.ts @@ -7,13 +7,13 @@ import { i18n } from '@kbn/i18n'; -export const MARKDOWN_SYNTAX_HELP = i18n.translate('xpack.markdownEditor.markdownInputHelp', { +export const MARKDOWN_SYNTAX_HELP = i18n.translate('xpack.cases.markdownEditor.markdownInputHelp', { defaultMessage: 'Markdown syntax help', }); -export const MARKDOWN = i18n.translate('xpack.markdownEditor.markdown', { +export const MARKDOWN = i18n.translate('xpack.cases.markdownEditor.markdown', { defaultMessage: 'Markdown', }); -export const PREVIEW = i18n.translate('xpack.markdownEditor.preview', { +export const PREVIEW = i18n.translate('xpack.cases.markdownEditor.preview', { defaultMessage: 'Preview', }); diff --git a/x-pack/plugins/cases/public/components/toasters/translations.ts b/x-pack/plugins/cases/public/components/toasters/translations.ts index 4b91eaa3d3ec1..cf7fac462a122 100644 --- a/x-pack/plugins/cases/public/components/toasters/translations.ts +++ b/x-pack/plugins/cases/public/components/toasters/translations.ts @@ -7,14 +7,14 @@ import { i18n } from '@kbn/i18n'; -export const SEE_ALL_ERRORS = i18n.translate('xpack.modalAllErrors.seeAllErrors.button', { +export const SEE_ALL_ERRORS = i18n.translate('xpack.cases.modalAllErrors.seeAllErrors.button', { defaultMessage: 'See the full error(s)', }); -export const TITLE_ERROR_MODAL = i18n.translate('xpack.modalAllErrors.title', { +export const TITLE_ERROR_MODAL = i18n.translate('xpack.cases.modalAllErrors.title', { defaultMessage: 'Your visualization has error(s)', }); -export const CLOSE_ERROR_MODAL = i18n.translate('xpack.modalAllErrors.close.button', { +export const CLOSE_ERROR_MODAL = i18n.translate('xpack.cases.modalAllErrors.close.button', { defaultMessage: 'Close', }); diff --git a/x-pack/plugins/cases/public/containers/translations.ts b/x-pack/plugins/cases/public/containers/translations.ts index 1302f3aae34c2..966a5e158923f 100644 --- a/x-pack/plugins/cases/public/containers/translations.ts +++ b/x-pack/plugins/cases/public/containers/translations.ts @@ -9,22 +9,22 @@ import { i18n } from '@kbn/i18n'; export * from '../common/translations'; -export const ERROR_TITLE = i18n.translate('xpack.containers.cases.errorTitle', { +export const ERROR_TITLE = i18n.translate('xpack.cases.containers.errorTitle', { defaultMessage: 'Error fetching data', }); -export const ERROR_DELETING = i18n.translate('xpack.containers.cases.errorDeletingTitle', { +export const ERROR_DELETING = i18n.translate('xpack.cases.containers.errorDeletingTitle', { defaultMessage: 'Error deleting data', }); export const UPDATED_CASE = (caseTitle: string) => - i18n.translate('xpack.containers.cases.updatedCase', { + i18n.translate('xpack.cases.containers.updatedCase', { values: { caseTitle }, defaultMessage: 'Updated "{caseTitle}"', }); export const DELETED_CASES = (totalCases: number, caseTitle?: string) => - i18n.translate('xpack.containers.cases.deletedCases', { + i18n.translate('xpack.cases.containers.deletedCases', { values: { caseTitle, totalCases }, defaultMessage: 'Deleted {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', }); @@ -36,7 +36,7 @@ export const CLOSED_CASES = ({ totalCases: number; caseTitle?: string; }) => - i18n.translate('xpack.containers.cases.closedCases', { + i18n.translate('xpack.cases.containers.closedCases', { values: { caseTitle, totalCases }, defaultMessage: 'Closed {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', }); @@ -48,7 +48,7 @@ export const REOPENED_CASES = ({ totalCases: number; caseTitle?: string; }) => - i18n.translate('xpack.containers.cases.reopenedCases', { + i18n.translate('xpack.cases.containers.reopenedCases', { values: { caseTitle, totalCases }, defaultMessage: 'Opened {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', }); @@ -60,14 +60,14 @@ export const MARK_IN_PROGRESS_CASES = ({ totalCases: number; caseTitle?: string; }) => - i18n.translate('xpack.containers.cases.markInProgressCases', { + i18n.translate('xpack.cases.containers.markInProgressCases', { values: { caseTitle, totalCases }, defaultMessage: 'Marked {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}} as in progress', }); export const SUCCESS_SEND_TO_EXTERNAL_SERVICE = (serviceName: string) => - i18n.translate('xpack.containers.cases.pushToExternalService', { + i18n.translate('xpack.cases.containers.pushToExternalService', { values: { serviceName }, defaultMessage: 'Successfully sent to { serviceName }', }); @@ -77,7 +77,7 @@ export const ERROR_GET_FIELDS = i18n.translate('xpack.cases.configure.errorGetFi }); export const SYNC_CASE = (caseTitle: string) => - i18n.translate('xpack.containers.cases.syncCase', { + i18n.translate('xpack.cases.containers.syncCase', { values: { caseTitle }, defaultMessage: 'Alerts in "{caseTitle}" have been synced', }); From 907bfc1b055348b50292fa0e3d0f14ee7a73b3b7 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 16 Mar 2021 07:21:42 -0600 Subject: [PATCH 20/52] pr changes --- x-pack/plugins/cases/common/constants.ts | 2 ++ .../cases/public/common/lib/kibana/services.ts | 2 +- .../components/configure_cases/translations.ts | 15 +++++++-------- .../components/markdown_editor/constants.ts | 8 -------- x-pack/plugins/cases/public/get_create_case.tsx | 3 ++- x-pack/plugins/cases/public/plugin.ts | 9 +-------- x-pack/plugins/cases/public/types.ts | 9 +++++++-- x-pack/plugins/cases/server/client/cases/utils.ts | 2 +- .../plugins/security_solution/common/constants.ts | 2 ++ 9 files changed, 23 insertions(+), 29 deletions(-) delete mode 100644 x-pack/plugins/cases/public/components/markdown_editor/constants.ts diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index 337804dd23692..d779ccd0b7ab0 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -5,6 +5,8 @@ * 2.0. */ +// The DEFAULT_MAX_SIGNALS value should match the one in `x-pack/plugins/security_solution/common/constants.ts` +// If either changes, engineer should ensure both values are updated const DEFAULT_MAX_SIGNALS = 100; export const APP_ID = 'cases'; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/services.ts b/x-pack/plugins/cases/public/common/lib/kibana/services.ts index 3b492fb45c87f..94487bd3ca5e9 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/services.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/services.ts @@ -36,7 +36,7 @@ export class KibanaServices { private static throwUninitializedError(): never { throw new Error( - 'Kibana services not initialized - are you trying to import this module from outside of the SIEM app?' + 'Kibana services not initialized - are you trying to import this module from outside of the Cases app?' ); } } diff --git a/x-pack/plugins/cases/public/components/configure_cases/translations.ts b/x-pack/plugins/cases/public/components/configure_cases/translations.ts index 1155c54e043b0..2fb2133ba470c 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/translations.ts +++ b/x-pack/plugins/cases/public/components/configure_cases/translations.ts @@ -20,7 +20,7 @@ export const INCIDENT_MANAGEMENT_SYSTEM_DESC = i18n.translate( 'xpack.cases.configureCases.incidentManagementSystemDesc', { defaultMessage: - 'You may optionally connect Security cases to an external incident management system of your choosing. This will allow you to push case data as an incident in your chosen third-party system.', + 'You may optionally connect cases to an external incident management system of your choosing. This will allow you to push case data as an incident in your chosen third-party system.', } ); @@ -46,7 +46,7 @@ export const CASE_CLOSURE_OPTIONS_DESC = i18n.translate( 'xpack.cases.configureCases.caseClosureOptionsDesc', { defaultMessage: - 'Define how you wish Security cases to be closed. Automated case closures require an established connection to an external incident management system.', + 'Define how you wish cases to be closed. Automated case closures require an established connection to an external incident management system.', } ); @@ -67,22 +67,21 @@ export const CASE_CLOSURE_OPTIONS_LABEL = i18n.translate( export const CASE_CLOSURE_OPTIONS_MANUAL = i18n.translate( 'xpack.cases.configureCases.caseClosureOptionsManual', { - defaultMessage: 'Manually close Security cases', + defaultMessage: 'Manually close cases', } ); export const CASE_CLOSURE_OPTIONS_NEW_INCIDENT = i18n.translate( 'xpack.cases.configureCases.caseClosureOptionsNewIncident', { - defaultMessage: - 'Automatically close Security cases when pushing new incident to external system', + defaultMessage: 'Automatically close cases when pushing new incident to external system', } ); export const CASE_CLOSURE_OPTIONS_CLOSED_INCIDENT = i18n.translate( 'xpack.cases.configureCases.caseClosureOptionsClosedIncident', { - defaultMessage: 'Automatically close Security cases when incident is closed in external system', + defaultMessage: 'Automatically close cases when incident is closed in external system', } ); export const FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { @@ -96,7 +95,7 @@ export const FIELD_MAPPING_DESC = (thirdPartyName: string): string => { return i18n.translate('xpack.cases.configureCases.fieldMappingDesc', { values: { thirdPartyName }, defaultMessage: - 'Map Security Case fields to { thirdPartyName } fields when pushing data to { thirdPartyName }. Field mappings require an established connection to { thirdPartyName }.', + 'Map Case fields to { thirdPartyName } fields when pushing data to { thirdPartyName }. Field mappings require an established connection to { thirdPartyName }.', }); }; @@ -117,7 +116,7 @@ export const EDIT_FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { export const FIELD_MAPPING_FIRST_COL = i18n.translate( 'xpack.cases.configureCases.fieldMappingFirstCol', { - defaultMessage: 'Security case field', + defaultMessage: 'Kibana case field', } ); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/constants.ts b/x-pack/plugins/cases/public/components/markdown_editor/constants.ts deleted file mode 100644 index 58b99f47271fc..0000000000000 --- a/x-pack/plugins/cases/public/components/markdown_editor/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export const MARKDOWN_HELP_LINK = 'https://www.markdownguide.org/cheat-sheet/'; diff --git a/x-pack/plugins/cases/public/get_create_case.tsx b/x-pack/plugins/cases/public/get_create_case.tsx index 7f0e3e527b552..ec13d9ae9e305 100644 --- a/x-pack/plugins/cases/public/get_create_case.tsx +++ b/x-pack/plugins/cases/public/get_create_case.tsx @@ -6,12 +6,13 @@ */ import React, { lazy, Suspense } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; import { CreateCaseProps } from './components/create'; export const getCreateCaseLazy = (props: CreateCaseProps) => { const CreateCaseLazy = lazy(() => import('./components/create')); return ( - <Suspense fallback={null}> + <Suspense fallback={<EuiLoadingSpinner />}> <CreateCaseLazy {...props} /> </Suspense> ); diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index c0ec1073d9bad..c594e8677a086 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -6,18 +6,11 @@ */ import { CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; -import { ReactElement } from 'react'; import { TestComponent } from '.'; -import { CreateCaseProps } from './components/create'; -import { SetupPlugins, StartPlugins } from './types'; +import { CasesUiStart, SetupPlugins, StartPlugins } from './types'; import { getCreateCaseLazy } from './get_create_case'; import { KibanaServices } from './common/lib/kibana'; -export interface CasesUiStart { - casesComponent: () => JSX.Element; - getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; -} - export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { private kibanaVersion: string; diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index 0b94f6f17817b..07a0b2c723914 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -6,10 +6,12 @@ */ import { CoreStart } from 'kibana/public'; +import { ReactElement } from 'react'; import { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; +import { CreateCaseProps } from './components/create'; export interface SetupPlugins { triggersActionsUi: TriggersActionsSetup; @@ -19,6 +21,9 @@ export interface StartPlugins { triggersActionsUi: TriggersActionsStart; } -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface PluginStart {} export type StartServices = CoreStart & StartPlugins; + +export interface CasesUiStart { + casesComponent: () => JSX.Element; + getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; +} diff --git a/x-pack/plugins/cases/server/client/cases/utils.ts b/x-pack/plugins/cases/server/client/cases/utils.ts index a0a0b8f0eae3c..7749bce8042eb 100644 --- a/x-pack/plugins/cases/server/client/cases/utils.ts +++ b/x-pack/plugins/cases/server/client/cases/utils.ts @@ -184,7 +184,7 @@ export const createIncident = async ({ if (totalAlerts > 0) { comments.push({ - comment: `Elastic Security Alerts attached to the case: ${totalAlerts}`, + comment: `Elastic Alerts attached to the case: ${totalAlerts}`, commentId: `${theCase.id}-total-alerts`, }); } diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 3b23539f3ac0f..47606983b8368 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -23,6 +23,8 @@ export const DEFAULT_REFRESH_RATE_INTERVAL = 'timepicker:refreshIntervalDefaults export const DEFAULT_APP_TIME_RANGE = 'securitySolution:timeDefaults'; export const DEFAULT_APP_REFRESH_INTERVAL = 'securitySolution:refreshIntervalDefaults'; export const DEFAULT_SIGNALS_INDEX = '.siem-signals'; +// The DEFAULT_MAX_SIGNALS value exists also in `x-pack/plugins/cases/common/constants.ts` +// If either changes, engineer should ensure both values are updated export const DEFAULT_MAX_SIGNALS = 100; export const DEFAULT_SEARCH_AFTER_PAGE_SIZE = 100; export const DEFAULT_ANOMALY_SCORE = 'securitySolution:defaultAnomalyScore'; From 82cd0967fbd2aef37c8f1c70c08ad9e51ac298b5 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 16 Mar 2021 09:25:26 -0600 Subject: [PATCH 21/52] fix type and test --- x-pack/plugins/cases/server/client/cases/utils.test.ts | 4 ++-- x-pack/plugins/security_solution/public/types.ts | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/cases/server/client/cases/utils.test.ts b/x-pack/plugins/cases/server/client/cases/utils.test.ts index 859114a5e8fb0..c24812048376e 100644 --- a/x-pack/plugins/cases/server/client/cases/utils.test.ts +++ b/x-pack/plugins/cases/server/client/cases/utils.test.ts @@ -539,7 +539,7 @@ describe('utils', () => { commentId: 'comment-user-1', }, { - comment: 'Elastic Security Alerts attached to the case: 3', + comment: 'Elastic Alerts attached to the case: 3', commentId: 'mock-id-1-total-alerts', }, ]); @@ -569,7 +569,7 @@ describe('utils', () => { commentId: 'comment-user-1', }, { - comment: 'Elastic Security Alerts attached to the case: 4', + comment: 'Elastic Alerts attached to the case: 4', commentId: 'mock-id-1-total-alerts', }, ]); diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index e3d2c345a2a66..a1fda3c509714 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -22,7 +22,6 @@ import { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; -import { CasesUiStart } from '../../cases/public'; import { SecurityPluginSetup } from '../../security/public'; import { ResolverPluginSetup } from './resolver/types'; import { Inspect } from '../common/search_strategy'; @@ -70,8 +69,6 @@ export type StartServices = CoreStart & export interface PluginSetup { resolver: () => Promise<ResolverPluginSetup>; } -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface PluginStart {} export interface AppObservableLibs extends AppFrontendLibs { kibana: CoreStart; From 1cb391781513615061eb3f9fa2506cee2e86e3b2 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 16 Mar 2021 11:16:28 -0600 Subject: [PATCH 22/52] fix a gosh darn silly type --- x-pack/plugins/cases/public/index.tsx | 1 + x-pack/plugins/security_solution/public/index.ts | 4 ++-- x-pack/plugins/security_solution/public/types.ts | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/cases/public/index.tsx b/x-pack/plugins/cases/public/index.tsx index 5a96241be4621..1cf2d2e8d7067 100644 --- a/x-pack/plugins/cases/public/index.tsx +++ b/x-pack/plugins/cases/public/index.tsx @@ -17,3 +17,4 @@ export function plugin(initializerContext: PluginInitializerContext) { export { CasesUiPlugin }; export * from './plugin'; +export * from './types'; diff --git a/x-pack/plugins/security_solution/public/index.ts b/x-pack/plugins/security_solution/public/index.ts index f1d1bc3e6280b..55262fe039b4e 100644 --- a/x-pack/plugins/security_solution/public/index.ts +++ b/x-pack/plugins/security_solution/public/index.ts @@ -7,8 +7,8 @@ import { PluginInitializerContext } from '../../../../src/core/public'; import { Plugin } from './plugin'; -import { PluginSetup, PluginStart } from './types'; +import { PluginSetup } from './types'; export const plugin = (context: PluginInitializerContext): Plugin => new Plugin(context); -export { Plugin, PluginSetup, PluginStart }; +export { Plugin, PluginSetup }; diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index a1fda3c509714..e3d2c345a2a66 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -22,6 +22,7 @@ import { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; +import { CasesUiStart } from '../../cases/public'; import { SecurityPluginSetup } from '../../security/public'; import { ResolverPluginSetup } from './resolver/types'; import { Inspect } from '../common/search_strategy'; @@ -69,6 +70,8 @@ export type StartServices = CoreStart & export interface PluginSetup { resolver: () => Promise<ResolverPluginSetup>; } +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginStart {} export interface AppObservableLibs extends AppFrontendLibs { kibana: CoreStart; From 6d04fb3765dd62f89bf6444030a4db01edc1ad6b Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 16 Mar 2021 11:22:22 -0600 Subject: [PATCH 23/52] one more Security remove --- x-pack/plugins/cases/public/common/errors.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/cases/public/common/errors.ts b/x-pack/plugins/cases/public/common/errors.ts index 198757e9ceade..6edef08c1f4b1 100644 --- a/x-pack/plugins/cases/public/common/errors.ts +++ b/x-pack/plugins/cases/public/common/errors.ts @@ -22,7 +22,7 @@ export interface KibanaError extends AppError { }; } -export interface SecurityAppError extends AppError { +export interface CasesAppError extends AppError { body: { message: string; status_code: number; @@ -32,8 +32,8 @@ export interface SecurityAppError extends AppError { export const isKibanaError = (error: unknown): error is KibanaError => has('message', error) && has('body.message', error) && has('body.statusCode', error); -export const isSecurityAppError = (error: unknown): error is SecurityAppError => +export const isCasesAppError = (error: unknown): error is CasesAppError => has('message', error) && has('body.message', error) && has('body.status_code', error); export const isAppError = (error: unknown): error is AppError => - isKibanaError(error) || isSecurityAppError(error); + isKibanaError(error) || isCasesAppError(error); From 46a801e43177fe807ce8afb6af68211c8221be32 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 16 Mar 2021 12:35:29 -0600 Subject: [PATCH 24/52] add prop for afterCaseCreated to make christos happiest boy in greece --- x-pack/plugins/cases/public/components/create/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index a3bf0b517fa06..192effb6adb24 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -25,12 +25,13 @@ const Container = styled.div` `; export interface CreateCaseProps { + afterCaseCreated?: (theCase: Case) => Promise<void>; onCancel: () => void; onSuccess: (theCase: Case) => Promise<void>; } -export const CreateCase = ({ onCancel, onSuccess }: CreateCaseProps) => ( - <FormContext onSuccess={onSuccess}> +export const CreateCase = ({ afterCaseCreated, onCancel, onSuccess }: CreateCaseProps) => ( + <FormContext afterCaseCreated={afterCaseCreated} onSuccess={onSuccess}> <CreateCaseForm /> <Container> <EuiFlexGroup alignItems="center" justifyContent="flexEnd" gutterSize="xs" responsive={false}> From 6b87eb04c9a8891f9e81e5000af5b5eadc9cd714 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Mon, 22 Mar 2021 15:01:48 -0400 Subject: [PATCH 25/52] [Security Solution][Cases] - Migrate all cases page (#94992) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-optimizer/limits.yml | 2 +- x-pack/plugins/cases/common/constants.ts | 6 + x-pack/plugins/cases/kibana.json | 2 +- .../cases/public/common/lib/kibana/hooks.ts | 132 +++ .../cases/public/common/lib/kibana/index.ts | 1 + .../public/common/lib/kibana/kibana_react.ts | 4 +- .../cases/public/common/mock/match_media.ts | 16 + .../cases/public/common/translations.ts | 4 + .../public/components/all_cases/actions.tsx | 93 ++ .../components/all_cases/columns.test.tsx | 41 + .../public/components/all_cases/columns.tsx | 279 ++++++ .../components/all_cases/expanded_row.tsx | 80 ++ .../public/components/all_cases/helpers.ts | 47 + .../components/all_cases/index.test.tsx | 937 ++++++++++++++++++ .../public/components/all_cases/index.tsx | 607 ++++++++++++ .../all_cases/status_filter.test.tsx | 86 ++ .../components/all_cases/status_filter.tsx | 53 + .../all_cases/table_filters.test.tsx | 171 ++++ .../components/all_cases/table_filters.tsx | 196 ++++ .../components/all_cases/translations.ts | 91 ++ .../public/components/all_cases/types.ts | 26 + .../public/components/bulk_actions/index.tsx | 112 +++ .../components/bulk_actions/translations.ts | 15 + .../components/callout/callout.test.tsx | 90 ++ .../public/components/callout/callout.tsx | 54 + .../components/callout/helpers.test.tsx | 29 + .../public/components/callout/helpers.tsx | 22 + .../public/components/callout/index.test.tsx | 217 ++++ .../cases/public/components/callout/index.tsx | 103 ++ .../public/components/callout/translations.ts | 24 + .../cases/public/components/callout/types.ts | 13 + .../components/case_header_page/index.tsx | 14 + .../configure_cases/button.test.tsx | 111 +++ .../components/configure_cases/button.tsx | 61 ++ .../components/confirm_delete_case/index.tsx | 52 + .../confirm_delete_case/translations.ts | 36 + .../__snapshots__/empty_value.test.tsx.snap | 7 + .../empty_value/empty_value.test.tsx | 166 ++++ .../public/components/empty_value/index.tsx | 49 + .../components/empty_value/translations.ts | 12 + .../components/filter_popover/index.tsx | 119 +++ .../__snapshots__/index.test.tsx.snap | 9 + .../components/formatted_date/index.test.tsx | 170 ++++ .../components/formatted_date/index.tsx | 173 ++++ .../formatted_date/maybe_date.test.ts | 46 + .../components/formatted_date/maybe_date.ts | 22 + .../editable_title.test.tsx.snap | 27 + .../__snapshots__/index.test.tsx.snap | 40 + .../__snapshots__/title.test.tsx.snap | 19 + .../header_page/editable_title.test.tsx | 172 ++++ .../components/header_page/editable_title.tsx | 123 +++ .../components/header_page/index.test.tsx | 157 +++ .../public/components/header_page/index.tsx | 128 +++ .../components/header_page/title.test.tsx | 39 + .../public/components/header_page/title.tsx | 54 + .../components/header_page/translations.ts | 22 + .../public/components/header_page/types.ts | 20 + .../__snapshots__/index.test.tsx.snap | 20 + .../components/link_icon/index.test.tsx | 95 ++ .../public/components/link_icon/index.tsx | 106 ++ .../cases/public/components/links/index.tsx | 61 ++ .../public/components/links/translations.ts | 14 + .../localized_date_tooltip/index.test.tsx | 49 + .../localized_date_tooltip/index.tsx | 48 + .../public/components/panel/index.test.tsx | 17 + .../cases/public/components/panel/index.tsx | 37 + .../__snapshots__/index.test.tsx.snap | 11 + .../public/components/subtitle/index.test.tsx | 70 ++ .../public/components/subtitle/index.tsx | 75 ++ .../use_push_to_service/helpers.tsx | 66 ++ .../use_push_to_service/index.test.tsx | 269 +++++ .../components/use_push_to_service/index.tsx | 203 ++++ .../use_push_to_service/translations.ts | 90 ++ .../__snapshots__/utility_bar.test.tsx.snap | 30 + .../utility_bar_action.test.tsx.snap | 9 + .../utility_bar_group.test.tsx.snap | 9 + .../utility_bar_section.test.tsx.snap | 11 + .../utility_bar_text.test.tsx.snap | 7 + .../public/components/utility_bar/index.ts | 13 + .../public/components/utility_bar/styles.tsx | 144 +++ .../utility_bar/utility_bar.test.tsx | 109 ++ .../components/utility_bar/utility_bar.tsx | 20 + .../utility_bar/utility_bar_action.test.tsx | 36 + .../utility_bar/utility_bar_action.tsx | 97 ++ .../utility_bar/utility_bar_group.test.tsx | 26 + .../utility_bar/utility_bar_group.tsx | 20 + .../utility_bar/utility_bar_section.test.tsx | 28 + .../utility_bar/utility_bar_section.tsx | 20 + .../utility_bar/utility_bar_spacer.tsx | 20 + .../utility_bar/utility_bar_text.test.tsx | 24 + .../utility_bar/utility_bar_text.tsx | 21 + .../containers/use_bulk_update_case.test.tsx | 130 +++ .../containers/use_bulk_update_case.tsx | 153 +++ .../containers/use_delete_cases.test.tsx | 131 +++ .../public/containers/use_delete_cases.tsx | 147 +++ .../use_get_action_license.test.tsx | 90 ++ .../containers/use_get_action_license.tsx | 85 ++ .../use_get_case_user_actions.test.tsx | 710 +++++++++++++ .../containers/use_get_case_user_actions.tsx | 325 ++++++ .../containers/use_get_cases_status.test.tsx | 92 ++ .../containers/use_get_cases_status.tsx | 92 ++ .../containers/use_get_reporters.test.tsx | 100 ++ .../public/containers/use_get_reporters.tsx | 95 ++ .../containers/use_messages_storage.test.tsx | 97 ++ .../containers/use_messages_storage.tsx | 64 ++ x-pack/plugins/cases/public/get_all_cases.tsx | 19 + x-pack/plugins/cases/public/index.tsx | 3 - x-pack/plugins/cases/public/plugin.ts | 6 +- x-pack/plugins/cases/public/types.ts | 16 +- .../cases/public/utils/use_mount_appended.ts | 30 + .../cases/components/all_cases/index.tsx | 48 +- .../local_storage/use_messages_storage.tsx | 2 +- 112 files changed, 9697 insertions(+), 14 deletions(-) create mode 100644 x-pack/plugins/cases/public/common/lib/kibana/hooks.ts create mode 100644 x-pack/plugins/cases/public/common/mock/match_media.ts create mode 100644 x-pack/plugins/cases/public/components/all_cases/actions.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/columns.test.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/columns.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/helpers.ts create mode 100644 x-pack/plugins/cases/public/components/all_cases/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/index.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/status_filter.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/table_filters.test.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/table_filters.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/translations.ts create mode 100644 x-pack/plugins/cases/public/components/all_cases/types.ts create mode 100644 x-pack/plugins/cases/public/components/bulk_actions/index.tsx create mode 100644 x-pack/plugins/cases/public/components/bulk_actions/translations.ts create mode 100644 x-pack/plugins/cases/public/components/callout/callout.test.tsx create mode 100644 x-pack/plugins/cases/public/components/callout/callout.tsx create mode 100644 x-pack/plugins/cases/public/components/callout/helpers.test.tsx create mode 100644 x-pack/plugins/cases/public/components/callout/helpers.tsx create mode 100644 x-pack/plugins/cases/public/components/callout/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/callout/index.tsx create mode 100644 x-pack/plugins/cases/public/components/callout/translations.ts create mode 100644 x-pack/plugins/cases/public/components/callout/types.ts create mode 100644 x-pack/plugins/cases/public/components/case_header_page/index.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/button.test.tsx create mode 100644 x-pack/plugins/cases/public/components/configure_cases/button.tsx create mode 100644 x-pack/plugins/cases/public/components/confirm_delete_case/index.tsx create mode 100644 x-pack/plugins/cases/public/components/confirm_delete_case/translations.ts create mode 100644 x-pack/plugins/cases/public/components/empty_value/__snapshots__/empty_value.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx create mode 100644 x-pack/plugins/cases/public/components/empty_value/index.tsx create mode 100644 x-pack/plugins/cases/public/components/empty_value/translations.ts create mode 100644 x-pack/plugins/cases/public/components/filter_popover/index.tsx create mode 100644 x-pack/plugins/cases/public/components/formatted_date/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/formatted_date/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/formatted_date/index.tsx create mode 100644 x-pack/plugins/cases/public/components/formatted_date/maybe_date.test.ts create mode 100644 x-pack/plugins/cases/public/components/formatted_date/maybe_date.ts create mode 100644 x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx create mode 100644 x-pack/plugins/cases/public/components/header_page/editable_title.tsx create mode 100644 x-pack/plugins/cases/public/components/header_page/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/header_page/index.tsx create mode 100644 x-pack/plugins/cases/public/components/header_page/title.test.tsx create mode 100644 x-pack/plugins/cases/public/components/header_page/title.tsx create mode 100644 x-pack/plugins/cases/public/components/header_page/translations.ts create mode 100644 x-pack/plugins/cases/public/components/header_page/types.ts create mode 100644 x-pack/plugins/cases/public/components/link_icon/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/link_icon/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/link_icon/index.tsx create mode 100644 x-pack/plugins/cases/public/components/links/index.tsx create mode 100644 x-pack/plugins/cases/public/components/links/translations.ts create mode 100644 x-pack/plugins/cases/public/components/localized_date_tooltip/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/localized_date_tooltip/index.tsx create mode 100644 x-pack/plugins/cases/public/components/panel/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/panel/index.tsx create mode 100644 x-pack/plugins/cases/public/components/subtitle/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/subtitle/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/subtitle/index.tsx create mode 100644 x-pack/plugins/cases/public/components/use_push_to_service/helpers.tsx create mode 100644 x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/use_push_to_service/index.tsx create mode 100644 x-pack/plugins/cases/public/components/use_push_to_service/translations.ts create mode 100644 x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap create mode 100644 x-pack/plugins/cases/public/components/utility_bar/index.ts create mode 100644 x-pack/plugins/cases/public/components/utility_bar/styles.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar.test.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.test.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.test.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.test.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_spacer.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.test.tsx create mode 100644 x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_delete_cases.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_action_license.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_cases_status.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_reporters.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_messages_storage.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_messages_storage.tsx create mode 100644 x-pack/plugins/cases/public/get_all_cases.tsx create mode 100644 x-pack/plugins/cases/public/utils/use_mount_appended.ts diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 1af74aa3d8828..5cb4573d66b35 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -108,4 +108,4 @@ pageLoadAssetSize: fileUpload: 25664 banners: 17946 mapsEms: 26072 - cases: 102558 + cases: 162385 diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index d779ccd0b7ab0..b03a32fc06451 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -8,6 +8,9 @@ // The DEFAULT_MAX_SIGNALS value should match the one in `x-pack/plugins/security_solution/common/constants.ts` // If either changes, engineer should ensure both values are updated const DEFAULT_MAX_SIGNALS = 100; +export const DEFAULT_DATE_FORMAT = 'dateFormat'; +export const DEFAULT_DATE_FORMAT_TZ = 'dateFormat:tz'; + export const APP_ID = 'cases'; /** @@ -56,3 +59,6 @@ export const SUPPORTED_CONNECTORS = [ export const MAX_ALERTS_PER_SUB_CASE = 5000; export const MAX_GENERATED_ALERTS_PER_SUB_CASE = MAX_ALERTS_PER_SUB_CASE / DEFAULT_MAX_SIGNALS; + +/** This Kibana Advanced Setting specifies the URLs of `IP Reputation Links`*/ +export const IP_REPUTATION_LINKS_SETTING = 'cases:ipReputationLinks'; diff --git a/x-pack/plugins/cases/kibana.json b/x-pack/plugins/cases/kibana.json index 27b36d7e86e1f..4a534c29de804 100644 --- a/x-pack/plugins/cases/kibana.json +++ b/x-pack/plugins/cases/kibana.json @@ -3,7 +3,7 @@ "id": "cases", "kibanaVersion": "kibana", "extraPublicDirs": ["common"], - "requiredPlugins": ["actions", "esUiShared", "kibanaReact", "triggersActionsUi"], + "requiredPlugins": ["actions", "esUiShared", "kibanaReact", "kibanaUtils", "triggersActionsUi"], "optionalPlugins": [ "spaces", "security" diff --git a/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts b/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts new file mode 100644 index 0000000000000..4cce307cc54e2 --- /dev/null +++ b/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts @@ -0,0 +1,132 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import moment from 'moment-timezone'; + +import { useCallback, useEffect, useState } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../../common/constants'; +import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { AuthenticatedUser } from '../../../../../security/common/model'; +import { convertToCamelCase } from '../../../containers/utils'; +import { StartServices } from '../../../types'; +import { useUiSetting, useKibana } from './kibana_react'; + +export const useDateFormat = (): string => useUiSetting<string>(DEFAULT_DATE_FORMAT); + +export const useTimeZone = (): string => { + const timeZone = useUiSetting<string>(DEFAULT_DATE_FORMAT_TZ); + return timeZone === 'Browser' ? moment.tz.guess() : timeZone; +}; + +export const useBasePath = (): string => useKibana().services.http.basePath.get(); + +export const useToasts = (): StartServices['notifications']['toasts'] => + useKibana().services.notifications.toasts; + +export const useHttp = (): StartServices['http'] => useKibana().services.http; + +interface UserRealm { + name: string; + type: string; +} + +export interface AuthenticatedElasticUser { + username: string; + email: string; + fullName: string; + roles: string[]; + enabled: boolean; + metadata?: { + _reserved: boolean; + }; + authenticationRealm: UserRealm; + lookupRealm: UserRealm; + authenticationProvider: string; +} + +export const useCurrentUser = (): AuthenticatedElasticUser | null => { + const [user, setUser] = useState<AuthenticatedElasticUser | null>(null); + + const [, dispatchToaster] = useStateToaster(); + + const { security } = useKibana().services; + + const fetchUser = useCallback(() => { + let didCancel = false; + const fetchData = async () => { + try { + if (security != null) { + const response = await security.authc.getCurrentUser(); + if (!didCancel) { + setUser(convertToCamelCase<AuthenticatedUser, AuthenticatedElasticUser>(response)); + } + } else { + setUser({ + username: i18n.translate('xpack.cases.getCurrentUser.unknownUser', { + defaultMessage: 'Unknown', + }), + email: '', + fullName: '', + roles: [], + enabled: false, + authenticationRealm: { name: '', type: '' }, + lookupRealm: { name: '', type: '' }, + authenticationProvider: '', + }); + } + } catch (error) { + if (!didCancel) { + errorToToaster({ + title: i18n.translate('xpack.cases.getCurrentUser.Error', { + defaultMessage: 'Error getting user', + }), + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + setUser(null); + } + } + }; + fetchData(); + return () => { + didCancel = true; + }; + }, [dispatchToaster, security]); + + useEffect(() => { + fetchUser(); + }, [fetchUser]); + return user; +}; + +export interface UseGetUserSavedObjectPermissions { + crud: boolean; + read: boolean; +} + +export const useGetUserSavedObjectPermissions = () => { + const [ + savedObjectsPermissions, + setSavedObjectsPermissions, + ] = useState<UseGetUserSavedObjectPermissions | null>(null); + const uiCapabilities = useKibana().services.application.capabilities; + + useEffect(() => { + const capabilitiesCanUserCRUD: boolean = + typeof uiCapabilities.siem.crud === 'boolean' ? uiCapabilities.siem.crud : false; + const capabilitiesCanUserRead: boolean = + typeof uiCapabilities.siem.show === 'boolean' ? uiCapabilities.siem.show : false; + setSavedObjectsPermissions({ + crud: capabilitiesCanUserCRUD, + read: capabilitiesCanUserRead, + }); + }, [uiCapabilities]); + + return savedObjectsPermissions; +}; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/index.ts b/x-pack/plugins/cases/public/common/lib/kibana/index.ts index a7f3c1e70ced5..5a89cbca9e471 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/index.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/index.ts @@ -5,5 +5,6 @@ * 2.0. */ +export * from './hooks'; export * from './kibana_react'; export * from './services'; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts index e23fad392040c..921463c4c41ab 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.ts @@ -8,9 +8,11 @@ import { KibanaContextProvider, useKibana, + useUiSetting, + useUiSetting$, } from '../../../../../../../src/plugins/kibana_react/public'; import { StartServices } from '../../../types'; const useTypedKibana = () => useKibana<StartServices>(); -export { KibanaContextProvider, useTypedKibana as useKibana }; +export { KibanaContextProvider, useTypedKibana as useKibana, useUiSetting, useUiSetting$ }; diff --git a/x-pack/plugins/cases/public/common/mock/match_media.ts b/x-pack/plugins/cases/public/common/mock/match_media.ts new file mode 100644 index 0000000000000..722f4c3917ea0 --- /dev/null +++ b/x-pack/plugins/cases/public/common/mock/match_media.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +window.matchMedia = jest.fn().mockImplementation((query) => { + return { + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), + removeListener: jest.fn(), + }; +}); diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index 881acb9d4c90e..18fe6ee199e7c 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -240,6 +240,10 @@ export const ALERT = i18n.translate('xpack.cases.common.alertLabel', { defaultMessage: 'Alert', }); +export const ALERTS = i18n.translate('xpack.cases.common.alertsLabel', { + defaultMessage: 'Alerts', +}); + export const ALERT_ADDED_TO_CASE = i18n.translate('xpack.cases.common.alertAddedToCase', { defaultMessage: 'added to case', }); diff --git a/x-pack/plugins/cases/public/components/all_cases/actions.tsx b/x-pack/plugins/cases/public/components/all_cases/actions.tsx new file mode 100644 index 0000000000000..adcdcb4e32ec0 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/actions.tsx @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Dispatch } from 'react'; +import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; + +import { CaseStatuses } from '../../../common'; +import { Case, SubCase } from '../../containers/types'; +import { UpdateCase } from '../../containers/use_get_cases'; +import { statuses } from '../status'; +import * as i18n from './translations'; +import { isIndividual } from './helpers'; + +interface GetActions { + caseStatus: string; + dispatchUpdate: Dispatch<Omit<UpdateCase, 'refetchCasesStatus'>>; + deleteCaseOnClick: (deleteCase: Case) => void; +} + +export const getActions = ({ + caseStatus, + dispatchUpdate, + deleteCaseOnClick, +}: GetActions): Array<DefaultItemIconButtonAction<Case>> => { + const openCaseAction = { + available: (item: Case | SubCase) => item.status !== CaseStatuses.open, + enabled: (item: Case | SubCase) => isIndividual(item), + description: statuses[CaseStatuses.open].actions.single.title, + icon: statuses[CaseStatuses.open].icon, + name: statuses[CaseStatuses.open].actions.single.title, + onClick: (theCase: Case) => + dispatchUpdate({ + updateKey: 'status', + updateValue: CaseStatuses.open, + caseId: theCase.id, + version: theCase.version, + }), + type: 'icon' as const, + 'data-test-subj': 'action-open', + }; + + const makeInProgressAction = { + available: (item: Case) => item.status !== CaseStatuses['in-progress'], + enabled: (item: Case | SubCase) => isIndividual(item), + description: statuses[CaseStatuses['in-progress']].actions.single.title, + icon: statuses[CaseStatuses['in-progress']].icon, + name: statuses[CaseStatuses['in-progress']].actions.single.title, + onClick: (theCase: Case) => + dispatchUpdate({ + updateKey: 'status', + updateValue: CaseStatuses['in-progress'], + caseId: theCase.id, + version: theCase.version, + }), + type: 'icon' as const, + 'data-test-subj': 'action-in-progress', + }; + + const closeCaseAction = { + available: (item: Case | SubCase) => item.status !== CaseStatuses.closed, + enabled: (item: Case | SubCase) => isIndividual(item), + description: statuses[CaseStatuses.closed].actions.single.title, + icon: statuses[CaseStatuses.closed].icon, + name: statuses[CaseStatuses.closed].actions.single.title, + onClick: (theCase: Case) => + dispatchUpdate({ + updateKey: 'status', + updateValue: CaseStatuses.closed, + caseId: theCase.id, + version: theCase.version, + }), + type: 'icon' as const, + 'data-test-subj': 'action-close', + }; + + return [ + openCaseAction, + makeInProgressAction, + closeCaseAction, + { + description: i18n.DELETE_CASE, + icon: 'trash', + name: i18n.DELETE_CASE, + onClick: deleteCaseOnClick, + type: 'icon', + 'data-test-subj': 'action-delete', + }, + ]; +}; diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.test.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.test.tsx new file mode 100644 index 0000000000000..c7a255da9dda6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/columns.test.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import '../../common/mock/match_media'; +import { ExternalServiceColumn } from './columns'; + +import { useGetCasesMockState } from '../../containers/mock'; + +describe('ExternalServiceColumn ', () => { + it('Not pushed render', () => { + const wrapper = mount( + <ExternalServiceColumn {...{ theCase: useGetCasesMockState.data.cases[0] }} /> + ); + expect( + wrapper.find(`[data-test-subj="case-table-column-external-notPushed"]`).last().exists() + ).toBeTruthy(); + }); + it('Up to date', () => { + const wrapper = mount( + <ExternalServiceColumn {...{ theCase: useGetCasesMockState.data.cases[1] }} /> + ); + expect( + wrapper.find(`[data-test-subj="case-table-column-external-upToDate"]`).last().exists() + ).toBeTruthy(); + }); + it('Needs update', () => { + const wrapper = mount( + <ExternalServiceColumn {...{ theCase: useGetCasesMockState.data.cases[2] }} /> + ); + expect( + wrapper.find(`[data-test-subj="case-table-column-external-requiresUpdate"]`).last().exists() + ).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.tsx new file mode 100644 index 0000000000000..15b5ef9bc69c0 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/columns.tsx @@ -0,0 +1,279 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { + EuiAvatar, + EuiBadgeGroup, + EuiBadge, + EuiLink, + EuiTableActionsColumnType, + EuiTableComputedColumnType, + EuiTableFieldDataColumnType, +} from '@elastic/eui'; +import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services'; +import styled from 'styled-components'; +import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; + +import { CaseStatuses, CaseType } from '../../../common'; +import { getEmptyTagValue } from '../empty_value'; +import { Case, SubCase } from '../../containers/types'; +import { FormattedRelativePreferenceDate } from '../formatted_date'; +import { CaseDetailsHrefSchema, CaseDetailsLink } from '../links'; +import * as i18n from './translations'; +import { Status } from '../status'; +import { getSubCasesStatusCountsBadges, isSubCase } from './helpers'; +import { ALERTS } from '../../common/translations'; + +export type CasesColumns = + | EuiTableFieldDataColumnType<Case> + | EuiTableComputedColumnType<Case> + | EuiTableActionsColumnType<Case>; + +const MediumShadeText = styled.p` + color: ${({ theme }) => theme.eui.euiColorMediumShade}; +`; + +const Spacer = styled.span` + margin-left: ${({ theme }) => theme.eui.paddingSizes.s}; +`; + +const TagWrapper = styled(EuiBadgeGroup)` + width: 100%; +`; + +const renderStringField = (field: string, dataTestSubj: string) => + field != null ? <span data-test-subj={dataTestSubj}>{field}</span> : getEmptyTagValue(); + +interface GetCasesColumn { + actions: Array<DefaultItemIconButtonAction<Case>>; + filterStatus: string; + isModal: boolean; + getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; + onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; +} +export const getCasesColumns = ({ + actions, + filterStatus, + isModal, + getCaseDetailsHref, + onCaseDetailsNavClick, +}: GetCasesColumn): CasesColumns[] => { + const columns = [ + { + name: i18n.NAME, + render: (theCase: Case | SubCase) => { + if (theCase.id != null && theCase.title != null) { + const caseDetailsLinkComponent = !isModal ? ( + <CaseDetailsLink + detailName={isSubCase(theCase) ? theCase.caseParentId : theCase.id} + getCaseDetailsHref={getCaseDetailsHref} + onCaseDetailsNavClick={onCaseDetailsNavClick} + title={theCase.title} + subCaseId={isSubCase(theCase) ? theCase.id : undefined} + > + {theCase.title} + </CaseDetailsLink> + ) : ( + <span>{theCase.title}</span> + ); + return theCase.status !== CaseStatuses.closed ? ( + caseDetailsLinkComponent + ) : ( + <> + {caseDetailsLinkComponent} + <Spacer> + <MediumShadeText>{i18n.CLOSED}</MediumShadeText> + </Spacer> + </> + ); + } + return getEmptyTagValue(); + }, + }, + { + field: 'createdBy', + name: i18n.REPORTER, + render: (createdBy: Case['createdBy']) => { + if (createdBy != null) { + return ( + <> + <EuiAvatar + className="userAction__circle" + name={createdBy.fullName ? createdBy.fullName : createdBy.username ?? i18n.UNKNOWN} + size="s" + /> + <Spacer data-test-subj="case-table-column-createdBy"> + {createdBy.fullName ? createdBy.fullName : createdBy.username ?? i18n.UNKNOWN} + </Spacer> + </> + ); + } + return getEmptyTagValue(); + }, + }, + { + field: 'tags', + name: i18n.TAGS, + render: (tags: Case['tags']) => { + if (tags != null && tags.length > 0) { + return ( + <TagWrapper> + {tags.map((tag: string, i: number) => ( + <EuiBadge + color="hollow" + key={`${tag}-${i}`} + data-test-subj={`case-table-column-tags-${i}`} + > + {tag} + </EuiBadge> + ))} + </TagWrapper> + ); + } + return getEmptyTagValue(); + }, + truncateText: true, + }, + { + align: RIGHT_ALIGNMENT, + field: 'totalAlerts', + name: ALERTS, + sortable: true, + render: (totalAlerts: Case['totalAlerts']) => + totalAlerts != null + ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) + : getEmptyTagValue(), + }, + { + align: RIGHT_ALIGNMENT, + field: 'totalComment', + name: i18n.COMMENTS, + sortable: true, + render: (totalComment: Case['totalComment']) => + totalComment != null + ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) + : getEmptyTagValue(), + }, + filterStatus === CaseStatuses.open + ? { + field: 'createdAt', + name: i18n.OPENED_ON, + sortable: true, + render: (createdAt: Case['createdAt']) => { + if (createdAt != null) { + return ( + <span data-test-subj={`case-table-column-createdAt`}> + <FormattedRelativePreferenceDate value={createdAt} /> + </span> + ); + } + return getEmptyTagValue(); + }, + } + : { + field: 'closedAt', + name: i18n.CLOSED_ON, + sortable: true, + render: (closedAt: Case['closedAt']) => { + if (closedAt != null) { + return ( + <span data-test-subj={`case-table-column-closedAt`}> + <FormattedRelativePreferenceDate value={closedAt} /> + </span> + ); + } + return getEmptyTagValue(); + }, + }, + { + name: i18n.EXTERNAL_INCIDENT, + render: (theCase: Case) => { + if (theCase.id != null) { + return <ExternalServiceColumn theCase={theCase} />; + } + return getEmptyTagValue(); + }, + }, + { + name: i18n.INCIDENT_MANAGEMENT_SYSTEM, + render: (theCase: Case) => { + if (theCase.externalService != null) { + return renderStringField( + `${theCase.externalService.connectorName}`, + `case-table-column-connector` + ); + } + return getEmptyTagValue(); + }, + }, + { + name: i18n.STATUS, + render: (theCase: Case) => { + if (theCase?.subCases == null || theCase.subCases.length === 0) { + if (theCase.status == null || theCase.type === CaseType.collection) { + return getEmptyTagValue(); + } + return <Status type={theCase.status} />; + } + + const badges = getSubCasesStatusCountsBadges(theCase.subCases); + return badges.map(({ color, count }, index) => ( + <EuiBadge key={index} color={color}> + {count} + </EuiBadge> + )); + }, + }, + { + name: i18n.ACTIONS, + actions, + }, + ]; + if (isModal) { + columns.pop(); // remove actions if in modal + } + return columns; +}; + +interface Props { + theCase: Case; +} + +export const ExternalServiceColumn: React.FC<Props> = ({ theCase }) => { + const handleRenderDataToPush = useCallback(() => { + const lastCaseUpdate = theCase.updatedAt != null ? new Date(theCase.updatedAt) : null; + const lastCasePush = + theCase.externalService?.pushedAt != null + ? new Date(theCase.externalService?.pushedAt) + : null; + const hasDataToPush = + lastCasePush === null || + (lastCasePush != null && + lastCaseUpdate != null && + lastCasePush.getTime() < lastCaseUpdate?.getTime()); + return ( + <p> + <EuiLink + data-test-subj={`case-table-column-external`} + href={theCase.externalService?.externalUrl} + target="_blank" + aria-label={i18n.SERVICENOW_LINK_ARIA} + > + {theCase.externalService?.externalTitle} + </EuiLink> + {hasDataToPush + ? renderStringField(i18n.REQUIRES_UPDATE, `case-table-column-external-requiresUpdate`) + : renderStringField(i18n.UP_TO_DATE, `case-table-column-external-upToDate`)} + </p> + ); + }, [theCase]); + if (theCase.externalService !== null) { + return handleRenderDataToPush(); + } + return renderStringField(i18n.NOT_PUSHED, `case-table-column-external-notPushed`); +}; diff --git a/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx b/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx new file mode 100644 index 0000000000000..1bd9f53f9c4d1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBasicTable as _EuiBasicTable } from '@elastic/eui'; +import styled from 'styled-components'; +import { Case, SubCase } from '../../containers/types'; +import { CasesColumns } from './columns'; +import { AssociationType } from '../../../common'; + +type ExpandedRowMap = Record<string, Element> | {}; + +const EuiBasicTable: any = _EuiBasicTable; +const BasicTable = styled(EuiBasicTable)` + thead { + display: none; + } + + tbody { + .euiTableCellContent { + padding: 8px !important; + } + .euiTableRowCell { + border: 0; + } + } +`; +BasicTable.displayName = 'BasicTable'; + +export const getExpandedRowMap = ({ + data, + columns, + isModal, + onSubCaseClick, +}: { + data: Case[] | null; + columns: CasesColumns[]; + isModal: boolean; + onSubCaseClick?: (theSubCase: SubCase) => void; +}): ExpandedRowMap => { + if (data == null) { + return {}; + } + + const rowProps = (theSubCase: SubCase) => { + return { + ...(isModal && onSubCaseClick ? { onClick: () => onSubCaseClick(theSubCase) } : {}), + className: 'subCase', + }; + }; + + return data.reduce((acc, curr) => { + if (curr.subCases != null) { + const subCases = curr.subCases.map((subCase, index) => ({ + ...subCase, + caseParentId: curr.id, + title: `${curr.title} ${index + 1}`, + associationType: AssociationType.subCase, + })); + return { + ...acc, + [curr.id]: ( + <BasicTable + columns={columns} + data-test-subj={`sub-cases-table-${curr.id}`} + itemId="id" + items={subCases} + rowProps={rowProps} + /> + ), + }; + } else { + return acc; + } + }, {}); +}; diff --git a/x-pack/plugins/cases/public/components/all_cases/helpers.ts b/x-pack/plugins/cases/public/components/all_cases/helpers.ts new file mode 100644 index 0000000000000..1751d478a5d9c --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/helpers.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { filter } from 'lodash/fp'; +import { AssociationType, CaseStatuses, CaseType } from '../../../common'; +import { Case, SubCase } from '../../containers/types'; +import { statuses } from '../status'; + +export const isSelectedCasesIncludeCollections = (selectedCases: Case[]) => + selectedCases.length > 0 && + selectedCases.some((caseObj: Case) => caseObj.type === CaseType.collection); + +export const isSubCase = (theCase: Case | SubCase): theCase is SubCase => + (theCase as SubCase).caseParentId !== undefined && + (theCase as SubCase).associationType === AssociationType.subCase; + +export const isCollection = (theCase: Case | SubCase | null | undefined) => + theCase != null && (theCase as Case).type === CaseType.collection; + +export const isIndividual = (theCase: Case | SubCase | null | undefined) => + theCase != null && (theCase as Case).type === CaseType.individual; + +export const getSubCasesStatusCountsBadges = ( + subCases: SubCase[] +): Array<{ name: CaseStatuses; color: string; count: number }> => { + return [ + { + name: CaseStatuses.open, + color: statuses[CaseStatuses.open].color, + count: filter({ status: CaseStatuses.open }, subCases).length, + }, + { + name: CaseStatuses['in-progress'], + color: statuses[CaseStatuses['in-progress']].color, + count: filter({ status: CaseStatuses['in-progress'] }, subCases).length, + }, + { + name: CaseStatuses.closed, + color: statuses[CaseStatuses.closed].color, + count: filter({ status: CaseStatuses.closed }, subCases).length, + }, + ]; +}; diff --git a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx new file mode 100644 index 0000000000000..0f8e0173cf441 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx @@ -0,0 +1,937 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import moment from 'moment-timezone'; +import { waitFor } from '@testing-library/react'; +import '../../common/mock/match_media'; +import { TestProviders } from '../../common/mock'; +import { casesStatus, useGetCasesMockState, collectionCase } from '../../containers/mock'; +import * as i18n from './translations'; + +import { CaseStatuses, CaseType } from '../../../common'; +import { getEmptyTagValue } from '../empty_value'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { useGetCases } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { getCasesColumns } from './columns'; +import { AllCases } from '.'; +import { StatusAll } from '../status'; + +jest.mock('../../containers/use_bulk_update_case'); +jest.mock('../../containers/use_delete_cases'); +jest.mock('../../containers/use_get_cases'); +jest.mock('../../containers/use_get_cases_status'); +jest.mock('../../containers/use_get_action_license'); + +const useDeleteCasesMock = useDeleteCases as jest.Mock; +const useGetCasesMock = useGetCases as jest.Mock; +const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; +const useUpdateCasesMock = useUpdateCases as jest.Mock; +const useGetActionLicenseMock = useGetActionLicense as jest.Mock; + +jest.mock('../../common/lib/kibana'); + +describe('AllCases', () => { + const defaultAllCasesProps = { + configureCasesHref: 'blah', + createCaseHref: 'bleh', + getCaseDetailsHref: jest.fn().mockReturnValue('testHref'), // string + onCaseDetailsNavClick: jest.fn(), + onConfigureCasesNavClick: jest.fn(), + onCreateCaseNavClick: jest.fn(), + }; + + const dispatchResetIsDeleted = jest.fn(); + const dispatchResetIsUpdated = jest.fn(); + const dispatchUpdateCaseProperty = jest.fn(); + const handleOnDeleteConfirm = jest.fn(); + const handleToggleModal = jest.fn(); + const refetchCases = jest.fn(); + const setFilters = jest.fn(); + const setQueryParams = jest.fn(); + const setSelectedCases = jest.fn(); + const updateBulkStatus = jest.fn(); + const fetchCasesStatus = jest.fn(); + const onRowClick = jest.fn(); + const emptyTag = getEmptyTagValue().props.children; + + const defaultGetCases = { + ...useGetCasesMockState, + dispatchUpdateCaseProperty, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + }; + + const defaultDeleteCases = { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isDeleted: false, + isDisplayConfirmDeleteModal: false, + isLoading: false, + }; + + const defaultCasesStatus = { + ...casesStatus, + fetchCasesStatus, + isError: false, + isLoading: false, + }; + + const defaultUpdateCases = { + isUpdated: false, + isLoading: false, + isError: false, + dispatchResetIsUpdated, + updateBulkStatus, + }; + + const defaultActionLicense = { + actionLicense: null, + isLoading: false, + isError: false, + }; + + beforeEach(() => { + jest.clearAllMocks(); + useUpdateCasesMock.mockReturnValue(defaultUpdateCases); + useGetCasesMock.mockReturnValue(defaultGetCases); + useDeleteCasesMock.mockReturnValue(defaultDeleteCases); + useGetCasesStatusMock.mockReturnValue(defaultCasesStatus); + useGetActionLicenseMock.mockReturnValue(defaultActionLicense); + moment.tz.setDefault('UTC'); + }); + + it('should render AllCases', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + + await waitFor(() => { + expect(wrapper.find(`a[data-test-subj="case-details-link"]`).first().prop('href')).toEqual( + `testHref` + ); + expect(wrapper.find(`a[data-test-subj="case-details-link"]`).first().text()).toEqual( + useGetCasesMockState.data.cases[0].title + ); + expect( + wrapper.find(`span[data-test-subj="case-table-column-tags-0"]`).first().prop('title') + ).toEqual(useGetCasesMockState.data.cases[0].tags[0]); + expect(wrapper.find(`[data-test-subj="case-table-column-createdBy"]`).first().text()).toEqual( + useGetCasesMockState.data.cases[0].createdBy.fullName + ); + expect( + wrapper + .find(`[data-test-subj="case-table-column-createdAt"]`) + .first() + .childAt(0) + .prop('value') + ).toBe(useGetCasesMockState.data.cases[0].createdAt); + expect(wrapper.find(`[data-test-subj="case-table-case-count"]`).first().text()).toEqual( + 'Showing 10 cases' + ); + }); + }); + + it('should render the stats', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.closed }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + + await waitFor(() => { + expect(wrapper.find('[data-test-subj="openStatsHeader"]').exists()).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="openStatsHeader"] .euiDescriptionList__description') + .first() + .text() + ).toBe('20'); + + expect(wrapper.find('[data-test-subj="inProgressStatsHeader"]').exists()).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="inProgressStatsHeader"] .euiDescriptionList__description') + .first() + .text() + ).toBe('40'); + + expect(wrapper.find('[data-test-subj="closedStatsHeader"]').exists()).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="closedStatsHeader"] .euiDescriptionList__description') + .first() + .text() + ).toBe('130'); + }); + }); + + it('should render the loading spinner when loading stats', async () => { + useGetCasesStatusMock.mockReturnValue({ ...defaultCasesStatus, isLoading: true }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="openStatsHeader-loading-spinner"]').exists() + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="inProgressStatsHeader-loading-spinner"]').exists() + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="closedStatsHeader-loading-spinner"]').exists() + ).toBeTruthy(); + }); + }); + + it('should render empty fields', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, + data: { + ...defaultGetCases.data, + cases: [ + { + ...defaultGetCases.data.cases[0], + id: null, + createdAt: null, + createdBy: null, + status: null, + subCases: null, + tags: null, + title: null, + totalComment: null, + totalAlerts: null, + }, + ], + }, + }); + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + const checkIt = (columnName: string, key: number) => { + const column = wrapper.find('[data-test-subj="cases-table"] tbody .euiTableRowCell').at(key); + if (columnName === i18n.ACTIONS) { + return; + } + expect(column.find('.euiTableRowCell--hideForDesktop').text()).toEqual(columnName); + expect(column.find('span').text()).toEqual(emptyTag); + }; + await waitFor(() => { + getCasesColumns({ + actions: [], + filterStatus: CaseStatuses.open, + isModal: false, + getCaseDetailsHref: jest.fn(), + onCaseDetailsNavClick: jest.fn(), + }).map((i, key) => i.name != null && checkIt(`${i.name}`, key)); + }); + }); + + it('should render correct actions for case (with type individual and filter status open)', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, + }); + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + await waitFor(() => { + expect(wrapper.find('[data-test-subj="action-open"]').exists()).toBeFalsy(); + expect( + wrapper.find('[data-test-subj="action-in-progress"]').first().props().disabled + ).toBeFalsy(); + expect(wrapper.find('[data-test-subj="action-close"]').first().props().disabled).toBeFalsy(); + expect(wrapper.find('[data-test-subj="action-delete"]').first().props().disabled).toBeFalsy(); + }); + }); + + it('should enable correct actions for sub cases', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + data: { + ...defaultGetCases.data, + cases: [ + { + ...defaultGetCases.data.cases[0], + id: 'my-case-with-subcases', + createdAt: null, + createdBy: null, + status: null, + subCases: [ + { + id: 'sub-case-id', + }, + ], + tags: null, + title: null, + totalComment: null, + totalAlerts: null, + type: CaseType.collection, + }, + ], + }, + }); + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper + .find( + '[data-test-subj="sub-cases-table-my-case-with-subcases"] [data-test-subj="euiCollapsedItemActionsButton"]' + ) + .last() + .simulate('click'); + expect(wrapper.find('[data-test-subj="action-open"]').first().props().disabled).toEqual(true); + expect( + wrapper.find('[data-test-subj="action-in-progress"]').first().props().disabled + ).toEqual(true); + expect(wrapper.find('[data-test-subj="action-close"]').first().props().disabled).toEqual( + true + ); + expect(wrapper.find('[data-test-subj="action-delete"]').first().props().disabled).toEqual( + false + ); + }); + }); + + it('should not render case link or actions on modal=true', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + </TestProviders> + ); + await waitFor(() => { + const checkIt = (columnName: string) => { + expect(columnName).not.toEqual(i18n.ACTIONS); + }; + getCasesColumns({ + actions: [], + filterStatus: CaseStatuses.open, + isModal: true, + getCaseDetailsHref: jest.fn(), + onCaseDetailsNavClick: jest.fn(), + }).map((i, key) => i.name != null && checkIt(`${i.name}`)); + expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); + }); + }); + + it('should tableHeaderSortButton AllCases', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="tableHeaderSortButton"]').first().simulate('click'); + expect(setQueryParams).toBeCalledWith({ + page: 1, + perPage: 5, + sortField: 'createdAt', + sortOrder: 'asc', + }); + }); + }); + + it('closes case when row action icon clicked', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="action-close"]').first().simulate('click'); + const firstCase = useGetCasesMockState.data.cases[0]; + expect(dispatchUpdateCaseProperty).toBeCalledWith({ + caseId: firstCase.id, + updateKey: 'status', + updateValue: CaseStatuses.closed, + refetchCasesStatus: fetchCasesStatus, + version: firstCase.version, + }); + }); + }); + + it('opens case when row action icon clicked', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + data: { + ...defaultGetCases.data, + cases: [ + { + ...defaultGetCases.data.cases[0], + status: CaseStatuses.closed, + }, + ], + }, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.closed }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="action-open"]').first().simulate('click'); + const firstCase = useGetCasesMockState.data.cases[0]; + expect(dispatchUpdateCaseProperty).toBeCalledWith({ + caseId: firstCase.id, + updateKey: 'status', + updateValue: CaseStatuses.open, + refetchCasesStatus: fetchCasesStatus, + version: firstCase.version, + }); + }); + }); + + it('put case in progress when row action icon clicked', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="action-in-progress"]').first().simulate('click'); + const firstCase = useGetCasesMockState.data.cases[0]; + expect(dispatchUpdateCaseProperty).toBeCalledWith({ + caseId: firstCase.id, + updateKey: 'status', + updateValue: CaseStatuses['in-progress'], + refetchCasesStatus: fetchCasesStatus, + version: firstCase.version, + }); + }); + }); + + it('Bulk delete', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.closed }, + selectedCases: [...useGetCasesMockState.data.cases, collectionCase], + }); + + useDeleteCasesMock + .mockReturnValueOnce({ + ...defaultDeleteCases, + isDisplayConfirmDeleteModal: false, + }) + .mockReturnValue({ + ...defaultDeleteCases, + isDisplayConfirmDeleteModal: true, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); + wrapper.find('[data-test-subj="cases-bulk-delete-button"]').first().simulate('click'); + expect(handleToggleModal).toBeCalled(); + + wrapper + .find( + '[data-test-subj="confirm-delete-case-modal"] [data-test-subj="confirmModalConfirmButton"]' + ) + .last() + .simulate('click'); + expect(handleOnDeleteConfirm.mock.calls[0][0]).toStrictEqual([ + ...useGetCasesMockState.data.cases.map(({ id, type, title }) => ({ id, type, title })), + { + id: collectionCase.id, + title: collectionCase.title, + type: collectionCase.type, + }, + ]); + }); + }); + + it('Renders only bulk delete on status all', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: StatusAll }, + selectedCases: [...useGetCasesMockState.data.cases], + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); + expect(wrapper.find('[data-test-subj="cases-bulk-open-button"]').exists()).toEqual(false); + expect(wrapper.find('[data-test-subj="cases-bulk-in-progress-button"]').exists()).toEqual( + false + ); + expect(wrapper.find('[data-test-subj="cases-bulk-close-button"]').exists()).toEqual(false); + expect( + wrapper.find('[data-test-subj="cases-bulk-delete-button"]').first().props().disabled + ).toEqual(false); + }); + }); + + it('Renders correct bulk actoins for case collection when filter status is set to all - enable only bulk delete if any collection is selected', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, + selectedCases: [ + ...useGetCasesMockState.data.cases, + { + ...useGetCasesMockState.data.cases[0], + type: CaseType.collection, + }, + ], + }); + + useDeleteCasesMock + .mockReturnValueOnce({ + ...defaultDeleteCases, + isDisplayConfirmDeleteModal: false, + }) + .mockReturnValue({ + ...defaultDeleteCases, + isDisplayConfirmDeleteModal: true, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); + expect(wrapper.find('[data-test-subj="cases-bulk-open-button"]').exists()).toEqual(false); + expect( + wrapper.find('[data-test-subj="cases-bulk-in-progress-button"]').first().props().disabled + ).toEqual(true); + expect( + wrapper.find('[data-test-subj="cases-bulk-close-button"]').first().props().disabled + ).toEqual(true); + expect( + wrapper.find('[data-test-subj="cases-bulk-delete-button"]').first().props().disabled + ).toEqual(false); + }); + }); + + it('Bulk close status update', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, + selectedCases: useGetCasesMockState.data.cases, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); + wrapper.find('[data-test-subj="cases-bulk-close-button"]').first().simulate('click'); + expect(updateBulkStatus).toBeCalledWith(useGetCasesMockState.data.cases, CaseStatuses.closed); + }); + }); + + it('Bulk open status update', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + selectedCases: useGetCasesMockState.data.cases, + filterOptions: { + ...defaultGetCases.filterOptions, + status: CaseStatuses.closed, + }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); + wrapper.find('[data-test-subj="cases-bulk-open-button"]').first().simulate('click'); + expect(updateBulkStatus).toBeCalledWith(useGetCasesMockState.data.cases, CaseStatuses.open); + }); + }); + + it('Bulk in-progress status update', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, + selectedCases: useGetCasesMockState.data.cases, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); + wrapper.find('[data-test-subj="cases-bulk-in-progress-button"]').first().simulate('click'); + expect(updateBulkStatus).toBeCalledWith( + useGetCasesMockState.data.cases, + CaseStatuses['in-progress'] + ); + }); + }); + + it('isDeleted is true, refetch', async () => { + useDeleteCasesMock.mockReturnValue({ + ...defaultDeleteCases, + isDeleted: true, + }); + + mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + expect(refetchCases).toBeCalled(); + expect(fetchCasesStatus).toBeCalled(); + expect(dispatchResetIsDeleted).toBeCalled(); + }); + }); + + it('isUpdated is true, refetch', async () => { + useUpdateCasesMock.mockReturnValue({ + ...defaultUpdateCases, + isUpdated: true, + }); + + mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + await waitFor(() => { + expect(refetchCases).toBeCalled(); + expect(fetchCasesStatus).toBeCalled(); + expect(dispatchResetIsUpdated).toBeCalled(); + }); + }); + + it('should not render header when modal=true', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find('[data-test-subj="all-cases-header"]').exists()).toBe(false); + }); + }); + + it('should not render table utility bar when modal=true', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find('[data-test-subj="case-table-utility-bar-actions"]').exists()).toBe( + false + ); + }); + }); + + it('case table should not be selectable when modal=true', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find('[data-test-subj="cases-table"]').first().prop('isSelectable')).toBe( + false + ); + }); + }); + + it('should call onRowClick with no cases and modal=true', async () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + data: { + ...defaultGetCases.data, + total: 0, + cases: [], + }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases + {...defaultAllCasesProps} + userCanCrud={true} + isModal={true} + onRowClick={onRowClick} + /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); + expect(onRowClick).toHaveBeenCalled(); + }); + }); + + it('should call onCreateCaseNavClick with no cases and modal=false', async () => { + const onCreateCaseNavClick = jest.fn(); + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + data: { + ...defaultGetCases.data, + total: 0, + cases: [], + }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases + {...defaultAllCasesProps} + onCreateCaseNavClick={onCreateCaseNavClick} + userCanCrud={true} + isModal={false} + /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); + expect(onCreateCaseNavClick).toHaveBeenCalled(); + }); + }); + + it('should call onRowClick when clicking a case with modal=true', async () => { + const wrapper = mount( + <TestProviders> + <AllCases + {...defaultAllCasesProps} + userCanCrud={true} + isModal={true} + onRowClick={onRowClick} + /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); + expect(onRowClick).toHaveBeenCalledWith({ + closedAt: null, + closedBy: null, + comments: [], + connector: { fields: null, id: '123', name: 'My Connector', type: '.none' }, + createdAt: '2020-02-19T23:06:33.798Z', + createdBy: { + email: 'leslie.knope@elastic.co', + fullName: 'Leslie Knope', + username: 'lknope', + }, + description: 'Security banana Issue', + externalService: { + connectorId: '123', + connectorName: 'connector name', + externalId: 'external_id', + externalTitle: 'external title', + externalUrl: 'basicPush.com', + pushedAt: '2020-02-20T15:02:57.995Z', + pushedBy: { + email: 'leslie.knope@elastic.co', + fullName: 'Leslie Knope', + username: 'lknope', + }, + }, + id: '1', + status: 'open', + subCaseIds: [], + tags: ['coke', 'pepsi'], + title: 'Another horrible breach!!', + totalAlerts: 0, + totalComment: 0, + type: CaseType.individual, + updatedAt: '2020-02-20T15:02:57.995Z', + updatedBy: { + email: 'leslie.knope@elastic.co', + fullName: 'Leslie Knope', + username: 'lknope', + }, + version: 'WzQ3LDFd', + settings: { + syncAlerts: true, + }, + }); + }); + }); + + it('should NOT call onRowClick when clicking a case with modal=true', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); + expect(onRowClick).not.toHaveBeenCalled(); + }); + }); + + it('should change the status to closed', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-closed"]').simulate('click'); + expect(setQueryParams).toBeCalledWith({ + sortField: 'closedAt', + }); + }); + }); + + it('should change the status to in-progress', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').simulate('click'); + expect(setQueryParams).toBeCalledWith({ + sortField: 'updatedAt', + }); + }); + }); + + it('should change the status to open', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-open"]').simulate('click'); + expect(setQueryParams).toBeCalledWith({ + sortField: 'createdAt', + }); + }); + }); + + it('should show the correct count on stats', async () => { + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + expect(wrapper.find('button[data-test-subj="case-status-filter-open"]').text()).toBe( + 'Open (20)' + ); + expect(wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').text()).toBe( + 'In progress (40)' + ); + expect(wrapper.find('button[data-test-subj="case-status-filter-closed"]').text()).toBe( + 'Closed (130)' + ); + }); + }); + + it('should not allow the user to enter configuration page with basic license', async () => { + useGetActionLicenseMock.mockReturnValue({ + ...defaultActionLicense, + actionLicense: { + id: '.jira', + name: 'Jira', + minimumLicenseRequired: 'gold', + enabled: true, + enabledInConfig: true, + enabledInLicense: false, + }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="configure-case-button"]').first().prop('isDisabled') + ).toBeTruthy(); + }); + }); + + it('should allow the user to enter configuration page with gold license and above', async () => { + useGetActionLicenseMock.mockReturnValue({ + ...defaultActionLicense, + actionLicense: { + id: '.jira', + name: 'Jira', + minimumLicenseRequired: 'gold', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }, + }); + + const wrapper = mount( + <TestProviders> + <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="configure-case-button"]').first().prop('isDisabled') + ).toBeFalsy(); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.tsx b/x-pack/plugins/cases/public/components/all_cases/index.tsx new file mode 100644 index 0000000000000..e06ed9da8dc0b --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/index.tsx @@ -0,0 +1,607 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { + EuiBasicTable as _EuiBasicTable, + EuiContextMenuPanel, + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingContent, + EuiProgress, + EuiTableSortingType, +} from '@elastic/eui'; +import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; +import { isEmpty, memoize } from 'lodash/fp'; +import styled, { css } from 'styled-components'; +import classnames from 'classnames'; + +import * as i18n from './translations'; +import { CaseStatuses, CaseType } from '../../../common'; +import { getCasesColumns } from './columns'; +import { Case, DeleteCase, FilterOptions, SortFieldCase, SubCase } from '../../containers/types'; +import { useGetCases, UpdateCase } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { EuiBasicTableOnChange } from './types'; +import { Panel } from '../panel'; +import { + UtilityBar, + UtilityBarAction, + UtilityBarGroup, + UtilityBarSection, + UtilityBarText, +} from '../utility_bar'; +import { getBulkItems } from '../bulk_actions'; +import { CaseHeaderPage } from '../case_header_page'; +import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; +import { getActions } from './actions'; +import { CasesTableFilters } from './table_filters'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { getActionLicenseError } from '../use_push_to_service/helpers'; +import { CaseCallOut } from '../callout'; +import { ConfigureCaseButton } from '../configure_cases/button'; +import { ERROR_PUSH_SERVICE_CALLOUT_TITLE } from '../use_push_to_service/translations'; +import { CaseDetailsHrefSchema, LinkButton } from '../links'; +import { Stats } from '../status'; +import { SELECTABLE_MESSAGE_COLLECTIONS } from '../../common/translations'; +import { getExpandedRowMap } from './expanded_row'; +import { isSelectedCasesIncludeCollections } from './helpers'; + +const Div = styled.div` + margin-top: ${({ theme }) => theme.eui.paddingSizes.m}; +`; + +const FlexItemDivider = styled(EuiFlexItem)` + ${({ theme }) => css` + .euiFlexGroup--gutterMedium > &.euiFlexItem { + border-right: ${theme.eui.euiBorderThin}; + padding-right: ${theme.eui.euiSize}; + margin-right: ${theme.eui.euiSize}; + } + `} +`; + +const ProgressLoader = styled(EuiProgress)` + ${({ theme }) => css` + top: 2px; + border-radius: ${theme.eui.euiBorderRadius}; + z-index: ${theme.eui.euiZHeader}; + `} +`; + +const getSortField = (field: string): SortFieldCase => { + if (field === SortFieldCase.createdAt) { + return SortFieldCase.createdAt; + } else if (field === SortFieldCase.closedAt) { + return SortFieldCase.closedAt; + } + return SortFieldCase.createdAt; +}; + +const EuiBasicTable: any = _EuiBasicTable; +const BasicTable = styled(EuiBasicTable)` + ${({ theme }) => ` + .euiTableRow-isExpandedRow.euiTableRow-isSelectable .euiTableCellContent { + padding: 8px 0 8px 32px; + } + + &.isModal .euiTableRow.isDisabled { + cursor: not-allowed; + background-color: ${theme.eui.euiTableHoverClickableColor}; + } + + &.isModal .euiTableRow.euiTableRow-isExpandedRow .euiTableRowCell, + &.isModal .euiTableRow.euiTableRow-isExpandedRow:hover { + background-color: transparent; + } + + &.isModal .euiTableRow.euiTableRow-isExpandedRow { + .subCase:hover { + background-color: ${theme.eui.euiTableHoverClickableColor}; + } + } + `} +`; +BasicTable.displayName = 'BasicTable'; + +export interface AllCasesProps { + configureCasesHref: string; + createCaseHref: string; + disabledCases?: CaseType[]; + disabledStatuses?: CaseStatuses[]; + getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; + isModal?: boolean; + onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + onConfigureCasesNavClick?: (ev: React.MouseEvent) => void; + onCreateCaseNavClick?: (ev: React.MouseEvent) => void; + onRowClick?: (theCase?: Case | SubCase) => void; + userCanCrud: boolean; +} + +export const AllCases = React.memo<AllCasesProps>( + ({ + configureCasesHref, + createCaseHref, + disabledCases = [], + disabledStatuses, + getCaseDetailsHref, + isModal = false, + onCaseDetailsNavClick, + onConfigureCasesNavClick, + onCreateCaseNavClick, + onRowClick, + userCanCrud, + }) => { + const { actionLicense } = useGetActionLicense(); + const { + countOpenCases, + countInProgressCases, + countClosedCases, + isLoading: isCasesStatusLoading, + fetchCasesStatus, + } = useGetCasesStatus(); + const { + data, + dispatchUpdateCaseProperty, + filterOptions, + loading, + queryParams, + selectedCases, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + } = useGetCases(); + + // Delete case + const { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isLoading: isDeleting, + isDeleted, + isDisplayConfirmDeleteModal, + } = useDeleteCases(); + + // Update case + const { + dispatchResetIsUpdated, + isLoading: isUpdating, + isUpdated, + updateBulkStatus, + } = useUpdateCases(); + const [deleteThisCase, setDeleteThisCase] = useState<DeleteCase>({ + title: '', + id: '', + type: null, + }); + const [deleteBulk, setDeleteBulk] = useState<DeleteCase[]>([]); + const filterRefetch = useRef<() => void>(); + const setFilterRefetch = useCallback( + (refetchFilter: () => void) => { + filterRefetch.current = refetchFilter; + }, + [filterRefetch] + ); + const refreshCases = useCallback( + (dataRefresh = true) => { + if (dataRefresh) refetchCases(); + fetchCasesStatus(); + setSelectedCases([]); + setDeleteBulk([]); + if (filterRefetch.current != null) { + filterRefetch.current(); + } + }, + [filterRefetch, refetchCases, setSelectedCases, fetchCasesStatus] + ); + + useEffect(() => { + if (isDeleted) { + refreshCases(); + dispatchResetIsDeleted(); + } + if (isUpdated) { + refreshCases(); + dispatchResetIsUpdated(); + } + }, [isDeleted, isUpdated, refreshCases, dispatchResetIsDeleted, dispatchResetIsUpdated]); + const confirmDeleteModal = useMemo( + () => ( + <ConfirmDeleteCaseModal + caseTitle={deleteThisCase.title} + isModalVisible={isDisplayConfirmDeleteModal} + isPlural={deleteBulk.length > 0} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind( + null, + deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] + )} + /> + ), + [ + deleteBulk, + deleteThisCase, + isDisplayConfirmDeleteModal, + handleToggleModal, + handleOnDeleteConfirm, + ] + ); + + const toggleDeleteModal = useCallback( + (deleteCase: Case) => { + handleToggleModal(); + setDeleteThisCase({ id: deleteCase.id, title: deleteCase.title, type: deleteCase.type }); + }, + [handleToggleModal] + ); + + const toggleBulkDeleteModal = useCallback( + (cases: Case[]) => { + handleToggleModal(); + if (cases.length === 1) { + const singleCase = cases[0]; + if (singleCase) { + return setDeleteThisCase({ + id: singleCase.id, + title: singleCase.title, + type: singleCase.type, + }); + } + } + const convertToDeleteCases: DeleteCase[] = cases.map(({ id, title, type }) => ({ + id, + title, + type, + })); + setDeleteBulk(convertToDeleteCases); + }, + [setDeleteBulk, handleToggleModal] + ); + + const handleUpdateCaseStatus = useCallback( + (status: string) => { + updateBulkStatus(selectedCases, status); + }, + [selectedCases, updateBulkStatus] + ); + + const getBulkItemsPopoverContent = useCallback( + (closePopover: () => void) => ( + <EuiContextMenuPanel + data-test-subj="cases-bulk-actions" + items={getBulkItems({ + caseStatus: filterOptions.status, + closePopover, + deleteCasesAction: toggleBulkDeleteModal, + selectedCases, + updateCaseStatus: handleUpdateCaseStatus, + includeCollections: isSelectedCasesIncludeCollections(selectedCases), + })} + /> + ), + [selectedCases, filterOptions.status, toggleBulkDeleteModal, handleUpdateCaseStatus] + ); + const handleDispatchUpdate = useCallback( + (args: Omit<UpdateCase, 'refetchCasesStatus'>) => { + dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); + }, + [dispatchUpdateCaseProperty, fetchCasesStatus] + ); + + const goToCreateCase = useCallback( + (ev) => { + ev.preventDefault(); + if (isModal && onRowClick != null) { + onRowClick(); + } else if (onCreateCaseNavClick) { + onCreateCaseNavClick(ev); + } + }, + [isModal, onCreateCaseNavClick, onRowClick] + ); + + const actions = useMemo( + () => + getActions({ + caseStatus: filterOptions.status, + deleteCaseOnClick: toggleDeleteModal, + dispatchUpdate: handleDispatchUpdate, + }), + [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] + ); + + const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); + + const tableOnChangeCallback = useCallback( + ({ page, sort }: EuiBasicTableOnChange) => { + let newQueryParams = queryParams; + if (sort) { + newQueryParams = { + ...newQueryParams, + sortField: getSortField(sort.field), + sortOrder: sort.direction, + }; + } + if (page) { + newQueryParams = { + ...newQueryParams, + page: page.index + 1, + perPage: page.size, + }; + } + setQueryParams(newQueryParams); + refreshCases(false); + }, + [queryParams, refreshCases, setQueryParams] + ); + + const onFilterChangedCallback = useCallback( + (newFilterOptions: Partial<FilterOptions>) => { + if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.closed) { + setQueryParams({ sortField: SortFieldCase.closedAt }); + } else if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.open) { + setQueryParams({ sortField: SortFieldCase.createdAt }); + } else if ( + newFilterOptions.status && + newFilterOptions.status === CaseStatuses['in-progress'] + ) { + setQueryParams({ sortField: SortFieldCase.updatedAt }); + } + setFilters(newFilterOptions); + refreshCases(false); + }, + [refreshCases, setQueryParams, setFilters] + ); + + const memoizedGetCasesColumns = useMemo( + () => + getCasesColumns({ + actions: userCanCrud ? actions : [], + filterStatus: filterOptions.status, + isModal, + getCaseDetailsHref, + onCaseDetailsNavClick, + }), + [ + userCanCrud, + actions, + filterOptions.status, + isModal, + getCaseDetailsHref, + onCaseDetailsNavClick, + ] + ); + + const itemIdToExpandedRowMap = useMemo( + () => + getExpandedRowMap({ + columns: memoizedGetCasesColumns, + data: data.cases, + isModal, + onSubCaseClick: onRowClick, + }), + [data.cases, isModal, memoizedGetCasesColumns, onRowClick] + ); + + const memoizedPagination = useMemo( + () => ({ + pageIndex: queryParams.page - 1, + pageSize: queryParams.perPage, + totalItemCount: data.total, + pageSizeOptions: [5, 10, 15, 20, 25], + }), + [data, queryParams] + ); + + const sorting: EuiTableSortingType<Case> = { + sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, + }; + + const euiBasicTableSelectionProps = useMemo<EuiTableSelectionType<Case>>( + () => ({ + onSelectionChange: setSelectedCases, + selectableMessage: (selectable) => (!selectable ? SELECTABLE_MESSAGE_COLLECTIONS : ''), + }), + [setSelectedCases] + ); + const isCasesLoading = useMemo( + () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, + [loading] + ); + const isDataEmpty = useMemo(() => data.total === 0, [data]); + + const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); + + const tableRowProps = useCallback( + (theCase: Case) => { + const onTableRowClick = memoize(() => { + if (onRowClick) { + onRowClick(theCase); + } + }); + + return { + 'data-test-subj': `cases-table-row-${theCase.id}`, + className: classnames({ isDisabled: theCase.type === CaseType.collection }), + ...(isModal && theCase.type !== CaseType.collection ? { onClick: onTableRowClick } : {}), + }; + }, + [isModal, onRowClick] + ); + + const enableBuckActions = userCanCrud && !isModal; + + return ( + <> + {!isEmpty(actionsErrors) && ( + <CaseCallOut title={ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={actionsErrors} /> + )} + {!isModal && ( + <CaseHeaderPage title={i18n.PAGE_TITLE}> + <EuiFlexGroup + alignItems="center" + gutterSize="m" + responsive={false} + wrap={true} + data-test-subj="all-cases-header" + > + <EuiFlexItem grow={false}> + <Stats + dataTestSubj="openStatsHeader" + caseCount={countOpenCases} + caseStatus={CaseStatuses.open} + isLoading={isCasesStatusLoading} + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <Stats + dataTestSubj="inProgressStatsHeader" + caseCount={countInProgressCases} + caseStatus={CaseStatuses['in-progress']} + isLoading={isCasesStatusLoading} + /> + </EuiFlexItem> + <FlexItemDivider grow={false}> + <Stats + dataTestSubj="closedStatsHeader" + caseCount={countClosedCases} + caseStatus={CaseStatuses.closed} + isLoading={isCasesStatusLoading} + /> + </FlexItemDivider> + <EuiFlexItem grow={false}> + <ConfigureCaseButton + configureCasesHref={configureCasesHref} + onConfigureCasesNavClick={onConfigureCasesNavClick} + label={i18n.CONFIGURE_CASES_BUTTON} + isDisabled={!isEmpty(actionsErrors) || !userCanCrud} + showToolTip={!isEmpty(actionsErrors)} + msgTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].description : <></>} + titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <LinkButton + isDisabled={!userCanCrud} + fill + onClick={onCreateCaseNavClick} + href={createCaseHref} + iconType="plusInCircle" + data-test-subj="createNewCaseBtn" + > + {i18n.CREATE_TITLE} + </LinkButton> + </EuiFlexItem> + </EuiFlexGroup> + </CaseHeaderPage> + )} + {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( + <ProgressLoader size="xs" color="accent" className="essentialAnimation" /> + )} + <TableWrap data-test-subj="table-wrap" loading={!isModal ? isCasesLoading : undefined}> + <CasesTableFilters + countClosedCases={data.countClosedCases} + countOpenCases={data.countOpenCases} + countInProgressCases={data.countInProgressCases} + onFilterChanged={onFilterChangedCallback} + initial={{ + search: filterOptions.search, + reporters: filterOptions.reporters, + tags: filterOptions.tags, + status: filterOptions.status, + }} + setFilterRefetch={setFilterRefetch} + disabledStatuses={disabledStatuses} + /> + {isCasesLoading && isDataEmpty ? ( + <Div> + <EuiLoadingContent data-test-subj="initialLoadingPanelAllCases" lines={10} /> + </Div> + ) : ( + <Div> + <UtilityBar border> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText data-test-subj="case-table-case-count"> + {i18n.SHOWING_CASES(data.total ?? 0)} + </UtilityBarText> + </UtilityBarGroup> + {!isModal && ( + <UtilityBarGroup data-test-subj="case-table-utility-bar-actions"> + {enableBuckActions && ( + <UtilityBarText data-test-subj="case-table-selected-case-count"> + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} + </UtilityBarText> + )} + {enableBuckActions && ( + <UtilityBarAction + data-test-subj="case-table-bulk-actions" + iconSide="right" + iconType="arrowDown" + popoverContent={getBulkItemsPopoverContent} + > + {i18n.BULK_ACTIONS} + </UtilityBarAction> + )} + <UtilityBarAction iconSide="left" iconType="refresh" onClick={refreshCases}> + {i18n.REFRESH} + </UtilityBarAction> + </UtilityBarGroup> + )} + </UtilityBarSection> + </UtilityBar> + <BasicTable + columns={memoizedGetCasesColumns} + data-test-subj="cases-table" + isSelectable={enableBuckActions} + itemId="id" + items={data.cases} + itemIdToExpandedRowMap={itemIdToExpandedRowMap} + noItemsMessage={ + <EuiEmptyPrompt + title={<h3>{i18n.NO_CASES}</h3>} + titleSize="xs" + body={i18n.NO_CASES_BODY} + actions={ + <LinkButton + isDisabled={!userCanCrud} + fill + size="s" + onClick={goToCreateCase} + href={createCaseHref} + iconType="plusInCircle" + data-test-subj="cases-table-add-case" + > + {i18n.ADD_NEW_CASE} + </LinkButton> + } + /> + } + onChange={tableOnChangeCallback} + pagination={memoizedPagination} + rowProps={tableRowProps} + selection={enableBuckActions ? euiBasicTableSelectionProps : undefined} + sorting={sorting} + className={classnames({ isModal })} + /> + </Div> + )} + </TableWrap> + {confirmDeleteModal} + </> + ); + } +); + +AllCases.displayName = 'AllCases'; + +// eslint-disable-next-line import/no-default-export +export { AllCases as default }; diff --git a/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx b/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx new file mode 100644 index 0000000000000..a7c4cc68bfe24 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor } from '@testing-library/react'; + +import { CaseStatuses } from '../../../common'; +import { StatusFilter } from './status_filter'; +import { StatusAll } from '../status'; + +const stats = { + [StatusAll]: 0, + [CaseStatuses.open]: 2, + [CaseStatuses['in-progress']]: 5, + [CaseStatuses.closed]: 7, +}; + +describe('StatusFilter', () => { + const onStatusChanged = jest.fn(); + const defaultProps = { + selectedStatus: CaseStatuses.open, + onStatusChanged, + stats, + }; + + it('should render', () => { + const wrapper = mount(<StatusFilter {...defaultProps} />); + + expect(wrapper.find('[data-test-subj="case-status-filter"]').exists()).toBeTruthy(); + }); + + it('should call onStatusChanged when changing status to open', async () => { + const wrapper = mount(<StatusFilter {...defaultProps} />); + + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-open"]').simulate('click'); + await waitFor(() => { + expect(onStatusChanged).toBeCalledWith('open'); + }); + }); + + it('should call onStatusChanged when changing status to in-progress', async () => { + const wrapper = mount(<StatusFilter {...defaultProps} />); + + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').simulate('click'); + await waitFor(() => { + expect(onStatusChanged).toBeCalledWith('in-progress'); + }); + }); + + it('should call onStatusChanged when changing status to closed', async () => { + const wrapper = mount(<StatusFilter {...defaultProps} />); + + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-closed"]').simulate('click'); + await waitFor(() => { + expect(onStatusChanged).toBeCalledWith('closed'); + }); + }); + + it('should disabled selected statuses', () => { + const wrapper = mount( + <StatusFilter {...defaultProps} disabledStatuses={[CaseStatuses.closed]} /> + ); + + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + + expect( + wrapper.find('button[data-test-subj="case-status-filter-open"]').prop('disabled') + ).toBeFalsy(); + + expect( + wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').prop('disabled') + ).toBeFalsy(); + + expect( + wrapper.find('button[data-test-subj="case-status-filter-closed"]').prop('disabled') + ).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx b/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx new file mode 100644 index 0000000000000..34186a201cc05 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiSuperSelect, EuiSuperSelectOption, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { Status, statuses, StatusAll, CaseStatusWithAllStatus } from '../status'; + +interface Props { + stats: Record<CaseStatusWithAllStatus, number | null>; + selectedStatus: CaseStatusWithAllStatus; + onStatusChanged: (status: CaseStatusWithAllStatus) => void; + disabledStatuses?: CaseStatusWithAllStatus[]; +} + +const StatusFilterComponent: React.FC<Props> = ({ + stats, + selectedStatus, + onStatusChanged, + disabledStatuses = [], +}) => { + const caseStatuses = Object.keys(statuses) as CaseStatusWithAllStatus[]; + const options: Array<EuiSuperSelectOption<CaseStatusWithAllStatus>> = [ + StatusAll, + ...caseStatuses, + ].map((status) => ({ + value: status, + inputDisplay: ( + <EuiFlexGroup gutterSize="xs" alignItems={'center'}> + <EuiFlexItem grow={false}> + <Status type={status} /> + </EuiFlexItem> + {status !== StatusAll && <EuiFlexItem grow={false}>{` (${stats[status]})`}</EuiFlexItem>} + </EuiFlexGroup> + ), + disabled: disabledStatuses.includes(status), + 'data-test-subj': `case-status-filter-${status}`, + })); + + return ( + <EuiSuperSelect + options={options} + valueOfSelected={selectedStatus} + onChange={onStatusChanged} + data-test-subj="case-status-filter" + /> + ); +}; + +export const StatusFilter = memo(StatusFilterComponent); diff --git a/x-pack/plugins/cases/public/components/all_cases/table_filters.test.tsx b/x-pack/plugins/cases/public/components/all_cases/table_filters.test.tsx new file mode 100644 index 0000000000000..20892ce8e9c5d --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/table_filters.test.tsx @@ -0,0 +1,171 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CaseStatuses } from '../../../common'; +import { TestProviders } from '../../common/mock'; +import { useGetTags } from '../../containers/use_get_tags'; +import { useGetReporters } from '../../containers/use_get_reporters'; +import { DEFAULT_FILTER_OPTIONS } from '../../containers/use_get_cases'; +import { CasesTableFilters } from './table_filters'; + +jest.mock('../../containers/use_get_reporters'); +jest.mock('../../containers/use_get_tags'); + +const onFilterChanged = jest.fn(); +const fetchReporters = jest.fn(); +const fetchTags = jest.fn(); +const setFilterRefetch = jest.fn(); + +const props = { + countClosedCases: 1234, + countOpenCases: 99, + countInProgressCases: 54, + onFilterChanged, + initial: DEFAULT_FILTER_OPTIONS, + setFilterRefetch, +}; + +describe('CasesTableFilters ', () => { + beforeEach(() => { + jest.resetAllMocks(); + (useGetTags as jest.Mock).mockReturnValue({ tags: ['coke', 'pepsi'], fetchTags }); + (useGetReporters as jest.Mock).mockReturnValue({ + reporters: ['casetester'], + respReporters: [{ username: 'casetester' }], + isLoading: true, + isError: false, + fetchReporters, + }); + }); + + it('should render the case status filter dropdown', () => { + const wrapper = mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="case-status-filter"]`).first().exists()).toBeTruthy(); + }); + + it('should call onFilterChange when selected tags change', () => { + const wrapper = mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + wrapper.find(`[data-test-subj="options-filter-popover-button-Tags"]`).last().simulate('click'); + wrapper.find(`[data-test-subj="options-filter-popover-item-0"]`).last().simulate('click'); + + expect(onFilterChanged).toBeCalledWith({ tags: ['coke'] }); + }); + + it('should call onFilterChange when selected reporters change', () => { + const wrapper = mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + wrapper + .find(`[data-test-subj="options-filter-popover-button-Reporter"]`) + .last() + .simulate('click'); + + wrapper.find(`[data-test-subj="options-filter-popover-item-0"]`).last().simulate('click'); + + expect(onFilterChanged).toBeCalledWith({ reporters: [{ username: 'casetester' }] }); + }); + + it('should call onFilterChange when search changes', () => { + const wrapper = mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + + wrapper + .find(`[data-test-subj="search-cases"]`) + .last() + .simulate('keyup', { key: 'Enter', target: { value: 'My search' } }); + expect(onFilterChanged).toBeCalledWith({ search: 'My search' }); + }); + + it('should call onFilterChange when changing status', () => { + const wrapper = mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); + wrapper.find('button[data-test-subj="case-status-filter-closed"]').simulate('click'); + expect(onFilterChanged).toBeCalledWith({ status: CaseStatuses.closed }); + }); + + it('should call on load setFilterRefetch', () => { + mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + expect(setFilterRefetch).toHaveBeenCalled(); + }); + + it('should remove tag from selected tags when tag no longer exists', () => { + const ourProps = { + ...props, + initial: { + ...DEFAULT_FILTER_OPTIONS, + tags: ['pepsi', 'rc'], + }, + }; + mount( + <TestProviders> + <CasesTableFilters {...ourProps} /> + </TestProviders> + ); + expect(onFilterChanged).toHaveBeenCalledWith({ tags: ['pepsi'] }); + }); + + it('should remove reporter from selected reporters when reporter no longer exists', () => { + const ourProps = { + ...props, + initial: { + ...DEFAULT_FILTER_OPTIONS, + reporters: [ + { username: 'casetester', full_name: null, email: null }, + { username: 'batman', full_name: null, email: null }, + ], + }, + }; + mount( + <TestProviders> + <CasesTableFilters {...ourProps} /> + </TestProviders> + ); + expect(onFilterChanged).toHaveBeenCalledWith({ reporters: [{ username: 'casetester' }] }); + }); + + it('StatusFilterWrapper should have a fixed width of 180px', () => { + const wrapper = mount( + <TestProviders> + <CasesTableFilters {...props} /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="status-filter-wrapper"]').first()).toHaveStyleRule( + 'flex-basis', + '180px', + { + modifier: '&&', + } + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx b/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx new file mode 100644 index 0000000000000..726dbd680e3b8 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx @@ -0,0 +1,196 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useState, useMemo } from 'react'; +import { isEqual } from 'lodash/fp'; +import styled from 'styled-components'; +import { EuiFlexGroup, EuiFlexItem, EuiFieldSearch, EuiFilterGroup } from '@elastic/eui'; + +import { CaseStatuses } from '../../../common'; +import { FilterOptions } from '../../containers/types'; +import { useGetTags } from '../../containers/use_get_tags'; +import { useGetReporters } from '../../containers/use_get_reporters'; +import { FilterPopover } from '../filter_popover'; +import { CaseStatusWithAllStatus, StatusAll } from '../status'; +import { StatusFilter } from './status_filter'; + +import * as i18n from './translations'; +interface CasesTableFiltersProps { + countClosedCases: number | null; + countInProgressCases: number | null; + countOpenCases: number | null; + onFilterChanged: (filterOptions: Partial<FilterOptions>) => void; + initial: FilterOptions; + setFilterRefetch: (val: () => void) => void; + disabledStatuses?: CaseStatuses[]; +} + +// Fix the width of the status dropdown to prevent hiding long text items +const StatusFilterWrapper = styled(EuiFlexItem)` + && { + flex-basis: 180px; + } +`; + +/** + * Collection of filters for filtering data within the CasesTable. Contains search bar, + * and tag selection + * + * @param onFilterChanged change listener to be notified on filter changes + */ + +const defaultInitial = { + search: '', + reporters: [], + status: StatusAll, + tags: [], +}; + +const CasesTableFiltersComponent = ({ + countClosedCases, + countOpenCases, + countInProgressCases, + onFilterChanged, + initial = defaultInitial, + setFilterRefetch, + disabledStatuses, +}: CasesTableFiltersProps) => { + const [selectedReporters, setSelectedReporters] = useState( + initial.reporters.map((r) => r.full_name ?? r.username ?? '') + ); + const [search, setSearch] = useState(initial.search); + const [selectedTags, setSelectedTags] = useState(initial.tags); + const { tags, fetchTags } = useGetTags(); + const { reporters, respReporters, fetchReporters } = useGetReporters(); + + const refetch = useCallback(() => { + fetchTags(); + fetchReporters(); + }, [fetchReporters, fetchTags]); + + useEffect(() => { + if (setFilterRefetch != null) { + setFilterRefetch(refetch); + } + }, [refetch, setFilterRefetch]); + + const handleSelectedReporters = useCallback( + (newReporters) => { + if (!isEqual(newReporters, selectedReporters)) { + setSelectedReporters(newReporters); + const reportersObj = respReporters.filter( + (r) => newReporters.includes(r.username) || newReporters.includes(r.full_name) + ); + onFilterChanged({ reporters: reportersObj }); + } + }, + [selectedReporters, respReporters, onFilterChanged] + ); + + useEffect(() => { + if (selectedReporters.length) { + const newReporters = selectedReporters.filter((r) => reporters.includes(r)); + handleSelectedReporters(newReporters); + } + }, [handleSelectedReporters, reporters, selectedReporters]); + + const handleSelectedTags = useCallback( + (newTags) => { + if (!isEqual(newTags, selectedTags)) { + setSelectedTags(newTags); + onFilterChanged({ tags: newTags }); + } + }, + [onFilterChanged, selectedTags] + ); + + useEffect(() => { + if (selectedTags.length) { + const newTags = selectedTags.filter((t) => tags.includes(t)); + handleSelectedTags(newTags); + } + }, [handleSelectedTags, selectedTags, tags]); + + const handleOnSearch = useCallback( + (newSearch) => { + const trimSearch = newSearch.trim(); + if (!isEqual(trimSearch, search)) { + setSearch(trimSearch); + onFilterChanged({ search: trimSearch }); + } + }, + [onFilterChanged, search] + ); + + const onStatusChanged = useCallback( + (status: CaseStatusWithAllStatus) => { + onFilterChanged({ status }); + }, + [onFilterChanged] + ); + + const stats = useMemo( + () => ({ + [StatusAll]: null, + [CaseStatuses.open]: countOpenCases ?? 0, + [CaseStatuses['in-progress']]: countInProgressCases ?? 0, + [CaseStatuses.closed]: countClosedCases ?? 0, + }), + [countClosedCases, countInProgressCases, countOpenCases] + ); + + return ( + <EuiFlexGroup gutterSize="s" justifyContent="flexEnd"> + <EuiFlexItem> + <EuiFlexGroup gutterSize="s"> + <EuiFlexItem> + <EuiFieldSearch + aria-label={i18n.SEARCH_CASES} + data-test-subj="search-cases" + fullWidth + incremental={false} + placeholder={i18n.SEARCH_PLACEHOLDER} + onSearch={handleOnSearch} + /> + </EuiFlexItem> + <StatusFilterWrapper grow={false} data-test-subj="status-filter-wrapper"> + <StatusFilter + selectedStatus={initial.status} + onStatusChanged={onStatusChanged} + stats={stats} + disabledStatuses={disabledStatuses} + /> + </StatusFilterWrapper> + </EuiFlexGroup> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiFilterGroup> + <FilterPopover + buttonLabel={i18n.REPORTER} + onSelectedOptionsChanged={handleSelectedReporters} + selectedOptions={selectedReporters} + options={reporters} + optionsEmptyLabel={i18n.NO_REPORTERS_AVAILABLE} + /> + <FilterPopover + buttonLabel={i18n.TAGS} + onSelectedOptionsChanged={handleSelectedTags} + selectedOptions={selectedTags} + options={tags} + optionsEmptyLabel={i18n.NO_TAGS_AVAILABLE} + /> + </EuiFilterGroup> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +CasesTableFiltersComponent.displayName = 'CasesTableFiltersComponent'; + +export const CasesTableFilters = React.memo(CasesTableFiltersComponent); + +CasesTableFilters.displayName = 'CasesTableFilters'; diff --git a/x-pack/plugins/cases/public/components/all_cases/translations.ts b/x-pack/plugins/cases/public/components/all_cases/translations.ts new file mode 100644 index 0000000000000..0f535b771ec8a --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/translations.ts @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../common/translations'; + +export const NO_CASES = i18n.translate('xpack.cases.caseTable.noCases.title', { + defaultMessage: 'No Cases', +}); +export const NO_CASES_BODY = i18n.translate('xpack.cases.caseTable.noCases.body', { + defaultMessage: + 'There are no cases to display. Please create a new case or change your filter settings above.', +}); + +export const ADD_NEW_CASE = i18n.translate('xpack.cases.caseTable.addNewCase', { + defaultMessage: 'Add New Case', +}); + +export const SHOWING_SELECTED_CASES = (totalRules: number) => + i18n.translate('xpack.cases.caseTable.selectedCasesTitle', { + values: { totalRules }, + defaultMessage: 'Selected {totalRules} {totalRules, plural, =1 {case} other {cases}}', + }); + +export const SHOWING_CASES = (totalRules: number) => + i18n.translate('xpack.cases.caseTable.showingCasesTitle', { + values: { totalRules }, + defaultMessage: 'Showing {totalRules} {totalRules, plural, =1 {case} other {cases}}', + }); + +export const UNIT = (totalCount: number) => + i18n.translate('xpack.cases.caseTable.unit', { + values: { totalCount }, + defaultMessage: `{totalCount, plural, =1 {case} other {cases}}`, + }); + +export const SEARCH_CASES = i18n.translate('xpack.cases.caseTable.searchAriaLabel', { + defaultMessage: 'Search cases', +}); + +export const BULK_ACTIONS = i18n.translate('xpack.cases.caseTable.bulkActions', { + defaultMessage: 'Bulk actions', +}); + +export const EXTERNAL_INCIDENT = i18n.translate('xpack.cases.caseTable.snIncident', { + defaultMessage: 'External Incident', +}); + +export const INCIDENT_MANAGEMENT_SYSTEM = i18n.translate('xpack.cases.caseTable.incidentSystem', { + defaultMessage: 'Incident Management System', +}); + +export const SEARCH_PLACEHOLDER = i18n.translate('xpack.cases.caseTable.searchPlaceholder', { + defaultMessage: 'e.g. case name', +}); + +export const CLOSED = i18n.translate('xpack.cases.caseTable.closed', { + defaultMessage: 'Closed', +}); + +export const DELETE = i18n.translate('xpack.cases.caseTable.delete', { + defaultMessage: 'Delete', +}); + +export const REQUIRES_UPDATE = i18n.translate('xpack.cases.caseTable.requiresUpdate', { + defaultMessage: ' requires update', +}); + +export const UP_TO_DATE = i18n.translate('xpack.cases.caseTable.upToDate', { + defaultMessage: ' is up to date', +}); +export const NOT_PUSHED = i18n.translate('xpack.cases.caseTable.notPushed', { + defaultMessage: 'Not pushed', +}); + +export const REFRESH = i18n.translate('xpack.cases.caseTable.refreshTitle', { + defaultMessage: 'Refresh', +}); + +export const SERVICENOW_LINK_ARIA = i18n.translate('xpack.cases.caseTable.serviceNowLinkAria', { + defaultMessage: 'click to view the incident on servicenow', +}); + +export const STATUS = i18n.translate('xpack.cases.caseTable.status', { + defaultMessage: 'Status', +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/types.ts b/x-pack/plugins/cases/public/components/all_cases/types.ts new file mode 100644 index 0000000000000..5014522177570 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/types.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/naming-convention */ + +export const sort_order = t.keyof({ asc: null, desc: null }); +export type SortOrder = t.TypeOf<typeof sort_order>; + +export interface EuiBasicTableSortTypes { + field: string; + direction: SortOrder; +} + +export interface EuiBasicTableOnChange { + page: { + index: number; + size: number; + }; + sort?: EuiBasicTableSortTypes; +} diff --git a/x-pack/plugins/cases/public/components/bulk_actions/index.tsx b/x-pack/plugins/cases/public/components/bulk_actions/index.tsx new file mode 100644 index 0000000000000..7ab24b2e3ab8f --- /dev/null +++ b/x-pack/plugins/cases/public/components/bulk_actions/index.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiContextMenuItem } from '@elastic/eui'; + +import { CaseStatuses } from '../../../common'; +import { statuses, CaseStatusWithAllStatus } from '../status'; +import * as i18n from './translations'; +import { Case } from '../../containers/types'; + +interface GetBulkItems { + caseStatus: CaseStatusWithAllStatus; + closePopover: () => void; + deleteCasesAction: (cases: Case[]) => void; + selectedCases: Case[]; + updateCaseStatus: (status: string) => void; + includeCollections: boolean; +} + +export const getBulkItems = ({ + caseStatus, + closePopover, + deleteCasesAction, + selectedCases, + updateCaseStatus, + includeCollections, +}: GetBulkItems) => { + let statusMenuItems: JSX.Element[] = []; + + const openMenuItem = ( + <EuiContextMenuItem + data-test-subj="cases-bulk-open-button" + disabled={selectedCases.length === 0 || includeCollections} + key="cases-bulk-open-button" + icon={statuses[CaseStatuses.open].icon} + onClick={() => { + closePopover(); + updateCaseStatus(CaseStatuses.open); + }} + > + {statuses[CaseStatuses.open].actions.bulk.title} + </EuiContextMenuItem> + ); + + const inProgressMenuItem = ( + <EuiContextMenuItem + data-test-subj="cases-bulk-in-progress-button" + disabled={selectedCases.length === 0 || includeCollections} + key="cases-bulk-in-progress-button" + icon={statuses[CaseStatuses['in-progress']].icon} + onClick={() => { + closePopover(); + updateCaseStatus(CaseStatuses['in-progress']); + }} + > + {statuses[CaseStatuses['in-progress']].actions.bulk.title} + </EuiContextMenuItem> + ); + + const closeMenuItem = ( + <EuiContextMenuItem + data-test-subj="cases-bulk-close-button" + disabled={selectedCases.length === 0 || includeCollections} + key="cases-bulk-close-button" + icon={statuses[CaseStatuses.closed].icon} + onClick={() => { + closePopover(); + updateCaseStatus(CaseStatuses.closed); + }} + > + {statuses[CaseStatuses.closed].actions.bulk.title} + </EuiContextMenuItem> + ); + + switch (caseStatus) { + case CaseStatuses.open: + statusMenuItems = [inProgressMenuItem, closeMenuItem]; + break; + + case CaseStatuses['in-progress']: + statusMenuItems = [openMenuItem, closeMenuItem]; + break; + + case CaseStatuses.closed: + statusMenuItems = [openMenuItem, inProgressMenuItem]; + break; + + default: + break; + } + + return [ + ...statusMenuItems, + <EuiContextMenuItem + data-test-subj="cases-bulk-delete-button" + key={i18n.BULK_ACTION_DELETE_SELECTED} + icon="trash" + disabled={selectedCases.length === 0} + onClick={() => { + closePopover(); + deleteCasesAction(selectedCases); + }} + > + {i18n.BULK_ACTION_DELETE_SELECTED} + </EuiContextMenuItem>, + ]; +}; diff --git a/x-pack/plugins/cases/public/components/bulk_actions/translations.ts b/x-pack/plugins/cases/public/components/bulk_actions/translations.ts new file mode 100644 index 0000000000000..c5bc5d7cde66b --- /dev/null +++ b/x-pack/plugins/cases/public/components/bulk_actions/translations.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const BULK_ACTION_DELETE_SELECTED = i18n.translate( + 'xpack.cases.caseTable.bulkActions.deleteSelectedTitle', + { + defaultMessage: 'Delete selected', + } +); diff --git a/x-pack/plugins/cases/public/components/callout/callout.test.tsx b/x-pack/plugins/cases/public/components/callout/callout.test.tsx new file mode 100644 index 0000000000000..926fe7b63fb5a --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/callout.test.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CallOut, CallOutProps } from './callout'; + +describe('Callout', () => { + const defaultProps: CallOutProps = { + id: 'md5-hex', + type: 'primary', + title: 'a tittle', + messages: [ + { + id: 'generic-error', + title: 'message-one', + description: <p>{'error'}</p>, + }, + ], + showCallOut: true, + handleDismissCallout: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('It renders the callout', () => { + const wrapper = mount(<CallOut {...defaultProps} />); + expect(wrapper.find(`[data-test-subj="case-callout-md5-hex"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="callout-messages-md5-hex"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="callout-dismiss-md5-hex"]`).exists()).toBeTruthy(); + }); + + it('hides the callout', () => { + const wrapper = mount(<CallOut {...defaultProps} showCallOut={false} />); + expect(wrapper.find(`[data-test-subj="case-callout-md5-hex"]`).exists()).toBeFalsy(); + }); + + it('does not shows any messages when the list is empty', () => { + const wrapper = mount(<CallOut {...defaultProps} messages={[]} />); + expect(wrapper.find(`[data-test-subj="callout-messages-md5-hex"]`).exists()).toBeFalsy(); + }); + + it('transform the button color correctly - primary', () => { + const wrapper = mount(<CallOut {...defaultProps} />); + const className = + wrapper.find(`button[data-test-subj="callout-dismiss-md5-hex"]`).first().prop('className') ?? + ''; + expect(className.includes('euiButton--primary')).toBeTruthy(); + }); + + it('transform the button color correctly - success', () => { + const wrapper = mount(<CallOut {...defaultProps} type={'success'} />); + const className = + wrapper.find(`button[data-test-subj="callout-dismiss-md5-hex"]`).first().prop('className') ?? + ''; + expect(className.includes('euiButton--secondary')).toBeTruthy(); + }); + + it('transform the button color correctly - warning', () => { + const wrapper = mount(<CallOut {...defaultProps} type={'warning'} />); + const className = + wrapper.find(`button[data-test-subj="callout-dismiss-md5-hex"]`).first().prop('className') ?? + ''; + expect(className.includes('euiButton--warning')).toBeTruthy(); + }); + + it('transform the button color correctly - danger', () => { + const wrapper = mount(<CallOut {...defaultProps} type={'danger'} />); + const className = + wrapper.find(`button[data-test-subj="callout-dismiss-md5-hex"]`).first().prop('className') ?? + ''; + expect(className.includes('euiButton--danger')).toBeTruthy(); + }); + + it('dismiss the callout correctly', () => { + const wrapper = mount(<CallOut {...defaultProps} messages={[]} />); + expect(wrapper.find(`[data-test-subj="callout-dismiss-md5-hex"]`).exists()).toBeTruthy(); + wrapper.find(`button[data-test-subj="callout-dismiss-md5-hex"]`).simulate('click'); + wrapper.update(); + + expect(defaultProps.handleDismissCallout).toHaveBeenCalledWith('md5-hex', 'primary'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/callout/callout.tsx b/x-pack/plugins/cases/public/components/callout/callout.tsx new file mode 100644 index 0000000000000..8e2f439f02c4b --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/callout.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiCallOut, EuiButton, EuiDescriptionList } from '@elastic/eui'; +import { isEmpty } from 'lodash/fp'; +import React, { memo, useCallback } from 'react'; + +import { ErrorMessage } from './types'; +import * as i18n from './translations'; + +export interface CallOutProps { + id: string; + type: NonNullable<ErrorMessage['errorType']>; + title: string; + messages: ErrorMessage[]; + showCallOut: boolean; + handleDismissCallout: (id: string, type: NonNullable<ErrorMessage['errorType']>) => void; +} + +const CallOutComponent = ({ + id, + type, + title, + messages, + showCallOut, + handleDismissCallout, +}: CallOutProps) => { + const handleCallOut = useCallback(() => handleDismissCallout(id, type), [ + handleDismissCallout, + id, + type, + ]); + + return showCallOut ? ( + <EuiCallOut title={title} color={type} iconType="gear" data-test-subj={`case-callout-${id}`}> + {!isEmpty(messages) && ( + <EuiDescriptionList data-test-subj={`callout-messages-${id}`} listItems={messages} /> + )} + <EuiButton + data-test-subj={`callout-dismiss-${id}`} + color={type === 'success' ? 'secondary' : type} + onClick={handleCallOut} + > + {i18n.DISMISS_CALLOUT} + </EuiButton> + </EuiCallOut> + ) : null; +}; + +export const CallOut = memo(CallOutComponent); diff --git a/x-pack/plugins/cases/public/components/callout/helpers.test.tsx b/x-pack/plugins/cases/public/components/callout/helpers.test.tsx new file mode 100644 index 0000000000000..b5b92a3374874 --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/helpers.test.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import md5 from 'md5'; +import { createCalloutId } from './helpers'; + +describe('createCalloutId', () => { + it('creates id correctly with one id', () => { + const digest = md5('one'); + const id = createCalloutId(['one']); + expect(id).toBe(digest); + }); + + it('creates id correctly with multiples ids', () => { + const digest = md5('one|two|three'); + const id = createCalloutId(['one', 'two', 'three']); + expect(id).toBe(digest); + }); + + it('creates id correctly with multiples ids and delimiter', () => { + const digest = md5('one,two,three'); + const id = createCalloutId(['one', 'two', 'three'], ','); + expect(id).toBe(digest); + }); +}); diff --git a/x-pack/plugins/cases/public/components/callout/helpers.tsx b/x-pack/plugins/cases/public/components/callout/helpers.tsx new file mode 100644 index 0000000000000..2a7804579a57e --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/helpers.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import md5 from 'md5'; + +import * as i18n from './translations'; +import { ErrorMessage } from './types'; + +export const savedObjectReadOnlyErrorMessage: ErrorMessage = { + id: 'read-only-privileges-error', + title: i18n.READ_ONLY_SAVED_OBJECT_TITLE, + description: <>{i18n.READ_ONLY_SAVED_OBJECT_MSG}</>, + errorType: 'warning', +}; + +export const createCalloutId = (ids: string[], delimiter: string = '|'): string => + md5(ids.join(delimiter)); diff --git a/x-pack/plugins/cases/public/components/callout/index.test.tsx b/x-pack/plugins/cases/public/components/callout/index.test.tsx new file mode 100644 index 0000000000000..c46ec1b5606c9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/index.test.tsx @@ -0,0 +1,217 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { useMessagesStorage } from '../../containers/use_messages_storage'; +import { TestProviders } from '../../common/mock'; +import { createCalloutId } from './helpers'; +import { CaseCallOut, CaseCallOutProps } from '.'; + +jest.mock('../../containers/use_messages_storage'); + +const useSecurityLocalStorageMock = useMessagesStorage as jest.Mock; +const securityLocalStorageMock = { + getMessages: jest.fn(() => []), + addMessage: jest.fn(), +}; + +describe('CaseCallOut ', () => { + beforeEach(() => { + jest.clearAllMocks(); + useSecurityLocalStorageMock.mockImplementation(() => securityLocalStorageMock); + }); + + it('renders a callout correctly', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description: <p>{'we have two messages'}</p> }, + { id: 'message-two', title: 'title', description: <p>{'for real'}</p> }, + ], + }; + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const id = createCalloutId(['message-one', 'message-two']); + expect(wrapper.find(`[data-test-subj="callout-messages-${id}"]`).last().exists()).toBeTruthy(); + }); + + it('groups the messages correctly', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { + id: 'message-one', + title: 'title one', + description: <p>{'we have two messages'}</p>, + errorType: 'danger', + }, + { id: 'message-two', title: 'title two', description: <p>{'for real'}</p> }, + ], + }; + + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const idDanger = createCalloutId(['message-one']); + const idPrimary = createCalloutId(['message-two']); + + expect( + wrapper.find(`[data-test-subj="case-callout-${idPrimary}"]`).last().exists() + ).toBeTruthy(); + expect( + wrapper.find(`[data-test-subj="case-callout-${idDanger}"]`).last().exists() + ).toBeTruthy(); + }); + + it('dismisses the callout correctly', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description: <p>{'we have two messages'}</p> }, + ], + }; + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const id = createCalloutId(['message-one']); + + expect(wrapper.find(`[data-test-subj="case-callout-${id}"]`).last().exists()).toBeTruthy(); + wrapper.find(`[data-test-subj="callout-dismiss-${id}"]`).last().simulate('click'); + expect(wrapper.find(`[data-test-subj="case-callout-${id}"]`).exists()).toBeFalsy(); + }); + + it('persist the callout of type primary when dismissed', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description: <p>{'we have two messages'}</p> }, + ], + }; + + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const id = createCalloutId(['message-one']); + expect(securityLocalStorageMock.getMessages).toHaveBeenCalledWith('case'); + wrapper.find(`[data-test-subj="callout-dismiss-${id}"]`).last().simulate('click'); + expect(securityLocalStorageMock.addMessage).toHaveBeenCalledWith('case', id); + }); + + it('do not show the callout if is in the localStorage', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { id: 'message-one', title: 'title', description: <p>{'we have two messages'}</p> }, + ], + }; + + const id = createCalloutId(['message-one']); + + useSecurityLocalStorageMock.mockImplementation(() => ({ + ...securityLocalStorageMock, + getMessages: jest.fn(() => [id]), + })); + + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="case-callout-${id}"]`).last().exists()).toBeFalsy(); + }); + + it('do not persist a callout of type danger', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { + id: 'message-one', + title: 'title one', + description: <p>{'we have two messages'}</p>, + errorType: 'danger', + }, + ], + }; + + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const id = createCalloutId(['message-one']); + wrapper.find(`button[data-test-subj="callout-dismiss-${id}"]`).simulate('click'); + wrapper.update(); + expect(securityLocalStorageMock.addMessage).not.toHaveBeenCalled(); + }); + + it('do not persist a callout of type warning', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { + id: 'message-one', + title: 'title one', + description: <p>{'we have two messages'}</p>, + errorType: 'warning', + }, + ], + }; + + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const id = createCalloutId(['message-one']); + wrapper.find(`button[data-test-subj="callout-dismiss-${id}"]`).simulate('click'); + wrapper.update(); + expect(securityLocalStorageMock.addMessage).not.toHaveBeenCalled(); + }); + + it('do not persist a callout of type success', () => { + const props: CaseCallOutProps = { + title: 'hey title', + messages: [ + { + id: 'message-one', + title: 'title one', + description: <p>{'we have two messages'}</p>, + errorType: 'success', + }, + ], + }; + + const wrapper = mount( + <TestProviders> + <CaseCallOut {...props} /> + </TestProviders> + ); + + const id = createCalloutId(['message-one']); + wrapper.find(`button[data-test-subj="callout-dismiss-${id}"]`).simulate('click'); + wrapper.update(); + expect(securityLocalStorageMock.addMessage).not.toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/callout/index.tsx b/x-pack/plugins/cases/public/components/callout/index.tsx new file mode 100644 index 0000000000000..1994617d62801 --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/index.tsx @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiSpacer } from '@elastic/eui'; +import React, { memo, useCallback, useState, useMemo } from 'react'; + +import { useMessagesStorage } from '../../containers/use_messages_storage'; +import { CallOut } from './callout'; +import { ErrorMessage } from './types'; +import { createCalloutId } from './helpers'; + +export * from './helpers'; + +export interface CaseCallOutProps { + title: string; + messages?: ErrorMessage[]; +} + +type GroupByTypeMessages = { + [key in NonNullable<ErrorMessage['errorType']>]: { + messagesId: string[]; + messages: ErrorMessage[]; + }; +}; + +interface CalloutVisibility { + [index: string]: boolean; +} + +const CaseCallOutComponent = ({ title, messages = [] }: CaseCallOutProps) => { + const { getMessages, addMessage } = useMessagesStorage(); + + const caseMessages = useMemo(() => getMessages('case'), [getMessages]); + const dismissedCallouts = useMemo( + () => + caseMessages.reduce<CalloutVisibility>( + (acc, id) => ({ + ...acc, + [id]: false, + }), + {} + ), + [caseMessages] + ); + + const [calloutVisibility, setCalloutVisibility] = useState(dismissedCallouts); + const handleCallOut = useCallback( + (id, type) => { + setCalloutVisibility((prevState) => ({ ...prevState, [id]: false })); + if (type === 'primary') { + addMessage('case', id); + } + }, + [setCalloutVisibility, addMessage] + ); + + const groupedByTypeErrorMessages = useMemo( + () => + messages.reduce<GroupByTypeMessages>( + (acc: GroupByTypeMessages, currentMessage: ErrorMessage) => { + const type = currentMessage.errorType == null ? 'primary' : currentMessage.errorType; + return { + ...acc, + [type]: { + messagesId: [...(acc[type]?.messagesId ?? []), currentMessage.id], + messages: [...(acc[type]?.messages ?? []), currentMessage], + }, + }; + }, + {} as GroupByTypeMessages + ), + [messages] + ); + + return ( + <> + {(Object.keys(groupedByTypeErrorMessages) as Array<keyof ErrorMessage['errorType']>).map( + (type: NonNullable<ErrorMessage['errorType']>) => { + const id = createCalloutId(groupedByTypeErrorMessages[type].messagesId); + return ( + <React.Fragment key={id}> + <CallOut + id={id} + type={type} + title={title} + messages={groupedByTypeErrorMessages[type].messages} + showCallOut={calloutVisibility[id] ?? true} + handleDismissCallout={handleCallOut} + /> + <EuiSpacer /> + </React.Fragment> + ); + } + )} + </> + ); +}; + +export const CaseCallOut = memo(CaseCallOutComponent); diff --git a/x-pack/plugins/cases/public/components/callout/translations.ts b/x-pack/plugins/cases/public/components/callout/translations.ts new file mode 100644 index 0000000000000..3f551c5cf0170 --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/translations.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const READ_ONLY_SAVED_OBJECT_TITLE = i18n.translate('xpack.cases.readOnlySavedObjectTitle', { + defaultMessage: 'You cannot open new or update existing cases', +}); + +export const READ_ONLY_SAVED_OBJECT_MSG = i18n.translate( + 'xpack.cases.readOnlySavedObjectDescription', + { + defaultMessage: + 'You only have permissions to view cases. If you need to open and update cases, contact your Kibana administrator.', + } +); + +export const DISMISS_CALLOUT = i18n.translate('xpack.cases.dismissErrorsPushServiceCallOutTitle', { + defaultMessage: 'Dismiss', +}); diff --git a/x-pack/plugins/cases/public/components/callout/types.ts b/x-pack/plugins/cases/public/components/callout/types.ts new file mode 100644 index 0000000000000..84d79ee391b8f --- /dev/null +++ b/x-pack/plugins/cases/public/components/callout/types.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface ErrorMessage { + id: string; + title: string; + description: JSX.Element; + errorType?: 'primary' | 'success' | 'warning' | 'danger'; +} diff --git a/x-pack/plugins/cases/public/components/case_header_page/index.tsx b/x-pack/plugins/cases/public/components/case_header_page/index.tsx new file mode 100644 index 0000000000000..7e60db1030587 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_header_page/index.tsx @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { HeaderPage, HeaderPageProps } from '../header_page'; + +const CaseHeaderPageComponent: React.FC<HeaderPageProps> = (props) => <HeaderPage {...props} />; + +export const CaseHeaderPage = React.memo(CaseHeaderPageComponent); diff --git a/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx new file mode 100644 index 0000000000000..7ed6ece909a7a --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ReactWrapper, mount } from 'enzyme'; +import { EuiText } from '@elastic/eui'; + +import '../../common/mock/match_media'; +import { ConfigureCaseButton, ConfigureCaseButtonProps } from './button'; +import { TestProviders } from '../../common/mock'; + +jest.mock('react-router-dom', () => { + const original = jest.requireActual('react-router-dom'); + + return { + ...original, + useHistory: () => ({ + useHistory: jest.fn(), + }), + }; +}); + +describe('Configuration button', () => { + let wrapper: ReactWrapper; + const props: ConfigureCaseButtonProps = { + configureCasesHref: 'testHref', + isDisabled: false, + label: 'My label', + msgTooltip: <></>, + onConfigureCasesNavClick: jest.fn(), + showToolTip: false, + titleTooltip: '', + }; + + beforeAll(() => { + wrapper = mount(<ConfigureCaseButton {...props} />, { wrappingComponent: TestProviders }); + }); + + test('it renders without the tooltip', () => { + expect(wrapper.find('[data-test-subj="configure-case-button"]').first().exists()).toBe(true); + + expect(wrapper.find('[data-test-subj="configure-case-tooltip"]').first().exists()).toBe(false); + }); + + test('it pass the correct props to the button', () => { + expect(wrapper.find('[data-test-subj="configure-case-button"]').first().props()).toMatchObject({ + href: `testHref`, + iconType: 'controlsHorizontal', + isDisabled: false, + 'aria-label': 'My label', + children: 'My label', + }); + }); + + test('it renders the tooltip', () => { + const msgTooltip = <EuiText>{'My message tooltip'}</EuiText>; + + const newWrapper = mount( + <ConfigureCaseButton + {...props} + showToolTip={true} + titleTooltip={'My tooltip title'} + msgTooltip={msgTooltip} + />, + { + wrappingComponent: TestProviders, + } + ); + + expect(newWrapper.find('[data-test-subj="configure-case-tooltip"]').first().exists()).toBe( + true + ); + + expect(wrapper.find('[data-test-subj="configure-case-button"]').first().exists()).toBe(true); + }); + + test('it shows the tooltip when hovering the button', () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); + + const msgTooltip = 'My message tooltip'; + const titleTooltip = 'My title'; + + const newWrapper = mount( + <ConfigureCaseButton + {...props} + showToolTip={true} + titleTooltip={titleTooltip} + msgTooltip={<>{msgTooltip}</>} + />, + { + wrappingComponent: TestProviders, + } + ); + + newWrapper.find('[data-test-subj="configure-case-button"]').first().simulate('mouseOver'); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + newWrapper.update(); + expect(newWrapper.find('.euiToolTipPopover').text()).toBe(`${titleTooltip}${msgTooltip}`); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/configure_cases/button.tsx b/x-pack/plugins/cases/public/components/configure_cases/button.tsx new file mode 100644 index 0000000000000..0009400a7f389 --- /dev/null +++ b/x-pack/plugins/cases/public/components/configure_cases/button.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiToolTip } from '@elastic/eui'; +import React, { memo, useMemo } from 'react'; +import { LinkButton } from '../links'; + +export interface ConfigureCaseButtonProps { + configureCasesHref: string; + isDisabled: boolean; + label: string; + msgTooltip: JSX.Element; + onConfigureCasesNavClick?: (ev: React.MouseEvent) => void; + showToolTip: boolean; + titleTooltip: string; +} + +const ConfigureCaseButtonComponent: React.FC<ConfigureCaseButtonProps> = ({ + configureCasesHref, + isDisabled, + label, + msgTooltip, + onConfigureCasesNavClick, + showToolTip, + titleTooltip, +}: ConfigureCaseButtonProps) => { + const configureCaseButton = useMemo( + () => ( + <LinkButton + onClick={onConfigureCasesNavClick} + href={configureCasesHref} + iconType="controlsHorizontal" + isDisabled={isDisabled} + aria-label={label} + data-test-subj="configure-case-button" + > + {label} + </LinkButton> + ), + [label, isDisabled, onConfigureCasesNavClick, configureCasesHref] + ); + + return showToolTip ? ( + <EuiToolTip + position="top" + title={titleTooltip} + content={<p>{msgTooltip}</p>} + data-test-subj="configure-case-tooltip" + > + {configureCaseButton} + </EuiToolTip> + ) : ( + <>{configureCaseButton}</> + ); +}; + +export const ConfigureCaseButton = memo(ConfigureCaseButtonComponent); diff --git a/x-pack/plugins/cases/public/components/confirm_delete_case/index.tsx b/x-pack/plugins/cases/public/components/confirm_delete_case/index.tsx new file mode 100644 index 0000000000000..4d813c034dd1d --- /dev/null +++ b/x-pack/plugins/cases/public/components/confirm_delete_case/index.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiConfirmModal } from '@elastic/eui'; +import * as i18n from './translations'; + +interface ConfirmDeleteCaseModalProps { + caseTitle?: string; + isModalVisible: boolean; + isPlural: boolean; + onCancel: () => void; + onConfirm: () => void; +} + +const ConfirmDeleteCaseModalComp: React.FC<ConfirmDeleteCaseModalProps> = ({ + caseTitle, + isModalVisible, + isPlural, + onCancel, + onConfirm, +}) => { + if (!isModalVisible) { + return null; + } + return ( + <EuiConfirmModal + buttonColor="danger" + cancelButtonText={i18n.CANCEL} + confirmButtonText={isPlural ? i18n.DELETE_CASES : i18n.DELETE_CASE} + data-test-subj="confirm-delete-case-modal" + defaultFocusedButton="confirm" + onCancel={onCancel} + onConfirm={onConfirm} + title={ + isPlural + ? i18n.DELETE_SELECTED_CASES + : caseTitle == null + ? i18n.DELETE_THIS_CASE + : i18n.DELETE_TITLE(caseTitle) + } + > + {isPlural ? i18n.CONFIRM_QUESTION_PLURAL : i18n.CONFIRM_QUESTION} + </EuiConfirmModal> + ); +}; + +export const ConfirmDeleteCaseModal = React.memo(ConfirmDeleteCaseModalComp); diff --git a/x-pack/plugins/cases/public/components/confirm_delete_case/translations.ts b/x-pack/plugins/cases/public/components/confirm_delete_case/translations.ts new file mode 100644 index 0000000000000..0400c4c7fef41 --- /dev/null +++ b/x-pack/plugins/cases/public/components/confirm_delete_case/translations.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +export * from '../../common/translations'; + +export const DELETE_TITLE = (caseTitle: string) => + i18n.translate('xpack.cases.confirmDeleteCase.deleteTitle', { + values: { caseTitle }, + defaultMessage: 'Delete "{caseTitle}"', + }); + +export const DELETE_THIS_CASE = (caseTitle: string) => + i18n.translate('xpack.cases.confirmDeleteCase.deleteThisCase', { + defaultMessage: 'Delete this case', + }); + +export const CONFIRM_QUESTION = i18n.translate('xpack.cases.confirmDeleteCase.confirmQuestion', { + defaultMessage: + 'By deleting this case, all related case data will be permanently removed and you will no longer be able to push data to an external incident management system. Are you sure you wish to proceed?', +}); +export const DELETE_SELECTED_CASES = i18n.translate('xpack.cases.confirmDeleteCase.selectedCases', { + defaultMessage: 'Delete selected cases', +}); + +export const CONFIRM_QUESTION_PLURAL = i18n.translate( + 'xpack.cases.confirmDeleteCase.confirmQuestionPlural', + { + defaultMessage: + 'By deleting these cases, all related case data will be permanently removed and you will no longer be able to push data to an external incident management system. Are you sure you wish to proceed?', + } +); diff --git a/x-pack/plugins/cases/public/components/empty_value/__snapshots__/empty_value.test.tsx.snap b/x-pack/plugins/cases/public/components/empty_value/__snapshots__/empty_value.test.tsx.snap new file mode 100644 index 0000000000000..142ed7a0d7175 --- /dev/null +++ b/x-pack/plugins/cases/public/components/empty_value/__snapshots__/empty_value.test.tsx.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmptyValue it renders against snapshot 1`] = ` +<p> + (Empty String) +</p> +`; diff --git a/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx b/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx new file mode 100644 index 0000000000000..e1dfc71867f6e --- /dev/null +++ b/x-pack/plugins/cases/public/components/empty_value/empty_value.test.tsx @@ -0,0 +1,166 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount, shallow } from 'enzyme'; +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mountWithIntl } from '@kbn/test/jest'; + +import { + defaultToEmptyTag, + getEmptyString, + getEmptyStringTag, + getEmptyTagValue, + getEmptyValue, + getOrEmptyTag, +} from '.'; +import { getMockTheme } from '../../common/lib/kibana/kibana_react.mock'; + +describe('EmptyValue', () => { + const mockTheme = getMockTheme({ eui: { euiColorMediumShade: '#ece' } }); + + test('it renders against snapshot', () => { + const wrapper = shallow(<p>{getEmptyString()}</p>); + expect(wrapper).toMatchSnapshot(); + }); + + describe('#getEmptyValue', () => { + test('should return an empty value', () => expect(getEmptyValue()).toBe('—')); + }); + + describe('#getEmptyString', () => { + test('should turn into an empty string place holder', () => { + const wrapper = mountWithIntl( + <ThemeProvider theme={mockTheme}> + <p>{getEmptyString()}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe('(Empty String)'); + }); + }); + + describe('#getEmptyTagValue', () => { + const wrapper = mount( + <ThemeProvider theme={mockTheme}> + <p>{getEmptyTagValue()}</p> + </ThemeProvider> + ); + test('should return an empty tag value', () => expect(wrapper.text()).toBe('—')); + }); + + describe('#getEmptyStringTag', () => { + test('should turn into an span that has length of 1', () => { + const wrapper = mountWithIntl( + <ThemeProvider theme={mockTheme}> + <p>{getEmptyStringTag()}</p> + </ThemeProvider> + ); + expect(wrapper.find('span')).toHaveLength(1); + }); + + test('should turn into an empty string tag place holder', () => { + const wrapper = mountWithIntl( + <ThemeProvider theme={mockTheme}> + <p>{getEmptyStringTag()}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe(getEmptyString()); + }); + }); + + describe('#defaultToEmptyTag', () => { + test('should default to an empty value when a value is null', () => { + const wrapper = mount( + <ThemeProvider theme={mockTheme}> + <p>{defaultToEmptyTag(null)}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe(getEmptyValue()); + }); + + test('should default to an empty value when a value is undefined', () => { + const wrapper = mount( + <ThemeProvider theme={mockTheme}> + <p>{defaultToEmptyTag(undefined)}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe(getEmptyValue()); + }); + + test('should return a deep path value', () => { + const test = { + a: { + b: { + c: 1, + }, + }, + }; + const wrapper = mount(<p>{defaultToEmptyTag(test.a.b.c)}</p>); + expect(wrapper.text()).toBe('1'); + }); + }); + + describe('#getOrEmptyTag', () => { + test('should default empty value when a deep rooted value is null', () => { + const test = { + a: { + b: { + c: null, + }, + }, + }; + const wrapper = mount( + <ThemeProvider theme={mockTheme}> + <p>{getOrEmptyTag('a.b.c', test)}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe(getEmptyValue()); + }); + + test('should default empty value when a deep rooted value is undefined', () => { + const test = { + a: { + b: { + c: undefined, + }, + }, + }; + const wrapper = mount( + <ThemeProvider theme={mockTheme}> + <p>{getOrEmptyTag('a.b.c', test)}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe(getEmptyValue()); + }); + + test('should default empty value when a deep rooted value is missing', () => { + const test = { + a: { + b: {}, + }, + }; + const wrapper = mount( + <ThemeProvider theme={mockTheme}> + <p>{getOrEmptyTag('a.b.c', test)}</p> + </ThemeProvider> + ); + expect(wrapper.text()).toBe(getEmptyValue()); + }); + + test('should return a deep path value', () => { + const test = { + a: { + b: { + c: 1, + }, + }, + }; + const wrapper = mount(<p>{getOrEmptyTag('a.b.c', test)}</p>); + expect(wrapper.text()).toBe('1'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/empty_value/index.tsx b/x-pack/plugins/cases/public/components/empty_value/index.tsx new file mode 100644 index 0000000000000..86efb4a78277a --- /dev/null +++ b/x-pack/plugins/cases/public/components/empty_value/index.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { get, isString } from 'lodash/fp'; +import React from 'react'; +import styled from 'styled-components'; + +import * as i18n from './translations'; + +const EmptyWrapper = styled.span` + color: ${(props) => props.theme.eui.euiColorMediumShade}; +`; + +EmptyWrapper.displayName = 'EmptyWrapper'; + +export const getEmptyValue = () => '—'; +export const getEmptyString = () => `(${i18n.EMPTY_STRING})`; + +export const getEmptyTagValue = () => <EmptyWrapper>{getEmptyValue()}</EmptyWrapper>; +export const getEmptyStringTag = () => <EmptyWrapper>{getEmptyString()}</EmptyWrapper>; + +export const defaultToEmptyTag = <T extends unknown>(item: T): JSX.Element => { + if (item == null) { + return getEmptyTagValue(); + } else if (isString(item) && item === '') { + return getEmptyStringTag(); + } else { + return <>{item}</>; + } +}; + +export const getOrEmptyTag = (path: string, item: unknown): JSX.Element => { + const text = get(path, item); + return getOrEmptyTagFromValue(text); +}; + +export const getOrEmptyTagFromValue = (value: string | number | null | undefined): JSX.Element => { + if (value == null) { + return getEmptyTagValue(); + } else if (value === '') { + return getEmptyStringTag(); + } else { + return <>{value}</>; + } +}; diff --git a/x-pack/plugins/cases/public/components/empty_value/translations.ts b/x-pack/plugins/cases/public/components/empty_value/translations.ts new file mode 100644 index 0000000000000..af04a6d404553 --- /dev/null +++ b/x-pack/plugins/cases/public/components/empty_value/translations.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const EMPTY_STRING = i18n.translate('xpack.cases.emptyString.emptyStringDescription', { + defaultMessage: 'Empty String', +}); diff --git a/x-pack/plugins/cases/public/components/filter_popover/index.tsx b/x-pack/plugins/cases/public/components/filter_popover/index.tsx new file mode 100644 index 0000000000000..91cd7bfd57fa0 --- /dev/null +++ b/x-pack/plugins/cases/public/components/filter_popover/index.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { Dispatch, SetStateAction, useCallback, useState } from 'react'; +import { + EuiFilterButton, + EuiFilterSelectItem, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiPopover, + EuiText, +} from '@elastic/eui'; +import styled from 'styled-components'; + +interface FilterPopoverProps { + buttonLabel: string; + onSelectedOptionsChanged: Dispatch<SetStateAction<string[]>>; + options: string[]; + optionsEmptyLabel: string; + selectedOptions: string[]; +} + +const ScrollableDiv = styled.div` + max-height: 250px; + overflow: auto; +`; + +const toggleSelectedGroup = (group: string, selectedGroups: string[]): string[] => { + const selectedGroupIndex = selectedGroups.indexOf(group); + if (selectedGroupIndex >= 0) { + return [ + ...selectedGroups.slice(0, selectedGroupIndex), + ...selectedGroups.slice(selectedGroupIndex + 1), + ]; + } + return [...selectedGroups, group]; +}; + +/** + * Popover for selecting a field to filter on + * + * @param buttonLabel label on dropdwon button + * @param onSelectedOptionsChanged change listener to be notified when option selection changes + * @param options to display for filtering + * @param optionsEmptyLabel shows when options empty + * @param selectedOptions manage state of selectedOptions + */ +export const FilterPopoverComponent = ({ + buttonLabel, + onSelectedOptionsChanged, + options, + optionsEmptyLabel, + selectedOptions, +}: FilterPopoverProps) => { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const setIsPopoverOpenCb = useCallback(() => setIsPopoverOpen(!isPopoverOpen), [isPopoverOpen]); + const toggleSelectedGroupCb = useCallback( + (option) => onSelectedOptionsChanged(toggleSelectedGroup(option, selectedOptions)), + [selectedOptions, onSelectedOptionsChanged] + ); + + return ( + <EuiPopover + ownFocus + button={ + <EuiFilterButton + data-test-subj={`options-filter-popover-button-${buttonLabel}`} + iconType="arrowDown" + onClick={setIsPopoverOpenCb} + isSelected={isPopoverOpen} + numFilters={options.length} + hasActiveFilters={selectedOptions.length > 0} + numActiveFilters={selectedOptions.length} + aria-label={buttonLabel} + > + {buttonLabel} + </EuiFilterButton> + } + isOpen={isPopoverOpen} + closePopover={setIsPopoverOpenCb} + panelPaddingSize="none" + repositionOnScroll + > + <ScrollableDiv> + {options.map((option, index) => ( + <EuiFilterSelectItem + checked={selectedOptions.includes(option) ? 'on' : undefined} + data-test-subj={`options-filter-popover-item-${index}`} + key={`${index}-${option}`} + onClick={toggleSelectedGroupCb.bind(null, option)} + > + {option} + </EuiFilterSelectItem> + ))} + </ScrollableDiv> + {options.length === 0 && ( + <EuiFlexGroup gutterSize="m" justifyContent="spaceAround"> + <EuiFlexItem grow={true}> + <EuiPanel> + <EuiText>{optionsEmptyLabel}</EuiText> + </EuiPanel> + </EuiFlexItem> + </EuiFlexGroup> + )} + </EuiPopover> + ); +}; + +FilterPopoverComponent.displayName = 'FilterPopoverComponent'; + +export const FilterPopover = React.memo(FilterPopoverComponent); + +FilterPopover.displayName = 'FilterPopover'; diff --git a/x-pack/plugins/cases/public/components/formatted_date/__snapshots__/index.test.tsx.snap b/x-pack/plugins/cases/public/components/formatted_date/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000000..9e851ddcd7d0f --- /dev/null +++ b/x-pack/plugins/cases/public/components/formatted_date/__snapshots__/index.test.tsx.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`formatted_date PreferenceFormattedDate renders correctly against snapshot 1`] = ` +<PreferenceFormattedDate + value={2019-02-25T22:27:05.000Z} +> + 2019-02-25T22:27:05Z +</PreferenceFormattedDate> +`; diff --git a/x-pack/plugins/cases/public/components/formatted_date/index.test.tsx b/x-pack/plugins/cases/public/components/formatted_date/index.test.tsx new file mode 100644 index 0000000000000..d54430b9f27da --- /dev/null +++ b/x-pack/plugins/cases/public/components/formatted_date/index.test.tsx @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount, shallow } from 'enzyme'; +import React from 'react'; + +import { useDateFormat, useTimeZone } from '../../common/lib/kibana'; + +import { TestProviders } from '../../common/mock'; +import { getEmptyString, getEmptyValue } from '../empty_value'; +import { PreferenceFormattedDate, FormattedDate, FormattedRelativePreferenceDate } from '.'; + +jest.mock('../../common/lib/kibana'); +const mockUseDateFormat = useDateFormat as jest.Mock; +const mockUseTimeZone = useTimeZone as jest.Mock; + +const isoDateString = '2019-02-25T22:27:05.000Z'; + +describe('formatted_date', () => { + let isoDate: Date; + + beforeEach(() => { + isoDate = new Date(isoDateString); + mockUseDateFormat.mockImplementation(() => 'MMM D, YYYY @ HH:mm:ss.SSS'); + mockUseTimeZone.mockImplementation(() => 'UTC'); + }); + + describe('PreferenceFormattedDate', () => { + test('renders correctly against snapshot', () => { + mockUseDateFormat.mockImplementation(() => ''); + const wrapper = mount(<PreferenceFormattedDate value={isoDate} />); + + expect(wrapper).toMatchSnapshot(); + }); + + test('it renders the date with the default configuration', () => { + const wrapper = mount(<PreferenceFormattedDate value={isoDate} />); + + expect(wrapper.text()).toEqual('Feb 25, 2019 @ 22:27:05.000'); + }); + + test('it renders a UTC ISO8601 date string supplied when no date format configuration exists', () => { + mockUseDateFormat.mockImplementation(() => ''); + const wrapper = mount(<PreferenceFormattedDate value={isoDate} />); + + expect(wrapper.text()).toEqual('2019-02-25T22:27:05Z'); + }); + + test('it renders the correct timezone when a non-UTC configuration exists', () => { + mockUseTimeZone.mockImplementation(() => 'America/Denver'); + const wrapper = mount(<PreferenceFormattedDate value={isoDate} />); + + expect(wrapper.text()).toEqual('Feb 25, 2019 @ 15:27:05.000'); + }); + + test('it renders the date with a user-defined format', () => { + mockUseDateFormat.mockImplementation(() => 'MMM-DD-YYYY'); + const wrapper = mount(<PreferenceFormattedDate value={isoDate} />); + + expect(wrapper.text()).toEqual('Feb-25-2019'); + }); + }); + + describe('FormattedDate', () => { + test('it renders against a numeric epoch', () => { + const wrapper = mount(<FormattedDate fieldName="@timestamp" value={1559079339000} />); + expect(wrapper.text()).toEqual('May 28, 2019 @ 21:35:39.000'); + }); + + test('it renders against a string epoch', () => { + const wrapper = mount(<FormattedDate fieldName="@timestamp" value={'1559079339000'} />); + expect(wrapper.text()).toEqual('May 28, 2019 @ 21:35:39.000'); + }); + + test('it renders against a ISO string', () => { + const wrapper = mount( + <FormattedDate fieldName="@timestamp" value={'2019-05-28T22:04:49.957Z'} /> + ); + expect(wrapper.text()).toEqual('May 28, 2019 @ 22:04:49.957'); + }); + + test('it renders against an empty string as an empty string placeholder', () => { + const wrapper = mount( + <TestProviders> + <FormattedDate fieldName="@timestamp" value={''} /> + </TestProviders> + ); + + expect(wrapper.text()).toEqual(getEmptyString()); + }); + + test('it renders against an null as a EMPTY_VALUE', () => { + const wrapper = mount( + <TestProviders> + <FormattedDate fieldName="@timestamp" value={null} /> + </TestProviders> + ); + + expect(wrapper.text()).toEqual(getEmptyValue()); + }); + + test('it renders against an undefined as a EMPTY_VALUE', () => { + const wrapper = mount( + <TestProviders> + <FormattedDate fieldName="@timestamp" value={undefined} /> + </TestProviders> + ); + + expect(wrapper.text()).toEqual(getEmptyValue()); + }); + + test('it renders against an invalid date time as just the string its self', () => { + const wrapper = mount( + <TestProviders> + <FormattedDate fieldName="@timestamp" value={'Rebecca Evan Braden'} /> + </TestProviders> + ); + + expect(wrapper.text()).toEqual('Rebecca Evan Braden'); + }); + }); + + describe('FormattedRelativePreferenceDate', () => { + test('renders time over an hour correctly against snapshot', () => { + const wrapper = shallow(<FormattedRelativePreferenceDate value={isoDateString} />); + expect(wrapper.find('[data-test-subj="preference-time"]').exists()).toBe(true); + }); + + test('renders time under an hour correctly against snapshot', () => { + const timeTwelveMinutesAgo = new Date(new Date().getTime() - 12 * 60 * 1000).toISOString(); + const wrapper = shallow(<FormattedRelativePreferenceDate value={timeTwelveMinutesAgo} />); + + expect(wrapper.find('[data-test-subj="relative-time"]').exists()).toBe(true); + }); + + test('renders empty string value correctly', () => { + const wrapper = mount( + <TestProviders> + <FormattedRelativePreferenceDate value={''} /> + </TestProviders> + ); + + expect(wrapper.text()).toBe(getEmptyString()); + }); + + test('renders undefined value correctly', () => { + const wrapper = mount( + <TestProviders> + <FormattedRelativePreferenceDate /> + </TestProviders> + ); + + expect(wrapper.text()).toBe(getEmptyValue()); + }); + + test('renders null value correctly', () => { + const wrapper = mount( + <TestProviders> + <FormattedRelativePreferenceDate value={null} /> + </TestProviders> + ); + + expect(wrapper.text()).toBe(getEmptyValue()); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/formatted_date/index.tsx b/x-pack/plugins/cases/public/components/formatted_date/index.tsx new file mode 100644 index 0000000000000..5bb90bfbff797 --- /dev/null +++ b/x-pack/plugins/cases/public/components/formatted_date/index.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import moment from 'moment-timezone'; +import React from 'react'; +import { FormattedRelative } from '@kbn/i18n/react'; + +import { useDateFormat, useTimeZone, useUiSetting$ } from '../../common/lib/kibana'; +import { getOrEmptyTagFromValue } from '../empty_value'; +import { LocalizedDateTooltip } from '../localized_date_tooltip'; +import { getMaybeDate } from './maybe_date'; + +export const PreferenceFormattedDate = React.memo<{ dateFormat?: string; value: Date }>( + /* eslint-disable-next-line react-hooks/rules-of-hooks */ + ({ value, dateFormat = useDateFormat() }) => ( + <>{moment.tz(value, useTimeZone()).format(dateFormat)}</> + ) +); + +PreferenceFormattedDate.displayName = 'PreferenceFormattedDate'; + +export const PreferenceFormattedDateFromPrimitive = ({ + value, +}: { + value?: string | number | null; +}) => { + if (value == null) { + return getOrEmptyTagFromValue(value); + } + const maybeDate = getMaybeDate(value); + if (!maybeDate.isValid()) { + return getOrEmptyTagFromValue(value); + } + const date = maybeDate.toDate(); + return <PreferenceFormattedDate value={date} />; +}; + +PreferenceFormattedDateFromPrimitive.displayName = 'PreferenceFormattedDateFromPrimitive'; + +/** + * This function may be passed to `Array.find()` to locate the `P1DT` + * configuration (sub) setting, a string array that contains two entries + * like the following example: `['P1DT', 'YYYY-MM-DD']`. + */ +export const isP1DTFormatterSetting = (formatNameFormatterPair?: string[]) => + Array.isArray(formatNameFormatterPair) && + formatNameFormatterPair[0] === 'P1DT' && + formatNameFormatterPair.length === 2; + +/** + * Renders a date in `P1DT` format, e.g. `YYYY-MM-DD`, as specified by + * the `P1DT1` entry in the `dateFormat:scaled` Kibana Advanced setting. + * + * If the `P1DT` format is not specified in the `dateFormat:scaled` setting, + * the fallback format `YYYY-MM-DD` will be applied + */ +export const PreferenceFormattedP1DTDate = React.memo<{ value: Date }>(({ value }) => { + /** + * A fallback "format name / formatter" 2-tuple for the `P1DT` formatter, which is + * one of many such pairs expected to be contained in the `dateFormat:scaled` + * Kibana advanced setting. + */ + const FALLBACK_DATE_FORMAT_SCALED_P1DT = ['P1DT', 'YYYY-MM-DD']; + + // Read the 'dateFormat:scaled' Kibana Advanced setting, which contains 2-tuple sub-settings: + const [scaledDateFormatPreference] = useUiSetting$<string[][]>('dateFormat:scaled'); + + // attempt to find the nested `['P1DT', 'formatString']` setting + const maybeP1DTFormatter = Array.isArray(scaledDateFormatPreference) + ? scaledDateFormatPreference.find(isP1DTFormatterSetting) + : null; + + const p1dtFormat = + Array.isArray(maybeP1DTFormatter) && maybeP1DTFormatter.length === 2 + ? maybeP1DTFormatter[1] + : FALLBACK_DATE_FORMAT_SCALED_P1DT[1]; + + return <PreferenceFormattedDate dateFormat={p1dtFormat} value={value} />; +}); + +PreferenceFormattedP1DTDate.displayName = 'PreferenceFormattedP1DTDate'; + +/** + * Renders the specified date value in a format determined by the user's preferences, + * with a tooltip that renders: + * - the name of the field + * - a humanized relative date (e.g. 16 minutes ago) + * - a long representation of the date that includes the day of the week (e.g. Thursday, March 21, 2019 6:47pm) + * - the raw date value (e.g. 2019-03-22T00:47:46Z) + */ +export const FormattedDate = React.memo<{ + fieldName: string; + value?: string | number | null; + className?: string; +}>( + ({ value, fieldName, className = '' }): JSX.Element => { + if (value == null) { + return getOrEmptyTagFromValue(value); + } + const maybeDate = getMaybeDate(value); + return maybeDate.isValid() ? ( + <LocalizedDateTooltip date={maybeDate.toDate()} fieldName={fieldName} className={className}> + <PreferenceFormattedDate value={maybeDate.toDate()} /> + </LocalizedDateTooltip> + ) : ( + getOrEmptyTagFromValue(value) + ); + } +); + +FormattedDate.displayName = 'FormattedDate'; + +/** + * Renders the specified date value according to under/over one hour + * Under an hour = relative format + * Over an hour = in a format determined by the user's preferences, + * with a tooltip that renders: + * - the name of the field + * - a humanized relative date (e.g. 16 minutes ago) + * - a long representation of the date that includes the day of the week (e.g. Thursday, March 21, 2019 6:47pm) + * - the raw date value (e.g. 2019-03-22T00:47:46Z) + */ + +export const FormattedRelativePreferenceDate = ({ value }: { value?: string | number | null }) => { + if (value == null) { + return getOrEmptyTagFromValue(value); + } + const maybeDate = getMaybeDate(value); + if (!maybeDate.isValid()) { + return getOrEmptyTagFromValue(value); + } + const date = maybeDate.toDate(); + return ( + <LocalizedDateTooltip date={date}> + {moment(date).add(1, 'hours').isBefore(new Date()) ? ( + <PreferenceFormattedDate data-test-subj="preference-time" value={date} /> + ) : ( + <FormattedRelative data-test-subj="relative-time" value={date} /> + )} + </LocalizedDateTooltip> + ); +}; + +/** + * Renders a preceding label according to under/over one hour + */ + +export const FormattedRelativePreferenceLabel = ({ + value, + preferenceLabel, + relativeLabel, +}: { + value?: string | number | null; + preferenceLabel?: string | null; + relativeLabel?: string | null; +}) => { + if (value == null) { + return null; + } + const maybeDate = getMaybeDate(value); + if (!maybeDate.isValid()) { + return null; + } + return moment(maybeDate.toDate()).add(1, 'hours').isBefore(new Date()) ? ( + <>{preferenceLabel}</> + ) : ( + <>{relativeLabel}</> + ); +}; diff --git a/x-pack/plugins/cases/public/components/formatted_date/maybe_date.test.ts b/x-pack/plugins/cases/public/components/formatted_date/maybe_date.test.ts new file mode 100644 index 0000000000000..402d811da7bd9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/formatted_date/maybe_date.test.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getMaybeDate } from './maybe_date'; + +describe('#getMaybeDate', () => { + test('returns empty string as invalid date', () => { + expect(getMaybeDate('').isValid()).toBe(false); + }); + + test('returns string with empty spaces as invalid date', () => { + expect(getMaybeDate(' ').isValid()).toBe(false); + }); + + test('returns string date time as valid date', () => { + expect(getMaybeDate('2019-05-28T23:05:28.405Z').isValid()).toBe(true); + }); + + test('returns string date time as the date we expect', () => { + expect(getMaybeDate('2019-05-28T23:05:28.405Z').toISOString()).toBe('2019-05-28T23:05:28.405Z'); + }); + + test('returns plain string number as epoch as valid date', () => { + expect(getMaybeDate('1559084770612').isValid()).toBe(true); + }); + + test('returns plain string number as the date we expect', () => { + expect(getMaybeDate('1559084770612').toDate().toISOString()).toBe('2019-05-28T23:06:10.612Z'); + }); + + test('returns plain number as epoch as valid date', () => { + expect(getMaybeDate(1559084770612).isValid()).toBe(true); + }); + + test('returns plain number as epoch as the date we expect', () => { + expect(getMaybeDate(1559084770612).toDate().toISOString()).toBe('2019-05-28T23:06:10.612Z'); + }); + + test('returns a short date time string as an epoch (sadly) so this is ambiguous', () => { + expect(getMaybeDate('20190101').toDate().toISOString()).toBe('1970-01-01T05:36:30.101Z'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/formatted_date/maybe_date.ts b/x-pack/plugins/cases/public/components/formatted_date/maybe_date.ts new file mode 100644 index 0000000000000..cc7add4f0f1f2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/formatted_date/maybe_date.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isString } from 'lodash/fp'; +import moment from 'moment'; + +export const getMaybeDate = (value: string | number): moment.Moment => { + if (isString(value) && value.trim() !== '') { + const maybeDate = moment(new Date(value)); + if (maybeDate.isValid() || isNaN(+value)) { + return maybeDate; + } else { + return moment(new Date(+value)); + } + } else { + return moment(new Date(value)); + } +}; diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap new file mode 100644 index 0000000000000..c8d4b6ec3b4c8 --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EditableTitle it renders 1`] = ` +<EuiFlexGroup + alignItems="center" + gutterSize="none" +> + <EuiFlexItem + grow={false} + > + <Memo(TitleComponent) + title="Test title" + /> + </EuiFlexItem> + <EuiFlexItem + grow={false} + > + <Styled(EuiButtonIcon) + aria-label="You can edit Test title by clicking" + data-test-subj="editable-title-edit-icon" + iconType="pencil" + isDisabled={false} + onClick={[Function]} + /> + </EuiFlexItem> +</EuiFlexGroup> +`; diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000000..a100f5e4f93b4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/index.test.tsx.snap @@ -0,0 +1,40 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`HeaderPage it renders 1`] = ` +<Header + border={true} +> + <EuiFlexGroup + alignItems="center" + > + <FlexItem> + <Memo(TitleComponent) + badgeOptions={ + Object { + "beta": true, + "text": "Beta", + "tooltip": "Test tooltip", + } + } + title="Test title" + /> + <Subtitle + data-test-subj="header-page-subtitle" + items="Test subtitle" + /> + <Subtitle + data-test-subj="header-page-subtitle-2" + items="Test subtitle 2" + /> + </FlexItem> + <FlexItem + data-test-subj="header-page-supplements" + grow={false} + > + <p> + Test supplement + </p> + </FlexItem> + </EuiFlexGroup> +</Header> +`; diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap new file mode 100644 index 0000000000000..05af2fee2c2a2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap @@ -0,0 +1,19 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Title it renders 1`] = ` +<EuiTitle + size="l" +> + <h1 + data-test-subj="header-page-title" + > + Test title + + <StyledEuiBetaBadge + label="Beta" + tooltipContent="Test tooltip" + tooltipPosition="bottom" + /> + </h1> +</EuiTitle> +`; diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx new file mode 100644 index 0000000000000..90a10a388d717 --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx @@ -0,0 +1,172 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { shallow } from 'enzyme'; +import React from 'react'; + +import '../../common/mock/match_media'; +import { TestProviders } from '../../common/mock'; +import { EditableTitle } from './editable_title'; +import { useMountAppended } from '../../utils/use_mount_appended'; + +describe('EditableTitle', () => { + const mount = useMountAppended(); + const submitTitle = jest.fn(); + + test('it renders', () => { + const wrapper = shallow( + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + ); + + expect(wrapper).toMatchSnapshot(); + }); + + test('it shows the edit title input field', () => { + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find('[data-test-subj="editable-title-input-field"]').first().exists()).toBe( + true + ); + }); + + test('it shows the submit button', () => { + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find('[data-test-subj="editable-title-submit-btn"]').first().exists()).toBe( + true + ); + }); + + test('it shows the cancel button', () => { + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find('[data-test-subj="editable-title-cancel-btn"]').first().exists()).toBe( + true + ); + }); + + test('it DOES NOT shows the edit icon when in edit mode', () => { + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe( + false + ); + }); + + test('it switch to non edit mode when canceled', () => { + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="editable-title-cancel-btn"]').simulate('click'); + + expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe(true); + }); + + test('it should change the title', () => { + const newTitle = 'new test title'; + + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + wrapper + .find('input[data-test-subj="editable-title-input-field"]') + .simulate('change', { target: { value: newTitle } }); + + wrapper.update(); + + expect( + wrapper.find('input[data-test-subj="editable-title-input-field"]').prop('value') + ).toEqual(newTitle); + }); + + test('it should NOT change the title when cancel', () => { + const title = 'Test title'; + const newTitle = 'new test title'; + + const wrapper = mount( + <TestProviders> + <EditableTitle title={title} onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + wrapper + .find('input[data-test-subj="editable-title-input-field"]') + .simulate('change', { target: { value: newTitle } }); + wrapper.update(); + + wrapper.find('button[data-test-subj="editable-title-cancel-btn"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find('h1[data-test-subj="header-page-title"]').text()).toEqual(title); + }); + + test('it submits the title', () => { + const newTitle = 'new test title'; + + const wrapper = mount( + <TestProviders> + <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + wrapper + .find('input[data-test-subj="editable-title-input-field"]') + .simulate('change', { target: { value: newTitle } }); + + wrapper.find('button[data-test-subj="editable-title-submit-btn"]').simulate('click'); + wrapper.update(); + + expect(submitTitle).toHaveBeenCalled(); + expect(submitTitle.mock.calls[0][0]).toEqual(newTitle); + expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx new file mode 100644 index 0000000000000..b53560db6745b --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useCallback, ChangeEvent } from 'react'; +import styled, { css } from 'styled-components'; + +import { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiFieldText, + EuiButtonIcon, + EuiLoadingSpinner, +} from '@elastic/eui'; + +import * as i18n from './translations'; + +import { Title } from './title'; + +const MyEuiButtonIcon = styled(EuiButtonIcon)` + ${({ theme }) => css` + margin-left: ${theme.eui.euiSize}; + `} +`; + +const MySpinner = styled(EuiLoadingSpinner)` + ${({ theme }) => css` + margin-left: ${theme.eui.euiSize}; + `} +`; + +interface Props { + disabled?: boolean; + isLoading: boolean; + title: string | React.ReactNode; + onSubmit: (title: string) => void; +} + +const EditableTitleComponent: React.FC<Props> = ({ + disabled = false, + onSubmit, + isLoading, + title, +}) => { + const [editMode, setEditMode] = useState(false); + const [changedTitle, onTitleChange] = useState<string>(typeof title === 'string' ? title : ''); + + const onCancel = useCallback(() => setEditMode(false), []); + const onClickEditIcon = useCallback(() => setEditMode(true), []); + + const onClickSubmit = useCallback((): void => { + if (changedTitle !== title) { + onSubmit(changedTitle); + } + setEditMode(false); + }, [changedTitle, onSubmit, title]); + + const handleOnChange = useCallback( + (e: ChangeEvent<HTMLInputElement>) => onTitleChange(e.target.value), + [] + ); + return editMode ? ( + <EuiFlexGroup alignItems="center" gutterSize="m" justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <EuiFieldText + onChange={handleOnChange} + value={`${changedTitle}`} + data-test-subj="editable-title-input-field" + /> + </EuiFlexItem> + <EuiFlexGroup gutterSize="none" responsive={false} wrap={true}> + <EuiFlexItem grow={false}> + <EuiButton + color="secondary" + data-test-subj="editable-title-submit-btn" + fill + iconType="save" + onClick={onClickSubmit} + size="s" + > + {i18n.SAVE} + </EuiButton> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="editable-title-cancel-btn" + iconType="cross" + onClick={onCancel} + size="s" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + </EuiFlexGroup> + <EuiFlexItem /> + </EuiFlexGroup> + ) : ( + <EuiFlexGroup alignItems="center" gutterSize="none"> + <EuiFlexItem grow={false}> + <Title title={title} /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + {isLoading && <MySpinner data-test-subj="editable-title-loading" />} + {!isLoading && ( + <MyEuiButtonIcon + isDisabled={disabled} + aria-label={i18n.EDIT_TITLE_ARIA(title as string)} + iconType="pencil" + onClick={onClickEditIcon} + data-test-subj="editable-title-edit-icon" + /> + )} + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +export const EditableTitle = React.memo(EditableTitleComponent); diff --git a/x-pack/plugins/cases/public/components/header_page/index.test.tsx b/x-pack/plugins/cases/public/components/header_page/index.test.tsx new file mode 100644 index 0000000000000..d84a6d9272def --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/index.test.tsx @@ -0,0 +1,157 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; +import { shallow } from 'enzyme'; +import React from 'react'; + +import '../../common/mock/match_media'; +import { TestProviders } from '../../common/mock'; +import { HeaderPage } from './index'; +import { useMountAppended } from '../../utils/use_mount_appended'; + +jest.mock('react-router-dom', () => { + const original = jest.requireActual('react-router-dom'); + + return { + ...original, + useHistory: () => ({ + useHistory: jest.fn(), + }), + }; +}); + +describe('HeaderPage', () => { + const mount = useMountAppended(); + + test('it renders', () => { + const wrapper = shallow( + <HeaderPage + badgeOptions={{ beta: true, text: 'Beta', tooltip: 'Test tooltip' }} + border + subtitle="Test subtitle" + subtitle2="Test subtitle 2" + title="Test title" + > + <p>{'Test supplement'}</p> + </HeaderPage> + ); + + expect(wrapper).toMatchSnapshot(); + }); + + test('it renders the back link when provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage + backOptions={{ href: '#', text: 'Test link', onClick: jest.fn() }} + title="Test title" + /> + </TestProviders> + ); + + expect(wrapper.find('.casesHeaderPage__linkBack').first().exists()).toBe(true); + }); + + test('it DOES NOT render the back link when not provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('.casesHeaderPage__linkBack').first().exists()).toBe(false); + }); + + test('it renders the first subtitle when provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage subtitle="Test subtitle" title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-page-subtitle"]').first().exists()).toBe(true); + }); + + test('it DOES NOT render the first subtitle when not provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-section-subtitle"]').first().exists()).toBe(false); + }); + + test('it renders the second subtitle when provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage subtitle2="Test subtitle 2" title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-page-subtitle-2"]').first().exists()).toBe(true); + }); + + test('it DOES NOT render the second subtitle when not provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-section-subtitle-2"]').first().exists()).toBe( + false + ); + }); + + test('it renders supplements when children provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage title="Test title"> + <p>{'Test supplement'}</p> + </HeaderPage> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-page-supplements"]').first().exists()).toBe(true); + }); + + test('it DOES NOT render supplements when children not provided', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-page-supplements"]').first().exists()).toBe(false); + }); + + test('it applies border styles when border is true', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage border title="Test title" /> + </TestProviders> + ); + const casesHeaderPage = wrapper.find('.casesHeaderPage').first(); + + expect(casesHeaderPage).toHaveStyleRule('border-bottom', euiDarkVars.euiBorderThin); + expect(casesHeaderPage).toHaveStyleRule('padding-bottom', euiDarkVars.paddingSizes.l); + }); + + test('it DOES NOT apply border styles when border is false', () => { + const wrapper = mount( + <TestProviders> + <HeaderPage title="Test title" /> + </TestProviders> + ); + const casesHeaderPage = wrapper.find('.casesHeaderPage').first(); + + expect(casesHeaderPage).not.toHaveStyleRule('border-bottom', euiDarkVars.euiBorderThin); + expect(casesHeaderPage).not.toHaveStyleRule('padding-bottom', euiDarkVars.paddingSizes.l); + }); +}); diff --git a/x-pack/plugins/cases/public/components/header_page/index.tsx b/x-pack/plugins/cases/public/components/header_page/index.tsx new file mode 100644 index 0000000000000..dc9f73e37b027 --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/index.tsx @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiProgress } from '@elastic/eui'; +import React from 'react'; +import styled, { css } from 'styled-components'; + +import { LinkIcon, LinkIconProps } from '../link_icon'; +import { Subtitle, SubtitleProps } from '../subtitle'; +import { Title } from './title'; +import { BadgeOptions, TitleProp } from './types'; +interface HeaderProps { + border?: boolean; + isLoading?: boolean; +} + +const Header = styled.header.attrs({ + className: 'casesHeaderPage', +})<HeaderProps>` + ${({ border, theme }) => css` + margin-bottom: ${theme.eui.euiSizeL}; + + ${border && + css` + border-bottom: ${theme.eui.euiBorderThin}; + padding-bottom: ${theme.eui.paddingSizes.l}; + .euiProgress { + top: ${theme.eui.paddingSizes.l}; + } + `} + `} +`; +Header.displayName = 'Header'; + +const FlexItem = styled(EuiFlexItem)` + display: block; +`; +FlexItem.displayName = 'FlexItem'; + +const LinkBack = styled.div.attrs({ + className: 'casesHeaderPage__linkBack', +})` + ${({ theme }) => css` + font-size: ${theme.eui.euiFontSizeXS}; + line-height: ${theme.eui.euiLineHeight}; + margin-bottom: ${theme.eui.euiSizeS}; + `} +`; +LinkBack.displayName = 'LinkBack'; + +const Badge = (styled(EuiBadge)` + letter-spacing: 0; +` as unknown) as typeof EuiBadge; +Badge.displayName = 'Badge'; + +interface BackOptions { + href: LinkIconProps['href']; + onClick?: (ev: MouseEvent) => void; + text: LinkIconProps['children']; + dataTestSubj?: string; +} + +export interface HeaderPageProps extends HeaderProps { + backOptions?: BackOptions; + /** A component to be displayed as the back button. Used only if `backOption` is not defined */ + backComponent?: React.ReactNode; + badgeOptions?: BadgeOptions; + children?: React.ReactNode; + subtitle?: SubtitleProps['items']; + subtitle2?: SubtitleProps['items']; + title: TitleProp; + titleNode?: React.ReactElement; +} + +const HeaderPageComponent: React.FC<HeaderPageProps> = ({ + backOptions, + backComponent, + badgeOptions, + border, + children, + isLoading, + subtitle, + subtitle2, + title, + titleNode, + ...rest +}) => { + return ( + <Header border={border} {...rest}> + <EuiFlexGroup alignItems="center"> + <FlexItem> + {backOptions && ( + <LinkBack> + <LinkIcon + dataTestSubj={backOptions.dataTestSubj} + onClick={backOptions.onClick} + href={backOptions.href} + iconType="arrowLeft" + > + {backOptions.text} + </LinkIcon> + </LinkBack> + )} + + {!backOptions && backComponent && <>{backComponent}</>} + + {titleNode || <Title title={title} badgeOptions={badgeOptions} />} + + {subtitle && <Subtitle data-test-subj="header-page-subtitle" items={subtitle} />} + {subtitle2 && <Subtitle data-test-subj="header-page-subtitle-2" items={subtitle2} />} + {border && isLoading && <EuiProgress size="xs" color="accent" />} + </FlexItem> + + {children && ( + <FlexItem data-test-subj="header-page-supplements" grow={false}> + {children} + </FlexItem> + )} + </EuiFlexGroup> + </Header> + ); +}; + +export const HeaderPage = React.memo(HeaderPageComponent); diff --git a/x-pack/plugins/cases/public/components/header_page/title.test.tsx b/x-pack/plugins/cases/public/components/header_page/title.test.tsx new file mode 100644 index 0000000000000..2423104eb8819 --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/title.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { shallow } from 'enzyme'; +import React from 'react'; + +import '../../common/mock/match_media'; +import { TestProviders } from '../../common/mock'; +import { Title } from './title'; +import { useMountAppended } from '../../utils/use_mount_appended'; + +describe('Title', () => { + const mount = useMountAppended(); + + test('it renders', () => { + const wrapper = shallow( + <Title + badgeOptions={{ beta: true, text: 'Beta', tooltip: 'Test tooltip' }} + title="Test title" + /> + ); + + expect(wrapper).toMatchSnapshot(); + }); + + test('it renders the title', () => { + const wrapper = mount( + <TestProviders> + <Title title="Test title" /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="header-page-title"]').first().exists()).toBe(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/header_page/title.tsx b/x-pack/plugins/cases/public/components/header_page/title.tsx new file mode 100644 index 0000000000000..3a0390a436e1c --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/title.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBetaBadge, EuiBadge, EuiTitle } from '@elastic/eui'; +import styled from 'styled-components'; + +import { BadgeOptions, TitleProp } from './types'; + +const StyledEuiBetaBadge = styled(EuiBetaBadge)` + vertical-align: middle; +`; + +StyledEuiBetaBadge.displayName = 'StyledEuiBetaBadge'; + +const Badge = (styled(EuiBadge)` + letter-spacing: 0; +` as unknown) as typeof EuiBadge; +Badge.displayName = 'Badge'; + +interface Props { + badgeOptions?: BadgeOptions; + title: TitleProp; +} + +const TitleComponent: React.FC<Props> = ({ title, badgeOptions }) => ( + <EuiTitle size="l"> + <h1 data-test-subj="header-page-title"> + {title} + {badgeOptions && ( + <> + {' '} + {badgeOptions.beta ? ( + <StyledEuiBetaBadge + label={badgeOptions.text} + tooltipContent={badgeOptions.tooltip} + tooltipPosition="bottom" + /> + ) : ( + <Badge color="hollow" title=""> + {badgeOptions.text} + </Badge> + )} + </> + )} + </h1> + </EuiTitle> +); + +export const Title = React.memo(TitleComponent); diff --git a/x-pack/plugins/cases/public/components/header_page/translations.ts b/x-pack/plugins/cases/public/components/header_page/translations.ts new file mode 100644 index 0000000000000..b24c347857a6c --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/translations.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const SAVE = i18n.translate('xpack.cases.header.editableTitle.save', { + defaultMessage: 'Save', +}); + +export const CANCEL = i18n.translate('xpack.cases.header.editableTitle.cancel', { + defaultMessage: 'Cancel', +}); + +export const EDIT_TITLE_ARIA = (title: string) => + i18n.translate('xpack.cases.header.editableTitle.editButtonAria', { + values: { title }, + defaultMessage: 'You can edit {title} by clicking', + }); diff --git a/x-pack/plugins/cases/public/components/header_page/types.ts b/x-pack/plugins/cases/public/components/header_page/types.ts new file mode 100644 index 0000000000000..e95d0c8e1e69c --- /dev/null +++ b/x-pack/plugins/cases/public/components/header_page/types.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type React from 'react'; +export type TitleProp = string | React.ReactNode; + +export interface DraggableArguments { + field: string; + value: string; +} + +export interface BadgeOptions { + beta?: boolean; + text: string; + tooltip?: string; +} diff --git a/x-pack/plugins/cases/public/components/link_icon/__snapshots__/index.test.tsx.snap b/x-pack/plugins/cases/public/components/link_icon/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000000..7044c055e4b78 --- /dev/null +++ b/x-pack/plugins/cases/public/components/link_icon/__snapshots__/index.test.tsx.snap @@ -0,0 +1,20 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`LinkIcon it renders 1`] = ` +<Link + aria-label="Test link" + className="casesLinkIcon" + href="#" + iconSide="right" +> + <EuiIcon + size="xxl" + type="alert" + /> + <span + className="casesLinkIcon__label" + > + Test link + </span> +</Link> +`; diff --git a/x-pack/plugins/cases/public/components/link_icon/index.test.tsx b/x-pack/plugins/cases/public/components/link_icon/index.test.tsx new file mode 100644 index 0000000000000..4600f0dc4adc4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/link_icon/index.test.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount, shallow } from 'enzyme'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { LinkIcon } from './index'; + +describe('LinkIcon', () => { + test('it renders', () => { + const wrapper = shallow( + <LinkIcon href="#" iconSide="right" iconSize="xxl" iconType="alert"> + {'Test link'} + </LinkIcon> + ); + + expect(wrapper).toMatchSnapshot(); + }); + + test('it renders an action button when onClick is provided', () => { + const wrapper = mount( + <TestProviders> + <LinkIcon iconType="alert" onClick={() => alert('Test alert')}> + {'Test link'} + </LinkIcon> + </TestProviders> + ); + + expect(wrapper.find('button').first().exists()).toBe(true); + }); + + test('it renders an action link when href is provided', () => { + const wrapper = mount( + <TestProviders> + <LinkIcon href="#" iconType="alert"> + {'Test link'} + </LinkIcon> + </TestProviders> + ); + + expect(wrapper.find('a').first().exists()).toBe(true); + }); + + test('it renders an icon', () => { + const wrapper = mount( + <TestProviders> + <LinkIcon iconType="alert">{'Test link'}</LinkIcon> + </TestProviders> + ); + + expect(wrapper.find('[data-euiicon-type]').first().exists()).toBe(true); + }); + + test('it positions the icon to the right when iconSide is right', () => { + const wrapper = mount( + <TestProviders> + <LinkIcon iconSide="right" iconType="alert"> + {'Test link'} + </LinkIcon> + </TestProviders> + ); + + expect(wrapper.find('.casesLinkIcon').at(1)).toHaveStyleRule('flex-direction', 'row-reverse'); + }); + + test('it positions the icon to the left when iconSide is left (or not provided)', () => { + const wrapper = mount( + <TestProviders> + <LinkIcon iconSide="left" iconType="alert"> + {'Test link'} + </LinkIcon> + </TestProviders> + ); + + expect(wrapper.find('.casesLinkIcon').at(1)).not.toHaveStyleRule( + 'flex-direction', + 'row-reverse' + ); + }); + + test('it renders a label', () => { + const wrapper = mount( + <TestProviders> + <LinkIcon iconType="alert">{'Test link'}</LinkIcon> + </TestProviders> + ); + + expect(wrapper.find('.casesLinkIcon__label').first().exists()).toBe(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/link_icon/index.tsx b/x-pack/plugins/cases/public/components/link_icon/index.tsx new file mode 100644 index 0000000000000..b33529399db90 --- /dev/null +++ b/x-pack/plugins/cases/public/components/link_icon/index.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiIcon, EuiLink, IconSize, IconType } from '@elastic/eui'; +import { LinkAnchorProps } from '@elastic/eui/src/components/link/link'; +import React, { ReactNode, useCallback, useMemo } from 'react'; +import styled, { css } from 'styled-components'; + +interface LinkProps { + ariaLabel?: string; + color?: LinkAnchorProps['color']; + disabled?: boolean; + href?: string; + iconSide?: 'left' | 'right'; + onClick?: Function; +} + +export const Link = styled(({ iconSide, children, ...rest }) => ( + <EuiLink {...rest}>{children}</EuiLink> +))<LinkProps>` + ${({ iconSide, theme }) => css` + align-items: center; + display: inline-flex; + vertical-align: top; + white-space: nowrap; + + ${iconSide === 'left' && + css` + .euiIcon { + margin-right: ${theme.eui.euiSizeXS}; + } + `} + + ${iconSide === 'right' && + css` + flex-direction: row-reverse; + + .euiIcon { + margin-left: ${theme.eui.euiSizeXS}; + } + `} + `} +`; +Link.displayName = 'Link'; + +export interface LinkIconProps extends LinkProps { + children: string | ReactNode; + iconSize?: IconSize; + iconType: IconType; + dataTestSubj?: string; +} + +export const LinkIcon = React.memo<LinkIconProps>( + ({ + ariaLabel, + children, + color, + dataTestSubj, + disabled, + href, + iconSide = 'left', + iconSize = 's', + iconType, + onClick, + }) => { + const getChildrenString = useCallback((theChild: string | ReactNode): string => { + if ( + typeof theChild === 'object' && + theChild != null && + 'props' in theChild && + theChild.props && + theChild.props.children + ) { + return getChildrenString(theChild.props.children); + } + return theChild != null && Object.keys(theChild).length > 0 ? (theChild as string) : ''; + }, []); + const aria = useMemo(() => { + if (ariaLabel) { + return ariaLabel; + } + return getChildrenString(children); + }, [ariaLabel, children, getChildrenString]); + + return ( + <Link + className="casesLinkIcon" + color={color} + data-test-subj={dataTestSubj} + disabled={disabled} + href={href} + iconSide={iconSide} + onClick={onClick} + aria-label={aria} + > + <EuiIcon size={iconSize} type={iconType} /> + <span className="casesLinkIcon__label">{children}</span> + </Link> + ); + } +); +LinkIcon.displayName = 'LinkIcon'; diff --git a/x-pack/plugins/cases/public/components/links/index.tsx b/x-pack/plugins/cases/public/components/links/index.tsx new file mode 100644 index 0000000000000..d806a50e730c5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/links/index.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButton, + EuiButtonProps, + EuiLink, + EuiLinkProps, + PropsForAnchor, + PropsForButton, +} from '@elastic/eui'; +import React, { useCallback } from 'react'; +import * as i18n from './translations'; + +export const LinkButton: React.FC< + PropsForButton<EuiButtonProps> | PropsForAnchor<EuiButtonProps> +> = ({ children, ...props }) => <EuiButton {...props}>{children}</EuiButton>; + +export const LinkAnchor: React.FC<EuiLinkProps> = ({ children, ...props }) => ( + <EuiLink {...props}>{children}</EuiLink> +); + +export interface CaseDetailsHrefSchema { + detailName: string; + search?: string; + subCaseId?: string; +} + +const CaseDetailsLinkComponent: React.FC<{ + children?: React.ReactNode; + detailName: string; + getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; + onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + subCaseId?: string; + title?: string; +}> = ({ children, detailName, getCaseDetailsHref, onCaseDetailsNavClick, subCaseId, title }) => { + const goToCaseDetails = useCallback( + (ev) => { + ev.preventDefault(); + onCaseDetailsNavClick({ detailName, subCaseId }); + }, + [detailName, onCaseDetailsNavClick, subCaseId] + ); + + return ( + <LinkAnchor + onClick={goToCaseDetails} + href={getCaseDetailsHref({ detailName, subCaseId })} + data-test-subj="case-details-link" + aria-label={i18n.CASE_DETAILS_LINK_ARIA(title ?? detailName)} + > + {children ? children : detailName} + </LinkAnchor> + ); +}; +export const CaseDetailsLink = React.memo(CaseDetailsLinkComponent); +CaseDetailsLink.displayName = 'CaseDetailsLink'; diff --git a/x-pack/plugins/cases/public/components/links/translations.ts b/x-pack/plugins/cases/public/components/links/translations.ts new file mode 100644 index 0000000000000..248750961d348 --- /dev/null +++ b/x-pack/plugins/cases/public/components/links/translations.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const CASE_DETAILS_LINK_ARIA = (detailName: string) => + i18n.translate('xpack.cases.caseTable.caseDetailsLinkAria', { + values: { detailName }, + defaultMessage: 'click to visit case with title {detailName}', + }); diff --git a/x-pack/plugins/cases/public/components/localized_date_tooltip/index.test.tsx b/x-pack/plugins/cases/public/components/localized_date_tooltip/index.test.tsx new file mode 100644 index 0000000000000..83fba7a041ca5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/localized_date_tooltip/index.test.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount } from 'enzyme'; +import moment from 'moment-timezone'; +import React from 'react'; + +import { LocalizedDateTooltip } from '.'; + +describe('LocalizedDateTooltip', () => { + beforeEach(() => { + moment.tz.setDefault('UTC'); + }); + afterEach(() => { + moment.tz.setDefault('Browser'); + }); + + moment.locale('en'); + const date = moment('2019-02-19 04:21:00'); + + const sampleContentText = + 'this content is typically the string representation of the date prop, but can be any valid react child'; + + const SampleContent = () => <span data-test-subj="sample-content">{sampleContentText}</span>; + + test('it renders the child content', () => { + const wrapper = mount( + <LocalizedDateTooltip date={date.toDate()}> + <SampleContent /> + </LocalizedDateTooltip> + ); + + expect(wrapper.find('[data-test-subj="sample-content"]').exists()).toEqual(true); + }); + + test('it renders', () => { + const wrapper = mount( + <LocalizedDateTooltip date={date.toDate()}> + <SampleContent /> + </LocalizedDateTooltip> + ); + + expect(wrapper.find('[data-test-subj="localized-date-tool-tip"]').exists()).toEqual(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/localized_date_tooltip/index.tsx b/x-pack/plugins/cases/public/components/localized_date_tooltip/index.tsx new file mode 100644 index 0000000000000..3b140caeeda30 --- /dev/null +++ b/x-pack/plugins/cases/public/components/localized_date_tooltip/index.tsx @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import { FormattedRelative } from '@kbn/i18n/react'; +import moment from 'moment'; +import React from 'react'; + +export const LocalizedDateTooltip = React.memo<{ + children: React.ReactNode; + date: Date; + fieldName?: string; + className?: string; +}>(({ children, date, fieldName, className = '' }) => ( + <EuiToolTip + data-test-subj="localized-date-tool-tip" + anchorClassName={className} + content={ + <EuiFlexGroup data-test-subj="dates-container" direction="column" gutterSize="none"> + {fieldName != null ? ( + <EuiFlexItem grow={false}> + <span data-test-subj="field-name">{fieldName}</span> + </EuiFlexItem> + ) : null} + <EuiFlexItem grow={false}> + <FormattedRelative + data-test-subj="humanized-relative-date" + value={moment.utc(date).toDate()} + /> + </EuiFlexItem> + <EuiFlexItem data-test-subj="with-day-of-week" grow={false}> + {moment.utc(date).local().format('llll')} + </EuiFlexItem> + <EuiFlexItem data-test-subj="with-time-zone-offset-in-hours" grow={false}> + {moment(date).format()} + </EuiFlexItem> + </EuiFlexGroup> + } + > + <>{children}</> + </EuiToolTip> +)); + +LocalizedDateTooltip.displayName = 'LocalizedDateTooltip'; diff --git a/x-pack/plugins/cases/public/components/panel/index.test.tsx b/x-pack/plugins/cases/public/components/panel/index.test.tsx new file mode 100644 index 0000000000000..81c80158ae577 --- /dev/null +++ b/x-pack/plugins/cases/public/components/panel/index.test.tsx @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount } from 'enzyme'; +import { Panel } from '.'; +import React from 'react'; + +describe('Panel', () => { + test('it does not have the boolean loading as a Eui Property', () => { + const wrapper = mount(<Panel loading={true} />); + expect(Object.keys(wrapper.find('EuiPanel').props())).not.toContain('loading'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/panel/index.tsx b/x-pack/plugins/cases/public/components/panel/index.tsx new file mode 100644 index 0000000000000..652d22409cb0c --- /dev/null +++ b/x-pack/plugins/cases/public/components/panel/index.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import styled from 'styled-components'; +import React from 'react'; +import { EuiPanel } from '@elastic/eui'; + +/** + * The reason for the type of syntax below of: + * `styled(({ loading, ...props })` + * is filter out the "loading" attribute from being put on the DOM + * and getting one of the stack traces from + * ``` + * ReactJS about non-standard HTML such as this one: + * Warning: Received `true` for a non-boolean attribute `loading`. + * If you want to write it to the DOM, pass a string instead: loading="true" or loading={value.toString()}. + * ``` + * + * Ref: https://github.com/styled-components/styled-components/issues/1198#issuecomment-425650423 + * Ref: https://github.com/elastic/kibana/pull/41596#issuecomment-514418978 + * Ref: https://www.styled-components.com/docs/faqs#why-am-i-getting-html-attribute-warnings + * Ref: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html + */ +export const Panel = styled(({ loading, ...props }) => <EuiPanel {...props} />)` + position: relative; + ${({ loading }) => + loading && + ` + overflow: hidden; + `} +`; + +Panel.displayName = 'Panel'; diff --git a/x-pack/plugins/cases/public/components/subtitle/__snapshots__/index.test.tsx.snap b/x-pack/plugins/cases/public/components/subtitle/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000000..7ffd043d16aed --- /dev/null +++ b/x-pack/plugins/cases/public/components/subtitle/__snapshots__/index.test.tsx.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Subtitle it renders 1`] = ` +<Wrapper + className="casesSubtitle" +> + <SubtitleItem> + Test subtitle + </SubtitleItem> +</Wrapper> +`; diff --git a/x-pack/plugins/cases/public/components/subtitle/index.test.tsx b/x-pack/plugins/cases/public/components/subtitle/index.test.tsx new file mode 100644 index 0000000000000..20120edc91937 --- /dev/null +++ b/x-pack/plugins/cases/public/components/subtitle/index.test.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount, shallow } from 'enzyme'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { Subtitle } from './index'; + +describe('Subtitle', () => { + test('it renders', () => { + const wrapper = shallow(<Subtitle items="Test subtitle" />); + + expect(wrapper).toMatchSnapshot(); + }); + + test('it renders one subtitle string item', () => { + const wrapper = mount( + <TestProviders> + <Subtitle items="Test subtitle" /> + </TestProviders> + ); + + expect(wrapper.find('.casesSubtitle__item--text').length).toEqual(1); + }); + + test('it renders multiple subtitle string items', () => { + const wrapper = mount( + <TestProviders> + <Subtitle items={['Test subtitle 1', 'Test subtitle 2']} /> + </TestProviders> + ); + + expect(wrapper.find('.casesSubtitle__item--text').length).toEqual(2); + }); + + test('it renders one subtitle React.ReactNode item', () => { + const wrapper = mount( + <TestProviders> + <Subtitle items={<span>{'Test subtitle'}</span>} /> + </TestProviders> + ); + + expect(wrapper.find('.casesSubtitle__item--node').length).toEqual(1); + }); + + test('it renders multiple subtitle React.ReactNode items', () => { + const wrapper = mount( + <TestProviders> + <Subtitle items={[<span>{'Test subtitle 1'}</span>, <span>{'Test subtitle 2'}</span>]} /> + </TestProviders> + ); + + expect(wrapper.find('.casesSubtitle__item--node').length).toEqual(2); + }); + + test('it renders multiple subtitle items of mixed type', () => { + const wrapper = mount( + <TestProviders> + <Subtitle items={['Test subtitle 1', <span>{'Test subtitle 2'}</span>]} /> + </TestProviders> + ); + + expect(wrapper.find('.casesSubtitle__item').length).toEqual(2); + }); +}); diff --git a/x-pack/plugins/cases/public/components/subtitle/index.tsx b/x-pack/plugins/cases/public/components/subtitle/index.tsx new file mode 100644 index 0000000000000..267c564fc498d --- /dev/null +++ b/x-pack/plugins/cases/public/components/subtitle/index.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import styled, { css } from 'styled-components'; + +const Wrapper = styled.div` + ${({ theme }) => css` + margin-top: ${theme.eui.euiSizeS}; + + .casesSubtitle__item { + color: ${theme.eui.euiTextSubduedColor}; + font-size: ${theme.eui.euiFontSizeXS}; + line-height: ${theme.eui.euiLineHeight}; + + @media only screen and (min-width: ${theme.eui.euiBreakpoints.s}) { + display: inline-block; + margin-right: ${theme.eui.euiSize}; + + &:last-child { + margin-right: 0; + } + } + } + `} +`; +Wrapper.displayName = 'Wrapper'; + +interface SubtitleItemProps { + children: string | React.ReactNode; + dataTestSubj?: string; +} + +const SubtitleItem = React.memo<SubtitleItemProps>( + ({ children, dataTestSubj = 'header-panel-subtitle' }) => { + if (typeof children === 'string') { + return ( + <p className="casesSubtitle__item casesSubtitle__item--text" data-test-subj={dataTestSubj}> + {children} + </p> + ); + } else { + return ( + <div + className="casesSubtitle__item casesSubtitle__item--node" + data-test-subj={dataTestSubj} + > + {children} + </div> + ); + } + } +); +SubtitleItem.displayName = 'SubtitleItem'; + +export interface SubtitleProps { + items: string | React.ReactNode | Array<string | React.ReactNode>; +} + +export const Subtitle = React.memo<SubtitleProps>(({ items }) => { + return ( + <Wrapper className="casesSubtitle"> + {Array.isArray(items) ? ( + items.map((item, i) => <SubtitleItem key={i}>{item}</SubtitleItem>) + ) : ( + <SubtitleItem>{items}</SubtitleItem> + )} + </Wrapper> + ); +}); +Subtitle.displayName = 'Subtitle'; diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/helpers.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/helpers.tsx new file mode 100644 index 0000000000000..302e45f5e7e70 --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_push_to_service/helpers.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLink } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React from 'react'; + +import * as i18n from './translations'; +import { ActionLicense } from '../../containers/types'; +import { ErrorMessage } from '../callout/types'; + +export const getLicenseError = () => ({ + id: 'license-error', + title: i18n.PUSH_DISABLE_BY_LICENSE_TITLE, + description: ( + <FormattedMessage + defaultMessage="Opening cases in external systems is available when you have the {appropriateLicense}, are using a {cloud}, or are testing out a Free Trial." + id="xpack.cases.caseView.pushToServiceDisableByLicenseDescription" + values={{ + appropriateLicense: ( + <EuiLink href="https://www.elastic.co/subscriptions" target="_blank"> + {i18n.LINK_APPROPRIATE_LICENSE} + </EuiLink> + ), + cloud: ( + <EuiLink href="https://www.elastic.co/cloud/elasticsearch-service/signup" target="_blank"> + {i18n.LINK_CLOUD_DEPLOYMENT} + </EuiLink> + ), + }} + /> + ), +}); + +export const getKibanaConfigError = () => ({ + id: 'kibana-config-error', + title: i18n.PUSH_DISABLE_BY_KIBANA_CONFIG_TITLE, + description: ( + <FormattedMessage + defaultMessage="The kibana.yml file is configured to only allow specific connectors. To enable opening a case in external systems, add .[actionTypeId] (ex: .servicenow | .jira) to the xpack.actions.enabledActiontypes setting. For more information, see {link}." + id="xpack.cases.caseView.pushToServiceDisableByConfigDescription" + values={{ + link: ( + <EuiLink href="#" target="_blank"> + {'coming soon...'} + </EuiLink> + ), + }} + /> + ), +}); + +export const getActionLicenseError = (actionLicense: ActionLicense | null): ErrorMessage[] => { + let errors: ErrorMessage[] = []; + if (actionLicense != null && !actionLicense.enabledInLicense) { + errors = [...errors, getLicenseError()]; + } + if (actionLicense != null && !actionLicense.enabledInConfig) { + errors = [...errors, getKibanaConfigError()]; + } + return errors; +}; diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx new file mode 100644 index 0000000000000..a46a70b359419 --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx @@ -0,0 +1,269 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { renderHook, act } from '@testing-library/react-hooks'; + +import '../../common/mock/match_media'; +import { usePushToService, ReturnUsePushToService, UsePushToService } from '.'; +import { TestProviders } from '../../common/mock'; +import { CaseStatuses } from '../../../common'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; +import { basicPush, actionLicenses } from '../../containers/mock'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { connectorsMock } from '../../containers/configure/mock'; +import { ConnectorTypes } from '../../../common/api/connectors'; + +jest.mock('react-router-dom', () => { + const original = jest.requireActual('react-router-dom'); + + return { + ...original, + useHistory: () => ({ + useHistory: jest.fn(), + }), + }; +}); + +jest.mock('../../containers/use_get_action_license'); +jest.mock('../../containers/use_post_push_to_service'); +jest.mock('../../containers/configure/api'); + +describe('usePushToService', () => { + const caseId = '12345'; + const updateCase = jest.fn(); + const pushCaseToExternalService = jest.fn(); + const mockPostPush = { + isLoading: false, + pushCaseToExternalService, + }; + + const mockConnector = connectorsMock[0]; + const actionLicense = actionLicenses[0]; + const caseServices = { + '123': { + ...basicPush, + firstPushIndex: 0, + lastPushIndex: 0, + commentsToUpdate: [], + hasDataToPush: true, + }, + }; + + const defaultArgs = { + connector: { + id: mockConnector.id, + name: mockConnector.name, + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + caseId, + caseServices, + caseStatus: CaseStatuses.open, + configureCasesHref: 'href', + connectors: connectorsMock, + isValidConnector: true, + onConfigureCasesNavClick: jest.fn(), + updateCase, + userCanCrud: true, + }; + + beforeEach(() => { + jest.resetAllMocks(); + (usePostPushToService as jest.Mock).mockImplementation(() => mockPostPush); + (useGetActionLicense as jest.Mock).mockImplementation(() => ({ + isLoading: false, + actionLicense, + })); + }); + + it('push case button posts the push with correct args', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => usePushToService(defaultArgs), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + result.current.pushButton.props.children.props.onClick(); + expect(pushCaseToExternalService).toBeCalledWith({ + caseId, + connector: { + fields: null, + id: 'servicenow-1', + name: 'My Connector', + type: ConnectorTypes.serviceNowITSM, + }, + }); + expect(result.current.pushCallouts).toBeNull(); + }); + }); + + it('Displays message when user does not have premium license', async () => { + (useGetActionLicense as jest.Mock).mockImplementation(() => ({ + isLoading: false, + actionLicense: { + ...actionLicense, + enabledInLicense: false, + }, + })); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => usePushToService(defaultArgs), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('license-error'); + }); + }); + + it('Displays message when user does not have case enabled in config', async () => { + (useGetActionLicense as jest.Mock).mockImplementation(() => ({ + isLoading: false, + actionLicense: { + ...actionLicense, + enabledInConfig: false, + }, + })); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => usePushToService(defaultArgs), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('kibana-config-error'); + }); + }); + + it('Displays message when user does not have any connector configured', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => + usePushToService({ + ...defaultArgs, + connectors: [], + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + }), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('connector-missing-error'); + }); + }); + + it('Displays message when user does have a connector but is configured to none', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => + usePushToService({ + ...defaultArgs, + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + }), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('connector-not-selected-error'); + }); + }); + + it('Displays message when connector is deleted', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => + usePushToService({ + ...defaultArgs, + connector: { + id: 'not-exist', + name: 'not-exist', + type: ConnectorTypes.none, + fields: null, + }, + isValidConnector: false, + }), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('connector-deleted-error'); + }); + }); + + it('Displays message when connector is deleted with empty connectors', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => + usePushToService({ + ...defaultArgs, + connectors: [], + connector: { + id: 'not-exist', + name: 'not-exist', + type: ConnectorTypes.none, + fields: null, + }, + isValidConnector: false, + }), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('connector-deleted-error'); + }); + }); + + it('Displays message when case is closed', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( + () => + usePushToService({ + ...defaultArgs, + caseStatus: CaseStatuses.closed, + }), + { + wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, + } + ); + await waitForNextUpdate(); + const errorsMsg = result.current.pushCallouts?.props.messages; + expect(errorsMsg).toHaveLength(1); + expect(errorsMsg[0].id).toEqual('closed-case-push-error'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx new file mode 100644 index 0000000000000..335dd0deaff54 --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx @@ -0,0 +1,203 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiToolTip } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useCallback, useMemo } from 'react'; + +import { Case } from '../../containers/types'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; +import { CaseCallOut } from '../callout'; +import { getLicenseError, getKibanaConfigError } from './helpers'; +import * as i18n from './translations'; +import { CaseConnector, ActionConnector, CaseStatuses } from '../../../common'; +import { CaseServices } from '../../containers/use_get_case_user_actions'; +import { LinkAnchor } from '../links'; +import { ErrorMessage } from '../callout/types'; + +export interface UsePushToService { + caseId: string; + caseStatus: string; + configureCasesHref: string; + connector: CaseConnector; + caseServices: CaseServices; + connectors: ActionConnector[]; + onConfigureCasesNavClick: () => void; + updateCase: (newCase: Case) => void; + userCanCrud: boolean; + isValidConnector: boolean; +} + +export interface ReturnUsePushToService { + pushButton: JSX.Element; + pushCallouts: JSX.Element | null; +} + +export const usePushToService = ({ + configureCasesHref, + connector, + caseId, + caseServices, + caseStatus, + connectors, + onConfigureCasesNavClick, + updateCase, + userCanCrud, + isValidConnector, +}: UsePushToService): ReturnUsePushToService => { + const { isLoading, pushCaseToExternalService } = usePostPushToService(); + + const { isLoading: loadingLicense, actionLicense } = useGetActionLicense(); + + const handlePushToService = useCallback(async () => { + if (connector.id != null && connector.id !== 'none') { + const theCase = await pushCaseToExternalService({ + caseId, + connector, + }); + + if (theCase != null) { + updateCase(theCase); + } + } + }, [caseId, connector, pushCaseToExternalService, updateCase]); + + const errorsMsg = useMemo(() => { + let errors: ErrorMessage[] = []; + if (actionLicense != null && !actionLicense.enabledInLicense) { + errors = [...errors, getLicenseError()]; + } + if (connectors.length === 0 && connector.id === 'none' && !loadingLicense) { + errors = [ + ...errors, + { + id: 'connector-missing-error', + title: i18n.PUSH_DISABLE_BY_NO_CONFIG_TITLE, + description: ( + <FormattedMessage + defaultMessage="To open and update cases in external systems, you must configure a {link}." + id="xpack.cases.caseView.pushToServiceDisableByNoConnectors" + values={{ + link: ( + <LinkAnchor + onClick={onConfigureCasesNavClick} + href={configureCasesHref} + target="_blank" + > + {i18n.LINK_CONNECTOR_CONFIGURE} + </LinkAnchor> + ), + }} + /> + ), + }, + ]; + } else if (connector.id === 'none' && !loadingLicense) { + errors = [ + ...errors, + { + id: 'connector-not-selected-error', + title: i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE, + description: ( + <FormattedMessage + defaultMessage="To open and update cases in external systems, you must select an external incident management system for this case." + id="xpack.cases.caseView.pushToServiceDisableByNoCaseConfigDescription" + /> + ), + }, + ]; + } else if (!isValidConnector && !loadingLicense) { + errors = [ + ...errors, + { + id: 'connector-deleted-error', + title: i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE, + description: ( + <FormattedMessage + defaultMessage="The connector used to send updates to external service has been deleted. To update cases in external systems, select a different connector or create a new one." + id="xpack.cases.caseView.pushToServiceDisableByInvalidConnector" + /> + ), + errorType: 'danger', + }, + ]; + } + if (caseStatus === CaseStatuses.closed) { + errors = [ + ...errors, + { + id: 'closed-case-push-error', + title: i18n.PUSH_DISABLE_BECAUSE_CASE_CLOSED_TITLE, + description: ( + <FormattedMessage + defaultMessage="Closed cases cannot be sent to external systems. Reopen the case if you want to open or update it in an external system." + id="xpack.cases.caseView.pushToServiceDisableBecauseCaseClosedDescription" + /> + ), + }, + ]; + } + if (actionLicense != null && !actionLicense.enabledInConfig) { + errors = [...errors, getKibanaConfigError()]; + } + return errors; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [actionLicense, caseStatus, connectors.length, connector, loadingLicense]); + + const pushToServiceButton = useMemo(() => { + return ( + <EuiButton + data-test-subj="push-to-external-service" + fill + iconType="importAction" + onClick={handlePushToService} + disabled={ + isLoading || loadingLicense || errorsMsg.length > 0 || !userCanCrud || !isValidConnector + } + isLoading={isLoading} + > + {caseServices[connector.id] + ? i18n.UPDATE_THIRD(connector.name) + : i18n.PUSH_THIRD(connector.name)} + </EuiButton> + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + connector, + connectors, + errorsMsg, + handlePushToService, + isLoading, + loadingLicense, + userCanCrud, + isValidConnector, + ]); + + const objToReturn = useMemo(() => { + return { + pushButton: + errorsMsg.length > 0 ? ( + <EuiToolTip + position="top" + title={errorsMsg[0].title} + content={<p>{errorsMsg[0].description}</p>} + > + {pushToServiceButton} + </EuiToolTip> + ) : ( + <>{pushToServiceButton}</> + ), + pushCallouts: + errorsMsg.length > 0 ? ( + <CaseCallOut title={i18n.ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={errorsMsg} /> + ) : null, + }; + }, [errorsMsg, pushToServiceButton]); + + return objToReturn; +}; diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/translations.ts b/x-pack/plugins/cases/public/components/use_push_to_service/translations.ts new file mode 100644 index 0000000000000..fd6faa634e053 --- /dev/null +++ b/x-pack/plugins/cases/public/components/use_push_to_service/translations.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const ERROR_PUSH_SERVICE_CALLOUT_TITLE = i18n.translate( + 'xpack.cases.caseView.errorsPushServiceCallOutTitle', + { + defaultMessage: 'To send cases to external systems, you need to:', + } +); +export const PUSH_THIRD = (thirdParty: string) => { + if (thirdParty === 'none') { + return i18n.translate('xpack.cases.caseView.pushThirdPartyIncident', { + defaultMessage: 'Push as external incident', + }); + } + + return i18n.translate('xpack.cases.caseView.pushNamedIncident', { + values: { thirdParty }, + defaultMessage: 'Push as { thirdParty } incident', + }); +}; + +export const UPDATE_THIRD = (thirdParty: string) => { + if (thirdParty === 'none') { + return i18n.translate('xpack.cases.caseView.updateThirdPartyIncident', { + defaultMessage: 'Update external incident', + }); + } + + return i18n.translate('xpack.cases.caseView.updateNamedIncident', { + values: { thirdParty }, + defaultMessage: 'Update { thirdParty } incident', + }); +}; + +export const PUSH_DISABLE_BY_NO_CONFIG_TITLE = i18n.translate( + 'xpack.cases.caseView.pushToServiceDisableByNoConfigTitle', + { + defaultMessage: 'Configure external connector', + } +); + +export const PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE = i18n.translate( + 'xpack.cases.caseView.pushToServiceDisableByNoCaseConfigTitle', + { + defaultMessage: 'Select external connector', + } +); + +export const PUSH_DISABLE_BECAUSE_CASE_CLOSED_TITLE = i18n.translate( + 'xpack.cases.caseView.pushToServiceDisableBecauseCaseClosedTitle', + { + defaultMessage: 'Reopen the case', + } +); + +export const PUSH_DISABLE_BY_KIBANA_CONFIG_TITLE = i18n.translate( + 'xpack.cases.caseView.pushToServiceDisableByConfigTitle', + { + defaultMessage: 'Enable external service in Kibana configuration file', + } +); + +export const PUSH_DISABLE_BY_LICENSE_TITLE = i18n.translate( + 'xpack.cases.caseView.pushToServiceDisableByLicenseTitle', + { + defaultMessage: 'Upgrade to an appropriate license', + } +); + +export const LINK_CLOUD_DEPLOYMENT = i18n.translate('xpack.cases.caseView.cloudDeploymentLink', { + defaultMessage: 'cloud deployment', +}); + +export const LINK_APPROPRIATE_LICENSE = i18n.translate('xpack.cases.caseView.appropiateLicense', { + defaultMessage: 'appropriate license', +}); + +export const LINK_CONNECTOR_CONFIGURE = i18n.translate( + 'xpack.cases.caseView.connectorConfigureLink', + { + defaultMessage: 'connector', + } +); diff --git a/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap new file mode 100644 index 0000000000000..f082dc4023e7a --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap @@ -0,0 +1,30 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UtilityBar it renders 1`] = ` +<UtilityBar> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText> + Test text + </UtilityBarText> + </UtilityBarGroup> + <UtilityBarGroup> + <UtilityBarAction + iconType="" + popoverContent={[Function]} + > + Test action + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarAction + iconType="cross" + > + Test action + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> +</UtilityBar> +`; diff --git a/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap new file mode 100644 index 0000000000000..eb20ac217b300 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UtilityBarAction it renders 1`] = ` +<UtilityBarAction + iconType="alert" +> + Test action +</UtilityBarAction> +`; diff --git a/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap new file mode 100644 index 0000000000000..8ef7ee1cfe842 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UtilityBarGroup it renders 1`] = ` +<UtilityBarGroup> + <UtilityBarText> + Test text + </UtilityBarText> +</UtilityBarGroup> +`; diff --git a/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap new file mode 100644 index 0000000000000..2fe3b8ac5c7aa --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UtilityBarSection it renders 1`] = ` +<UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText> + Test text + </UtilityBarText> + </UtilityBarGroup> +</UtilityBarSection> +`; diff --git a/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap new file mode 100644 index 0000000000000..cf635ffa49c4c --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UtilityBarText it renders 1`] = ` +<UtilityBarText> + Test text +</UtilityBarText> +`; diff --git a/x-pack/plugins/cases/public/components/utility_bar/index.ts b/x-pack/plugins/cases/public/components/utility_bar/index.ts new file mode 100644 index 0000000000000..830f3cb043ba9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { UtilityBar } from './utility_bar'; +export { UtilityBarAction } from './utility_bar_action'; +export { UtilityBarGroup } from './utility_bar_group'; +export { UtilityBarSection } from './utility_bar_section'; +export { UtilityBarSpacer } from './utility_bar_spacer'; +export { UtilityBarText } from './utility_bar_text'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/styles.tsx b/x-pack/plugins/cases/public/components/utility_bar/styles.tsx new file mode 100644 index 0000000000000..158f0c5ebea15 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/styles.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import styled, { css } from 'styled-components'; + +/** + * UTILITY BAR + */ + +export interface BarProps { + border?: boolean; +} + +export interface BarSectionProps { + grow?: boolean; +} + +export interface BarGroupProps { + grow?: boolean; +} + +export const Bar = styled.aside.attrs({ + className: 'casesUtilityBar', +})<BarProps>` + ${({ border, theme }) => css` + ${border && + css` + border-bottom: ${theme.eui.euiBorderThin}; + padding-bottom: ${theme.eui.paddingSizes.s}; + `} + + @media only screen and (min-width: ${theme.eui.euiBreakpoints.l}) { + display: flex; + justify-content: space-between; + } + `} +`; +Bar.displayName = 'Bar'; + +export const BarSection = styled.div.attrs({ + className: 'casesUtilityBar__section', +})<BarSectionProps>` + ${({ grow, theme }) => css` + & + & { + margin-top: ${theme.eui.euiSizeS}; + } + + @media only screen and (min-width: ${theme.eui.euiBreakpoints.m}) { + display: flex; + flex-wrap: wrap; + } + + @media only screen and (min-width: ${theme.eui.euiBreakpoints.l}) { + & + & { + margin-top: 0; + margin-left: ${theme.eui.euiSize}; + } + } + ${grow && + css` + flex: 1; + `} + `} +`; +BarSection.displayName = 'BarSection'; + +export const BarGroup = styled.div.attrs({ + className: 'casesUtilityBar__group', +})<BarGroupProps>` + ${({ grow, theme }) => css` + align-items: flex-start; + display: flex; + flex-wrap: wrap; + + & + & { + margin-top: ${theme.eui.euiSizeS}; + } + + @media only screen and (min-width: ${theme.eui.euiBreakpoints.m}) { + border-right: ${theme.eui.euiBorderThin}; + flex-wrap: nowrap; + margin-right: ${theme.eui.paddingSizes.m}; + padding-right: ${theme.eui.paddingSizes.m}; + + & + & { + margin-top: 0; + } + + &:last-child { + border-right: none; + margin-right: 0; + padding-right: 0; + } + } + + & > * { + margin-right: ${theme.eui.euiSize}; + + &:last-child { + margin-right: 0; + } + } + ${grow && + css` + flex: 1; + `} + `} +`; +BarGroup.displayName = 'BarGroup'; + +export const BarText = styled.p.attrs({ + className: 'casesUtilityBar__text', +})` + ${({ theme }) => css` + color: ${theme.eui.euiTextSubduedColor}; + font-size: ${theme.eui.euiFontSizeXS}; + line-height: ${theme.eui.euiLineHeight}; + white-space: nowrap; + `} +`; +BarText.displayName = 'BarText'; + +export const BarAction = styled.div.attrs({ + className: 'casesUtilityBar__action', +})` + ${({ theme }) => css` + font-size: ${theme.eui.euiFontSizeXS}; + line-height: ${theme.eui.euiLineHeight}; + `} +`; +BarAction.displayName = 'BarAction'; + +export const BarSpacer = styled.div.attrs({ + className: 'casesUtilityBar__spacer', +})` + ${() => css` + flex: 1; + `} +`; +BarSpacer.displayName = 'BarSpacer'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar.test.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar.test.tsx new file mode 100644 index 0000000000000..98af25a9af466 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar.test.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; +import { mount, shallow } from 'enzyme'; +import React from 'react'; +import { TestProviders } from '../../common/mock'; + +import { + UtilityBar, + UtilityBarAction, + UtilityBarGroup, + UtilityBarSection, + UtilityBarText, +} from './index'; + +describe('UtilityBar', () => { + test('it renders', () => { + const wrapper = shallow( + <TestProviders> + <UtilityBar> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText>{'Test text'}</UtilityBarText> + </UtilityBarGroup> + + <UtilityBarGroup> + <UtilityBarAction iconType="" popoverContent={() => <p>{'Test popover'}</p>}> + {'Test action'} + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarAction iconType="cross">{'Test action'}</UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + </UtilityBar> + </TestProviders> + ); + + expect(wrapper.find('UtilityBar')).toMatchSnapshot(); + }); + + test('it applies border styles when border is true', () => { + const wrapper = mount( + <TestProviders> + <UtilityBar border> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText>{'Test text'}</UtilityBarText> + </UtilityBarGroup> + + <UtilityBarGroup> + <UtilityBarAction iconType="" popoverContent={() => <p>{'Test popover'}</p>}> + {'Test action'} + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarAction iconType="cross">{'Test action'}</UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + </UtilityBar> + </TestProviders> + ); + const casesUtilityBar = wrapper.find('.casesUtilityBar').first(); + + expect(casesUtilityBar).toHaveStyleRule('border-bottom', euiDarkVars.euiBorderThin); + expect(casesUtilityBar).toHaveStyleRule('padding-bottom', euiDarkVars.paddingSizes.s); + }); + + test('it DOES NOT apply border styles when border is false', () => { + const wrapper = mount( + <TestProviders> + <UtilityBar> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText>{'Test text'}</UtilityBarText> + </UtilityBarGroup> + + <UtilityBarGroup> + <UtilityBarAction iconType="" popoverContent={() => <p>{'Test popover'}</p>}> + {'Test action'} + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarAction iconType="cross">{'Test action'}</UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + </UtilityBar> + </TestProviders> + ); + const casesUtilityBar = wrapper.find('.casesUtilityBar').first(); + + expect(casesUtilityBar).not.toHaveStyleRule('border-bottom', euiDarkVars.euiBorderThin); + expect(casesUtilityBar).not.toHaveStyleRule('padding-bottom', euiDarkVars.paddingSizes.s); + }); +}); diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar.tsx new file mode 100644 index 0000000000000..ff47459d437be --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { Bar, BarProps } from './styles'; + +interface UtilityBarProps extends BarProps { + children: React.ReactNode; +} + +export const UtilityBar = React.memo<UtilityBarProps>(({ border, children }) => ( + <Bar border={border}>{children}</Bar> +)); + +UtilityBar.displayName = 'UtilityBar'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.test.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.test.tsx new file mode 100644 index 0000000000000..8fc67cefc0f61 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount, shallow } from 'enzyme'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { UtilityBarAction } from './index'; + +describe('UtilityBarAction', () => { + test('it renders', () => { + const wrapper = shallow( + <TestProviders> + <UtilityBarAction iconType="alert">{'Test action'}</UtilityBarAction> + </TestProviders> + ); + + expect(wrapper.find('UtilityBarAction')).toMatchSnapshot(); + }); + + test('it renders a popover', () => { + const wrapper = mount( + <TestProviders> + <UtilityBarAction iconType="alert" popoverContent={() => <p>{'Test popover'}</p>}> + {'Test action'} + </UtilityBarAction> + </TestProviders> + ); + + expect(wrapper.find('.euiPopover').first().exists()).toBe(true); + }); +}); diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.tsx new file mode 100644 index 0000000000000..19cb8ef4f613b --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_action.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiPopover } from '@elastic/eui'; +import React, { useCallback, useState } from 'react'; + +import { LinkIcon, LinkIconProps } from '../link_icon'; +import { BarAction } from './styles'; + +const Popover = React.memo<UtilityBarActionProps>( + ({ children, color, iconSide, iconSize, iconType, popoverContent, disabled, ownFocus }) => { + const [popoverState, setPopoverState] = useState(false); + + const closePopover = useCallback(() => setPopoverState(false), [setPopoverState]); + + return ( + <EuiPopover + ownFocus={ownFocus} + button={ + <LinkIcon + color={color} + iconSide={iconSide} + iconSize={iconSize} + iconType={iconType} + onClick={() => setPopoverState(!popoverState)} + disabled={disabled} + > + {children} + </LinkIcon> + } + closePopover={() => setPopoverState(false)} + isOpen={popoverState} + repositionOnScroll + > + {popoverContent?.(closePopover)} + </EuiPopover> + ); + } +); + +Popover.displayName = 'Popover'; + +export interface UtilityBarActionProps extends LinkIconProps { + popoverContent?: (closePopover: () => void) => React.ReactNode; + dataTestSubj?: string; + ownFocus?: boolean; +} + +export const UtilityBarAction = React.memo<UtilityBarActionProps>( + ({ + children, + color, + dataTestSubj, + disabled, + href, + iconSide, + iconSize, + iconType, + ownFocus, + onClick, + popoverContent, + }) => ( + <BarAction data-test-subj={dataTestSubj}> + {popoverContent ? ( + <Popover + disabled={disabled} + color={color} + iconSide={iconSide} + iconSize={iconSize} + iconType={iconType} + ownFocus={ownFocus} + popoverContent={popoverContent} + > + {children} + </Popover> + ) : ( + <LinkIcon + color={color} + disabled={disabled} + href={href} + iconSide={iconSide} + iconSize={iconSize} + iconType={iconType} + onClick={onClick} + > + {children} + </LinkIcon> + )} + </BarAction> + ) +); + +UtilityBarAction.displayName = 'UtilityBarAction'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.test.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.test.tsx new file mode 100644 index 0000000000000..546dcf48bba9a --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.test.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { shallow } from 'enzyme'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { UtilityBarGroup, UtilityBarText } from './index'; + +describe('UtilityBarGroup', () => { + test('it renders', () => { + const wrapper = shallow( + <TestProviders> + <UtilityBarGroup> + <UtilityBarText>{'Test text'}</UtilityBarText> + </UtilityBarGroup> + </TestProviders> + ); + + expect(wrapper.find('UtilityBarGroup')).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.tsx new file mode 100644 index 0000000000000..ef83d6effc8a3 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_group.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { BarGroup, BarGroupProps } from './styles'; + +export interface UtilityBarGroupProps extends BarGroupProps { + children: React.ReactNode; +} + +export const UtilityBarGroup = React.memo<UtilityBarGroupProps>(({ grow, children }) => ( + <BarGroup grow={grow}>{children}</BarGroup> +)); + +UtilityBarGroup.displayName = 'UtilityBarGroup'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.test.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.test.tsx new file mode 100644 index 0000000000000..f06ff651b5419 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.test.tsx @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { shallow } from 'enzyme'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { UtilityBarGroup, UtilityBarSection, UtilityBarText } from './index'; + +describe('UtilityBarSection', () => { + test('it renders', () => { + const wrapper = shallow( + <TestProviders> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText>{'Test text'}</UtilityBarText> + </UtilityBarGroup> + </UtilityBarSection> + </TestProviders> + ); + + expect(wrapper.find('UtilityBarSection')).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.tsx new file mode 100644 index 0000000000000..c84219cc63488 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_section.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { BarSection, BarSectionProps } from './styles'; + +export interface UtilityBarSectionProps extends BarSectionProps { + children: React.ReactNode; +} + +export const UtilityBarSection = React.memo<UtilityBarSectionProps>(({ grow, children }) => ( + <BarSection grow={grow}>{children}</BarSection> +)); + +UtilityBarSection.displayName = 'UtilityBarSection'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_spacer.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_spacer.tsx new file mode 100644 index 0000000000000..11b3be8d656e4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_spacer.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { BarSpacer } from './styles'; + +export interface UtilityBarSpacerProps { + dataTestSubj?: string; +} + +export const UtilityBarSpacer = React.memo<UtilityBarSpacerProps>(({ dataTestSubj }) => ( + <BarSpacer data-test-subj={dataTestSubj} /> +)); + +UtilityBarSpacer.displayName = 'UtilityBarSpacer'; diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.test.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.test.tsx new file mode 100644 index 0000000000000..456a1f4bed3be --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.test.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { shallow } from 'enzyme'; +import React from 'react'; + +import { TestProviders } from '../../common/mock'; +import { UtilityBarText } from './index'; + +describe('UtilityBarText', () => { + test('it renders', () => { + const wrapper = shallow( + <TestProviders> + <UtilityBarText>{'Test text'}</UtilityBarText> + </TestProviders> + ); + + expect(wrapper.find('UtilityBarText')).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.tsx b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.tsx new file mode 100644 index 0000000000000..c0be3cbfbe202 --- /dev/null +++ b/x-pack/plugins/cases/public/components/utility_bar/utility_bar_text.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { BarText } from './styles'; + +export interface UtilityBarTextProps { + children: string | JSX.Element; + dataTestSubj?: string; +} + +export const UtilityBarText = React.memo<UtilityBarTextProps>(({ children, dataTestSubj }) => ( + <BarText data-test-subj={dataTestSubj}>{children}</BarText> +)); + +UtilityBarText.displayName = 'UtilityBarText'; diff --git a/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx b/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx new file mode 100644 index 0000000000000..5a2b4df20e222 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { CaseStatuses } from '../../common'; +import { useUpdateCases, UseUpdateCases } from './use_bulk_update_case'; +import { basicCase } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useUpdateCases', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => + useUpdateCases() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + isUpdated: false, + updateBulkStatus: result.current.updateBulkStatus, + dispatchResetIsUpdated: result.current.dispatchResetIsUpdated, + }); + }); + }); + + it('calls patchCase with correct arguments', async () => { + const spyOnPatchCases = jest.spyOn(api, 'patchCasesStatus'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => + useUpdateCases() + ); + await waitForNextUpdate(); + + result.current.updateBulkStatus([basicCase], CaseStatuses.closed); + await waitForNextUpdate(); + expect(spyOnPatchCases).toBeCalledWith( + [ + { + status: CaseStatuses.closed, + id: basicCase.id, + version: basicCase.version, + }, + ], + abortCtrl.signal + ); + }); + }); + + it('patch cases', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => + useUpdateCases() + ); + await waitForNextUpdate(); + result.current.updateBulkStatus([basicCase], CaseStatuses.closed); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isUpdated: true, + isLoading: false, + isError: false, + updateBulkStatus: result.current.updateBulkStatus, + dispatchResetIsUpdated: result.current.dispatchResetIsUpdated, + }); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => + useUpdateCases() + ); + await waitForNextUpdate(); + result.current.updateBulkStatus([basicCase], CaseStatuses.closed); + + expect(result.current.isLoading).toBe(true); + }); + }); + + it('dispatchResetIsUpdated resets is updated', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => + useUpdateCases() + ); + + await waitForNextUpdate(); + result.current.updateBulkStatus([basicCase], CaseStatuses.closed); + await waitForNextUpdate(); + expect(result.current.isUpdated).toBeTruthy(); + result.current.dispatchResetIsUpdated(); + expect(result.current.isUpdated).toBeFalsy(); + }); + }); + + it('unhappy path', async () => { + const spyOnPatchCases = jest.spyOn(api, 'patchCasesStatus'); + spyOnPatchCases.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => + useUpdateCases() + ); + await waitForNextUpdate(); + result.current.updateBulkStatus([basicCase], CaseStatuses.closed); + + expect(result.current).toEqual({ + isUpdated: false, + isLoading: false, + isError: true, + updateBulkStatus: result.current.updateBulkStatus, + dispatchResetIsUpdated: result.current.dispatchResetIsUpdated, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx b/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx new file mode 100644 index 0000000000000..e446c718125dc --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx @@ -0,0 +1,153 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useReducer, useRef, useEffect } from 'react'; +import { CaseStatuses } from '../../common'; +import { displaySuccessToast, errorToToaster, useStateToaster } from '../components/toasters'; +import * as i18n from './translations'; +import { patchCasesStatus } from './api'; +import { BulkUpdateStatus, Case } from './types'; + +interface UpdateState { + isUpdated: boolean; + isLoading: boolean; + isError: boolean; +} +type Action = + | { type: 'FETCH_INIT' } + | { type: 'FETCH_SUCCESS'; payload: boolean } + | { type: 'FETCH_FAILURE' } + | { type: 'RESET_IS_UPDATED' }; + +const dataFetchReducer = (state: UpdateState, action: Action): UpdateState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + isUpdated: action.payload, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + }; + case 'RESET_IS_UPDATED': + return { + ...state, + isUpdated: false, + }; + default: + return state; + } +}; +export interface UseUpdateCases extends UpdateState { + updateBulkStatus: (cases: Case[], status: string) => void; + dispatchResetIsUpdated: () => void; +} + +const getStatusToasterMessage = ( + status: CaseStatuses, + messageArgs: { + totalCases: number; + caseTitle?: string; + } +): string => { + if (status === CaseStatuses.open) { + return i18n.REOPENED_CASES(messageArgs); + } else if (status === CaseStatuses['in-progress']) { + return i18n.MARK_IN_PROGRESS_CASES(messageArgs); + } else if (status === CaseStatuses.closed) { + return i18n.CLOSED_CASES(messageArgs); + } + + return ''; +}; + +export const useUpdateCases = (): UseUpdateCases => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: false, + isError: false, + isUpdated: false, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const dispatchUpdateCases = useCallback(async (cases: BulkUpdateStatus[], action: string) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + + dispatch({ type: 'FETCH_INIT' }); + const patchResponse = await patchCasesStatus(cases, abortCtrlRef.current.signal); + + if (!isCancelledRef.current) { + const resultCount = Object.keys(patchResponse).length; + const firstTitle = patchResponse[0].title; + + dispatch({ type: 'FETCH_SUCCESS', payload: true }); + const messageArgs = { + totalCases: resultCount, + caseTitle: resultCount === 1 ? firstTitle : '', + }; + + const message = + action === 'status' ? getStatusToasterMessage(patchResponse[0].status, messageArgs) : ''; + + displaySuccessToast(message, dispatchToaster); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const dispatchResetIsUpdated = useCallback(() => { + dispatch({ type: 'RESET_IS_UPDATED' }); + }, []); + + const updateBulkStatus = useCallback( + (cases: Case[], status: string) => { + const updateCasesStatus: BulkUpdateStatus[] = cases.map((theCase) => ({ + status, + id: theCase.id, + version: theCase.version, + })); + dispatchUpdateCases(updateCasesStatus, 'status'); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + + useEffect(() => { + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + }, []); + + return { ...state, updateBulkStatus, dispatchResetIsUpdated }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx new file mode 100644 index 0000000000000..5edfc13afbf61 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { CaseType } from '../../common'; +import { useDeleteCases, UseDeleteCase } from './use_delete_cases'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useDeleteCases', () => { + const abortCtrl = new AbortController(); + const deleteObj = [ + { id: '1', type: CaseType.individual }, + { id: '2', type: CaseType.individual }, + { id: '3', type: CaseType.individual }, + ]; + const deleteArr = ['1', '2', '3']; + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => + useDeleteCases() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isDisplayConfirmDeleteModal: false, + isLoading: false, + isError: false, + isDeleted: false, + dispatchResetIsDeleted: result.current.dispatchResetIsDeleted, + handleOnDeleteConfirm: result.current.handleOnDeleteConfirm, + handleToggleModal: result.current.handleToggleModal, + }); + }); + }); + + it('calls deleteCases with correct arguments', async () => { + const spyOnDeleteCases = jest.spyOn(api, 'deleteCases'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => + useDeleteCases() + ); + await waitForNextUpdate(); + + result.current.handleOnDeleteConfirm(deleteObj); + await waitForNextUpdate(); + expect(spyOnDeleteCases).toBeCalledWith(deleteArr, abortCtrl.signal); + }); + }); + + it('deletes cases', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => + useDeleteCases() + ); + await waitForNextUpdate(); + result.current.handleToggleModal(); + result.current.handleOnDeleteConfirm(deleteObj); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isDisplayConfirmDeleteModal: false, + isLoading: false, + isError: false, + isDeleted: true, + dispatchResetIsDeleted: result.current.dispatchResetIsDeleted, + handleOnDeleteConfirm: result.current.handleOnDeleteConfirm, + handleToggleModal: result.current.handleToggleModal, + }); + }); + }); + + it('resets is deleting', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => + useDeleteCases() + ); + await waitForNextUpdate(); + result.current.handleToggleModal(); + result.current.handleOnDeleteConfirm(deleteObj); + await waitForNextUpdate(); + expect(result.current.isDeleted).toBeTruthy(); + result.current.handleToggleModal(); + result.current.dispatchResetIsDeleted(); + expect(result.current.isDeleted).toBeFalsy(); + }); + }); + + it('set isLoading to true when deleting cases', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => + useDeleteCases() + ); + await waitForNextUpdate(); + result.current.handleToggleModal(); + result.current.handleOnDeleteConfirm(deleteObj); + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnDeleteCases = jest.spyOn(api, 'deleteCases'); + spyOnDeleteCases.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => + useDeleteCases() + ); + await waitForNextUpdate(); + result.current.handleToggleModal(); + result.current.handleOnDeleteConfirm(deleteObj); + + expect(result.current).toEqual({ + isDisplayConfirmDeleteModal: false, + isLoading: false, + isError: true, + isDeleted: false, + dispatchResetIsDeleted: result.current.dispatchResetIsDeleted, + handleOnDeleteConfirm: result.current.handleOnDeleteConfirm, + handleToggleModal: result.current.handleToggleModal, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_delete_cases.tsx b/x-pack/plugins/cases/public/containers/use_delete_cases.tsx new file mode 100644 index 0000000000000..3204c93a6cbd3 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_delete_cases.tsx @@ -0,0 +1,147 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useReducer, useRef, useEffect } from 'react'; +import { displaySuccessToast, errorToToaster, useStateToaster } from '../components/toasters'; +import * as i18n from './translations'; +import { deleteCases, deleteSubCases } from './api'; +import { DeleteCase } from './types'; + +interface DeleteState { + isDisplayConfirmDeleteModal: boolean; + isDeleted: boolean; + isLoading: boolean; + isError: boolean; +} +type Action = + | { type: 'DISPLAY_MODAL'; payload: boolean } + | { type: 'FETCH_INIT' } + | { type: 'FETCH_SUCCESS'; payload: boolean } + | { type: 'FETCH_FAILURE' } + | { type: 'RESET_IS_DELETED' }; + +const dataFetchReducer = (state: DeleteState, action: Action): DeleteState => { + switch (action.type) { + case 'DISPLAY_MODAL': + return { + ...state, + isDisplayConfirmDeleteModal: action.payload, + }; + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + isDeleted: action.payload, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + }; + case 'RESET_IS_DELETED': + return { + ...state, + isDeleted: false, + }; + default: + return state; + } +}; + +export interface UseDeleteCase extends DeleteState { + dispatchResetIsDeleted: () => void; + handleOnDeleteConfirm: (cases: DeleteCase[]) => void; + handleToggleModal: () => void; +} + +export const useDeleteCases = (): UseDeleteCase => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isDisplayConfirmDeleteModal: false, + isLoading: false, + isError: false, + isDeleted: false, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const dispatchDeleteCases = useCallback(async (cases: DeleteCase[]) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT' }); + + const caseIds = cases.map((theCase) => theCase.id); + // We don't allow user batch delete sub cases on UI at the moment. + if (cases[0].type != null || cases.length > 1) { + await deleteCases(caseIds, abortCtrlRef.current.signal); + } else { + await deleteSubCases(caseIds, abortCtrlRef.current.signal); + } + + if (!isCancelledRef.current) { + dispatch({ type: 'FETCH_SUCCESS', payload: true }); + displaySuccessToast( + i18n.DELETED_CASES(cases.length, cases.length === 1 ? cases[0].title : ''), + dispatchToaster + ); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_DELETING, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const dispatchToggleDeleteModal = useCallback(() => { + dispatch({ type: 'DISPLAY_MODAL', payload: !state.isDisplayConfirmDeleteModal }); + }, [state.isDisplayConfirmDeleteModal]); + + const dispatchResetIsDeleted = useCallback(() => { + dispatch({ type: 'RESET_IS_DELETED' }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [state.isDisplayConfirmDeleteModal]); + + const handleOnDeleteConfirm = useCallback( + (cases: DeleteCase[]) => { + dispatchDeleteCases(cases); + dispatchToggleDeleteModal(); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [state.isDisplayConfirmDeleteModal] + ); + const handleToggleModal = useCallback(() => { + dispatchToggleDeleteModal(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [state.isDisplayConfirmDeleteModal]); + + useEffect(() => { + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + }, []); + + return { ...state, dispatchResetIsDeleted, handleOnDeleteConfirm, handleToggleModal }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx b/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx new file mode 100644 index 0000000000000..4c6cbae0c8981 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { initialData, useGetActionLicense, ActionLicenseState } from './use_get_action_license'; +import { actionLicenses } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetActionLicense', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => + useGetActionLicense() + ); + await waitForNextUpdate(); + expect(result.current).toEqual(initialData); + }); + }); + + it('calls getActionLicense with correct arguments', async () => { + const spyOnGetActionLicense = jest.spyOn(api, 'getActionLicense'); + + await act(async () => { + const { waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => + useGetActionLicense() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetActionLicense).toBeCalledWith(abortCtrl.signal); + }); + }); + + it('gets action license', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => + useGetActionLicense() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + actionLicense: actionLicenses[1], + }); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => + useGetActionLicense() + ); + await waitForNextUpdate(); + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnGetActionLicense = jest.spyOn(api, 'getActionLicense'); + spyOnGetActionLicense.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => + useGetActionLicense() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + actionLicense: null, + isLoading: false, + isError: true, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_action_license.tsx b/x-pack/plugins/cases/public/containers/use_get_action_license.tsx new file mode 100644 index 0000000000000..68fd2e2529b64 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_action_license.tsx @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useEffect, useState, useRef } from 'react'; + +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { getActionLicense } from './api'; +import * as i18n from './translations'; +import { ActionLicense } from './types'; + +export interface ActionLicenseState { + actionLicense: ActionLicense | null; + isLoading: boolean; + isError: boolean; +} + +export const initialData: ActionLicenseState = { + actionLicense: null, + isLoading: true, + isError: false, +}; + +const MINIMUM_LICENSE_REQUIRED_CONNECTOR = '.jira'; + +export const useGetActionLicense = (): ActionLicenseState => { + const [actionLicenseState, setActionLicensesState] = useState<ActionLicenseState>(initialData); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const fetchActionLicense = useCallback(async () => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + setActionLicensesState({ + ...initialData, + isLoading: true, + }); + + const response = await getActionLicense(abortCtrlRef.current.signal); + + if (!isCancelledRef.current) { + setActionLicensesState({ + actionLicense: response.find((l) => l.id === MINIMUM_LICENSE_REQUIRED_CONNECTOR) ?? null, + isLoading: false, + isError: false, + }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + + setActionLicensesState({ + actionLicense: null, + isLoading: false, + isError: true, + }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [actionLicenseState]); + + useEffect(() => { + fetchActionLicense(); + + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { ...actionLicenseState }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx new file mode 100644 index 0000000000000..1c8096198007e --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx @@ -0,0 +1,710 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { + getPushedInfo, + initialData, + useGetCaseUserActions, + UseGetCaseUserActions, +} from './use_get_case_user_actions'; +import { + basicCase, + basicPush, + basicPushSnake, + caseUserActions, + elasticUser, + getUserAction, +} from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetCaseUserActions', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => + useGetCaseUserActions(basicCase.id, basicCase.connector.id) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + ...initialData, + fetchCaseUserActions: result.current.fetchCaseUserActions, + }); + }); + }); + + it('calls getCaseUserActions with correct arguments', async () => { + const spyOnPostCase = jest.spyOn(api, 'getCaseUserActions'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => + useGetCaseUserActions(basicCase.id, basicCase.connector.id) + ); + await waitForNextUpdate(); + + result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); + await waitForNextUpdate(); + expect(spyOnPostCase).toBeCalledWith(basicCase.id, abortCtrl.signal); + }); + }); + + it('returns proper state on getCaseUserActions', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => + useGetCaseUserActions(basicCase.id, basicCase.connector.id) + ); + await waitForNextUpdate(); + result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); + await waitForNextUpdate(); + expect(result.current).toEqual({ + ...initialData, + caseUserActions: caseUserActions.slice(1), + fetchCaseUserActions: result.current.fetchCaseUserActions, + hasDataToPush: true, + isError: false, + isLoading: false, + participants: [elasticUser], + }); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => + useGetCaseUserActions(basicCase.id, basicCase.connector.id) + ); + await waitForNextUpdate(); + result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); + + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnPostCase = jest.spyOn(api, 'getCaseUserActions'); + spyOnPostCase.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => + useGetCaseUserActions(basicCase.id, basicCase.connector.id) + ); + await waitForNextUpdate(); + result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); + + expect(result.current).toEqual({ + ...initialData, + isLoading: false, + isError: true, + fetchCaseUserActions: result.current.fetchCaseUserActions, + }); + }); + }); + + describe('getPushedInfo', () => { + it('Correctly marks first/last index - hasDataToPush: false', () => { + const userActions = [...caseUserActions, getUserAction(['pushed'], 'push-to-service')]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Correctly marks first/last index and comment id - hasDataToPush: true', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'create'), + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [userActions[userActions.length - 1].commentId], + hasDataToPush: true, + }, + }, + }); + }); + + it('Correctly marks first/last index and multiple comment ids, both needs push', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'create'), + { ...getUserAction(['comment'], 'create'), commentId: 'muahaha' }, + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [ + userActions[userActions.length - 2].commentId, + userActions[userActions.length - 1].commentId, + ], + hasDataToPush: true, + }, + }, + }); + }); + + it('Correctly marks first/last index and multiple comment ids, one needs push', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'create'), + getUserAction(['pushed'], 'push-to-service'), + { ...getUserAction(['comment'], 'create'), commentId: 'muahaha' }, + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 5, + commentsToUpdate: [userActions[userActions.length - 1].commentId], + hasDataToPush: true, + }, + }, + }); + }); + + it('Correctly marks first/last index and multiple comment ids, one needs push and one needs update', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'create'), + getUserAction(['pushed'], 'push-to-service'), + { ...getUserAction(['comment'], 'create'), commentId: 'muahaha' }, + getUserAction(['comment'], 'update'), + getUserAction(['comment'], 'update'), + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 5, + commentsToUpdate: [ + userActions[userActions.length - 3].commentId, + userActions[userActions.length - 1].commentId, + ], + hasDataToPush: true, + }, + }, + }); + }); + + it('Does not count connector update as a reason to push', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['connector'], 'update'), + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Correctly handles multiple push actions', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'create'), + getUserAction(['pushed'], 'push-to-service'), + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 5, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Correctly handles comment update with multiple push actions', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'create'), + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'update'), + ]; + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 5, + commentsToUpdate: [userActions[userActions.length - 1].commentId], + hasDataToPush: true, + }, + }, + }); + }); + + it('Multiple connector tracking - hasDataToPush: true', () => { + const pushAction123 = getUserAction(['pushed'], 'push-to-service'); + const push456 = { + ...basicPushSnake, + connector_id: '456', + connector_name: 'other connector name', + external_id: 'other_external_id', + }; + + const pushAction456 = { + ...getUserAction(['pushed'], 'push-to-service'), + newValue: JSON.stringify(push456), + }; + + const userActions = [ + ...caseUserActions, + pushAction123, + getUserAction(['comment'], 'create'), + pushAction456, + ]; + + const result = getPushedInfo(userActions, '123'); + + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [userActions[userActions.length - 2].commentId], + hasDataToPush: true, + }, + '456': { + ...basicPush, + connectorId: '456', + connectorName: 'other connector name', + externalId: 'other_external_id', + firstPushIndex: 5, + lastPushIndex: 5, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Multiple connector tracking - hasDataToPush: false', () => { + const pushAction123 = getUserAction(['pushed'], 'push-to-service'); + const push456 = { + ...basicPushSnake, + connector_id: '456', + connector_name: 'other connector name', + external_id: 'other_external_id', + }; + + const pushAction456 = { + ...getUserAction(['pushed'], 'push-to-service'), + newValue: JSON.stringify(push456), + }; + + const userActions = [ + ...caseUserActions, + pushAction123, + getUserAction(['comment'], 'create'), + pushAction456, + ]; + + const result = getPushedInfo(userActions, '456'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [userActions[userActions.length - 2].commentId], + hasDataToPush: true, + }, + '456': { + ...basicPush, + connectorId: '456', + connectorName: 'other connector name', + externalId: 'other_external_id', + firstPushIndex: 5, + lastPushIndex: 5, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Change fields of current connector - hasDataToPush: true', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [], + hasDataToPush: true, + }, + }, + }); + }); + + it('Change current connector - hasDataToPush: true', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Change connector and back - hasDataToPush: true', () => { + const userActions = [ + ...caseUserActions, + getUserAction(['pushed'], 'push-to-service'), + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 3, + lastPushIndex: 3, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Change fields and connector after push - hasDataToPush: true', () => { + const userActions = [ + ...caseUserActions, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + getUserAction(['pushed'], 'push-to-service'), + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 4, + lastPushIndex: 4, + commentsToUpdate: [], + hasDataToPush: true, + }, + }, + }); + }); + + it('Change only connector after push - hasDataToPush: false', () => { + const userActions = [ + ...caseUserActions, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + getUserAction(['pushed'], 'push-to-service'), + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 4, + lastPushIndex: 4, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Change connectors and fields - multiple pushes', () => { + const pushAction123 = getUserAction(['pushed'], 'push-to-service'); + const push456 = { + ...basicPushSnake, + connector_id: '456', + connector_name: 'other connector name', + external_id: 'other_external_id', + }; + + const pushAction456 = { + ...getUserAction(['pushed'], 'push-to-service'), + newValue: JSON.stringify(push456), + }; + + const userActions = [ + ...caseUserActions, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + pushAction123, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + pushAction456, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), + }, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: true, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 4, + lastPushIndex: 4, + commentsToUpdate: [], + hasDataToPush: true, + }, + '456': { + ...basicPush, + connectorId: '456', + connectorName: 'other connector name', + externalId: 'other_external_id', + firstPushIndex: 6, + lastPushIndex: 6, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('pushing other connectors does not count as an update', () => { + const pushAction123 = getUserAction(['pushed'], 'push-to-service'); + const push456 = { + ...basicPushSnake, + connector_id: '456', + connector_name: 'other connector name', + external_id: 'other_external_id', + }; + + const pushAction456 = { + ...getUserAction(['pushed'], 'push-to-service'), + newValue: JSON.stringify(push456), + }; + const userActions = [ + ...caseUserActions, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + pushAction123, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + pushAction456, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 4, + lastPushIndex: 4, + commentsToUpdate: [], + hasDataToPush: false, + }, + '456': { + ...basicPush, + connectorId: '456', + connectorName: 'other connector name', + externalId: 'other_external_id', + firstPushIndex: 6, + lastPushIndex: 6, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + + it('Changing other connectors fields does not count as an update', () => { + const userActions = [ + ...caseUserActions, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), + newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + }, + getUserAction(['pushed'], 'push-to-service'), + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + }, + { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), + newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '3' } }), + }, + ]; + + const result = getPushedInfo(userActions, '123'); + expect(result).toEqual({ + hasDataToPush: false, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 4, + lastPushIndex: 4, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx new file mode 100644 index 0000000000000..ff1835cee7071 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx @@ -0,0 +1,325 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty, uniqBy } from 'lodash/fp'; +import { useCallback, useEffect, useState, useRef } from 'react'; +import deepEqual from 'fast-deep-equal'; + +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { CaseFullExternalService } from '../../common/api/cases'; +import { getCaseUserActions, getSubCaseUserActions } from './api'; +import * as i18n from './translations'; +import { CaseConnector, CaseExternalService, CaseUserActions, ElasticUser } from './types'; +import { convertToCamelCase, parseString } from './utils'; + +export interface CaseService extends CaseExternalService { + firstPushIndex: number; + lastPushIndex: number; + commentsToUpdate: string[]; + hasDataToPush: boolean; +} + +export interface CaseServices { + [key: string]: CaseService; +} + +interface CaseUserActionsState { + caseServices: CaseServices; + caseUserActions: CaseUserActions[]; + hasDataToPush: boolean; + isError: boolean; + isLoading: boolean; + participants: ElasticUser[]; +} + +export const initialData: CaseUserActionsState = { + caseServices: {}, + caseUserActions: [], + hasDataToPush: false, + isError: false, + isLoading: true, + participants: [], +}; + +export interface UseGetCaseUserActions extends CaseUserActionsState { + fetchCaseUserActions: (caseId: string, caseConnectorId: string, subCaseId?: string) => void; +} + +const getExternalService = (value: string): CaseExternalService | null => + convertToCamelCase<CaseFullExternalService, CaseExternalService>(parseString(`${value}`)); + +const groupConnectorFields = ( + userActions: CaseUserActions[] +): Record<string, Array<CaseConnector['fields']>> => + userActions.reduce((acc, mua) => { + if (mua.actionField[0] !== 'connector') { + return acc; + } + + const oldValue = parseString(`${mua.oldValue}`); + const newValue = parseString(`${mua.newValue}`); + + if (oldValue == null || newValue == null) { + return acc; + } + + return { + ...acc, + [oldValue.id]: [ + ...(acc[oldValue.id] || []), + ...(oldValue.id === newValue.id ? [oldValue.fields, newValue.fields] : [oldValue.fields]), + ], + [newValue.id]: [ + ...(acc[newValue.id] || []), + ...(oldValue.id === newValue.id ? [oldValue.fields, newValue.fields] : [newValue.fields]), + ], + }; + }, {} as Record<string, Array<CaseConnector['fields']>>); + +const connectorHasChangedFields = ({ + connectorFieldsBeforePush, + connectorFieldsAfterPush, + connectorId, +}: { + connectorFieldsBeforePush: Record<string, Array<CaseConnector['fields']>> | null; + connectorFieldsAfterPush: Record<string, Array<CaseConnector['fields']>> | null; + connectorId: string; +}): boolean => { + if (connectorFieldsAfterPush == null || connectorFieldsAfterPush[connectorId] == null) { + return false; + } + + const fieldsAfterPush = connectorFieldsAfterPush[connectorId]; + + if (connectorFieldsBeforePush != null && connectorFieldsBeforePush[connectorId] != null) { + const fieldsBeforePush = connectorFieldsBeforePush[connectorId]; + return !deepEqual( + fieldsBeforePush[fieldsBeforePush.length - 1], + fieldsAfterPush[fieldsAfterPush.length - 1] + ); + } + + if (fieldsAfterPush.length >= 2) { + return !deepEqual( + fieldsAfterPush[fieldsAfterPush.length - 2], + fieldsAfterPush[fieldsAfterPush.length - 1] + ); + } + + return false; +}; + +interface CommentsAndIndex { + commentId: string; + commentIndex: number; +} + +export const getPushedInfo = ( + caseUserActions: CaseUserActions[], + caseConnectorId: string +): { + caseServices: CaseServices; + hasDataToPush: boolean; +} => { + const hasDataToPushForConnector = (connectorId: string): boolean => { + const caseUserActionsReversed = [...caseUserActions].reverse(); + const lastPushOfConnectorReversedIndex = caseUserActionsReversed.findIndex( + (mua) => + mua.action === 'push-to-service' && + getExternalService(`${mua.newValue}`)?.connectorId === connectorId + ); + + if (lastPushOfConnectorReversedIndex === -1) { + return true; + } + + const lastPushOfConnectorIndex = + caseUserActionsReversed.length - lastPushOfConnectorReversedIndex - 1; + + const actionsBeforePush = caseUserActions.slice(0, lastPushOfConnectorIndex); + const actionsAfterPush = caseUserActions.slice( + lastPushOfConnectorIndex + 1, + caseUserActionsReversed.length + ); + + const connectorFieldsBeforePush = groupConnectorFields(actionsBeforePush); + const connectorFieldsAfterPush = groupConnectorFields(actionsAfterPush); + + const connectorHasChanged = connectorHasChangedFields({ + connectorFieldsBeforePush, + connectorFieldsAfterPush, + connectorId, + }); + + return ( + actionsAfterPush.some( + (mua) => mua.actionField[0] !== 'connector' && mua.action !== 'push-to-service' + ) || connectorHasChanged + ); + }; + + const commentsAndIndex = caseUserActions.reduce<CommentsAndIndex[]>( + (bacc, mua, index) => + mua.actionField[0] === 'comment' && mua.commentId != null + ? [ + ...bacc, + { + commentId: mua.commentId, + commentIndex: index, + }, + ] + : bacc, + [] + ); + + let caseServices = caseUserActions.reduce<CaseServices>((acc, cua, i) => { + if (cua.action !== 'push-to-service') { + return acc; + } + + const externalService = getExternalService(`${cua.newValue}`); + if (externalService === null) { + return acc; + } + + return { + ...acc, + ...(acc[externalService.connectorId] != null + ? { + [externalService.connectorId]: { + ...acc[externalService.connectorId], + ...externalService, + lastPushIndex: i, + commentsToUpdate: [], + }, + } + : { + [externalService.connectorId]: { + ...externalService, + firstPushIndex: i, + lastPushIndex: i, + hasDataToPush: hasDataToPushForConnector(externalService.connectorId), + commentsToUpdate: [], + }, + }), + }; + }, {}); + + caseServices = Object.keys(caseServices).reduce<CaseServices>((acc, key) => { + return { + ...acc, + [key]: { + ...caseServices[key], + // if the comment happens after the lastUpdateToCaseIndex, it should be included in commentsToUpdate + commentsToUpdate: commentsAndIndex.reduce<string[]>( + (bacc, currentComment) => + currentComment.commentIndex > caseServices[key].lastPushIndex + ? bacc.indexOf(currentComment.commentId) > -1 + ? [...bacc.filter((e) => e !== currentComment.commentId), currentComment.commentId] + : [...bacc, currentComment.commentId] + : bacc, + [] + ), + }, + }; + }, {}); + + const hasDataToPush = + caseServices[caseConnectorId] != null ? caseServices[caseConnectorId].hasDataToPush : true; + return { + hasDataToPush, + caseServices, + }; +}; + +export const useGetCaseUserActions = ( + caseId: string, + caseConnectorId: string, + subCaseId?: string +): UseGetCaseUserActions => { + const [caseUserActionsState, setCaseUserActionsState] = useState<CaseUserActionsState>( + initialData + ); + const abortCtrlRef = useRef(new AbortController()); + const isCancelledRef = useRef(false); + const [, dispatchToaster] = useStateToaster(); + + const fetchCaseUserActions = useCallback( + async (thisCaseId: string, thisCaseConnectorId: string, thisSubCaseId?: string) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + setCaseUserActionsState({ + ...caseUserActionsState, + isLoading: true, + }); + + const response = await (thisSubCaseId + ? getSubCaseUserActions(thisCaseId, thisSubCaseId, abortCtrlRef.current.signal) + : getCaseUserActions(thisCaseId, abortCtrlRef.current.signal)); + + if (!isCancelledRef.current) { + // Attention Future developer + // We are removing the first item because it will always be the creation of the case + // and we do not want it to simplify our life + const participants = !isEmpty(response) + ? uniqBy('actionBy.username', response).map((cau) => cau.actionBy) + : []; + + const caseUserActions = !isEmpty(response) + ? thisSubCaseId + ? response + : response.slice(1) + : []; + + setCaseUserActionsState({ + caseUserActions, + ...getPushedInfo(caseUserActions, thisCaseConnectorId), + isLoading: false, + isError: false, + participants, + }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + + setCaseUserActionsState({ + caseServices: {}, + caseUserActions: [], + hasDataToPush: false, + isError: true, + isLoading: false, + participants: [], + }); + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [caseUserActionsState] + ); + + useEffect(() => { + if (!isEmpty(caseId)) { + fetchCaseUserActions(caseId, caseConnectorId, subCaseId); + } + + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [caseId, subCaseId]); + return { ...caseUserActionsState, fetchCaseUserActions }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx new file mode 100644 index 0000000000000..30714a2d8d938 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useGetCasesStatus, UseGetCasesStatus } from './use_get_cases_status'; +import { casesStatus } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetCasesStatus', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => + useGetCasesStatus() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + countClosedCases: null, + countOpenCases: null, + countInProgressCases: null, + isLoading: true, + isError: false, + fetchCasesStatus: result.current.fetchCasesStatus, + }); + }); + }); + + it('calls getCasesStatus api', async () => { + const spyOnGetCasesStatus = jest.spyOn(api, 'getCasesStatus'); + await act(async () => { + const { waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => + useGetCasesStatus() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetCasesStatus).toBeCalledWith(abortCtrl.signal); + }); + }); + + it('fetch reporters', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => + useGetCasesStatus() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + countClosedCases: casesStatus.countClosedCases, + countOpenCases: casesStatus.countOpenCases, + countInProgressCases: casesStatus.countInProgressCases, + isLoading: false, + isError: false, + fetchCasesStatus: result.current.fetchCasesStatus, + }); + }); + }); + + it('unhappy path', async () => { + const spyOnGetCasesStatus = jest.spyOn(api, 'getCasesStatus'); + spyOnGetCasesStatus.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => + useGetCasesStatus() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + countClosedCases: 0, + countOpenCases: 0, + countInProgressCases: 0, + isLoading: false, + isError: true, + fetchCasesStatus: result.current.fetchCasesStatus, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx b/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx new file mode 100644 index 0000000000000..03eae135671a2 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useEffect, useState, useRef } from 'react'; + +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { getCasesStatus } from './api'; +import * as i18n from './translations'; +import { CasesStatus } from './types'; + +interface CasesStatusState extends CasesStatus { + isLoading: boolean; + isError: boolean; +} + +const initialData: CasesStatusState = { + countClosedCases: null, + countInProgressCases: null, + countOpenCases: null, + isLoading: true, + isError: false, +}; + +export interface UseGetCasesStatus extends CasesStatusState { + fetchCasesStatus: () => void; +} + +export const useGetCasesStatus = (): UseGetCasesStatus => { + const [casesStatusState, setCasesStatusState] = useState<CasesStatusState>(initialData); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const fetchCasesStatus = useCallback(async () => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + setCasesStatusState({ + ...initialData, + isLoading: true, + }); + + const response = await getCasesStatus(abortCtrlRef.current.signal); + + if (!isCancelledRef.current) { + setCasesStatusState({ + ...response, + isLoading: false, + isError: false, + }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + setCasesStatusState({ + countClosedCases: 0, + countInProgressCases: 0, + countOpenCases: 0, + isLoading: false, + isError: true, + }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + fetchCasesStatus(); + + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { + ...casesStatusState, + fetchCasesStatus, + }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx b/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx new file mode 100644 index 0000000000000..ff1c5a3eb4de7 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useGetReporters, UseGetReporters } from './use_get_reporters'; +import { reporters, respReporters } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetReporters', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => + useGetReporters() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + reporters: [], + respReporters: [], + isLoading: true, + isError: false, + fetchReporters: result.current.fetchReporters, + }); + }); + }); + + it('calls getReporters api', async () => { + const spyOnGetReporters = jest.spyOn(api, 'getReporters'); + await act(async () => { + const { waitForNextUpdate } = renderHook<string, UseGetReporters>(() => useGetReporters()); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetReporters).toBeCalledWith(abortCtrl.signal); + }); + }); + + it('fetch reporters', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => + useGetReporters() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + reporters, + respReporters, + isLoading: false, + isError: false, + fetchReporters: result.current.fetchReporters, + }); + }); + }); + + it('refetch reporters', async () => { + const spyOnGetReporters = jest.spyOn(api, 'getReporters'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => + useGetReporters() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchReporters(); + expect(spyOnGetReporters).toHaveBeenCalledTimes(2); + }); + }); + + it('unhappy path', async () => { + const spyOnGetReporters = jest.spyOn(api, 'getReporters'); + spyOnGetReporters.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => + useGetReporters() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + reporters: [], + respReporters: [], + isLoading: false, + isError: true, + fetchReporters: result.current.fetchReporters, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_reporters.tsx b/x-pack/plugins/cases/public/containers/use_get_reporters.tsx new file mode 100644 index 0000000000000..01604d876fd61 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_reporters.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useEffect, useState, useRef } from 'react'; +import { isEmpty } from 'lodash/fp'; + +import { User } from '../../common'; +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { getReporters } from './api'; +import * as i18n from './translations'; + +interface ReportersState { + reporters: string[]; + respReporters: User[]; + isLoading: boolean; + isError: boolean; +} + +const initialData: ReportersState = { + reporters: [], + respReporters: [], + isLoading: true, + isError: false, +}; + +export interface UseGetReporters extends ReportersState { + fetchReporters: () => void; +} + +export const useGetReporters = (): UseGetReporters => { + const [reportersState, setReporterState] = useState<ReportersState>(initialData); + + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const fetchReporters = useCallback(async () => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + setReporterState({ + ...reportersState, + isLoading: true, + }); + + const response = await getReporters(abortCtrlRef.current.signal); + const myReporters = response + .map((r) => (r.full_name == null || isEmpty(r.full_name) ? r.username ?? '' : r.full_name)) + .filter((u) => !isEmpty(u)); + + if (!isCancelledRef.current) { + setReporterState({ + reporters: myReporters, + respReporters: response, + isLoading: false, + isError: false, + }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + + setReporterState({ + reporters: [], + respReporters: [], + isLoading: false, + isError: true, + }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [reportersState]); + + useEffect(() => { + fetchReporters(); + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return { ...reportersState, fetchReporters }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_messages_storage.test.tsx b/x-pack/plugins/cases/public/containers/use_messages_storage.test.tsx new file mode 100644 index 0000000000000..73bfc49f077ae --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_messages_storage.test.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useMessagesStorage, UseMessagesStorage } from './use_messages_storage'; + +describe('useLocalStorage', () => { + beforeEach(() => { + localStorage.clear(); + }); + afterEach(() => { + localStorage.clear(); + }); + + it('should return an empty array when there is no messages', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseMessagesStorage>(() => + useMessagesStorage() + ); + await waitForNextUpdate(); + const { getMessages } = result.current; + expect(getMessages('case')).toEqual([]); + }); + }); + + it('should add a message', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseMessagesStorage>(() => + useMessagesStorage() + ); + await waitForNextUpdate(); + const { getMessages, addMessage } = result.current; + addMessage('case', 'id-1'); + expect(getMessages('case')).toEqual(['id-1']); + }); + }); + + it('should add multiple messages', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseMessagesStorage>(() => + useMessagesStorage() + ); + await waitForNextUpdate(); + const { getMessages, addMessage } = result.current; + addMessage('case', 'id-1'); + addMessage('case', 'id-2'); + expect(getMessages('case')).toEqual(['id-1', 'id-2']); + }); + }); + + it('should remove a message', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseMessagesStorage>(() => + useMessagesStorage() + ); + await waitForNextUpdate(); + const { getMessages, addMessage, removeMessage } = result.current; + addMessage('case', 'id-1'); + addMessage('case', 'id-2'); + removeMessage('case', 'id-2'); + expect(getMessages('case')).toEqual(['id-1']); + }); + }); + + it('should return presence of a message', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseMessagesStorage>(() => + useMessagesStorage() + ); + await waitForNextUpdate(); + const { hasMessage, addMessage, removeMessage } = result.current; + addMessage('case', 'id-1'); + addMessage('case', 'id-2'); + removeMessage('case', 'id-2'); + expect(hasMessage('case', 'id-1')).toEqual(true); + expect(hasMessage('case', 'id-2')).toEqual(false); + }); + }); + + it('should clear all messages', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseMessagesStorage>(() => + useMessagesStorage() + ); + await waitForNextUpdate(); + const { getMessages, addMessage, clearAllMessages } = result.current; + addMessage('case', 'id-1'); + addMessage('case', 'id-2'); + clearAllMessages('case'); + expect(getMessages('case')).toEqual([]); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_messages_storage.tsx b/x-pack/plugins/cases/public/containers/use_messages_storage.tsx new file mode 100644 index 0000000000000..c7eed3cbd881b --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_messages_storage.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useMemo } from 'react'; +import { Storage } from '../../../../../src/plugins/kibana_utils/public'; + +export interface UseMessagesStorage { + getMessages: (plugin: string) => string[]; + addMessage: (plugin: string, id: string) => void; + removeMessage: (plugin: string, id: string) => void; + clearAllMessages: (plugin: string) => void; + hasMessage: (plugin: string, id: string) => boolean; +} + +// TODO: Removed const { storage } = useKibana().services; in favor of using the util directly +export const useMessagesStorage = (): UseMessagesStorage => { + const storage = useMemo(() => new Storage(localStorage), []); + + const getMessages = useCallback( + (plugin: string): string[] => storage.get(`${plugin}-messages`) ?? [], + [storage] + ); + + const addMessage = useCallback( + (plugin: string, id: string) => { + const pluginStorage = storage.get(`${plugin}-messages`) ?? []; + storage.set(`${plugin}-messages`, [...pluginStorage, id]); + }, + [storage] + ); + + const hasMessage = useCallback( + (plugin: string, id: string): boolean => { + const pluginStorage = storage.get(`${plugin}-messages`) ?? []; + return pluginStorage.filter((val: string) => val === id).length > 0; + }, + [storage] + ); + + const removeMessage = useCallback( + (plugin: string, id: string) => { + const pluginStorage = storage.get(`${plugin}-messages`) ?? []; + storage.set(`${plugin}-messages`, [...pluginStorage.filter((val: string) => val !== id)]); + }, + [storage] + ); + + const clearAllMessages = useCallback( + (plugin: string): string[] => storage.remove(`${plugin}-messages`), + [storage] + ); + + return { + getMessages, + addMessage, + clearAllMessages, + removeMessage, + hasMessage, + }; +}; diff --git a/x-pack/plugins/cases/public/get_all_cases.tsx b/x-pack/plugins/cases/public/get_all_cases.tsx new file mode 100644 index 0000000000000..7e840909a5648 --- /dev/null +++ b/x-pack/plugins/cases/public/get_all_cases.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLoadingSpinner } from '@elastic/eui'; +import React, { lazy, Suspense } from 'react'; +import { AllCasesProps } from './components/all_cases'; + +export const getAllCasesLazy = (props: AllCasesProps) => { + const AllCasesLazy = lazy(() => import('./components/all_cases')); + return ( + <Suspense fallback={<EuiLoadingSpinner />}> + <AllCasesLazy {...props} /> + </Suspense> + ); +}; diff --git a/x-pack/plugins/cases/public/index.tsx b/x-pack/plugins/cases/public/index.tsx index 1cf2d2e8d7067..e8589152b7ca8 100644 --- a/x-pack/plugins/cases/public/index.tsx +++ b/x-pack/plugins/cases/public/index.tsx @@ -6,11 +6,8 @@ */ import { PluginInitializerContext } from 'kibana/public'; -import React from 'react'; import { CasesUiPlugin } from './plugin'; -export const TestComponent = () => <div>{'Hello from cases plugin!'}</div>; - export function plugin(initializerContext: PluginInitializerContext) { return new CasesUiPlugin(initializerContext); } diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index c594e8677a086..1ee37e57f396f 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -6,9 +6,9 @@ */ import { CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; -import { TestComponent } from '.'; import { CasesUiStart, SetupPlugins, StartPlugins } from './types'; import { getCreateCaseLazy } from './get_create_case'; +import { getAllCasesLazy } from './get_all_cases'; import { KibanaServices } from './common/lib/kibana'; export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { @@ -22,10 +22,12 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S public start(core: CoreStart, plugins: StartPlugins): CasesUiStart { KibanaServices.init({ ...core, ...plugins, kibanaVersion: this.kibanaVersion }); return { - casesComponent: TestComponent, getCreateCase: (props) => { return getCreateCaseLazy(props); }, + getAllCases: (props) => { + return getAllCasesLazy(props); + }, }; } diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index 07a0b2c723914..8d9e89609c5fa 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -7,13 +7,16 @@ import { CoreStart } from 'kibana/public'; import { ReactElement } from 'react'; +import { SecurityPluginSetup } from '../../security/public'; import { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; +import { AllCasesProps } from './components/all_cases'; import { CreateCaseProps } from './components/create'; export interface SetupPlugins { + security: SecurityPluginSetup; triggersActionsUi: TriggersActionsSetup; } @@ -21,9 +24,18 @@ export interface StartPlugins { triggersActionsUi: TriggersActionsStart; } -export type StartServices = CoreStart & StartPlugins; +/** + * TODO: The extra security service is one that should be implemented in the kibana context of the consuming application. + * Security is needed for access to authc for the `useCurrentUser` hook. Security_Solution currently passes it via renderApp in public/plugin.tsx + * Leaving it out currently in lieu of RBAC changes + */ + +export type StartServices = CoreStart & + StartPlugins & { + security: SecurityPluginSetup; + }; export interface CasesUiStart { - casesComponent: () => JSX.Element; + getAllCases: (props: AllCasesProps) => ReactElement<AllCasesProps>; getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; } diff --git a/x-pack/plugins/cases/public/utils/use_mount_appended.ts b/x-pack/plugins/cases/public/utils/use_mount_appended.ts new file mode 100644 index 0000000000000..59c0c897e623f --- /dev/null +++ b/x-pack/plugins/cases/public/utils/use_mount_appended.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mount } from 'enzyme'; + +type WrapperOf<F extends (...args: any) => any> = (...args: Parameters<F>) => ReturnType<F>; +export type MountAppended = WrapperOf<typeof mount>; + +export const useMountAppended = () => { + let root: HTMLElement; + + beforeEach(() => { + root = document.createElement('div'); + root.id = 'root'; + document.body.appendChild(root); + }); + + afterEach(() => { + document.body.removeChild(root); + }); + + const mountAppended: MountAppended = (node, options) => + mount(node, { ...options, attachTo: root }); + + return mountAppended; +}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index a0820486f423f..941793084fd37 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -20,6 +20,7 @@ import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/t import { isEmpty, memoize } from 'lodash/fp'; import styled, { css } from 'styled-components'; import classnames from 'classnames'; +import { useHistory } from 'react-router-dom'; import * as i18n from './translations'; import { CaseStatuses, CaseType } from '../../../../../cases/common'; @@ -37,7 +38,12 @@ import { UtilityBarSection, UtilityBarText, } from '../../../common/components/utility_bar'; -import { getCreateCaseUrl, useFormatUrl } from '../../../common/components/link_to'; +import { + getCaseDetailsUrl, + getConfigureCasesUrl, + getCreateCaseUrl, + useFormatUrl, +} from '../../../common/components/link_to'; import { getBulkItems } from '../bulk_actions'; import { CaseHeaderPage } from '../case_header_page'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; @@ -52,12 +58,18 @@ import { ERROR_PUSH_SERVICE_CALLOUT_TITLE } from '../use_push_to_service/transla import { LinkButton } from '../../../common/components/links'; import { SecurityPageName } from '../../../app/types'; import { useKibana } from '../../../common/lib/kibana'; -import { APP_ID } from '../../../../common/constants'; +import { APP_ID, USE_RAC_CASES_UI } from '../../../../common/constants'; import { Stats } from '../status'; import { SELECTABLE_MESSAGE_COLLECTIONS } from '../../translations'; import { getExpandedRowMap } from './expanded_row'; import { isSelectedCasesIncludeCollections } from './helpers'; +interface AllCasesNavProps { + detailName: string; + search?: string; + subCaseId?: string; +} + const Div = styled.div` margin-top: ${({ theme }) => theme.eui.paddingSizes.m}; `; @@ -124,6 +136,8 @@ interface AllCasesProps { } export const AllCases = React.memo<AllCasesProps>( ({ onRowClick, isModal = false, userCanCrud, disabledStatuses, disabledCases = [] }) => { + const { cases: casesUi } = useKibana().services; + const history = useHistory(); const { navigateToApp } = useKibana().services.application; const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.case); const { actionLicense } = useGetActionLicense(); @@ -414,7 +428,35 @@ export const AllCases = React.memo<AllCasesProps>( const enableBuckActions = userCanCrud && !isModal; - return ( + const goToCaseConfigure = useCallback( + (ev) => { + ev.preventDefault(); + history.push(getConfigureCasesUrl(urlSearch)); + }, + [history, urlSearch] + ); + + return USE_RAC_CASES_UI ? ( + casesUi.getAllCases({ + configureCasesHref: formatUrl(getConfigureCasesUrl()), + createCaseHref: formatUrl(getCreateCaseUrl()), + getCaseDetailsHref: ({ detailName, subCaseId }: AllCasesNavProps) => { + return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + }, + onCaseDetailsNavClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), + }); + }, + onConfigureCasesNavClick: goToCaseConfigure, + disabledCases, + disabledStatuses, + isModal, + onCreateCaseNavClick: goToCreateCase, + onRowClick, + userCanCrud, + }) + ) : ( <> {!isEmpty(actionsErrors) && ( <CaseCallOut title={ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={actionsErrors} /> diff --git a/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.tsx b/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.tsx index e3f78cee0faae..ab8e7cf97d34c 100644 --- a/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/local_storage/use_messages_storage.tsx @@ -6,7 +6,7 @@ */ import { useCallback } from 'react'; -import { useKibana } from '../../lib/kibana'; +import { useKibana } from '../../../common/lib/kibana'; export interface UseMessagesStorage { getMessages: (plugin: string) => string[]; From 0d28c5a83dd5de552ca4c9e2e5afef05e492ffc7 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 22 Mar 2021 09:35:08 -0700 Subject: [PATCH 26/52] [DOCS] Adds docs for search sessions (#94661) * [DOCS] Adds docs for search sessions * [DOCS] Improves intro and title for search sessions doc * [DOCS] Fixes bulleted list * [DOCS] Makes doc title more descriptive * [DOCS] Incorporates review comments * [DOCS] Includes a better explanation of restore action * [DOCS] Changed titled and fixed setting names * [DOCS] Verified content about maps and restored session * [DOCS] Fixes setting names * [DOCS] Changes order of last two steps Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../discover/images/search-session-awhile.png | Bin 0 -> 75159 bytes docs/discover/images/search-session.png | Bin 0 -> 801799 bytes docs/discover/images/search-sessions-menu.png | Bin 0 -> 180466 bytes docs/discover/search-sessions.asciidoc | 72 ++++++++++++++++++ docs/discover/search.asciidoc | 37 ++++----- .../search-sessions-settings.asciidoc | 25 ++++++ docs/setup/settings.asciidoc | 3 +- docs/user/management.asciidoc | 6 ++ 8 files changed, 118 insertions(+), 25 deletions(-) create mode 100644 docs/discover/images/search-session-awhile.png create mode 100644 docs/discover/images/search-session.png create mode 100644 docs/discover/images/search-sessions-menu.png create mode 100644 docs/discover/search-sessions.asciidoc create mode 100644 docs/settings/search-sessions-settings.asciidoc diff --git a/docs/discover/images/search-session-awhile.png b/docs/discover/images/search-session-awhile.png new file mode 100644 index 0000000000000000000000000000000000000000..a2dba24571e124a8563378e8999796b0b878e9a1 GIT binary patch literal 75159 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%0D<%Z6&Y_uFBoTAmZ^*U3hy-^>eW)R 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 Z`W?(7(usx9lD0`?WH3E5XdM_C`+qJa0mT3S literal 0 HcmV?d00001 diff --git a/docs/discover/images/search-session.png b/docs/discover/images/search-session.png new file mode 100644 index 0000000000000000000000000000000000000000..4acd9cbee868a07dc0f2406a19b47f4cfdc358f0 GIT binary patch literal 801799 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 <9m&ytaZK<9@Xbth@zA+ViwD52BHTQ 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.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�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 `*xaMDxcw+U0=@-VhO}tkJl6j+ul}M!3sHOcK8{ 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%0Dfag!Ufm#t`v;@#caX(8 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�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%0DyCl%+k_-z*7eH}jG$HxEimcz< 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%0D9dR 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�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:$-ixI05q_2VR;XTv$l<az*#m7~dbzRdG;lRjtQHHs=6!vDot z1{}LxfaR)1AC^i2+T<7S#Cf6*m6m1dsCNBx-(5dv=@_Xr1r4V64yH4tMjv))jLvbX z#Zs(x@y-mj;S;&~H^>m^6&Q0m9C0WcgN8uQ&jLcf_jg9;{Ga`Z-J*rnz00i68_=P} zQK>uNXXmbl7jMok$E3jhxX7KAgY$9E=s|6m72i}tBqXrx&QhL7UAPVMMtj8Lj$N*~ zEE$1ELdLOI^8TqA-C$auYe<<hq&<f|yBiWWBH=#mex38C+L(fLq50sWl^qs>@qMd4 z`*m8#XX<GkxpOLBFWI@r4I2Mzy~?T#=;}z1ZG)UwkOT^=cRtmJ&RSA97d%LT3$4{x zl6_8hCQ{c$jQ>qR@=a|XpE=f){eO29-uW4jK7-Rl^nG5Rj6nVmT}mS&dJ6~coJtL3 z!f^+k0z%zMw=&0>dT9ss0+mV1X&DP&%;}XFvi&+{ugey?NI)CLtot9CeVd@OPii|- z)p$HN{9OJmFJyG&f7sPaDJLSbAlK*l==uNtn>b{m;1-=oJh@5s!T}-}LBTjdKl_r> ze<i}1eaZdn{l%b8^_B#Bul2Q6BHkoQY5RrT&9W-*mz>0BrN64uX4j~_sy(cq)Z*$B zhK6RK2M>Oi1lXQUf(3V$qn1sN@)eePKgRHA^#<2+WJc3Z{kq;VFK~Hoe42crdzmo5 z-+qv&Le8?Nwpl;5>hsi>vWM}7m-KC!nS02~ujTzv18@rWO?r1u4EoE1!5$0Mgu$Vu z&pz~824vY~3sN3>V-d?JzPRZ@$YI=+-&5yOEXTmjodrXmNc&1*b=*}%4mj=ni?jN9 zu@N}UvH_i=_~x$Q`WLe@XaQsyb!WKRt?k~T{jh4E**)r0%5>vtbK!o`v01IYGw$wB zYn_~1ofKOJsZW87Ude#K#*c;FpjZq5f{DO6=RUAhu~huORZ*0p!E#v*BMU#eoMmdJ zJ}Q7cx(o*6t#<oxEE`O|+l9r(3{(%bD#Zcils*unS0Kx^4(OH@zs=lV6yajuc5^yL z?60#{K`7FHx{Vk#2!iAnCi7=orJ4Xrve<yO+{O=rP9kN*SLnFELg6ADJ)Q{O)QA5K zrww}YlCZ);N?tqCLBg@3Vv7A=VerdK-_=`kNE)Lfu!tqrh>E6xN%aGFchn=l-jRg- zD5O>3Mf{JT(GC|=1zU8e{g_KxB(S4>Rs1MC1up*;G@pZd6QD!4dHs`$v?t<A$<XJP z_uM3))HBqZ5C3-(Pe+gWJjhB<-*5^RwoH;R<W5P!SbTrL%O|MN&i0s?YTkFqmpU{w zI+((Y3QwF6|79obKVRSZUtL{$G#h3VZx9hJIq0^u(gbOhRUNOU9!boblcs7YU0D%I zx_GqBL_Df2MXU9wGH(e{l!FzE_nY)VXy^`8^=_CVS!g0OmYr@py8F-l@1AqN-*@l* z&ON{HUV}{)mb@%Sz@3%tPY#2gCPE_0OB+**t6$i>SOcs#$9OcgNTO<kMU~<VJiQx< z2OJ4<EeOmyL^syWrWOt|wU?kIb1avnb`<g7S@4V8=#0)+QUPKQu|(ALXrn7zmYn9V z^&+vCm9SFM^#u`u^!U60CztjxqHtdRStyHBghI!q=o^g%+;|*wFm!&JxfNtDOex;s ziB`?MF5Scw)L~QcZ4+W)HX`npwJ<HGAwxLcIz+)-DW(+M>fA*zc~zkuQ>_j{Ax|2` zqR!wYAcktE6!NWaY*DX3>gHD~Enc1UInz2u#*TzYmRsWCX%H0f>Y6FoEFgCJ@6os9 zMI1VAw<io&>AU}4_2CniDR(&)a|0_4lb4|nG%$OS_o6Ju=z(0>D0>*e$E5@Lzqi1r z0FSXx=oiT<+gA2QyZcO8jUDRqJ~l)L7?u@5zV>>|k6B$ezGnL`v0}gWh5;X{1MiLy zL1s4$!EC5{n&}<>8b-sjw_|@A*+`XpzLDo}QA>X=*AVP9{zL|@jy|*$w2uq-4<pV2 zP-mksswZ@EsdvjQi${4$_y+q*wAO`L?XvDh8nUfsC3cf(h07qKjI~)4lRXLDcE2$g zt)Dv~3l&wM?#ZU=5ejN*H;c3${DOEN+geds=1~(gc3quf(*H_CiHyv#>T)M0f-066 zy88{Js{-d|jDL68nlW+#JE_@32AP<coIZ7GOi@uWluX`y#lVLU_o4CWA7nR%*)0|~ zZ+-Y6h${-S$Xns`m1Tt~gpX519=2_IR>+qFE32y%dfDEEu4GT}XN*7v<u_-Qm8=h^ z>7k90riN3wk0Ly(-roMv->r5lQpKC%)%C@f_)Aw6uh>NwU)XkDKt3<QowjFL&<J$9 z*`JJ5d(pDxgGLY<RclDzA0Bm_2QcpJ%#0f)#_!#J@Br^kBr*ncM`7HbS=hqu0h5gA zM~z6tYxO7tgT<XTO3Lc@oP$0nH|vM%it%sGnhT~ytQ`%GJYEi>0B^Q}JD)QbICL1Q z-^4XTfV=JRkogI1zGLB`^ux#ccW8R5xzX4JlvDg39sj4V`*-<l);XPFap0~QK)*G; zSWpEnfWn$Od$cu+au<uqSiNsR%44+kktR>gg%WH^ukolh-v$cuhl{cA03L$TVZ!sH zX$h(ckX~~oVYkQ(GBJMm33okf@?&Op>Con(Q~F=mx0l+AREiP?N|`j|2iS=@J*z+5 zD?M>XpLWF$IVOR`e(Aij7R;IE@QBTZ>GnGI9J<pGOjaT*p(EJnSrYpAyDZSEk2C1m zo$AZx5VH7(1pqYW9;&?B7s7ARvir!>WQW%1j#QoX_P;Nws3=Fi&gCQ#wQW<WjVC*U z@^chm>=qvB8S}{1KvL|rp+QF{QWO;PUcc(1>m|!%s8xfcJiR|XC(~|nA@*&s8WJXd zOb$W2E(2*J5)LIuhyA6;RM_7ncZ2+4H0tb5J}AH<XOJQcG%OjqtJSoe_#XBW_mbru z_G{460X0iw0|Y^m+w;}#@ey4%0cFAsw(E=5b<TvWhs+|a36F+{ecpYXaF%(ZgyxS5 z4io@~K<@7MXMO?k(2j9jjV-Dlhs|(RMTPe0aQn7Jw#oX-;b2L!&>ZpB)N;{w%4Kjm zDhZFN=jDy7@WTVfxf4c3^O{a<F*T{&b$K!czZ6*ClTX;D5_9rSSR2(OSv(eo3ikje WyF9E{IcMpBOk5n!+t=FqCH@8G_b2ZF literal 0 HcmV?d00001 diff --git a/docs/discover/images/search-sessions-menu.png b/docs/discover/images/search-sessions-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..41181d17de519489a77263059232bebd1d835268 GIT binary patch literal 180466 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�n)b9YxVxf*KzcqmjeT5 zJ=wWE?P$9tL-+RPjB`iQ?8_rEF+SFY+4jY?@slDZdet<(H>5FA&pKXZPha~=NHQo9 zChur6DMb*nJiAi`h5k>={j)97qsK7U!01Hcd3_GNGFu0X*XU+9;;p!8UAZ<4?p0hQ z1!Lg;-tT5a|HTB#$BNz@N#`^+*=H2Nc*|#axj&n?Z0M}8p+uA`{L+F!8eC%oQK}+$ zj$7-!J8x|!g)%DcjOU9rjD7qcZ3J1`S1ZiV@|7*AGXsmR0v-=sUr5q#6Fm+J`Y_Sn zVjY|n^1Z?c%*GGOdl5Tg+&qw?-pjb1zI=HiFn*Cgg6)fs+0lq<@S+4X_RE~}7s5Ow zU+uuayrJgrUBF;A{goJk!u6J6EUWJ@xFsZ~!xFOEVOilbnM7wn)}Q+QhP%RRDZ$u@ zB|&k#z*+~)cIC6W^t3S!$uwieqxQh>{zr(%1G|&<{zu;?R2j-}<gU)P;>CPU6)qk0 zH)g1V`bIKaN+sv(9h2ou0}e#PoG9QswnchX(x2c}XsA_0jT&eGPOl@NHq+VJc+o}# z5j*YG=>~7msnVfQ)B41YX0;!TYPLNf{K95(chdEE<wb}2dXt)ZI?Ghn`C@ofa($<2 z{$N-D{^oEhOLqiOTdniwlE0T9ngLWYRx%#9TowI#UL88YR`HnHGUEvxy6)Xqp7JOU z!aF<eB1)G7^>_-E*=Kq4JRK|;TyUNUDP<ffmzM9Y_s5?qlnAs-<uFDa#oA;ADxGc) z6Rgb`umIP?sRs=aOBajDKp%gfndbm78#n0uQWTNDJdfy#NM!e`aSvP-ZbH->b{!JT ze1Wp6rHRR1w_nvC)jCvM9=>=id2Y7CWx~k|hV(?ot3jIB^cRgw3LXUoRnjZQt@E^4 zIAQ%QZUZ-B+sfsBH+4u*Cw9Wae@$;AQe@5gJYO|lI$~XkNp6_B%rY;BzRdf45rSpa zUi7XO2pL=9KG-Ep#409M8I1t+-ik0dt6ydxFv`qn#a%Q{Ol6N_@G3NyXku2xVxT`O zc^4K%wGB%wo%j6N{4@E8jY0LOFIkT>dG8ttW5%qGnQghYGrh39mlTJ|y!y`|l5BF3 zgqI74)1;cm%zl>+)s`o;im7oOc{dcZ#G+s}cF_5-;IhGFe``W5jw%TOU$IVE@wD}F z`>W&aNeSooW$rbg?+z?R-##A+IkdWC6sV<h$b{i1TL5D81;;AQ1AI<D*2jtPe>_%( z8E*_c{X5I@E6W%2T%9A1q^K4MM!0(fA0B=pe?=^x_+dPTq1EoGn|3T;3SadaB{s2$ z2<Y6o>8zWRuBmoK;=*~D9j47e(|wlz__7LQg=71TX_R9<D4nX`Cuqh+_HYlby>d$L zoMdk)58M6jLHw)`1)Tfys$JG!n+&Hp#~TPiw0IoQ#@rooLmaDiGI%_iYlD8VKxCG@ z%NoRvI}us)+p<X2sB5tD%{;fD+I54KBvI!pDUbKNJcXwnK0!fCt@^u@&h))8cRM10 zHeV0R?G>02!u`Ls43k^lg@y7t<mKert6Y2?QB_hv;}thBnj09#%I~V&a9#M6pZJ;2 zJ#RJFwxJO{8g=@3UtDlNW)de={|Tyis|gU5eM!Vr%J#e_F;5Hp2wUwK*3YYPxwG^A ztdx3!tI@$!$o#To&MN8V3I;4`dDGN7zV_gV;ypqriL)HZfXF@SqZ)fFx{4x*i1_@Q ztizcXOKVt|&&4cLZ1WRFlUOw6_1n+Mn|6y!qy?*@UuB?|=XH*a=MUy7@_Lz7C~YX6 zo&f0ReNNY1cpiz{UPUC1e{(q-b+Qk*UC`I4wS5Y4bpLPtNy)kI!amt~rdxzYp~9x& z-+5f{DO8Q?HJhVND4!4DP!1nz)9ofkBVANo*`;QxaAKjVF#h_x%W#KTSolrjnF7eS zxbrfM@%7~30@J|&p~4WDE&w2KD8g!5zQn#$p~wJB=^U%GR+2IJg$$V`G%iywm%z8O zgYqnk42=?%l@gdacneeo%tI~PdwV@Cl9QYJzrC?A3dbXxF(niDwzXS`25x+4qzKMU zdfbq7bw<*hqVv-5rLfy3=%Tk!rf}MBddawGA50AEC$H!r%gzxd{#(IEK4`Q=mo9u$ zW7;V0o~IpIkV-R_B@^_K!yZ~R<!Y@$ccBVm;yN&}onhuOkyfc7CKEC^)uCK|4gKK( z&l~J53D&kapSu=wubJS5mX4K+fqzm7HJ>iUD&IvT-I70!a?}#FE=JPIMW0`cVQC-@ z1Kl8hQO~0#x`xD(ZL$K@^r`W-dFApzktZJ_I}-_oST#!DvvJKJH|W#1$y;mEBx~Fa z3kD`gV`{R>wCb&#)lx=kw8VewCIJs>uUug7Sq=Rto8q$*!7#A(`(h`hZx$@#r#jkK zvBC8{S5(<LS$#+^N43xvS~Wk(!Rok2h_^_wbuoh(eJ<;((z`ksG8tXo&f26B)YNRL zMsoE?;4VXiu1G_+a7K==H-b0spfl)>NZ9SNlwLh)VrtK10-=^E%*GNAKiZNw^@r&5 z_NDUPDMfgHatY*%oiUK71LbY00CBQqMfgqgG>d1C*y;yuMsC^e$mUa)x)gfFJ+4dX zm6K%S<bC5~@%>2;0V~_j0yXP+B6Jk08tluP3<C8U3^ei-QcmAa+D|0mkqgYJvk<W+ zB)eEhx|~-9zcRuoPv{&Q%LQzN{W|mkbYuvt)+*^s*Jia{_f^6GjbTgm9=UlcspFIC zSpS_v2PBMb`{CQ>pj)ZoxSjmmzGjX-<sE`KjyF@Qg{5UdLnz+1j@FUfi#qWrP=fia zW0@)ak^<qZzNNg~SmQVK1dmBBx0?Y;?qW48W#Mc$c!fc1aYY`eo%<Rj?!LO6&17{t zp2_2PK{ab#U<)mpt0fxoDO=EH4d*NW%=xQxysAU3KaXL4SkEuS!m5p<Zo!B-H=!@x zWH-%DdD{2@AwC%p(7|K=C5XYJ*z)w2U?V_A9UO2WBDwD!Zd=JZYF#?RkV~9_8&+3g zsKvUJqP>~oXIOvo?xoRP3B~OibrDF0n8lPYav?yue5GwCAO>!ou43G-S)T^nt=$-K zuS;P0EHyXDZmr#dlR>wzH-Z*4P#75)Yn6T}+QXbCnz>-iSUABI^rLQcuiQv1eaNt7 zn(V01xWn)$a%n57rz(lG(B-N%jt}^(7vwg*pSW5RRDUgyVu7l9L|2C015~z-zS_SU z0INn%)Aim}jWqZ}A6(6f0l+p=F%|lZ;YCS_032)eJt2ABrOfNxm$RTw95+PkmLABj zYGE29d6003IWs-!VR?r{U|Z>uZ=XR>ofRod!rI(Q{b;DRA%4G&DdKGb{*AFG^$m2c z6f%kDQy#xbbf(z!R{sZP*m>K;fazRu(h#GgD%WdA`H@9hwm=Cp@yE?&jV^6%3f4g5 zno1)Jzbtq1gAAlnR{pK{{N#K1I3m#`T2x{C7$SOv|GDA1ZBM8$EJNV7b|mk4W=AW9 zXt%i>8flB?K~m-><RbwSy<dH49323^KTAA4PbrZVpRVWbbI0ASVZGx#2Oydvmac<3 zkst`cumdd=oK9T4j^|ix3Uc^)r{Y2`m3eu%$kYPcj}`a3G*DE#&}i7hCH@5C^Al;0 zZb8BTVfW+Dd2Iq^mi-y})t3FVsk}B3O12E;;9QH|=zeE7Y_I|z7~ciJSKgf{VvxCh zw25d^JKY$x*Z4N3Xxw{{=|Wu>h<L0~;u$a<MmaCg3lDI`yEg5OV^Gcqo)MQ18>}j@ zQOecq)O>~XmuI$=L6pNjkq+^>2$w+==j_WrZWhs!?Va!NBCSfPJ;;MI-`~ei6|JOo zL_9JB19{W8gn;9XOyhLTAMQNIm+9b-DJmsoupU#!<!*W@Ht&rqs+|c>+BY3GpWTf{ z3^$V4o2q`I=7QyFAD?^0ly42iYPxQX_(&OBG~Y?y-6#hlE_Bbf1ckk~zg&pYB0P2& zWWvtl1f7@A;R`;-x^I1{+R9@j{su~|xDsuP*wqnHHFc{*732^)nrMEl<I;{65fr9= z|L|fIIExujHCCKpxon*sSEiU9s>59L-O(qn0b5-*w;Kr=whnLm$x>_G!#zmJDAIoa z%FIeWzj)lC1b;Co)-Wq-%Bxue)a$DVfJ2>6e}BmjZ21r-izyM<VvE95n`kS^Fhc}A zcL{_?r*+6JWt@lbPq{@!44U3$)Gu|ctkh%RLHx&ys`I#roaRWwi5P7O%JJ;{TC{jx z&{SBrbHqNa5$u1rL*6QY1s_QLtU0~Oz@SbHgW2Rv2WSsij@$3UzFWwUD5cX(pjZGO zgH-iejeY&=1>AL~udk)>j03u?9pk{fHx;IjeG#ka`D*%GHOC8mN9%*yEyfmeq7!O( zXsX$w0k^fGHIuONGeC)KA?~@oRXKziLEWNS-qJ&94L9$7I`%G2pe@X^0B5$%`DOJ~ zTcD*vx)Nps8<Suf7r`(K(zm|jqFB~8p4;$<ntR-3_+oc5HYa4+?Oe{yYOP20)OWdo zLdGOrpsW=>Vt8^}ZPM}R)_=h}Rmi2<VYYdae=-4)NA?xCR9eJmKR4t5CZo5VWp_~W z<~Ua+Rm3=n!<f;&!*oluJ*)zUgyW@$-E`dCrh3-Gh-qm%mY;)v>tcNMA^hSyJ6RT~ z_^!+z?x|U!z8(_Pe|mnEGnDc)(5_S^m1ltNaYMpgozKMe*Tq2p#*LZ+|CJjIT&sz1 z+|^D9UxF#2WM;gEyTv*?CB(JI`be?19Q&{Fw**4hJB4^WzC(pPz;VLmExC$(yGd4! zhRa2bK_d%S&CR2?4f>`dNdRj5y~amvBdX*h9m~;CZ}fycb`x%nPMFsBJ8UR(FAlFF z)(40r#1CeKhX#-$`^Wik+Rv2T|5);N8(z8{FopCy7%T);B(SWNpAv2oRvk`_LgN?) zWy=a7zkk3;$G+nd_BjW58a4#V^4JUz?wwsxg0@G^^&3I4LmB*r){xY_hLSqf5+iXl z|1>@zy{<8lkD?~LlZZ_>o|n<q$~imwY6fRz7XGWcG$-@1<h9=BP%5WLTcIf%5-eQZ zXeUjTQPrcG1j6O353+-9T~wJ23RGA~e=oI^cX=JoF=Pjd=tz)@a`f2n<OBie3%15E z<o<3y1z|k2Rruy#$XO~%3H%{%rMk^LiV7{=@x2ph=+7*uenamFE^<GgfDe`#%g89P z2~sB@u||D;H(}Dpb)#l=e^fw=3Q@}3A|wdFUDInEH?LJxC5ZRI_Vv#tK8IMrv&m}M zG4|B~jNnrBRHG)&)p-Loy1g?(=a-M~?}$#jW9^cj?SS{u{IvnXnpVvAAW7q6+^52x zpUh4DK!7ft93n4IDj}-Uh1@l}hjJyi=+f+VpXp@M%t8w~o9cp+TvXzB{rU4d>)Q#Y z2e<EvSuw89`Ok0W3Uf+|7K??8d4L^=<~p9wZPKyPXVa24!IJ^*L5{<$o5@bFC3mOp zn+X(1C+U_oS2cC^G<pW=bSACOGg1p_olAk)_fQjo7yN!uWPYWR1uIIXyHVsJ!SyXr zPmv7_tjV4>S>3iK!14V~ydTK|%7fO_`NPS3y+zs$=y^ji_P53Y%YN`pX*ns8Xh;oG z32FFcvZ|LD0ik{>iL^y)q}b=`JH9p(1&%dpo}@Q4Ab0GJk0wyMKR{X~mG3sLnXQcY z{N$UuW#1^w;t{&{qF&-aVxGrdxN2X1#Pp^REa0U3C8?OD-lrFI9Rz$p|CrWef2I<< zkIR9p_52PK6F3C34ME%%5edyjd6RW6P{{bnj@s8rS6WBOQbQ|ktJ8VY5Ef{`@MkZq zM+v5Zvzra}Gma23L_)1ItV1uHffk!$2jRK5)MZ6*`PPA)Pis8?>`ViGm{z}p+act& z<nQx4w%3Shsrjl<FTDw~=^Z7LdKMqJ6?nST`NG9lhwsz)Zfuh4asW)8{b7NWFkVjE zM44YkU?H<9QpIcp#fY=cs#w+iuI*4Ess)FHDFvPBM<_$TtY}hZefCQiOymQ;)pg>x zae_%6lW?T4+fhx|`wSA33OKwcTKPEmTvb)!JSe6vT33#}?1^^eC|)`AX!b(6Qk|{J z!><V-yIQ^?b;rJa^r4*7BPosl5NDCF@Z#sWSkDfo(8Iq09E~dIsH-%Ytd2h-wJE*w zk%HiEpOf>VSIt}p)tn(yK($c4rr}j$?#%m?{oZhnUM5hU#Vnc_oru=w`62f=;QBjQ zM}A<1&-az6Fn(Y0*9Ns@T3>d~wZ$cj_a1tx>=+F5=TCjN2vT08+Ugw#b}R*+>+JcH zt&i2useHV+317wt0g%a(PB%r=u^)E@wsD8n-(1#Vd7)Z(byOs1=O~t70zX@Io@X09 zc!5U<WGFnf_T_LyX7KPsBOMb1<AWYOvIzC#Teol)(Vn+B3LxJvHlj_h<%YWMxSRIJ zGt?D)OmDRe&pmw|$y!jH<mk&SKC{<6pSsiGF4C&SGD4&`b35;1@5_ZZhCY{<e0ZJ_ zUD|DE+TZNBbxDqJU|_LgrS;*@bS*VMy85n4_G64yo{SimFSAFb3kW{5+wLu~OPWgx z@bz8cIw{U0oO!OfqEHBgn~hxEJ!!9Vu{F*Gf$W6Dr<rgYl<t6%7-0$51vt|so8q;C zek;tQrfu%{K2^Z}6?b2<*ZZR8ZGYTYm62P1lndUW98ZLr-!FUPb+yiI;q_A5ZhU^9 zvNYrp$6T($m-7x^U7R5CX`L@*aM9!wtkwiRTx*os;vNYlnOt?Ue0A55??UHA+6;nY zT_aEdxFi7#kHvl~m`#5$p(}cquN`6_v0!j{AgWu=@fF;)pCG7C<x_KHuaP6&#O2r6 zVu3^9qmAhr^UN(q$8c<m!N=9>m(XVJT1PL^H<)J<(o+uJgupc-h*|b`)jv@hAWFJJ z9>aB_Kb|)`x73wBA{Bd8Z5?IWX#>Bc96w1_bHT~=F)qOr;_o9(zMPz1?yJc(`7mb# z99VamIuDICQRYJfh+ybJOezMj=p-Y~&)eZZj}nQB%TLfP&VtU^z<Mg+BI6PyUnj(` zY7qAX=LZ8)&BO4_|1LEYspruPG@+gHhP<H~Uocpo`e4MO!hg5fajnLB5gS4aLv_^1 z-WC{>i@D{>+8fmU#*9vDYiE8=jFX9}93o55zDU)ojTdA4fxZ^VrHp0(E-)v{d^Wt~ zn-1)dxZ5;(gNAqDZ(TfO8~SDRGP4NvqAy7Mi~IZ*r&g7;Fc@(oEej4ntq6pNVS1Se zAe}*8>$ntlZCU(oUv}zjpRkUGr2uOW8^;iflgiW;aX>at{T6Yvg5?_BoiQ~$!-JWi zg*lVeu$Me5K@G|S>xyL_@W+|uWf$+xzURF@8{IpcS;1s8v!Iqqew?~1=3$ab{wVUo z_Kg8qB80p-T^5-;1$nQQUqDPooNk$gfj1E<fG0Y+C(Jq1_C>wS%#3N2w5)TC>TF@M zTHLG7X@tSKzL^0;)@yI;QB<|rRIMJ4bSsR*Y;EDE(cJEGh24JJ2NhPsoZ)4T7b@OG z>I&Zd9-~B4Qhxw(7n5ohtGcK6oCg+N*yE>}bF5W@WwsOW$?06*RD&y<nNca1EGi|o zEk2;9X-3J{--{{@<;LqLcjB83k@kj-onz6IqIt&fLL+$Z1h>=v^X20hHS+1aSp+v8 z!QKI4$+xR`^jSYR5S$w$LB-DLaX{72_4FWDyGnvWSj+?*{6THK3W^Mytk=5|85>gh z)h4!%x0RGgR(bft4>W+D&XM0tk}w%1d5!>0t|LJS^1gADqFzb?1ivDHyB!L>xcfF0 zti;=qJ07<;p*kSW0>s-IV>SZS46Z5u{I`wVUx|dqi#oIRk3aGA8#lUj=bK6f$qW&G zxo+<*xWb73p^YCo{QENC;%MAl21}{ha_g4u0lYpXi2!=`99maR`FE=K89JZJ*9XZ< zkCS3C8@8~QT*J)=%Zh5GLlnMK(&{}Vc{y&!=A6RHV!*I1!y9GjZ|IK(Fo=~eRE1s| z<^CG4p1YW;);TOX|1o4{*4;il_hP;G5kdXVTWLY?rRwsW>tYa8CzHoQyEf`#0Fj^P z66y~&Hm(R!WmaA$afIoz&`c_CJUm<@p~X2oUk+Ywzg&sNv`uQ&2gKd#0{bOK0B7|n zyK<6x#v+qbt-5U;ZrK-$P9-Aohu@$TNHlQUQWn(`tpuGWF|gQfB5wC=$P>^`_)(`u zU79dk0@F*c+tna2d@>NYNVbqR-BOTu{E%bk`{n21+=5+*CSwNS94#INMl=*OyHj(g zM8%tL(x`*TpZ(6NZICk{VU<QjP}ce8TlaZ#$zUB&!`oy^vT#J<Opy4aj@|gwZn^ZS zdlz{KQof>Fi`_9ir+^pdUhf6Uj`LQ9=X{WvJ6r4=O$=qP+y=`wjHk=At%%t(2#%B_ zk!W-x2ReAZy9ijKmKgW?X*XG{1iraqK-%q7gqnV^!}x>whQaC$Hh;FT?c{0R0`(;6 z>1;UeIE=nN%CO;<wr)@01Gj@#p(neWs!!=_&4N#)a)s~VR`UY0b_G<1PUQ!`Pb3|4 zMMxx{b8Fd6x+iJ4AFdjm;ZQ_fZ=(TWvf-6mV>|C$HwIWpc`ZLL`dy;4wQajq{Z7Z& z<W%?a)q#ju^r&2!&NF3@JgF`Khm$+MWW>NFu4Emf5c7UL;RuDKTVzZfv^_Xd$n_(8 z|7qI<k3@(}!l6>DWzPxrpa8IZ7RR8JV&C%JNSAnQC!tmY8Y77yoMPd64fl*mXJv$7 z>2Pk_U*TxW%3$Xl?8%+ITpPXpSxwbn^Hm!hLCE0{5XhSb>Ayu_Sr#@;QwQF#^w?M( zf4Lq164<7<cv#VK%jmJUyasQP3MwS*IFa8=L&iH93)Ql!CFriHhHhQUxBPNQav;e% zBCI<5H$ew0UM|W>FB1!f5nXyBb$Uo{583c1|8WyUQ;D;-cpfDkh<XmJ_iO%;X!sNF zL%Ppm?JGR)NHB7y38Om4R=WV}IRGl6GBU#QA_%+SvV(ZdH5`y0M%&<UB{x-OdPI%_ zg_B;4ebCc(!XXhdsPS#mDs{Kf6AfUzKtNJ?0i}Teci;M4vBfHx#(CJjx(XzB3uFB6 zLU=}CR4@=KUGfAYSRn^d^#Vsr5eJVL<GQWD5Gm>4fHiWVT>)PYPz1AIT?UaPb;1;a z1WS$1e%YP|Tm%Wue1V%N3W@6~sE)1|G)zo15ZtOwI?#@Mi_@=%_4@{C?uSxsHdKh0 zYSdYJYPxLKk9L(^aOxb!jZkOeY5=Y1%0TOrQx4+v?8~=3b6Pw>zNF9{|A!k0PQiXZ zsG#0FZIMI%11`K^px^OG@TvdWv#ILaO49~ihN6{dYxA!~Y8Mej8u?|`sTrp_d(~6b z2!I0`;L@TkDM;K^`fyi7v{6yU<C5jKyG$)A;BniTYUTAr4Qzq=u`VZ}SjF^@^Np7E z?l)UY%9&IkotT#3mQc*-cIuf|ag2)37Mx6fZ%j+(NmaN(2Z8S#^gEg_hjnjwkS?j4 zr{A<&+P9KnWD$R`*+(Atb5~fFdEv$wXL%jYXvpK*&q%oI+b$|n2iX^PvpQbMslJ4J zWWjB@tfz*GbYAzng?}Dd4!SdD)oo+jCt34lccgZvgDuXhjOQzpxSn54{_(qDrta-Z znyp-^&BsNbP5x+dUG$iq_3h&H#fat;A|%roJC+^9qOL?0Cljb{;I$b^`O?dw_%={+ zb1-?jouyICZOXx?RCRvEcUu|>FxHC-vpyRR`X=W?5nd@@ewGB7By(B^lKOgs#0zkg zn{#zn6pn-guJ??NV8&kB@wz65WS8x?{2qtxaHl#k=#I}-H~NnsbqeKd3somO(=1Ot z?0$|G<V2lh2eHmpH!1Ul9s1==UmzUMIy}wQ{hZGV#(PxcwDUl}JJ$JIc^rOY>GZKL zysE-87C*5Bq>5RkZGlwDmgx@WB{{DBUKoi6T-W+bI0c^v)MRfRJ-{O$zH*hH=`=B0 zh-Xq)x)LpZk0${H$rT0-rHuKh8Bqd)sDT)bNO*x6=FwX3Q<~^52nkSOZwKcF-ChCg z7L82<ms)4fw65XJ%3E6-xA3%ZM2mcosd|c#qKRKyMPUhkY4(win~hQ$-=Ri^2@^hv zP_bb{{az}oW<hPMb%7I<>+3E4Bgbpew;Nt1c^18D<;x|P0Z93$X;{$cS=wmH(8~fW zM_T@^X%>o&j>@9ER7?ldEPS{W(0IFo|McZ{t=)!bfO%BO8kWHq)9LBQcF(t?&+L(V z9y>fUn`*#hr=MzM6o=oSh_PTQu#e~JI^48uasR;+xL#mRW=hZW0T?EqEVC?lP$Sq8 zaPU2IiXTU@7jvs*ai+HtE4p|&!FUO{MyX<8Uohi4s%M9bN8xd28Kq*-+%;D~<WihG z;KUvduiER(=5gt7LdX<eR-1a+K4)=n#aKRyFI<w;{m8UX*UJxbUl3a+Yn`>b-M%;! zzDahN^-~F4avO3X#U>T1##*TTnxK<(Y9E+G3$G8Jg+}NI;Y>$U-1TbRr4cPqL_u6Y zm4jyB&M}5t#*u5+da>&iuh+6AK99T`On<H>;Yw8@x$3H(Yn@d%USz)%uvMm~T5+~x zlRfAL@j9VU@0d7R+#`ZG=46W0r3ZdLn&h*b==C?x<grq!7|sg#6PT|*5cLlGp2hVY z3lS#~w@D;~BVKMbNPOx#O~T-@JCT!4YcLH8Q9IbsPE|zHpngP6T*5h*%wfm@k$?yP z5#Kz0p`hp^LTeLn?kM@#o^PG*<FR*A^s0sLeYX~2rCce~w;RKRCTqO`yLBv5@E_VN z(0IEK`%rFbc$nq0^Iu|^({?5e$rbBYrQ3d@*K4unU8YoB{b~I68%uENa|(4d3DXoM zE2NG(6`2@oKw{h?jmZ|*nct9J1!S@S1sq<sEk5Nu^ON_><!T=+zsGnIfuH<W6y3w~ zAor+nNqwp`HoTATwSHka?C!T-jh+4{ZSXIoUWR!F`M@)8%l*cp@zv|&ndTbeODdvY z(&uG=U!{{DAP<21L{Ar}+V3nKF#O@-Dk>lcez7~di1U_FovK|0xbnPB0xvzZq_q&* z5k<9On#jqegY@O1P5)&3yAVz1)v=N-h~bGA_CZXPexuo&#@m@sj?02bnVZkfe3~Jk zS^~4BQJC)&PT$BZk~A2M8rVprdYn+7ga~|;avA?98&OjiDgMZUTDeeRZ@e~dnX7#s z^(g9)5DH&IZWN92qu|_LEcRIEpt&PI(^UaGxo;IF9iolG<9kzRUnzw|>~C`qeC#g= z)~!UXPGUMRD*ByY<e&m<hHIS!#fAC3?aFkJp~RcHlMZ!d;j>n(IYH+X;9a>eETBUi zM5x&r-TCI#C_J$<wqcL~S~5v`2wZq6<fyY9YL5|t1Yy;z%ih{v4;Lk0OxGF6Uy#*_ zcl1r~N*RktGWExG-*khv`2#O51YLt7!=+owE}nLUf51$=nHw=~$uqh-vpU>|OPrl+ zo(@4N#n>!nU}pySu>6`ZtEo~0DvNwVO5TFbH%0|nIBhz309ysxTHvd<KN=x#iD<At z<xED~O%$(@()*ODa}uE1KAoAoAVXs85N3kjpiM*I0RMInB>|IaED{c{HTm?^Drz*l zvp^iNXRmZRyi}jty_(T<_uo|{*!LD20asU|^_t5x+T=@zp7Qw5d=YA6y1ueM>Fmnt zAo&Y7h;J%MaJmO7N|2tV?nQ?^qN2Ij>uxVyMZ$|bwYISG2r&`FbSY=S^{vDxkb_^r z+WFe=cjS)d`t=^}Tnn9nNhK&&Y^FNV-V~8Jd%@sU+23w~bQzKhI^l?hns1S0#WQ6e z<2TPij_Pj4dUH4O%NN@O^ueVX`A(+`)<>U^ezm0<o8b@8qw=ckm}DE#HZw_MkPkA% z`c$<fIVG!irMu>DU&f>1ZyAnlE8tPyo&c_1TgVV+h_K6$r7rH>1kqELOA1)b!=ltz zwr5NW^M1IQqKA_&Hx&~O2RK<L=kN*+eBl%@m^aX3LB_GNvZvU*U-kWXNFcE5EDe}T z(;eV6PS1wl{XVb|*E;asnfT`27aLn~9r{5Ua567AzM{s*N-<k_i__MVG9^>EA93F7 zv0#fCJ(BWHy#g|Y$;Rnp+<+Na+YB8_YzavxU<JAFp6j!mP1LUV5U0M@ktY~AwfB9T z@9-iYBfw5^(_L3T9GT}HAGs)i3aC0$O7Oe8oOfnicr$&m(TI5KF+f)K-c7yhx~jO+ zoSLqEkgRwVBxmba+(mGD<F@qT^JqX<8K+^pG?`%2be(>ecu9xhCb{MAnSm)}KrmL# za9yOROr}tFyy(63{CN?9T;cV{A|#YE@otaTwxTcKzNzQbuhvQv@Cpw)_em8pFV(i{ zJ@W2w6iL(%@k?v;9OLSY*_#e4b0ySVVIJp17&8e_l8xF2E{B{RG$<RT^Us_a6&4yJ zuorVQ)x^hlxyQ^D8w;%24?EP;1b~EZR$eR!o$Ne@mD+kRm;Fqj?Y<h%trCai$b@f< z?DC5Tg$KZge>@MNBePtnTwRb1M%!|lD*f0Bg&<~e9b$GomRd1RN9kgkJ=4v8IBhs} z3{O^20%E8V$s<}Mr;l0}b<_Agf{4YiPPQNEf)BQ$B!BBXkFZ}+$nM9)BX23-nox$a ztRk~H#@1Nrj>hd=ebteH_ttb?Klx7(4Ha<i1H^JtPgE<LOlTIbJ7RyfX8fC?8{~;| zUWXgO;MsFu=hDA>@l3b5lMb1ib0k1b2-kXRH*P-Ts^938U0Y(TH8;gV##Hcvv6Oe_ zy(ig162Q0NB>}}+e5m0@6!zXml60zU*Ygv{6KslEw#Pt*%uvR6vB-e!UR)375{I~I zr|f*09M2#YC9B?GprpyQccO}6)!<xyn~UGVZ(vOfk&_*#eec7--=QD&!?Pvabd<b= zs1>lw!U%yNCNgmDzi?@C;bg*Yx()4kl8BXSf7a?vsX(krLp1ep=UBL#;NZOGh<59E z)rAkxNTOmvizZ|plBQFgug=aA&orqzKHy)@r&q|1RIVcRZ6ed(Y*>|cf=TN{9p;gK z#G+|86A*m&_JW~1Xj)~3x$oH#1}fl$QH27{Vd1={)^4)LjjUvptyF)FqY1WDpwXn! z{h@#jM_htq&wyLD@Bqg#--(q)vrvU=HGVxO{cYP)u8lKf2gI0CR6UUTTDGx3^W$)O z$E%*0Z05*z5y9yK%*1wt^_$WHuQRf{^Bt(G#mDh-B}q;%zc;tj$SB!EN;;#JZyNcc z>ri!x%d*;MB0Ag6Va}}DMTh$O*1PN2RcZ3<?)#nBD=)g%ky%>kIw2K-V789VSWHU3 z<0skmR)ac4Mi(5@Ppk%)UTQK%d0m)(h?czlEi)&!WYT`?>+-1($}0M}wo!d|stF#f zn*97we~e}#*r$fUW`u&<#7jjKnHs8VP<NYc-;lE8)>d!ivyd3_i$G*7a@6Ih97-d^ z{#ECuSi2^yNMKT@+UhKe*m3cidi`+j!WdTR-me?S<mIFrlt=j|TX$SA`;M{z@@klD zQZ+Hhv%N!fjZ7#F8Lo5R{$09vde~f&=FjKaSR%<msV+AAhEZMk?(tpcb8hWdP{eJ? zZ}ETq7r+fttE67P1dWVNgC;Z2VTU#r@}Y-^dVhf7+K<0~SLSnhuFl}ZhN$uPuSM1a z-^z1!mB);BN_PQ3&E7-F>M0;Jt+oF3CDrvHku?s9Y{cID)9KE!qh58TvO~9EXwhup zE2zDG?V+xZ>kQ9cwRFk;`<AJ&wynXbfFQkezglMYC>0vH^nlV<{qk7S#S%k=%a!?K z3gE^!ih|$-UBiZh%3ANe1z2k{;w@(MwVDxUE{Q`O2h{mmpaTBzphXXyJB8MsNR*DR zmz<kZWrB1q+5hn8*oR0-V@8v~^l2oIgsqLCY_R0G9-`AwSK%ps*>C33jyVuM<lAl9 ztvU}Wx+6JVC`-Sm9#)(aW<FyaFMviZ`q&T^X`SHrC$ib(g?IaQAOZOR8{-qgxposi zbsXZCPv$5KF9?{_6zX=pTBLRVAhso6sIh9-9=!p(-BhyMdKh^`f0>o@$sEH}fNJ_8 zr*cvj99IMcqKCfNX-C>%7Lt_gL~K17FYz-Vdlztzz5IG?t@rhRq9TFLO)}CsaJlNh zl@%!#?Q5Os@<2_VP+ST*1H?}co|tGSPT1#I>cIWE)4?P>l9%sEd|k^*PrvuYtS3?( zLKL^#!58yR>}-=I%fNuZi&SKWG0;p?%d|_J?Fi4iH?5r8fC;*D=sqXv2mJzxu!`(j zGHkSQ_-Aq&{B@OyNz0|**poM*ryI1_;{1Q%N5ftpzJxkpmoLE7NXL38g{2UZ5qrAf zoct2$Zs3zOLb|iNjcNRWl4CzGYUCut$81GC4--y_iW|em2b{?i&h3%@%njv^j|0nA z#wNRrx$;pi#y!!F>0LTD&`hN3aJ$)C<ZoVs0J9m<ynY}bBDdC}<zb6npl$zVQiW-X zeskyNK30bl>+>k?#7}&WEV9*9VL-cJg+GZww~kKnqN*Uec6JVMZq24-b>PLB2hU-; z<9BFGKu*L$%2xBrb&lk1ENi9>#xy|Op0$tgp{dknvgzGt%(hJ|SoU~b8sSjZl!2r} zPq72J{qK09^~<lT9rJo8XHo=4A|&+4Y!`zPGA*-}X7SDbXhd(>q`7)R@@aQ9x`43B z0kmZ&ERs|xt;M=RjQ4G*M}QsANw+A&Y*1nz1qot#;A6av?4F8oB2TKl8*;Hq1U7$7 zXj(#0g{#S3?zko9%eJ4F+e4#AVIpyzV{<UF_ZPO3mZ|=Tu8OH9%(^yXRw4+oScQ0> z_8+f#p0ST+23_N9omoYv_THw^sddTOGJ-(J)up>Br1MS2&a)%1>ClZvmd~ZIu6AZh zdE+bajRw-CrzxCYPskZ)q0-W8=a<=xXAC{F4W%wSCm0s+J%7G)^Hy;BbGjgc1~~4` zWMV7|XzF5H7|%NqAHQ1+<j(461LYmXW7fs}Mqoy{SXLGILRpsgRlA->4ioC6@>*4U z_1a&Zc&ZPa@0bepi~<{b(g!q6*o}}eBT*<2@^y@F;_GVC=;dMr!%3PvhkI*d>E49d z!JH(6r1KI*Nmm_fvd&78qeK_k=a2G}m7N%^w>{~9qK{zhy*j<BuV10_ay7vGdOKtq zOIU^&&}ar_rOKi=Zzd|=sMofRwamcd#r(|`ZvIABnQ`I5?O?(4LToom!q8}B;;6fC zOI-fQT?iY9^s&T@w8;^at&%Kp8l>3`>>R4F(`oE{Lr?U9w(S_3fU#dw-OKf$-RZz9 zj@trLH|Pr;w|ETL{@36BUBybqI~`iq<(&mD9lGIjYpY>C8!+)hyd7VMA5!2a@l+&a zI^)0s_huHyoCnWKc=09Qk_%lUgXrUq=VbcLE<wi*Ig?SS<a4bJ^o^!ddm4iYPLu0t zC2?2+Sf=V(5^S&wW5QB_+#E7IirMrwX*D1(-gG$Q!Y`ucvEtYKrdb4H=b61uiM#nD zkkXT%qgJPr*KQ9IT;*!|;Oa^LhrRa<hjZQghIfi&kswV(k0gjL(R)NhCs9TpiQao> zhzJsiPSnvmGkPyWMDIQ75Zz!Bj5dbnbnm^NeLU}dthMfs?}z)_9L8nFb)Dt^|Fx5R zn@0PG=e%l<4wirLdE-OU?H9%h{G>N#kN5VPvpcUbH}AhAF7vEZZ!dE_Yb#rcYjx@f z)yY1hJIYq*+GR|VE7t3%lKi}oQ)WGhwZ`bzp&Hp@kyjJDa^+*W%8Pg+_xm;-<Cgke zT;G&0^7E}NQwSZej#AZTFM5Wrb8E%<=oCACxvl;C8ZCnVC3zx-yaL&0AGH#@a}`2Y zygwLc_Xj}<j9rH|>%ivM4Tra|EvVDuq%Vi_(o}@5c<rm<dq}>~;R<=<e8b|fr5<<W ziGe=WZDM=Y$-7no*-FWo{4fxSnj2$C4GXwR-UamabwT&U@=$zvh67`Mj3N!sUq$*p z*`^Q*X{S6B*;1XHX6tN%t)9Lo6RNNr(XDg$W<4JXThs0}-^?cTVU?N*9hl2t)y9(3 z*bx0}2>WD<2F-o89pNRiHRCl!2fqca2;ZwGUVFJa3$mH|6!j0NR052_wlH&i0#q|> z(1i+zf$k)jA<$-8(|0X@w@TgMxB47}+~mwLhf3}qPgYlJ)w#!Z(A%0~6@Hn*#@RJo zPAPAC4eRjc%FFYTP6gUI64P1+Hh>0czHU^LJuV2Y&|m5Nf$m(y_LFHgy#y*=uUIHc zPa>)S25wS^uKYn<eULbp01c!V`VdFW=SEj{h#`uS^pns+H9jmA3*Wak`qK=K`Q&GB zboohXEZ5}p-Y8T$dne=bFGRYzhA7mmkMT9|9exho`IK*CV&B*|s!nP*VC+g%K*L|d z8NO$y)83?)90&MROa4rB*omzs(Qvndw7KndmCPKLG1h+O_ze~4m`lZQM3CV{gxjS4 z@Z#xk7>xh^?n)NJQhBj2@unGDN6a~jd>x5-zNW1knS*_3x;(|Vnp-$>zdKqw?y9tk z$kv#k{pi;_T>}Ga>Fv^HDQ9zeI&CLAKnkvqsL>_E{=0~8V#e{%sY86@h}&#lZa~uE z_zKnjGP6O&6p()D`SW?NZ4}j>N-U0dtyXob!x(C1wwsu==6OE3&F7_hVkHt$ZPbQ^ zG^CbV{bkovexU-lQ;Q<y72UP1&xQ5kea^Nhx7jzSsxz|N#m$j+<*LE^4wabY1n&@U z2+Phj+VygR#hJZKfRDex@uY%U_vNWg+ub>12+#TeN>y)``r~;!x>)<b!G!WN8sN!? zM@+|=xX+W5&MVz4sXi--<LtwqC)gONpAXGH*Pr@z(@dl?!ZPE8ZRYzj?Y?ovw~r9& z(&`U+IVKEf`$=mNVK|BP@b>`%S$UNwXzez48i3Bj<4ec!)(yLmBH~5KXs2rQio3;o z`)hzQ;PI=v!%7QZPxd_{xYw3`z%#fVr>uELYbUCdSNR-~9NBCNO=uWLLNit5$8p(Q z%nn+DDlHG;YMbYUYVLH+TX<GuyC`gPO872a>l_24xHry`_NF>NQ}IAU5b|z+>O*0t z?<leSMI#@GN~**|&)xde*KlT=GS8|E9oO#Fr|*+~-V&-SmQg%9#_XOMKfn6fB(Z#6 z-njNg+%BkgaInnqikh=IZK(gjb}%_Z<SoJ4)>no~sT|n~vrDi+zs66?o_mdQ0)M8Z z*UEd>m=P8fP~l3~IHfL~3mvf><V)80&S5=m@?4DCBfiWgcTF40=`u4ZZY>w~Whmhj z6Q4s??8nUu@Y$<pdv%WrvEvUCmN|J58pqaZfwQ>>tLUCpL;GuX0}%qTqfc5g_q1|j z7MYu$bSP1pNy^qJh=@E3SDonoU|%iTKAb-mvLwfXI`dS^;X+dtWn_wqYo1;4tT0=c zKdno{k3FS`xVRA6-2P3tm=vNtEP=?#(tLk$%jjwtpVHV#sEk=bjpW5RlfXthUaV9V z1{sy=cFLtFNarvUHy3@yIBF`#usqmHcjECQI+_ou*^i@0WP1eYBRb~r0v^iLJ8U*N zrS;<ts7nke@gHZ)1+zOqaQGfmho%!Wp@8q$p@C1Tme^}DHJ~{RENua1HarW}yBCV| zbBxqhtkrci;Zvh*w}kXT>rgkswd*snEg@Kg;?m%XR1Qg6zi`Iiqxa<?dCZ%3TG9{H zQ*V+aUJ2e3a=P)aMVku|P;Ez$VFp||Z(odcDI6(}-J4rcUJj%bk^kD8VC=dGHGGUR z%UQ9s%vqEFxI*!(Huo*;oJb*dth?8-SMcLjYV%N<KOy^Vz@er!^{=@%o|#y^FzbnT z?Es5NeD&g~>{%d`m{Mr!pQ7@oR&nZC+QeG8;?mTxuOSrdFSclhXyq>5P|sDamOv?f z<@$^pq^8}R-Hp{&jmuNdUyrfchg93yQVE!(HL_dvK;H_%1O#oh8TM(R>P_qY)G<eI z4sQU!&szdra;e=oU}7&)M8D@N=MsfFj778H*V)JL4oh+JP}})6V62Kly?H&M4L9^q zN%6@*6iQOlJ(N7rcA4rLtXk-(blR$%2y)ZIfLlF8cHN5*_Hl{!)4J#0<*eI(#+QF1 z3W_ff4p1JWML@G+L!Kw8gjW5+!^$Quv!CcjCa*7j{gz;&Bp3TooSDb1eo7`Aksosh z0fY=8Ci<kGE9wd(Dv+;#Xl66-9gdjycViYOL<_b*Y~R)f0`FXln(ji~sO?N+96i2K zN#6;nrZO*7JYh~fcTS5f>EO)TLkxzO7d4^5IxuSJ(O#{B+IpZ)3yjNcUXFWdz7(~b ze-PJGXDj=Dg2FCcdmCe7fp^Nd!0r7R{6cQ4x7qiQc|O;DXHHmQn7*;Z?Wqbc4OEw8 z=NeHz33Q*}s#ExA9Zy@+;o$#}bakE2JDoB6r{_qI`G6J~84W-@-A{%-R8EmXH~uIj zx>~}y=3K0vZ`sLSaZ`wd;uBuPKeJ}qU|4p8&)g7(3+)9M!Ad`zq0oCMKZM@1#`OD` zNVitr&&0cIQQWr1uCJ@$xyq@Gw$rX9xR08ZF9$r+6IG-uZ6=+lge>wnjyF#9qx^S) z+H3E0P)aSgf7U<!=iby&o1IxV@=2I+62J8W>>dWQR)3EjkOU2$JDpMXlrlJ{hLoP~ zv_fU*6X1D}fv<3CTU?YY*Kc9PH>LMb`*=2u@J30%jt7-fF#qg%gi~WFQ~V$zVv}>u zXNPVZE)jxpoU7FB+zvVFm*$)bz5AhbFIp95>zXVsM)z^a#oKK+9PRvi7+#As6x|c{ z#q>>N`FI`>Jn3%?^aG~|P^g<LSKjlQ`jC9fuIDR4t#-p8JvXNKZhtJM_#kCKNPm8< zo<i{jyO&I%=lPh!B7s2eWzT!ZKWnvm<ey2u3~wmc7T6NrsN=-PScr^G`P>#8E_g{T zG0YPL5${f54CQ+q*HPe;b;(1yD~CWWcl>Kz^qWdg4*q+U%q^ke0$E|+?8q6a;;#ic z&(+&#$`ur*`Aj2|o#&<+cNQA@TJC=$+(UfNT)2<$iQ$vKg=d~9JL=Y0K~5UCPZ?>( z63<E%%8F|cyz=#D&d$*28cbe-@20mb#X~y9T$p#6-IJlg*Pr&)-?tX~<fc6QgTG%% zZ@lM2YQ>Qz$uQp6>yX4+61Aaht<0Z&6%WUg)tH>_J<S<88vNq=%TKamc*x{-&GC=R z?$28V>OMDVd5M$uEXR(r&dM-8Xtbm2fiC2wBwRrZNN*?5x=6yiZR7I=_{QVUeH&Y4 zi4%J!i<I_p{y8F%FjVuY$Z}fH4?c~`!wz)O_7gapeAh`oYyU+&10EBDqqo34^48-` zYkH*WW=Gv<E~!mb^olQUYfFu_*Ev1)5~=h$@5WeSQvShSZMSX8wc?x+B)^xdf2DjY zbWud>_f+48sMAU6n|NhurJmz4(t2!c4WQCu50Sw$yTIOH(iLTzAq6MC%@S;bgCc<c z(Bju}K_PNyu4Np9%RZ>9M9a5-nM2vw1h-o{{?m!(+)+w=Q+w#P#V_N5l*Wt;NVuqb z*SKL-S9>UpX=_ku6Jx|@Iw7x`F=J$!PI1a?_Si#m;Tf*>5Uu$<&@}G!X_a1UZ*$p# zzJ0IA<Y0mlgtuGI*10|fFaee1+YF%D=xmyF){!I!%H>Z>{jR=b+5>dT=7r;D<vFGm z_GfRtzsd*T*ZG3Gki(=`d!mP4ANr=*O{^b(B|K5knoSqJZl-?pSm)`1<kUrc`@vXG zuSAZ-fN~OF)Rg-K2~9yMmSMuQ7~Ob{viIw^KoU=~bxi{W_nAuL&#Y+AZ3eHDtL^0@ zg;9gwiH(={r|odG!us<TeFdhk5oXK4xe(PH33UMsm-x-~7k}bYM><>}r5jrlkPVv# zFn{aI(q&>&I!hr-m164Gq%>{&i5aD5r|7e)Z;)Um9+_Otp0A9RCaS6J<+oldt>Qr& zXC{KYondTwBkRq6#S@4=37tCo-loW}+$_1TFUoRMIrG&X%^ZlQuZ9gA>qIvUd!y~I z@163-TW*ylU?#lf%#xmSO00hDDMir>Gg4pfju6N;sS`LkIHmqIS%PstS{>EtO2tuk zMK3362miP@k?WsJcQq_&KKcq0NdnO%u?g?Ppjiew>D9&Mb3N4;ZB{0GO~1KWsxgK4 z@odtNUjQI&b3HA&xbKN-;l|L5+hV$a$H8(!@?Jq-!uY-ky6kl@_{j~?*g1vX?qj=? z9$@WCTwLY73fYZI_3IwT2yNjP4;_zyAivCW_wHoHy7_IksYjUc;sa8OKpI6nH>jZ@ zTgPR<-V&xr`(LdW11f)t_ENheXz6Gddf!ry>saOJCGnXSe4!C+aZfup22|wVMihwp zih7B&*PR8PULQCyDwxqId+|eY%-epjq_l|OYw!bhk%rGlqgG9(aCneYFfKAf=JU(S z<H(>J*di!z2AX_BJKKqg)g5o^)Wa#LIM?8LF^&p50oKZu0mH|f40c;W_Rj<Pw^)8B zx~b)EjyS|?)!(@&d%hJv%_9Gkt@zn9lgxbmz0Ug2h`~q||M6N&;(R~7nNz=G%N}=K z^+?MI`PP>rl`#<MjPuy2xN_iF>N%PXU2U|CO_?ih+7@QgezWFgd&a`uc=-Iy7_QEC z+O0No7>+#sJoI~n-1?D0UFVq*y211_hjxkFN|GenxBgK<oKNW`S;1H?Ou+|UpcBl0 zweU>|w-hW7VzyXzY<1VyW>2wQ!3?1!-mmhL6uL)QZ^K#zpaTj&F5Gr#%?p>ffhby; zI6cO2d)9iZo)`3}S^a6gcN)l<Ej5G{MgHr|I+MP{u}W1NfYnVg*-lGPz5YkHMAem+ zf<#Q7<}O#hZgyFg!g6xqM3cQzPbn#FD8Z*eY`W_R-(WMDWZIqe8?1QHX+5!DB^WFf zD#SYO`MjLeEuaG|7W^3SCyr+S9_{-sUi|Q%g@^<;1;dAy=bi&bLz_FWv9C8q@?@Oo zHUmJ`fc|wbN-3oYw?tRJ$r$Pw{ya0vxwdO{Y+B*Vx-|wVI#JoS9PPCpA;RhrW`{q% zzibF2gkGl;&_4(1-y1BpU8fC9DzgHxX3nr;<mLKRxvR_$ck(q%@RklpE$qaL!U>N` zE_iAj%ar7HWmiFbj3DY@PcP-_qc^#RZApV8D!}qGCHY&!!u>nu_{hd6M+`t#!2Njh zw`00!iioSioDYVMiqFGhE$8Dn{~u#{ucbi+dud2PsT4lWQ3XgPENPVB@xHVEH1M)? ze_W8Jg$+U14||=T`kuV#C^=TzC|@7r0!eQ3Q|Ba84L$Tv?$`z3Tc8#>Hfe!Si8&iP z1VC8oc5^nJ5cv?$&0rX8law?c5uAHz%jfYhNNiTK)Rq-x?A2`!k1o~ByEP2wf7U-9 zq++!_`tGJUzc!SqR_*)nHwoRWWr5=tdj4T`g;vpnYL8Cm>A>xCM)u&)XEn~G{Y%2{ zIz9xo`cBR*v*X+-wfvuSJF^9v!&L@XJK`yM9kMh9NhnyiYv>Jt2B7K=m&@-~rpsaa z_R0;S{fY9gL?veBnN<>hQY%VxqKkFbh53zY%-i@oiPk<UgA&sG%>U9;=ao1}1XGmd zc!OO!*j$F|C)mgLtfA8nxA303W(gv$K|l)B@F8jENls~Z5{c5KV-#Is{w4s+Hb9og zuwV1Dj_jF{lBVlESOZzZ3M~=T59OEP^o#eZ`iv1-_#Oi~n18Gyr$g2R9B|3+9v1&; zoQ8^jWAJHIOOEc425_6(=w9L_)e}{xV3lp>D;53%JHLgBP>>VAbaoe7L-V82JA5>M zVvwIA4k}f{Gf;<<?3}H{)N=t5c)dQ1c+zo9Q!9ZRgHOoMjPgz~!;Bkdy^dZ<IaqOh z7sS^c!^#P=1->?T?w+SaJaSLbkCHT$(2|L<95H`X&>T4zu65%r=;dVsUQyQH6jF$H zp9c*_hPoD~PF=6-`-5PzC=u6fH=K3wM0rL_#mUib0)i5`J{k&ilOIQjal7KMcFL#j z+b7zpjyWt1*g3PEc1$sl>URBfIc=7rKGChT3RQv&%qAioJNkbR$nO#wcjw-@X94BO zCF$cPuSR#@mT!P#;FyJOFWf5!p7y6J(c$Og*K@D5>M5pYGVHA(Adg)<%HWyYB~GkY zfDa#83_9`(!`nT7dXra)Dt-=ir;_VZeA%ZxRpk3vG0|Yv6Ui7#!O?9At-Po<`7I&O z!X+h)3An<)fe~x)*51R%-hI7nc{pnwhI|V^T19%FlE6a4LeCi|Yfr7SZMfcf^vd}{ z>iF|JalUqKqW$tsLI$dhaL~nBJ;Nb5_eu%)7%6`5z5MjVL8Iw81u>~;gQQK#Xubi) zsDUWV8FZ}<FI;5`J!ZY|bWSISsbP+ovBHPaS5d2L*NQyE*?}283Mlf3+-kF+xVZ@= z0SfUwfO8mBJ#Qko$-kH=MxmkJmF60L_FHI_Ap`+^$POurvA@e5NlMcnXN9YOOe!fp z_>JH#v=<LHqKdldvnh#%doNo}snrxZ$4g$TpC{ie-myQxu=geLJMIxdxNu-ukl5n~ zF!Mg<&vCkc)-V5eatAlBg8^jkdr+abH7(A??dCaGT8vBvYt;_L<DVO6>%sg{z~EY| zVnD;~(1CB2jGz}c#EDr0SG!E^e!f<9Se6QW$~iS&<hJpAo@F`SAlB|%V7pNr%EF$- z;g0R=RS&R(a_+8jySRLP{93;$S-5YAQrmL0rj|p{|DHGgu=S=|<1u_6spzJ|E{TAa zk0&ZPo_zR(<oQZyuS1<g9l-{t<|xLN&mFQq?c;PQB8(EJeuEapC>hEL)=bkLExASJ z1Ced{)~`tdMecht-ZIkp>FRy!d~gwiT&?<KpkF#T7lsU48~>To{NG6$^&rWy{z}hH zVvj)0ZA)##D@_N;)!#B9u@10LlJ@;dLp%d*b_;AxYp(pjU1bp)dZ?1g=Qw<4{nsdO znBG`^j|)k8e4^GeIcmMwh?={E@QFpVdx^FGojmY2WqVi0U98uy(7Gr~tcV6H(RsR1 zSoC3_LPJWdmiIwKFoW0NllJ8jr}J2z&GLcl-OsaP_OkGCB=qL$uk_Wlw<7#LS=bS< zf$z*n=VsF$weSqs`k%LTE(OI3nlmGnh%?_<lg<bU9vcnA%5UMPbT_B?{*fysRO}{v zHEi=BDLzFO?^^ohuakM+f%uo7!XGQ24M1TgKkyG}J2XL=*B(mv4jx@TG_%UOAnm)F zviZL{O(HJ-L)~*!WDn{mpCYDH!i~Ik=_+aL1Qd%AIsxcZ!(8jX8en1Mu2B)lmeIyJ z44eQePdwGV*u2f2r0PTC@ipFK;IRfiX1sx>``#w3x5A3N(r5mg{zu`S_ko|6TD~I0 z2CCnj+OVqqFmU85aR!oI>gI-YkM-t-mWh^tW5s}D+<VNBe!QT)zt~=9CX!JLp$`<M zrmi^aj@Vm5Br`sLBUAg=ZMhuAHDvw<nCzDEuKkvF1(19WFv;Y9iEd17QD}{Y)^8Uu zGlbG^dv1pfh_NhosJhrFa`*?{Wbk=BYq-8#BVaJOvm5@p&}eu$+wQ5==)DeMfPq*H zFXiu;1n1ICWU>FV5&3rYp8nNG&pKjn2o2xps)-nQ0m7BI<O1`#o8p;l>Fu#zt8UmC zHn3PZ;=*YprBZxX&NgRVYwnoRbo|z9ehzC(dvV#O^itc)NV^EK3+s2YvZU4OXx6vy zJSl1Z)_i&W4#l0<Qi1N<EmSFR_^h~h|2JXp!+zHm6^Y$mbGQAICn${X#bCuz1xd6I zt~N_Pn%UxPwCtO`$CE|@(uZMG{3k`wmBF_Uv+Pk9q*h0LE&QG<4_ygUNfBf9r1#=` zY>_=S7j&IW!Y^<4W%+3~8GLz+)&H#~!54;GHgCEhWQ*4as5XCY7B+J~nE201<$twQ z7iArf={%N(e9DYh``^v2dhZY?NZ2|x*YTFVs<k53sotJ_m(xnxv8?r4#_+NIiAg|~ zYN|vUyu5KR-&rt0XnpM6$ecU6vCPHs%`>()!H+4szZO2GkvMrgpSMIt8(3g6oNw%H z`AV|pr~0$iO#MTUU$T7o+xUX4Wy$i-&)j6%s~pMK{2$VlS#OLs-$;a>h1sI@7(cs^ zwNV}I71m_8(roYq`;Ks<Xrn~2O_CNPKLdA{{I70b(@jl;j25Ehz7}g!ILI#)U3B}h z@SY49lHdndNR=lGOr0%{p6^DOhX^=iky`Q#5W?csv;GlLYtOe!?NGPcbagp5)t5}D z2+~JATrNBD&UNKm?LDDkj4CTyb{ER?*BQwU+hDeajCdR7+DYrwTDd;Msy5!4^LTmb z8c;Lm65bykpu?{ui_Y*!r$fndKfE2Yk~B1gpsJYXbvMQkoCYH9*R|t*1j6gxx?01< zs9Zdpu7*`e^IJ)9TTe7m4OU}{2bk=UFisQG$anDDH9QW3H>h|V<eKNaQrzdDG$s8y zLX;O}qnTB2BJQlfA;tP^?lX?{?ygF4*5gQa>+#D|vISG>mAcBFm@U@}1UXjC?u#N6 zi$sV=6T8b2Qi$!zN`8yk1Za9|fu$*jGaIC$<O?0|us#J(D#)BMPxWJL3yCAMkfrSZ zUSgFVq@E<`o+Flgke((X#QvP1JbBpV)fK}UU9J};NqFCQZDrstfuIt`$^>JGUOX0N z`7=f8e@*pg-M2uRP1&~Wd+*)ucP&pXehsD(I>P9|M^X^$G89sz2i;E+G0hMoXf#FS zTFzy}0@#q}jdvIZ8SM&L13g&91x$2Zi51S;X(Uvzn^aJrp){XaS+Db(jN--p&!#{b zA34X4jkyJ~l%-8AC0heK8YXU9>J-w<rn1<-B8uJ^D-5~Pf0E<O=&;u>ij~i18w=o) zR5OiByOg2-dpRyC%V8)=N|xVp=Gj#BHClnb8O!}-&*3u7U;77hp6X63y>GV@myW_E zPe<(*=e)6BD=Z(L37i}*hVMkW_6CtMgw)OX^e8`}*-;8U9%e)}L>tb_72<4W>y#x< zm(-8m5UzM0%pPRPF9xaY*3RQMZMhkHa5MsuK-F}4Gg0zP{i*5B2QVU^8(oz3qVsJn zSdZ}YLUA|zdcJ$-Q_2K7D0hdlqObSmEj49UrmJCU-3LQ_rhgNg?avEBeb<!oQUV18 z?M{?J;y7qrazwEW(qB1s?(N<PPgz?Vl3Z%KN>4&PE?W(2w9M4^Jz5sQh=MtM(^Bp} zy8T<xXo$FOt!!?ReVx2Q92a9C$=wJ&`^L6|JYT}q?uhi(OI6EV&L|FD9>F&TMt5Bv zv%%80>A2*k6^Q*aUrC#;UpqTM!}O4K8{Oaa-I|}+H{q%@3Zd+8;9Os*`1LCa!q6^U zm&2ZGlBkD=OZph{%{VeMqY5BiDU-apUB=<!w{~LEo7ls}lC{kGk`vS3yy|QZCA~^U zTjFa>Uj-OooTgfV2{Ef$O&X}fI}QYGTfVgoS4>`ec`et>*z`w+sda*=po51D!N7Aj zw0XnHYh1wAFlwFGjA&1W-4o%BaUEj394#^nvrkDwN69U8e!m=6kqSHBk9*rHOXOOs zxJss0yq%ApNDF<9j2D3ARM<{1uH{WtrbN@v)?Y>lYGsW!zg9SwNQCzOnG*3|Rks5( zsGH%$W96eO>Z+7cSV4O-5j_x4m}Q$p88FUb+V*>~BO6G2rKBA!lW>@^$bLAKWcmcy zP&kRMQ5<X)2LXF=^yoSmgb^$|;t%orTjW+&i@7w9)Z4#EVa$7zIT6zp<hm%=9zpqn zrF6~bDa9lAEouZ-U$8PdWWm<Q8*{(V2@b7)#UI(!K7DHO#t-a7q4iu-RD^zwJPl2W z<F)8CY02rsbd!eTjWk@{PyIh=*InJVhYgsOl8eeOL`z)TUFqE+{c(Bo-txD9Z&<Rk zZqtY|Gu+O{^!R-`5wJ>(1cdqJ!)PpL@}vfjzZY2y=H+u3)QPPP{$6~k(~|jI3UdJ9 zajnJQb{5k)vFC{v^&$n!erJRU5=kPhRTBP_nJAFj^)}N?YV~8=4gGU3K}U**NZ!^Q zB({VaQd#m!-RP36_x@(=)m@3ZqeVeCDY+B5tLL1Y2dgX~Hs~hl^Zu6x3Ui;OiDK94 zFX_wv=TizI`cpH=zs1Z?K=%2aOW&8QjHW86hO1z*=n;31d<37(D{iBY%?ED=6iCBH ztp~Noi*zuPPF9YsSFxRy6K1=!X2_GxUG6OH-@_|x-cUoMfdp~s?Iuirnk}(GI)yQ{ zfZfV;M|Uh+Cp!UuC{Vf38lGiS8zMFRjr543qI@945%Mv&kYa_HKO00fVL|+jEW-e$ zhOi7CVF$xEB<F4LQ;%ENkZP?`(hu>BM6|TDP<CwS6Vt-*K>UJwclIlo+KS4CsEMoT z&?uNmKDAZ$%hx&B@ln+ir|&oFqav^`jh7=I%5DyRHf%#)DBg=zpy;9TmX)MoyOFK= zeonuBisVi9u5E?cR-M#9<7rNjc9oD+E8DSv72-NY`v^~NkVs>6(3=X9ND1{7mw{RL zNtAt@e$<>keBP5_Tc}?dWba_V@LqW5P0H2hRk1&sBL(hR2?<vkG`U31cr21K4$#=O zo-6S`Xu=1u-dTRt)ci#Z+Ya7(3Z%4_t6)ic^5B8!UnbD~aX;b(0H5S9EA_XY9jzL& zsw3a~9IwAb+pRggKp6Tk8dd&*4mi`x_fICHtM3#<`(Wzz#@J%B4AIc0=@UrPOkwdC zTK;zXXr&|(`IPR1ENqnnyC2BU$=9q;u`nd$s7jtbduralSuL-UEX1fPq4})JZuV|P zqdhhSB$UOb;T9k#Ac1fg?5R)fd>qE^@7BZsVnqVs2}6t)X-;gWh!!uTfxG*;U@9!p zZGB3bS;cG2wj){RtVN{DcdK%x;N6ikNWh|;Ep(TpdgA2Lj1#>kB9=k+7UwV*oUHlU z&#Fc`wHE9Phx9b8y^G?Vv}J?!2!rWyh;|lq^a4MjX>V<^r+WBnigEW6aTM4(=0<9J z(u1r=87CoJh7Tt6qsL|i(|H#z1{nJ6J9aKy!A&yod)W+H?uZ|KP)ZbnaMjGePqSTs ztl9en1Sy*=7XT4BUuT8SWQIeqqS{4SYHALxrYQSCd0WcfBs$kLYarlJ%dsIsv$^P6 zT91V=F$S2f1m-OLbKNuhyLIn|HF#vDcg1_QY$taD=;Ddpb?HL#qzH98&6f@Wr~77e zxDzF-3vPy{^61><*4aQF^v{6$@~QcFMP5OPMP=B@z@13ollDp~k5i0!%)B*S`IUCU zV6}c$KR-6^E+_N>&=QePrUcywigpY7yL^()<FuZouJvFAdmbE8pmpFmM7bHsjF=y7 z#P>+GoNs2V7LRLV?tt2_KnoSgVOZLIaEm`?xXP8CRW0k)cb={!`$k*xX&fjFe5Tb@ z>E5%?xNx1j`d+8KdV+3FGR|trWd5r679*?@$Au^t*<2-;w239UM%e?@%g?uSW351e z#tdTj{-_N{2buNhb)OKON>OfES0mvsQ0PczI=5HYN{E2hSpcr7Uh?;M<EPHYchI)| z3Z%<3sVp9Ayt7Eu!`XV*uequHacK(|P<Y?+FBKQx?5=Q+wg%)dhtg=HRMSx?k?+}L zuIqw84dgeyU9;$h>brm$HJcU1cBi#S!!AkI?E>t1c|CWBh<4RLPGMeddI~_<OWp-( z)jIAvg=_1mLS)^r!Kz?p`YXD+Co>0*xbAG?vY~x-r}@XAwj*p4Vg7`W{CAu2F&1Fz z+VafCqSQNikVeRNdJCB^V&lI=C(8^TPL><8Pa<nyat%1tp7<`gAAw1`)DduX`4Xn> zY}m9XAc$y30Li@*$7%3b3+fr@uKwMWPNBeP*{Vr;L+C1|=jbBQ&U8!Q7b;$bpzBmi z1E|xOM(+cV8s@zjqG;Tq{Ks?<nIgYUXY)r*nFoPs6{?_vj06;k2C^q*7Wp-+g&g*& z$^PuZ5$HUMtR&RGbDKo73=lvOMm=03@4Py^IS_MKC`5xvK@`!FxoSNTLxV&?kv)+H zWoBJQe)d)NXs+ohYy==vE(aodKdV^8#yJBdRzf#WE*LjmZI9}r;7jGVzU#S?aN=ZJ zWi!5;)aT_}F5j-C)dLidoA_V5s**i%NdjFVv4yQy;**2oICbtH%z1~G$IlOZ@X_M) z(8!zT-C4RFu167sEcIjIdyzR&<Bo++HW}xFbf?*a1V@n!ban0ctIs-RhgvMo`y&I@ z6O9iw3na{uB=Hkfe4B0^TeVEq<3(<Mptuz~T8@);^K;Wfv0f{>p_w-b7s#>YFc3qZ za*|lgl&3MKYhAg%UnJg`Hy{;Ct%*p}QmJjP%Z)Q|OR(tNoo`9qY_h2=K!m0W2^WQ) zR)x|FbNq}*kOymYais_ZR@kjpBX8>}*GnsmEI-qsi#8B-pFB7!EN-g$R(QMhRGI4O z8inWnWZ8ns%@R&ft5#&PuH*0hqvPUV_6YyD_~Z`Qc%^%nY}kgc^=t1dx4z^xR}#h< z2}hD*tKW-^S&fniYv?^lawRW>HWut{&hfWUysgsnPk1g95)5PA7D#EPBK^n_FR3Si z-*mS8k*CxAniU|-@R51V5i?F$usz9|&x5-a)Z?28>P)cXy_?|@6BlJk&U1iS4XS*; z559iUaC!TNWqg@jpM`7bxb0MM(d9eqhjP>WwE5B;P)C_>mqHhUu6%K6lAFfqK<hmG zDIndqEVaD7YtnaajXsNqyLi+RFTU(KT1{mzD^^c3x(SXBlF&v;S&bLm9zo0I?(*iK ztgenEFMsgK*#mT^G^iYzzsJD-ZjM2~`F0gXtR83fC_EHk#1BO(CK3`WqS~%;CcfnV zqMO%ra*BU#IhvJFWPmrzGq_a=4Hh3xAFX&V&o`2rY8P`WyIaOtt`p{ZuM#L1e~d+Z z<uJHQ>Ho0t9vxYpdK~hpY4={l#NDl+=S0^!fwpI9r-xg0Fn!f%UhXX!oya4DdYqUs zBfWSqgcLJYUa#r;xR8t4ayUdrx6iz}nNi-V!@GnmQ^2nG@em_A1Aa>_lm#46tdk<< zssBF6(`5>h1cIgYVh5nEkhUfD;0{^=mpAYI{ER`OMLz}|7ZO_#gkYoWliA>j9m!F; zg$Sb9x<d}WUQWyo?8|r@;ZF&ef8IH{k6;n{@VISAg8E(pk7LwzTE0g)V~_W;9nP8> zZ{eJTXjAvy$2Wzanr$9lCcQ*~<RoR|vz>WG@42+#P#-v(BVASLoo^iV{1x@aAmjVw zcgkW!;B*=~U8^6zBHsqPI_;C<^8F((5bz;nXLtHskXOQJACk_yZp<jVZO*J0DeUCV zeLf|4DR$jzi=O#feF1?KFj~6jiETV+Ov=z5XYA3{mZtp5runTv=_^-(aUZ;rdH@vA zCbM<!ePf>zu~XTZqXjw-UlW8Ke}15#*Lx!_n;CU7ouj$z<$`^nJNr11^{f9waV#kQ zA7{3Ii7qu}c`*{21{>38EhI+VTeiIqy(l|{1$S$Yy6kUo$7gEi$>f?mf%L`PCRzX# zk2ZuqV1Vt(XL#jv*DA(wu?AkFj1k4wh;M{Q4JB(B_M>q7A_+Wi%Lr6`rPLOdqa{r< zunG7O?OiuRgi`vLynxT)>mP*PP+eG-<;Y7Zg2x$wJj<u8U<Ij`@!|=UxRZ9X2#Sc# ztjGJT{hw|B?`iQB4BrW_(db&<HyUb{!dFenF{MqSL)SkoyPVn(g`L<?awoHpi#eo@ z#G2qoSKl^LBquzz4LWZmUK0i*UazY$Wm^n=+v#leyv=u6D??=uErs^kMNqgUbMTt? zeJY@$lTc1gx;U^D2eiX4U2SUMg0{yBFZCAU13!QLFwJR^<m>nOF6$!-b}?(M$JeG9 zyD832@x=|lSM(r{tz8DoY4h`aR3+Y`QBJ0cJu;LAcPtOmwt!h8G}SIbiHi5i7ENDB zYcP3FOg?XsHFfO#n?hd(n$cq5@6e<`*u})GpZ^=a4<ShH2kuN6Z0ZU}63lII<G&fo zJmBFZQ0KdxR-=7y!zS~k5ioPo&(57*IzAxFZYZw(9B(q|kLmI)O<{Fr#>niAMg86= z1paw!^h~Y2;@z8w%`zCCY!WbGIQ#0&sY<;t21&bvqdH8P;{N7@?pc{)mCb}4GFjN@ z7Rev3>7bjA7%Oh%Li^(3o3qub`&h|0q^x_<nh6gJ`M;~Vfhhi9eQ#TVT5OZ|^4BDL zk};*3Vsxo-uFY(fvYXz4Q7+DYx@s#UJznzcSp7V2Q)kOBVY#$}K32chshxn!$+|X( zJrx{3z+S@~&F+m&fLKh`{qn+rUy<l=Ik2tUoB@%6!b{9ipNaT@$aU?x26E<tr>bhj zgg8U8E_bvaxA(zjtihQ$3dJDKcGXYJf_&Lb0ySaQ!z?)C08>+?+V_A3`5nG3+?*?y z-PeW<V~c&m&qUmMPZ1+%aYEn7+ZFoiCe*Q5YQ8)^9c6EoNtmp4uEy1uO-LAkjK8h> z5p%5==jA9+IgBEr+;WbiN8NDP;46KjF1fA-(?w`ogKEDsUyS?xI08*RYK$7%2ggI? zQzgzn{GbCMuf{XRP8a@^U;D2&y4XMrzs`}c@ZW5N|M@Gw!AYx+o3<$%W&T7D^WXN3 z`#R@yn_cp6PkQ)w`S$F7(>Vb>LCC27&*%Qlt4D=kwKZ8@UHY5f`%f?TJq}!PSZBER zmwD6wriad>O8reJ0A^Tpl1%%5zv<uH1OG#SGTt#f_&oP#!sGw;bt8(v=@C(}snLG} z-TWIH_~ZT!!}IedFup^2f0C#A-@jy(CfK~ocATC5$5;GR1XuXXa(jLLYXa#%?>;L7 z=(GaFS0(H}Kl|%f&wRl7T_MGI8T-FkkN)#e<RGAt>*^lp`X68MksDm`+ZDCO`9B`= z|2s+kcar>%X8iw7lK<UF{<Ajy#jF3_N&bJoliY`1J}0}+4FiDE83Q@%IUef*gg;XO z|Eub`zXJARBNZ<*8vR<UP=EuQZ_8Va<~^7!?pxuK<=t%^w|#0oE_M*nK)xIaq*%2* zz2_APTZ!i``BU@li!}em<YmZ^T#Qz_$WV0lYR+TP7QabEBF0I+QY)F@<+Kflw7wje zuzipu0JAmpsjuS9wn@0PN`G1FZ(6K(=Y?B;(-p!o`B%?f%KAp6T5Usx#ayRBm|2c{ z>V-0gp{EBC)MM;WbGEU6X8|Zix8r6^&CdTj3J+`}Zs&R7zCe3s_)4tQC9g~1JMx<K z$F@knoHAb(#Ba`h0Qq+it8u%vls!<|_cREr|Lfwvs56A(&WpXt+5IbF!?~*5g%FO2 z&s=pp1?<93OCOiGUp<|_2ZdgBC;_+W4Ach-!iFF=qRXB8{ERGCwW8#c-yIBYEDB#A zKcEw>kZ&S$H2aGWJD-zLuR$sE^e4;8=v;GT)etZ&vg-2HF@{wrL{*upfOC*ZS8hIQ zz6nlUm3wr?;-9(Hcohvp>5Lb7sv~P21X#?kmGy8b&XGB~{oM!2pMOvb%YFsu&_Ev) z+jU!(siy0{qRB!Ay1-#k7sD7G?liXm80rKZi2HcihvE;~>|}2#)&EvR|GzbyP#h?! z!96<w8Ve?+1hJQPjkuM|27T?JhH`|UzJUEu0f)T-$+J$+RXB^~NDiqL`_zARk|15x zpw4B8p1R}=Ac0HYu4U3dxza9JOW}78&}T2imEhHM<~q|OtanvZlFWD1v90G^AEmxS zOM;m4s4d3fC5uXOgd&$b1FqEfDs46Lw+{xNgI@TqQtET%*7ViYn#GRrj-`~NN@wOv zvZXcTrC#lOcpMhRvUIW=y)T*tA|4T==!_3yvO{~4YJen117IpO3tPDhCplO@5GSri zp{ulKyln;ZVXyrNbaH?WG!!&0Qz_;*m~t5xzIEnp?DpucA0}$UY(LoZFQ0(FGdQg2 zb@J@)EC0-=*`F2hZirhh{P4QHn6bhM&?*DWlv_!wNShPL9XQVsRR++;Ri{h$0Fi+d z>+6P+8E>pOqha27(d;V~ZEm;Xh8+bevAl5FlXde1e(RJXUt7d91gS5)>{e)`zBM(r zJY_R+88=jKgc;ug9tZuS?fSkQ1a2U~u5p<e!1!r**y7P5Xo~)gh}3EK&6vq@%Fbg_ zhI8n6i%_Ps>L+ARpAT&;GwF-cxpJMB8Mq>{vq~>QVBYT0y$QU5HrVokrU+qY%5Fil zFSg2kF;wv5e&O?@r^IBzo~k95BNG>-7eenz3{nrTs$uOe^uUfuql!_-?NF^c7h+bu zoEOb*20tpTtJiqEF@ioEfW)k>&Q(o?+BF@$WQ7)$+~N4;^5Y+0o$a~n4vnZJD*S## z1eO=4nC#`XWUM;o#1@Ws_9i%QwRyQ(cLk7(-yg{xh}0=x?E=|6TR1O6FBi;x_nF9P zVGgNOKZ2_g0Q49Q{Rjw~GO=V5!&;~13aoQ%_c9ZR1${fM(94^)iqJykPj3UnP<x=u zV7m<68^y$4gfH!!i+Q-}I*xO@KBat#^YdNqxJvs5&gp7w3`kdLrC(XUixK_0>W|;V z>OBAE?xhSKAk#HU&S)$O{j<vX40g~7czO;Q#OmX(fC!km+V*jbx2om1f55Qj#a{LI zBb7Dx9b~;-H43jPc52ayZ8{K?@}mKa@`FN1qn)UgB(@1dwvH~&HR*Jy<*JJ|Jj2$m za@At`XT}NjhV*4kc;9n11$JPw_S({C?j{l;tTb5Atu)z#Hc^K7^l=cAYPffFvXX=a zZ==dmWnH^1VUpJ<y<RGO<zQP!tV+&gU1$`X(>M3CKL-h>+m!{O+yGul(x^O61lY+p z{<rpuR)%~UM|C(jy5_g@5L#o^KKQh14V_w`$<}FGJ^OQ-d^H8r-VdMd3Ki7H)~5zR z&_32cYFek(gl=df5bCz;Hl5C3?utj|J)NQBuEB{7sK8^6rlWCDz$aeBV?!jc8^si4 zsa>h63UO?ApYX(LRKJ3mivMM2)LaYBj(FU^T~8%6e8017xp0PEyWZ>*g+y(y!G6*? zo0270>a@*V9_rwq2}l8!MlaOQCO%i1U%fG$dTLWub_;q2i!BYRwce=HsayF5xuy8` z=-D^DF59Eyz6<t6PUhkC1nJ{Fnl+kaC-*Y5y}->6zgw4sFwO~umsWCB;7qMAzYuGi zb6L<(XC&}g7SJ^e+KPODH?84RbOUqCDc01A9ioH6HYN(`o^UMLO1Dx2bj?+o2sq^) z$&gU~+Fs#ekT@y4!=XQAK>xI+n2yXDviA9a_;zmh569?a&8AdpHX4zv)ETE;<)-OA z?|Qes;Syk6G~`tp%J6(BDpzjtyDZJQKVE`y>GNqC96<qMS|h8r>N>x2N*>y}O<3O8 zjtpjSit9_r61&6+wP3;em9*F)V<>vpeyLfPucsYR4~#iW-{4OzWDBJpC;qV-fMZbD zy=!}E+>??|YzWzRjWGb&T22X)3ejfV;J`mz0wkJJ&%H$T_gbc>>EOG$xe+D{;kyTn zkbxgnwxU@bJ%r6>`I>%fIfv2CmZsQBsKwYELHV9#;Mo;2`kQ-nBj)ClQMGnsSs(Td zrMZ=<C$1HIF$0mbNr(&OfR_$#xJ;nGzIIlo?+5FTz`vMEOE0S0s;@zb`r<LJDv3O5 z$Xez?wArLBkuXl!;kiMRs1CcK&6rXOrxu%u2Xj7bC{1M`4nGYfHn2gQYf3RAwb!1? ziulCpv(&5DEc7m=ZdJGkf`UDUf&kww^fjL|pIv=WsQWcYR$7_b#=EU<AkOeq5^WH* zu`>Ob{jb~keoN59JG$Zfnj?dhnNcFG2)U7VlH;|{Qx4Ho$f0JX{HV4pP}1z5=ltmv zDck|P6vJRqlYUc6!RD`OexHFAPQ6Re7m|kcK@>T}zOSvXC|5)ULk<V!r@IsRKO1;5 z&p#Uf_Wo!D#!lzDHLeFK^5J~rPI?7c^kAj7O{3%chH$=@WhTT(IX>TSF=-{CO=%Nx zRl39-34AUtm71QdmJ{3#S<*A3_CFrX3yDJqilul~wR8J&Q@x%aYsW@qz>oK7ICd#H zs>ny~e+)8tuB^+NYhHZ1Z?@GDV!C?~YL|p&$t7*{oz-G*TI=z2P89O}U~kH}JJ-(U zkhQXM1UE(4WD(@nDrO7XHOt*H-&O7XXn^1fP~m5ssXoU#&(wKyblx(nE=OibT+)@w zg9WP}=oTB}x``NrPp3<b<6?@nTen7vsG=`^d!Wmh1E)Csr6Q<HQ2|_{lrC`f+%GuN z5X-|7h04`{=O2z~2}YXHPHge(o)xw%ML<aLnqynKD5X^L^hDiCOiOY;VHBSc>&8{L zmhmox&x=5=O_3RNeFGB|<N{YQJN$m+n=<9ZwwZ@E+&$pYIIAohj~(Y-)tGXe8r&r- zfA4E{zwLTP{DDk(S1fxj4prlKdy@zwNkF6u`I>ZYIQRSdrWWgfQ-R#JsY>LFHQC?L ziFxp(4IEEDaX$W@7NT$r_eDYi(y%!Y{E&iy3hwFZBZQ%io#sD8=we*PSt_|jK4`mQ znnX2clHG8E%YNhbd*%=#(OtpZRz>b9zlU(b-bll$um3|7w${s%DG%)@N&O2xvcHFY zhJ_jgJg-}Ujhhdj*sa0NMvlou#||s#;C!@sjMCT`4MBTvj=urx(#{dOP472XUexKe zDiGdk9SdvXo*B;d!wFV{pA}bcomB?$vTNp)(L7oMp>4FHZelj`a_k!#g|7wYnev-x zVQlC{J0cR8lxSzcX6X--YN3&h*lSyZA>~D>W{+j!aM_l*WQf^xYakJMOA6;Vyh2Wu zpR^?(9I}pcdQ)T67BZ1#eK0}++0lV{mYR;dTPTsJ4C=O=++aFbE+vc0)_l;rUXK-2 z#8KmBG>_G)1I8F~L&CifhG&s3Yoo2U9g~yX4t!>tkGzGL%oz|$>J@Sqx*``v@F{sC zov#<S(#Mm5LT%knPo#(VXmsJr#;EPj?G5uS8=D_%M1rptNn;XPP1aATp&(K`-vlL) z1Um$t)GbDTuf5Gxs2^~PdfEf#%?T-0C?&3y8Di4wQMneOBpY@@zc=f&kHhn|T2gPW znZdBwiUNOqhts3|Z6LOaUg55AMJ*n~Hq2)!%|qIF(`>~ei%Ukb3_dM=>R@mLOYkQM z6Jp4id8%+vRCsx;blZ%SIF{W|eBQUhw=`kK`2g<5&yCQo93t6q-QFp~Cu5uiOm{5g z<GA3{Vf`M#kWniUitaeq)(5B)C%I$tdsgJtX7ur32B={J_QCqAeLxSpRM2Y4l*Fdl zT`&E9-G1nS^+)0Ij4zPz-*ddYK0ohSYQHQDGw@nx%832ZujrgIjhq9K@%<V_7L1nT zMgIDci~)@b2MmI~WfniaCp2hQ_udaFR}I~WEqeRdx@J|_<*<Z*?`On2?}>6*7H^9e ztMMOv3IZVCoi9pJ4_l9C`BS{>Sq_SmIQ7Wnvl<?@Rbjug&Wlkx7F9z@@gALgR_<pT z+He(_N#gZMln9vh+H;i7t6TgjQ@)wb0S_=5ieno8WhRa&fb?e(Ja#_G&UU}sD88Uf z`o~6AOHbQ1^V)$ANM3BMphK1)Z%VaqQeR0yiZqH`#bOgs^CoM*hAxa9iMZMrlgjJ9 zNOEUE;q|Ngo%ih*h$!{nU~{FAT(e$8$pd->&bxMYx$#o}Z!h!zg-M!$*v;h4_tqjo zhrJ(}<UJz;ciihG%tmj3P{8^bQ|Fh#F2jtrF2f<$&Ra!Ll71ki-J14$7DP(3MJBlj zYuTvqJHeu|jj|K%+5+bwa*t6Icb~HG#$>D-)_HuzXH3it_^=k^8*%MU&gC51H5%Zs zRnt^Ob|zAW{SX@ZC+_-nHrW>1FIh;tIVuX664VPRMLU7)+rD^sw>Ms3&Rys}omalm za^gz5lym`|(67vx$C^X4xpwfx4DMh;j^m<Xr8H5UvY`dH!PAcFGvAI45tzRr(uaSd z4pt9Q%h_AUzH?4)`oRUsXehTZK(BX;Q!BCJH`fJ5&5uVN_Yb~_&!ZARF{q_my|siK zpZ|KLrnjr1y7W3Nzy0_t7mNHXr8Y%~L#tqG(B1)^(Pol;Q#pG{UO><cwO|1z<tb#~ zU69sY4sD}qy^`jUj0-nV>ysq>Gryv%trCt-FzzfG%Uq-%V_3DuNSQsSCyg|jMmApd zYqU^L$xD0B$+wb-oWuyb7y~_{eB*fs$9LyxCka27URC%0?<>ERF7ZCf9$Oq8O78vj z2}!PbL8*HEmn)NE>S^d7{3dY{Nufzij~V<<^68nwCHFsG_gFUdhMw(SdCkX>ZR^R> z*v~e$Q8VV_a)^XT9Q^Q3uHD?)O|p)|lW__H1jN&{nWsKVEjwg6%OTx-#;kV(TK9C6 zH;-UzWKgZ{sC4GLhQ4VYB4b#Qh<?s4m!rO=JC-d)m{Qr@&b>m-u7$AGdf0uiWW4kI zbNhwXn1q8F{DH&R#>7@h>WFq8dIcQlCksTVoe145KR>8m<*VfTk@VQcf#amC7Da4U z%QFI}I~%WSMUXXzPFY^P9>>f~`~P^zQV9)`$Q~O_&>9uKN<SIS)RRRkKDi{Idoxph z@p!*yLQcBC(pY4(4<zQ!TD|aPSsU|y$D!-9VQSYynfS5ELjVlZVWh1hXw^Q{PQoR9 z4z*ad5BD5Ie7S3J*(V1{)t&s~uWUs06VO>wk!soOwMi2CXE~z9+_AfqLNH&{yO{cN z{!GodJ)#m`Pj*^i?ip9_thfCYQ+?$W1@(;ale{c?(u~Uvi7JD+Iz+P4TE?>E#3FY6 zGl7sl-sCkx3ui3Sx)VV1ecu!*ysbovcy`^ia3ff~rCZNcwmRuR00I&?&U#Zt`w&?f ztMa`u*ma}r9uK;pSB0U6${=}5?^#K6y{cO31v+Ftlwf98PMtN9<}d77XoskJ{)Y;V z2C==T)S|Xssg%s4wp~LI*!}g+lXL~QE;<NZB^64LCSK`|9U<WgCCmG1B(Ow^WD;<Q z8O7hgm@7#$oV#{sTvzEBQO0KPUa&9hVJU?w;;AHt22-ynffB0Gc0O%k-waVv`DU)- z-MdeoGe{6ktW~VFsd-EX+PPr8*ZtQsUXXBDy;3R^Uca;M-Zj^?o9ga?3fwi<Ug#@I zX;cZk54w-pgX$XBq_Ca+x`R#QM1I@*V+AQ>2A(uegSkdA0<AfvYl?Bm#?1&sN_7lH z_xhVa=M!ewICt&Rt%;eLj)qkLEY&Ip7!~hfsmgw)9e6d^dSZ9Wn4ANG_MDGRPhrEa zqNw8cQdpiG3<{H{{x=TrKiuB=t9Vd6D1{2e1F*+-?j%410qxjogmBgEbhFQx!Y6^= zOFTKT-05^CKS~^5NlZp7+!1&z=C&CRiqCI!Q`x?ax;qX0-@}Cy((jN8&A3f-uB^QC z<W1(WZhvI`M{4qg>Dy)Vh~C}Pdh40D*$u6qY!Bx{Be;Wb`qck;Y_1vUz-&L?Nn58B zJje>&-20`||70asXX~Z(b!xMZW;^@l>pv%>gq?HVG4s7zy1td!Di-Uv@A9$ddh(-3 zA4|Lkpsd!Ky^cA{imOx7$-+G=jiH+Ja=}R(!$%r2T&rTAj%-G=V)Zy*N-JF|N-w>& z3kz}CmK%5n$r&aQlsxqqwClG2$WG^Ezf(A}wKbPMD`0o>&8t0edYaE7W8eq?T$E*c zW-@7j*YDm;h@OG<VS^wJ`TFZR?n&q`RHJe>^N;fn7HlMqb!RPq{Ce^f)=rzWbc)}O zeEm?B)NuV?!i8wLfyT+RDqCH-+Oq6qvy5ZDfX9*BZ8^$@id!O~Tl=_rEMn*G`giJX zuf5+R7sLth;RuzW>v6IoqjSiC?~AG_r<}?5fknxTG}8QOv9<f!C_$0NDyv9uWY)gS zbP}Iu;umUhDf6u^njOdSU_2kT*0aI=$9IP@Wb%GrI$;l=hQ4P06kA^19a|p0n=fTZ zda|)Z7sPkhuHW<UZxH8ZAW<{1`rgt2@Q8W@cPwtXOhp;dEi;B7dAY*pHuGpG;*$!w z_~E<jG*jr5i3QVJY73onlgHS@-;3i8s`aLrs;x5X2|Mffv`b~Jx~H4v+{p%;19JWk zcV(QK{m(cxiu8NvNGy&=e>;sR3m$Hn6^kB@43y1M@7v(R;QOC98X+|b0Rk!|t-^!X zX*r=~GX+!51@Aj&-DepW+sT~Wb_t^)3gqG^74>~ILTnmYU)FdaBC!Ap0CL97ZH!>K zFF|&DPzv;<x9P@Nr}FI@b9Rm>lQvr$(r?<|@1l9mYv>Y8qt?A19mKsO5rx*dUhvU{ z88|7|<EGPjc#9F9(jsmfH%o%&c3J5CG`5>oRfa;8S6;omAbQO4Xqk$KUENdq^4zm1 z!H-o&%hnmvKI>UyhE`)@bpP00&*9&j`}EGC?JBmB3jn2+?)<3Y^q`uj)5!v`s_T_O zkWp5(&Ni|BWYrBA51zKiTnWCvIm<F#t%qWqb`QByS&^6o$#M$HAO1h=y=7RGYuh%w z1O)}b090C~Tj@qcx}+Nf>5id<Ayh(<p_>8e4(SF(r3V<m5g1CT0S2TS-V^V&p8L7q z@73k~^V_!dZ#D$yI<NDH{iyv|3LzEbZeyBr6WOphq0`KDfvp_?K@zS^Cw9JJ!|jJ( zS%BoW-Th?6#6yLlDm1A*EdeyFHcPt9_K=r97)lj8C`vz4zJ&WZ&jem}OUT}DrBQ0d zac9@Lt(ZWgMkF^jYg3AH4UfqU&ht8hSnBCKbse;j7vqZ{Wp$dd7g77JHpa7>EwF3t z5DH1_bt)Ff%bS-gNUnbO;@4$&e{KKPNNxH+u3!SHM9Gtd&{>91i@LUVR3`_HEIN6W z2kYpI-1NLon;+wiJCWIJXp^ejccloZq@I$46e?tMfwtV|BdhKC8nSZp?n{yNPaFks zWh}BoExTi*_={Dv<IWF%sUWk_F)1|Mwg5~3_ahs_Q;6vTg~f;VqZnSvwiDYwuqUqb z?L@|c9(Lbt_tiU=>N$v*X}V9NV~0V{Y(8g%SuM!rmKcsI4BS44-E%rg)O7Ayji8B+ z0&}3(DDOBWEL?U?XQX~rX110Q#ncB)caPK&#hrNceyNlr^5kfBD8hf#7hbQlykYxh zp=vmE=GjJ{#{rMqB0D+1>FWk6>}%k60Wx3%3pQVS??y>gFet>eF6yj&I<e>}dvpqf z>MmJ+B_Fd5e9h}wYqjPgz`oGr;3~utK<D__adv&r1<dd#^)h)*ocfp9kGGw&+Cr;r z#_uv~EJAb&?J;)(&E?}GsD#Qz3b85`@6}p^&T@MCB}XBz&&SM7%3H$s_CV{oE^6bo zRbUmbH8LT2dG8U>!9C6BVK&K=3BfSmvSUdwhgRH_z^46}tlVnFH48-H=oImdpRMZo zv)9F+4(xi342kXo{~vXI&ZEe3hditAZ^SdmNFaI#pT>~K*(KYJ&F2l@+NJ7a=x+sN zGAL-t_8H}}-X00_JRanCop08JSPA47^e0}Vq89eiNfL0RoAj+28H^qb6`1gRj!r#@ z^Y_=tYmFpk$|ieu8z`Rypi#s%3>TvjDkCX4dUh`L8nqGIsGRZbd9FuDu^w_p743w8 zVqa)|s8-XR+^0lI4QHM;f8Nd&9qWa{_i}pmx`QrBRA2XQK})UA_s!eM4+PNVMxW-< zN>Vf0Fo8)nr~=Nd#m^TBC_XHb_irR^!-cCOuYL^uG7i>YW*M$Myw0k{%vP+&UxgAm zNo<=ETFTf<5pyk{>57$Xlw`-Oz8lsyCaccZISWf6p`R1~uuncnU?uz^S@&HBCT$~M zv+TI4fL18>Thvv-^`uhWCLPX}Lq9}*#{O%@kgK7sk?zWpHlf8WxS`iLhz=T-jyU#a zqQj77&fR$>edsy>^tB@LYwK7Cpm!-p>fIW8lEfwnk~w&^@q3mg`)I~R&T5Jh0It)S z!M=yVy@QxP>t#5j8~XhOZhHC3Osf$d1L%2Ri0vib?mP-NfABYP6DW2>rpXf+T?ZK= zLz=rTDUHJBLF3-8wT#dU1zeJDHji4Wt@7R{-aZHGDIh}Jo$ZP%4@M4{ARr5Oia%ux zzIdr_*7HSf`w-l6;;`4IncjGAE02o8%9vy9GRmT&jYKc;D=0}s%FwVq-jO-s0b1_= zq0+@;yT_9)CLw@soNsdQBl<g-e+7wNEfvD_>pW&1H_5pTXr2b&(HC~ZuoP;SR_*jp zzp@e6*7W^Suf(dIZ(mx$Hd~~3gV*ef0(E`olI>*qj`f!}${(idATqA9d8%~yBa(_E zL^>x7mG2{WQa#xWr8c6*g*+<Lf-jxe1j}xkpMYV<bLW^@W4P$Js%_@@DZ4H2QG)L2 z*o6ppVWBokn;ZAqo+$tE>EH+ny$+(HOJP|XJ80MV#v#t>`>+j!!s$%F5;4@=*H|W; zf_-P)yM~|AC5gu)ppkoOsO<Smuye{@boAiywh&8SLJ$wFU%Asgk4l0sZC<o7VDwP8 z+$dVAq%2hqE<V0n$7|(Tu&)bdRz~ASPV&`1b%C8+S%sOY8D7$+WP;ox`E6OyIt<(1 z;fB&WqG7e+mbzuyL{q)|ac)}W_1?+bhIcJLn|VVYoODMqgc?8w0&jVQ=WzLk9d4oS z?ty|r(V}^>*|$$z58IsPvficFRTvZ9z~j`Il9g19Ef{jS<hKgvb2;9_pv_yzE9Bwg zg8<??dxXx3GtoQE@Z0s$5BJ)I{$1e=xCBr*I{<up8?)s`pG|Fbs-A$&=VYwIkW!aA z&0hLU)n0nF)4_HOx6P*KfoE~+9f+)i$j~=_tDXchJ%q;80st86Uq}Mc6*f9^briAB zS&<9G6jsbSwUrH}pmuP*8)U{U9SO<0oG(>cR3DaU7HB{x3}=a6B#;I6EUK-Xv9$Ws zNSs^nsdg>e9KEZJ<$2o1qb$(lo!$0wYvJ?2$jkwzD&<Mji@wBf!XC!JvrLK*W$Y<U z+=`2$bDF`%Z(A>Xzw7Xk=}5fDu;N28&NUzxebAYXRjt~*7h^<F#u~@5TVcu7<tU+@ zf$`}UavqH->IZ!dj#=g#2csYfuU5T`k=ONYZ{~iSCqi#ngd;Pt@v#1qMOyUwYv}e~ zyjtlo=H5t%3GM^p>>Us*WVt1)_erba%4il0JA>^QTIV<PUg*OZLrjmA`qTO2ITA@q zFnKlBk5-CnCL-@^xpC&!!?n~03v7g~`RX48cGqH?*Y>&VHjxVGSslc~MTG~5D#uCR z#KT3%Kuais7rN*<;8e^LNI-S8zvQU)<`IjffQUgXk0r6k2-pC!>cqP<a%g|&=m>!^ zyiO?KnEW@1$rQ>TiAnKbP)E+T3i*_ed^EpDq4hCFV%#JNa-JPJV6PmBBV*y+o5UXh zs#{6H_&v!1{yb!Y>v&odhBd-@Ps0aUpjRex3@t71zIh+16*cgR4lyGD39nF+XmDTR zVAE=zD_O^b_1u%riwO5F<J%Z>l$nWAKsKabbJgeF(7U^k_$(XUCAjZmQ0fIp=G=Km zm|n+-IJ9u&$!(mg!n2Fhxs?uFc=?;76fz42;?**r`aS?BIzah+c|4d1!*xk))8Eyq zHMhBkR%lVfUr8VZtnVDi^wW`ic|=_v6{B^?tX}eJ3?)Y*qbs>SZo}2SPVS`KpKZ$p zhUUYXzU+UTbHDuYf)KC0nsI@4;mq=)FAb>hvS=OZdU$najDXe;MvoDZ%=<V^4lM_x zHIt7MTOPlK$^yDDvyL~-XEY6Zsw=}x8M+!K-)4c{O&40zt=CF$euW_2Gdys}7j`19 zz$82(np>a+yh4D9&&e!E0a9D-{6t0b^}5Iou&CzR?}feAvzqEOIx}3R19MrA9+EtK zsX4X4wAA1+Vjf=){l2a1N4X_{Ozd&W-5ZODcry%2u2Oza9w^CSLaX!J#;AoMvb_GY z0@i$hsGP0tOu<|)h5Rrp8QM_t91McL;rK?~86noslQ|sAs$Gmd*782VlX6Y#ojfg$ zXVrVv_uc+w)$b3S2dCX5XMr>be^3G$u`k-$_picJOp>IDX_-M!d}$M6k4tT;<DxVK zi#B?7jbnj|;(LCZ`fxF7$j~DPM@GbbIclBE_RIW0JhD)m6Vhjmu=?^<s*t<Wd$rg@ zJDKa9Tec8YqFxxq-A4`$*lQksmUCeOD7l91fcqSdAY}ZOKUr4i8sb^gKv|RsJ-AdW znTmO&JY1+9Md?^Ofo3T1B2uvmdB8*+HxJ6>W%EZtxa9&mCz$RPrgbv+Yah8@&)K2v z1LFZV#3H*qs6%H<ZAh<_BNjZATfBjvcrilw$&bRffBGmzp1B^Qh!5kp+tvB>I@#<} zx;rSfcf@pNG8ooRnZOz)n=t*-Hu>u8X=fVlFG*mv2j_~hQdrbP(*b&3qp<%4fn-7( zoiqi3({9LHZu3ROPWyAY>k?a8M`9ZyEhV<7>g*T}*ZRe%iZoy4WO4l<VoGd@JXnhI zqoS7}lw!JO8kp^xTfI`1$OHEJg=*w)H<Bp}*_A5WOm*n%vKYiN@+{0iVVM^)==q$o z<^d&NJ~iXT>se?s%?pK~q}pvs%*5}E)F2nL$Y@gXtC;VDUn}p5JT|g@BhzxCq8l3p zC?L%7;hR$+L@m5--H*61!>M;ivZU^l--3ec7eo+IYE4i|(VP)jLK{hJT_Bk(tX`YG z(enp<rN!nWP94ZTq)1|yh9i=c`3kh-7{iw8#u~wdr;MB%PhYm5-=O||-3s}PI{4qY zn$yPOl<`%7bBIPss|wx-a&^MH2jf4xS~S@ZiMgj%bREA2krkUZKyK=v!pJE!?tY{^ z+aJ^iT;3R`QTa1UJ+FKy8;fB<ZHYTm@#BHIrS5Wftp18Hd=2bB)wGACeF|HArA1rU zMd7Y&{HU}dNF#|yKyYXV?9A4Dy-$=BidPCjUSBd4uBl+l`@(j7pu*P3Yc~W4n;a?{ zo=zW<M{y*dggScU-r+fI1S&wC_a!gp%G;81%d<Xw!NUES;G3X2NZ`qSBrwNi9bdR} zfB%^w?m0x|<6}tOX9}afluBy*zC=g}XK_gE@z+qPmS|9-ORTgW8zCANJb+_b2f$b` zQ{S-7REl!r^qKKDN2f7OPqJUZ*YFbkCYyAF$Z3t(SRHZP(Q4)NRP|zhUWikRy2#$4 zBVH`TwezafL$)#lciqQs1)7D%@d!gBcYS8{`dX`VWR^&O&EZ8ib1)5oV4aLe(Yg<~ z)P)!TyIttP<wDDz1GLJ&+J`JQu1XckS=V;wk7iRwQwRz>f6d}`Kq7swr9^LG#+6ci z7cW>29B)oMDfZVq9zm{%TZ%Z%yfCW7eIiX12^wX{KDY`)W;(90iK3*NK_bvQ7H`2q zQN-}0BHNNxEFIJC({}1QY(%^eeI`w<+mgFT<;-%fUxh_q%8XV3PpSS+cr{l$j5_*( zR9F2`zoq^6R`L67&Nj1miO7WqTeY8_QZFpCkG2FWN4S9kct+oI9?ax8x0c{wV-Ns| z=gvVI`z%2M2XGf$Q|8&u^=bn1fec$THo-=V{YpkBtBy9$_p7qqix<xvnV<P(KkpQp z1hnm2?udd0C9ZZ6yVw%%x0>qtkD7}Rc#6OR>V-+;iqB<{*{wA4)NHA3sq76AL?uj< zTek3!3oZ^iMgU^Q4??kqM3RL~25!T#+x;3##fx_lgvK6Bwx1{kk@kNkElgJCL`rXE z0qXk|Jl;kyOx01;Jj0uz=>oAT*~D;F7l~gwPq`o-%O=LgRVipl{y~UyRK=B<cK(a3 zqyu$L(2YXf!gTvND%T|rfzGx|5>}VgcLr5jYTF!y#+s(_Et~M7<zw@yW=f`?bLjgz zxmUCqC^IW)r(#+oQ!_2FK@K+_#8*9i<!kKFcsG85kJGRkNmPb$cVvh^m9=IbYX;Kd z5L0Eb29KC$=QffHpUru1(cA?6IIbvLw-PXk#3<xqR>Q^sEj!NiUmBo3Y9^d0;H^&! zGUoMh-ThvgLFScmS&pCW@!ZA1_yo{x2Om0kV-Eth!ABvkVxuL#tF%7feGB)8_tsC7 z3t-fxpb$4F3(%h3Z8=_Y>>l@+wAMb_TkkF%mp7?znHU3Eg>z@SGJw^qdOwif7M%TP zntPPYL#?n8K=IdrL>LTZccustqV0vh3D_kGJkC78^cxFIM06jEfOQLLc!$ah+aT&3 zJ6LE`ehZpD64fVViY7&l;GbK_Dd@TV(!lOv>)>2uj#8mvS*{Zq@SQ~U)iv*h=CUNe znj=zlK~v~0THjr{R-w%utL>i7?aRq?cR`#6e${mPbR$&5X#7Y^&4hsozI?CS-wdLs z=>Nc9z5tqM4GX=})r9p}W0M%pa23Ptft=MFKX@Rt|5dAvpgXR#JXt(CAal}J<ThZY zCMH-FM9uhUm1=cT+bE*IdN#;WE~P|G;kyJ$DCVgp(n%i0iN!9`E7x{`MuY=DbIm;~ zYt6IkS_v+r+!9+1mBi-e%{}}zGCYpWDWAVRAhMmaS3ejja0~V)ke-01m>2746x&Ey z-dz~fC;!m!JV=XC`NoyYj|C|MGN0r7MLpHpV&QrG6`Nd96#KA}AZjNS+^Q2IGfm&O z%;>8&bi#nav87H85I<!2yG@)cR^EK28QFPp+-t`<ZmW(;$j4u-D5(N*xJk*`k1p9b z?F}nn=8L$-RXHftkP)io{?h%`M`*w6r?2FLe@K1HDZVY9E9~<|TwnM!w}Q3XU!=4~ zZhm~@l<L5f3v$1&v`}kW5<F>Jvaya)U_JZs!s?UfK>@=akfzB^mp+8rRATNSe<#33 z+4J4$g&v9cZa(={F_pfwP3md~8N;i>kVQ_%rY%?v=8bu=|4@@HerLq=y8n-Bs5qux zp2&1;b@nCv@u2KmaYecnXYFBgr^wm5P0notZ+6qe9CTLz_;wv{E1B%qIsJJUm^~6~ zKt0C`k4UVT8)@36gtgaEx$cq>RYS^*ruLQQ6sGFkY~;s<`}VLF+DD#sC^m;cTGw3A zGu#=<k^G8SjL&ZOhPV14<CYYz#N3ZMjDovk{|B_neD5nUS4)+*g*6EWR&J^3k}|qn z?%ECZ!ed+JR>ASWVm~@fb5#hN0pj%jTP2_MV@;ZOU80w(g47g}8H>@Tn(O_3J37NM z$SgTJzSP2bEmx4KKvwg9&(@TfL+FzZ35=IW66A+zWecq~w%%HSc$+dhb`<HO;<IF@ zaW2@%2U8%Y0MT#7bJlNGxOxL~LTn+Kn)hxi2{(?hm0l#un@VpdWsNbW81kMVRuN6u zf!s71*DsvO2vu&W<PZM-iZmx==(=kIULnLv6zYChU~C<m2)f?RYG~XIM|l<dL=RcE zj^*rumeCXtfXvnuPaj+8qB7ft_mlt_DKAX2J{Rj0Jy8K#y7q(aY&KWf4k8PBDh5j) zWnt;7-$&9=h911ZegLusHWw}1O6-j02w9t#AmF225}#KUvBJ5m5kRLZqr!L~nI4`T z6=JK00k{&QlTu7QW)7&wMias7A;d2|I~g#&O4~lXeIX#Az120>D<rmT@~F*3>#)o% zSuvSkAMk=vSH>StEZ(tIqC~|5MlJHnaf9?p0PE&Q{MdT75I*m4RL1(IPy6|b2=*00 z%O505vlo=4XDJ^Hd6%Z=&)aAaQ#dGzME83iV{0Z)M?1$&I(i5PZV9ky`g|_QnezyD zo3vV~0FN*UJv!P^mUA048A(~SZQ$n$Ax`f6b^6!If$*}RaLuaUkoL*Js*L%@9PLbN zxP&|y%alh@q4t_d!|SIX(l~wnAh(pgMzeQ(z@g<dd%H7{C)kkVwo=lUvtB(8i2?b4 zW;)Cqh?7u{hMJoW><cA|r{_zmgKl=&1xl1O?-#s*M%TaB54e4|ZQN=>zD)~%`-B-R zW~@5!?&Z^+d3BLIV<pw-V8zfI^a>A-NG4>*$lpMS4cLh2eO%~bD=lkoAMts9E}c_2 zTMYLU6kGXA;qvNHv$*Ccp0?-b6^2{gkS)ANE#hmyc`|uY)FmzSj8!a<`=vXSedT%T zptX!&_|=2g)|C1+4)I`NkF504$k60v>eMwmMbNI=LxblCcxK%@z_hJ{;?RaW|9-)| z;M2`ZBbG<fpy!vVZW*b7wG>f%(_8Aee-R6K9KpqIgT~yE6V8TZwU%)xilK^Yzech} zKyO63Fv!rQlOc+2-c40Ppc&4iMFV!6JT2MQoflpZPt&V9ZN&a$Wa-Gy;z03PbhVN9 zN?{qisc>5H*QTTMwEGhD;CYl2TDhfpOdj2<lvl6CFtPQh4&BIc0I6t8j+o0O#)#_3 z%un4j+PPz)3<{)?FzQjk<iD#W{gq%eJ)H{8N#VVwf}@w8|71RO`;IeUe~KEdDmVab z@9Q&i81$C8Zqw6ZsF(1Ie#%m=ih{2nnqR4z9um_YYZ6@J#L@`c%-kH9PD}WkPWC^$ zKmOtcLs}S|hb$roiLO`&)A}u6$=9D3@|Mj80|Ad99q?ZL>JE^loCVnv=Tf;gxjt0M zG$&L0YvL2L**DASefwLq?5BC@73mdpO;^?hI_Put&H)v~-z3QYERW=$c8f1I<Qk~r zfI)kq+ir_|6>L;qm+HR0y66JtoL6nUHU}C{i~6StnrGGUUNSN^)H+sRI1DjoIA!qb zd;8bFrX&N0kLW!>Xr6%m5eu})+{spdd6{&l(;~AbtG4WR`VcYIuBv=Y!HuEbKPw*3 zKUd)V60iPsZ<j-|fnU+FL29810MDDDR<Z9m#RDw<NHa7yODS0kFe)$$OhTTcog_Ky zHel%ON46}}I6KQDmP8x;Qocu90zxN;5SODZq3nk*Gottu=3@HA_W!dQ{qF(V|NNA1 z0Nx&J%R2*_zsV!~`!&5iW!F$p8vUEZ_Wzvj-pyEGtK??|61pY-{li~>x)}#vxM{we z{=dKWZ$4$YfacQtLp)cnzxl;~pZ|jzI6FI^HR12w5||{`-~<{LJNcONr!4aS_pt(W zPRSm#8SPI=<A3YPBD%nkNcK8q&+Kpi$z=s__P0Y>9KW2a_}`~gs{<0J;rqN!^tb=S z^wfgIB~=Fg<~jWDv0evr*IkZx;)8$tPuNcfWYnUof6x4Y6Uoj3K~dWynp^+vKlw}B zuKnJ9fP4E#N&Zoi|68&Dw>JG-^!`zje>}<WNXkE+<R4G+Zy@r^PyfKJ{~m75k=rRa zl9K$UgTHr3i1r=ibB104;~q2HR|H>0Q%VW^dY0)glOJ#%;E&sXFgR^^wVxdCnBnYf zjbmpz)q|IE5vhXC4~~y^UM!<`LQ^cMBSjF=Ce7D-<$oJ;A<F+CgCV#DbAKN<r=9|+ zjq%LY-@=-wm^8&4fJaO6l)>MJn|<KSU-wo9JpP-LfEC>r5tzT;+yC2r{;z)xu>_B` z=CiXP@|(B#2acsKSl*(GHxK#kvwt|<;^f)vz4>=*CjRH30Tt|k37h@7tMLE)=<km5 z6+D)z=%m>GZ!_w&>R!9)1c`emME%=mUjvWDoVrQ_l{s}kn=ka}{^A1ozXvt`U+!s& z{WP1@J(WWIcZd1wh5|gnBa-%cgg5`q4AsBG9;Y}Un{aa{<=+nnM8RXdns1Pq{Dm@3 zoh*-EcoU;e+rH*kbI!hUmGZVxmX+$O7xWLzC%;u$6f*0{X3)nxXiRUs@?f-x%>1Q> zBSS_=26VDUe|0YnBif4=0X(r|qOO)Xs~gQLqTPubDf6xtIr@E$i2odV`Fi@25&z9w zG6QcZrl(0}>=y_4&kG4T6-mMWM!up><%@fV#{S3E|IT&aM4T${f1{1E7C;+2(cYE6 zuPB12cgOSJ*seq%9}KRm1Aj-*@RtmpIs4Cr{Bt4ymWH2x`bR_l3&Z}8$@(wg)(?{< zw|dm%BN<g0WAO{Rz<UJ*8YNB|sYas`Xs%9mKV=$tYxBY@)y2!#nIj~631YbPMbqi$ z*o~NIp)C)6ciqAcE8Gj0<>txYkEkC$iIRVF@7PBzU*n3klMlJ|_?uTlC92%{qqO;N z0sg$e(BTXwE09-saewN-10;0-Ji3M6Gk7|L^MNNLM>va+(R6BIt>%Pj6?!y(Yn;nK z6vvmqU?3}Kv$mi*EjPq=9Jq-t_(61Ct7-;=fvcaC=+8D;pSqnWsmC7+l&bSzUKM1G ze@yp`UO@th*gapnL%6f`^&7m%Qn$iA)c$Ekqp}0-VX@CacY)b#*7$k)uzTM~x;wi) z(js}Wy(Q^qVdaBzZ=RfmUCraMBKSE13Qq7Rd^BS|Wi{ChEw}q9&89N7aM}9|<H&6N zjzY#+xv1Bx5!NMyRIzO8itDr8@wuqp4rwnyI(X@RfCf1xq*XPl(enZogPhEO;?KdH z+N0KU%<HU9X1RH{onoGq77aDh@A%$wib*=6EG#4-rb_$}IioqV;OAEqy@anAHf*kX z3FrJnmOJIH>O$Gloy-bM7I(q&(GjjhJ*g>Xk_#d~HB*=G-BiZmyccO1Ko>2DyaJ0W zHG7dM=q8jabpFigS3)j_1h=XiPUYEQTF=XP@pY({g1gIXIo`N@dH(7ZS@r<7B#n3) zZFrJSSeJ?Id8*mV?4_?r1iRS05WnJo1YhY9kO^gUqCX4sWMK^S_ih3C`d2Gm71BX? zFnX07&B2@VQccYf423mwiMUMCQ;*2<j7sueV+TZ4CJx?mgS~NVa%oGqoMw3L4F3WT z-irgryFbOOaGUt%)CC|H0d(OnV(;L*yev3sizDN<O3jAx#(s!3(d*<qd-=Np5P9B2 zq3@=0-G$S=rcNfHB;bD|oE1bkl8LUr2%7H+p1J;}W2`k&IlsD-ztmvl>vU45_}Qxu zTAPdk#CYgIZ%0Rb7WQiNit_qLA;_CdN-W>~Om(HHkaGZ2aJ_NdJ0Y@xGp(NJ7;>C4 z((fAp0_n7X{9kR!DJOM0^Q!S86(-CXMT{e(>rRG$^<Ha}G7zwPmh?^}22**8`594h zaa=2dtkzS^V$igqy6{$2oEAkZJpw|jDXZ<)&tB`t;bd(8-B*G!YQBKX-s&)*H_NQV z^#1?4K7WMl6eHDnDzdu)&ns*3VG!Y}O)>B6m7{N0bzbJ&im1n-5KP)?OjPStERHK0 zEC4Ggqfmf0iyp(A^z*{oJpzK-Kh6bYk}ex?vdrPE9D(-Ixk?sIlT>_IPoA?ka;M80 z<l`6JK7OPR_s4@-B(<vgk_Zl|BBGpu&d@hWPch30zxsutjCgjc0@?v|aAo^RacM#M zckx>CMo~XRvU4SDMCu$qY<)J=ajNyAgPAzEGb@$)l<n5t1Va+CTmJVpaR7xDS}IDy z&sXGqq65<yctE+QuYs;ZNPB-ilXvsnIRpP^t*Qj>objZtKeUb1bu^~n&MH_AV_uV} zhK1nBuz)=_rcpBYaHS={vCi;hCj}8-pqg!7UB`~X9b97SjClj{L&X;tCz`w&#xI_! zG20U!xcTKJAKU1+&i&_rx^<fhEB&8v|9`>tn|uFyhV>l=?WvX@x41qjoY)6qjzsV9 zYC5Oy0JRfO^bdo%AUU%&*(qki8}7f*HviSrHwiSmX<K2QP0PL-rB`C-JXxAZax+5z z#}Q-n-${P+N)O2N0dje*h7ff|6p|z_E%=I3i0Q%2Xb^}f($`G@g~g!`$UJ|K>gUh? z$C=5qr!O$l@q<RngMZ0Ipzv_80<a0VteUqY9)f2#Md<=xrE^vA)gK>Ber|Cue^&w~ z_dL~}wBkn=`l$&nAW(Vg&|0v<S^SL}1CAU$cq8s`U`(Ge{PS4<|9@NNx6i_^aT?I8 z=R(;kEc+sRlWRg8meeZd-l`SpsOGEZR`c2;I~-(csfd3e?f0%;_+gpo7kQJCEdM2e zef2k4ltFtoOZ`jf+f&Ivp1%wL>3f_QACUQy){n6*h$w!xTl=Av`IJ*2!R&0DzC#S5 zek!e|7r`%*VfRc4e|*!26(+s-8~^&IyZdyi`an@sy&3t&G&e(@A&=2dW;egdE5stD z%vAQpb<1r+Ma6Akhvqc8U%5^Nc<xje=A^*9owOmX?+|5Yp3j~OveNnqXr9o>f0Ujg z5ETi7RQl}6C-NQmal0)Fl$(B(_vUk3N@X3V@#>G^pq*Y6{1toTOZF)oQUIgs;;r;E zPGML;=0i;62RnQ~puO2`yOU<EGIYFG3KcT>s1`UIOB_~StluVP%a1*E^j!^u*Sepz z2w3Qgf5s0l)G(M>9?~G7)w-!Zj1uF~1VA<3+K(ISd0dU>Vi#yy-8nAZBcB8?0BM6Z zIZ(^EHDan>?!g>4?5KLR-N<bUUgVWfJ;N`zAF$yDGbtVp!9u|58?f2EE8-n)qm!Bj z*`xD6#ja=0UX}l06BsmV`V-EQIjw>Xh8ITfUqG^hBq1imOOmsSNqBGNZgWbRRxI6Y zQ%SFjMomz-a3inb9M?!h=KO4qQ<7X&50&Rz(vGw^3}(zDTj2=*llf?xok;WIn40`G zkskhoj~57MvR@KLeZ2}WMoIE{Dyg#9mQ%8A(qK-blEVg>^>%aNID&{+%F49Egot&^ z_p5axKbEq=Z<kW?0(Ic|w*fz`bl+P)|3hkKFg$um9{-Y>)%}~~2q2&PMywV&xVGbE z1w*B}dW(rH?;!f|y<;BTuO~luTp~nu#ME`0kBr(UvMPN5yRcj)#UnW#51DCCc0F?V z+g)TT)LA>;j8S@O77Qd{6wHQ$u;pNYpZuUrZB?hd<g#E_Luzu1Q{oIyZmC*&){H=U zb!8>*z)el@Ba>@8RsueUrzYN^5zL5$jfM$~JIL_Ym(A`Wo4n)Cb95hnCsEmq2I^vg zt3V+vAA=d*PE`3W<mwkE0k$7Yoaou)zUVf7<F8SwrCXp`%+54aV2!G1sUH$6@M|UV z{>Cu^2>z-3(05&oHgfX4-x`qr4AS3w2w<D+R_nm$;<1?qj6{cH%Q2(G$$BBX&i7=E zd^Ne_tx}Tg&ue_y_n$vi%TdIH7?BEAo<kon&;(@eNu1oyoS?CPSBT1Etf_37?*F8c zQ3#M}T?M4Ryn(ZbAwHo@mA6}lQFbGPe4J6xlXSIppn~?;EJtMw!>28Cqd>1Zgvzia zA;tNDE{n@<fOYS7)@tmAw+~~Xz{>Zo_NTLT`b*t)Zmgp=TRv_p)Rar=GhWcMu=Nr` z0JY&z7=o%4Fq?&)+OoIjDeDNAO>-;;BVmi5#We9+?zCbN747z8)!l4u(xY!w-NURV zmKEz3-f!69a5cE(d)lo|G$Gg0jkb}zK5hrasO+!iE=oVmWUB%kCdG;mi(}Viy(Bhd z7{}iGwDRTqK*H{5C{67CmdYiz8qc+~IfZe3hF+iU6Jw^-%hihP?ucZ8NiFq8&%60r z9QBlIZw0yB9x?$RyLO&x3$szFn6R6VDg(>)6gs0A8tt{No=y~QLtT}z1nVER+?obn zfAVd4$k?mPNq9W5aPAdv#Ei6<&G^mlx_Oy2e2b#*3PmRZGQm4z?MB(}AZQyirZbrw zi`a@6HP_t31?Vn{iTdQ!P%p(^p-z^CKan4?xz0Y$9KQp<`u}~I;jNL!+!-w~F<i#V z(ii<0+6VK@-R=uFjS>k=FrIGTZdMWFR7&PY6y&WQXqV`5JjZKc)UTnwp<F6I`%0}| zLvG})YcBhdcj8f~zir0=<AsT7MDlXKvBPBgciE|hM+@d9SAJr0LX3d9QR8#sh3;R( ze914w&v=&+M6@KAua<3gw7&(G+S_f^z7z4CZ1U)g)vn&E9+#iTZ|JO<RK5;9zMdBD z+VJG~OP;f<zU781A`ale4~@R8qJjW*t%*2Q_M%sXcN#+_DaP`@H6g3947U!x$SQ&i ztL{#Bw#CED2}ZlDQ03Uq9-E?EW--GRygm?*LcMBq#0A1e)0d=zE@4TBGw0OiI@+)n zpZsIkNLJR$p6&H&*d3U~ClYXsG6*_t_V%&O!fs7U9cYvqyvzuedxx{v!)q5QV=AxE z%@myM?l4x@?(OTKwW&9_vqC~0%YwYh;-t~&bbqAM-XqKAtFM72^}$+QXqNv4mig}M z39r~!!UQ`=t_ljvwt9+*0gbE1mhh>E7DqUY(?n@quMWXv*WHO$&fh*>h`d`Y!W1he zu%NkTD>s#V0jx2Jq%5^%VvwgIQ~TJsM>w-Jy&4ka0I_z(1R^(ka5waVNR<bO0K^`B zYw)waoCt+e^YF2C07fm6ZQo$qcy9o76w-s$oq<%oyC$ih0X>h|@|O$TQzQ2$nmwe$ z$_9(QM0yAUG9QOYdW<(29}-hR_c7OzOKZ6g-h>ONpEMnhcK`M2rw^oL_$fT~rzY$q zNO<>GV<y|KzjkrFjRzApfILG_tb2N&^H%cDa}N$LZ%isoqT#4XF;<tqF42RhUO9yr z$CM*q_ysBMN--ijL|N0~S~AT!^exk$S!d9(VKU}Ns}An@&-ZqQn)TNjFTbVH9=;|Z zKeS}b9&;u7T4%*c2^SHJ>zkNyn}o{iB)V0<gLo+HKy@<4E3a2hEz{>Ni^k2~mCxl% zHOo;d7RPidEfRfXz3ZxDyN|}Am-krXId2DF?^+$Mc=}D*%LLuWjd+bm=FoXV@F{j9 z&>d1#p~AU3oQWz)&+M}}qJvH(+H$-fChG&%%QP46h+5f%;;X|M_aFl@hQqB7>%FdU z={75GVqHypTN__gKe~GSUBoGCFb@N<5w0J=Uu~HUeUw~{`l1R8YPqXn^I7zBysMcu zX0BI1OQ!U=T6Q2qD$BA4KkL!EXC`UuU>P{~ro>5AJF9lVO*m~Won4*AxZD)8rgz-Z z&zcBbm;iRkzahB4pS-%PVZ-X$$#7jRKA5KCDke<en60#Nzg}!&dSz@j$+qM?i^3H1 zi*FI*02Z|1$^b^>h{HQ{cgO}4EmKd4Y~g&gdy^(=nbK|zi0}`m%RuTJAu$;Pmjo&X z^FH3T(<rsD_QD?Xn0IfBxk%5iC92$bE>=}Q#j@&VKQ|mR9%EDT$SF@AP|i($QOvxC z$$LNxv9)+69S|9TcI6T0G^mza@x?SmSfgodya5#_;x2ip#prSC*<c!Kp|KUe>Fpqw zZI)T=e!Q!;?3RlZ){i_5GRZdCZN^gt=cKqwF`6F9TcpYO<ZT2tOy5Ip9%a$7d9F}$ zyMc%riz&wMi&|%ZIW@c&N9a{*Iruo}<vbzBm6=E7Gq-E8r{<@OrDN-g`pk5j?yiR@ ztqA#w0*ni1J;h+Y_%Oh)#@S{>c}v@1KzgNRb>)0<=lJwIK5^t}53+-`-*dD}cUWEF z%+1uT_OC5w{ShcTBBI6N$imV_-tJM}%55ZDn^ep2qpluT?{8c2!5oF{Eqe|@hi^S! z78%wU5lbxJ$ycj;mg4!|+2uiTl1Um#qigS|+d9@mq6_S)GcVTV(#VT|PZUpJs<0ay zm|Vpm^F`F;m}(MCxV+W?y(p@CIIor{vTB)lvQcW0SLLHtgJ3~^ZLD~ZN`^*+Q3{MW znh)ivYT6`t!K>ipDkPjvm3Djbds{V=SU=Db9?hMtkT|77WUbRuBIej}VdQ^>)c+Z4 z%d-4wK=M4KyWiaB8aaNN<40>flxGqLt#O%Ub&Sd6p-j6~tY5=z?5`3JMs)$jGltu% zOS{}gb1G<2Q@eU&ap19<^~UPryU=6(!%FMPB)@Mba>vKsiFTuva$PYj985<`4~2Hn z7HUXz+Ige6L|s<tmYwwRZ2Qkrmd;kr$93*a_uk>Spx`IfOZ(rxg-b*S68gp8mLjn9 zGL~MYT@bt76!dgUC7Org^G@oj7QY>uS>jkw-}k^i{cwBf0n6j&9>aXobJpnE^r1oz zJ%g1i=<)Q-BQ@{I+@~Lx6|no}hb5OJScOH}r>^7Gc87IldbjL?83WWvcD$ka*jSd_ zlR6~&+me$CQv>uH5vl_WCq&Iw^&|@z=O`xHgipHbdv`kKY$V!MUuWMPZnl64FUsbt zHYHW^@?>c6iciPs3|%Rics>$uS4x5-ljz;hN92ZO76H()NwTHS;ARgE7|<+ZZZKco zQOFt#(H$Y{+<J>X3oEgAe+{wsC>P6}h!@XpONiK5B7JPUS$7ZiMWQQQBrkI_E7{qA zV1-ty1B;sK5eoPD%0D~jYTIRK@l?nVEqlK{)%iu{6^j>{*SEu+NT~#o{O2Ym+{c8K z^q#};pXpOnBA5DV7tSjRGw6NK7|evDjs_KPrDe#Fk`i64i;P6OZW@U6S}Dqqv5+F; z-VQ1mH<ORXzYEC3HXtR@?g{o=U5+_V3617BjhIm4B)e1>CusZJ_$=hBzJ!nnzM5L_ zn36sD18{!BF47zpT__rY^(UdJQ-!xEH$wGQ@}Dfynj%P6XVc8tvQ8=jTJFSf8miTM zG_Af#DqGl*nEjaE)|8Lp)^cCI3kb&x$7C;TDCmAN2MbZxxAX3Ddm~iHFL{lPe!{1% zRVNlHil|Z1-WTWjaH!TK&+7y+>7HBvoOekQrd_NiCp_ViT*IX%5?-RJ<Y4btMJoRF zo+<B>sl06#rmj4Xwo9|xC3e<zOR(gbj;|jZUCW>SEGmi6J53S20?9VkV#k(NDB;oj zN?&JTrtT8MhM8pxjtXd3$aHBJSipsiO*CKWym;fzqie}r3YJx(TV`BBOGP|QZ9JBU zIPVqgvc07Ni$QIf&)S}#V@=%fycM(c``w+UqjziotC7OfA6$pammKw?@M*6R#V$0# zx0VE6EPGInHZvWF&Ur6%^k%45TB*8*Tesd1hVj}#Jc5-0G0`<+ixXhhC2(cvCZEa# zUG)0sE|tba6Pu$%sj#F_QU=Y2if?CnC`B-D2DL2JOw&!2-x3=4-GN_0&UYSjTPp9e zgm1bzZz!S67r*HYO^=ckwwrmwFAEZ2y{N|*2HX2;MD#Zg72}G>uj$<kEk-F#Eo|C> z&9(fC2NR+rjZlwkd{pQaAiqK59yvo2oR_1J_Y|A(iGAE{ZKWZ0x7}bYvwU{23+)$= zcD48B<~8|wv*>Uz9S``PORsrhD+1TiG8;|vwXsw6&3j(i=)3fHt|p1B&^*VLaY%!u z4voL?_BAShhZoP9D83Kfv+&lDRHEiOh-YK96-c)3`*h4s;(MsSnFNTOzVPLCNo^H+ zn)@DkXI6UKys9Z?Ybq^di%(S@9?Q+-Bs!YWE<Nd{ajR`Sni|OnueY*VEaIf?#^aHX z)PII6Q?G)n_9W+oA-riz!j)^%E@AetK6WObQibpW|M>T1-o&E=J#SGiUr@J)3;*dp zMyngN;*!k{4>Dy&={;V|%`BE3ucP0cO@;{b!L>LhLUT4m+`P~t_G8_gF<_aj=a`VL zZq?JUO{@exy<OJ3WXOj73qIS=UYgd-dF^yNmivJ#y^*WkJtMA7F7+AeH5e{mh2EMQ zyx%hwV!Oz)2ajsT+;-Z|!H`H~qsvppzHGWnm<}bkrL$Mxl8@#0olf%}-86ELW_MAz zvJrpTJ~ugBSkOtM?B1D?Cd+URJ@kuL@=3;OsKgc>yHV2JwuhG%nB{6FpTY}aGC#{X z29T0~<h{m4s@{{m>w7ybB420*-+c17OpVd2f`!-P?<Dw1u6`DCI=PQ4K309sA!;d) zr#>rDm5k=;_cN4-16cF!xNZ=Y%*75u$$CTXGr=JlV84Z_Zso$Iar5|eu1itTD#Ymi z;iJ;yd7=it(MreV%<7%2Xq<M1cy41e-|xN+#(q?GQ&z`5-(2)trIrToMZ^3x${yVx z;7V**@+sSZx{R0?SA{r+;=QPcV6A0@gunEwI(^BTd)uDSkEqCS`{d&MLrt^|-7?vA z_iOC8XXHq*VyV}SeWbt;Ep>xqf9tW!KE|!hNXtoQ;ROjS-q?3<IIhs7Im@WrOpa26 z(ATu~O0=n}%y%Kvx2Zp@dwP>EoO~-clzgkbZy@AB-;Lzr6g*hcVPQ(6CyIQclTQ(1 z*e@%>q{(H1!*A);Zpm&yhfO;f9V0fnKr=4)Trf;TC4xf)XUEO34vhzEPO5nz+$cJ( z8I5uN-1>P!R)ON!+WLVhd0(*#GJhQMN}xvc`{Jebk0)_;O5|e|bwkYBJq~@xPm0lZ zZf?X_lgZQEqTLamRGzN38|SaX20EH`E*2Y612m+o)UG|hpvIk{PO|Ey8(7(hBVG#R znEKA2a!kSJ;Gq8<D-eCVa%PISeMwZe$_4$R&m0+pOWQ%QAe1|jXyJ+c){Ac%P?UPD z+^=vi^nEnc_%d`T`=gg-w~(a(H{BI#iyFRJ3CI^&5rW7S!JQOFmw~|f(I@*)wo~@F z4|_eDu(qZ3ijcFn;L1wzL>65YmZ{z&S&O)|QQ__)-{UWft$^X+lJ0Z!0?`{u0&h*S zp%kbXA9o!gB3iML)q5h8e4>V<Ro3RmrqLE@H70G+<bs|FMFQdV2BZ5pLJihamujY3 zBWcu=lN}q8%4E4?^*t$k+7muYN3B77dym^idM_7D2M=!&y#2YwkNMN$AJuFj;Ixse zIVV$Fy|Y-(=xZDZGNLClgCfsVIpMU+j9_GWJjnH#45f<-D)QPfbZp$HRZ`}BeQp~y zztc>Y&+fDi=A`Fd!$?jq1F~+gX(eK3VWoywV%`oj-Vj_P;W_&lSEf%)KxcxII>CH; zAobFi^#nRZXg_;qOz}qNIim^h9i@DYeADlkC(R|9SH__pGP<=39+a26dSzwS&QoFn z8+JmCfp6L`0_3i`-$FTUSi(iAZtN{;^URL-Vpq!!^b;}t^={rBC6<R*sIDQO06mNh z=#$_WE;uJmKH#mW-m~eiBEI!{X9#8NtqYTA2Dyh&;l?i0+9<_S^pZ|3v9OJYT#g|? zw!O~d`J|W}%dYULb>JMMXNAwWd+8p9a4{%!rs(X+))lE%DQ4caZk2w{@8GradEdnW z-a3!j=V-{Xj(@rGC`ShFu&lsCotVtIyb_<&J(Q;PBBuMaJhg8mggthiSh#nKEGdjo zxsd*73{}yvwY{lpC=s`%?{2|9XYY6XkdVdr_MI`rE^S;_Tbt$6c8CTW^|*X|i<W(4 z=u_x4HKEY}cOn1sWqbWkAimEsPx27C(`4|eoP<V1r67*Q)T1yqX?7TtyWH3Rs<M#I znh+ry?|wB*JQ(CkOjRwmF&Em)(o@?RidK4hkf+!_4!iV8F(%*G&ryIU=%oQUe51Dg ziHbKJF3|#NkaAY`x%i}V8jD0v0tW||pbW)O;kVQ|vBd=$VS*@50Rt4Gx|8}MF%=xu zm|w{~SP-Z`apIJrc)-|?;Gsxm)UNJ6#6D{|(RFB3+V`Qpg?UQ@x6=f=T7&kfN;xdm zO9bS<2j6DKR(&fEO7FhQ-_K1;%D?#Y`goM_X;S8{Q&v-j!}wFLtg$ED9xE!h;MsKN z`5b(Lc<mmkP$ZnZBE5hnC1N41yaE=*Oy`jESai*&sl*KnCqI~+m{`WWKb&wS;@DnB z80jC3C&tYQGGA5odByP5LYvqwZkwU+ua(NuS%~QQ^8D&kyeu+9_!C(>KEj?~i2lH4 zmlZ!d!R31nhDY>NPP&O_lz`Z$xdq_x$Ml&~k>R|XIdtmg2HZh`;)hfAEC7XlGIby2 z<0w@4^oKh8Vh7~?4XkV&>Ow$fKe5NV=oH1=YkHCscIFqUX0yoD=Q!iNgYj18>*t{d zifk<I5AQeR4~B{fyHtyiZm(t1^v*7<e_Vd6-K$~t{8Qirejk7;t9<&|vzckZVreUf zeNAE6@7Bzh*JRDB`rG2uZlhA5l^iXPG17I7tE3Gj5=KqAZ+VNz@)T-}lgjQHrPSWj z&NKqJz!+h8Yv*FG@Wah0a>GSMo~{_q(4H9Q_^m{$EiY5Uh*s6*hZjI9d{e{;l1W~# zPBOigpjNC5AGPoux1=+8+Y&tAbENx8=}^>czha7Ku|vk5%a#EoeTXOQQ4L$mmNEiJ zRlii<0`Is<yWPzVuGw!YxU_MG!sF&S1%y6M<^^|pV3Q}i3Pzr5eBKXbsF4G~=&MwM ziyNNT2QdBbISd;l7yu7Z86Ab#L`8+%0e(~xdG|4hK&h4Fa@9pjET*1|3pzn|r-KzH znP?EZybVWV?<HnFrU$f`@e0sM8KM^(%Vxj)w5%P0J~fI30d!dS<|YJ4Ok<<iqL>I) zx0YrwGTfndnu5hVhl{Z0ApupOw{k7Cghp(8I6h7O-Lv!x-Vbz6Lo4e`qQQ}L#?chR zg@Lv<=$%<c#jAZ~k<V&(LTLjs#~XHJy9v1})JLsvIxNeqf|WZc*Kp4b4zImglX_NR z?pWARtn&q8LPH;C1+QA$$1k#8&u$vT8#}{`^r}Yj;>A;U(|7b<OHq^eUGK)4dH%q! zYo}EY5#?rY#f5<9Xry&Jq|-*P{CSa)3yC07^{LU`jDQ!5VwnYEN@01(WVA#=%Z`|w zgT(*@E2{4anV}mS@^w!-JZ^mizn`=-|FkaWMElm(S;yCYn+Ew>{CCJ^w+%7ewgUlI zlAd+fZFOZ6de6G;S213qzEOqQOv;|!I)cu0754Qh@ONlS6vwRb#C4TdjiJ-a!a-E! zlwLT+v{hdXI6>%?FzfSO94>3$re!n;d|}2*Ann8iayHMhCj&AYL?B?J(tO8blCuT2 zIQM<oh0`2S!QQVBy6Do?Z@wwF+ue>U>;mBwiZY^l6&8j$^EGzPutaVwyCWd~9h;3z zg<`AmLQ3jxf5%VLzG-EC%+=D#lm@nqk;||Uuv%!lS#@d7C112f+23htERCS;g_sLd z<#P&?jgnzGK@bkWChzy57ROx^HMe>JB58~Z2+^|J-~wY?R(@ykVSrrh_RgfM?U&pV zzRBH%qnV9u9j#2}K<I6epLX>|otCTAgq&uCALfcB3#>AoQUE?&wXd~qLpwu#wqoC{ zm-@jkH+GjayorFZk~qj$DXQEN;a#W%H9p-smsoazaEZPXDRC+u1e-7>bj{_%6&cU5 z`m5ofX3^JlGgF4PcFk`j`+9evMG_~qTfTptOk})*@_YI<V#@qb5b}e4@hk_MZaLk< z+J>BfHZj=HL*jVPGV#I%Lq~xnl!#KQfO@vM!LzmpPy3Wt$IYuY7Y6hhm5z}#G-6M) zG>RTgl(c8SiV)<5M=y_sL0NBf5ZJxL0#udwlPRlG#N9X(xj{3z{-|MQW#OaIl<S-q zSQ9IToz$cDt_UV=Zw6)z*3DX|rj1gI6L{I|u-SIUD%rkRCY<<EX<wt5RG~=Y=dJvK zW!Q+9jy{mkrEdQ`mC(yCq6p(!#m!;E><4lrzDgC((-*qOm1LG^p14*Q*@6a=sxYyy z9#d9d%BH!OtFE|wB(p!|g#HnU`}$5@_SzZ0G!wTi(7{oIPH2$#@rlFpvFJ&m8|;Bt zQ}R2kBOqI3@d?xSa3xhajo-@ei}8FAxrXiXnor8_;}pEJm5BG0HzI2=l0&cZOY&0= z18Cg^Dh}gjwS6Mb0j>D8y=g?Gv$50E!V5jV*=_yOZk-PfOPfyNVpnbyziL(0x$XY5 z20)fuAe|Wuob!`l4&8DMkZEBB+p7ZLri$UVZ)9_Y3)QmKWY?^4Wo%I;v3)HGx1$-M z3>)(&RBAGx!Ws#v?7!5if@N_IAVoFh&Sx|9D2dOOwHM)V)xE1^s@%6&hJ>**v@Fu7 z^vBH;5dSgm+|J>GlsoBqh|X;PHeu`56P%f4H-bAzW<5Ps7SRmjdl)yo4%i603QxS+ zXneOcNh(F|Uakz4qSl4;#2t|Axq+vx%$1QqD#A)3Sq8^Lq`KdCKJ`DZLl;;|_YGWu z`5M$pJNO<i8GMd98sx@<Ay(I{b5vhC*!UJfY+R$X2edb|WP{^*R1P#ZzvHZr`-e8V z2pQ@&J2WipJ-;pim^P*DZ5^)lK7k{r?<EWmJAdw+&E7C)lG}0#h>S)bPqhPZ)TycB zmuUSVbLtB0Jk`0-y%y!E4!>^+DeqQ6b?Cj@H>H|n>z1xD>tR#m!o^rnx+rEhZhr7* zR+_(U;KRsJS?`w%Y2ES0P+LmPYDE^WtnMav=vtbB`P9_OOzm4G3V}Q7m4;SnHI{ue zUglq92QVG)IfMgsUtX1=D2&~9%H-)eFJte@|6bKeBpE&|%UM?|RjY1(+PoFVOZBsC zBe5JvHVTsB%9OMTI8Lx1rTQu}svLK%)Ng%G&N}K1h%_@uw8D|unCp$l7j~~wH?5nm zlOf_BE^tdZEq8kOAhRyGyr}cI-1y<i3p%k$exA(t9W@ht>b+qbIPCARd3xF9n@cEt zKpjTWDB`d*5-7LMYL|6=b%N_HF%>3$p35q6YngI-YPI=*zivB;O_KOra3H9oX~M*| z7b3pBqg)L;ew6C%P&Ur@p(jSo@<fs4Z64jOsBa0=;?j#&RjblV^-Tf1BH7Q-J6${6 zUWoP6yRWY_(ZoQZhKbxBb!d^zgCCclae>O3=v^j`^}<|+QCfG@us)BbxX1Tw3rIq% z15w}MCTd^NynHl$3&Sk)?$janrCHsYRX8g>F^EBxQ>rr8a@3co7hqh=^&m4@ak<)Y z70Rq!Oj=^{@}xx6a@ISkO)mRK-{?K*SwM}<dcP&DHS*-sU7_cbfMwV0v=DJiq`}Qw zRxk0^-6wUYHOx&=%RFLu=tnLWlzs3-r8|xz;L=`h+A?Dx0a+BEEvl15g{ZO@73r5j zv`)&QrUQr%P16J{mYLRPhgL<O3FoHLGbPn;>R-;5kG%|MwQnL9%0nGTJ_oLnAa!v$ zCR#aSTflG@&Xq)lBQwCPiuaQ`q96pcMSXolOl9p@%C~cY(*atC-K}?1iG9a)@x0d+ z04T6u-l`+4X?CBLi>p4TiLY#ywShaOXcTCu!i3jl^^LznEPU}`*EseK9ctJ3y%A1l zSiM^h`>iK^PoQt9!>s3uPQ23DJbVso2h_l3s~U1t`)iY^W{X#M4C~#o)+-x!kxA_| zbdo`$wkv~XVm8u6l*>OvB#c@>b$^=(+AC$#5cFO;jDkjuU67sE>am~D(Ppb6?XAFV z$IaD~MuCr$ev^mcR8R<!H~lrY7b0oK2UpjAScjTYTaeSW_Ha>byU+Py=v%KYx5a)` zKglO6wowp7<!VM9W0$-vhi?uHtKj1lO(<7zyFRx4QOcqaUAa!a-&y)D*tKy*W@-U+ zY&<O0zfN??a8P2yZKgI|S2P_lke!8c%aspv`Pg_B9@HBFYFFRvNd(uKzcvHov@%mC zVj_wo!%3QzNrhp4_;&xJ!pR?~foKSXPU5}dz$@RoUP(npO`oqh4wu)Fa`{e4vKUZ5 z4{BueV?XYuS=@h&&thEi8os~$uA~XuEKk<m{hWIB;?9uWj@Z^FVY$mNh5lSKagBV~ zq9%9jC7N_*0RZJJNEuLwOc*<7_|`%UhH3;0%1LnI_MbHM21u%$0s#)EtP`5!^?sAv z7PT+wV1f@E5O+*fKc!AIc%-FFW>it{<vx6wX$JD8lCOYF^rni*tgQ48i0AGJS#|>g zz1w>m^Oy1^1?m&ZdO*?P%TXN>mD}QGnUBB`zJ7aUep;Yd-|iZ1ceIMwlWw!?g5~F) z`4$<}$)|Gn9hiJlY}f(Ow?gQ(dA!(=RU4-S`rRI{EBwffh8=|>Tp16vS6UBf@^1QY ztg_R|KeP2!p|q<fvBG`?71U%UjS!wFSqh&j>xb@4FlZZ%d=`mwX4p-kRXKbF<K2Nn zUY?@T*&X+cCgt-~f!m&M=?J=N`YOv$)2i%)mAdKKbdH+rnmXdpLm&Mz)%gqMUI!~3 zDqT`9fxFYIs+Jj>jiXG3GgkOrLbtddh%dOqhKg=@rg4C>+UREDGI1cZ$e=!?Xtd1G zJu%YnJ%{gEm~dkL|6%VvqoT^Twoye85fKAHGKwS-P;v$(X8{4pO3pbKP@)0?l5=jL z$O1}+A_+>4MJOmJg2V!fA{UvvvHNuQIq$XKKHs?G`*VAY8jc#WYlpShnrqHyKJ%IV z_CoxRvZK<qeLdDyh&{ZarBZ{frWps*m$?~rYjQST;VJ!+pWkCtc6ag>YoxfcpU<gr zXGVNKZNC5`z-Ihp>og9eAUS#fQ8Z87@QS!Y#gfyq34nfuI(klj(eG0+=Fm|!NoY4k zgbum9dlS=@TDy&2NCm0f1~?lZ!JEihmjqYTXgk!Eza?tjbFnsI0RzTq-M5;Ndn-E| z9}r45;UJXi`F&Hpe$0Q^r#;9!_!N%`N<Z*Ul_{w<B@bau#ml2nSP2~ymY%i<OpMCc z8jp%R#G+@>{WV)_&Dy4&Fp0A5X>{phmlfK5X;|Ed!~Oc5t}BCg1$bY&V~}X{T^w1J z_df+SFOr^Pnt(!ZWhL}jNT=%I2IjQ1QE2QKbVyJqyp}bTiS%o4*c)TbOTEw8M3PAQ zh14Ao1HVqbbujZbVm|5OTiZ=$Z)~hfpJ2D>2x!uz@%iM=N3y9s2xr^GquA=!k2S0# zeU>kbE?@I}upe1nvNX7j+G<;sT&S7D;SXxSF<*$XZ<z1qyo6-{f=utTmxEd2rc<ih z(*2p)oM!swNk{TDdqH^!{ZU;Zk48?Ds2ZS~#k_cHV7C<aYT(rN0LY+v%Gso+@nuF# zs1qjP#pUq$WRRG)q1#)#HUeg9&eqdy<0|FD@1d-)?LlVSq@ogAX6zJbMserMt4ttw z&;fwffkcqrjI+?=qpIsw;d2qCtfftRWgdM%CP0&{Jx<CSh@`qEH+}8%*@~&2$59Z% z<&Kt``t<4XL59#Xr2_5piVr7#!LC$~+3@>&bOuv#!&UgvUdW1W_U=);7&1{Ymz2HD zmGba-*%E<o6L7nIrE}VqgRp0gdsy_Ad0wtN+*w1r3A<#L9Nq^oS}woO-LpaQO6N5X z6>PMyQ!@Qva?Cq&cSjIVH(+;-y}o>ygoK70@(d{DEafT_k~cfMT~?Ln_x)mh05JHT zmC!Of&c}W~1L(h}i?u=~=d7)(g8*yGJnz<!)rhN9)?1yxB%`&!2ELYKE^R3>&$D8Y zgPgufa9hM#OjNd5MT(H!xLviOMd0Aa+3TQ)6#f(=IU}&%sqR)aQakghAPR=!!0cnW z&ATTsA3jgyC?>?>uOC#CJl4p?<7Cq+iO<8Yw|pyI*EHl?ox(bV)ARug-eWwl7{4m7 zs2C&GP?y+r|6L!ne!rh_t0lA))Zc42W4ZXTc56}3-$5%M+zxW!md9qlNntf<2Q$Sq zUGuq<;iJx8yO3Li-UM|0`I2u8F=r@$F3llZN@I^>)4U>xjb=RS$TRX`WDFNl*G=_^ zCn3CQhB7i`Qa;f2)7uZ?v6_^y&TuyFaQS)m_kAf)E&?&0u^jj%!E{(So81zPVD6r4 zs8dYh%Hh6fb0H6eHC*g&^gqJ)m~tutI%>{Lj~L8~`KFVlsXa}&*=kg&ky~qWc!&DM zIR@&yJK~QT*QYqa9{8z>v(2^nuDQ$CG^-VbBDxNDsUVK8xZkuho3sQ<Pto$~8hXw$ z>O~mB%b5}(*#fAt{twGLE8wX}{;B;^<R~2wFLO2}GewAOC5q;1v=dS8f2b|Jc}J&Z zok#pls|G;#e5PAj*GwZcPlr5W1e)W*4Z#|xCWlH1Dm0k5Dm%{4t2!rRjlNJGaqK<N z3nOMBA+;}W@YdWNU&wh(8o$x0t{{GwWP5SjWOdYTFFliR&g!N7TSa@oc9)b$?nX7M zEvCcO!o^mRPeW+cBo4#Una|R;K#Nb+)@pxq_{Ph8BT}d5G^S<vVY%~w@a4kWJcc3k zIS=u+1@5W-pdC%`(rO-O#YGzAl#N)a5p@&&(6F^xgpfXyh<7@*;c_#J7rz+4vN`)z zn#Y~MQmC?#%46bt1X-=~5%dUfrQDP3kW=(#&!)3yYJbi`#$xK%crrq_H4k+`yKlDO z^;T9z`y8Elj(>7X-~sL59*=2+vz4+TOAFbx`2-z}&H&=(JV4;A=fVva38^_p|AoEQ zRqm7mSK<(eDnVh^nOtKhP$QF(8N4>MY?7CWJKRKTH3)s<{TL)##q5Q+MGLb}skOH) zfj(ZbAE!U5#h*4P`5iljrwR3nLIFUa`*Ztq4`98g4Vv^mf^ehj0uyvo!BqhBQQ93d z#olzf2UR+IRkb$uxs{gFsPUsK+NT<O9GsyP->)<vLr$|Gm#0)@wP-n2WtVbnE+d`1 zw~I9#lk1-6bA<H!Voo-<dOf&ZN5bFFBWm4|-UrjEfQIUufW5@inx&FG=bpilHFtpU z`h`IOwc{3nU0X}*KCWd!(xI94dU;pXF*_PSW|?C<T=mQ^_k*{?$7*D^62Vg7@{aq@ zQ@}U)e<MWzfyBb%p2ygQh)W{{BjJK|foWydsOhtg(k6}_8A2GBX3=vp8lr+1pD*#N zxq&zGxk%ZxBD*K>PSH^1lu@QNwP#%6hLDTlL#m|=01zJ+KuF#R=`=bg#lZ{f8G!;A z@Y&Kr>*G1wq#>0e1|WJhZj}Xkl&51wPNKag+~M96i1c{&{)A$^s$`10i=CWJ$JQCy zSY}tCITjjGsmNhFGCBnvFzM|V)aw&kRT4a0UMU;EEj2%WX&(vpdHFmXATC-6HzbTY zv9Pb7+$sVJfEM7n=#i{aO@p>DUu}iB2c%Iun^V3EF{)zK3+bq7SxR1OOE`C6fNP#g zu!sG&c^1~ywXi-y`K<0!RHOS8<v}vZgXbM$M&Pem*GtPJT?3lc_QS>V-0>(p^)7)v zl@ic|^}JeMMwqwD!QGiBmR9qHg$~0r6jgv0H;oiS4YhEH@`StM96mFE-oTdMm2p)_ zW=Hz!xvxbr7FBgrrGe)6yJSNG%ikp6fgNJIGm>uspwJPizys^P(kB^D@nH2X>wH5+ z>;~l{N}E-!fgb?M*(Bj@tGj9L#jo-R?)qm%rKNPSnnReXmwo5s%tLCtz$Mk0Y&75G zWo4a1Rc6^ZqwW8t1>i1|w|Vyq(1b~a`7{Ek?Q=*k;%);vFc1w7sKHA_*OqxmAH-I7 zE)w=~W(pd-S$eAcZXhb$aJc&H2Iq1#a+liu#a)zRd+$_-)EBeex9f4Q&WH%saOpf& zXJyD>QQ&m$p)>%h=p^ml$-kJdSp-L%P|DS1p}!d>S>`<-VqWGaF{BonJl<*=1Nqg& zjgqHvE~O&Jgh@i1)x^15hPD>i?9zmiHO}(tK+~T(1k4OZ9>hWBe5<{d&MYVMxE6{W z8tl?m(94t~06Fz1J~vRp#r7+COuciaAp2hDXsJi?&N`AoV@xiidhmFnsqg;mo4X|( zX{QQ#UtnfyHNmiI%mojYwe0v2iAatZCgn(m>%?j7cReAHnX6nXb9~=>tLGOIg7C;U zN8N@~0K&optoXpUbwVJ}zD^{DB5{g}r$s`?=rthDK`<w*AJ7EAvTrhDzEAj)#wf4l zGu3oZmBaJYY2~vgLT=t;@goC?jrMK;;EVLr15q4y*|>vi=m2&k<E0EthE+ugK(Sf( z34)28GeWDVGUXI4U&`fO)vMyW5#F<+L#jv`&)kzQBNUd*Av%@HXp+m>S?Jlbx5VQJ zVfNciZ-af(q9`SL+e>01DNf+C2u({!ELfmzY7B?e&VncXA4PzZ=+!5f^Ts4p+gbrs zZ$|_ml5tSpfmsdRV;6SM=>|X-)+WwrYW3$C!l#2SIXzLC;JyG7L{laMy#co8`QR#% zAppnNeDz3cR`Y3a@vZX253k5fhJe2Z=PAEneDpl+a)j&G>|ABa304@71W9kSWhTSP zUbFU4ZZ~s=3IRoDhe0S)waxR=dv+XFN$7kbAvAnH*r)?OeH>XpOEk9JAw`}DWK>*Z zoyKcj@~(kQV$--D&V4TLx4v(YHZI}4>(xgq1ZY!h{WAUZ6Z+U)rlUjNTPg3I4G0x* zPDHCiv46fo-J6CDt>0XP?xikefa3K%zX%$h)O~*{ZSA(&tKA*UOua+{znPfsdrC@m ztw^n*a1uUChPlJ`Q`+?=`MFa~L|u>{7$6ho-5>b4g<!S9l#&l-HGDO3oVZN)oUnCr zD9UE!yIZLZu}KJr)w!`bfDU&kVAa#FmA>33q7<F1ELY+gDyy}cY5~-0v!?y@?yK(l zwuLv&Kk&1eUsXpQL%lb+#y=$UbSM>*QNIydh>e+V1YvFw#Z*{<!r0S+9GEcg7-Xo# z%8_v{OQRSG>Q8f?bQ(l*cI_WOpK=GBWxR01JI7`9Cwrjywe#HT;QOr2A&@b7MSTxd z!AdtP-Go{Q0RCbcxm$WJY(>;Ej{#I;&SE2ch5@+r!PWv-8V8x1Y2nU|37|OO=sJ8r zEx|o+3^h^#xg5dNZ@|G#R<hY5OUWhF2#d-xb2Ghf;7VC(@6fm7YsvuP+GYS^W%X~@ zV>(q0W&(n%k_SU6lhr_69F;wCGNL`M#?0EB6kO_&Y<bx<VTaa0i`1j?H1A$Cv7gUE zx{R|-ahW^(zKLfO#V+e4tf`^4+E>>MBqvK=mkWN`mhNcw7K@UTZ72~OIb0>Nrbuw* zewwmpfKhWXJ&8}FAfB)zqS>vltE$M?>r`P)_#7GjfoBz4=?o7Yl9Z8kUSQg-m2eFa zG;l5CO><^1%7It9L6ozbCCHmj$~$o@nJhGiu_wul=k(__-lgsYvZ@GQhp$i4f%@qu zIBlyaubTqS@LU%nVk$m;t&dkeXwB`dW}k8i?gy-C?CWw2K9xl<8So_y29AC-u<-Lo zSb_^m^b34C93%bJ$IpgmqDDWzl6?8~UfN-iYr(DYQ?u5Q{Qi@r3{rQY>gdIU!>goS zGP@$!<5ZCq&bT7@$8wkT#r_PV!sjJ36SewK_axTEy(Dod*NS{cpa}v@NzYZc?n7w! zy-K&$(NF%xAI!#oTB*08{aa!JcUQ62X7pnvR+`Ul$~I56NWV6EncUK)Y;CHcT}i%D zDO}+D6;_ShirOg4^@rv!MoXvZ!KViaiQroaD<g%A*1BA2x9oC~tc$*?$#$v9(!|YP z!{_5qvC)CLHym&|7f_!~Km$K(mFSzT2iV?7GgLh5E@=0UhnyyZn!Y}8B(eGY;niJV z-_?&4iV3H7hUIMY`L|>h7>C*^@~&O8mwmW$r3CX#|Ga<$?uPhOl92JRxYtsA@S#bQ z(LLYk6y}s_On9y*ESA+emt@GQJ-qa}eh4|oeQ?Pn(DJ$A3D2V#7DZiMu|ZV7b+TH- zgSdweyWtKAM!h@^+X)|ulTIH(_pE7{wb@?fePFZ9wbrZl%JTtIVuMyo>OiR~3DmH+ z+Qy^qlp}6c`s~KAG@Y9!m_kW)noTjj^!CXv`fD;NdeihID#4$@B6sMca@t`f#lf=2 zxN$BMkTXn991K6)^_?W`+<UAhDLc-W{Pw3d<qADLhlCRgZuqi2?sYAoL^+z(F?Pu2 zI=MiX6-|)07XUCe;ke$<J~S`nq4_2!ds6TchrMpuQif1zLq>M}phGDm-ug-QasW%x zhaXjzHs|?&CIBIOdOKT4X_@5#(_fUcMLq*^pTH8&tP5znpZ}xkRAJz{LZmrR5F8o) z3&oZBsPnqHF8~GdWzqwGh6bglvNwfNT7UjH_s{F{fdcYR;hBO2tUu~EZ<T>=<*EUt zXt`{bS8%-Uo!7suo!@2dd8-Cq0oUi%>jhl<0T*xL{$)j*7vqnLwyi>Z0SB%h1?1VL zE0z1zam{MSy@Cul!9Pkv8-T}oV^#?4Yt9DC`IeuvxJ)<7|I0HgW&w1i#GM?Uy>asR zolJbXNLY^ILLxtz+x$L+bq^OPRT$0Gzm6jah~dUcezH9;v%f4$oMSx0(!%I+=O=LR zd9vV^6tDt;Ds;J^fe-J<95D$}K)(x~sk_4hII=;{EL;k%yt@fVD_v$xfCBYruNfRk zF24VZ(WakC`7zvEVTmCcaz6^(bDrfLI<n%1`$*&{;6}><6+CM~fP;mrh$DOR^<R!} z<Bu9jhUxbO0s**_M}V_?)vb^?;pt2V{_{d9`e5Aivbgf|vbg*I+!oG1qxH|+`m-7Q z|L;nSzT%%PiUQ^MwG%`)dSno5%f(%xk4%&BKR%d0x>yVWbUZo}RL{CgT#aeZD^V@W zi=MNv9`w3Fa_~wRrcXniBK)e;0TcD=|I|c9v-oE#W+XmTgxhY<UM;wF5x4AizHaV& zpRr<~8hI@;O9W7!z##$Hp#MiQ2J*4ZYUl1{&rXh*{$0&`uO-}Z?E3QWAxl0g&#(wX zSRw$`$P0iZ0nUw}pOQjuNHm{=E%c7_RF6sXB7fa$GgWqH)wjePD^y`aLksNzHuF_? zhkR?E7D`?4U&A#-4?I&5uBu21dDxVs!cM1AXcj~|d*}QyfbH{w(_d{gKIf$7dLruJ z8uwT>y~%2u9OEDU1t3X6^U>5={7hmdKc9#al9Tgo_YHO(5D{qro!2A4meRbq?Ayeh zM8%mUXP%K+8Z<?VIDhL@&wu%((_!k!%IY9G+T^swEQ|fToR~lb<pvq==O%iF`c8`u zj1UL5hi1mVwLQ!m%vffuO;iJ5po6H=x6dR$>bgHaS8k|#dP(-+JFUQ&jhF^DH>G(n zU9`+(iNovV*u$jVqr>61iy=4U9{CT2v)=8WQrEsN{xOo|!7~XMPky=hFEKBb!^WtA znG}30`!yjoql}Fu-p^`|fyxN#5F9UZfm^o)5UY6M*QG%vf?l|LjH((|R<u`19^JiU z&=m`a@wl2s?(@k=rV4cpu8X3|T;TTORX|*Nr(8lTt%0kNXx8=$^-~=3VOC}u&SJ&@ zVqvB0Y|o!vCF^i#4cw$8U>O|-NKfo58bHaN&zl_GpHa~P$Kky$eJPIYVq*;vz&)vD zU8z#P;a`6Xa5J>GI^7J(1s>=L0oW$?0yEGr=WK78MHY%38yMW9ftvPxciZ|lskt>2 ztz70k#KDcGEM1=WHXB4p-Rf}2RbbPok4$}DS(B;<{Wx4=s2(m*A4x<-`rw7cj*CRA z3?MF20#8(Df0J=~FU?+T4GY0UxyEpf5T7=ft0*g{t<d4RJ4M`F`TpoH29rKg{^c3c zz5x|yZXcPGG|RUm^TKZ%eS~vBDCY;#csNx49Z)hcl3F{7a&?K2!lXbj%KREQc<XU% zLm;L_@X;AvwY$?jV0h?LCB%?ceu*sp^V}H)d*!@fF(7|8?U%mDpYi!nu!w;QWn%cy zU6*&;tIk68r8O@NO73jJ>~tb6-Co?n;F0`<><$a3cd!dn%4=UtiVT!K>h$#aBd{N< zsSFQHEo?_TO`%xA|0Lt$rV3Ttjo6#v#_v%UntQDixFI_U7UVo-5tLk9XPdL@d17uq z7oKpmyn<^Vner)$hz1q*Nn%6JAwEgi!W$#fPv$YC*Yu$Qu2h=)gu$cq{tZ5u9@7yf z(Q)p6|6%ZLhS$x0{wH*ae6BCut(H5EY<a(A^9YCO(!Yn8Z5cad6bXe4(%yaqLyfqn z42HX-$4#EfF*%yH$gOY3fnZ*PlBwJjc#|0Q!+Z>gh@9-vtQ`>rDNi;fipLsH>4Lnh zxN|1Nv|h!I8_@Jwscpvhn@KP`!9z?i6=p~^$Z7oCO3A&v=;EPdBJGXQb9jTwr}9sE z<&Unn^`cjV+|6!&FC)Yi)Ns?jDW%w`Z!}JVu#;-ROx4LA_r|k}R6=7-xAygsXXAC^ zo+SGpDx+|Zl2Wv-zhq`Ne-QSM3UkF3B)V5S=QSeM7b;P9wdPUO<<Q9vb3RK*wrsA% znB2L?8Qmb%5E(@?vfRws=S^|Em1>$M@A4OSOMelwSW_i`NtVykmEI@zit@<O{kmnK zMN^L|bRAud-#}N_a!!Yzk9vJVzxzg(quz??S$TGQ?UOK9upuYMbCN`3_8V)%QS)yw z%1drkg5o%xOfys4hs!cN<qWdP=;qJ$U<}<yR-l6xY0ujwP!mtk{SQz1wtmq}1-6-= zf{@WhGtIr69>gLy?E~?lfm6(bgZwzMZ)F9pa`X!UD=0D#htGp#-<HUy<no(TM6T4K zPvz`AyV&bKuf((^tK7s1fqRx~Zd~QnH%%wKa%Y^>L0C49(Gu7q2@sE?lFh&#VjB$V zPT@bFn}GJJ;Ehin9Su=}&KqBANZc|RM3V@qlK>Nt5_7JfB}jhdIyGK;n%t}GnN_EZ z(j*7zZ3?QjuR=KEgt$}NRZ273h0TSEE*59=5J80*7OT3Dz@Jgve)WU|{3Qn7Q_b|f z1@h8zWd4^Js2L?giQfsuWL8$(^#6KG?z4{?lRi*4C^z<Vt&H<>wMZqLO#ZI~cNsON z2eok3^=6t`m<wn{<j{WeE9b@m2ud9vto?0a<O}|vfY`XD?9*Qf*!{=5Y#{*3#PV9i ze*TXC;|DjcumO?nL&Bf)LjUsz|F<5*az-wpkW@k8^w<iJdSW`*3O?vReiRC-pb|Un z0C0}O#<vCF>Bi=vT{Ug&I+6{A0-1Ggxn(6d8~29bYl!ws|9dIz&scBg&j<9af1hyi zul9&PG=a~*NwEWiX8qvmUr(%mlY8@LFue3<&->p`_-}^-_i>{Vm@N4PEbq_f)n6a_ zufGC9ctn5mP~emj!@%6i%FUwx+vmS>L*P5_zb^JSZc6Q3OgA~?&EGimw?lxJ0RQ{X z`_D`G8zcMAOZZ<0>7SMGzpuG}%+ddD`2N`w{`cMIA9M7NIr@LKHveCHN6lyB(A%Eu zxni&9&bn?nWWIw_>fV>m$<kCnU<3FRZy~VJ_Y|#+Vzt<xBG|u$KEE2b7t2T@T~)?p z<uZNH@75>EjTJ*KaV&5&Z4Poz2)ZmDP4<hpn4d0D|EFtxMc})`-}f|ev&iVrT}Sty z3%mZ0li`H#Q~j0q`tNt-pO1It-0`CMc>wyKCwu*x;q>zV@bmx2ef;Y>^wt+~0N>I0 z=RDqj9r^ny=x5$H{YBt;Lt=)`-=XP5Ww9rX8EAYQ-4;fv5Ket2&&_95Yio5m_{|@- zC6xrYy2@1-glI?e6G_t}i;Quccus9C#1tsPz?=z9sFcbhtyOF|M_%!~GaB}}_0mnk zleQFx&X43v`xE_LNg8coG&D{|e7~O3kqgh**m%CTI=&-UImK*fkr*I?u>)1|<ej^4 z@&rKbQ7(*f1n3jnC!8ex{ROaoCF*YM?+l?&MNe~k_2#)t?Gr>n?zNk3R1nY4s}R?M zX!R_qO;;yctISB3#l8f%;aP@J?D4@?XY0vP`hc-!v6f<)Y3DtMhR^%&XoGrweNA#~ zIO{GwU%O&Yc81KhAe+Hx_m(Pn0bGvHesX?ky1+yjg)C|(5Y|%XR_QiVT&eve{=4Tc zad<wbe8FJW2Pad$N01krFn^JXoHkiK{!V}@ed|U4Qv~VqWDc~)Xd{|^W=*GG9*_=Q zD--6nJ1mEt&B~$+MU5~O+daRI$c6*K+Swd2YOp-wq2aOj*L(AwE+rzuCWR!>bwsn+ zxqcBT+w?ZvtlzJ$qIPM$c`x>1YDc|>ItT1L9(v%oG4sT0BQwZssvfT$&kEb@drDZQ zq0;F-c>?Q_vAe(djr{X2Fd(I|D<k%zR?<{E^Uu7zkEPB$a}*3XIXP23o<{g?=4c-t zXmAQ=_L%<YK@%B>+tUB|HXEX8m&$8r`EhNo<>Q07h)aGqi?oXGapx+_f2=7e0|*J= z&qOl3t&6?(F_X0}<Mn5~W#dmDz5T=JG>hZlQk#7j4_HbEJvrP#)2YtXCJjNhdgHzq zTSy~Fu4oVM2CQ{?OvRV?iwPV069|OJwp=}*(EebZ8SFGTLD!A4qc6=!M)Q{MK@q2a z@6ItHrvgTd_#l*0py4E@*jyt-T-9`nm4liBm@K(u1241Nl#@Fb+392!o}qF>xLzG= zIFIUBNLQXU)oMWZ(iY;h$q%G0pEa$^qvPUUXM?v>md1W;6iH9$kEyvoyPQ_zgjeY6 z()k<*KZzb%W%O$qGP$%n@U<%~8lB;LT05y<o7`*sZHo~Qkrsn~<UZ3H#|e0O@lPvG z_4Vs)rDKa{O|Ne2RNG66_ya4fBXN-7*N2wN&zj1A<?ChL)8UE7G{Ztm!1lu&oSI!k z%Re>RNG_1swT9I=U1Ie**)0QM?R8H36et9(Ka4-@wRd>X8bnmp&CJEJEVXE-`kDe5 zEP4u@2(i6)O6gqek?KJQENb<M^BqZ&Rdz>mG7%JP)4tdSWS&RqI;_A11WnblxFVoX zG<|L1S7|l+1z;^G(FlQdI$qu6?v3Ux(%1YX@fFQ%(h5kUG3KRv7n*jvZ+VA&V49KZ zKbdBk=zO$v=Z~Egr3gIi&aQ8cu9b%u=SEk2k?A&ctBVasl+dTqHzn0;G07d81n^W# z=d*#kBnK29s$*GQvX3`fiOc+2nZ!>j;bc*;9EC0li_}-qWBsv^%A`lPRhx_Rp;XMu zcbF?};I7*8JQrnwp3-qx?c#VO)V*6({OsXUnn(I{Nbd8_RmLLiK@VnhobiHq>sYEc zqCg!zTIjsL@k*!3@2xGOUivC|qpp2@rt1u5HpOADBbk@3BLaj~_=1B60bZmt!YZ$J z{PLpPa+9W^*WTKJmh*haY?Bl#AWX);Hr-jYjDPhj&bb8unlx0@Wmi7bI}OjsJLP!j zwYuvG_rz9nxbMSzx3)ROyAi~rox*HdU7_Vm2rd*RLq*%jKn~C&rzvc+{jkTc0?y9r z6lP+Qnewp-rWSP`7Js)_@A?IgJhAm4gU(yB5#>;*0!Xq%kzn6kY>7GLTajGo7e8y6 zcHNXdw~+~vgq+6?p4#!}hRmVnGmZ05uV%5-R5!<MbPk_S@6han6dpScArXj*xAMWu zUFa!c`Npndkg3?YsjKwJXdH(|H0?wyLd<(t{Dm?bhrKZknp-0!23hc-)%v>}rO+zN zmvnk87K_!>e%mYLHuXmbqEn9?!JX2Ef+60h7S0>u2lE=|nypI7T$(=&<}aN0ge#!a z8E~#Zkdv}~k}FFzppn*<OgySkqF)P<3O4pbzM~CK<qX&Pb+1x+{aUY@ZB<k|o!>(% zOLp)m9&QAd+|kIZ_u{<WAnVBNLicJ^vq)=%m;}~Vb-1RRhhw-AJq5NzDq=ibm$`iH zbs%z4o^H>O)5=BteY=8rD(l?q+nfT^V6xK@ZRl|w%Ks8R<Y~Z`vt7Oqf^A_BozV$c z6AV_M0IR#u6-OY#J+ck5>72;&65ZRUKYMYgI*ktsp28%Vpz7qzhV0CRT$dxkn5v`I zQnRzu6F-AW%P5;Quf&rbZXX9vjhv9^A<%VbcTxAsN#;~PDNCeL*QBT9FFp3OJ%7Nh zrYgYZ$+d*#m}6Fo_J12VR&I2>^0dI9I@4fueQ$NNz%HS;XW$isS&znN&Mls203B4f zOVrMo?m~+1PC2@vcp)n2sJ7@nqtzvf&o^#3vaPIN_PtvqSyam@cAHQ@cOS-<Rh)xG zA9eP2Wxzu!_gI`HQR?m!A#oUmZ8DF;Ztr?+BOMmERo;rZloXm>Op)ba7OYNLPp8hc zRtF7U>0Uq$F?BB_ED?Q#2fS*PJzy`Nv)j<RM#Cki%hM#9sr>N=ekv!6Q)vyamc&6h zv}~C<w6UG2il40E@we}G<x4jC&EQcXM?ad?`}T&2HGmY_uM;Oq%Xc}XHa?4B!T=53 zHLmKDVt+Y0Sjz40jk7OnA5P-KiqW5e81_<=`RpEM%Y5Bkgb>?-#K%<0*uB{!+a6B( z!fCi>qD~3Kj`@x@09l44RSA$U)nl%brD`2c5jK9!kCF86F0T(4z&q?yL{|kdj4uQU zjGA~NRMMb$D;FK=PYZpM^5CC23_xF@{qPUF={^I^?Q;f2Joy%58#lSuQNerr>q@oG zW@c-NH>(=6mge^?m)486XYcaHXfXB4f{AI@COD^RUD2>k2a!xs3<~lD;@xvw(7?ya z_T^fWpngxVi1^m8G&=f+Gh*!@_-5p`YcT%T%RDz%{oK8_QrU{8^zNP=sM?z75J>># z<Ynmb&kAuVW{V#RP8+@HOmUJb`Q?ysk%>KzjnhGk<ipg@hDafE&H4)6>S3W=U`pHD z`RHUxIe9rd>Wiwvl~aT|r?o+8Yp~)xONr-z8qwbB1W+MoJ?j7~TVQ)8P@iHjYO%@L z_-M$;y}z41Wn71<ZMgwS2c~{hw3a6}k#^W4CBBUKcx{@B!)u$@%d~l}%zBryJoK!< zU-dR~cqsWZ(y?H?-~CB{B}R#6wcNwHITfvT|ItxuA=Ch4zfux?^`!2QmS5qozCf_z zMt`baCXB4ip8RAsjc#Q^4<YK9VUQMG!FSvIJ3$Sp+lflWw~zuQYrLazRKFY`Nqp?u zPAHHp?9k|n9%VB;oh4PA_LID7pgCZKzD$h@aa7e|Dvnpw!}g>JPk+4XV=e9R<#@a* zwa#g+hJedcZr(o5ErS_fl*8j#gB5PZ^uuA;VIIh~$dDkGHW2dI2|Tu1!d5udmk0B) z$ZgB5IOtb+1<`deG0w>8MQVL?Rs1EW^If0zTPQw}&%+<{++XRz%;>@`!jM6m-ZjDP z`LWL?jau@h*ovnCB_ZUF5YF{U8GQQ-%hnia4U^J5$ec3K3OsHwTL$+{_|5{N-it6i zp$8MD^45DNKu;YfJX(**E_1p@zWlwJGtI5?utfP=d^a3paUZ(>fXX{=oV%b9TxzS* zPyDgLgrD4lLed^Nm5Drd{IsjHJ0<MLDOcA*)HC>!0=+8^t8o01Dj})JUraSTCpI?< zy0c9^IxlRtg<GJLoqU#RkWtOdC(7&nj>meqnK)1(>@@?LwXxIg^An}0@Zu-xl<)1| zRJFM2A?<N0TfCNCraZJC=Hz8Ry4L-#ja-6>6mV;A`)wk!T8h^ar#@6L=DFW>$Sv06 zlUtvx?a4YrY326>npgA3De!CVyp0HqpeD^X?ajbuO^+0=r$kpQzVK-y2OK(wrs81N z6&P||z;r{xYW&__<{`I6-chkekIYc?UbDY=j#MYrnn#|$WSVeQ!W+YvgZMV1T^CB> z4BSX~RhY<RQ)$zk>jJPi1R~cqiL1<Uwwo`%7c!!-pXN~!%^-Wd8;C8&=1}hFu+D3j zHn-S9A-+L<Oi9av$i<V4Z$}QJYl8mGIdhfERTRJaqLJo!t^z4CVQ)o8Q5fmoWL`); z{7BlXG{vjBTFm7hJ~8c1;Kn3NC|MH|XHPP^bkwz9DIA^jy{tar5ZTAP#Lt1KZzVR1 zx#b9vq}D9efv1K~3!4rxg*D6uUO$xlrEzDg$bBL=jIQHg>PDUtFr=@qCeo9p!7tMy z1{ex7_7BZqHpI@_UTzm?;>*-p54R4;jpTAt9C%Ys$c~Y9?$Iv&qHsFhal78qFIfne z*D69v^2I_#wnBDS1`EwxI^9$_bT(j$fT}d1`@{#724sa@v;MA(-$qb8_5S<~;cKal z@7Lx>6kTDnP&c{C`FQytWmb(6<6o}Brl?Akg94A%%KJ_C-w#$P2}w4qy?*=K8dsNY z_6;xaXHyjsqc?8MQH;APlHzB*HpFGRd<A;8sBFV%6aP`Y>R5RX3uxz+WQD!xnZHbw z<W{G8vD5>}KJ~~V*FqARyDLxQx0mYDx9Q<FBy&}O%gcJex%Kj{6ljTtZ%4lAVlRyc z^7b;yx0&GtQUPC94{9F)u?$6OW1v%efn@Lto0?OPDumtFV}lMwjmzS1wg$bw4)xs= zw3tW_xEE&!1f7Zt4@PWtdF_3%X{U~siU|!2{i5U^#JN~sp@*d^1W2kv*`j#%`Q{9K z9ISm^Q@lLji~OlW17O9Nj;Zc&xz>pAy4Q<tqcd!G*`5Q6K|6Yg6e3+g>!~%q@?~(~ z+rSpdJU{~4y+FM(P<c+wRYhJm<u3Oo?qo=v6~*vgqx)7ee^qVL6xgG7Inpc&C*1E~ zf!u3h<lE_;StB%p@lyTl#^l|;$>WNE?ksI%y$3;;!Y2*y?BF?kdFs^KW2rMqCWC<0 zfg)-W7<9jkgp{Z#*OLwBb{kex8H2O25um=@Add1d)!z)-Bi}Y96dWw^^^MKT^2-A7 z5}GEr<!#P-mWCsd`MeSQEN`PZmClo}A(30%!pG0}STD-P<SFe2KBln@Jv`X6b6!lc zIP4C(PP6sa*JZJTmE6EJbGT4bvadU)eZBh{&J|O`i*`@IBO}u663(FGYer2wjN{*> zIXiO_^o_SiDQKLfR-J@Uyzbq(ZqY#84c0kx!l2xafLPb7fjaHpVVTW%*@EB6_h$b~ zrvp7q$iZych2*Sn=+G~HX+m<P=}6mjG{R$Vg(>vd3@vCiIrftNnR7QF&npaD2_M}P zuy4I)P#{@>dX#9cAm2QQX*yfCZ~>yVq_tbeJYP(5@5;Rq_G060`nnYo8^8Ojt%5LK z#3mUUFHoNCBsM>?5So7hOb$CvX(3#<(T_T2D-{%eT8OuUWjPMG>zb3z)JXXtp&^Sf zbJ&GcG2f#UX(uYaI;#l4qF+>^K~xj&?Br9d_`(3OL)6Jx9M8s^s2z&jBy*7?efs<k zkqkIm=z;&9rByCzcY@sM@d026DGF?}+du3ER?wJXM=}S2*aE>JzQX$;O@xuJLr&XX zzX{<mbGwoM+B7zR>JgMk-EQ%>VE-J~HdQ!x3diB6fIq5;qUxR?BRTwT4}0gN^@T=D zIj9y^Vv1y?=7AumSKq$yaE9)~$=`8`h__CsMpxLM_Tb|IbCEy*Hp&y{P+%S;J%F)1 zogC+y8&4wGb0q0`Y>ztk+jS{0kw+75pTOLQTu+U7mPxJ)crWA}oC`pt0P3j*Uv~zc z_1Fj=Bfck~`Ff#_QQzGUP);TgzXl;^Al~l;NneB-1|1bWYpgdIO(L!b)@NL#3PFSZ z9{&c=z3d#8xix^Fc$--{>VVKN<b}Q6lLAh-sxX=ds%re?iF^Bil5vw$9mx2%O_yad zC1dZ@Np%$pncsy^*rO$-&CjLvBY_Zegm5$%I!!BRoIg2Q;S_Dw0_Q{<NEjgkn5)fB z8|-uyBi0QrL8--jUW6EuYt!jBt|<@Bj@?SG;HdM!7!IbRdGb4ylpD4pw)$F?g7K&s ztCeQ&rif40PpuZPRtwtJzfw{MEO%>_@6IN(A&qUkzKilJ(1#5rAf%-8-T5pIF}TT@ z;brJ|Zn%LL1hKe?6*M<qx(Vz-C)0kQq)9K26x^7;)W@0?h6^h8FT+cw556(`&qA^5 z6U^U25~}16#l{pX@TJlwD*%(QQ#;>2!KVoHG_j>^PZ^}O^8lZOiEMt2$@(&2?o4Hs zdmm5$C{k`@PoCzG47$b@v?1P#eVv=vx#8V_8KO;^END^IT#KBU^|-q3_vdJW<06qj z*Y~uo9P-7z_0aOeFq|?^wz6gMDImBDxV^6$-zppa4RZf1F>!4Eu%P_#(e~KqCNr#u z_!0Aqnr3O%PO(;qLACwcVTU_#WWn_?%~E?BkRJl!2b;H8+d}YSI=_*(j|aRBY@FP* zn#svv^4Zz+=knTmE>2wR>U+2ubV{eL07KwB{t=v~yk<aJp<oMqEV2o7YeU^Ovo42D zm%=N83bn}_m{$31cj`!|jP+=2yt!#OXFBY{vX5*WND(#xDu*7q#8)RfMP9<)0Q6(h zxD6=|^Vxs(1ak5s;v71P+{3HDhF7kR9vF1?r!+NR?oW;mGE!nDBQb?B?((Y)F~)oB zXW9Zj7SBw9agN^iv<zBp=y0jGqFI4<X$i?zAfNF$w(;Ths0U~5!;%0{bxB$dsJdo` zrrgLlV|F!RVj^F@$Ze&lw3g$GkpDRIv7kdAp?Z}q1yt9_vtheWVSHwUlMmDyf1f9y zbQN$_737m94fT2l7-zS5Y@C9`pQo0n0``jG5-k>#Fk%=SPVQ>DA{pf^!1YB2(W;gL zT922-|GL|JgG2Z?4-0}1%&J^56WifO_E$z74=VFov!vfP<gJR?Z+w=Ic}9$?>m{Oe zrfN%eJw)*}yIr#SF_|iS&SRMrgO`5OjTxrv^#^56bLKkLe!g#Z#g!u|FUrmyL7rTq zyNwPL6RGu=6gp1b8z5=q_i;bub`I5McFQY4f;uN_w@);81TbBXevI!AD`fw}3Slvq zUrV{HP)0%wAjzFXlp#Bje3OhHDeeI=XYc002hJI-VI=UPHG&cc6LQR9A$2GxIe0B` z6&=Xu8U0ufgaFLMKa;PLrpx7YJSO43coA9xEGq|gFTHhpB;O|^V?w=Z+bbVX>0_t1 zKiUt=(cvIgkzF3syKl`r){kLi2qI6Fhb(fp8JGU;&4TS}5tTOm?>T4PGUl%*K&+Ag zoXg~D>_damJ+YNWl2F&GBP=EYIbZoe2)TM!1r!{*c$g!pPFBlTg3XdUfUfpFVx)Xt z;4g{!_yT3G;wT1ej;yR2#fV+>E?;ztaF3h<uvVp@uB)uui|iXgPeV!0-=Td&4}I+y z8RcZ2=s|{{BxRppStpV9c;Q%TZbXdpsufdjew1X6Rm^^aSltszyNM}=h@A+U@CnF} zDnCoDRPgt*<v6@kbACI>>ukq}b^AskDcjO1-|VYXDq+C?s3yiRhb8Fp7D1)AmQtps z)ThAUIPvM<5W)O)A}DqlO?*3#fIwjDU?2Z?Sh4x`xr2T}K`rR~74%a7UZFzxD*}Ad z+9#6sGr{9V;z+Ura>IQiohH62oS5JCig0Z;xZyqfVy*6QJ6a_Qaz~Q&LhUC0V#jz6 zO@*xmsCs-;c?+gkZU{OJ@|3Hb+jS(dYaY}#LPtB3ey<Zx=kj_p-xI~4ztg-G#vdQA zp(@JzDg1}?=wHFPk<DMxrw0_=66*F->2hb<oC1A$Al|)o?&7{qdbvGer)5W<1T$ap z#T-%PB{2hwHlX3ueB`5AZ@h-ZB>CiQ!iu>p+7~5?@y7t2A?A_TsR;PWF4!=1+~&6B zxD9OkJn~nhpUj^*@kls_DU@%#>Q8q#xm(#QL!%`b1ixa`bn9y3Fb|xR)2vipw9aEQ z$d|{9aYtu)rD(oh#0v+mic~df8!6V)D`C}tah0rx^MuYziHy?^*?-T+&UG~g@zQv5 zY|vj4*fd1F_oB!x`ggZsLcNP&Hgj&Mwb5dAN=FF3!oy`2_2!#jWc*80e|`9C_h(K= z1F2MGT#}E@_9eSO{X~^Z^d7M3JxxsUdw!8hDjt%?rGcGULx0^WOC~@{V5i)Dh>3S* z83-%YYvdjuQ5&unx>>_-q0QtoDrtpW<*Y}7SCOo|0Q5Yt?hBLj1t~)D*SGt>owOtK zz)koIfQ(((%2ecQ2JI-X-y?K@OVu0|)q$IVNNWh6vt=qCUJ&E2)~U#t_MDT0B9WYW zhq(Zp`??89L<u8xICY33VRa5urYeEdK4D^&w;^s;67m1~U}Y8V5bI6!y?SHtgOVa* z6A+67vOUN3l{oc&$dzWoX#gAQTz>qy;da{cYX%yotY@<}b^$)KZv>qIz{!7mbf&iH z^ia`xv4`SC|F1yl;jOVsP<1T3b|;xP;M@S>KkxE@UJVBZvnjg(gfLT`KfLhu&70^W zDsts1#3hX>He-NIe713E?GpZJ?3;k^ffuegz^6rMn3(mdG^D^_H<$={<4!aH7<3zr zf)97rSr1>Q5CE&=ng2);Ty8G6mtAJ0P}6klYu+4@TQNK_y@9sk319NeoL$O15dMU( z<V3H7!O-xs4k~AzyeUA}BQG3%;)SI{yDbC33jr>s!qO`Njm!tK6H-C8F3eaw!+pf^ zW$M~p`53WUGjI3BZ5TE)NSW{ZsEgaem$&#iFM?rJw9$YSPR4A$3BPq!;NF<rNa7DL zpQ}*97)YTAJ5*zJHG*K56ND-qJeqcVAC=JNtWJWiBf-D<)W~^N#D2EI2&K7Npvb|y z3R?<L#zL;Lb+cN{^`ZtQD~!CkHx`Lq*jp^_`R)|-oN&6_GE2^Eb>MR-8Yz}}cfN&4 zbg3Vtc8)(j#|Gk3kC%p?Ck1}X2FlVG<5G9dGPE13Z=Gef%9`w)HC?9(7TkwNC0+v4 zh8*~weMz*-KnEXm9A&V^peT1QT)2@fFZJX(Q?AC6{bO<i=YW$lz`rLb^CTsPMy!kb ze6@s5M`kkMOi=RJt_WhPC-V9eDaKBB_JiH^0RKQKF_?MAuQV)$C$!o?`x-6R!;OZ- zrc32682qDgbew%7ZyO;scZzZSx~EAAyB5qI?#1mTd4Fs-dFk{7oTz-dBzZ#nc>)9a zMe=0|N22p`9{+F((r*cAw^o&0x$@1E(*(^|8t_bM;%H(5t!!`es`~MdlvCs>?&S0x zP61}~&gh&y>{mjLFhFTuS?M4o4((<H=59PY1%a~4mwE_okG_Y}xTo~p#{zo}Q+)Nh zM(&!j|6J3_URff8Y<QbzE5Wx4TQ`rFDOi|J%zn&~-V)yBc4|@YVcU>{y$K8sDpwgi zYHxC`>Nc<%FolI;Vcz}quUgygG}x~|;4R^4b(i;0qYVk)hU$JvnX*YWuCC>dVOAwt zBX4Z0+ZAu1^}`yh?T$C_iE+(1@ps?B;OWz=ViEbmb-Pq2VUDE{b)vOqx<Kw|rUotS zx>pKM&KrGPky;XLn4)2`GFcgv;gQ(_|7JU}7u7pT-T!gGt}dbk&hwiKYszyG>mden z>5*FkWacw){fZjem>&b!2F(j>XWqo6PC)DQ&Y0NDU_07Hwe*R}hbiL3X_J%TBUbKO zs|;$9;g8`?8BVLBFP;u{m)28uV1wwu6;PB59I97MWD8%~G)L5KcQ;q*aP~b;S+jtY zSs@2SGY+=N5j?u8BNhki?%Vp}$soyw1Rg7ll}l4^!XGozzlZ(hcPAb`Srb<tEm;$H zrDGKZ<JZyAe4*=WxKA0qMvo{@cmVemG1T|j1l+xj@r!>r72kr#q2QcO!TO}8`}m!1 zNZr!vbznBz6d%p_Hhr_MNw}w+Ejsm_#Ym-byj-?EsD_Wqj<?LUlgb%r3v{%q9zAN_ z1z0*u-ODsU9AQ0L!kOW-WkuhBnq`?pR6Au~cFu;^Ne=;%cZT)k_<YFV^;tP$5_>#I zdwsFhZNY_D4byKSasIS5_bMx@@XUXx`OzyA0vR_=THl9N-QLx|2z|8K_fV{c=Nl?l z1Tk<I1HEtRgL2IWF|2YyYv+pR(~^eH;5nYwuUn(OKq{28UljYM4<V27S7OtH!cv?- zn~A^Se@OijeVqcIZDqeYZ9{|m!XAEB)x`$e>H0oSi;W4DcYtW}HRnbzKd63mf8=)k z=zS@OTOHoEx#CoP!a+*wZmXPRA<B`Fh?18`KW4oqJ3xPb`mC!>IprJSt;(RG)v?L( z{-bU~lS{&;$t44{_&^Z~rxAEN%#%phmNLz$G_3A;cx)2@fgICznc1PEtQi@Ctxavr z)k;%}(pJuT+Y)KK7_$U<paq=i>S%;i(2Q%|@XBn*e9|*jS$ksH9a~e#{twDUN5^?` zQB-wEQSIr{N70*hFRI%>w28go(dkc{c6%QBtDz3{jU6CEG?59KNIAFFaTU@uO}Nw_ z^--t%u-jf$;`AzpPB{fgv>rHiYYiHD^g^tbdXs*nC7ZgGQ-*27D>y*i#ZC=a>#0iX z(a6bK=V16J>H0w4#ZRYs!jR;ta(%xAO@B1gNrRoSEa&^@e5JFY!wv&Hjz-y{Y^Vbc zy(*DMBnALh0ddK@e(ID}%MS_4Zq{!3v5);oWdm7ktDGPPfC#aXG5`HrX{gu^?@(;# zZHRf8wfW<zrC8P>(`FOZvEAGWZGKBRx;|PlXMr0ZjBk5#15J{q!JamwIrob@-}dk0 z*h`;ynq&k)uZ*TDH4g%ry?gxHwY<+zt`X-QD)iKP=kU%fv8_VIFAhq09GvoyZb!^| zmx!+(?$Xg47FmEnPoLNWPWJl7PR(QWCPSJO?HZd`&@V}V>Q229$UHjLsg0sf*Zc>~ z0T%Q6a;V4Zpx$C%T88E4-7gz02jvSN%lpcXR&JyiuJ(C;k!Pakt!;AhetkYE{U)K> z51xNaol!h9h8wWql|HcS@AWMxX)Ug_bj$O7S>naW<A$14^WIxd9$*>;nkh4p?;nS9 z0%@xWT*FvKsVvT<T-CHSev-!%*<J;vd%NBSF@Qaj{)k2S>B<fqP6IC7ZVZjX3k&3I z7hCD4Cray;YSrfgmk+e+q%AJR2oF0ucR`Y@KB?~}yWL9<y{>BUCV%JKR5#%gURNY6 zz;R%(c*N#Nr*XH<7@R0VV_q&FBg5rA|0$L>Waqc&UH&|J=fOL6ZqGaY^x0*pm-w16 zdW!rVMp!0{`hju^&tAF5B^P@Z0|l`cR7XnOKDI=Te%s*Cg-I8e31xc(<TACD$ud+I zDCAGzs6MFW)~$A<8mqY|TW9o?NN;jx9Y_yWh#zmfrF*x)M?bQ=4)IsKM2oV}mUeNF zYmQnl{zK}s`6m5L$Cr+da%}Y~fG#(ft8Q+iC+2&&`zyL<laNMWc0>Ms_ezRO6M%P? zU<tTIEQZ>ct<$5TwMN9YM3GkSLT(7@noyd&JVHX|AujG@*VHBu^{Um76Wn%$Ow`Zb z{7NMwQU40&I+#&WhRixZ`*qWm7U@InPY`36BPk%4@`Y#F@@xL!reWI(Vc2yv?Z#PO znMMD4LMZr$ivX*BZMZEP=J((Welz7fK;po+8vfKcJz=n~gaz{8v>@YWzwi?wu?3GA zP7GqUsVu^yUQE?Z1MPnr@LNty7rL;=ria3s4T$2bFHfg7%J}xH%tFn%Oda(dRL(u) zT$MBq#DrRn?0upe%Olw-&-0)4kp!IMoAl|g4P_TSi|6x{L41ZYQMC!+nbWFUjTYgH zInkg;4vEARYr8`8qpZDqRoJTdBMelVqh<!Dyz6Wy&}w^?+&;oiI+Scv7gn86In~|R zX~;mH)&iF?$P-=imQ2U>=A#j_{lo(mEs=%J$I5SyPQMF|$?b@)PC#5HKNQYxqA1cT z-SgI_%!JAtyRm`uOpoU-(^$QZQlXSn{G`V9Nd8BQjL3D|$)&_W62nX3^_i+a9KOEi z0B%A7fR7T++ed|Lm2gNe75tEhq}5+Aj&1s(LEX+Ltg^00k-Lp%ZK)kqX9A{6B7L^P z*BiT29hBkJRJFe#AyocL0}&CGSl1}NTSL5Z1iS%6&Z<`uJ+9f(fUurRh{{giT8%Mh zRxSz?bqjgUS6(`*wwo>k>UU!novy-8F?fS5z5QY6!AYvRX@jRkipaS?Vte{XFWf5v zT_V$Ng{fAMt8tC@j}V0Fu#j=9ytMe4&+5^9U#{tRJ;go8uA9D<itUVM62e+`R!f_@ zfYx~QI^||@`iAh<rNus)e3HBXF7?Yl;OOC-0^U1`9=&IVe#e`#f<Q{)B=c(vXBPvF zJT(1m%BJ@qgZpgm#4vS^7=IN=2u;@jMrDo~2yOP(kxL1Jp?he$1qkr~_z=Zhx+bpB zM=dyC*3A)TJ6<N8l#B$XqyG#4lOt?*_0+QtFbEzCkihyKGBaXr)Of-VxfJxeR|mRv zjRxo$Xcq6oAjL=EW2aINyUA6fiJiLiSb5Of3G9$qCmMOSy8AejwZM$a%W~ZHh2u%D zBZ&Lagz9|Wk@_%oP<q%0+>GCBMY;r}Ikn+vFL;!Ad#T%_CFAi*L)SXe=t#2C!0Fq9 zyij^=f_jvQ*A_LlQ4vd^>TQdrP`{M8<F|6W-LL9QJ1e5|Cn1$)AcNL1@={FAU+#%y zFw>5^oIJvE%YyC?XZ+W1u(!?cqfDfNf(GS-d{I-yF5WDBX1_8N=?w^^t_mn<Ge3Ft zCqkiIE5M@4ndM|=Cu3)PBFQSBLdMQ=`*%j#k3H&-e<Tnj08n7(#~FL|ckF<E?h255 zbZYF5ab{vApj40tfDC79+~5EHJ9Y5auz_Ck{P4StGAcN~A3{$=2>f4QQ)<PFioAB! z*iMbyLuu%GoehxB9y_q?N{+4=obMO=b!7h_5dQHkzZpmaG3ZtKESpr+=2g0`ZCrTt z=c6M-&Y$uglg^(KH|J2*A7}W_Z;^ul`Lb(y`q5I*Umo|Tvq(I+3Oq$fqG`b2{)G%V zFr3-o)>OK`x|cs);{r|r3y^VoU>r^Qw|_xl0I;Y&oD#YC{l)YC+cmC0vMyYdEqE`l z^|yav>Us|P9rE`a{QV*R=cWAfQvT*FmiWK4QqB>L6S@l*&dyrRsGR>LUAUHp=SeC{ z9!QK!xV}z8xUQ=oT9xzc7iqsqWRApZGEO`N)|?8G5YnLU>+8=ZY2H9jT=;rSG3KS_ z4p(MVmhK9Bo9`jnBp15{ZyMJ7oWwtkoN6SZ?$hpT^x6(IZ1R&NFU5O?`wGr!vUTGH z_)Ib)z3%Xo+@JLIg)9Hn=Ut*imE$iauS8V}O*cE+neRz|xD$2neaMw#$@^X-R}GJE zUVOvQ?s`|ixd*?P{sPW_@!80{@p`5snHld(6fgBFJY0zj|J|ov;Wf=tb8D3L%~pZ` z?xBDYct?kGgE}C?B3St1#Tys?yHDwD;J#PiKfd_SRsUix{WHRUZ(98`oBm=F{r;za zX48K=o8Ddb*E}j2=wu^SVrENXU|o=->aQS*`!5VMV9jT)U%V1NnHkVXe<P4!C#@=i z3|((o*MeDD%+>uilw6g0>%X(vlXowCi4v|DAjfTabW!#V!<oaDdhfjgN#ETi2azlb zPD73O=T1+3*FTBP`j=ni@mi1{GBa1E2tsIeTO$G$Za4-sZzq(ZW@@4H2|^s-K9F_B z-Ce%)cXu6*+xslIvPukkZSx$GPh@ZG-ym4VlZ}}m&7MTf6-~US91prDb>*R$=T@`~ zr$82Bva=#TH6Z#MR#WoWf(8OFosNu9m0H==ydHADgiHB_cdDO`-%~a}EqX>Gn^+@0 z9lx~Cr`OWzDDSA0crEnAiuk#9FMUGH)V+o0x0VVk_mXWZDm7KGS|b+a7gG2gthNWK zzPhA0?Y@6;rR_~D2|-pU_;G&hm0E2k3$73<?hwiC1PAfl>8W4{j44<?tjo-GO#FVB zY~OSaxGEj4G~XHd+M49L@0V1k6RpWJm;r#w6imnrsdVeSyMkVgMrk$`x7!b_oM=}% zTWzih*k&nJuZw3}za1TzvnZ`76ckld8-4C%R-U6RdV7wNJ?%={-`s>-NPv0KGCbF8 zEYa+O<NamO=>MVYt%Bm(x_03R1WRxWG#(s6aQ7g=U4y#?mqrsLxVyW%1#JlK?(Xi^ zIGn|PzwbR&|HY~OS8>r-boE@%8sm{M=hTvzg%7(_Q4f*JyGHbg9k}&!jn5mT_HM@7 zGOd;iU1F<3>^cuEiB(^XDqbR;>P~bNrj^g)7_;0jp{Yr%_hBPwC`(KpE&3AMOZchf z)G(~h+DG(TrixrBYXiaaQdV0v3XQ=b!hSa-Ut><9ZLG*c)pRh+ptBv-#LQ*mL5b5# zqG>7Yd%dKizxCw2`rmdTY-@6D=XmNS){EHl+#Iy$i!|M#DYuICr`yDlWryJ@YUNhD zhN!WGZ9gUO{QLxqzGsF_#W%l@$x2bS3AVBlRT>B?%(l{zigAgq{&!i^=I0RmtoQ#8 zYpaAW@6CqaGBK(#g75EDQ_pm!7)G#V*Wa|&0PdQUiqJoVO@&v|iC^B)KbC=Rzq;=j ze^alZFsNNEc<K#x5ckbq-xO~)8rpwb`n~xoq3FF@DOL$8sM2&J-s?F#y^G&jA-gJF zt|w_uDm|9HlN>tzt}T*25fQ97T0jA-luOn&mTCW5$!n8h%GtETU8z);M)?nu!Ig!# zpUY6U)l{5m*ZtpqH$VD+M}B@019S<tQUDo-&-6_iVpyI7l?-E+h@I;RU;C77oRZ*j zsLM~XHZ(T{jf%%N5ZA}JqM!)#LW~{<F8_Q2Vh%)^;~o()v;HDQwhwe%h1yiCxl*`V z@Ij>GvE1Rcr`i~Cb3su-hTo(NG%-n6sQB16O0nZ-aoI8X-nGd)p7HF*4(rz2U+9m! zw8RjrC{68(+jOR~A%^QLgstQ(?yX}4$2OBgtM6D}w?(>k_WrkR{J%a3Bv8C+lTYyE zQ3Ju(%luVri{!&hI;e()I(!1o!&MQ#6Sgsw9NAr?`1V~VY4Q)1kvR6ipN*#RC9#ph z>l%-mt=$h(%O(00<~mEVv783A^_|`InWv2KVIi5L@8Ln%sR&^p<UbW-`!g^wV%U73 zgg5_+W-_1y>@wI!4-ZBtTEGPj1aZF-?ZD<#_!@u4i2>sEx=qRw{c|<F(dz=_CJ@wX z)HzC0gnYTrl*K|t5b#A@(S3O?5<8KZef6xVN_bSv7bg~f3-H}KYb|PK2{iqK+@s2! zYR2YScCnp!C;2hoTN7_G&(xcnuNeWy0xHhvF>8(@ftwrS)rftM10Uf=_{6K(QzwG- zq-{F&ZZ_@hu!@-}%DWCCql*dSh&je>*5LjX4fX}U5bj$sUs&&-7BKBetEPKpk}OtB zAFa+-f-2;v5ObLzXxN;GeBfZ?A3T!xzO&@3Yxbo&P?oa-L+Gc;g72b16hdxO1TB$j z%@M>-N=dVg0ipESs|5)<=yxUq;H0{vHw3K?vIqD&zS;dWLhZ`*5kW-(UZR3sKmjy6 z?~m5d;rxw6jnSQ<))HCkiY+~OsI4$?;KhTXPk>D1y!oKTMfLQp62%RZCW)1imF^y) z^0Y_3O2Ve*d62;Ti)(e#emt8<0JuJCc*#Y43a(UH%Wb+}@XC>-H6>7TQXsP7`NmJz zE>h*VNyzg0tXfsWJ`c09(EWJx(x|c~hAPYhEhcewcQY1_1-OBk%i*}pwQR87A<R&z z&d^l?G}FS{zy{sEy#8HXbJ0o91-|;Ffy2KO1ddj$^)5Ve^|sr2+H&u<FhvO4yzgQ! zLV2WV)||swTynegewuSli#vfx4aQ^mtI+|?e(G~t*ttj4&&!i7Hs$JoYa<0mO=Bq; zq%yBEUg>1t9=co4?VU7kk2mJ>)YW_TcPrtVyOA!TJnnZ<pI1Cf4o#%7RJZVB`UI3k zaJfGH%NlVl`^r1}`uTmu8`KJ40W}Oz1NwQO9~UI=D3?{}(14+GRadCET?yz9Q(LFL zNi-uLvsVNBkjH~Vq<ftGNY&9N5{zM4_53VNevSW4gfkpFp5kCf^5c?TF6_jEzN->1 za$&n~Cn|;!>v-annwWt@gxv6XS*cDgM@bztNzF;qLDxF7qR;4&iam|j(WeRqEV=Bo z+$b7pCJwJZT+Crb;KGVcA?5+s`6)%eQ6jNMoM@=G8$ZWj@!Yd*I;vXp7rkYXPof(r zF1}{CPu3EawAqxX7lyEtRM*;RJvTP&?Omv{=s%&AO4cz{DZVAii0<n(RNHV*;*die zG~|DDbeQl~;*+)Wz`{DNQVMLf#B+e%SZt&)6#RG6Rw(fmj9BJ-(8RBwb@1+{-eky+ zQ<e{G^W;23yBKaIYYyA<!pf<tF6wj6cVRU6BK)pE#TC^@^Od4g(`TS%Kjw{91}@z8 zlbX!@onB-RIe3%%Y-R-U&t?fUP`E6JthwurBpnSY6C?~9*7g#=6199!5ks{dp8!}0 z!cDSEDo{@5a_5iwvJA$3G;Q*IX#=sUiGnMenIpkDjLE~<T-o)8G9wCYhb5?Kc8!lM zJ$Y#m$=q+4K4tHCK0rZtlf&P1kWRjK=iq?OEQFq2S6d!Z%HQ$GU(@uUSf`}Z?8s6F z@AnfH0NdBf`%~6Tl9}`z^fvs?6FzY#fPdR<J#D$T%~X(bFk#@I*{`Fzx`r#c6M@Hj zR5PI=Swy@T&=5=pW2LRk0Ela)^yB?EJ9YM&s8D}ePn4C$=aA3Ku7($$-u`6Y-mCsA z#KLRB0G&y5<Zbcm*Wm~+>kSp?Tt`aeqm77a^i0zVL`_3H5d*4Ut~^p$|L6Vvm!_k3 zGg_@8Q>4v-CE||5ebgCyKWVT}h`-h!B#1>N;=S8nHaJPtAdj@rwbj}fgPNJKK0uLd zk<NcTu8+nQh7nBr8!?=BkzFDuK!d>lw>hU?6Jn*xXH_P=iROrD;|D#z)!o~HnV8lM zbfbByeYp>W#+U2p*xmqg*-v=0_n$0cbbUKwZjr_mpF$9(Lc|!BvwwLJRiI_k9cr?v z;W9&3#gUEA`qkPPOd4JG8>)0mfnFui+d1Mn_wzhP;4(I_OM(>+&M(Ly6U~iLe=JJs zp+t?U>$*44Pmd0`smSEI{KSHR2pdLB*0+ZgIh9hxWiSLH9gCj1cXQOPhpa9&W7PjS z`5I{@nyf9dc?X?zQzM;=ll2UJ2Iy43J#{?#yPK4bWGCcX%kBF}_KR?YDuGj>*^a@x z3cn-%rP*>y1JI}DAe?SN;!AiJ8jkf*eOvvnwvD48p%gUwpm1q^F}-AvpOV4r_I%za z<#tSLPpN|kY7tM$$uZfgukfy}NP6LXK)aOQlS@G~MnrGutyDeX$qaf_?aRVeDgFLq zVN_;uw`jHCdwQ%y4P&8|JW%s1tLT~ODsEk8->rS4e5Z`Q)^e#GYe>|hLBi2U!2_?n zTc?o7%hHlZK`f6&GRT3kSP`+CUb-_y2j$`VnC`>qfRFzLF-*;prOw1m0>qwF#lQ?V z{BE=^o2`$OwJ;)*Yq~eD|IjQ*xUe#w4tr)0M<{EPLa6$Jolw43&|;D!TX$gYvG^A< z6YyI5H(RJsNBb=Qk~Tx{dhfInwyeX`Kjs!Kd~CbRo2b^QEE=#DvNtvnKWQ^)oNV)J z7)A`%xBjpWxhsZP%39Iugziq`PK(o{I?jKU3Kw1J|3!rUYY7S@e0pI-?sRIH@b$7U zjHsBoawcJtlrD~s6P=X<{i`LnXS7CujX6`|T%6URRqpilf#p|}Fc>i`-vSe$sM@(y zShTi6$Jz;SYVSU$n`Db_F}*w302bONK39UJi%`D^TMBCsTXoUx!F!zx%~73%BWj%@ zEgF^!->YCyy(w^xOY#Kt)oclb@IxCOO&uXMV310RakyFuzRz{f*D%@N%ebSLieq1$ z7H*0mwarvCmXe-7lV`W0u5ikS_8o?1<>+24{FaG30WBG6Hcn(E9HoaigV=R>-5OOn z&JxFdzICxW2kWg@vZ{^<u&Rq=V{VGicV&vC1XraPixUwkmXDbhlb+);>JIyB|KaTo z7ZtxOPgm>lFd4IK3Uee;L3_HyNdHO+=p_IpUGHX1*9_3ozfiu}TyA7#vlvZLA3;HW zAEU2Z#o>ML5HlmBfHfTU{j4Zrnm>m0wxebaLvt7QW0+78>#Z5BtvG|sVVkM@Kzo~z zPai9H6M)EZx4X3~IwG~@;~F>Lne=Y{AC(KA@h?jV5PmqNHcLx)znkMG?)=2}jxn%? zx}4nYbN)~Nk=pfuXRHi~TZP^{UBa+G;YAXRe$J$Bdr%(}rN$Y=spcFnPKo4Cc{EK? z4W8H3u_ySOB<AKl>uhVQpruw?XhS%qcQ&4%!o=#kY4|Wg#Bvdlrq7B4M&<JA3SII> z2HT;irod|=0X}DHX}y$kDM<_vpLeIX-1<=`j@`E_7=%yEq2TiGs=%)=(g2<K^5{~* zfohZbGvAvGd+949f>B<2;)15iu)ex@Euq(8rkAtMbe^deIa2K%U9e}PE*P>y_+v6y zw|>!h9eLhilgnf;AKS0MVR&^dvqtnxm_fTpnU3B=m7&g3K~)u2j25b$_oMYheuE>L z(!<^AiRU9a{0WCGmAT=<7YDXfM_5`IvF-?6QJKcQUh}rGs8rI+rJBE^&WBh5khh$Y zcRR+HY`NDqh71pJV=c=YlP5xSookRmbbmx{w?~pxwCB%Du2QOR(nj}+Q7oHH&p51+ z!V+F;_h6i<;tu8AM~De{e{FX$)L+SCRKv*YI>Eecd8X)0EANPb+jL{??{z#`oBVIX zN>ja+s_r#5BS^1ht{1EXA%CMZH;fn?hupt1hJJmKd|AzV(~2*sHsQc(W?PXJ%h9d$ z9!o>Z>ar`O!(h-{M+87mAsrc<5-%<R6U3)^2G@_pb*<l5#jo%yG{<R3otk4k!f<7T z_bW4dS}pgA39Q06j>x!N=3w9<bnP9mR48f9Ir>Z9%`=A}t=KFv)@wwEn+L7r2xB|j z!`EW21nXS977%v)?1EkAwMz4l)9+n@C(f(v;F{)aB7S;4(P-7Q$wqfginor>O#b_2 zI3TQ%IA4lCpR?u<jh-lZ*p9H%k~u!|Qb5p9EQX$nYXn>d=It(j^J1`FEn|cJr^*^L z=NH3@oiO~-JApKuToRab7+14}GBc>z(F^auK)MMK!a~XsIJLd}R>fuCg8vm+xUoSH zu(@30<1PWgSi-v(cxMwO<78De9J+m4PkvwQO?LZA?Jtx41m~8~x9Nj&dKx1N=r-n< zOaddYDs(^l=bSQ=pn!gOkt@nh<khP13V0BVoKJxVk`}*}lsZ5N!0x<j{-laS{!;5l zg^vY0s)FkzMt>u2r2|5{5y#Ld4P3Y(FKS2sE>~K<V|TSH4&%?*v;lkV?-TrOMeSc4 zG4aoXZ&|Dt{8oLIrz&nJ00Pi|fvxKA+!jeo7?|M0_Z|eeUoZ&&(z5d=YkmhD=!tq0 z0V4)^UX+w{(i-orR>g<@*q|cd!V$O<`=Ow9sqI{U?g8ddKyr<5xZZ^&;2{!#8-^L3 z-eBLm$#rAX+K-cxg;?y=6h^<iNtVTrIjJ>IqpU+EkO*5lnd*Z@`W>?f)EyfDSD+** z3cwS5toLqDo``{VZGLH*;ahjCxLG>L2t_rho%EZYKni2Z4UoQYjjyy2W7~!7NSSNK z1Q|=0uu5xr1c@@dzijEmIx`T-WeCp8{7(9y)%dBB%8W+`OGWO4oSFwQEJW`bIkfy6 z8mYMV_KXU@wW@X|F$a^0ug1Rv!7Mxgf=XW7MeBO<Qxb%*?$2DJt)+<XbCqRW*zw4k zL7WoyZ0Tgr>Tt^O6*R!AxX0^dPEwILtbI{Q(f=C!RZ~ofgb0H{Oa&n<?xaC#DgPK; z_a-a$35yE+uv>IUr|5hms;`HZKcAkL?Wwb)APnGw4b&)eL~%5FckXeFtE?Pa9bd@l zLZ8|Im9rpJ<45rz`6|G)2P^iy?m2%SvyU>%64{CMcXaYXHH*<VEU|-pl(n96_Gjx0 z1u1Slm@5m!aPMp}QbX;?GC{rT%M@=xEGz~cNT!{KYS9-rR8XS45W&Av^zQBeeZIR% z<2>d_L4N^Blgx4+g+W~bWo3o6`ueGiaUd*8Y^$a;pi7j8GO0Q4sweVeuA^bhe;90! zRjXb~lra7nr0S+9b-#rgSUpzR8rMa|@LKVxE2$O(mBcS2r$9zdfkzYlu0a_sU)$1! zL{u-H+dG*XC0(&FZD8tA>foGu>zj4@!rTE$;qPaSsg)Z%fPslVl)qB$j~BXPH;y}M z`O5n|TU>M<R$2z8U$-%DSfE$9@<IXx<c+=mD_fL9@^2K*$2wuQPE-Dr778R}jwO*p zbEp$gGYi>?fLpN|HfC<lc^JRxg%<~N9H9g+C<3eiqe`tKfp^yWkY{hR<$Z)x@O=4L z#LEIJR_5BT5G?%e-@RhQlK`AB%?lXO;9cVX`hVikM-xw6rj412N!eQ;tH<`Ml~Z+< zSUeG1BiThEDI28(dIw&}{MY-DcczMXyeGYmmKY=x6m;A&{=-Y;$hWLbV$_N#JmuQ0 znLI~01A2zCe+^?-11Rs@I@Iqxk4acfuDlBiydaC1tX1Jf%*MvnTw-*;BdLwrace9E zID-m;>$ZA3(84YFe&Aa@pX3>n0@jztY&l&Q=5kobo*$|yV88s5(FSL*R?ddNirpDv zf{diG;-8LH+GEbHnq&icF?g}p8D!jBh4Hp0&aGF_WA|&nL#Cey)Y23J-Iyg?OL@K- z;1DTFuPNKGSRa7#PMvjUd0OT&Kb*_g3KdRz3=9H&G5{i6i7H6}{9329dJ*Zal$7sR zG2}D9Y5x^2e+ulP{amHGR5PGJJ*9c!T%E)!C#@2xUJJPi6#}`^Q*<%pMj&Zi`=@TQ zB=WCc6#iy$1%=eXie>xm;8NS^pNL{;;$-g1Tlq1+$g6UHE4cx49eP^U;u!T<&JJ&C z?5BzZu{`Mx8pY-Wc_VqPQcMs8?Sc(m+cL*Ah*Gaj=0YM7U>t^QBuhV*-SWU}Nj2-f z8b~ICJeYtc`N*s4@sb#n#QSH7AfR(q_Rv5Fne8{!S<@4*NdZfQySgqfvV8&#N#1ZB zRqu%MC}%1E#{dnJYvi4b%WfhA&y|fn<2W&z!VvDX%n7479%4CQ;l0y2fYEVptqsc0 zty-^*<dT1n=yK_e9Axv8Yy~VA#dEW7)iws{Vc4BGelDU`4^X2qQBW5Bw@9@FvU(~@ z9=MV>FhWwR!Wf{l4=Abjy`nDqC_;ePGt0uAI|lxL*z*thYTIAhDlRhE^@b9J$@)D3 zLK~XcaRaE@u59SRHir6RN`;_rtl?q+$G})C_&o3HU98E(dsUXI=v3FBLCvAx!Q+)2 z$i4g0JuXfmIg;qX>zx5ohaYzbYyH`dzVDJv-_)uVGXg7V>*dk=<#SIsR%{XcnmkWi zSjR{yx)3umGo@m~_dZjp3!$olGC)j~tGhDjyLDAlV3XYFPn5z9-gujDv|ULWWu)nB z$vJUU>z^3yL+=Tdd!Rx0<e4GsiP}gmLfj$&{Etb7J*R;Fyx-W-_SzK1cRFvmQtdO} zYN6Gr1pvc?P#(<d-`7dlnf3KN(@AJjRf)&#|F2ypWCV*s#Fxd$FOw0P{0DVMm{z$| zA&|?_Qn*sT>wPIT|2&xQYa1GWiF*6Q5Gn~zRlJ5*oZo(|glw0iwrn#!K*@9tJ<K-N z4%*^sJq)pe_VCq<O-=+p_)(HDR|eVYMk9Xo(`{!+Fd>*5F>ga#@Bqx<tF%Ay)9{hu zw1HjZ9r!!>=yOB7{q>|A>!^18gS=AJ>~LVmDt70tW@^)lQ?{JzpP%mcVZ~PB`iNmD z(O!J~s=3Sl<=}UdBf^m)Iv)D6irLtp%+~4DF;%#MYIa)fR?H?}lQy&!9;9K{hf05F zY70gPtg4L~1fdjhVm%cH>wXj!^byv}&Q_Y%FbkRW!4U1=xi+tUU5mf?jPU#{`Nz|c za#Va+uqDD!L$SL`WXr({GfVyh)s8EXcXqp091RNff-frNG&cz{|4&XKn|1z!3@DwN z<pdD%G>!N{W=c41Vr8^E1XO){5@AR;6Lj|LV|b-`hBQZo(b$SjXN=67<!vU7`hV#E zLZrkNpT!uoxz8fNDLm1+=O{)<boDSgwhicrlGgC_HV(Xpce(j~Fv9<|ui$N$A70+S z*uB>Fq~Rr6DHlo_Ep}<8_L(deE6p85ZVex{>E848hFyC@$o9mTT6#U<G8Vp2SsLDH z)+YkeIkFQ>a!_N8JjRx9LhYtiyTj=?L`}Xt=4=?w8VZ8}b;o2Bg7Jv%KY$e*qA|{b zPCc3)$6X}Zh`Vw}rK;mj2>DhQYjebExh=-`gzLC2Zi6N8ON$LNDd<dZ9Vx9iU4@I& z#%f`<q;M`vmKwawW?ZJ+e%e7>zJyK1r$Smm5cVr4j*;^4q4l)#Ww20qTI+Z-7^w9A zfTt{XaeM`6SSMJqV<zf3`-b(_r+bN)lwrfJ=G^Q|1E1yMr?lE%eb2x>fbL4)XaCEH znAiaz*qDvYD+`veNb%F#X*U<R{qgM11tkV2EpI1_94UvI#^$Fag^Y&7!RP=J*4_T9 z0Z-ePtx{Q|#34zl{;*p15+VcXW`QF<tXNT-<VPsX#cH1<Nq3;WDsh{3q*{gT#j@i0 zS)e$AuMMSR7A~OY8#21<m8=oNHowzlHIl(7fJ8$&k}GG)Y*S20n>8@2vhO2>d0VP* z3X1jl(&9Uc$U{#g`_@ISU0T?!SIpP`s_l|j#qbC^NKijD^e0;Tb`04TH0&^}1f1G2 zQrDt>uY@E2WdG)W`7@q+Mh{_+5baBh^Lf!-YK&A2vpjXzMJ5xL@BQ$_>73%c*D;+H zkEd_h(ua)V>tl0OZFAs=CTj4a%Y3cj^kEF8mTM5!&^2VG>mr`P>}u_8&Ca1&qr(nc zD&*rXD}%E4*BCZ=Qkt!JpCH3QsTTP|B;J*KY2QrP_nJJiE}3r9k?!sVlCeqitncYj zBwzpfBD`Abk}j2A`!kK#g94hvH(6t=6+UB}OaDk}Jgoi|g%IZVRVXGkI_n*j)~fW5 zuWZ}-cv%(>nNWF&Hjd$&*+h=Q)@dC0;ReBKp&=f6%>DKCYkmIvb=ccG(QIFYb@{dj zaDm(}9!yqq%=jP4=_g|blzW?d)eh&A>W#J+e=0E2nLMMyn2e;v<{p_8W2nmJ8mYT~ z%r^#y5%7PzK3>V6X}2&POkkt}&c0MCF@4=1Ngq7>+ys3leO!lJ;Z2UL{dgK(+o;jv zc`Gx>?fm)POO4D*r@=Kf?g{_$SzX=w1W*3K>-<1tO8AiaZu;mI*V76$mp$}NDsYm- z@ru{(*+G|tCiHkg8$vmlTgq;|JW6=xIoDvpuhrz~L&%Tt@a%f1R@uv7AxfiNLrg9k z_tmKf3r1j-7XyB8htG@1YVJ>R7>GNwCH%&X>D#*RIx~0qP1&GG^ELdpcD`<V*V!JI z7KZDT#-rW{_x!3{`yGa{-_i?voz!Rkb^1E})Y{D)F{J7WG@6YZ9#JHvDkfbhwAX|x z^LE$ELhYb?TxYXv{(q>?-+R(mZDaSOMEw^)1YSmPAndq(&1zk+Y>1mE#lXSzd9SIl zp)l@L7h@VdSpFrZ^79qwm)D>d^0p0NmN^VH*>m0kIX)9F2npL<3VOF?K}2<r+ANgR zny)!x(z2BtSMf;h5Z-rj=BW$P#B(=fADg~?Es0Q3zgu@zY_`|3^kc3xsqPgky_Plx zNdxPs_b^>ZN`qsx+BJ>qIZv-}TH>AyqyG5rJLz5qksDqRdy}>7KH}9;(eKi|gA--> zIZc(C7RfYF#6V@e_uqTs)1446(~)HXhHRea`mrZMh7JkMI}wKyUf(o6x4a^}>2i_V zi!B8sRptlnqcM|$(9-S?=8DUUoZnf`1h1NGFR(*#FOYb>p4yKaZ~x|N_Qc8f(O4QR zcCPHTcL^|58o$FJml8<jX30-r%t~f0ZhV9bA3gCJRxzrU8V0Ese(NajB0{LAJinf{ z7_|&7n*<(tv?ng-ubWeU45Y;(6{jb!2`g?WDv?}MG*^uodX_LZpH2GXh`zt#`9ZE* zzDg3upu8BZ6=zaU$&li<<w3)&e`qqt)Y?JH{Z#n{C)Vef_-b)r=;kC*K%DPd>y}R< zj)n1T$KpNZidEPbU80SEut&B-1ED_*b+Xe}aW4SDwK;yst#Q03^v9^ueO$QHQE*s^ zctlHxbwdHZs2LpH9r2}yuN#J{=s(jM?Q}207>C)FPI@PjHy172wQ<Y-dZ8VJ^s}C0 z4waCWenDUYg2l>BCl<t1{2cPAfm_vg6f}4B_fp(f@!s`Dl-vb4IubV2Tw&FNexVBN z{NNn?E+|5t34%!&^#lGyJO!0YLZNL6ALf|PRmSIuPr$-=HJ}6K{GM6^lW3yw2~BVJ zvV7v!qhGFjvr_s#3mvB9(_g|+PtCd@W2*%aY4uRQQU;d@|5Xu(Nb6sd_TtFr2lbk5 zn^C>imL=_$lbzZ^jTUcck~{;vZ{BJ_UyiNA<~VHV{pPk6waI>s%R6G!ZG?)ShTAEA zHO|j^$+fPe9983SL;A~DA#je=zBnmqS_=t|j%v=ky|zgY_bY53?ZvCR<6Ffn#*2oo zx971#k5xa#f^-ap>DJT>l2Ico5<2P5bh5*r%$Sy%9T!UG@;*BqswMrT{_*|dapezz zTkTBh5HYu(RC-Rn%22CgU$t+Yj*nB^ZpB?^A2SPhe}&DP0k98)<IA$94i*<CfRrL? zS@5!57;Io%j^o+Q%T-6(f)^e8C*+S7wZHEz<Q}E-;6b&~?Yd=1$@qP}aMyXRuS-dZ zv<@cl6otYC#QCphtY#&Uu*>29=vH6zc*#~}#6j-BQ5E5~>3C4aUxPez@lCP|?q9`Q z6zA4s_)X?quvpW{E7+`(VkR3rE>OXBoqX@^amC6RYkvLX>HG4&WbP1?^;j$j!`jGw z(hM!C-Xzl-kY|beN^GZIrJ=bBBZe|VOp-$27ehYM_j9yszr7C5k}oIL4IIw<-_C{R zInl}7GE*pRp|DoV1n_b_G)_3&0w#gJV6F(vwiU1JTi;c23Mk%mlaow;99J2(cKCt% z0~83cFYositMIW<PnuS`?okk6nx%hsiI(O|<wVbvX)r108TRe%P?R=*=F%S#C3s4a zYLZE>QNLzSkIO<=uab}AINLqDFmc$wQ<ffNa_&({_H+!6%?OJvUYN{8{R$93V(i{u zKR=zGPtoe*JerJXVG3mn)0F(O+$k=G!&jLfAF+;OC!DlR=i{B1AO93M)VNT3Z~I`a zQ9$M4e@X>x4%%hB`uOELLNKXV*w-sxF>GYT?zIUuff{vRX3Z9J$bQFqWZQ}(Gw<$4 zRwwk-RvUFa+V5Y=;c1nBD&$KDs+KPiBP-T<Zm>-ax918zdN&XD{mv$JpJ#}EjuO!i z7hjot6!NW+ECe$(dQb`=k>%mERZ`MIO^xD&E?7<3TGa_IR=?O%e(h~|mPtXL?ow`x ze2NI`sKBC*VMw4i5b4MK)^*{?f4D!sWnsFtAKDKJ?%MZMjvmjGE(GJde9~sHn6b`e z<$8_j_OQDINyQ^$R+*1tOVujX=d+v~ak%YgWhH3srd6hrw(WHD5pe|>he2eP8a>3W z%;pO|Z}sox_xA#^kW2he<@Eb}ne^;*&nGSVIR5LFr=oX8eKCSabNwsX7M(kUUeG?n zlP2ju+>QD`y^=Wv>XmmweIo-39$Hn3@=BqoY$&zjr)-+oet6lCy&4GB2(!g8Y4W3y zUln<QM(p{Im7o9At_D{!6-J<PDX;Is{ga-cs=OE=Drvs)GbDce7+!?Jx98i?bIV`b z*T>ufr5euTi}vN3)htTeou7!1e;MGM$fxSzOW}a{Rg~}<qYgW>a-dTkJq)i<Qn2*A zRptmK2JY!%sL?z$DSYVG5#Pk2uZjzL<R9gBHGPJy9yo#QFz8sM^<0L&Oo0G%0*b#4 z+n&$WS5UyH@YJudKUU5Lh={4=sg1d_j-dsIH^*)t&5L&6jHqs3<UjkilrQ|$zfbbd z;&j?Vze?pzErWp}aCm%Zjf;^D5k`~&K)EU<_x8<Ume=m7EwW&}YlU7ey+0Cqs4<)) z-QNP${JiSSB3|NELJxMA7@7eo7fcYnW@Vg8$$Z8Vshc_OXnu9!HR;ALi(rZ?>Lyh3 zy@@M)cC+4!j2Wr1_S?cAM|gLiH9T+ouP#se9gA8#4xZ(^WycGdOhlh<f)SNti9LDt zSDLcTdRZRtz>B~|cT&Q0zS|ZNGiwq_HwP?SP@RZZD;(V~NE;0hQK#cN|5OPVF{J5? z9t@d%_dMbMWElQ6)$P4Pd-dQ)X1QSF6}e6ENN?#L68Re&xjaHG4GbdUe#2b)Kj5c! zauU0Fp|R|H1wT9TLs#rd@7vk~_D+)x7ci|-wmB?~>b9bC+(&Hg_qaSsggh<<%DEDW zDUC?hvM=2*Q}}Pu$Rk4ZlTw!4is_iCZtLgG1AO{f>BHHEaN|MkjD6m#PyQYuLc0p0 zttfx_x>v}JRUE6<xnpO>SG;o0aT7>9@XQyg<iCW+(rq8Ho95if82x%EAi7&PR0Ikp zJ%|Cyr~-Mb3-^x`N6hk~Es|<hHoh-4Ugw4;TRune)x;@oRR>*aJ*Q=|5^Uf8g#X@r z8_@XF;vc5dxMMQ~jJIWtNh2wYl^j1#RSRdE!u$$Pc;%*lYj9<TM<&F`B?*j@WGy?| z$xEH_eSP!V8eKPXY=_KW<1<^7h4I*!cNqk-zPG#WbFXCOGRlAwY&0y<vCo>-%g1Nu zI&l!aGg3G_yVkkEX(W>tl~;RgIzOX!tI`~<6XerHMd2UN-BK1a7gv2%m5Q@&6L!Cc z!l6}ZeR!eqAQTlH&cWkM4yNHaH-xD8DqR?At8!$Z!0#g9qU_HuNO#$ho1Iln6(s{H zPsFT3^g>?(!Q|QN$$(4`YKfR$C(${T5uN&!X=}vub~4Q+ED*%yEb2z!Q%<_sNY@Uh zSDDE5Rjg#?VG&L-$Gyebw^r$VvK|>z`*>>Q5WaHlK4SuAWBLq&Ca9TXUo`oc(A-?p zHDHAbf;@c`;|9~^lCeM3@;tAeWI(m<imMWdzp>e^{D8m}%NbhwAAO9DEjP)wk{#&w z;le%z#?F*TKLLG|_uiwNCj#vHcj#L8LDC~zER9yRd;*1xvS5KVC_t&BDa2Dt$4fai z2nzvG>qjm<pYGwZNdUS~rGS;d%5e9VsS$0$$+BBS-q4L$bx*nxS?h@j7mn&Nw@pHx zOmcSZ#m?w#<l7^t$XocIKWkx1?iNp$p5a`nnsIH5uE1C{w`O`xNC1vtmYQ&OMN(VI zZh=8RUyl&CP5@0_I>&^1_mI*X8D5WVp3u}UBFUdbLv~pV1)PWM6Xr_9x(F|EDsf`_ z>iIkQx>?)Mpp55OzW;G6|N6f)E0jGmKi$$7n@8}8AJvUOUo|f?R?Tv<K~XaZi`Ljw zIuOkF<qe(ttm8UcDW^*;K;6IMbhak6L<aB{8A^W?b5RPEhGinpfoZ=$ME~a}90yeV zmh{Wd?$|jQ-?KpRb<SqTWEaKkkD>`f<?GCoqF$F<mPJ?NrY`yQ6XA7nM?s=grZSke zdH!+;-*mBGz&dP9<R-d-z)h}Qt@4PzBhPa!E%oxTy`kubVEl3nkG8w=w8`hC2I=R+ zMG0<^*+2H|)~3=tL@TOOJg^1s!#tSuRgWEa-55RN7H5!TVq+=1i41BjZ0IzIQ+z@8 zQ4DT4J-f4VLoTpnuD~>}q%(^;5m}2zw)&6N^j)QRkYX8&*<SVHZK3Ov(2Jchr>r%y z+${6<DKR%z((o)h&xmF;^!}QK+w!D07fC~N-#4&8;4VZde>Xoybn}QD08P2CjrrqP zM~%%0GMD`Z*OJFWK!SXCPG2vBk@;Po3-yFa_3<vroxui|)g6W^L$Og#K)L|@=eMvh zeCvGqfA%xxFF(reOf3iy!Yq=Xu6H46)H-2w1>^fieUkb5fYT$J#zT&c*1K7>+AE=H z_rp!K+K1~{GhfA#z9t@GTb0IJUh#8lYe2P1LJJu7oQ+2CC*-z0r&~g(FNQ%qL?dzj z%zsy-MxxI^X>2wTms;bxL{VC3JQWn9=&P-9cY-&x5%L{r!EC<%vr&J-@}RGnqpQ65 z!S)9#i?|S{qg`H%t>MJbB$hjkD<gTOYd+yAUi<n)eG%aJR)g){v1ilqn2$yCtzPWw zUszLaD&kPAjPRHrnsmMPJ}=x9p=@*$#?DqpG5T#=jB?aLn3z{baS=r7>o4~d6c;%v z_pH|l44O`(+WN5CBIQ%M*7i7J!YTWn?<*ZHrma|6yp~fYPm{})5>Za(-l9`_(sLmh zG2P|s>@D6(YCMn7#AWtlNm_uPfEI_{R*5T<{x0~fB(k-!l*$*KIz3u?wPqpaR8p{l zw3<nZSX`(!jG9enJK2jldV*20Z{KPk{>xl;v`pE+f2Ga!_3y+lGqFwGeBD?Qf*$|8 za)e(Q3^{3A6x9Vfg-B(T`DybXZGEzpD^-W#P~P&wRYfGW`WpfAx)wtA^1Au_e_l7e zQlQQJ&mSr>LWugG0As5a5RG$pd%W>_dTim-jl9F%9qW+c!FjrTN0iZbwvjZOqHx?2 z1Ou1RRjw7eThO01>)VR+>kk&YGqtn?^PxCo6rom=AxxB#dh@aj^Xk*t{2t7nHAyoZ z87nxB1?J0dYOXqM_a9VOby)E3Z4!lh9w!UHUt~o<OkuDxDQeA~gWS@|`p$gEGc5|r zMGP>4#@||@tR9cjyvkbGYkOSM_o1JcTa1i_rW{M}I6c%W0)~FAw=Z$;-i!QNMpY7v z9vp5X^O^c>xUAbP_xcUVr_-A=jBpq+;|UEjNoyT1xt(}c3<8X`Ob&ANEM(+?ExIGL zWyvS^9f+^r>p}$z#Y_m0CqAj4GFUA(FC~JD9*tN@cxZ4-(x1w!)J^TK_CIjZ!BBTk zmMTh0r1n49&(6-oo^R34e02#D(@@2Zt?a>e`*zY+;1HN~DKgYwMC(SYUoOH_DOL!a z)!wgPLF?bWJ3pX9u<ogOB1x0Lzk9#eSy+8}H)TP>a&GHVKk)mCkX(b+Lcmk~C^+vD z>1^6Uj^Dot><laBe6p1PL<%_lBxp6eIzE==>Km>x%wiD&YQt;$wIe^*XfD4!mh<Pg z!(KFUv8eHj{aHK%ju5Q?CW~%=`2e%!>A$i}pxuA<9uCPNxc!OjpWN8wP~H&h61<k> zyS`dW+n+&8H}X65ira%l(eaRvmB3`!gsxYH+oF7gGM>oV7(#OvZ)J>RGqhZh6^sx4 zx|9i03;`%g+W>ta8V5b;KU19TpI+4Vra@cQ|J^IGx<PDn^yAeOh?Paj+9~stG-fai zhr}7jP9)%a3ogN>WG82PQzV%z@A3T36It9KPFkp?FkIyh0XA+WCCQ$n_<Y)U7J-p$ ztSI)BGQ<3u)1FZPFTMzN=G=|;Wudem4U66slk!#IDSGD{>g)`ESRm2<^Fb^F2V`4N zpWNPr=7t~D#~?z}_<Z@Tf>SfDSSnO9Hg;)Jxz&leZ48!#$(-e^N0)BaXS^d{)@s{0 zd#T7nrWO&lG|^8vdKsbdk}%Ar**fO$TQD+tkL4A0&c(hJ3CbH4)YHw3;pOHRHI>O< zuyLw^LGf6a)Z}C-Xr_>_WK{j$KV;oTHf2_E_-Ns^!}+Cpsimw<&a<RmY4%N<5DZl9 z;-(J+OIzd*tJzKMsY{GBc5U%fgs-0rU2o*KI0C<*C=ZCEku42TW4|2Zhl81{hg-YC zJtz2b9%f%>LK)yoGRg=vi`d)}`xKw^g#E)UhRPn4n-U42G+p|biNBE#*Q($Qts(EW zG<X^s?d5u)SDE6o2cs1vki8sK3#~@?*dL3{(k(4xRC?YwNj3pG;bG`*Z|AD4>QMJm zv)<g=o4xtsMsfz4TVu<HD_&k&P^ilJmhyqw%DHRWFF4+8=#CzftdSv>_M*^fB(GbF zX35C&x(pQ@c<n7U^hD{aKIel}eZ$+Koi?lke`%S(srU|HrIDbQsPeBH@oL}B6Oq?Y zCLsPTijBg<AHc@jg;LMp!BjUVD}xP>uBnACKn^J!Uv=<x^J=F-op!imAv9Iu;fhr` zfn9F2r_b#Vyl$(b@{Nx7$Pn~aqE!#6-<M{r*2Q7dejXtf-eiXcAV|>YyZ@0>FEm#r zJ*4YkU5=dpsVRYtkXtClnfy$r*7>2N@eaw3*0P?7;qJfFfbKjn?}m~^2B0ShQ}|_3 zl>ArEOjLtX;uI_PP?p-;N1P#;;Gf&hf1Xt@(*_MLzbLUNV(%;DQshcS$T9b1eq#r5 zOFdnf&{lpZ-#Bs7^6^uh2zGM$672bIs!X<Uc~1YeLV4oE3khbE+~U>CA2AOY)gP;I z#pb+9W)=oJu16Rh+<&P2n2iJKdw0CUuuU7q7<?Y!u)dFl$Kn-N)#dU0W5$o^(>Dr# zGu6lWP;WBh(epY4htqa2>u+8btl<Q8KUo7ttdWk)4MUB|S`_k7d|B+NTEIb)2w`mi zYxXB{m6}hOl%%Oz<AYI8V}4S?IYPGq@5mGRQBdo7IhEyv+#SA`+WPo#vR;sY-WuxD z!SjKDPloksZ!B$lSaV;_rqfHEA5hfh?~y{2*oq|64aJN10a)cCq~G8?r056B$qIk% zrSup_3Nz#_ulo&Oj?M4+eO=Bv+}EGF`ip#3D|<OU`$>iuHca5xE0R$c?PMDZA*rq` z8k4}IN-Y_XXJ|)7Lo$WTlO(uuJ;Jj2vubpmwolox_4G)p4;Nvp{k3NjpM48c*ZUkQ zDdm=d&Hgp9(3Z!3Jr}MGT-p9Z@<WD73hE?-5p{wEwyRD|b+duxH;YEYP8`1YZVc;~ zoOYk|QMABzMl<~n8-b`~BWX>(Py%>NY8$N`=n%Emyi$q?us6j;7KZ0`vDI?}`@=_Q zw1zEP>tLt$f__&>=03-#NhJ~~{cwwv8_4hpSQZ`1m?mfcVm9rBl<ckzJMR}x?Cj>J zd(Gq-mFLhWP0m139+s@*I1DX|jaOXhblIxSR7|#(0e9EfVvEZ;K@xwqM;yK0`yZRi zo$6(fL@rGUerC?9TWQ|mp<qGf63$L#*2e8M?*HxLKM*Ps8WvYQ<5q}}3@F&lO6MM( z+D#SjMaP27C~;_1iMRwjcBE!pt8h)F-i{z24(6@5o<G<PqVyx7A_eBv?McxsGUkQ$ zgv(uj^eQmN4xORb5Q^o@#yP6kA%sq2EU-69r!Sev$S)K|D-i@o<<(fqqLF=-b4<}2 z;j8rm<?X9n;$?upM`0NQ!-#@L;!#RY@~X(+pt-}6N_&=^d;X0dl(<bUE!g>*YQ>Nh zPSm{$pFr!Sqm+qC>c-kg)}M|#AxFH<qQx}H7?N8P|9chyFV2U@JI%S0vNFUl0I2k@ zKBB_Eel3f<e<*DN#4w;2rF4JFFlB_tmlM8yB@%Zv(`v$ybHsgZt_(Ew{Nq&3vHJ9U zE=<rF$;N{SZNRfcGB4rf-dGqqB_gKPzLgHd$)|;gQCs=L;f&vUPjGR+Xq!AB+Y9GS zwv_Jg2P@>v|3-{S2q-k>z~`%wQKjIOOMA`ApHH+a9bC}J#5bECQD{_I)=rNwNQ#<I zEkdj35`X#lhmBc#4Js{Z1fQw<5&RdkvLlhg2g;>~H>?#7w;CD^u0Dy>6I|HswH8ye zlidD$uP9^P>svNgrZh~Oe*%Zc2BEI<x?ie=uD`wgvF?G%@B^f5!eEd~?`EGc)ijV| zRgqzOQxNDtxmw25cb!Bm$g>u@#(H+Ig;-WEoQs%SAd$ODh&`oi_~N4a{mf6l*Q`6q zRJX?|WIez30E|B>K=NV|w~);(q)E~79M9!`sC+dU4YYL1Nl<tjUpFHWt>)6L%v5k5 zC!qB2Q2@g7_gQj56C>E&&B09i&}uNq@E_zJF9OH#=4u@pd_wsCLIsEe1lrnjeGn-c zw791iCS99ahYYDuVZ?~~f&~c2r7XvT&hrLVFUzh2eG*g@Da@BcZ{+-=vDi{%LXiK< zO^H6d&KB<u!jIR_mg<X&UK~l7BhYR|iyg$fj6XK^_+FUYU=_VB5_PXKpc--Ksl5=Z z_xXx3$m!5eBD(uGU4n4%_3?NRsM}KGAgt<JQ$GZR6GGBuD2Ba-c|^21WuRN?szmLq zJ!ffO%C@Kj7QWL8h^oq!DxD9tDA%gza4ghNti@-hMLy0x*?uZ5V!tHH5=ykq^*j=7 zi`2$kd7-H~%`sI5gDDNRq5Gluxys34<Mnrd_);0M_)gnTyo&Hz7G;0%rKB#moMn8@ zM16I+|NQpMJ;hw5SlmbwX9i{L9P~R=^Mpj=)9CKPd<=suGBC_*769lsoz^iSp<b?y zS_=lRt;Y<-CgT`Bt<jw%ZJSTR24KA5ehzE#{*iS4{I>RLpUWf+AVOSAErdH$PVbg| z5GFuZE>=jRiJ{N5W*a&{NxE4rupWWtJr2@v9xk1ZVN6~0r^x#jn@{zY6fbcBEa6CI zSIDQyU(`z`UD6Fopb&S9%Huq2Ng5)H?n-MOPQYL2cR3!cQ-yQ_8uG(=O{=XVTCQtO zLaJElPF+Oj%f?4)SU}q+p;<Oad0#*9J#52A1e<yvg4@UTSS#tj9m6I~<AHS!Jlm7N zm#}9Jf8a*vNp6MPxbE+o0=~yZ>_EDkF<V7AWA-|j04Sl=7lt|9D}}T(mN~i4We98^ zPK@}zrN=!~8Rs-z6PoI2T)oj*_Oa^~LaxOg|6dTsa}QoQRfdmE0IC(hd_XfjvE2+` zS|B|@OD(~^3sF2dbDSJhVUX%%)-cAn)X*I#+3tFM9FPCfRX+DOD*lQS!J#tRO%kPk zF7w({>JXfsh=>RK39dWvRBKWo0}^)b@l-2(AZK!=;&geQ&P>_l{`a#q!%NJX8aI9k zOzvKTUyJdTZDv+n^4o^gmfO*=VnU>I{^cNvFyVe%yqS7ftU=Vx+IA|Aq=`znTr}<2 zLvmzUl^h-RDa%WR9Gxa@o6CnSNgBqAcs%xUMOmyLGRk;NI`GyKApOvZ{^hsSKQ1$D zkiPE(t@h$yoG*$Kqbj^1;VfVtw#uc4SZxSuW%-_&brpT6vFy?)O;+b%{xMr+#Xj_8 zQaSC9!ZeG4PUOOIVUzR0X07Ll`!$PAFYZ)zE<8e{v~PICHwKRL&V}$AgRNK*8iQ`> zX&Bn^GF}FuY_Gf6;nda~$NOeiavH^=1d#r9BM>;<3HxTO#Q^py-e_I*Qp??Mw`-!& zRibX1GwkPDZvT;B{2pFw^krAzj-CA<%S*y!*o|5(cB#h!Gpd`tk%i)!?rojABWb)d zoxlZqaGvaEN#8w0ho?_=Z9;ptd*l3C3a?=S)6LO1sHA4gfk_L_Iq_ojzCF1Qh$?|2 zU_bBEC7Rq`^`#Yk2g@dC3eW=vkTML<<Km9Z_u#m)$>s)5O(g%w%`d?ZknNYq8N+<r z0D#%f`jCcmi=xSpmK0DF|EMFoy)!`3JEWFMuP3^W4}=6l52ggMd0R9Zt}DjlxY;+6 z?agrRalgI!XA%dVlo(bJ%Jb3B$z!xX!T^YpJU*4b1&hCJ8xuSKYn%K(HSF{?s;+g= zp<i#%X4q`NjzM_%;Vom%OIEze@AbzxFGj}+Po-R5T)ODYGXBWkTrP{Hws4i>;lp$L zpMYWR$T700MU*ODh^ha;9k6js+Ik_8i9))}TICkmOD2yXU&hqP#5?=wiOk#2Nb&cw z(WOwjr_N+%5g4i9Gjw{modg@TZ?f^h<m;cY6~pMpr)q=Z^FfyXrG6VBo&?56i#_-k zRa&23O#Xk0Rqac$niE_iLt77ofciQ~a)I#!hTwU}(NUsrh)lC@(cOgBH_KLc`=axO zUfD_C_vl9~)SZmi;<H<|msV(rd1sUQohv}N((UW6lk(sNy8s0`g;%6nDzG)+Uetd# zIB8bxmk->U5}TIZ63*DFH{q02_eD-=0Imk$Xsk{MDxP<jA3gZ(cx+uT6S?ZFMfb+v zfrF#2hRXmHaV5{lH&ObFh8^~?wagHSO3S4ct#<_r``kIk4iW0i*>{d@<agfGB^@Q# z9gk*q^mzLz8_2@YLG5Dz{Fo9NBsUF$`7b+q5t0NX<|WeT0<nh~Qcn#p#Vhzcwm}4# zAng`+@+Q+aFvuT$VBQd)KEb=3H+cP%ow`NjPYTG|dBzC3=<3;a`UR`*cJ@uoD=&Za z>IUEvNh%ifsrY*f5Ck#N<P!kuIjHv>`Pd!Ek2uq37jmUQNi`;Qe=xaKq|}Y<SzW)b zkD3G7Q1#x%kG6h@f9#*d1{CLnYM_fQW(Kza5F)~Ok<-wL-@tewKhb~+C5jm_N7Z}k z_y3770j1&_ArKlVyn6>}%2P>-D<l?b63u3Oe)kxgVkRb^$nt{+PhJNk6a2+|m<RtG z{^E5xTN&6q!eFp$LFP#;HSaNx6%f|H)iw>3$B|s$O%_SU+V9w#H=cD?b}svIFh--R zR~Itc@%Lf@BgztJ{I7>jK%0Kz^t}<co@4wqHrL3dael%dB;(|H4@(~bD>6wy+|hyA zpnD4N&Dggc?e}((-{isY0Hulb6HRGNZhFUIM%aQ^Dw7W~(WC6aJ|z!QEjr<E!$zAk zrqBo5D7q-G=O6PVq^iKUohxl~fz?VwIGgoSAwp;j30z{uXO26QHYWXWWF{>7l=S`S zGLqo7GNkyDoZ5pr(<{0n-4o>D@vPip)1k&8jk*W0y@D{>?{0b5+kLE1^pU`h!ahLA zSoJ4!`_nZ#UIAkbrN9>6CO1<<+~bORi;>rN2Pfd7kx@b3K$Pne8TW`<vjG`$3WNKH zkQ?=e<dPaA>mSaE_$&Cp4KkBFxF3(IDL+FW$h&Om6m}P?-&W4B0v6t{YvI33BOaba zUOW5}e)1b5gTtg!S?W~zj`)AZy}M{9L$^lagMsOd-2O6Sz(R?Q+3@ThF$c8jMOD#M z>dE9SQvAf7^upw%qs2^4mfz8{jQ8~dLDL7hlOFT**lfftiJ~(Vqmo58H9*TeHgu#| z;jRFZVU{e|75Mh>(3eeB_kqGTn19m4jf$iFSsvma9&jFq(cSQM%ikW->sqa}X*ipa zeaa#?xyT~;-*N2K4HDvOY-49SSVmVAA>+r{`{B;KQeTd~8KcU`nvLN!(J)4B+3!t4 zA1FfPr!4Mn6zOo<qY7RlGtqk{1N$1%CtM%o%1L6O_MW;6$Kg6=GkekV37I-xl19}# z3e3A;$(ADd_{#Z?$YSs8NJ*U0?`s|biWgN_h2Qqh&6T0kEvmi_7W6_*;3U_n0ufdu z%s(HG|7mdZbZ=l$Pa}Rd!8wNIRRZ#q&<)PfWLP_cs0R*_qv3h<7cbRxQ)|Yw+fH8! z<J(%RDe*)H3J%xDJJv@wM+yQ??A=J|50ggjUC(ZcKs-$;0}Eb48t~3mwqP5N@|r2& z*8Qb2khdb|3lG(5uH*<r`NHw>BaQIy_rW@9Fdc!sl)#{xTOf)h#ltyeDvyVX<879) z5sg+>0Zmgf;L?pQIqu#AD9Rx^pc`3ZzC*?>YjixARB+QOLJVepz+0b*lInPOowqxd z>aP<0c%@2fwRdE<thKG>c3W)Y38Dz?n3$6sNpH>Id;7caNtrf2H)u<8?jQ_!p061& zY_9FSE~d3uOqS8Dl<Dv`AwG<g(Vl&GC$h)S8v(D8Te+_cj0l0&)P7O?#94uLXuxB# zcPtJxw=0rxFyZrw@9N4om+#917ino2{*k3X)Eal){hui+rsZPpK`<SZQPi8t2N0YB z#Q#(r+SlIM6_4(8np$-q70o8jh*b~D@cv_goLiJO@$A~}*bGNAmX&>Y{J+e}@{L`( zt`pATuU!+87-N!1-Z6RcPEnqGZa2JYR=Xt&+rJt=#Q9xGh2m_^%eB&JHV3n}v>q94 zuk3(fY`KFckv7s8RuLNd6%(jV&GxAv{YsI$k-1V;iDGnY3z2{`5&!tzN55^?WuO+V zch$Ey)}l6@c;M)ln}jm#UAz&Qe4N+3PsE=oT&|BSS~)~sQd*9c8m~X2*4XT2)6zl% zfeo~iMKWH!Aw;*i&KMqJd9m&cPBOyoFRzITn?sd~<bsNnXe4FR_;Lw7e$!x-Cb6Qz zDSlL*OI#H{$@Pa52?GVrcF1<W-=h)<%84NsbjMOKIz{0h3r((LS<q9qsqxs+Ci$yY zaLf<*29uf680Tka@{Y!d!u}$?iG{yNOtM5ng~)zG9bJ35bWcqiF>F+sRqqGPFU=~w zjq_?73n#V%BCPzCxt~S2pN-taqX4UeL_Hc{<;TNQnFr4O%mP4uNG-W78-oDte3>KQ zB5(h-)fbz(KUpLypY>J#=-61zvcq44$<cf!WIW%V|B@iw**KV&=CR3+Km;f2kiid? zK3T_@vvdM@@S$1s$XM|}4&iVAe+c^us4BOu?IRrm(n<<QmvpDn-3^k`-LSzeA_B7M z?(Xge>F(}ske2>mjQ_j$e&0EF42A<Xxc7S3n(@pzpSk8O7l`3t#zh?HM}0n&D#Qw8 zA6%s$?U>6_^FDg+QVY5{sK`?^XYh!5y6d@rjT%sn;L}yTd`!x<<=UyU$<htu^Vp}1 zZESb!);gG^Qv^W`MY_JcV0!g-U{e>DT>XDyL(V7EoJflp>g5()?(q~hm({UPVLvW! zlewYudR|04=G^vcw@1o>0vlUk5VuNhD&g7jUv9%|z2MM<mT)F}x}x9k>My93_z&qJ z=AK)Sw_+sN_{TqXtlkhQ22JH&_J?!1Nyg2V@m+n<>#hw$)!~#Ipa@peq2#cU;!?_< z=rxRHOl_`)b0^A)p+!Tv&THCzA60v~&ZI(cooF7nkjj%O6QLft(e#y8Sj)DeK+Ie6 zIc=3@phi}OH!=A<fZEU_Px^}LX0&($^VN;WF+Dbo&=N@`ih$m1CL8g|uca?vBG!1w zQ+CDb0DiCfXgfvr$k(qC6$O7(3mLjIjYM|8a@hmjMDnPoD|XowAVoMHT+3MT20Cc6 z-%S?bMlarZr}zaES%BKombZt|N${@u<XPJTr2&eZ)4{aj7g<Z+@L81SUh@r3@wd&y z`Q~#~=5)M-nQB0*=`}F2!DyOOWgsm}jyXfc7_^xT`w;NmdQL^<I1TpG^Q<}=kGMz6 zHFo};(*<?6<{`6B?J6yEy(f$l>oe?pW413`*qw)yg%qzS1^?Mvn?P*Sbs9}1m997r zTj_itE@LIL$IB3+Z_4oD(pyB(J3ygNQ;H0onK2n5vCH4rMRkUmD5-SW>PHCw>`Eqk zY&h}ZYXSG$S9i=;jK+5J+b@M8^H`0l4yNC*Y|)LHU$Jb$Kj?lYq5{P36V4MCfy;AY zeH`j?^%;%Pqc_txNFMrjlsjFQM+-d^Pl1vaL;}EAw>&*ets&KQr-|-2vVWlvFpJ8} zW{dGi#=Y9UM9ve69toV7=_B{3k3a-cagWL1^?cZ0;9a(54vN&}0A6pUO9w#gU3b9b zMh~}P=+;oJ>ERcD9AXRV6V#<%15>dcX-6!@QuLuN5|bI|5bT|0Ux#te6By$>P-dQT zvn#cVbHono0mrQKi9n&$S&oALn=*;g(atrooSUx#%5!N&AgU@G$3n{s!=6PQR@YX7 zLTcTwG3}(pW`VRDx{%XUdQNkldlqx`vZr!Zai}_2-}3c*KB-C7T|U-`bDAKN_Y=Ww z+p7nH!LK@B+xLE8Xfq($G-L$&+QNZr#^%k&Vx249b;l&+5uvPq+O|+Pz{PCYIm&nG zD%M@TNaJl_z0u=~yBorAe<>_uXAsP_&n1=&l)E?+G`p;!l`k&}AH-e=FnP=2i=YFy z*%&?L!e!JY*qx}Pzq+ntD7)2PhpDqauj?eUIV5<5P#v8y8YQl<g>xk;`4B=LAS*h& zFfBq`tXuDo!>Cm_d$Kvmus^A=5n|MEj`y@DZk{V=&FzdR@G(bRYkxhH=+!j{Vl}*g zn&3aV@oHZshy`+RNkzK#B!S8`?{xDX&bRV-J<r~f+x9Z>B2+%pzaSt_zbt`R#VZ0S z{t6P+S%VSmxiLym_ghe-#v<Y77Nd5Wf}yvHiF(R&7L%tc?0t0FWr~>W_F8G55Ochb zASMg)0I%v963qPFJn`LFvE$(_xs|am(t4`RuGflfWU+2zn(Ts4L&bM~viBDSs9n$T zOM{s(><Yhvo`%wrs!y4^FZLxKDJO{#FXo$61}IlK+SP~SFE#&SUQnl88xpT+KbFJX zYhV7lb?rMC=(XC0_IP*XP<xUB5A<bRVZG+~-KPay+P4p~o4MzcwGn6JHb6%W^yM6% z?XghvZ?i3>6mtpZw=AeP9JszrWJy#d=1z(GO415YJ^GQ4`wk^6)P@13g0fP5fXYt1 zoK)^fc{F40dP_=k8Dl&jZfQy<oepZv8$HOqF53jX>PK$Xs&fXCOZ$213Rp3^EKQoX zZ<*5I1fFl%Ixa~+mr-lyv+YfyL6I>Vk?rdv2E^^=GaIYf08$|>vj6?gD^%PASFTz2 zRZgdSivS7}nnZedHd-wOx6=p*He8}?RHPxLglkXT_`EIJoQ)uXf}|-^V&iAuKYcjH zy(8h82EyliT>`>!I{^?C+=cy_@>XgzUvLRL2FU&ur~AzXz0(etxSQ?HSbF1+zWuk? zD>TKp)3(Oy7zCx=M$<XTk<VzOp2?r>E<%3n%Ffn5yuLeDOL;x9Pn21RjLSH-olKE` z)s&+UD;Z5k6F=e9#Xu4gi~TBO<-1;C9B8j>3(vS)wo|KEh-a);`QT6p7&}UD9ANZV z##Q2f^5oKV`-`2XDYGtuAN$&~_t%fyV)~4@g1y;N*i4B;MI2vF8zz9ou0`vx9sXDZ z3v1sjb~()OF1B-<US90IiH@xL0h*R_MO)kI@#ixx?V?i)2V5&@-mfTFD2;9{fsU1c z)2QP5Yj>j5CvUUoSoa;%zzzY`en49tyayY|E8O-NtQ2l*r;63!C8>lnXQkZ1B$qFy ztC2f`iKld3#@zP}rAs*r+W9G-$%$WVpgyS|*&cKOp4X3J^HLosRajmS+3!ZLUgD?w zE?=HRT9oyg=(R>pcX8qp=o6>w@;}lUfiKT@kM)EWqL}PH(2wuvL05KAR`V6UoJW#* znwc0*yVIhzD^c)#&j@OT(f%hZmViF&@!f7xjgfn`iFeX_(J~kSc3!S`qRPw`^4$zY z$P%lzCdt8gdBPt{3s1Nl#yGx>Dd3=+$WY**CpNhIex{EV%Pxk$V`gyr_Leo>3O4|Q zI&42rC%ZsTrnyKbcb7ZRwz?7-w;GYs@u3G(=B)!jah|Zz-O`O<_JUH`{5s!f#}CLZ zFQs2R{@uZYrEq@fck}IUwH3E5x`%1xEQ}(MNw1p~Xak!!blR)!A2We8NGT#^*ZF%J zUCImHS2s+j8VB_=uHaQKfkJg*mMY8jg3X2PE;yMU4oT(0f(QNc2KTvcpAXqE^L#lD ztih30XQ!MzIfiJw`~F=q_8Z^Rvx4^U@_Ryo7Q}~>IY(~y{ZH(JNiR)yPS`5!otAHO zW#9QOe?gmOx0=a~T`zf0H*d%B!k3Ef+p4_Q{z~`4+2#QLfDe{OSXj?<&4blU+OxGE zOA&whpha`uMlOz_2J?}|$YNL;OU6@>m--P96BBD-ujW%03-N!CqZDrFX<u>TY=}|m zS@5X?IQIdzI>-}ew|KXzuFLO=6_}6r)`1F>+DC#So3S(!J3YhIEr-?h7rkV>5--pu ziglWW-uS`0A+NumO!1<BY!Vr00((=o`yJL_z#wLx2FjbGh={Yr7F2YwU$IrcUm^*> zp{LnEPb2cusg0XAzMmV9b^QLF$vElFtxBObLyY?I_>RNbRKJ_!<soQdifUC6<x#*s zAwBx;pcP?_FE=s^j6FbGNc=g!$3=o_!D327tR0z$<Ju9u3+4sWA$l7>#dh#VZFB<P zN>D#^>HBRC+fNv&VgSb0WW5qSeNNNdceGe9_n42~?~tVM_^7vUC~5A2(bKaZ0Q&j@ zd;B+#+v$<VeNJgKa$V<iMB6S3J{(?P()i6@oPGAwt@FT);QoKNPW0qLTG`rGz+<3w zH*?!`jfsRkPJl<fo(CHO!*Mu0a>)l!Se=sCeL0Py`Aeq~S^Y6a$W}7nFfxaMki5eD zZ!M;>YesxL^4<x_uIY8oel=W?4gDHRo%f7#!Rto|K#Qf2F`KfU;Lq0d4VW3X6FS`B zJlej`N4d<7M}tCJ%Bnt)Cipf;=k&vY`G6DK^@~7}9WqS}$u{mye;SZ^nSFg>{Yr#C zfiaF6*;q187&EYtw?=NDBeB-%>$4xv!^<m+pE)<h-&7BjD0<CMzX>xsJL^E6b=u58 zd2`5Fpi8#O-&wKOPi@ZO6qdKi_Fg(p8u>lPN&G{u`=B~kagaWiV9Oh*L!xo6xK5y> z#4Q0Z&3cV$&$*%=(ztbI$AP|3;KrQJ=B&*&^b4YJQh=oGKq<&WFyf&Q_PG$aXK~sT z=)s7S;7@tMx6fm?xM5+l@?vu(y^H-$!*QKX<jg<ESBM4a11eA{4$q$T(k**Ut})u~ zxaa&KXxn!yN2{I!$leT@aIZaK<T$w#Iq^3d8!8B4u%a=aXaH*{m2k`H`gB%uotR@= z3ggnuV>g#{TkL<LcD$Gu!QXr2Jv<*tAB%OsjZh<-Np1Sxt)%X{dHjn0$_1rR(~vgF zu=w4+4t3lQ{(7eyh>SXW5}C+J#(0s++PjYgv{r8RjP_sa`;Qj9U-CNMnUlR*z2s}| zTti5mvN)CoD%T>HhkPMQrc*!!?*FExjNOUqQLY&tc`{tLlpfUMlsHZlQeiQkq*tc; z8XD6*$z9B)uX7#zHd{Z%mo1E715E~wAFK6=*OHd03Jwf^_#e(UCT9&L*qqv4d9bPU z8ab+YM)wYPmHFsJeT~Z=MnEU+rim_AJ>&!OlP4%KjsQ&(2I)`x3gKfszCgy-ochsM z$^zv#4V?WbBY&a(=&wri1&LGZ3g>f-LJ^`fLE8*yU%E#t|M(^N1)&B{mHut`b2u$R zSs9!A>qd`p<Liibt2iKHP?Nqt^LUze<~v>IGmv`AxYM=rsK@Kk>b=tgT9wS}Z~0*w zVIEx8$TF?y$Qk^M@?X5vS%)k&@)*3Y<yg@}G&ot+CYy|o81NciQYnWpTZY+T(FBR; zHolihA9#Ru6APi3ydWf?(~eg;?d7tC1&92i%XmJ<+$+68iO28Agl=6~Q*7QhzKC?8 z;9Q07Y;Gs%Nos_jcwR2O`WA8Ld~fQpusLbzyKH)&wo&0_m_ii+OQFM4#Tq}WuTwu* zgzOOXS=4I@Xx=3~bO1W$;$H8_#kZ-gsWUj3Qll~%OH;N36tHZ(d>tAd_b5^5qz1U) z2bTb^d#5;NHs^K0>V};huru=^5nkyFFO<Q!`Y%;S^Y6RN<((S2*>c56w7_ce`4+X% z@WG?X=-hJNHP$w-1eQd<m4_<CP~2#lNzFQ5?joMz3S07OxN=_~wVOp}S<I)PZeZ)C zhX8qzMaD;|aqAEZPR`KF?zi1>2<AJfv|bGH1SJN#44A$nHWcmf0*YOSh>&lq{GXE# zbyqTNJNIFGp|ct(2b0>=+bwPM^lcKF7JsIP&nz4%gF#<^UJ?A5c3FNy4s^WvU9Zn; zS7Q+z%$6>0gmyALB2BVr^fa<Rg75(oYU&V9UIsmYj&<xCLnF0D!w=o~Fti_4$U_3& zHVfh&gK@-;k==1JUu*+Ri9p&K-45shRx3$_te{gk{9r+Q%hG<0+}3R4if8Z223_e7 zmc-of0PME<-3ZraY4r2Z4nUszGHhtlqk<+z#~C+SM`p!k_Z4m^*>Lwso{;}&oEn9p zI2TuOzJ-9@0n)&HT@S_E_=;9FR0p+Yb&1|M(#R%m^`zvL2owv`#X&3fy~Ozj`VHws zc6IOkO%#*oz%&+$CwD@G4;xH@^t>{F3>6DKL?7PY)ho=`w6^J#e$UoAYTcDz%V*3} z^k4NoGf__RWl>ZfPLlxjGJF$@&7834c;A+H-ka4V2mC(Q<UD}YeZTmz52P>`XcaJ9 zAvF@Xz-#lS9_Z1HL6}j~Jztscji3=tRx5rLuifOnmI9${cD$mY*R6^JieRQ|`hI-a znNs0#oLCw_n?Y<*c;ork7aTJc0~(n?0as0L=ohPnZY-*m$jaTtX3J8-x^fRKC=a9x zp^2c~Ir#y2afFc(-8$DD^O84q7lO(nu2VgS(KEbm<-ybfSS8o;u$;=Su;x+MUx ztt7bsJzf63ZefM73kEz&60`TsMIjEq+1O-a)>GHs{#a)D0ds6NG<nph4-`NmSf2D* zSR=d#gI0+vdFi`0Y1<y%-~jBwVo>w3OF%Xd6JK`g6Jt_wBB9+pNA2M@ybvC{eD2Xl zr;>)CLZcTz`r=!A{bc~+zSYkHf6_eiBd?|H`Omvxz-W(IX5v}QQ`<(-;}BYtuZAx< z?R{r&fY#M1@>z%7s)e5Pw->3e?9%<cn<CgHq=Eh?BDdv<@uIt7)0kfuL2sWl{Jsb} zID6vsI?WWXH+Im&Z;*(Q`6=4%#?r&~^+Glli2=;6{6g?*=NF96YJr)6)AvMxp(xf8 zY4-O{4Fzf*f&=Z%!;<^-Tbp+tj&E)aqgRg&JJVj-t%liP4e|4EJw*ttC_?rKP8LZ2 zRBE7PPm;7+Vx>>L^CnNCHB@_PgQt4uENHKNHEsQPRUzO9B6V4Cuw@m%Bibuks?WE3 z@6*pKF<*m48&^DcaW%u|c^$FZ@l^t`{S+uDB}|R*0!^ULz9+OS)L-t*`v#t^UP(zN z@gkB-MSUXGvVCn(l_vDYdt6xEPHRlmiCRropxpYXk>TZX5`w>-o+~FrXn$wtjV#di znl7W|Y+5Z}ApYd~I)7LH&{-X!4Sp?{h!5S*o?lZuIfk?$xO$Yf6t~v?oSV<>#QWk9 zy2amoY3+wMhn8tRmXMH;g3#Ny9iOq4+drx)6vKiH7}ZN%Iw05$I1K?P^}3}lBBlBr zx}`61+`}pMDQ*TIqz8?{WXgK1!*rH;78j_u`eS=2wU_2O1n%GavzjR~6v|ACXXE7e zh4q#0+TYbBu{<2Xrg;xOFb%=inSM_>Ft^GmD5xlUV^0Kyz^eG<?lMA_n9KVf3X?al z3K%0bVXtB~VLl=1-Zis;GsMK!=nBa-3p*myL|0Cx?;Uv1OP7gP9j#O8OHhq?y6DZ2 z%xBM~`km;salk>k$@c~E<G`YnCMX!lE^SRhLh^H>-t{WXArjjNf6cbD+LKbo_0nqZ zfgh_D)fOavXBui3Z2Iw8#<if<=wlh9nd1xv;_f*;x$^f5>>1Vj(}qEGVqcul+;zB3 zm98!?_S*4g@>G^vR&07)nup5oh`6$Y&(!Nx3b%%z03R$)S+bl=&TMo>70Y^1?6|PI zFliiw%Dfvx;)IkqezQtD^VbfP80`yKV%#S%s)|ogBA@bk#ON8XT<0^EG4iP?LOy~l z3mY=9V;m*aj`QAewEI5$Igv>n71kAE7Q+~{74z9{EARKjA9;Z%P-5q&TGoTkE2#?A z!65@4R+@VtZ|-A<7xt?=Y2JO-^Ls;c_YAhIyW1qA`KRuc5T@g)WaI9I^bC=3ijz(e zwaM9JR3}^nIMcEh#*G))_I-$rnQP`(H**m)^Kx}fFp$w5tg4_E1^vcaJSf`051%1$ zi?)%bzQCP^*Sr8f6&HiO7v4II36X$YXyq9cLV+?AH>hnxEx06EBfF3LvL90|Z)i!L z_@dyn_<Q!3`kgwdQ`N@2RDR+qk)KniQl3Hac3}zEZn8Zd^f&b1)3Qu&fg{9waES=# z;k`)+G`gKTGUl87z~>S!#mF_3<Z|)mvUhF?6n^(S-ijo8-`jR_%T9O`s<lO-d4Ri{ z>8}2oQZ4?ZRcYW%O+fBWi$X@{<q?QS2j@;{qng7;k@ON}L8#8jaz4`+k>E;C!^h?s zr}_8d5BP%be6fGn?dnk!czO)J5yNB0b2{@MtpxdDPZpJeUPFlm9pJBc0U|aGg(>hL zc}RF#)3~qeaS^_7eNKHwU*I^URbyJ3;C;+?;ZR(CILmytZm7x)4fLY?Jha+p%Ul$= z0W(3Z4${uLXTPV1fjh|rmvfFiaorljVUclqH`Jcu7HU`6uB3e}%G6J1krmLOq0yYa z*K}Jxp(MsG)Q&Ja2S1^(biDom%Ap7ebzR_rg%%ULJR*H_IYYJa?i80koR;WLSU2`Z z_L5k(y2r`K#EgcDW7%TS<?e?%JWrn%1s`wN`M;oOD+G(O)eP|}KVPj0FX!mb*U|u5 zNdzvHYkp<Zbl23Fs*jsUVx`G~V%OB1Xww}3D*X`8kdbA(1!Oe0sI`6*_Vw3H`4%MV z76<8-=E=@$g7mSy(%-YXS^~)Bm6apL(B3XnWhXrSEZBx%gvn{|^5g6iwf(UV=0edp zj`9hQC`Xj)=gfjvug<Sr6x(mnqHJqsBWf9C37R^+tiWWA$<okDLd8<>Rx}TbUWqk( z#w@Dy{)jyKN;;AcVj2=T7empu=0OYEu6rp`QNAKa`M$Z9DsyRfH2I{X8Fc(#M3-~e zxn|KH4Fevx``Mj~(OHe!9@{t*&t<ev^#XX=p%H7(nHij3S8Im@2r(xVWAk;??b)dj zV2f0^&Xz%H322jF1bU{HJQ-~o@4$_1=@3rwI5w-<FGo>YZ+=PgG17Mer5{IGOnhC> zm}zb=hp>MQaWka?YkvwxAYdD>?s7u!P8EDD7%pSGT~IFo$#*>K>GsZideE;^qfF$r zhkNziFZN_j&--SqtguqkVWv<G{%T4!(FoAZO0T>j?^rS$5SvQVwN;X*QRir;lSpmB zl0G(9#!y|^Sf_=!o!x+uvB9!w{b7C|z{RDLYkG+Hyu9J{PCywLxAm}^QGkm{R@To+ ziAE*}dN7Y`Fwf(cVZFTUDiBFi8gSBW6o$JveB}|JoQ0T*@6r0Ing7nLikJBw_sXP~ zmj~jk(P*r+vzVJnP|?O+Ht_i%gL5JXwlhEY@|5_F!LakrQjEu}*t$%n+L?JXD0v;s z;T^?=95uUk-KgWyzByX%u-Bp@LLsL|g%;;U9CNf;{Q}u4e(_;2z9Kr^`GC}-!kh*M zvf4c@^cR>HNji}SxDq8b9hd*+RervyZ-=4GbPg#0hj*7T8$#k9`D>eFQa8_U_0C_} zv9Ze@ROcowcxC@(Am6X4cHmotXUx69wCSWD9%sIl@FI@0dA?mXb-RwLRfADPfPrS6 zfq`W8Yrlg2+_)L+-gn%XX*0xj3#vX|iuMZ8N`4qT$kImRc!Gm+{YtCidKXkI7Z#s% zPoYunZCQVKu)eugRfO&-`IMmXZotuP|3L5V6oZ4+h-G!U(9)KwlzuxCoF41_Kvv!S z9b~}atp}};F1H|C7bCBnXM8+L!*$dow=uw&owaKae5u(SH1D}TIa(&7(d%`7K5090 zZrEJ4mfWa^b~W+o%l+lzI^Gn%$I75x@=nu~cNl*1$zcA-41v7goZP%9gU1gCf%Wrl zE>K3-tTb9^f1n}4%MhL?g{~P&b&!V(i&$=(B0BZ5w-hqK{9nOr>HOE&PiLzw$w76O zA-aiE>1hgw+b<r6s{fh;_-g|JSM~Y{lql^qZf}>+&zD}JLB+y_AP{UkNhU$3s`x3- zK(+I96`rDZj99v~x?sYyh_gU#{y>0jg`;-8b!Zh*xKQL<P^rnHME^dPnAeW*kkbr* zWcQ7KA9k=8NpLeJ@v~98Nu6|Iir4@NO_gqX59`{f+@^BhxyrqF%i_=sdJpVVHcKUj zQd+g|uN%nknHD&+yw$j@k`L{=94WUmx9X52X0uY`Pz&Q@Lk6Lm1Hy@>0>sdg7rGXU z58<P|`&o^BY}_fW39OFlHfb<u7>ew)^O5<?KXT`@7r)@{^>uk|n{nB=olNuKyx=u7 zSh${Ae*L5C$o&fbYRKU@mAP>!YLm!kayNafz7}wISD!3@+qnNVNiaz9Lx@89t!54N z<3@s^5c?C#1q1p8@+++sQfQ0Rqa|?pNo^|(KvSM^k;*Thr}VJfp5?^e@8xwhSJ=lF z&S`cg)TS5zI30&&{@%-R3qnCK!%lxEf{%if2pXdFq7r$-E~i^k?hUctW(BTMzjb<u zksWXvh9p{*h@pv+PS`i+_F@)zowd91NN}+5#c6#6lksJ>#-83Uj7hspjwGk;`w49I z)n0m$x-VI~U7g&QnZ%n|PZjy-7U}mf<o87ScwAj7V?(;jiSHSr`LU3-a)&_g_m}mC z5_wKyZPpLfC~I{_j+RX^o%2jJ&4bNeN@P>lU(MLu@q5@zC=_vfI(X}G*l!R%C8$My z$~-n<_E)}6A4OX7!BIyfyLRRQ-jCU%JiDTN6iFSkkMHq1M@4R$FBhI#?0pn1VgZv; zw&MLSA^atirrJ<2L3mS_tqVVQA4^xTO%$jGR^VDs)qNaR;A{G5)Jg`RqQ5qjVekSU zCDUqo`=B`6|FfIpqw#XP%Uie&K0nUTaHgsB7Z|8|l3Yq5K2Ac?ke-MMEwWa$s54tM z+fKZdDR&>@ApJ}{y1kd%i?ZBq*IS@MDa@*QWY_*g7r$3Dv7sgKLgFdG0%-Q4Ol4}~ zWA@xZvk7C=0)yLxK+#y<`CNrhb1}XU<HFS54y&~>c}E?7^){<52S0W^oOML3qV!Gu zhMYs=0`$}z=(KYEI(;>trM78`?<$h__2K(!+Tf%)jzgBsULGb}$EaA<gYP<%m&Nfl zcGug%>*qrax&9Rg9evJ`kgPg|)st{UiUWKE3Ns#X`djjgf0-TnuZj%*hV+b%rhr53 zr@vC?htZzS(TPXOWv}K1F7F|6jF>x;g%;}&5g9E7Ss?lbWKQ?r8#)gJUm4?64<4vk zKvXLVm<yKd5^*nIXIh*RD>0Fi>MKPW_KtHo_XpLr!=vtclE}VIK}UMDsc;aC{9RAC zJ;57B@N(DqGr7oI;qhFnfoB1GQ%B#_+GWfxez<||b~$JHFYcCZC55<UrjVmASRTrb z@5$E&rz%yUMl&Tex{G|8KZ4Wm8z&?1gBO{n391PbC=UBU9ARYFPW~2X?q+XR@8EbW z&NB^dKzjVw`dNGp4^<X@C2u%R>tWjXxEH1!qR+xr;@l#GZe>SM5(D;AES64aUz=rS zkHK3<Ov~)<5jIfn@%6ikJ!B@imUc+x8||?qU7}gQ=0DMLKD)%^C~{ksa{E!JciRR7 z@kC<(59|2nNAO348W#iD+UK~xtmHc`tQg}wyn)vfL9CYJlgjL)BA1AS8y9`jsw?6S ze=(S@Pu4b?4~!rXOt7vXK)pczwQF7+N@)jfI~MnqO*O{J8Tv1q--HF3IYf6C;Wn;T z&+|BX%zTqp*u*Ieas2VcWxgnZH6=dLzJOIigrr&No9Js>$Ew_E7EYOtBoDp#b-AG| zrD`3=VG6r+*hY-((7?Ut3vPF(&Fg3N{AC_^G<X7@XwC6n40oP&uaG&e2-ES0V$Eh5 zo}cC}jJ+O~%8HY(lCoNCZ5iR$aw${l$gJzUG0Ce~lS%2N*PAzQdcazFbr7yT5YQ4D zZW#2xEa9&}WnJw<ih>vD1>vJkzw3A=j>B%B{B<}qynBFKV_95}&0@IwZhcd7M+^wl z7X4IVMt=)Xh5gXTgWC`!`FWN^!}d3FfILwFds2RN1==LNau_riF{|>rJw2)^@&~8) z=6xY}eJj&k7VK=jnDO>v+JJs$Rywe1r_RbKNL6O7Q+yr~4s!2sJ6WbQbm6aad-t9{ zh7_0Y^~m9aN4?Yf=o|L)IY+W>C)1_#^#*8mh=ts|L;)1r@n&O(Z{~HvWmvyP$#|0e zT*zXXVK5tpT=3k(b#*QCcHQxPspFI6I(K+zvC2C)SNCsNwLgT0Xcin@4nLD+eVV7B z6j*bPRUC+Z2mLojtvmQHq4e7tW&nG?{Lm6W8Ny(>&R-~7$^Ir=jb$QO)neisp@|MW z*bz)dSR|hc*f*yiC!DZPD4#tY9>;lYw^ie0TUU<4Q&lk*Sj(<s(E=EV`><^3FIx*X zS@7|S)|7CNiZwLv!RR$>w<WZ#S4j=d^*GEWE|grheuEO(uaMy&=ExTSGUs+!A~NZ% zJjb-5wDyigl(zDkEx#}2D4Nxot+X`AvSwY0S29?^FI3G?2^^(Ie#i~88vH7we=%6; zA=!sxd{15beUQSI^*WMxWAlA;<<!IF1w{fI6@S9UlKMMCG$r&sG^H0(xHJT?@1}o^ zJpO|*{%Fw?7<;M`1GpgR8EBkeIOOEzYbl?%h+{dKb<%W>6_R8qgeuu}=b}!$;Vq%{ zE1o~28tQV<6jZ2lM1mmKYy8?SX`w8sW|`T(FKbm7M=vd**wlDWYI(2jZSG6kQBbB$ zjT3MM?%Ql6aX3di-2$U}+HCGfgBwpRdY3~XE_;ZLKrFnd9cMl42@4r~UK2`CYk}($ zn_=NJ&H9YaedFYQG*yOWq*ta9N+_ecU)jQ{Kf+=ss=c&Rr?I|5r_!H~Tx}5mm4~j! z9<>L)M+fKd=Nf7ZoF(t;=Blmk7(7L?hO`W-5eX)GMd1GvZ2jJdm$cvwTGO{5sPY-3 z2Y>338+tc|<+^o?FJ!i==-Hh{Q}ky<Dq|p;YPv!o+F-NI2<Bd>ceK46!UJQ=rWAq6 z63g<JM2fpfm7K()^-Xq5?*_1ptZS!WLamv>ud25rEN*P-t1Qc`Ep~uvYa(1>LB=#Y zG24mGmFp;7eIkwRdgn;5AUDcfbof?xw!l!-v7XH7QR}%x0Zv45%Sh;5UH6L{>ve{B zN4^eeVvcvy7G86H90%kBy;A#LHcExvS3z8c@H3W;>|V`A_~F@%5#BoYbxT+YN%TK= zhlpdP7>H88Ee=KLsD^udwmw?Y$_omTbDy;#wOv;#0soCT8J9}2gA209q%u!PF4Wb- zr6hX<_N*9BQ1Ay5>W5`RqpWPHo^zXj9n0TfNC;0BRMdeII}DaN<d2W7v(hlG(M=xa z%h{g2?UHuF3bo}VRmvJf2mXTAurUp3oXys;KG%|^SGmSc%D^`%9hh?FdDbR9S1=I_ zK-%aEQ_bDFu0nX-tIxN*PGCM&t!1jix8><$UxPq4W!eH47R@`tN@iQ{l<d0buaF4N zXIxRV6nb<hXWVb6#@5#rh=0iFEwB$SEk5kpvGZoaV?b+pWw&(3>&ZqcJ=~=7jW$U5 zd)lt)dRY`Tlp_)}9(O3eaDRVtb8JIb!sKu-P<9H-cq4{DaE0}^_|pl)_NZpp(VkB( zK!>ONokD>(A7jGI#;zN>tk|QvsgJ;##HWn(b2%a7bK&E1kG71M7i!hCp_CV?nNv9T z#rnB5Ae$@-IHN4&$t`yWDNk9{pE}7bQ{}X>Lunw5liNn9n^7{khI5`zwY|R#4Vp5G zJR97kQ>Ot9di2;x0ZR39S<eBdFV2LfOt~);&5Od2^428YWxw?EJdjpfV$%a+`j&jP zeToAuj`QNk8oQac<h}>#my*%#H+6?S#p_@@fw`)Ky6SKRN^4pXvwOc$-%D?rA+NLg zgXWt}i=J~aEB$JRokW>s@odpC>e2a=mRO$NtgMeJdB$h70=)x6UV9vvoF~-N{|bQq z)%=#>bZdN|9Eh~gB^!9aocpR&?j6@Uh8DT`Htv@O<|GR;d=ouH#Z%etUQlM=qx&dX z3GcZIFEu5A3nsgZ*(nM|ga)TeM{N5DB7rTT#pL7we<HxiWL=?Fw9QDU+4W5j@7b=$ zy;Pb$sg7=grP@x7=4p+?ysQBNIe_WFh%;YVB0-M3rSXs%N#_N+D=fcO>W-?}l)`z? zuJa*A*ig$zDrhSF6m@#KS=DyUN@+p7_#le*zBu~nd{+2e<YP9#Z{bH(v-gNle76vf z^TnkPelh4GI)Uk$>|uDI%Zi>SzE`1ceUvA@B~<rj7{9YGx_NLyMx)QO>w(9ca%5M^ zKTtJo*JY*e9?O1Kc9}}SAM|(jhy`5mkuMe{mXt1n8(VpgFN2@$fN<itqQY?W%TG=H zfEg3%(<^FCSB?4^GRy9mN#>%2xc7rfUf8g1K~q+m_(!f=*<NyfOXy-9KFdOv_=M;( zRpiqy^lrhFs+N(}OciG1PSRLjLon~dF){OfzL{ORE}yHz)zl>68e~VdWOaB^%PFF7 zAi_L#^~Xc(v!~THPcWdxD3^}G-ZCg<4MyLj3N<6@51sGUlD+$u;}<X5=)^AeNZ;?* zhb~bj12Wf*=wbPi5_S4@5%)+$Y~VVO$i2QCuS?U`t*OwPudqiC$Ku}Hyj)+CD8KcP zQ6)DW)$^Wv7xuZxQKJ~-%WJnNtEj2CpBznlwCrN<_`tyIm>iStUE0!_kNFV6a&$i} zkhXMA?q^A}kx2r?WSLn@tw5gmG<XLNoX&~r{69YK-@XHXg)v9DHewB!qP|i;erWdO z&^~DznOx7VQMz;byl{K}Thl|Nz@DFi=I`jyQpsG3b0^u>gs9!Kc4D}1F}=g!AOQns z0)%tbQSv$J0fB)BH_k3iTG=%|cz)#vM{qA~*I%iV$-{$zU|Md9hRu4UBs5=f9RfSm z7CfyDXQ{zrnE}$hKSSfXNs_xg#KW0wy4fAgY@=bGkPg0B2`*m`)(E_Ht`2?9>3$i% z!@PchSTs{qy)!B69#12RS97&G#dQ*Z*a#D?#=wCc4K-H0L2H|lO#K{cHqSy!Bi&f( z3b^9$e*FDmlPE!b<k?(>iBr~6P-{|j(`MaFrL4kKx{}n0_r^V|6WBC|vWC~$T5rdC z)<+7kf+z$#eA}1lOW|6o9B|N8+EO%eQN5Sm{n0MXiHAI9@v<FR$Uw~4`FAm6xAaS^ zZOU>I%i_4TSHVyd`?!tbCx=x`GD<iu;%dL--JUjNs3f$044cGponLB|o1Y<KI4+IJ z2_Z-GBQ``*QurK|V23cXN%z|woHHT;?Ca^bFSWq!EeaG{HZ#U-EJ5mWJ3wB6y55g$ z!hTIjuMc|7OLj&K-@R~2H18X_w`Ng$OXx-I(Yb_4fsG@}L7IMUXqOc^enG9db~Au7 ziUiD&-PRBEj92B#*NUQR!maaI4{in`-0ag34>FKl%mh$4ca+Vw;!9Lk!)TA{U?4aQ zxe;TB*Wy6PW3p=1aiGU+s^r$E+&!AR=}2OW)zyajH*?!VR9_nZpghoE!(Z#leSsEW z6P%=19&aUXH(ilwo$Dr6%N2Ik<iNt3{xia++k(PlA5C_)qRFt@3uy3)d$(;`sY-9} zRap1QeAgSZ2UDacI4+;uOuWH{(N_6DjT6aN_&m>co!@ZPY5rK*0!l2`h!Y|R2UQ6R zVO=lF%EcLPa$?bPdM~FmlA|=Ij-4^faNJ%WzA?GgEQOcFWhcnNRR?5t4hGTgkhsti zE7Q;R=j%F4G=;X3rYJgO1U9+NCK3+nt69c!&O=n<BJ0}jHM4K+RX$n+ENN%J$1FwF z9QVU3t*60L%(nTR>8K5IwB{{ioYk#mSQ$wvO>EauHivadf2XpW>4ow69J4c7_4-NS zEKZ`cbeqOyoUKaPMhYQ!-^$%&Gz5&K+;crKb#v_E75NBOP!oG1%nym8R7BQCj+?s| zHhCnU%I;h`9H+=+02iNpZbl&B;+y;x_x!K?kf1qO8^+8Wf=-N(H)DNB*%a8=nq~wK zU7h5ZAn1`dP?r>K&I|boXI?JDm<(wtmjE)EMa*qJqdmJ0NM@1Jlv7nIflK1-V7_b= zt0X!<k}9y@0jo3wJ5J{HQT5r%d(uOcwh@vcYY42QPf*4mlfN38FG2_Nt3zZDG{s|M zG3e)vFFs~6TODFtz1Nt&ABsC4z_RKQ7M+1;E!_i}JgH2hsrsTysj+Y-tG2>o=GC75 zxx*coM`@xngQ5;SkfSxps<og1U|ty>t=gi7&bVU{D=N24f|nS*w7N{bY-JJEkn{8F zU(fL~>H2T~&^8J(2y?P^eUU?-Fb%f2aGp=a1Nkh4>|ycZEXaE3hTRhg|4K8eL6vXe z@LR4QE}#)snkN8OFFAM844Owm_^ma8i*A9GC2fq@Xp2HAB94>glBRI#s_AmhEE-<6 zZmq|ky8w1Lt?4+NbtWr=gqCv{@)CUh237t#tYIoxd-PF%VlsYotR)kKTN9f%-d*R% zb8EF2XkCezOObrP%mot7>-;BeqK7_kZ^W)*bO&^@<@egZ%f6Jv@<s;3@ljUcFEHo7 z^Gy#6lh^hoOAH^-=__1g3|Y{vV?rP>elKD3H(vHvGz1o<3JGkHy?yQ<nqnkGS{!_T zF@%zUGhINkd09O2?Kh0UlTBd)+(EY9h_Kk9!w$Dj2qg|PGhsT<>=NOF$!M~ok+ZgM zx;&LpXJF7y(1Cjw1im==z`5)Oz;A`5cYl*4`t#<I0Q%uMHf$I3U7fX5s%V^Tg#BvQ zp8SHRNXwd_8e(HL-Pq|WheG>p0(c{Eq};oUh7M+rMN+e=EMXu%F~$0e!Erpxn8j?Y z%q{VVTH{^TpwGtkTNgR&M9XP)%kBzMm!>PTJo=L9QV=a7c0Kh(yDIl6lfhcYAcRoL zIkF!@4iQ?WV&QNn`8VnLPt{^o1YdtPHrVRw@-^rhfS1E$4G^IHoUzpvgl^G$rJ7n4 zev1EI@Nv7rq9nu5+eA?*)KbYfbaf{E_2cWlhW2o|Cn`_bAE(+--Wd~1O`0!>3X`A^ z#5(jZA2t|Z3J2&lu;_SrYHfP>Z((xw&O?&^a|Qpd=0VaaO+xY0SEbYP`!QD~8gM~p z^EIa|-zBF6bhO~!P&)d9IzPcV|J;3512ESqzMgS<dodXfw>d+hnpM=a_7DhnBX{fd z=2^SEtZloaRjZe^)(s`kR(x_AIDJCP15D;E$>xxCMRiC}ebLzm+WyiKdXuI8ck1?Q zxpZn!=O}CKgO?vUOF?bR?;ZL@-|ezK*b18W2uK;XeiJzf)=*Pbh1L8WmZ#Vuf69M@ zQN&=a3<Ta74yoz#3hKflp~?%YIcu4j<f9o9waOKy3^D_n(Kb5Era_a61=x^)0GaM? z-n!{t(FxsUs*uzG*kF5nZXnk!e5bJ1_U{|@AKOS9ET}C=)fY_2GZpx(<6=P2E3ex! z0}<c1O+S{;rHM|xgsLxp>}Lw;FYssF;gnD~$ZTb9NL3*%-u-9h8Xxs-Dg$A$m8XO1 zc6G|itkLX+s*%KAiPpp_lgvOYtSI9ndcAGnBT_}9c*e3t?YIsl4Fge45YY0(_$Ot2 zmx=xb8Nv7}x6$EFS>YDT^r9s8Tl-hD8<F}B_rSNL=yU9bn*<sS>%<=Cs`P556Y#yg zl6Se%WexOo|NlsuKJfd|X{nm!Qw=6wR`V?um|@1UdFSSuE5AzQt~kz89_tm|6zYHj zOLyl??|W#Fo${D%i~9wr3ZE25EqvAuY*BDF`BN?a*C^&+aHJ^=)HyOi2mc2FNHSFb z8vd2v0QIa|n`oVMBEQt;fYwVqR`aQ<%82ObnYG(r1{Sb3_Vgu=JIo^~<#54yfx=mN z3b_T9qO>E_Q^F+W#3%%2P2$N$tk2f{AZI3Ntz>G6;%GZuPC7u!QU!AQFCYGYL|J&! zEog`nE2#5N&D`?@AP?W@ou<20*hU?q=rkyr@9v`;-J{RBC6tt`KEVEYr0(n%3?&u2 z(IKUM^1Q%aqr!{A%#2q?&|=Q!Y|$@AD-oY>@HqlWXo3Nzi37uWcqW}a=s12$-!}AE zW+w<e+f1VraAi!t#(&7xfByIiNYpAJ`mxN);If}Ei)G<`aAxN5g6sK8fa-Vf;}A4` z_9Clp<kol8xl(o1E2!#)PQ2`&_YefZ0{351v%DW*L!;>!)emx}uvOky<D{XcE^WIJ zN;lmW9~1L>O;r~fC@ChLtGZ+pe)`X*7Kv0oxg=Ed%lwt~fuhLHH_=u=eI~d?)hQm> zRiac>ktTwWPAVP#FeAPowdWCFOZZ(_0oBm)TPz8?(tE5qVqA){nY5?EV!GY}VG*Tl z;PkJ#+rQ$nzjJuQ@=#vlIkFrfplR{qEw8h%&@WA2@}u(dzT7fjxr|Yi9gFJhJCZxq zk<0#naVf(Zeji@k6l*k?7d0_g8D3U~fyq2-Hql>EVnV}qH?piiA}j_2DZ4${hWy>< z{xs+E>VVk}I<xj!AyJzV4~|!Js2Z>q+fr}<EjY1hXUu6Hh-a(a7@s81>bPHQn@|0Z z#3GS@-<T4Zm8!Iu6P1*b8mKVG<37nFF!MnsxJpeoJtkd1lP=1NC9mJMo0<~XX3M+- zG8gn{L4OYL|6Udf^|G*lQ@x+*$L@pzeUkciR1pWUk(N-dA{hoCGFqr?+tfxO6#0gp zTTl>2?JZsT1|4Xs|FbGE6jDu#!k%hjrbKP5Vxcm$7%6#bNFy>3xvYMC%dTeR<(8UO z(;b@3Xuma$se{ooCvg?uq9BQf_g{2Kv&GkI*O^$iE{9*AOl?8@D7}oCPGv>%>MnTa z!WmG*1FaRh-{vc){sS^WrTK(nZ(nbJg?Z)(k{EZSCY@=9T8`E>mF9I$l-4U-W#nfA z|79o0LY7KGy(o(7LYopCrjUx9>NRg-ki_sb^YYjQ`tsI;1rQ0?`jZig0)B5LgY9@( zCh!`4<mf8K&$^K^=cvTke1tj8MwaAQ<>wroNHVLyKx`2ggGk7#W~E1vZ;Jv72I@aL z1O!&NC%E@L_qq+eqU^6TY^EHKQEMal-gQl_jqtbbxv7LUgnwHp*{(2GS)s{g1*hkZ zne2QK_9g3UVf?)#R4KrYs3<Fohi4fBfxCH@5^Ypi7={NfUIql#PrJLDb>>s$++|Ym zt$L`3HZw?DoSGy|c?}bTGf(Ib%KDoF0)NIq`0QO)A8lIJoe;qpsaYT*c9w_l#`d*= zw#H(2c8-DF@DsTK4gO4vf^nqjkL}`I7zi(u*Kd~~m<p@CY#OOTv+ro0X(GvnLf{+l zhQibc(Cpajui)hn<Y#7C-R=HqU{V2dtb9i-KCGv-naG6boHS<~L+5|9sNZJP9NTs! zS(B&J>5E9f?Xdire1V9ZI3fF}s@eh-#>jGLtn2_x2&*ktE|OH{RV=qvmUH^IP?cre z-|-@rVhb#UhDJ4%VuQj`*(6JucJdKoW5!k@5}V0WJtyd;a0FK4mQ0Hyi{vE>B_@PY z_0JX#Pdmk0pRCb}QFVQAYFES>D4Wj6hjML0>K!VYaar@Kgvb`q{KyooXb4rzmUEct z#!Tc_#C6nvKW55zD6i!lH{S>jYBm*!WJb3#I}J7BO#JajF%b&e^(6cLQ;2M~3C@iX zplA9S(+-N3QprILO@|4}Di8z$4Mng20wHn0?|x98dIU6yvrK%MUxgAYowCvmbRJ=M z;dSL(m~=*YrLxz@RgTF7;0R5bHc>nP(yV{d_@A=`3Y5%BD>)4f?XsCTqb;Fs&Lh{N zcvPcZG3usNRfTeri{s|UE{91e+RNfvhFkTM(_AnR102i$vaS-r*SFzUg*DqDn?7lb z?Ut%kI5Yu4D(f<_S&S=b@OKXVP5IVFeoTax-@By?aZuw+La%bQRmsQR4_3Xu*dJkI zr_=hQ?1E2Vw3l;4%5fAIE2MiRACqVySn;{zmc!y}Z?6;5SJLV72zCnRUWX;^6J<Nj z>8-v247um?zpHlsi4!zmKELm|)oqB@zpp)9h(RWXg&TcSmAr$wx7jFIK2{K$UL|)X zqg9#fn4y%nBWJ9Vi9#@tz&8aEU#9x2kK&Kay#-_rpi@0cTlh&CGbSfZl~Nw|Os{B_ zS11ahnSFOWKfP*UH~)Ez9-eqWA7*X63w&c2+1!vt0MVBVGTZf*{{nznb3PD1@7-n4 zwxq&)HR>=xLP$Hgin1MK10}LaJhfSrYhhE*srf|0N6bW%4U;o3Z<KnXp+zAwRuy1B zs_H#U{4L@y{Q#0-C;%s+#VAab74a}o2(WSEb0_*8f^b;_-uj3vh6l%!%A~(p95>sH z?S}oDc4;~X+{V@t>ioqQkVcVK_5X6}1s{+fj9hRRky#(+)x&Z+Usu_O-ZO&?7PN=O zmj>L#tTM??(+asUCNG^RY_TqxEh`5Y*)A?C~Wzv9OyFi51!@Q^qTz&|TeGdh9O zF|<l^IF&IF2x8wSkuttoS7AL#a@t1+y<#5XL3ATKVyW?2%&khEddBw-@G98rdz++x z1n2+umpd@GE%J4;Y_r;y;!F8ETIHtj3$p4B$Cc)xQ$tSYSqgzkj2%@vv@b<SHDP<S z{0=J2^>dNbB#ezC`{US#AcGO+h~4|YC|Mr_7XfRSV^*G}sH;n1oSCVJffQ>t0ie-P zw{O&=G-B48Y@pR+Ks<wLcP943!}u{~-YE>wh+Vva5f(dE32E4(gA!Bq*Zb!sqfpBy zw}g5ZNuf_*aGoqB$9f%VA7L?uWPsDnF*%u;Uirs-w&gVNl3u1VfD-Ei_<HNfm_@&e z+AX~d&u}@-f!E1LS`_>d31a;cNC6=YKqfFt=~fENw~r8679WB<o^av5H{8|jKdnVD z9o@Dyx!<PS!(lUdOE)9-$*ti?tHF(Cxi~GZTVTF*MrNqCsKkwE9$6gQXqz()8&75& zm#T(wmU8}Az!gj9;*cBp{yrF3oG-AD{s{98az$N0eOO4+!$vW*TE#8!cf14GT(M;E z+-Mo8unO#rZf5<G-lcTk2)Y-!e4Yumt~oyY3y_+t)#lhUHF`eN|3#hq1IvG+`<!Ay zI;@Btab3%9fuXsHOAACW*@H?fE)6qb1AkGn+C(=`UKi;mcAN_YQYfIgLWO}iM<ce9 z_oX6_s+<GJn#Fplo&91;{sq=X`~gnSl95@?QSR-P_Dx?60b-4p-LL`sRfvRcf${7E zS~vQnr`?zXuV$=E1w(NKPm<Hp@JpSc#45d#VIbz@Y0!U@-uwkG8J`HSMjTV=);%t^ zQizoBo50~ccM~B89-Snh-H@1G(X54WU{I~=oz-#<jb%R3PKEhOZ%Kt_<~(4Ux|zQt z|9*NTsz+5~4P{PL98hL21CwF$mXV|zpu8|E=`N6w??!%^iA=EL6G2Rmq%3kmRB{{j zX&4<Fg7hQP;V1v=-!}1I<0Nn#ROtu#fvR<}G{%;BUQ?4Pp4D^bwc1J-RvgX~Ny1n) zixJ%SvvSo|-Yg-iT%+hty=*8XzUN(^g7VJZYXEx0vV<zJ+#SBb@yCkFzBF5=!U_wy zqGr}7)3Nx_4WwK@WvG1Bb|P&~3$>2fB0h3GOYKg0v4`tXS5`Q};B`~hYr9{-?df%y zvPsl_)+*H}DI3e(#Xs$IG@6Q<Zjba&yZoW0mvniN!}!9jF<S4QYs5vrRLwxww%g_s zK1h{r6xVjdkPS-gqA;FI&qs73D;kk##zk-BQcp!CQqh=(0G;zhVdnRafT57vVIlhw z=EjN`Cm%&M2XeZli&d44l3XfALnUBhYeHwx;QSl#Crd)6vgAaMM@UexYu|-lTxg}^ zS0%QDj+XovFc~2@U@Kq8bG#~i&vgw&pITpab>OAtx!mm=RH5-kggbz%4>b#*$z_OD z$k5`8kWQ?^LP!BB!w^LB-yx+So$WXvv{FD9L%%W`4Zu&uu(@VsiHtJ|0%&$YPu-OA z-8k^*tt0FJgHWackTqa$vud&aaUTUW!Eq}ojtf9N(R7sRIj1BM`{;24_2?OFd=Q2R zCJ@wlbbpRub<6;h0jM6_qA)Fu2jqMQlKLXd^SVF&wgkSow%~M%4H@a>oN+jyW?=v( z<B8O)_!g?y3ILnUkxmu*lS#bcDAQ-uaj%d(3A8%8J#5Rw?ueY}SeUUPP@0y%?eYI@ z@)5AKU!Jyv;?keoc+^u!VrlJSbB>mTs)_}`LGl1RVIoH}z-m5`^-aOpQ4%<JCY!21 z0ImcIVCdKb2x(fGlZKwY6gw~g_zwWkqIjM05YrW#00%k41kCCF<>16WV_PUFFIOsC zx^t6(7KPWA8C#i11UpO1Q{O{CJ5j?!cR?Vl%WtA4Rx|{FA{fXP<S{Gd`8t_b(mcW< zhs`@Hn^5WrI_Ty<3;O`YV5_XF%CI5Rn^91qEKJ^^sAvEf(I;epTaRrCrTFTo$#%KF zmK6IjGH||JAtfaALE_`xywFWQ7RVMrfy(~{c3^3z41&|QwOB4s`hgJ?`IzJyim;F~ zk$5+<E!arbkPK|dey|H2khxM(p>V}Q#pIM+?IrmWzZ3|bv?z4LK!kxDgJrh(SW76} z=R7vYjECvBp|}mGaQ>sfdnsYZw<y~Bn*=okNC2K8Lm&TdP0r&lQskkWQ1N$AOaS#O zGSsc>kj2E6MuLOv&#~aMk4j1y+?WC^Lg73AW$xcTOg>()t|jzypfE|Htr0Rot)3mg zLt29M2j)!a3Q`}>7A5n@E_X|m{ImZseGR^T<OJgHz}pF>E&H9&;KY($*j#zgS0%q_ z@eOrcy6Jn+ToLaYVNX<~Cta~+!-jlJvHSzFeGoH{2z-UJ>Oz4<&=AIcdwWsac{{p= z$H<9=f_-(vZf>PCIXjjA5$mB8C<@P-zY*KSRm$toD)svtasFj6<X?ih;UQ@f=|FuB zm#(b1b(J67WLiGOY%_L7(40JTTy-FHy4kPgp$~+xXaw~6+7v30`msFTV8Z72!9~sk ze}c`&jRk~BRg=PaBXcyPL0i~_yYi8`{MMPBbzxYH3<Sp<&#s&SBo~fUyjjtBNABX1 zTh5WIYAES}7z+Ep#8612@1O-WbR-@=d!1oN!};`M=(zE0RujKE33lzO$mUbgtAM?U zO*8_N6`HOmVj>gx=I3RU<%P8<v_#4Lk*5YhgXNrt0%=J}DM0z+n2~(XTE&Q+`}wj^ z2;3Gb3=JXybLIQsRZIHM<_hnL0B=N=T!Dn4ur6n}_4W-*J^BMJK*x&a9aS^eb?uSO zG=Y{d(Sv8px1H|KHVGDi7E|Fa)Qo9S;N|f6Emp&SK}kT1X|8nN)=*EJfkkPFYTx6d zpzf3d_<11z%G8=4Pkb~oDI9QdduFmas%B)fb$Zzyd{67ns`(>!-b_d2I_!g706!(W zW{>fY3vLOZU0!4|zCdhr4fTf1oI~0Novo}7G#l>JebZ;5#3n+`{bPt5Kg#CfK!B)S zH~R{lPQ#Kp%bTU_&{Xgn`KOcsVd!J*NlS~ZwIbdoO7RYhhTY;ceI<3(0F#zkz+?>0 ze;1E)R4)4Y+cG&x7zol$hXdR1z5iFw|1bJ^de|ou9EC3W(iQ+}#u%IdI_cB(Nl6(~ zY!*|hR`<+}xC~`BYi}=gmZ{S8$uNPyGh!tAE#;pB{qU%n|BtY*j*DvR{=OGP6h%}J zlvEKB5Ri}#3kOMQX_b=hju8VCq`Q&s?nadE9%>L6dKk%}X6D_ac%SF@T=o6O4`)1Q zpR@Ps?^=6pd<swsY#?a}%Cymscduy(RHuq@FCKM|q3-v-N_C^(=xVt+KPK^<Cu7fR z_@5lpzX(WgOn(xKg1=Iw=`Vk7`2M<I5*sRV4>>leLGyfEXIc_xST8CM&y89)tEL;F zf$KD`nodiSnZ9MD5#T=Xc$+N6O1roCvoh&UBN1RTgeM8)y38B^xmo&wF?w_wX2d`x zP;}rTBfMDbU+IecS_)MEZbTc=pHT#Es&_=5+@j24R{A<YU)UShO)N|;scuM73G_!; z@EL@1gN|D^QOZ#beKmWhklU_1i`0$`tN*wKdz8RB_V+8Y@ZgOkLNQ4xEA=$+-X&4( zA`1_i9<~uesKsrD0&C>I5(Sx9tOQ+6Q{H^K`@5pnBkgg~^XZL@9X6Nst2o-?6}tCv zOXX4bEyi<er+}5-(jQ;TqK!I-<TV)!Px_<){2pah6+q;|;-B6->E*zS0<4^DA^rWq zp`MIgmtZCk4w*St+9=l%AOAuU2v~FR;8WC<_TM5cR_;x=+D`xU_WqgK|Dos|&tuP@ zCCYFtGQC+9>??R|he)8M?J=*m&uUP(cD}HYDPPxZ`UdSViv(|qKCpDS7b=WMQ02vJ z^s_pZTJo|w@FH2m&y&(EiGR6bYc!P9VrHEDrXi@=r-V9~<Cy<{Ea=aG^M9;%II-uG zi#I~5bHT_GA-s?E?>#UaiBWv8T35DQtE>h|H`_e(4j6r+SPB*C&u{!^2qEWyyb-w0 z%4CMOp&<-M4Bnaw+^z2z)VW-%Ibx7t>YDZ6<LcoBF}Nx#D|gTBD!J3N&KClCU#75E zeNIyWNEY*_|6g|Xa-jKiD=Odfa`6K-hjGhdSDlxV{I#=rM!Z%j&_4L~z+Z|bx>XGd z0_Vf6!ZL03*=SWH(v=ylC=C8P>LQ~Ji*8WJB&B*Qb?-d)ke>+%1CW%JB#<gS`u8<H zkR?LMj!4ABFju&W*W{(K@a-A;8N1v^mhPkdgJ`_&BGg24&=t{#kpIu({m-SU*57Ck zmSXvfxne1CvKp;KUK5q?^_)>T6Dyn};P6!ao<gP%ypeMronA{i=2P|(SLbUZYVVYO z271ktWe5}`Kz|k_0MtDi7ziunYe18Mkm77mrb$ZURrk+@7yRw$YSn;c62{lW>P!i) z9YfVr_y7nfDKh7OKInfgNv;N7JTC?9^8#3F%+jEpRH;>1lt!1TKvrm0RzYVBWcmii z@gduhf}WFZAft`S9Bh}dXXH=S$VhqO1M(Q7s)9hXaYCDaYzqAiSDk%v*|U=nG6l~n z$0S1=#jq%tsr}V_%AkWARVX^&?X9efQ67CPLuRg9BDsbsseY?mwo(P3f~W+zRs4ax ztEi|%vw|tb-ZuTIKx^)RZ9fB<VNufxH<ZoTXfMRHOJov2G?pc^>0wMCKLusKq&VOm zQWo%eR`641|Bt-=<6QLi66jpKF;M+Y$EWgEVEhH&bIy9#{L>Gn3ZL`<-(u-3lF?zm zM1~L&7S>Ti0@<V*^F^=r4OO4~i3$HjKy>~aAtaTW4>;rP9mQv8VVQk0i>=LNj28PP z)5O3;3_kt;_;#K|=LzpESu(p%-+(<~A%yHpb)7bX$ehE&8|+c~X$k`@gIgD3%aN?K z?D?L_>$C8%KJ<qm2IwJ+sH0bI40=pCkIth~S-GV3+v%z!pz2QEF~HjwV8%l-sf^?| zxD9+div#u`<z2RZ*;W)ll?O<UF*|t!1v=J5(~%RQ;<as@+3o8ZxJf_7OJp%$ND9#h zdqj3Tb6q3O*we?5|5?wg-uxSF0r(wJyH~XEK=&09{4EoWG+f15Iw!r2EK1F6$2^*p z!r0f*BFMcwmFwE1`~?A@NR}ax42Y7;wW-Xp;<bX`<+dN&>TKm%9V%Vfw>ik=KPS}Q z>ud3YbaPUPU?VI@&MBS`evavTsW8?M6s0>Xvi{;ltJhmz1AT@d6QG<te0@uyhxev$ zOuarT`}iNu|9R;ta_ZWt6RGtnRL6?kllDG7`Ox~-YX;JK-Aezp<UX6hbnBtPfeATZ z*6H!5{TtK*V=ggq?ET*4&0q8kDi@lq(=V{vZ4JoRx9SCm8*`3lDnSHSac3OL8-7%@ zd4|ayY2?So0D8JGek(|oTMBF<X}TB91(NIin8L4w|Kyr~#ho4bciagfjRirh*JwCL zzT;h4SFQAMy-Z-5PZPw(JM0ZzO5HdtYu3YKp<fMl&QJ0!Ue#Nx=ShgrTRna3Jg#~n zOIzQHRr~vtmstW?t&{;6rZFjriv!_id~58V(|x^8$Ijm;DTS-My-fxZTo^xf+kWh< zrBvxv&A!%CY(#9du*6`|+%aXI4UaAC)u4hmAU+(Ed&`)ws5pZz8+kd2nDOm?BobTf zP5=>1?u6aJ)o$uk9>jAw)P%?j$sK3lyJ4iq12&*vetE~m6IfE7R1Jl~JrJoVAtbW} zmKg*2Z%6ZoMQ2;3sAUevEryy@onyG1YbaH^rAw6it2O)2Z*R{&(IJ3*wfd|qzwzJ% z?H8>6wQQ?7jm=B=G(ad#53mBWdmI(ypt5@J823q9V}HqXbw;a_4b0v&`5)=R7JJ75 z)Dmm%&7;OlH(JK+*x*bsr>RhrKJtmZ`OfGI{xyZQTs~$*j3@#;AYpep*Y3evM&fu5 zs}%Q*3;6ffc{Uecw;FV+JGFKU?9>$V93zAPPum`RRFE-xBIEmKeEsuhbi~~$dii*n z>}&1G4&ZIqs0>(dF<`2(RTWEvCup7NqYm@fty1(B2TiC&+7XIykkT>;b6%q69{BY6 z)eG2^t^lpSoWd;jn1S%U99)q>2f#*dIwbmQy2w{88fBw`k)r1WvhoEM@QYzj)oK7@ zbBm_W0X3O}olWPIvW76OUuFL2Cwq#V<Q;AZI>li8HhFpZU8aeC(xajM{VrwUq)$P( z^eZ6^3K9~hoH0X27+ae{1<mQj2;J))1s!>15o6E1k#nPZXChG0$ZKR`yBThWZ4aV^ z9plYcrfOr%DkV4tXTIG}b>1{Iwv@%?)M1-7H(*A(ts}Zn)0P49VXflVX8O&7TY-cI zO{DyiLd|~slUH@!*25@bF87v>XkE|FpOVvYTT*dGPoCUZ`rL!W@R|<GR5@tt?$A|4 ztQJY@vaqqs3aQRC_K4#Y>7g?$dus;_2yju<wUS>SZ#SOkOY787*Pp97@>wZ(jq^#t zop_IVB4@n`rzjC;pPM>0PsU13*<#Fxm8vX9Wp^f$>vO7>S*;ha&+;4_iJDdmmv{{K z^KvyxLx;L5EiO4M5f!aftyF0LF#Cd(l2ih$9DG*>ujYRWI&SXUS>_yDc=u|qNs8xH zR7*7rkSMIp#WVjEmHe9)m(c{IbOQbS7J1EnUOskxt{cF($Z?!MMH@x;J~F{7jNVrg z<aU%*-Wp6DzTKIK7v(<XIND9R+d=eJEcRBOjw9FH=K+JHlhcD`gJ_}mvm=xO`#a+( z#Jgm#(Sfq@ymDH{&T}@qLCn|A%%V*17|zKyDINFXb+bjNjEn==UNP8D&!7Hg3!SUJ zU-&?ei0+gtiqQ2izOTG(le6xsUQ61UXZFj33Kp0i(xPT+q{#=wnVaex0a`XoVcb|G zdg5b>DJdNtbV4DiF<-gk4VhT*fLDA>7L0!6Tc01l788vfat3{{Jp!LgybIYq$mCnA zHVS=F;rqQf<+3;d=-fel3&4G#l&A||Y~AGd=t5;+Q1;WgEUdHqePx069{w*G|Ir%1 z`b+Q}p7)2IP@m?`A38iJ#Q>+ofF5j@2)^{HAqW-O_Au|2?E8`S>sBduqd*-|{k}ig zx4K`H;IS`g@kA86*o2mR^ytxqb)3d(K~q44E;NqTu?7;bRwO0y*3E*I%J^~{JC%-A z_-ZlwuX587;3XeV)Y_G#*~V(bG=!)=CE=ic<+9sYohlnM+}Pycy40U)a~SwB3Dn0X zEhtC2Msp+3)6Zbe>2wAanK_|mm(cU$HdA{M!!P<@_U5P;8+c`EQD|AvJLj4WxU#uQ zj&}>9&cBb$oOp$nf18|maU9J04wi`f6fHhS!ki>>3;=s$e+?A17f?OPnl*ADv#lB? z=5&8|%A1kfV43#d#t10c5%TXe{?&5*=Qp<Cm#+DtFr$ro_jR7O3NunN_TPEDp{BKW zhE_#Ywe7H;3Pz&=W2GJ1slDw5c7;JmCu8mBGmFMd%vV3+TWY)uN*n7v#aYc^GbNbb z;c<XOqE?!VdusKwXtWm?s^?~GQ+xc!VNV0-wMtr*#jEyR`p$-OP?tH+XF^gRh1gW* zgI%bMj*ru2g~uo4SB7&}KSHtUCTS08*vh9I(pRolBg=fXtYH$^y76699J+lH{lU80 zL8?L&J*qOSQyt>|HT&<3afn};Qf{T($eDUAhvn+mU~@aHc%c<bOgm4UW~ad)w_)zf z&KD9Gg_Wg>D?%no=WV@)2&s%m9_XQ82uJBQx(e;3%<6x8_F9Yly9*0E4-ocy8FqAZ zq)Z$$z5nq!dD2k(!@N)DJd;JBq^Ey0=lI7*{hk~7&p(fEcq(7{I5!eNMoZN6a7-Nb z#HCZ1UO-KFp#TiPNF-aw8{VLRn$m2CK5V{sf6ZdMr`ftCfmPRSuT-?8Wv#m1pozn( z%fY?t8x0~eJ)wLYLgySAYjvn#jjT%kntIopp6L`7M{u2cS;T;M{I%@7Djzr}msJVg zo+q8^;S0MilllG)!YjrisD*)Hg<*&l0yJV?y}0}S>Aev#;=O~G=%pEd(RnMVc!l-I z;sGMB4-LCd{l;Yt){>f2GKjK4+A|{B3VU{u=t)=a5?wv}`bqP}5@+T}A1RAVws2^w zX8G<C;YnISI=nW#^Ob1h5<qBX)3kZyH64V@7!GoPZ?FFU@$CbRJoT@99E>>q#;eoN zf)FC%Fnp%Aj7rhxc%%${%2?<8Ga~~YqR=ezG-XZIN|~&zPs##P>#4WH8~T#T;A|^- z)pGsSw74Btn;k)&3s>SEuGYCe{IXqbH#)S@-;oc~J6Nqv*K%rvStBis8eb9h*Enyc zTuJ)e(08gw^osd--n^WjrfF(&Q-DZg!Y5>fUO*^NhO6j4R!RN|C*Mi9Lrkv0+`F$H znloPh+bBY^&1`bfomTh$%FVH|nBxeCNppt!sy?EH1QtRxjLrH46xUt77S<zn(7(oD z)llaU%~#)Nc2<DIqyUe1P^ex8padIR7{E!aK~<-(?2yprbf^cYQ)!G&EUVqV%BfG0 zOMmIqMNp5j%HQ$-!R&)cc$XW3>TGy87f#SJVV1dtMxPKs7;413YxHG5WH>WC+n9sT zHM|Ze5Ee=u)tuFNcVLE|LMMKxnzg`<zN5(xLYA!{QAS1QPSY}FCxr?$GX`LL<j`p? z<o6%nmlM$zi`%Ufl}L9SFnP2T{&mDJuuw0dR6DPJO-h(9cI{X;rSW$1LW27}P%hR_ z8isFYq(M&&f)LLd5`8)lz6emW`lxVjWUZYOXkVfFGW{RD^Q*rq&)oniVuyU}wh4gS zK?GEY_~5e&UoX#}?1Zn4+#foJ5ylygD+`jSMI~50Va;aEw4#{JEgZT?0ErXMXABUv zvGjAbC7$n&VXj8j<&TF2h&c_whyBE{htfOaxZVmq(>&PSePq8H-*`^C*+g=+va<5$ zQs%W|gpl-jn^%YMkA*CK=MR>#-V7dB(_`mV6#H-WvT=$c9LLQA+zr+yoE@O`m>oGG zqG&kG%<Wrai^rX%xe))5MsL!hF3!5$tkczp)YaOWsVUP=nPn$wQ-i+>0M|JXir>-V ztR58_`es#L0bf@i#Xw$D%HteubQv8WHd3)9$^$aqcUUMDNj$jIlu!NOmtP}Mc&!tt z_P6+7p?xYcCvFIpdaKfN<KAl?mNh7d&dc>Rc`$62$-I`>NsSVvH)XWCmZV}=LLhg& zW4@LzY}~S%#dxIotiW>FU8+mAxVT3sd9q;uO^9*UZ&U%Ju2L0c2Yc?TQ`EAC(Qk;a z-s7}*P50U}IXkcBfdjH!si3lXr^J{?ALUv2xc?1WhhJ&-O=kkkWT_U}eS6=?<tYk^ zyh5ez<c}1a_k_$1kBdYQl1<2W3(bbgct08oXi!k3JcG}N5uIz5m~K7p)!7v0rxv5j z_maZ>osVoLXeo4A_r}py|KH&ilAP1TFZ&&R%gzh5zhikVS4!krbdq*^%#8e!{lU8w zwOpjoBl-5}X&TEKrUhN6C}h;l$6Ls9c*i*i=_43@&4cTnj7VGuX9%LNB|bDg!CB17 zWui=#q-tj4l&P`^$lB!999~_5LnA6S&pR4+MYFrEZCm2LxuR+e(}guv)mg?-y>Rh( z<U^dcV>nxW#b`X={u-Cfg0>DK{r+*f%lGAlxyHZF?2`-l%swRs9^j3PzdVy)+1PUZ z+XeiuNrLLPRuQYYA)bwc7;Ti~D*3K?;r+5C1wRtV&I49jmH`mk5|!B0S6(IZkL?!6 z-3&w39o(%uTsGZXE#^dEPBK(ouU;F>Ocq%m#iY5YuFAgveG7)8(px==SE(H3X8ctn zgr2oNcCAn^HryDlpgQDmcci}zju0q2V6>=t2%Pd-xa#=Bj&Sx=gANt*@<Mr0=BE5@ zR;6uZ^=mEu!;LXH`EjtH@kia~9UY<#z&b9FdGSVEOmnD-GlumN?VtT!a=gZ$TX6nL zT3-+I`yyDw1NinYmzxZp$yx0MalyGoS&Bf<bK_7FJ6WQxcBERh>lX8DCqj4MZ`#Ls zWmtvo!X~hTnFDim2ModK@%}1eE{mRh{iz);dA>l9iRlaS@h*yoW|1FIS7BdAoK=#A z9CaY{uAj3Xq_~q&+oc@tujo&P1~Gd1s;XplZ0rc5I@FDHU&s#y4&vw;lp>xT+WxZ< zn21V}62BG5+`c9$={fmDZt*V?hS9vXrq{XVuzkEiaY9}6e2}iDur?}~5i?2vP#GGf zb@q>okm&Gz5sZikAblyoqnJ~SqU};Udt-fUuS)JC9?4SSc3jgk9?3JGfs`BsNj})2 zcPi+N<QiB@a9BQzkC`xac%=5G%laPkgON5$4Cr^7p1{W7_N~x-3R>?zH(^_20&$u4 zqQNl+h_8p5cU-I4Lc>p`fN<<Q$=g-IwULR+P5pAw9s6pV6?XnsRZWXE6tjif{*uu~ zag?fD#P*1;njLHH^!d}Yq=H{x2yVQ?o#HG0j@k!8Kz}^v&*q)?11>tpbjAv@EwP73 zM09x3IE1ayIPl=ST}6%iQ$&o#fuP^1X#nbCPQ3g>5iy!>mlI~wp|ehRen$*<D808E z@}ApzhH7IHE#B@mStXUP6Vn>5xfLwSkBsV#(f*yRfHIe}0_|b?4zqKBF`TIIs|G-m z+QqSzhx-F*qM|#`mU^%3Q5dG55p5wm$#mQT_?WkawnNG1aA!ns1a+(trwa`bmQT3V zn$>Podg#VABX_T)?;W5gd8DcwQS&Hbeo&0g@%oHlJN<I;tb@(yGvbc@mE09a!Sy*F z1o@`Ng9urdoj~D-emUo4`uXffjo^2yj3d5+uvHjUk_`OM>W6S<N549_1*-5M&jwa- zYGw@fy?;q-0?-79FuvuW*PA)R4#^OP+fV$(*ILJ_`urQD*bDUA#BB~wrnjTTWs1&F zX<L=8)}rHCWa&NTPF`}}M6!%~$2%m^axcCNMe_dEKn!X>-8(`1K1!@hrpwU7E-6UT z{(<Ti%aB*BQ<co&s_%!oQP9+owH)rC)L+-(I{g9!ENLXY9z{;;&ky!o&{K*Jr+6n4 zJeu7XBXm4uIp`cp$HQVQDm2RA9yCyKE^u6-MyX^r6;Xs`Jx0f0z~mh?!*;=b?j!M9 zFsKB^fpbKKux|$Dd^zjOS~N;cSR!<6bo?@hDA_e`-j}0YuIKFQmKWVC$f-2Ec`H@L z*DKb}OT5gZE<3N{2`ek>p`MA=FpR3ro5B5gfU!Z^h>ml!+`z0OHw~)hpf1)qoL?el z$N6bzT)%bh?bq6)-!tT`A$R5hEXB}|ZHZC#V;S1mdP`w4`gA&D{J8cEhwx;m_MnYd zBccE&{6tP{Nr1;Oeov_Z)Oc7Ez}?ZWwE)t<ZP1RwuG@Jg3!|#k9>VEjLZ0A+N8OW2 z5#yG1zOH|X&o4IGOccJsxGDdxeAAQmB(FZ$EO(5*Cc<LgKBnz_rEA|EZ@$QPL70|9 zfW^-r3}==;oD{oi9DoqDN?}+o8%G5nw1})i#YhLts=HJjypEAxtwm1}d+b7l?bmAj zMGmJIE2QoMd5=dC$Y?~p7?9-)4`){kLv@`#Jv-&5>HRIj^&$MasEZvMJ=qKh!a+>S zJBl1D?H(-%x|FY8oaXS*Tb|j2enf0>8rrdRU*1PJO;}CWHdzGIxrwzVy=7iHG~fTF zvyK~zg>M|5;%uqSr?vUSWmr{mAA_~HPbeph<Zb{1P95NFj>7f8vgNGo&!vUmH~j?) zdukE;Z^6<tDn=&~#V$u7?}$n8zdl$~S}aU52zxeAyXNb9aiCNzcIm#l0BsP9(!wH7 zj2*}?uf5KHX$0~?3*9RKqMgv3B{wnIEggaLZWd0>h`VW7VWYUM5^7Dh5TK)Cc0(;% z^hSW#j{XE;ezD{Qf#}0=3c+uQP1@zuOpnA5zmW?fN{TT%EezGV!|K%`^*zUrQX~J8 zk~<ip3D?vy$OiUm84_hahL&sG4E94zsa1LuZptQteP3<@&tj9?I$R`9e2;_QQt5J7 z)^5w?KGe9fxbci?>@S4^TVPq+zAUs8l8Iff#|jCKrZ(@CHgQJ8?XNwatq}g^m+58K z9JRpg&OftXu`OnJ{oQ7_C?m%)#8_5VR%eMd<6M-HuAR4Hp1k0a(_TGJ_{Ng2q39Cc zs)2Ae&l=l$uE|vSX;$BR!tdU)J>_L9Wuq#@!Do<IUmGxnwUc|DF0FR&YWiY7f8{lR zQ$##BIcsF>>I}<Y?5Rdf0QjDoYlF{ut`7%O^3t}cTdg#LI#$(ttbb867)6YXVwBsU z^*l7c^2NXZrVh~elS~Y68We0Is_4EOD2okyI(Ozo)N#8$*s10TsL@0!bbpUZaIQC5 zsf<{-Cyrm<VccEURWh5b_V(J_r^S=Qy?wSl_4=>w1+*tXu`0>#?n<ODMm&VuzP=_N zinNdw2JL-->(Q(VsWRO4+gLWeO{lw1|7|h(ObBUJbI%9G*`)b~PW58MdP_??InH&A zQ|s(%`UNk$olp?|%3nI)kKKniS<g0i5R!>r7s}O~NkVC#5uIzOFrGPoP=Vp^6i8mH z5VqhWiK{ih2l!M!(Ywo5p?bXtg9?y3+IRLBn!mQUzhWuN^4V}>o~DP{{Z{0&v}dmC zscMJ?U5~J(0V63>rJVx3mQww4Y<27YO1|c6327dWOL4Q?-x|H&g+G$f+G?E6&aW%< zcAT^~()8yl444{O>1*&7J7K)nGM$u4SHC;M#v?lvaJ>){Q^Gr<UVPv6Qo({nTFKm4 zW8Nim)3b9ekHjCv@Z}<3_pici^$&L)5#y*jeliy&gYBX5_u(HWYy+_UNfMhHEwO^O z;VdWjd=59V7luD#sEekm;!-W)$Xwl`zt5w-dNVM$y*bIyb}-MZ-|ma7v1JgPh7*Rw zQ9H_@v>6`T!%Xuh4KUlo7jpA9E7$v3KKc0g>LcaokWQlfQ#aNo^o4a}mKvtq9bX-; zw<K^kxpA;JWhNMuV}(0}Rt7C{M+S)}Sd_4V1|8vTUNjb$X)GtS%itC?Q9MQ#ey*|( zWcKTW)>;xJ{r#g_pWB+{MfgB8@Bp{!cng~5F#1e0N*uI7MfvW4rY0oe+k@hpoVDNd z`*D9KqKjKzVlee|-{xsJB{%20&U5Ob+)2sh;`l(|xkIuvW{+_RNGCkpot3xQsigA7 zs>`Xg^D$FBKl>YRA(5V-l7u#u8WOPbf!3lBW9Gn8O@gmX5zdY7W;>thFR5ZMip7<% zWwWMcvEJOo>F9Iz6+_e<GauG=<DIhmRLer|N4iElJ|7B3is^Z|Gk*;8jOMrGh#OhD zhCm>UIioHLj9FAqmEnS!aHEczP+aYuvAkitH+{d~(cYMt->-v}&0tw~V6~QAz2<?c zX?1kYR9<e5VRNTLADVq2ttU`$9y6q2nrjT7eS7btnRgJt)>?Iy(%V=sT$rz&T%H&G zKt<i@a#`+sxl4x1Wl$4@b$wDyJY`p8I6mx?vjYzqXX%qEb~od$F9KEcmccATCYUUn z@hdS6ePQ6JwH`5aaIL3Nyvu{Jn9FyqoNZQl(&oOlPJgUGVs^$gyG31JXgz+E{;|sV zb8Z<N;7@^~4)EJ+w3C<IcCD}9;BBK9|Mt=yk;5aO+qaOFosX7gH}TOLn6q$RURsb) z8q1`N<5bOV(Jzj5+KAd{V<t!1bJTn@6WlJbJ$x)VBM?pDNM`Zgyh=A_ys(A#8Tpcd zfq`{8G3sk8BUy-TPxZAtcW-2Q7>#8G>)MkdI#NnH#~LFSjJ;ZW%e<{IwJ0n}PsjR; zM1PL)0CksA*ZpyO{t2@MlDxi)qKQkJ19Ei1SupILLV&(67IyL0Q+~m{&|))N){!a~ zk7uten>ebQJpznkJ&IN_`J%y-4<EMh{+0f>sCF=s|5U=akEca3BI9{?t3%{OhAo&6 zF2sV;S|)MyC8q*Xu+gdH*5<{4497)Kn{;1JXi}t;Gjzu^hoeUXNi-JhF6RHcjR&M4 zpLaufGrp$a-pyP3@QA(1V82;^P#+j|=y#9Elf<45_xg6fpR#B2Lzn6a&>$CdDYLo$ zc(Ea9<Ha2oYtXgrM(_g0i~wSkU>o!SdLZfw;j9->)hM?>z~ksg9LirTHJ6U8-6)oM zOG9c?fdJVUD$?Ex1R9PD#E=Peu9+l0xDRQR$VR<*OI2RNW4s8^nh9XX(<;#y3ld0u zUX)&}<wtw3e1*gZ2Jyq!&?B3!mbGs?6L94?^^$c@E=NOU>VDF>PhuL#%$k}`G8*&# zV(**URfA-Ns$6Y9djUvRVl!V|Mb)A`+4Yw8mz*@>9%XkOTj&<m@BN#5tAt#ezxvEn z6F3+c!$+zq%fE#3<rHB~?hghojfbT;W~-P^I(Jyxkxt2TIi`X;a{m(Q;%#n=cx~A{ z20a2kj*Dr8i$*ZRm|XpjC*$09`<Ss9<7vs)5YS^sy$UgmYo;5n^n&6r^7SGa9(;~| z`ku-AP9}dzzP?j+4J+tVoq5^;<k>|{=daZDznQaB=+KEV54IVcw)1NHB+Vk<nbfGt z$c@7ci92qS(gDC$yDEp-aYC%$Kk5sz_rh-?xf_u$PZ14y+y#a6GzL@2kMAaG=^ABE z2^(Oq&{Qk{6mAKAH>;s<W6SxFOsU0B$55k8*n&Z!rC5*@KjP&$5Czx?u~})Rc_up> z`eb+>(9ICbgOpA;+4ixf3sUw!qq1z-_`{f!Lt4|`4>`E+Mn2t+gfa+>b|+{39mcQY z%E!^Vv7Bw$DiNWz6p%_IFSdSXf>$r(I_9P~y~794LJ%D9SSI$sZiSMKX&(c^tZ7F7 z@&$WtB`<(u)>@C0k+OJH76h110i+Yr&c?BmE<eChYZsl{k`(rew_#&2gba4pUl@{p zN7(F}HE0I9L|c+~Go>otvGJBBrIPR@&puyYrNv~h6PZz*v(IWhTx`dU^qFyD4^jSv zVB0VtvFV5u#NA<{d(GsL9I0QN^YB|NI$tGiaEu*~@MCJK@)3ObmCK5nOzERC$TZ*X za@WraItGm9YQ7-)%vnl!ZJJ*xv(?xmYreDILXO<hYJ92!>MiTy8%cEb7rwr4S?g)# z+!dT~_*PHecJE#?ik{JN%03^7{j8^FCeRZXQ!%{s7n#6|0#Ub#LP$Fo#C7~VX1O|l z=$)K^b;cqzVHs>ZGgF3Jdj4idF=$E-iVoS=v^huaCMqXf9T`!NClCS+m2t{v1$@v? z$pA%LQvpG>OgJEVpxQ8+$0$$Bew%coyBakv&j)<ixmTM#TjGeqmbe);E+JIxfJC~S zwAQP?Pn)|M9d=;dijvnZvZJRKh#s$19ylx&_IY8KBDBS{bez^NXj&Tr=yAts=Ju;F zYm3S~7ucBct$sv+I4&5oBR*)sU^neyGk+<46gkZqcXbW;5N&*#md4;1^SJfH+{OZV zyno$9=D+j$p2eY+z)j}UmzKx1Y}PA_K)yh`nAY)=@y6bQ?ifZGRiVx|S&|N)=X-U9 zI(KI?A!wxX`pK#LSy^{I7I<midoq%qLKaEGsf}cIrx^v!7b|z1o)aY|cwi-TJofCB zt}HT=Q&Lk>ov<aGJWNp7=xx%mXC)0+i4?S*oO$)E3X1&JVUS)YTyY(W>1#>YAIMy4 z1jwknXu53774*cx%gz{axXd%hcV>gNF;Ju#|10QJ2uRQSh{r9<M~vvYtE#Fq83sAA z=QfwFSR9Nt9h{kv?iT0Vf!BVn+n&sqUwl`f;Jz*R{j`Gr!qtvsnEGB~AlO`^QT9YJ zNEvd~L5FX0$aqA{^+ABIaR63NHO;bgQJ0TT^T;V!g@8iepI}sYzEQxaZcQ06^-{j) z!I>fz^eJms4L@8Xm*a&QMZX>DOjg?4V>I*4-zz!7**x8d{VAFN?RYXPF_$TnvWRYz z6d(agp)%jfSYzd1ouhhte=|RGV^|Yaao+(`k$G6uJr=iG=EV!Zp1{fBhE8bL*5kIi zC&<JB17iWn2%5ZlDTj$?n$;MD8oZUOCEl!DUI2STa9PsQ=eGOfsY-agnMxdhqJslE zOSFXI!d0jGNJK2~M;3ffpIh8&<+U9)yHqezkF<`XH(SNghZYraJ8IMpHx>lQ5vC6` zGHJdVGIkjC(5zhd$~G&Xu0@uObJ%<_C|p`R-y*nBBfaXFcqKti$EDp8D0G^9QMCo* zY=Eugifz@mv<#k*uk<}ry-Mv2yk_JY20e9!#-hU0G|QeYc8cR-K|je8VtThXqT=h- zvb4(C*NjWAX@eb}T29w>vc(QS8>149&{N;szhNs%?($<80&B}BVN-J7dLFy4aZXm+ zpQJm-C&es9^XsUN*YIzujZ6%^xm4>ZBIlUv=P5Mt#@0AelBygPS7Af!-y8r{TdO+o z(6omSwDq9y7CfCy^wItnOiY~WiQGdbtCCnZg$exD$%0stvjQ4&^%eV5Wv6Hjxc$8x zN~Gkis!GsP2Msb24t1iU7b&IqrVhx(LO-S_7{$C&x^K*ssO>O0e%#lt{Z^ci3>7IA zsn|q}joF|%f16PP6d`|qdrdfBO5Hf~g~0O&ZJfb@sS15=H@ViUFk9Y&<S>5+SY^K5 za*1mDQ{``m%Hxd%J=vV%?ChF((OKC7dfTp8_54rrz4u=0U=C2h8;1vLP)QwU1nD?^ z&gr?eD_rkFZ4xO+K}Xpuug?U2Opl99N^c!4>}mhDQnP11K$L6u7wO-!aYC|b@(EX{ zC7prq{6!^`L^X*-F5RKMt)=4`&e5uU#gr&X80#8fPIlbi=4;eOlKqPeb}Ne07PZ^+ zzIfj&R874`|NYjavHW=50zJlHG<6CJSBwvQ?PYck^2X2RukN$IjwgGc5_p`*7#99E zBT)wBHKx#p@q~PLhO#b1oN=afn)NH61A$hl8Y~wouI`HTcdonI^u5R@M+RtLAe+M9 z)U_{Ox4N-3k56O(^!8vNu~JTm2?pF-BS$6Kw}^eLK^7C~1nO*cHO}LpwQ}LKy{ut- z*$M(g+9d}Z4Lm<G5^E(byid21PhO_8?|kHdt53EF@8VlwX)KT``b(z3B^b(8{P9X0 zvJ7ed3F6)fnuA4=@O){U*C^K>g$N&CXpnVyUO<3{;$evcAhx}xrnOYbB)ouwRg>Kk z&Z;77z{%b__5KwFdEoggFW<fN*#D?Vl#13#LF?RC@R3B_pu2ZUirFrO(Jk>ENybab zpzF0XCj#~P;jyrZw#jhz%4%2CnsA`2Q8$S3=0zh~R&1ey>A6K69D<yb2}OfynPg$7 zY3T}ZI)!_NG^O?jPKWR75gngXNkFz!^UyB48J63>zK{StM<%*ub-0%2I{Tg(8&BM- z=xnO#JpE$Tue|v^b6mU{8`-&1he_004YU9Lmv#1K)lbEx2lk~owGDlO3px}L0hQdA z*t9~mW|7U)mYb>w++<4X)Xs$70^f@2#skPb$ft*46eE;>6C68n_VS&VfBn}VwO1aK z5S2nLJ(G9*29N%4Klx>Y0+e=pHA>nu`5YtVhmr@Xdplb^xDOQJEar}r&U&3<<7TN% zhnTUI=H|@wxG+>g0(<&SoF(VboZDU_bAnqmdr+B!&Y)XbxHlF>X5E{Su&~g7Q^L3` zN!wwZKi+KvRoE}p(bC3@<!(2+H)ic^{(MBctjB2lQSn+zZYef(15_XJaMZ5)n0dv) zQ=2F?HPTq$hIyTiD*aMfMk4hr!LAO>KI1i6&ufLuH3s@R=HsN)6bOsVn&k0HqXc?5 zX03d4IaN%V8=U=;=&l#yH)2^VjB{Dr8+D0kR!<LxQhS%wMsyjLEKCu9k>;$8W#EUZ zoAm{8VT*fahtzaC<im*l^Qy6F0*FCf1S0ja`sRvsizD0?O6&2NYwww}K<4@QR9EGh zTJRmEBa@LB$IX>PRm7E|;kCH%Kxyf=RAeF{`n@baED;<yr^uJv8&sfB9%vf+-^+hQ z5Knqakm!46RnGW>I{UGJ0tqzz{-Tearx&BMIn1pUoS&qXBFfqcFN@<~cMGSgOiN!R zD}P%p?)kzuj*MnVGbrxgP){{K++BCxWueQj?xuzn>9|sUP1$e=5Lg~{b1tNKT6tJ> z>iPC<{?3Rc4U;yenWR%RujNzuV(OvmU#QmYD5rK?#N++F8L)bXNR<2qmHwQ&EW3Su zxfDB(wi)&@aa^07Jf+S{$7#&N-o{V8YkW=If<o1c=BurR8@lYnaTtr3k%)vy({4du z*RcJ^Z4G_h!savpXxH9jk6DdCAN0OP2axh>@r&y&OAAT%RCW!=w3LVM8s4m!KICel z)on8hlp3(7-`Pyw+(&pOZ)^-3X0~%iZYYYas5pb2JG$E2H|u-0*2<{_s&Jm(GrdjJ z5jbI|L65@qhbyJd9V?a<f^uSr&cnm^%(QfDxEF8vRvcR1&woq~kvBQ*M(5UgZZFu2 z5yC;Skl<=~nocN1*dkx{7jkjzgkAO>_T&D`G|R~ziuZYWc|U)CM6TDLvcJ1qpD-^c z%~2>>?qVE!M9f~T#N39y#JhyWISmbF7c%~axoQs@K(FHX$3cRz@`+zo9tT^S&-L`? z;)p7@uq-oX&Q||{HnW%wRoaEON;=EeWpWY}YilZI4^lb3mPB*k$JCh(jqrcYw)6;e zbX*VGw5uufcw7v4tsaN5F{?xDy!}i%g1bI{Fjn(rJp_6HSuI)-+gqoMv7|jfja1C3 zD||FdcN5GR4qqF?H8jlxLFl^(*&qz|Pd>C0kQ!I-HD^EH{q}6n!<oh?!QNywtSc*| z46`%IsCYSxXIx1h$8$zx(a8BJi?*6a!p;~A+31J1SMt8>!~0abC7q)rY`O9L<=;M? z`Vv-uDGrs+)Z#Gd4tIm1L>>Kdi(kqal`Ar^UJ{Th7L9XQwl;S_eDdY+>!S*2>q&5F zw=Vp&A>J9G$R;{lv)LWe6S|$sNowBraPQ^=Ky(U%agX-XVx~FR5Vx{SN-BAlQKS0T zvwaX;ECY~9)~~Q((Q3sho$19=Tn#;q`Qbp#(#|IfV~1qk4u!F396Ew(r$O3zG2_tT z(?bOH&dLAPc|hngBs}|3Qb=^|IwY^gW7Yy&t+Z4%JjN213eWCW6|$%);J9v7|11?V zsFkH8l;ANgl?vn3-V<N)E^8wVDTdc5-VeDyeM7I{+z*|p!U!<m+xPp5>5Mt8LS1Yp z*3&<Cl}`jYuC`?7P_!6H$A^`jBxi2U%Fbml_DbR{?y?{8e_uHtn`~F*lptWOxLPql zzrI=@-_wy-yI=Igs*%WN(|BQC)1qh1-b5$-lOSi!x96SWI5%teVMAkSX~*2ko#wq~ zLTVaGD`Tb{0Yp@h^~&r}`DY2~2_Dz6QC&GDOKCLCA9y-@=iG!OzeZ6cJsP)ep}!=) zw;r&8+0g+iRGG7@)o!<k%wjtjuH$TexIE&=!)#u>O<6b+@7EC|8+q%Bs<!*<3HG;k z{i}*R-2!^q<|&t6dKvy5&s1OffU8;|>&fzcCPGN&WZ6CT*=9dqP#Kzb;>DyZnmy>1 z1o&dq=tjD5n)GIr-%dM$a;|ym9d#i!dI2e1i?LrRAM2R8`OSgbh%51STJ!>0Z;VWe z6*Zl8$#AfYCytZ1HF>q^<Eu9Ksaigrg4RmJ*^Hy0IM?+R9(fCe^mG!%#l@t)h%e^l z@Jsi-PrtvQrp1v!+R^z?^ftlT{r_X*ekj>HjweFzi6P75p5Ilvch|4l`EiDwwka~S zo%Ni6Nh{XIT~8P^H?Tz=-EDuu?wVDo;dSa;Rt=#ArI-A(^ybovspvpQ>do%z!kwxZ zO2;Z*O_$Xe*m?a_WT$Q%jhc?Vwnv3b8SiL*(c=fvXR_Ud7bbjXHn`O0CCu5O!-ry- zHqMgigHwFtYl_Dr6xB&qC!CrrrPF=U19IYQd6f=k9<kvkr90k+SuXivd&qDG6EQ?C z{SHm`YM<RU-Pz%ms8os_mLWE>-q3dJ_QYo4HlN?$$;u9UsS7Rqb%igM>|&$0QDZC^ z>EipyVzdR9)pWy*+nDn-8b{?#>!Pm{PN0pRw3Sv!AM}<Y_V?I*ZE%%+a>y;JBEg{J zV^|Kb#egpms!!Navqc>q;$#E}VgpW=l#LEOIaaA?*Dy|+@c4xivz-*C@Fz7HxRH9X zbHx5aB4jVZNIC!?n7N38{7!Pk^76{;Y=F3b7yr1x!w)a0-?2@WGorxSrNU|yPq3NW z_K2!!xvW=mjcD0YcGVxOxfWvlT_5bDu9|lxlxMu~{)LSMPD|BIyt4uaw(;Ph$&plJ z6u`-0;{Gl>onUyTXxkndx(My5i_7XROH8w$HlZr-Qq}$OMMb+Ey7WCAii<BmfuVop zLNuG$-dsop#=qL<Qm|sdOwr8(UL&^R%c;IG-tW5wS4wuL&~-`^Y{(RKRSs%*XN6&n z8!T~dd@-;WG03#;vSQgXGZ^l$r(CaFaQ<Bh#l(Fw(eqH3RZeGN#)mf}d$>bEw2!A& zel&q>Cgwf)^=6#tp|{!f$ZDULonxlC^bmS$N#||JyK(Ml;cM9a-4JJI4Gq(kTt46Y zE`H0JgKpRL&mqtNHV<2S>#ntGB*nO8xr(*c^8Hjo$kOplPEErr859jt(mj*5D8hC9 z;e`HSH_9YJvVCW4=h9)jxW*M#4dXq@4s*;x>BwvkY++_>#p0%RbUi;AZR)4up32M3 zT3p-C14ah%&R#8`0!RIgMY~a{34KG9PEUxuAdliV7IQ=g96=Q4wj>E)oH{XGsXX2l zHJ2&-VI4+Fofi*kzRgHmub9`f#k&?tKpv9p-zH13FVf5+{~s^&NTzr^mqGK-j&uX) zqpHCOw@0OB)Gupp>dLc!It}SM-hJhVU;6kqfi}nkumlvL#0ih<7t<SPYCFVYQ-}-( z>g}DKXFZnOW?fy(bKn*H+ocwtKJTyk<XNV2>iOw*7I8j>*~o6gctMM{y}M$ih#AI( zC6`(EZ|(la{rhb+R&vUn&m{_C250pu5gw1<r69r`#tcwSOQ{jQMf1YOUh%+p=a1%0 zRn<ZDcX-e&#EDnkaM}G>t#R}A4jL*#CycC7Q&{+P%7adtb31pY!i~8!Y%F#-oIuzp z-s5=)%sWj*JdTa*AZI@$%r`1jqne{@(Qe<krKR`dea+alcbZi<*bUIWx`#P!MOFy+ ziWNs$LQ!@LUcXlqbz=r2?i<uBHDUMojo;UlmFWctUhU_Ju#^|yG+V74@f@h(AR3bT zm^w@VF-9(t%ZZepNDnJd*cs^vXF9-g!+o2IqQd)!MXW;G(^_m%?hh~gU9zQKi(ZS- z>rK3y36rzL3*bW~D4E#YyQ_A?V}95LVd)kYW(J!3UY%oO#s)vg^uMxqi;f@_9tO@N zI8eAbzOnCDeL+hR^eu6R-u@9yc$!=|E08rDv^4Kw&ubN06%;Nj-I1Qk-c`Xpzj104 z)8A2zs%1znhIw1mER`uLtjC8>j~PTDpZ7^Tq%_Dyir@}?3x|e<5$UR0&tM`i`f7Bd zFByg<<ivPuMsxBE*H{Q)C*#oi#XQ=utEa>Av_1A1K6@UZ=!&~`5W^hi#W^CYwhMH6 zn~0hIn~xEiCgSX2Wk^2FvM2F5H99ucTm5W4F#GnNRK!f#q@nK<$GF?R`npSQ&J3&< zfP-?2J?w3{zre<*)Adv5!Yo;Cl`PN;Lr5N%mSGmQ`Da>_{e3CQSm26@D+Tw@w35F| zJ|iX~KBO_7Vb>*&+sm&2Zs^rg{!JMkg!H^So2HI=ltCR0*k)k`{4613Q+7a(>gBz3 zaSYQL!PSgI+fsO)>*sJyv*75JepPw_A)!+~xrO`kV`dA!oOP}D9H?5FVCPNq>-IGi zIJ@Rcw8|b#0^z^NV{nG=mwxKmj2fU25wfL{KaAcM=ilJ8pxaZE`z5pD2RC((uWa^+ z^%%XoB<A+SZLdRjdDyjV#A#prG^j|^se3Slk3Ub{6o7UPH5XYROT)U$DR-j4Ii@KM zgHW6>$9$}*|E>ll<+9A<YuhWi<x@TZV*3KePt#s(suOZ7+nR_~?|sp(8@4FfQuR39 z%`2HgK&qoY6<K@p#P;*Dl9A5h&R9<KVTF8NEZ!m5z3Lk8yg*0a<VBi2%JYHFRT`wB zE;-}UE@((ysG5liH<0FG?-BuK*i8((TfaUA)d|?E<Fm}i@rN+FUirVl>ycVvpaQ|u zEaB?<5kFesuN|KAFG>^S68W2K?~Q?DD7H2a_j&?a#!)p&$Ko}rah(2QSJrkXC-*Wz z!Q?f{{rz{tSu984*T14<y7OSfvmsJP0^-R>bj*J&#roA9X|UGe*9Vkr6v`;z63LuB zF&FK7>+r#dgtqoTRNPwKL7jkz<}$mvab;CCs)oxj*1Gv{^wfVv;QuXji#~vqYJ*xo z{g+7A%T~NYpXfau@GoRqR(^|*&1kK9dwfhOb=?Yg*Klsa^9j(p-QC#$aK6p1(&6?x zv+pJ`U4^4rRh!qBLb_k`%w>=+@l4LksPsCL_FF1<re9>e6(vBDoS-e09$X@U?hoib zN4Y~vT_+3cMMPA!?ZX^aGJiz?{19X0;QUbeR_CMFHI#r4PD9S#^t?_0l&Fx7)7RA9 zjfi>*ywMA>Ep_-dQ?Kh|+d~)U=vv&x_W_5Q!flN))@-z!TF=UsH#0C`Y-_gqJDkN0 z6Wq%rdFcJLoIXA=?HYRSNi@Gwiml}O^$KpWgK5>>j*mZ@*P=7Hj^}rT5FAUp(%XAW zkeYfKuMGz>5EQ>2;p}1+puq@I>(P-9DM>&85hMO@D*caf!$<)SM3=POo9V~mRNV#F zG>>op9N>R$$B*>577RKh%;)m($4dsiz&p)9gy@|A#mz@ct}F?Ly%!jLBm?`o;E{Sd z7c#kD__{xcx|jgog0Y<tz5QdVj|IVEw5yxE|6dLNAEG86KL&bBJq@%A`f*Q&33w!n zo<8n(k^yFuQ3AdsRiYGfq<{FqBUrwf_=w-Wrnd)h$NnC1!|aixFu)G@eDV$T?`MBD zg9!|)LCx-dw8~j{zmFOsk?=2J{ST?CWWhb-FK){meHl3z!h^e)KIFGwb|(=G+sf>D zbi*xouz~{%3nssjBCv3t)PVD|3jZF^{&7#@GFZVZ3rV|oe|U*7n17X$+W3!8y#qZ9 z)C*bi>ZM<Wsz+-=0>1s#r!z-Pn<x!FO#8X*x!*7`c<4?pkmRA|)+PQU>a*i{j{E%n z-QP0I<z7Z`kLah>>qj5PfQO};Ua$21VUacP3WHbS-qEOw9{@KPl?)z{=~oYC;Ds`p z;U3u$-)$9vM>xq|j{n+i{JxG`IpCfimui|Hlj%i+Ro<V9bh-Km${3$GK`Tqx!g6%W z9b)i|(90B(Kdc%29GI}M-qNEV-|abtzov6^{KIS(@r<eS%2D%({ypHW+fg64F8_xQ z|FsBo_+j4#3mx6!S%z2dW!68H@qgs;A5tZffo0xqyt^%VM4ABn^^NkFBLL!8FWV{u zYi1en^5AG)OE~~YvBH>v`_;`y;Zz*n(osaT|NJsaz!2<`6u*E_e#+{W0hoWCNL9Sw z4~Abn39jQGJCOZ>GFf2$S<xSR&mFDVLok06yJ@?aKgf(Jp5tw8FC0-X@fw&+@VDP< zzstRxcpmw3%T@B|Ei`zkJEu1Ahv^S7gHhe}k|00sxnq73$k4FU68rCYroj$SLY6tP z<A?BidT?I08bpZ`{Pi!Y|MOmqG|)>>zw-1Wwqga3C_5{$|4I870$N@m^Uph?_w6g- z5%Q*#kbegK_a9+^mRX@G4oAF<1<u5vE@aB~_hPo63Em=3=M*6OgYlGQz=u8$rM~(L zjyz(`3?e{ojf+g~*M8iSr4Am6hCtxIpZ+mcJR@2wk{-<$gMUi`X+_KLrEJR)yakIr z`R(w>G#j??i=Lmj@&}D+g15_QUeZQKgkhxs%kk-MAJZQga}6l-Wid_mqb0)J2SY$V z6sI3e?pJe)yb6vMO8&V(kz(LOmo{yWOzzL0e+mm;j_&y3nQHXq62}jwdTb9kTZR9c z(1U-Z{a=6d#({e#GqcT)SXmseWV{u2KKz^N|NQb6(DLrHpHNCKlc(54&?X`lGtk?6 zb~}W6W{6+>UDXFeJhptYRpOt={{4qLo?R{d($kMz4;P)pN7FCTE<I1XWc0z4@OU%8 zy`SIN(NW{Sd_d0ibo!-aV_emiJZq$gpm0K%fu@igRI!^GqZtvwzZTKWUza}8yzl3# zq`Lw@@1DHHebxQvk=tyjcfjpp*Z#fNwAk@I4uv*vjf@STo-a`qG><7wrG@iTQst+X z4KNwA(edjfU=qVIse2^}9(K|TQVRo?noDYxHD>Jr7NpyxFzYF)LH@x7C`@c9M!@*F zOtdls0}efKNRNl}v1@OS)K9MxfjhTV=vBzJp}=xxPvF7t)t`w}BE^Pr{Qv<3Nt1bG zS+^jb^Wenm;!FPhoeyt|HYor!!w#Kta~rcv6Rx}xz+l#M<dOVh+!y%8X1|0uB7>*@ zNea*8OUDg5GH-Kas*ZamZ%x1^f(amW2Y+Qq{EJV1^4p>%;1`VfXHm{09y9h-C4>-y zPda|4)kr8Sn<h}z*Y9tbwXq<qN;%NL<@o8=_9Aw=baB|#Vq=Ss866!oXz2wS_<*S% zrnxpV-=6&X@B&+}9Q*Qw&XVu5DM@;P_HdOBBLNrjZ5B#hC#R{l?$Rv2->b<xy5u)7 zd4pJ6b;VrwWUSKcl2N>0j73%H0GY^2PI0rCD@ygSVr=QS*5ea+M8FzpueUjC33bhU zV(X{kYx`Y`B^nV)fz>dKykgjCBoKY&6xERa^o_>bhT;7YpS`@A8~SK0p%=-Er~5`0 z64(r*0H8Bu&;JK`&%!%zRaY|KpP6)oqh<>d7$#He#I_EE_2#3DmitSQ+R9kxZX^E} zs8`ftxK_r1W-Kv%xOgKT9PJiBzM=M@)@BAGZGNhRQh+*=$p82}4=rglx2u9|r&Z|j zB=zZxk5{G+o@%-6!`?*N?p#?P60BDqPfkVuTg?9XWq|!LeQ%_Lo}oZ=nLJKN)6X** z^h&s@`owtq`DJ?7EzjrmoNGY-zbI_W96K?XbqDO)G~|!wib1?cTdloL2r>RkO7~3h zN&g~@S4Iy31i%1Sr<`#iZf>16%GnG`nCm~;<iFL@civZ)OWcZ4JYXlGEwvnknuHSj z<D*M~`Nags-LF*Ic0p#3N}GF>yg8TeNPre2wD!|_NqB#%N+J;-_h%xYhLKzelQ+6R z3!3S~)p&c@O~~zAO$z-iIGfSHw|@OaCLz~{S`HZ8&(De{L^5R^|1#p$V_{rsv3JAx zSDDcx_N5^})U(J|w*YT^XKAuH`HbLIu-zi?qL7_rfL)4+Rmo@)qh2S13T*jJw<q^x z^h`E(7mEc!%N<9OPyz@~mw;a9t=U8~ujEU`R^}u$c(zfv&5<4c>7j9W@}uo-F6-x% zLi^uBB5!40DVOQUb~j$U$z{9K;O<U0uy*+E#qT|n$G$++N(D^V4-V_$I0bq>sgKDZ z8Ifo3mLy^e(a`tiBzX~x#W3gH6Zf41vwcgm-bCJNiIMW*ef>wJd9GE#VBy0kZ-9?9 z@Jwcr&boaZFp+fj(BNsv$@DEEt`3?nb7tYm`}-6^(V^b{V)STrx1hHH?d9$AT2H2` z-2cGcCP3uk2R-VA#G4eBI9rUIecjk<jk108HMOw^Dq}sAmy8d!O{Ly?t#bCK+d~xL z{o;G|d%6YkBeLD9I~hG5==N^?dT1)VPBBBT8)hWStk=dw*#<Y=MyxYqhg0)VWd|N# z>{+Y^CyVJ+Sgq`OYRNu>xrd?M8yY;VL9t4+mTk9!i1c2!9u#XD>%K!I(RZ?ifo`)~ zSfpEQ;gi#9VZDCBTQ8@tZ>fAYjptMQ%LWzUK7?eWU}yN8`$UDc^*~p7i#uBUB4_=f z$p;2;F+3jdgtr>&3dhI+h~qfdfDF&=%Cy6$)pQO4UaLI2Vfk)M-6FG}ozS)D+2!o~ zfa<k6&MD`G$(rSN=T0^AQ|aCWb?qy=V>O$hx>L*8H}A<AFTtG#%-1JuIVs%t6Hqtl zI@r;#@oMM(bcTx1TOgQ=7d$h8N~bmwXuk&mr5TTbwBNe5qD0D`8GekWK14PSaf3ZK z9P91Sp91JakpSi5s*4PCKgm{?xb0IN^9RpvD;U^m&c<@<ab6__rm~U}4aaT=<;;e@ z^aOv9E1zN&0~wXWLZ!fYDhS>1tIL?O$}g(IpTYix@B~edN`_|RbovMs11L(cMvJ1$ zE7EG7!VKyejADmv+6u+R_Mfa)!>=GzG*^3Kh~AtLb;3O{j6#(OM3A(%tWH&1zNd2- zD_%4*rJ{BIe5G(lBfH#zmD6=4*YSD2`<ZA%8c-N!arlk6<MZ8Qk9ggI;muNKa%Q|A zl$b=2+R)d@(-Yej%zw-9A`mn6(HD=)QZzu?JXmf?`ngNb#zW^BVKO=cW7H$qX$Z@@ zc0$|>EeCe?+VF+XG|y<rr7uVfU;Km3*gg^JA#G9*(T@E3qTNzf>AFDlMg*c*xRk3& zA(PX1J_+EBZXW-SvbT<Fa_|3uk9BN33W`V>M^Zqf8v~{wF;Yndk?xLxSST@6N=b2y z4vEpF2q;L$s4)bI0b|l^)bqV?-1qOCTlYNAUou};eCyNi&-+5vF(FUoF@?0>gb~ob zP6*+f4Zf=l_pbm-Hre$-5tq+HYe%gRPf>F}ls4oIeV8uY>ju%+)iPU8jM5%t`-sfi z5B8A<k9>8c2@^rh$n#Z;O~c|u1J5p3$FZDdz6QIp(Z1K-GbM8)K>|$lP-?ew6O?KN zCc|4C7Kru&$5%;3=8pWtfz9fxjuUrbBHYS*4+@m4m(SM4kTb80a^{?LzI&ncbLZ_a zrSXP(8&GWs=1f@g_T_1MCG4~E-UHYgW$mElT(Pynt~ba*zs*Nb-Sotc%=SHm+p?dp z+(t8nX?RYWTPkw;qh5u(1Cd`q%5ysiH(n4j-_jTwtrqgOdy&WPZxDHp(4+6bEt65g z7~=!%=#d3Z#JF{AWM1w@C$G1;{6GYa7|VN)(wT%MQaiaC-nJB;5Fc2zWCT8DL*MIb zc>|-dzEGwO{#|p=&eS6mWp=hufHio^UFA5coUW1{`o=t3(C@L{5ten3gY0Jy)Uleb ztlv-|1oB>BhTXplRp;Gp0U!!3yD>cutFP!iW@4%QExM6kM$R~pgS9G(4_-Ld$DD%m zk(zGZW%_6l%g=g(1bUGaGT*m%zIg;$zF~v;IELw7i?FO9b$E2GMd#(!Pwl<!){pic zY4+1aoIOa#>e=b2@R@UuPo06A@1aw|sW+SfroiQFm(=h$YM2>+OE@P=whZ*tT@9=5 z4As5O4O%)=IfzM*&LJg50clX>JD(gG_b-ty{TJ`YmpI-i0{eYYRf32mJ6S8BZD2#G z1~sza$O0#rLHv}o$Jn$Vr^b*)oy~pJ4h*ZfQgFz(Sz&LuZ#d$N^&wV~dwa-Hxfj;s zmO7k@LtdiFO*Yo~B6@xmM^J4sC0U;Pd&fqHtBgbE3bVFbK)WipL%44&&rTS@WyD?! zOs1~tLc$(o-UB%K5Nr|1l_f{g^F?};>_L{ppM5)(^|SUO=K>}^Dj%qDS<X}(#qof8 z-vd=k&-^*bETX`|;!(kV8)G|1o+p8#gDx>={{R>O#oE%T>^IoeQ9(|qqW*@I!t}UV zZuzTCIkQ~o=wa}k1(!K)^SVW`fmq}C`)5nn+7Fuayf0~tX<Y8muxGX@&~D3l1S2vs z+ZPyxd4VzBbDV0@HNTsas4|)KXkMWBZ~l^nz;fxX)%Eovv9$S*2REC|#dwa}l@gvh zw(bD5ctOhx_<Df4)_9#n4;aHkp~Uq<pnL~F)w~uo*2p@t8~N(~$Z~#OD|`uI>vTdo zIu`L#*|<|fU3xQ8^n7?YvR(ANSEq-%mo4VKOS=>et&+6`1Xy;b?1I%+0Dp2}S66s7 zoFd4(9##lI{+XwFRRK{d$q+1WSi3RgL4|SLZ%jvbNl(sOuUZdTbbbhMU(HmM_z@lj z=&3zDy;sd+-L9}9EwcvsiUy9>v-v6crZWt9j&^N+qLZ3|YgNre3+7huoIhSaD#d!3 z1#PzCTR!Qf@ND8$P)o@9N^;0ta`bd)#ca3uY*NR3p0;0}6N~rPqbki&dy$|;?m>^k zBiHCy0al-dw)$L9T#up~@n5wIy=`u5aNy!`WTnSV1CKT|nGC>sU$3Z-GYT<}J~0!3 z3Ot#ZW)6kt+ks%k*^43$!pbABtah1yu4xsiNYZou(#}|tM(TAhSnKZ%&v9t_c&+ws zZb!L7{eS$?|NR5QqfTi`UEgrGAL3d>bw+6naUD6+WhSR#wkdj;MdV)oDfA2Y)f1u( zJ7K`Jy8H3*+EI%2Q0n?@hD`|YT+!NkZvCcJ9+&hRF4$T=O-PCN;)wSg>s|BMf)5o9 zO5^Q`Xp}#SGk(Q;x^%VDlOCXZq(~=YvWBoLWV<X}5#E=x`?h`lS|?=FMRX1OlJq=> zxSl*#Qce>|6CS;Tj==IfRMj>1wDeh@I(VY1u>bDz@a<*1eM^tYd|Kn@;}H#R5SVhd zOp5eHc{j4*&NQ&mZy9%k^Kjcd4()gYQweD3v(XFg^XsoX<M|qlmCmD=bq*?XR{TDH zvaj<sB)z^x-m(ti0WUQAxYlEy1SwTHqCqV9$_hA2;x%wY()$~IAm7LSMX8euh-UAz zZe#l_I+3!j$Qa-+HTB-d=^A<RiT2vWoET>`@<=@C+)M5aEq<gI%X{2K*ukZqG=nr| zL0s{@J-NEnZ>w$fu4{QgLW;B&6y)sZ^L_B7xWgSsfT$^5ZI011yp*lwna@`k8fD}q zA-6_6jxzoJ`H51B2}VTpS;1rdzGg}nckb6qc)n&#;d~6<h`vg8YHbY&g!PpMpr=}$ zcdi5S^|O2kZeCVz5bONTd`uYc#2gdnN%+Ram!OltmkVl}r{p%~eTH@;y~gJC*~IlA zbS0<=^SX^F^H-d0t{Qs9K{ON``*_Rc<x7=@Xm)6Bwa0bqZ;u<auFcW0<2`C31WDyJ zK@b#hb*4n*DIKdutaW9F&QPjs40>vB<3@3+Z=(wK)BC&5jP+T>0YuBX<I2(c?<u>H zdh{BgxZ)pAKj99T_xtL8z<C6N;3Yx7_m}03p=@^}svptP9p{gVv8&`m%6%)~h$CJ9 zBLy5rfL?okP@uHn#%i2I@mPAJ$){&~0+j)JC>r3mE|jgQ1&Wf2iImsQ%@Tnl-ELqA zns8_cgGVO-<K*BOcU>B;`XEDUEnwx*$hzAe&V-!gtV_DFI7>)L7!3v~h&O7Q?t753 zD?>Fs4kHP5E3+dp($``4e-JDHNVrFT_)}QR=YC@d@M0do*81J3Lozjk`LFq=Wz5No zZyle1&?-9SkLqkz;?2>PUM7#nG2zKe8fnE%#BKa;0_mAr%wdVG{KfzGT1?g?!5WMU z3DBj*Q`xI?ds(GD9FA7s*i*kT_v4mpmv-N^35%hL4|~~>@Bo&VMVik?hd{}l$JmZY z#eo(zftW&7hKL2xzSx*6C>h=u{TpcRQbUjg>3@#<?O_9=8V$0$UT(s5A*+8Y8vA&z z$sVjICy(jNIL&{n38;ktHUM{OTRVeg^+(CA&8p?%Hv&!|q?e~VM%dM4=%K2lfbxzc zX8RS}ud=H)3UPCBAZsHh>tuh3Mf`oaQsw51H>qCF+TI|%sK`Jcfr!3r?c+mGz8YlR z;0~rCN%$@_@-$a$T*Ys56(3|A=cv)yr4n}|Z7n`c&N?gq#?j9}9I&}+&?$r}(w@%l zG}4F@3LtS9Un{pBoIf&YZ8y;yqgv8G7Guk>ce+YfVaAY9-L}#q8>AxEFS-@X_*rM? zTCEMI)|h<!^gMS|N2(5r2%>Td`*<9`wgnVX4grcrg$q@~leHyN*-Z2YFI+TsG^os9 zWm~N`X7{@!pht}zbbU*|Z1j#BoHWfY=7EaJw?<*Sb=~^*gWrA7J7L>p;N!OJUY~d5 ze*1HZ0T{6=GEro9D!*AE5cFFeklKon!1#^sx@*!p<WO<pHd)&@Pc`W_lBYsuX=0bH zC>g|EpVW$aC4m1fhWF5pS(J2s*Y1xpUZ<3=5F@Z-hS!CdLMk@IW+QUG#<Qo~Q9rOR zqEJXx>WoHpGRC$sVTJ($NBUZ2@QH;WmIkxBZa<6;@a{G=59x7Fz?n|8Cg-2Td15OZ zzr!_at}|y=xv{uS_^a3%f*>pDMwm%PmOBz?#}bRpJmu!bN2&^!3&ZYTR?0sUVGqdL zw*aKA^B~BVv7bTyuPyw~|5R{+{CfTh@1_TF<$IVKuWtw49^_Mmh+QRNGH{>_;BrpI zx(|9v4$S1VNOO<HkgOHf{Wj)}bBRl3$LqOU!yd|v_P13@3))qUWS4XCrHL+4@O7E_ zbo@E5NX8D|(2ld`O#|mTb0o%Bl-7p!ZZb>RRJp?A-5@PhOc?7A%wurTv#cGRyZv&| zW29+i1m(wn-+)Kk%9gwp=*Yx3M84?1n<ArJ)QH#JXgiSGV-oZU#*Sc7+aR*ff>3U3 zl+bJBw;tkSJe0cs%`V6VD+bYNXjmB)oAoR8FK-W(qB1uC{2?ev(ReUlEY7JY&b?36 zZP2m|OdR00g+d}*`oiun_TDeU1>SxhdCO$>B;wm`!8_FtI8=OBzQJ-oDC*Y&y*57w z@bahWBpnhsT-!gy*jFC+o_4)+^b@!C^~OZ>YNS13FeTns2f~ebI%ceL2fNJlreI#% za%pFSj1I<qbJvmD!~oU^xBdae;9D1CURoCQ*l%8)m)r@n)qwPyKO0nfJ9=O2mr#<Q zwk`DpB#P|MJ6go0*nEC`^O(;n^8P+nlm8~9+sJz{@JWb93h#08QsR=-NK}2SmiXFI zV4I-R_bauI<Ys{SWvgfPvx2)cX-Cxp?}VWq9S2wsMwO8`V4l$L*4B?4!P7tb^RSgh zBpsX2#LHsJ<kUGnTz6j~goaO!u{jCBBdt?Rw|p3NfY-DxywLwbXA1qXsj#Q=)+J)8 zb=~)TZj27uxJ4$RsnbPaZDV;8JG@|(k##J9%|{-<C^B+!bY<h?dysk;xuKfF|DST9 zdzAdut5?e@eSYr}E6*G`c$n$Zl(7Bc#wz=#e)}qVQsuJm*Gr9GXS+(qk#}pxkZ<ls zTSjAD$G-^YYwC#-gZ9%8HyTqk*xsK4j)?o9##WiT6{-{Qzb$$EJO2TwbO_~Q<vzVY zMb)R$fm<d|?ydNrH06Ku<`ZYYHEa*vn18CBw=K|F>`h#}^B=MN-#@ZI{RNZ!E|@x! zR!8s%q<-4(D-Wkzq0%v>`n1<>>T7htNWCKPO*G0+UV6ZWrPSg=f4*h{s$U{(ugM(w zePmKC3?7^OWdt&TTPYSpFfzC2TD0a50Ra$}!ZK7yQ7bd}U6D8w|G(4z&;L|#07YfJ zV7Cp6I11h(d+7z+BN|&{3LeYqtP!-mW|2TG=wE7}F@H)DxFmr^=Loe*vG5lBK4Ma~ zUBLZ?ZI>q<1iQC!a$?8N1yJt?Z^g*?dI1~yyH#tw0Y<O-Fm1aKYynN~&?j2@3J>{t z{UcL^pJBNF3}l^sP2FiMbLv^}7M@dw45@0vN&{>zM}SHSjRh!$>aE%m*zF4aDX_Ud z$7qHA5nzR?PT3t%{yANjN8q>ETPr9-{GZMH=O1sqz(dpBZ5F79IrT6YXWvQAieGyg z@HR1@Z7zVVXQsXYuXu7=gbFxY&<D5sN-eN$_qF`5zHgNSZ={SDds8tnZ=Jv%MdWuL z`|TJX$R7sP%C73ugtI@dQSSn`Xv;`TQV~P{mFEBMfVw3ZiBgc&w)Fg~p7p=ul7E{3 z9iI6k59+BwO0qtHw3Y4``Ng%{$4MQM9*nRaMd|1NXhEHCBFI45?LGU&Zn?yOYl_;e zUjN*c2~O~c^?Pq+IA|;Yc<f8Hozx5NP=GQ?ZfWWI=T>fyX=}J5;1p|_?n*BEd5wG* zP+8iz7ZZQcc!@hueXc3lh17EQ#%XZ;*cE$)Xyl$5z}WXZfl@8d9>_<5ft7w5qlKx_ zgRs6`FFWk18cGk`l5Y0*0xjJE1J`&x?p2|Ro9qQJuz<Z-6pckL0JVB6%XizxqLm4p zhGvU2s$l%`z(5|Fh}>f~>N-w9uoNS<KZ<CDthd26@r!QM3gKH4SmnhE!NqGdcBTVh zwW9w-YEm!prvqo(^^Y6Je<z{9<){SBL7nb(?P1h$S3tj|W@e~|?pL#Eg$`!LZc-t2 zXA&T<Md&Kw@-GhL_WhCoh|qcTyzBNQwm=>*wj+mV92s_KnI%)z<Te#S1$+Blj4NZG zJ(H)H_8^mkT54&m1qRZ!E}wQIqrJp`LPXXf?4w+8p82o!&(=^<UjqTE<r1O79Tqfq z2(c`7_%HYT_D%l(hOYb*+49Q?T3vxO^wS%hRB_+|N<V%0Lz@VVjcNcZrah<?L|uqY zC|offAzJ=k$*&uMx8VJD|3Te^4sHNsjC;UO<Itr-5Y@g@0u@xWOS&3(1f}j;==Q$- zVi`&yup_gh2o;vIa1cDgSMVzvEz9sveAGlVSaj@w!S5jhr`1uA1W7uSZi9b9z%5;e zo*=gm*e?dS@EBa9##OfW=N`01LB?Tj!s|Csbx6Pa{|izkc^(`hZvKehFY<0HC>_uZ zQ{SZS<sf9hiANp$XzV2$P*js}J25J7l>&Jm>?~TLv_LixUanuXd3(P97N}or3<W|v zCNL=-p~4@j#k?{acrkergxx`wl~MIF0tO~W3Py9%h)5<LfY<DOp|yR<O@K?XI3=!1 zLxV2JfHP7lmK;yTp-%i$*ZsrVP$%YZ1g-1n4hL_lavuY`Y2~|5=J)=`19@|x+$B+H zDwaw9EgFneng0AQ)@u9sAZ~#PA32f@qi&7YHSinu8n><Ne_^lR{>#jyYJ<t?u}aWD zGW<0G)m5W<47N9%3k>vUs^Y(1#y?;6Z{=002?i$RilNHG_OaNW2Q<ZhW4AgX-4=5A z^$ZQ8do$rdb=v~DB$~Rc06r%4&w>17@mh1hz$sl0-nXc`!VG?w?$D-%{OjTc?n8ws z%KYb(<ZU4btWKP8{+Ft9YeMo*z+-uKr!i6Af`<aB{>0^>e+=gTj?;ewD7#L%dYmRT zAszvNX=2fl|964@?+xJPR`Os;|NQd?BUO^qA+0?5txbZ4Br8E$Sx?KGIu}0(qGx|@ z#`E_IW8DC}MN;mMkvhaNK&o5hF_8!xZW6->isi`>WNd2!js$svzYtH3M~0Amywe~U ziL2~0qb+gr_k|p%BY*auqqT=XyF^>T4|{WK2~&mz9s7yyZs}6iIT)|$f)P>AeQBDE z>D2J*W)awK7kaB-NgQ=M-bRA8Pd6=S4_0I}zQmDTN}&)YTUDj(m}Be<;YBST3kyOm zbt+=GKJZ0Jx>F3!&4RG6GT2x_n-$%Wer18<LSHYYHc@b{P$u{p<wn@q#qqbhmXMcw z%YK4#wV+tE{aqhb;(oP3TS)&w_IL)-KGU3C!zJTJsn^X<+`jis9Ar$(L|k0(h^o*U zUtgDiRVj}jLp>g-#XPyGdXRZ{UnwPItw7k9woi!Vfxaw`(M`UtuCC+Dn60n^VGLeQ z3eDxD;S+Gta~-)6e!M8J|K!`xQ)*u{!eKmm)+t(|o=&FD=#kF?nL%F;AAY$smFL%9 z(oTL_?xS@39;5lDXs6h{aZRZ(RAr*<DGrfq>0-IQTd+Rx!I0a&VdtZ6CC%O!nTx)n z$ZZpT1r{*?N(iq4kQytgQiaXn6Tyh<A5dYc;*ycK$I8&}><}bCSwJU6WKxq^ytyHb z5|EUNT<aDq10981@nsj(<}G8I$oX5L*s)XQwE6*ZfnP?Q2i(X{sokPM-`5gqGY0hl ztjZbGVbQ+4;k&4I9Oz%JW6qwAyp3qs1%om^u}<xR=>9Ph;D)|izA(o-OY*B?QIjSw zd#o>tMaRkw|9E5?hrwECbhGXSV9><$E#3kPfTis;`1G587)WQyC!FAV^03eEI>hlI zX@qKTOvSj4&*&Lt{TDY?*!3heCnr=;*WmbgoS$QuB-Y5;^Fnd;no0u?0?gSGPK1O* z9!g?lrE$?XM-%yw=PFcS9_y)UfM_}l^6_zQ0~}kqz`+dg>B;tx1TRWLE*8*kKncHh zwE&RA&xEi$bW&YbS0~MFibT(G^BI$QZ0=%MR=69eSKb}|^!je=+tiFH4?It9lHLJx zwCzx}f0lH}R-}@u1B`(cE7Lj+l=1|W(zCl8cOPY6N!H1%`WBhhEwLQiVLI{ROzvv@ zYCYgA>9dL(djdKkPmRYpD+aHA59={)*%h789BO~c+w2g#Y-X3UA@{V>5Essz%FJRk z;IyD%UjGVDx$ijOWBzZr5}QsmVyV}p%|-`J0zJOD1P<m;H-(xy*YbvoK|Se47)R~; z5$SOJR4wBsE4%Ls{1BV8xFY}B;>ws<)lq$0%<Zot<17kg=(x_DMuAOR-xUaTa=aem zOb8jtB+ov$Annq7e*E}&G)ejmpM*OoqSVPHAhK_H*#SURps=%+S7q%9{Uq{vB&00g zHb82|M&4x`6Z|jb45@{;-oWOUVv8`{ex6@%IIgm~W88SMKSy#XH@=lw9yrK)fHmTy zBHFre&@D=*-w<?U4SzmIXSrygd!X!;xYCDs7192}ecd)CwH&#i(XpWK2^E4=up0YN zCV;Kn??V1pcYRybIe*k<`G(?j(PrW-Kxtw66w`h{d?_JfdIBJAE1$*%b&HCB`_vIQ zQs@R@KTf2`u1?R3&!w7<d<bB(bj&V4{RHWTGYf#!w`cBFVej90nqO(U314s)X2kfb zYKk2bK85NU7L})d@jVa`>%Bw((-S$uOw7gZc-d!fUA8=<&vQbLU<In&M5Gj`x~|PV zE{_2$Hf6r<ra}BEy-(?6rc+OhT8<@%4SM9?ip<jb7AVMA_bw>-0>G{i_aFiB6Q;*) z6{lAqwz)QM7CAEa1{qkF7YE-<WR9^Z_k}M&pwc~zMz7eTS{%Z&*`*u5dXnEV-Txek zlu9Y)Ao>7imfWeC)motz>HZ{XPrzAHps->&%AWNXXS{<;SSj7sws}EYYkpyYmJ<af zF}?mMnLYtQm{>sO+3Y-@yVNnsNt+%n+~{|DKPKMnVuMCzx5Rs1J7EBFYGQ*~RIN4K zBz=&Ixe&AjC4d!UYz!YiXuqI{qU+;~G@8^WUos~MtzIiU)cX>~%1A1ow;NPFa5ki5 zdhMjJg?gJ^-y2Y^O}y(gUD_`@TT~^dZ4h?fUk^agjyI-MY*1nx7X&#K^_DUVa6TPf zf<8UE$^o^j+bY<1U{J%6(ZIvfz~{^B;XYy^j;GsTgcE{Nzzhuy0gfnMOw!mYON)?X zv*ugSK8L=##owT=0F;on@X6BcuB2bMe68!?8l1g>Z-6CVijI-JULq>{afn8Lgn^DN zn7-wSWT;LxTimounlr)azJXs&6PYYL(lQ!l^jFQ(Cc{nvq7Sular{FP0KY^Dc<M+d z45okzr{7bp<xJza_Q`ge#l^)fT?f_Nw1c$47b#T5vqz_u0Su&KeMu^}*(+w$799oZ zCH$-TwxB}i+&0lT0+=mE6}}92>t}~B<uirZK=wx65Dd6Wgw1QaJM>qRYJw(pXdsh} zTkeqqpIWnTQqq^R;d2SMig#~js(ocm<U{EU&be1sXvMnEFpVl04hkHZx==Xr`J^-X zNt~7SR?*=~l%bQ+g~}BZ@?sc=N<(C<evY_1;Lxr+hF?>RvHcHHWj<r$-l+J}>vPea zaXMSLnEFRYWL{zM<|N#3ioVL>9U_*0OL=^&^{bE6C%$Gp0u-FD-zKps;~H!i3~MAN z3W~p(YZUg4J8#72gX#4Pw0Tz6<^@bZ4=DeAr&4N_T`6S?b0HrA+*s`|@)Lj3aAUXH zuY#Qk{8RSt70Suo{pcDud`tkceNWJZJO^o@!rI=vhZ9P9C7BLcWjyL&7T2>4IefNB zJ-l#kv_9Trm;_1N*r=sq0t7e_5R7Cj0Q5upt^Wa<=;-^Sz$awRMjAUVzMJ_E36G<- zl%*&d&{mz3b6t)TtF_5Tl-$4o-T{q?OksTuy^pp;O!5-y#v@HSRcUhYNvWmCwTbYs z(2(Q0w+b;<5Y__VPk{FII*QNwy>APEXTY5@Z;B#+Xo#!4>p8(?I1m9Ql<Y?tSx4gt zUJ3ElZ3Q1?-PdMjR%+Wgzax}|_S;tBbULQZK~*Q#eWO+(ZoA4YZpZ7e0LZlOH|E;j z?(8>Rj!R~;Q97OjXs=9?6X#xNrM(0bXsFSFP@sp{m%23Qvnu5%6A3{N+Ks$tj`iDA zC}b=$K#sEfR`M*qLW%}DX5k@-j#}QipLY<x_c^onl2uv}w?o0U`6V>#ULBf<&@~DI zHY9ms70?o%ATV{fQ6VAfu~XB{;5&6p06bh?oC)ZbG}UCn1pIZhroT4}ASEw!8<=)+ z=(_&x&<Xl{D>rMJ1Dch@^gy@&@Q(y`1IdLg4^A5-$+XVzN@S+x!9n>sp=NZMi`xy% z+<W+eQ|PRMBt7%1Fo-y+ipd$C#@n$dD<i}rGxr&l3kU#?FZ)fm?G0T22@$a>y`blq zw@V6Z;CegwWUf3s9}L!blXC4upXA$AY;Rl*oy<kiTYf~2C@@;cy}4yaPQHxh2q|!W zKdGjJ1k4Zb;`CIZm6TV5vf2g3tF%J>bZA-UNC0g)yF%|b)v6K`5VF*hA$ZyuR7c&p zT^0Z{8}RGA6$55)Mrgu*7GggB!%M(4(+^b)>sb&Uj%B%~_Rs0n?50QBl?9mOqzXn7 z-<Fo{5XAc!2kqE38Mp*`=qpx8Q6@or?p%|G-iv0nzA(3^hnY_RyQCSG4pB=S)Y0?I zIw|Mt<4a^piEF*5n9Omw(CK2oP5zcJL<j|LopCYfjBDa6Xq|B=fHVK{9~Z>Cqx+*G zh~{1yi@8j^m{6Lq$P&>FIu|OQg!6V!x}v)a7P?N(f%NS0BJt5AQ<K``QM^dtNPj!& zdVS=OY!IL1r8)!OyN=nsQnmm|vo?XcWxIGdkfSlmmG^*DNk?0C+kJf-c7cior$Nda z^VpMeYacGfm4{7kDPCJh@rs_M&{Divkm7CVe>cmJDzVafPCq<~@g}d0RysDKwGGhR z<=rSw>D193EITHCYO~iox1-s+9$<uD<DGsCeQ*Tq6)|5K7PbK=E`-RK?B}4g%8!g8 zbz-sg5ENVhVQDe1Np=L<$HfWg$LG4n2)-QmkB+cfo{Y?JQqkfZAd{~JgmB&61b{0u z^w`Kb+tk|G=Qe3sg|yBo6O_Y19_Z!0GaY)Echgmytc>~1lHz~TvD^ypg)&S2lTgE8 z_AIC&{#H8t?Vudd{h|9!DYpXwh_SRuDTU4LZ!l3@Z);nHJN_6UTFEBvFw6QnyIMWG zN?aDg6AUjk0kmh_^~Poh8$4e#8nt>i7Vv_hHTecxKp((K=UVODmEoXT9yvY1!a=Wj z4%cK*VE^9EJG^#~|I1X$>9)hzb&gkl*8S%~rBAK0d))devurSniiiv~bQ`REGTK}= z&FZ(hs!1LV*tF5gESrhW5;?9WJ-giFx{L^NhV0qk=DW8x<4r|_{E@!;j!(?y$MroD zbE3N5Z&ek#K-8~w81?qZZ>J7IJ1F06+F2WtjLGaf4)Dv{CMCDtXzw*kCd}~geW|9a zFn#+n<@{420TBkOe3%}iA&cQpH)iXY?dy1Z4_yg0|CY#`Q<{CFs@uqVQ8dbZwIgBU zm^Vo(J+*2^()v^7>U8`bpXg>2mvO`8x|cAO!{=<@Z}d6#B<?+dMaNkJ9`wfhno9XB zA)p(g>i+ZdCt6kuhIY=2S&ra0eI*hqQnl<i$m2oQ*`)=w!B?v&i=MOnyg5xdD*4Rl z(e^)EE-8l<wqFLe0Jvn83gX;P;*gSattXT-&~IYg@Bo&%WZc4N3z(^Xg6~YFwq$@6 zk^w<FFIwH>SHU$hyA9o9#PB}6-FSz_yjN*u<MGa3hgdHqT?Ij}HoCQ~SWWi1%#!q5 zt%2|B5NG9&Z#B{3DlL}*d=n!C{6}HSY#$C32WQ?RzM`JLm-?KeAV+du6JRwtV^4_T zeDob-BaQU|&IRIvXnb_j&u5`!wpogFV!T7ux-mzE7r4=uY<fy&yk<ft`N~_LU3j)| zTY71{KIr^Vdr1KrP0)xN>xUXrrZLNx6&xq$KR>C8=UZMvpU4-k01OnlU+(uaxOS)> z;6@0=q*?wLx}Eo;8y|Q(UMZrm$7iI+uS!NaU~ns<3WVHli;FJXorAxMs8*qf3SW$o zG7zTZokYyO?pD<<w@G0wdJdev>~}=bBP^~-v%*5H5Y0<QX1PgO7pF=z!#2*P%vJOK z_&~mzwd?J?rJb;}S$(^8Ll*CWFT_Dk?bqEJmh>E|!8LTN3TyZpKZ~|*U^cr=N(#ZZ z(nRS#M_R7_s0r2Uv^RQhR4Cn_7{JnMqJth=WZAMU|H?%F>f~=Fv`N(|=yo@}^QOlJ znXwGBYl}Y-1j&Ugy)Oa>Q!1+A2X-_`jI#)~NY|X*6QZ;JrC~P9=1X2_X{qWW6s$c5 z*tE)88#%OMVXxPGk4xBL)0vWSp5r2(#+IX)!1En5W#iqVtPrJ{W0y9zp0%p1?8_qh zQRik>;ec@EY>0xgLRMwUXgh!9y_=9HuJZ8Oc5+7FVBW4Uvmb*+hD>Ewr2)=DbivpD zZaJKE0xm7zZIsvp6=VEopn8CjaTX2tMC%Q(qol*v53puceLFGxg)_lTnG;ZsirAg< z){Z$7V^?A+CPLYU!EnD70__*|y5sRuPY=gP0SruX;Gkegt-gIl9G+KXtt+QFZj+#N zhj&pdWEN=U6V6{}BP^GMnve@)%=Wc_h=xAFOu3{<0vp>a)Ep5|nCzLjmD5!}4#Y@X z@Q@@eQPYG(?L3Zxi1(g(;**S00!ghNt|ps;&u0%7`I@4C?xlP!IG;R<X=i9CbUlcC zVjZ5oFlU9s1nZHM2|v*nsj47Mo@8OHpp{nPfYK@tiTCokU0fDLu=Nu`^)7P_$zAS! zjxjwx`5~*HE?KE0eEmsNk!l1zk(F77R{H2q=!x=iNDjQud{(i=!YGu3a7~ZEbQ|!2 zBvSuLKx34Wt@-9>^87Uv%M-*pw`=RaNV3WwhHB^IchF3sY<_EBJbom?&OUijhnTwo zwV8UFcf7I${DEI;6nL}W+xP%RteCb`$pCoHmamck)oQ~0mtOx$HlXAh7)A)#3fcYC z3;YQnJsmA8r%U6U{kuq@4UrDGUVV3!#!GNeu05`_kJ`FPfuJFNC(T-@q)*hL{Nn-Y zVC=^ksNMfNb{ay}%wsV@(7b-JOwf8-0TQ589hhp>PuI-f3ZiL<eA!Bi%HdylI?8)6 zFm^VBP%5*{uU^&)foIUqk5Lchze`BJ7@T|)@PfP6{_^_c=RI$sI-{589|Q5!8p<zb z1bT(RHQoKVpA+`41gqS+T-QlY!;`*w^({aO9u4CJebCB<BErJ=a$E&H8{~TRg*(N* zyXNV^@#^e{!%oe4(NFysqK)M*`E-_C#<)Enwf!!jWe0)1fw%ti(8(9>`Pte0d43(( z_%$@YfSU1(xsKivExFaFohv#lV)3><Suq!LeU%pHOjiG~fB%{j4=<Eg##@c#=zFfW zA2Bpz#B{5s*(f1X_c4rC<)G!^2TqvTqQ^il!$l&sbRhz2t6G{h=zJOv?f}mPq>8Gf zKam__H=FMZEBTq@55b6`5vP9MC9ie>P+<z+kr#agUrG_Qi6e?BW;Z!>hV2?PqVe1a z=<o!ibg0X}0ZLMxe)WT4zZVP&8e-f%#UXZW{S(Ee4)yf)Ejd9B&{?J?w|;@W3QFc1 zBT)fV5%5xjD0i!w{;YdYy5n~JWZs+LuMVBw=e{@77}RlK1=6`v>ZpVAg&?~}_TtXb z7*swaX>5oVD!@z&!WA3~?E9?{0YW4QtrE?|!@6DJ*8;aF?NuzIA$p}y71-MVL&bzF zu!Bcz2zAH*z9(A#H2uVvYWU6;l5W(}q>0njt6s{R_eV8X+g~(vkhwSS+26)}X?wB$ zW$E2rr>mW6nJq|W6O;8%uZ7cOWx=OhrVT#5Qoiu2>OZ7v3*qwady$iqa{_AQk#M)h z#*L~9Z_>-Zl}S5eT?s~{J&&I7_3u3Q_xJSxv#QNy`L#z+9$)-iXmjtPl+a+dvh$#G z=;zOwndzCzx^fa7$B&MekH<bsfu)BJiyb9O3RDgZ)E1p*|Gg#Ju~Psb<`&+Sb5PL} zmAk+qkcI?$&(o;H9Rk<fy-S6Oo&Lc9ex{@{(TLQ3G#w}hSYdUO4G%-T)$fbt8d;7# z)EBVJ4`Ft}^m8;1D&}ad{;?@oLIr&OLMK%hop#8sh8s+E8;l=d!QoSeG$>&@y*R%L zJPtQNoFS3i#oWcp`uodpN95MROZ--2jK{OssfW`adrbVigNvhQZrM#gH!?n`;Q8() zY^U2BHK8ll2>8xdG46~dGOTF7@dxnEul1e|l$Z5>B_)j``Y0OMf<OGD{^~if-!_L{ zthQYy$HM^LYa3%!DG~)f-Iq&U6CZW3L`Nu$Q+YIwW8t2{D_8m>cEbAk^{B>x1V9)Q z-kSo|i@z6^N+JKELoBttZFAO_UwKN4r^P83)SHI4D|gPx&GH-tYuda~<5IG<21Crp z#NCIuDj6emvuYWWMtM8SHHgfVBQ<Hi-)-4+`GaI>AH=xd$2NjLDhH_9nIc?@lpP_v ze;vDu!!;RNmEmy%xM@3kk{h6+)vSDs-x$LlF%CRHJ$ThjdsIQwm4c>8>N-8%TIqf2 z<G`~w!>fo%?BMfFYX>jUz^7Jw?vcF)y39gBt!8MVeADbTmGekk`z>J8ot?)mrexq! zGSnn4x<o7q2=I3ZbDOw$zU(t8stq~&mCwN?Jy-Jg0^sld_m8A%c&uM3Oefw`nE$?Y zwnY&3VS!rqmt6vL^nqYeHO6Ok(`9}<2Gx@~YbqM9+#eK}ncwQu00RvXcSHMWt~snw zu@SNhwp>KOSh>58Mp%Iz_A}ewV%?)X2UrXZ(J9P^#$F%WGS&{?qESy6(%$3sU?NFd zpgru_<VavV_=Ga19Tfr&zG+xOxJv^)vRxn6PFXHnT{-9A(vE*k#T5>X?qLJ3`DESI z?j8@T(#Y~9l|B==xfoU@rBaWQsYoX_HsKcTeCal$0r!(1D&Hw1@6ujC;&KSLOTpm= z!GLf0*>9zofV&^X&~u2z(3r%Z!#_ul+>JESzz@){3pxBhdcexxVRL@U$r6F78slWC z-CSZ<lMYntO?J>+=j40cXY!4(AGQ<L+dy@PhKPHbkBXOm4V4SDmz%wz#v7P&((_|m z|K_M9)H(4h&j*-ve}q4FKTB;^{v6MXN~6-}Zd?uwL`Oe9yi<_3Ew?QodvTfKvn4g~ zc4-VvY|Pj#k1jRNERESM*M!QA2CWk9eJlK4>TN$=fa^US3!-u(Hr~#qE5X6V(=(z9 zdo6k5tZx!YVz%PGuS}mMU{vo^eKe+<iD_&g8l`oM+tA3o8EL%T`#@Fi-hsntoRjdM zc1_wJuc{qlQJCbK`Ldto@I5LDqq>aV!)1u;VW)(+R-q&Kwian7r)xhA&x++3&`Yf8 zwntIYW7Ga9j|jcpVH(w`GT$tYiw7=NWrI?dvwMCS*=cG&EMT*Jfx3DE7cTBa$|5QU z5v7y@kB@B%ULWDo-KlclEQB1i9^uFaQ<}lUW$Kh*&QqQr;eXE3fT0fA?tzY|P(p%} zi$(UT2Ya8^?VZX~y6J$?o9MS+hiY`<d49YCU%e0w%nxeS@LC(GtLN<!RTri)wesNV z#22kgR*ReEp_~1c93g{%3B!Hab$M~dj!{j#w4$VceI|f?o_ljitZGo!HEY`hFdnmj zx}4@1%cj(H$@^i9y1Hc<89}(w+R+&aHSuHOUWrx09lzIx`=kwrV*OF#L0RPH`Nt>^ z^k*|abaZuF$7XW~6>HJV>!3F@AuAKdRl&m-ufFh1H$Co{xRnT_v7N@>{WR*p52_Cy zv;lk(0-kI8VS;wnmBeazXI;?c_KeGu56R-|&m{VMrEd_Xu&Z7ydzZ_~R?7?zvfu{s zGj^2&KoY-I3CsMPCV0+Qf0SB6jypCATekEVmC=~7aPRX%I4UTIpw_3dN|;jXOa1|u zMcVd;c3cp6msO9ki``h_?b?le`a*_=An5{Aw~rNk8tS-mf^_n9p;*S^8U1<I11z=P zy)&8*EI=M;b!NnGvxRqNhIH<+3%mxl49qdZ6{Q?4dhy8xYGmXuc1)Z>ytESe7QRY< zH*v)zY$NG(o0&9$ix~dC?UDmS&fP|ZoiO_aF{|4&MuXa^zaz0`mr}#T1%K47zt{0= zvyV|h9<gvrLCUEJXQjJI3PW7+PT@vrkqK^qS^mQs)q@;-QVm4Z1Fg6FIdU(uvaSQ^ zq(b)Xj5pHa@1#c#)*2Uw{odE~A?*x3$nr!-+AMY8k09^6=N}3)c;hX2J|w2)VW;;X z8!|dgERL|(p8KOcVIO-0CyRp0ZsbfmP|byv8pHs0zlQO}gpCp7G0r_V8~eBU*UDeZ z`{a;YHb-;jmP3s<hR4fhl`xIC#YJtaP@ov;gY|Bu?haJam&odjvmU-aG*P>ee)IQ~ zR;L~K{n<7oJU<HUMYgMydNjj*h7HbIXe~`SPBw1Z>_)b)_PA~NN-<?PlJAOO=w{>Q z4`9DH$?V}b*0y0o<?pLOATU3Zv(dl#**|exaLUwl6WXOZ_(5)r5h!R8JFTnNN57x& zN2NY{N<n|7M;fgNv@ZNsAMe;1%IE<ySh4*cY#K&lxSPCFu!#xzA+9UeC0;P7N$_Bo zMTi3fgEN)M)or#Qul?F?35UZGH@=5%S}c$IEpeh-)u`tJob|OP{KonWY4aPqyDkuC z<D^#S-N<asp^3Ag>|kh|Vq31rHyS#3-?tRLJE-9crW*dmFtoZ&(nf2Hdp_c&t<Rf@ z;l?JzCc75gFF#zdeH3DKhf09x#~eM!lbE>3RCmfO4*n)I^iQP8%{YO>LD*FA<Z>fo z;h)Ii{V;d1F5t5vQMjm>nDT-YmaNS`w-SILcosO*8gIwo?6<LCxtyPX7&PnxXJlwX zau1R}1$qLXQzy~Yicj6eYA7|B8K2T8vgo-RdFnY0C$w7mpftaWmYq{XwYo$;xe(iJ z(5BM|Gh;H2cVJMvXtkN+dyol3*~h5x&Jui@?*`0xz9Sfnk{n@WY^T{X;kLXgP}L$f zJNy)%utBIATyLwQ)I=o<$^ESQ{)juUHnK@h!Qt0&oBaOc3x=cS34W1RVA!&$7A$zk zQSrbOHp67Fl+Op?2U#Ni((w9ds&pzsZjT__*y{v;hW$wk=+r&Wl}M=q^&{pPKy}_V z*$yE76?8*(cIe3-rQ-2Uh2iAe1G|DYWvYVHV%m(N8ReWEQV(C3aUSA|7BH#o8@vL` zt!5Dq6l`PkM_E*<<*1jb_}R6Gh1dah1f%?=GW>e+>eMD#%ro0~bF>P-URy=Z$5pM> z7%!$A{7xsgZPL~LdPV}IbP2vi;OfPqvQ3KarcBEZ#?7S`_bN)4z}!@aEFj)VVeo-e z79F$UST)@HVVm0!7h>f3!v%8mBgI8=1i_M6BDAw_(elQq$C{1nPFT$+w%=FH!NH9c za$ra)6~W&h;@T59Oi%<=TN3vev<ZJ2cSc@p=a>1$Wt8g{Q%K;38CNE8vf_x9J|(@l z<e@hF`nufo1~=}|!Ztd&JgJ&JS$#fX;|n_}TeEdyeq4?4MNzj*Euq7@D|`64BG%IT z&6TT1PY32m5fT_qPO4p0!dsu^(xT}4qgI@>R_n?3dy#rQT$8{AME<{-fc>@t`u5Kh z=2E5$RRr+S)=~}(MeXgJcui$7T)Q3JNp#(%dXG^(3Dq18Wi_$D%iwrmGl9Q|UY}FK zcr>&{#R!lIFuApbRotd>BFb-LTmV>!7+<^pWX@WS7FTW*tUi)kDPLvewpnOQ*t{U; zIx(Np0;a|7624(zh?c|Za$k3OvkNx6XFR=9hi`AN#?}4%`F6oZrQkfOQnPVfvd*u$ zBn#smgs~tkCniVB2fJ~H_iq;u!m-^A>jdPjGVbolqA?zz&`x%h@UPpileuBDeJ?uo z>$=~<E9Xz-sPlq(G22SmGvsKNsS%AyZp+*bE-@crMFdx?B1^fQF!v(vXD$g3ucwK} z2fHMU*^yIE_yoGnmFD`obgSV>wuH>d4e@y{ewd*9=7ob^&iFUh-Y9BY(9qxh9t^Fy zEepKlJS?)VGHP`ao~8fT?H%8Gb9}-zhRX>jj~WWPOQ&&NxuzSX%WdHD=AmMOJC^&N z3jz^mloDx#iUhGxdqSfy$NFba)Fsm+hieU-e{dzhzp~;5P1d<45}YbQcj2dPa^qhG z+unaoT#gA-y?=o4sVT4Pbyf+$B{=<M4s5(Vk#8pqe##jKd(Fi<Fs_?{BiXfU2A>7k zsE4rGPE`LwCu$#yg5f|x&>tFJB{$eKRhQ51d8uKQHu%+ge4r3ck3C+G;=}K}P@_q* z$f?DcTj!_Zcv`6mOlhw7hrZc_M;WNjSlo>l=V}@?FQ`vQD+utWtPz$s&AhI_nQu>$ zoU6Gir3}X2w<#Q8j7VWZ1ipnIU_vOV$pxynn)ycPr3H=5xuPCFSF!+>v%$-(D&9~c zs=!w+%0~pP3qB;YLL=G#!)P}f<Fhv(MMZ3d1CWJdfrag|JoAnNKa>$KXG)&gQo{T4 zLXhG}2X&i~F@4`*I8TN02b9OdHk_eXJDlPivzhdxtx1LMtb(7kKiA%Hjf-g<&nCSD z)$}q4cEon`jsJC+c(ailywoPtoXa@=rXf^R7HL99P1Ou}?sVQ~J}+i%H$XS_sX?%^ zNiZ~_f1W8B-#_c}ZsA~gXZ`XM;nNSVNvMY-bFAJ^bfl<}(-g6~1Q9EO+F)|!MCe^O zzOv@pv$Ra(v5*a4S=SJsf$k<wdO5xIHR3y$!db`f5mvRIwyo$dQo8=S$2<&9Cl5?F zm`);c7Ku4o<OWToqFLH=&O=F39&IdQ*g1}mH%349iv|S0<4^D42zaJ(hpYCvo4Z(1 z317UG)<f9QD}nFf`_JKU5#)2R4D(SXCL5)0)5&VFYEmS(NMf;8csHDpbc0(az?Z+C zJ-wZp?~_)%L)UAAY{Z{yC#^FKGhs>uqlyZ<^D={sNwWtleFVPvC%Q1?C<f)6)zt+c z<A(}I*-DjmB&{95un3o`TBA4AEMwx+PmT(T_B900enMRrM58F{X9{!OWJATTOCg9l z;jn9eqz5+zEW*l=-5d^`f71-m6owo>ympGZ5Nav*RmZ$U#CSi8!d=$zr3My}m9U+1 zZJKq-g=~MMtBEuejW|hj%YES58~QF;c67qJ{0iR{#Uerr!V9f;;1teJ1)NT7I$F)f zbi-p3P7W7&=jd38@oUp*DZxbKr*>qDX5H^vOReb`KN%USC;t;->;d;*DqC7PJ5~L4 zc9J+~>Ky(<b^l^`+ekU3n7b#eU*iUW7ZWA&7efv_Xo;(;yqM<$su6g%2N-L^f`&z` zXTwnphXMsl_>Hn68IeN3^<6;xy$n<9ZQ)hW*GeIsF<W=5Sd<1n#xq(zhWAl%nW1Cm z26l0af`s=4!5IVu%JS%GtELiu+#TM2;TDFa=eSF1gwTud)ob2<4RGMOGAm?HSWEYE zZKT!DmST!kqH0tH@5;0t^X1tqvrl`~q@%y@L8nghd17a2LD9;>hQidhM_y?G2Y&{m z{-j%{cS?nlFI<)E_`GuVg>2(Sdr!Pk_(3b2$E(%_t;7jsP6mXd-spbVY#?SK3ANCo zP;SNN`e|0-0K0-H7gm*VwmnBP$oj`)l=_ctTltGDfrp5H{Zq5Et{wGB%r;Zr4=e0l z_c*t5mMR%W^O{^1yrJ|hT*WF)Y@<)KE|T+LM8Yz+0Rv)mzv9tLN`CFL*nLcBW*>LL zace=_-4Q0~w=!gKT-_Fl??nB+_I0b`7KO5f608|)eCP~Gik4N`C8X*C=jU7C+0#G1 z?HOKPqzIY0bsKuuH>$UF#&Oso%%pSzN5mV{7z1tB(b54g8|Z_S6m|y;AFS!p_Hxyu z9CJLHh;s3Ha|K2)2T-X}FN5SjM<PMdbR*T$dVGf?Qqa+d-IDVqa@gbXTc@j=xtYo% zRRf=b?jg2ao?kiV<;ZH&okF9*ihpt9nUzCEll#Q+SrYo6Q?!?(T}=7vpAFX;M!zeF z66xF6#}Xm(PNoPEQVK$xR`^2QRM*VRNE*ztdnJsyv9O78DtO*fjI1Qj-O!j~pv{(F zT75}P3ajJi(LXuvslRA7*=_SP)l|vrzyAKK#q9uVx(@}Vg+y1&^fuA4rXBCJw5s^N z&m9%z`389VBoVsLZ9z>lDWlN?p+`Q<b{FN52PbRpykeR)$BKIVbkfJtC-bBT`DVLl zOMGSiC-Y#wdH~yjhXs5G&U4_CgkMdVdJ=Mgz4;_v;85~Gbg!dQ<H;fs{Jxdo$xE>P zjJ0v)i`HExbzYlUyMyQWF#C>0yjQas0Up^r{fl;Mti~VQlJj99?_`LfehsCgi#BFW z7MA0ZOUi}=XTOe^zFfKHJk@a6)J8_S)N<-VP~Brw``h1swukxL^QY(+8V%2Jox*;L zHa+2u5j0#CVfzq&YKhzVW@19AYItGv3B|x$>d$va%pMiyQIk}vDiL@m04QC(JNr69 zOni)zkyieR?I-4oMB3A8FY5{Cys5Mg$29h0=<P@Jt!<)Q(SRrKL>`S^{vSL$`|rNK zsvKo;lbv3ySqEKVZxsrRU3$Oc<A-y9JLdC+5QrVGMP;$clsQREs*2xPhwwsz1PpTq z$M)4$#ExP9Q@JN0&o@RuRZy?5)Qs4Ds{eIfym2;<Epa^6o^Q2Z)2c7EIF0Z#7cN^W zPj2$*)6U){s*ftP9#+0WVa2!0dfxFl$7S2b21A<_j6Up)p1U?GbtS!V^OGpx@`7Cp z8UCV3xQMA0l|3pQ2(OTJ55EYP2+d2t23M9V26GbyVdSr-diuTmIVrJK)otycX?&!i zns=Wx$6uOu73diKqaUBEmBLOGed$gZG?p4JE(n=43bQL7-Ehh0!__q=Xvi&@Mr>GN zgcS}lDR^fScc2IZ8v3i@x|v;MD^q<rJFmigD_i(6v4bOF{Z=0a5~TF~q{Q!*iPRSk z?+@etsd4ZH^6RpKhBcDvR@jx4KmIsFx^eBYmXNFMj9u4q;l71V;Z_!>Q??_^2y1Kn zev@0}SF-%h+Jwu(8M8cNY7`wAb|iM55D~d1T&0v1%xh{QSD9F#u0eTsRApUy{&Kv4 z_SY#=S3!gD63F3J-Xkp2_|(RO>Y#l#d+#9mw6DmPyc-P2h>^9hZhn-btz0xPr&8@x zmHpVSVdWG@gV=DLZ$?Nfd>~udUae7VV}>--K(UNxQBBXeWi2*0tT^CfB-j!j(_qTD z?uxr)d5SqyQvAo8dR8up9-oGu6TXt-&*`>8^dEG4=19|fo2^;XJ>UAYA#A1<JPYn- z38)>idemRM6eAPxWUlDB#?kflGL@O&A8H2_vGQ;&LnA|lLaryThPj&Lo`lS;u$<tT zid<~)H4>t<tKK&Av@1C`7DCoZa2w1jNvNuZpUd4&r2I;|tN3eP5g74l;479+9t_Ed zG0GD$E{Iry<EGj}it-ZdO1o|=AtWqDl=LgFMm<zqJZ@$A3G1UNh{1{|y|&O3=$p6w zAn8p<ui#mx9o79jTe`M0GD^VI%U0@xlhwL8iNx2^FR|>?BE^i_iZQC^cX!`?Gu{;G zYdbFAQg>kyyE0+CVbnrgboXV(S+B;<BK|%;I&y4ZVDy?=!RV4pc+F?a4Hq9zc!C{+ zYl+|P=fm%_;LXY1ouo5aIk7Fba^j5p`KR=RxtsVLI-k+>RWyejzeN@+i#>52=IE>Y zV%Ky#-l-t7*_EJb&^z{g-pAIbad+)(IXlU?aelP!q;Xwc@AsvGn{-T=%V`xX0&1c; z9o7w)0u0PdVtlZ&{4rc-*$ZdXLS{B{&YDlC*!o_|kUrzBfICKWUTg*#_k$D-ZBsdq z6N4gMq^<PfK8(+d7Z7<)v2^{`?Pu?VZ}5p&au%hqxWw>M#@17(tzqWTyvr#h_AGv@ zh7{QwX{_BuUqhLi*UCc{=+PIy@I<LG^pG}i$@RXt_tbUxH{7ih5lfivjs;ncskg#! zv1n$85;@!xYk{NOi>BRV@lgFI$acOWL(eWfCe6taRRjH$r^vnoA{OD}ry9Ro-!6)n zk%kX8t&dzvZfnF5JtIYsKP{ubt$)_rCL^<hKd!-cd+FV>;0gBB=pF7DZ#I25C5zb0 zHR5a>SA<0eu1yw5YtBfY5)EWBofNGsKUDZMcGCStHzUSz(6QWxS7xfvm(TGOAba>i z%ge?xdKg?x{@Zq}RmGBN9AQzpH^C`9<+|9wq?Vvs1*fi8^2pk!cUrHp4GQNA7?yX8 zFE&QIe$?`lQ+pjVRSefyn$ug494sxuevfneh?z`m^6@>=HTg5K&Te>zHP!QnSAWhp z+X<_4dN7IR`R?eFluWUrB+ioxxK6Ej3*nZIk5|)D_dGHw^0j{cZQk{3y;<L!*%@pS z>7=vmZL?K^Vp~x*F@<UBAj@%Cnjy6DkmHWmPBodK&zWtQQwCO3Dvxe3o%1p*6^dFm zt>k84D68OT5($WOn&1MO+^SEd%H^-kB{gPzQI>hEA{(B9@}6u!*k12#u0Wfym7OeS zS(!l9mWQ(0{yY>O%>J&|$8MVouB+nX-FdDbY!Y!+D`-LR-RbnrD5@+BaYhcQli`*2 z-z6pmC>s^$R0`<0MjZt&Q+z@mxt#SJr0g*>I_I8T>WP%TxPGfUqT5Gh@grbT2&d)s z#_Wq_v*9ip^+HrA>x!)pc>CFNOF7?3bzSUpxyrvZlCWfjNiC^LuxI4I3Uh4933=XE z92(VPro>WfXM8SjI4rPxUUA;YkUJ!My|P?=<K=39XqJSYaRsdR2$8C+ZrmYf_+HLC zUixL1j;S6lU81FnGWJ|Rpo8>7+p)9hZld_JSKTMhprm!#iw-f@u6YiYw$|im1btkW znEa8aBlS6A@olz%gYdT=T3Qg{k2>?FqJ#TPjCAstZFg?W)p=InrC;bYauhYnI$>*S zAo0dAR!4QS&I{;Dp}p_!%jRh0m%sL{a_B8*=Wj3<4IG<_SyrwspFBzLy^6tX{&+FE z`={Jg7hP}|VkGIDwlElTYBi7|31l=(l=yv(s*?N~AfYadtuvVYlz7RU@@6As!yt@V zxrLH;ZM1kHBEj|MP4!bcXWq3J$EU;%_^7t&q?{ZdiLeT3h@_zl_;%C%c~?{|Imwjr z+NC%mim;v`p>)ea;vKddwl92SBoUR$?K--<k0pyQIlAAZ)~#F;?Yqm~>!Jp~gjSXG zYR!B$wl}gb$4jX((HYTTP`9-c{+MdXwY(X>LC4T`mbm)}x&XzjsXF?=!jw?T>x_`b zde6B9!z8-q{<JJi5z~=?5DkU(hq-KFlA^}w6V5YOMc1##<&>&8S&kp1B`Jf~haB%l z94jK2T2aP2|561;J?fm3z8w#dykEhxNV~S8wDP{IRlS*wx1<Ikm~v8TjJ3F}yKadL zTOKsZz)ihA)hFHNqO>l&P(33(;(x4Z%efuG9q7FGRjApX4i|f=-=NB<a9ziC{u<E; z;p0B>4JCLrTN%%)hv+X16wfY6irpJXIz5u6KzQ5SKiOFLwJ1KLE3?0Y!S>eRn25}` z)U<7Y#;+Xb@+Z|JyDp6u8nQ>x^@o&`*St3eUN14`T+2XIh^lFgtK}$I)5DYps)N*W z3`r?cUg(@S6`bl0l=S8Gm+9j*l~uUDGRCRU?p&-6JKw7JyvX#j)lYAUT^}f|-qOAR zUv@d+`b2y^H(NoGL3{@KDP{T5sRPlI<0AdOho;7(-T2$5dKx%cJCQp5{T<Ew&Uej~ z-tJaCr{fGN!tG5oJ-~y~vTGW4or{i(l{m_hAqig`Ka!(ky{la_=&TDvg0SaT{1sSR z=a_xJMbJBOHrvHyy!1uJNcP6Qv~w*&ta9(Ay1m~zOd_XdsV-iOd{dM3WM0t~@c@p` zC5a&lCdfzg3-96N!8Yp@&%U0*kVWsF)F=K<J*jL3g|hBaBS3z6o%yTIENI?p;&kYg zwxyAs9K1O+>;J|{C^Ix;xh}Hkvm%!T;_kVLe3smJf$_(Bx40q{U8QWCktJ5jad}N$ zlZ`!Y{n;nF&SVufN!T}ry@*_N-t6AUB^OR&s72MQcjy*_yG^|bme<JoAKjWZd`4I0 z3zqHwT+~J6*s@wSSWFRJpS$*OwZqyX<y@z|Zc<L<OX#v<iWKFZRFK=HK~cMhmLD>x zG&H;8jT0;@)LM)n%KsLdNqJYXfGKm<l(!TfeE?@!@@&8S_*wER>G{_={NYoStkTX~ zil16!u`kyp8=W*6ZO<f|jgygM^HTWC`#<rpIp^N97f6swr|z^Q_KwfrB8A%TGZnxF z*EBh(yNoYd8wL|>iPw@VyTdCHHqBVd_`J2PYxK!zIh5j1DpN0ws&08=b;nNr^N5c6 z?u)9p3)#uo3wp{w%vlEsn2u|0-SGyklzx@sG#k0=T2dgo@v#g}Xj~fo!aAj|_5ZYY z_5V!o@4v)BIwVrb&FR#qI^`xs?ne@b+#aRei^dM-Za6kdt4`{;`<$a9HqweDQe$q% zq*P?AF>J<WN82!)vvN1|d1veKJ>SPiJO99EKW=-yZ?3!7>$<MzbzQS28kMW{pa9O` zhyqH}AmU_}hg;+hnuhWLeO{qG{IX~CNmt=Ky!G@zkO*&3bk%Htmwu%)B2GJ_G0wM; z2gNThI0HF8*Goy#M8JXZXKeS_2daLZ=5TpBCQ)6tptZJG$Kp5hu8l@Va|$)0nxG>W zzbVJm-hx)>VQX6gTc5(5yF03r8u5`AD)H^&Q15)UEaKk}17PlhHP^_vbUP~{=b?|A zjh!8Q=^0l3l14W-c!%aA!vM75edV*oUI%^Z>R`hW{781<tGU}Bvi7Q|nMEKZEt1x> z&oKuCHMXt|>nX1&qH{v%(<D!PsYxF+GDtqoSF|);1KA0y!)MT!moMC@G<iuvJf{w@ zD<=)N9Gf)4hc#erUOgL?sIDL$$nT=N`+eW-`(;+a9W(*cD?It=p{uvZz|hd^<Uu{! z{1E&4A{7tmG9fiQ(sz}o(VRuF*&;MB0R-~(QHZtxG^a@8-VViLP|MM*qIg$)8f%MV z5JIL+eUU37pC=vFrVJT~>Op%EKQYJZakVpDEfn7}6cK|%)%XzM?>3(h+eCtMu=cP| zqAtk)YUaJDjoiML;ll+&e>lFpvN8x~GU$IM>lvlEaH77Uaw;#o0q;gKoou<daVN~6 zY8*&7KH*_kYk<C%BNBWg<F3?o^RAn&AI!31-mRq|5E}=@@R_}y=%~=!+nb`Ig*Yfb zOYQN#hJn0{j;$|7l3a^<Z!8T>__^+{ZN=`FjLc+kcf;-L@VwT=JjbVQL6(i)^vWkt z8vIt&yGQjd6z5Ld?YFG1i`;x#-i9(^fyLr)DZ<$zf1aYFT0wx6^n2abWZ!wPENpR} zYK-Ve{8&Khn{x=-F_cZi$z7#hf{X@YPS^0_TYxT`L1j%j7b+=3bzQfpB<3QhSCV%S zxF9u#eLA8;-YwsTKtICMgtX`WSX3x~ms8>`I5EFYpH8LW5;Ix;`1z;(13mYq^&$~5 zMUD(e8+VPA#TS8ORLT`;+#Ld3YkN1P_cfCU$O@@d3!Y|!C!Qa=H9e^x^E|7TIudV5 zIg2av%UKwuAnL15zeu`p7!xyX4y`hxh!c17I<oIQx@TjArLoPXkKQ*pZ-=D3y;tR0 z{K{QkIBkJ6c1?l9&CirBzk@@vyql-_UbE;0L}`ZwlHi$JBke4<O~zfN<7Tp}uFV5z zDLpj{|DLclXJ!0#XbEOJ_HlHsVGxPpOG|p(@9RzLzpp}>V^$#X%S)C|>fSB%&{s#0 z30CB0Sq6r1Vp%0ld8(%DTWt$0ezCmz1MkUB{S;Q|Gi-X+7;0iEl>T$u0;+X*7&_;2 zLYj$DXf7piO9~bqJ4`*udE$x*@0%+i)eP=j7GY8Zkk&~C8OR*lhZ0}@w9F`339PS; zp0I+a7IPXb<=y^lAZv=FOh@GcO~($~nO5YQ&loFbKOx^**^paV9HAZ>!M)fENhrdF zStA>{;U2%-hJ6@$`JKC&Z>-su6#H7vy9z)mV&*!RVho_HalhijjP++7KCN&ld36=j z5I+-FAxO(A;w3aIDfQi~;CTkqy&%QtiWm+i;3?|08#@xyEW=^v2_59?%BOUdG+#bT zVdrc5`Oyr@4E8nAO%K#9iog^!*p;uH+h>i$Sa11utwWFG;rPcGTx9+q^*)(TcA+Zu zi1(sd&mBKeIQ?F~MmX(MqwzeUCFFKTsC{9Rb}=|*X;06ytK!*~ghE9vVz<@8&D(9L z^s*m5rn~P!P*G4?5kwt3hr>VUM5T+mE>*5vJbEEKFg#+|??^xV0rlE%d!;C$>9*v+ z>e4-sMJ=zpVN~A0;3T3eK76Rvru|-8Yg6llUZX~B2Dp>ZzML_Jk!R<#I5HOE7=^sX z;6}F9Z2T)NS{s@ZV~t7jeUMmM+Pwl=^!St?8M$P9A?-Bnq2Gt>8>IkI6x+Y_n_5Hh z2%;^?fw5s*8Fwz*lA~K0UKC9ezavpsZ+L^DOOG0g+Y$S$zvI%=s3v%kTH@u;)D^fY zWgdDf!e`#xWx*w1#Pb8ZCLdy_KF$rDWHJHi+Trc1=cUr&pD|)Yig0H@<i@1M29_19 z4BsA}1`6*S$nPtN2)gQJaJMnjILrq)oOk+mI}8|;SElPW+fi*I^;en82vz*NS)ZYY zSnVDpBi`W>DW%;7!=@Wm1~TDw5gnUC>0tW35EmR(&CC~R_5~5MmV^e$=;sS-u$pm2 zpdJXdbG<fveCV%Di>Za!n^aG)S8kC#*xJSobQsr3WaqTc=m+s>rcfs5TQ#WLADVs% z;X62Y9{C-ETAa-jot&8|Fq-qGhcqCnAN!rkd~<YGHv1pYaE3^Y*Kn#&)^_*eGC)bj z-{PZ(nt!QzY-#Mb1NYb!>e$Jq?gpo@g_LhEyTvS<27k^yr0OAIa%q9b!Pygf$E_;* z+0XkDYmTaDZ_ugI2ZD8zNBYs=0Db^kFk3<(;WE6X2;nb#52eTIq($t;k=f;d;Ygzd zHjUOod??z5M%KLGgSTL*KL$p^{3p!MamM_$B{a<0W~Tni=US5T+a{xVW?X1*do7qA zns@=%h<(h%%Nqo@`Y<4)_Fo&^4cH8V<yJHGMsr?*qj6b}SD{1CiVHreHS!7ACnbtv zlwclKWAiVkgxD&!t7R5WoNfSJBmAIR2;R?rF$p>}!-Zujy6M7}oSZInG-6S8b4AI> z2QCbbr~hx#&SJidn;zXvnAWbl0K+W`X1E{I_wlVowdC*d5h>wmQx0@48M=ugX@h2U zl5sVYc(_m48_}hxdt~-3FN6Z{Ht3X9!XFtIkr=sjY1q}6V~qPA#5ScJKche2%#ZU> ze{=xyE!<MS9%7SPZQa9M+-D#pTy6ZK)yZ}%VLKS+{b6Y(Wp80oZ$o}vy%`EI)?n~n z)eND2CqxP>=e`r%7j%!kaAbrVoq_7$Gmb3>8<p09nz7c?CH+Mf{C3tU3I9}-^sZQ_ z48)w7l1~MGIL=yhz7W3LSz8_|I-i5vsHHtllG5K<P$Y+Ix6H9-ZJ7mn?u@6E(z|bL zV;w!HY^tLp>V1^XPL1ke!jh+4Cd4l$+LpZkA#CK}pz=p6ww8`&)7dzS?X1#{eSuMh zU254y3J@t%tq8P@C__DAbFb%q6w6<yi1qREk1-<C$i!7j2=o=TRAy=}5n)xFo8}tf zM%tNAy;w)wN&(00!zTOV(nP_V!TdL|oNfBtD#P4S7)`ad;D#)bI@2w6O$W-u=LL-i zByq*Pu?UZ{U*o8+*-`H3$hahOTl`YrOlEEYTip!t&HWN7J5G$Dpx%S{R2cA0l7`SN zfIR*5P5fv`wtPi#pul(1YI&0cdOBJ~(5ivIsYrfnk)c3JsJ404w~(0|)B`k}*yJMh zEdm)!=L*61Ax5A2On60CtMl3SRiB*sPy|G*)gP~lvF_<$?b~qofrUYs-;4CpE6eaw z;t_uV0+8P$cMC3mIeGo}-T+{LiMshiIcoZp{KhhRuBrwMZRITK6)jMer7+Q6RX?lh z7AWJ`1smP&EFpn1a@lMhTe6fMfC8QZ%H}mTQ;pZ%IyF+M?0$__IQQr88^xSL&KXp1 z9W)<D&4nDVxV8*GBUh#ue?Kg3#ZxcVSZ_)St~eDyu`BZRF!m{tdQI3d2QnsMj*{F5 zk#uAw_$g>9aZ&N0!rx0yvsN@KE_-Pp?uMmhjjuyu9;EM<qE{;43l1aE;7kZC3+zN0 zhFE0$^?ot@&d?q)-wD2qlFh`%l|EK?eXj#+WpU?;G6Tfj=(H@J9TEfG_65Mamam{| z&j8z*i&XD*C(d>~n?SxdRUNhBo0_X-ta`l2JT)_uABFMZhr&SH)u^075I^g=(Q@uA zZou5?7J+nbrvx^<CJ%v&kK38hNF`S$p?Trsy90FpjA;X}S^y*;*p`hswrr-L2f4oI zymj*k^M+iuGL0i8(>`x2BY)gBys3ltx|ft#mp+9i-2kVsj3qY3&@eWB6X!=Jv$yB> zW8w8R?UOpi{tQliPM|c}0;O_GFv_HrmMTJ^rL1C&xaO{vl;DOIZ}chKlH-TjNaU+4 zAeBuZa!}_C%&g@)ffT2Um!fpKE{rxpPli8##;g}Z<j$WmjGx^rInsN}<h+)()|!I9 zIA1|do?y1K6H>#F7#0X2#Z-Xq5->6#!=&Z1f29+Xs><}|Le4~rO|ig0j(GE<xitY+ zDp!nzFE;1|+A}!SSvt~Q+8`EpsK*CQ%-w`29!T=upSvp8NURcSccz!y1n<g;NR%*u z7QHXFhLR`+DJ-BXrus2aLfJoBnp)3q6aSNVK(HcnBHe(GI)=er1H74PDc;Qdv|LLi zgH)atAmd!-T>iP#7|Hix&=fbL7wbN30j_}ihbw&NAqNT*ybh9#&J|cIG@tK%xS*(I zq9~d1{@;e>^EU_Aw_&zkKQ1N{5dUm;=zSQ_{7*NFwY3#+)@6oCmUYVo9)a{306nvu zq{Tcpn|a!<<J#{BOEh*!Zshymnid5lruKU1*BP~5#$A20J>q-RImx;rLW+V04}A){ z+00@O2EC@%N&c!PC!15G5H8u+s#AK7VP*$*{{vb{q50A!0ZHj@fw(v+^$;><*LmYy zC9Uq&u_|kzZN;>0uD-PHozjLvaeZ&<2ANS`0>t$|Y>h^o6zQ>L+>*VT6R1c%y!y-x zZH3gyU6?x_3<#xK3hcm^kp(OpQ5bn9UM438`sp<!Y>Qce$<)_t-Tn?<i3KV=Is0?m zq)}c>#?KTE0}AkbR)+}w{Tg4Pg(FbKoc$L^%8~zX{%SDLoaKKH{Xa_o9|iuOgavEN Ze>y2!`Nk>l1%4gyaXR5<Uu743`9F(xoKXM( literal 0 HcmV?d00001 diff --git a/docs/discover/search-sessions.asciidoc b/docs/discover/search-sessions.asciidoc new file mode 100644 index 0000000000000..0673b9b8f6562 --- /dev/null +++ b/docs/discover/search-sessions.asciidoc @@ -0,0 +1,72 @@ +[[search-sessions]] +=== Run a search session in the background + +Sometimes you might need to search through large amounts of data no matter +how long the search takes. While this might not happen often, +there are times that long-running queries are required. +Consider a threat hunting scenario, where you need to search through years of data. + +If your query is running long, you can save your search session, which +allows {kib} to continue processing your request in the +background. Save your search session from *Discover* or *Dashboard*, +and when your session is complete, view and manage it in *Stack Management*. + +[role="screenshot"] +image::images/search-session.png[Search Session indicator displaying the current state of the search, which you can click to stop or save a running Search Session ] + +Search sessions are <<search-session-settings-kb,enabled by default>>. Saving +a search session is only available when +<<set-time-filter,auto refresh>> is off. + + +[float] +==== Requirements + + +* To save a session, you must have permissions for *Discover* and *Dashboard*, +and the <<kibana-feature-privileges, search sessions subfeature>>. + +* To view and restore a saved session, you must have access to *Stack Management*. + +[float] +==== Example: Save a search session + +You’re trying to understand a trend you see on a dashboard. You +need to look at several years of data, currently in +{ref}/data-tiers.html#cold-tier[cold storage], +but you don’t have time to wait. You want {kib} to +continue working in the background, so tomorrow you can +open your browser and pick up where you left off. + +. Load your dashboard. ++ +Your search session begins automatically. The icon after the dashboard title +displays the current state of the search session. A clock indicates the search session is in progress. +A checkmark indicates that the search session is complete. + +. To instruct {kib} to continue a search in the background, click the clock icon, +and then click *Save session*. Once you save a search session, you can start a new search, +navigate to a different application, or close the browser. ++ +[role="screenshot"] +image::images/search-session-awhile.png[Search Session indicator displaying the current state of the search, which you can click to stop or save a running Search Session ] + +. To view your saved searches, open the main menu, and then click +*Stack Management > Search Sessions*. You can also open this view from the search sessions popup for a saved or completed session. ++ +[role="screenshot"] +image::images/search-sessions-menu.png[Search Sessions management view with actions for inspecting, extending, and deleting a session. ] + +. Use the edit menu in *Search Sessions* to: +* *Inspect* the queries and filters that makeup the session. +* *Extend* the expiration of a completed session. +* *Delete* a session. + +. To restore a search session, click its name in the *Search Sessions* view. ++ +You're returned to the place from where you started the search session. The data is the same, but +behaves differently: ++ +* Relative dates are converted to absolute dates. +* Panning and zooming is disabled for maps. +* Changing a filter, query, or drilldown starts a new search session, which can be slow. diff --git a/docs/discover/search.asciidoc b/docs/discover/search.asciidoc index e8faccd50661a..9971a6f574f9c 100644 --- a/docs/discover/search.asciidoc +++ b/docs/discover/search.asciidoc @@ -1,13 +1,15 @@ [[search]] -== Search data -Many Kibana apps embed a query bar for real-time search, including -*Discover* and *Dashboard*. +== Search your data + +You can search your data in any app that has a query bar, or by clicking on +elements in a visualization. A search matches indices in the current +<<index-patterns, index pattern>> and in the current <<set-time-filter,time frame>>. + [float] -=== Search your data +=== Search with KQL -To search the indices that match the current <<index-patterns, index pattern>>, -enter your search criteria in the query bar. By default, you'll use +By default, you search using {kib}'s <<kuery-query, standard query language>> (KQL), which features autocomplete and a simple, easy-to-use syntax. If you prefer to use {kib}'s legacy query @@ -21,32 +23,17 @@ JSON-based {ref}/query-dsl.html[Elasticsearch Query DSL]. [float] [[autorefresh]] === Refresh search results -As more documents are added to the indices you're searching, the search results -shown in *Discover*, and used to display visualizations, get stale. Using the -time filter, you can +As more documents are added to the indices you're searching, the search results get stale. +Using the time filter, you can configure a refresh interval to periodically resubmit your searches to retrieve the latest results. [role="screenshot"] -image::images/autorefresh-interval.png[Image showing what refresh interval option looks like. The configurable time interval is located in the dropdown] +image::images/autorefresh-interval.png[Refresh interval option in time filter. The configurable time interval is located in the dropdown.] You can also manually refresh the search results by clicking the *Refresh* button. -[float] -=== Searching large amounts of data - -Sometimes you want to search through large amounts of data no matter how long -the search takes. While this might not happen often, there are times -that long-running queries are required. Consider a threat hunting scenario -where you need to search through years of data. - -If you run a query, and the run time gets close to the -timeout, you're presented the option to ignore the timeout. This enables you to -run queries with large amounts of data to completion. - -By default, a query times out after 30 seconds. -The timeout is in place to avoid unintentional load on the cluster. include::kuery.asciidoc[] @@ -211,3 +198,5 @@ To completely delete a query: image::discover/images/saved-query-management-component-delete-query-button.png["Example of the saved query management popover when a query is hovered over and we are about to delete a query",width="80%"] You can import, export, and delete saved queries from <<managing-saved-objects, Saved Objects in Management>>. + +include::search-sessions.asciidoc[] diff --git a/docs/settings/search-sessions-settings.asciidoc b/docs/settings/search-sessions-settings.asciidoc new file mode 100644 index 0000000000000..c9a9e709ac7f8 --- /dev/null +++ b/docs/settings/search-sessions-settings.asciidoc @@ -0,0 +1,25 @@ + +[[search-session-settings-kb]] +=== Search sessions settings in {kib} +++++ +<titleabbrev>Search sessions settings</titleabbrev> +++++ + +Configure the search session settings in your `kibana.yml` configuration file. + + +[cols="2*<"] +|=== +a| `xpack.data_enhanced.` +`search.sessions:enabled` + | Set to `true` (default) to enable search sessions. + +a| `xpack.data.enhanced.` +`search.sessions:trackingInterval` + | The frequency for updating the state of a search session. The default is 10s. + +a| `xpack.data.enhanced.` +`search.sessions:defaultExpiration` + | How long search session results are stored before they are deleted. + Extending a search session resets the expiration by the same value. The default is 7d. +|=== diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index a28a52834db39..62e0f0847cbac 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -227,7 +227,7 @@ The default application to load. *Default: `"home"`* for more details. {kib} uses an index in {es} to store saved searches, visualizations, and dashboards. {kib} creates a new index if the index doesn’t already exist. If you configure a custom index, the name must be lowercase, and conform to the -{es} {ref}/indices-create-index.html[index name limitations]. +{es} {ref}/indices-create-index.html[index name limitations]. *Default: `".kibana"`* | `kibana.autocompleteTimeout:` {ess-icon} @@ -696,6 +696,7 @@ include::{kib-repo-dir}/settings/ml-settings.asciidoc[] include::{kib-repo-dir}/settings/monitoring-settings.asciidoc[] include::{kib-repo-dir}/settings/reporting-settings.asciidoc[] include::secure-settings.asciidoc[] +include::{kib-repo-dir}/settings/search-sessions-settings.asciidoc[] include::{kib-repo-dir}/settings/security-settings.asciidoc[] include::{kib-repo-dir}/settings/spaces-settings.asciidoc[] include::{kib-repo-dir}/settings/task-manager-settings.asciidoc[] diff --git a/docs/user/management.asciidoc b/docs/user/management.asciidoc index 5644cdbfc45ec..7c73a80362eb6 100644 --- a/docs/user/management.asciidoc +++ b/docs/user/management.asciidoc @@ -141,6 +141,12 @@ These include dashboards, visualizations, maps, index patterns, Canvas workpads, | <<managing-tags, Tags>> |Create, manage, and assign tags to your saved objects. +| <<search-sessions, Search Sessions>> +| Manage your saved search sessions, groups of queries that run in the background. +Search sessions are useful when your queries take longer than usual to process, +for example, when you have a large volume of data or when the performance of your storage location is slow. + + | <<xpack-spaces, Spaces>> | Create spaces to organize your dashboards and other saved objects into categories. A space is isolated from all other spaces, From 9ad1b49766e54cf4195128b32a97e2d4b5f81358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= <davidsansol92@gmail.com> Date: Mon, 22 Mar 2021 17:55:20 +0100 Subject: [PATCH 27/52] [SECURITY_SOLUTION] Adds hash validation on UI for trusted app (#94958) * Adds hash validation on UI. Display as many error messages as they are instead of displaying just the first one on entry fields. Updates related unit test * Fixes failing test and added new test case Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../create_trusted_app_form.test.tsx | 23 +++++++++++++++-- .../components/create_trusted_app_form.tsx | 18 ++++++++++--- .../view/trusted_apps_page.test.tsx | 25 ++++++++++++++++++- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx index 7d056ae6999e7..24797bb483bdb 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx @@ -267,6 +267,11 @@ describe('When showing the Trusted App Create Form', () => { expect(renderResult.getByText('Name is required')); }); + it('should validate invalid Hash value', () => { + setTextFieldValue(getConditionValue(getCondition(renderResult)), 'someHASH'); + expect(renderResult.getByText('[1] Invalid hash value')); + }); + it('should validate that a condition value has a non empty space value', () => { setTextFieldValue(getConditionValue(getCondition(renderResult)), ' '); expect(renderResult.getByText('[1] Field entry must have a value')); @@ -281,13 +286,27 @@ describe('When showing the Trusted App Create Form', () => { setTextFieldValue(getConditionValue(getCondition(renderResult)), 'someHASH'); expect(renderResult.getByText('[2] Field entry must have a value')); }); + + it('should validate multiple errors in form', () => { + const andButton = getConditionBuilderAndButton(renderResult); + reactTestingLibrary.act(() => { + fireEvent.click(andButton, { button: 1 }); + }); + + setTextFieldValue(getConditionValue(getCondition(renderResult)), 'someHASH'); + expect(renderResult.getByText('[1] Invalid hash value')); + expect(renderResult.getByText('[2] Field entry must have a value')); + }); }); describe('and all required data passes validation', () => { it('should call change callback with isValid set to true and contain the new item', () => { const renderResult = render(); setTextFieldValue(getNameField(renderResult), 'Some Process'); - setTextFieldValue(getConditionValue(getCondition(renderResult)), 'someHASH'); + setTextFieldValue( + getConditionValue(getCondition(renderResult)), + 'e50fb1a0e5fff590ece385082edc6c41' + ); setTextFieldValue(getDescriptionField(renderResult), 'some description'); expect(getAllValidationErrors(renderResult)).toHaveLength(0); @@ -300,7 +319,7 @@ describe('When showing the Trusted App Create Form', () => { field: ConditionEntryField.HASH, operator: 'included', type: 'match', - value: 'someHASH', + value: 'e50fb1a0e5fff590ece385082edc6c41', }, ], name: 'Some Process', diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx index f4344796fc562..f99c3567e7912 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx @@ -17,10 +17,13 @@ import { import { i18n } from '@kbn/i18n'; import { EuiFormProps } from '@elastic/eui/src/components/form/form'; import { + ConditionEntryField, MacosLinuxConditionEntry, NewTrustedApp, OperatingSystem, } from '../../../../../../common/endpoint/types'; +import { isValidHash } from '../../../../../../common/endpoint/validation/trusted_apps'; + import { isMacosLinuxTrustedAppCondition, isWindowsTrustedAppCondition, @@ -113,7 +116,7 @@ const validateFormValues = (values: NewTrustedApp): ValidationResult => { }) ); } else { - values.entries.some((entry, index) => { + values.entries.forEach((entry, index) => { if (!entry.field || !entry.value.trim()) { isValid = false; addResultToValidation( @@ -128,9 +131,18 @@ const validateFormValues = (values: NewTrustedApp): ValidationResult => { } ) ); - return true; + } else if (entry.field === ConditionEntryField.HASH && !isValidHash(entry.value)) { + isValid = false; + addResultToValidation( + validation, + 'entries', + 'errors', + i18n.translate('xpack.securitySolution.trustedapps.create.conditionFieldInvalidHashMsg', { + defaultMessage: '[{row}] Invalid hash value', + values: { row: index + 1 }, + }) + ); } - return false; }); } diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx index 69c7616b502c8..d891731f6d768 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx @@ -201,7 +201,7 @@ describe('When on the Trusted Apps Page', () => { fireEvent.change( getByTestId('addTrustedAppFlyout-createForm-conditionsBuilder-group1-entry0-value'), - { target: { value: 'SOME$HASH#HERE' } } + { target: { value: '44ed10b389dbcd1cf16cec79d16d7378' } } ); fireEvent.change(getByTestId('addTrustedAppFlyout-createForm-descriptionField'), { @@ -363,6 +363,29 @@ describe('When on the Trusted Apps Page', () => { }); }); }); + + describe('and when the form data is not valid', () => { + it('should not enable the Flyout Add button with an invalid hash', async () => { + const renderResult = await renderAndClickAddButton(); + const { getByTestId } = renderResult; + + reactTestingLibrary.act(() => { + fireEvent.change(getByTestId('addTrustedAppFlyout-createForm-nameTextField'), { + target: { value: 'trusted app A' }, + }); + + fireEvent.change( + getByTestId('addTrustedAppFlyout-createForm-conditionsBuilder-group1-entry0-value'), + { target: { value: 'invalid hash' } } + ); + }); + + const flyoutAddButton = getByTestId( + 'addTrustedAppFlyout-createButton' + ) as HTMLButtonElement; + expect(flyoutAddButton.disabled).toBe(true); + }); + }); }); describe('and there are no trusted apps', () => { From 2e3f333f6843d0b3067c277bc33f5f6b18ba589c Mon Sep 17 00:00:00 2001 From: Spencer <email@spalger.com> Date: Mon, 22 Mar 2021 10:31:52 -0700 Subject: [PATCH 28/52] [uiSettings/theme] restrict theme options based on KBN_OPTIMIZER_THEMES (#94834) Co-authored-by: spalger <spalger@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/core/server/ui_settings/settings/index.ts | 10 +++- .../server/ui_settings/settings/theme.test.ts | 54 +++++++++++++++++++ src/core/server/ui_settings/settings/theme.ts | 49 ++++++++++++++--- .../server/ui_settings/ui_settings_service.ts | 8 ++- 4 files changed, 112 insertions(+), 9 deletions(-) diff --git a/src/core/server/ui_settings/settings/index.ts b/src/core/server/ui_settings/settings/index.ts index 494ab2e01e7c7..944ada3a63e4f 100644 --- a/src/core/server/ui_settings/settings/index.ts +++ b/src/core/server/ui_settings/settings/index.ts @@ -15,14 +15,20 @@ import { getNotificationsSettings } from './notifications'; import { getThemeSettings } from './theme'; import { getStateSettings } from './state'; -export const getCoreSettings = (): Record<string, UiSettingsParams> => { +interface GetCoreSettingsOptions { + isDist?: boolean; +} + +export const getCoreSettings = ( + options?: GetCoreSettingsOptions +): Record<string, UiSettingsParams> => { return { ...getAccessibilitySettings(), ...getDateFormatSettings(), ...getMiscUiSettings(), ...getNavigationSettings(), ...getNotificationsSettings(), - ...getThemeSettings(), + ...getThemeSettings(options), ...getStateSettings(), }; }; diff --git a/src/core/server/ui_settings/settings/theme.test.ts b/src/core/server/ui_settings/settings/theme.test.ts index f0ca4f1eff4cd..58cbffb255b53 100644 --- a/src/core/server/ui_settings/settings/theme.test.ts +++ b/src/core/server/ui_settings/settings/theme.test.ts @@ -44,3 +44,57 @@ describe('theme settings', () => { }); }); }); + +describe('process.env.KBN_OPTIMIZER_THEMES handling', () => { + it('provides valid options based on tags', () => { + process.env.KBN_OPTIMIZER_THEMES = 'v7light,v8dark'; + let settings = getThemeSettings({ isDist: false }); + expect(settings['theme:version'].options).toEqual(['v7', 'v8']); + + process.env.KBN_OPTIMIZER_THEMES = 'v8dark,v7light'; + settings = getThemeSettings({ isDist: false }); + expect(settings['theme:version'].options).toEqual(['v7', 'v8']); + + process.env.KBN_OPTIMIZER_THEMES = 'v8dark,v7light,v7dark,v8light'; + settings = getThemeSettings({ isDist: false }); + expect(settings['theme:version'].options).toEqual(['v7', 'v8']); + + process.env.KBN_OPTIMIZER_THEMES = '*'; + settings = getThemeSettings({ isDist: false }); + expect(settings['theme:version'].options).toEqual(['v7', 'v8']); + + process.env.KBN_OPTIMIZER_THEMES = 'v7light'; + settings = getThemeSettings({ isDist: false }); + expect(settings['theme:version'].options).toEqual(['v7']); + + process.env.KBN_OPTIMIZER_THEMES = 'v8light'; + settings = getThemeSettings({ isDist: false }); + expect(settings['theme:version'].options).toEqual(['v8']); + }); + + it('defaults to properties of first tag', () => { + process.env.KBN_OPTIMIZER_THEMES = 'v8dark,v7light'; + let settings = getThemeSettings({ isDist: false }); + expect(settings['theme:darkMode'].value).toBe(true); + expect(settings['theme:version'].value).toBe('v8'); + + process.env.KBN_OPTIMIZER_THEMES = 'v7light,v8dark'; + settings = getThemeSettings({ isDist: false }); + expect(settings['theme:darkMode'].value).toBe(false); + expect(settings['theme:version'].value).toBe('v7'); + }); + + it('ignores the value when isDist is undefined', () => { + process.env.KBN_OPTIMIZER_THEMES = 'v7light'; + const settings = getThemeSettings({ isDist: undefined }); + expect(settings['theme:darkMode'].value).toBe(false); + expect(settings['theme:version'].options).toEqual(['v7', 'v8']); + }); + + it('ignores the value when isDist is true', () => { + process.env.KBN_OPTIMIZER_THEMES = 'v7light'; + const settings = getThemeSettings({ isDist: true }); + expect(settings['theme:darkMode'].value).toBe(false); + expect(settings['theme:version'].options).toEqual(['v7', 'v8']); + }); +}); diff --git a/src/core/server/ui_settings/settings/theme.ts b/src/core/server/ui_settings/settings/theme.ts index 35b8f0217c114..cc2919f7555c2 100644 --- a/src/core/server/ui_settings/settings/theme.ts +++ b/src/core/server/ui_settings/settings/theme.ts @@ -6,17 +6,54 @@ * Side Public License, v 1. */ -import { schema } from '@kbn/config-schema'; +import { schema, Type } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; import { UiSettingsParams } from '../../../types'; -export const getThemeSettings = (): Record<string, UiSettingsParams> => { +function parseThemeTags() { + if (!process.env.KBN_OPTIMIZER_THEMES) { + return ['v8light', 'v8dark']; + } + + if (process.env.KBN_OPTIMIZER_THEMES === '*') { + return ['v8light', 'v8dark', 'v7light', 'v7dark']; + } + + return process.env.KBN_OPTIMIZER_THEMES.split(',').map((t) => t.trim()); +} + +function getThemeInfo(options: GetThemeSettingsOptions) { + if (options?.isDist ?? true) { + return { + defaultDarkMode: false, + defaultVersion: 'v8', + availableVersions: ['v7', 'v8'], + }; + } + + const themeTags = parseThemeTags(); + return { + defaultDarkMode: themeTags[0].endsWith('dark'), + defaultVersion: themeTags[0].slice(0, 2), + availableVersions: ['v7', 'v8'].filter((v) => themeTags.some((t) => t.startsWith(v))), + }; +} + +interface GetThemeSettingsOptions { + isDist?: boolean; +} + +export const getThemeSettings = ( + options: GetThemeSettingsOptions = {} +): Record<string, UiSettingsParams> => { + const { availableVersions, defaultDarkMode, defaultVersion } = getThemeInfo(options); + return { 'theme:darkMode': { name: i18n.translate('core.ui_settings.params.darkModeTitle', { defaultMessage: 'Dark mode', }), - value: false, + value: defaultDarkMode, description: i18n.translate('core.ui_settings.params.darkModeText', { defaultMessage: `Enable a dark mode for the Kibana UI. A page refresh is required for the setting to be applied.`, }), @@ -27,14 +64,14 @@ export const getThemeSettings = (): Record<string, UiSettingsParams> => { name: i18n.translate('core.ui_settings.params.themeVersionTitle', { defaultMessage: 'Theme version', }), - value: 'v8', + value: defaultVersion, type: 'select', - options: ['v7', 'v8'], + options: availableVersions, description: i18n.translate('core.ui_settings.params.themeVersionText', { defaultMessage: `Switch between the theme used for the current and next version of Kibana. A page refresh is required for the setting to be applied.`, }), requiresPageReload: true, - schema: schema.oneOf([schema.literal('v7'), schema.literal('v8')]), + schema: schema.oneOf(availableVersions.map((v) => schema.literal(v)) as [Type<string>]), }, }; }; diff --git a/src/core/server/ui_settings/ui_settings_service.ts b/src/core/server/ui_settings/ui_settings_service.ts index efa024e096599..93878d264541c 100644 --- a/src/core/server/ui_settings/ui_settings_service.ts +++ b/src/core/server/ui_settings/ui_settings_service.ts @@ -37,11 +37,13 @@ export class UiSettingsService implements CoreService<InternalUiSettingsServiceSetup, InternalUiSettingsServiceStart> { private readonly log: Logger; private readonly config$: Observable<UiSettingsConfigType>; + private readonly isDist: boolean; private readonly uiSettingsDefaults = new Map<string, UiSettingsParams>(); private overrides: Record<string, any> = {}; constructor(private readonly coreContext: CoreContext) { this.log = coreContext.logger.get('ui-settings-service'); + this.isDist = coreContext.env.packageInfo.dist; this.config$ = coreContext.configService.atPath<UiSettingsConfigType>(uiConfigDefinition.path); } @@ -50,7 +52,11 @@ export class UiSettingsService savedObjects.registerType(uiSettingsType); registerRoutes(http.createRouter('')); - this.register(getCoreSettings()); + this.register( + getCoreSettings({ + isDist: this.isDist, + }) + ); const config = await this.config$.pipe(first()).toPromise(); this.overrides = config.overrides; From 23cf913fcad1e16477dacb03b5d1f6c11c287da9 Mon Sep 17 00:00:00 2001 From: Dmitry <dzmitry.lemechko@elastic.co> Date: Mon, 22 Mar 2021 18:35:57 +0100 Subject: [PATCH 29/52] [dashboard/bwc_shared_urls] check viz are loaded (#94941) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- test/functional/apps/dashboard/bwc_shared_urls.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/functional/apps/dashboard/bwc_shared_urls.ts b/test/functional/apps/dashboard/bwc_shared_urls.ts index e9d892fcd3bcf..d40cf03327fd3 100644 --- a/test/functional/apps/dashboard/bwc_shared_urls.ts +++ b/test/functional/apps/dashboard/bwc_shared_urls.ts @@ -81,6 +81,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await pieChart.expectPieSliceCount(0); await dashboardExpect.panelCount(2); + await PageObjects.dashboard.waitForRenderComplete(); }); }); @@ -96,6 +97,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await pieChart.expectPieSliceCount(5); await dashboardExpect.panelCount(2); + await PageObjects.dashboard.waitForRenderComplete(); await dashboardExpect.selectedLegendColorCount('#F9D9F9', 5); }); @@ -115,6 +117,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await pieChart.expectPieSliceCount(5); await dashboardExpect.panelCount(2); + await PageObjects.dashboard.waitForRenderComplete(); await dashboardExpect.selectedLegendColorCount('#F9D9F9', 5); }); From f26b10cf635047ca34f57e40b07ec60161839455 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Mon, 22 Mar 2021 12:31:22 -0600 Subject: [PATCH 30/52] [Security Solution] [Cases] Add deprecation in cases plugin for rename (#94808) --- x-pack/plugins/cases/server/index.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/cases/server/index.ts b/x-pack/plugins/cases/server/index.ts index 9fdc62c0f4ab0..628a39ba77489 100644 --- a/x-pack/plugins/cases/server/index.ts +++ b/x-pack/plugins/cases/server/index.ts @@ -5,11 +5,16 @@ * 2.0. */ -import { PluginInitializerContext } from 'kibana/server'; -import { ConfigSchema } from './config'; +import { PluginConfigDescriptor, PluginInitializerContext } from 'kibana/server'; +import { ConfigType, ConfigSchema } from './config'; import { CasePlugin } from './plugin'; export { CaseRequestContext } from './types'; -export const config = { schema: ConfigSchema }; +export const config: PluginConfigDescriptor<ConfigType> = { + schema: ConfigSchema, + deprecations: ({ renameFromRoot }) => [ + renameFromRoot('xpack.case.enabled', 'xpack.cases.enabled'), + ], +}; export const plugin = (initializerContext: PluginInitializerContext) => new CasePlugin(initializerContext); From 2c44d56b82471aee1a30a6aefd0e01052c654f07 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Mon, 22 Mar 2021 17:04:58 -0600 Subject: [PATCH 31/52] [Security Solution] [Cases] Move configure cases component (#95096) --- .../components/configure_cases/index.tsx | 6 ++++-- .../cases/public/methods/get_all_cases.tsx | 19 +++++++++++++++++++ .../public/methods/get_configure_cases.tsx | 19 +++++++++++++++++++ .../public/{ => methods}/get_create_case.tsx | 4 ++-- x-pack/plugins/cases/public/plugin.ts | 12 ++++++++---- x-pack/plugins/cases/public/types.ts | 2 ++ .../public/cases/pages/configure_cases.tsx | 12 ++++++++++-- 7 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 x-pack/plugins/cases/public/methods/get_all_cases.tsx create mode 100644 x-pack/plugins/cases/public/methods/get_configure_cases.tsx rename x-pack/plugins/cases/public/{ => methods}/get_create_case.tsx (81%) diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index 3e352f119e840..99c1caf332018 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -50,11 +50,11 @@ const FormWrapper = styled.div` `} `; -interface ConfigureCasesComponentProps { +export interface ConfigureCasesProps { userCanCrud: boolean; } -const ConfigureCasesComponent: React.FC<ConfigureCasesComponentProps> = ({ userCanCrud }) => { +const ConfigureCasesComponent: React.FC<ConfigureCasesProps> = ({ userCanCrud }) => { const { triggersActionsUi } = useKibana().services; const [connectorIsValid, setConnectorIsValid] = useState(true); @@ -222,3 +222,5 @@ const ConfigureCasesComponent: React.FC<ConfigureCasesComponentProps> = ({ userC }; export const ConfigureCases = React.memo(ConfigureCasesComponent); +// eslint-disable-next-line import/no-default-export +export default ConfigureCases; diff --git a/x-pack/plugins/cases/public/methods/get_all_cases.tsx b/x-pack/plugins/cases/public/methods/get_all_cases.tsx new file mode 100644 index 0000000000000..836a8610fd9de --- /dev/null +++ b/x-pack/plugins/cases/public/methods/get_all_cases.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLoadingSpinner } from '@elastic/eui'; +import React, { lazy, Suspense } from 'react'; +import { AllCasesProps } from '../components/all_cases'; + +export const getAllCasesLazy = (props: AllCasesProps) => { + const AllCasesLazy = lazy(() => import('../components/all_cases')); + return ( + <Suspense fallback={<EuiLoadingSpinner />}> + <AllCasesLazy {...props} /> + </Suspense> + ); +}; diff --git a/x-pack/plugins/cases/public/methods/get_configure_cases.tsx b/x-pack/plugins/cases/public/methods/get_configure_cases.tsx new file mode 100644 index 0000000000000..fcea95a3e9ad4 --- /dev/null +++ b/x-pack/plugins/cases/public/methods/get_configure_cases.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLoadingSpinner } from '@elastic/eui'; +import React, { lazy, Suspense } from 'react'; +import { ConfigureCasesProps } from '../components/configure_cases'; + +export const getConfigureCasesLazy = (props: ConfigureCasesProps) => { + const ConfigureCasesLazy = lazy(() => import('../components/configure_cases')); + return ( + <Suspense fallback={<EuiLoadingSpinner />}> + <ConfigureCasesLazy {...props} /> + </Suspense> + ); +}; diff --git a/x-pack/plugins/cases/public/get_create_case.tsx b/x-pack/plugins/cases/public/methods/get_create_case.tsx similarity index 81% rename from x-pack/plugins/cases/public/get_create_case.tsx rename to x-pack/plugins/cases/public/methods/get_create_case.tsx index ec13d9ae9e305..60343ecac55fa 100644 --- a/x-pack/plugins/cases/public/get_create_case.tsx +++ b/x-pack/plugins/cases/public/methods/get_create_case.tsx @@ -7,10 +7,10 @@ import React, { lazy, Suspense } from 'react'; import { EuiLoadingSpinner } from '@elastic/eui'; -import { CreateCaseProps } from './components/create'; +import { CreateCaseProps } from '../components/create'; export const getCreateCaseLazy = (props: CreateCaseProps) => { - const CreateCaseLazy = lazy(() => import('./components/create')); + const CreateCaseLazy = lazy(() => import('../components/create')); return ( <Suspense fallback={<EuiLoadingSpinner />}> <CreateCaseLazy {...props} /> diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 1ee37e57f396f..6c57dd738f55b 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -7,8 +7,9 @@ import { CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; import { CasesUiStart, SetupPlugins, StartPlugins } from './types'; -import { getCreateCaseLazy } from './get_create_case'; -import { getAllCasesLazy } from './get_all_cases'; +import { getCreateCaseLazy } from './methods/get_create_case'; +import { getAllCasesLazy } from './methods/get_all_cases'; +import { getConfigureCasesLazy } from './methods/get_configure_cases'; import { KibanaServices } from './common/lib/kibana'; export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { @@ -22,11 +23,14 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S public start(core: CoreStart, plugins: StartPlugins): CasesUiStart { KibanaServices.init({ ...core, ...plugins, kibanaVersion: this.kibanaVersion }); return { + getAllCases: (props) => { + return getAllCasesLazy(props); + }, getCreateCase: (props) => { return getCreateCaseLazy(props); }, - getAllCases: (props) => { - return getAllCasesLazy(props); + getConfigureCases: (props) => { + return getConfigureCasesLazy(props); }, }; } diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index 8d9e89609c5fa..846e1555d9d79 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -14,6 +14,7 @@ import { } from '../../triggers_actions_ui/public'; import { AllCasesProps } from './components/all_cases'; import { CreateCaseProps } from './components/create'; +import { ConfigureCasesProps } from './components/configure_cases'; export interface SetupPlugins { security: SecurityPluginSetup; @@ -38,4 +39,5 @@ export type StartServices = CoreStart & export interface CasesUiStart { getAllCases: (props: AllCasesProps) => ReactElement<AllCasesProps>; getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; + getConfigureCases: (props: ConfigureCasesProps) => ReactElement<ConfigureCasesProps>; } diff --git a/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx b/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx index 60cdb37628ba3..3cfba89916936 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx @@ -13,15 +13,17 @@ import { SecurityPageName } from '../../app/types'; import { getCaseUrl } from '../../common/components/link_to'; import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; import { WrapperPage } from '../../common/components/wrapper_page'; -import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; +import { useGetUserSavedObjectPermissions, useKibana } from '../../common/lib/kibana'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { navTabs } from '../../app/home/home_navigations'; import { CaseHeaderPage } from '../components/case_header_page'; import { ConfigureCases } from '../components/configure_cases'; import { WhitePageWrapper, SectionWrapper } from '../components/wrappers'; import * as i18n from './translations'; +import { USE_RAC_CASES_UI } from '../../../common/constants'; const ConfigureCasesPageComponent: React.FC = () => { + const { cases } = useKibana().services; const history = useHistory(); const userPermissions = useGetUserSavedObjectPermissions(); const search = useGetUrlSearch(navTabs.case); @@ -53,7 +55,13 @@ const ConfigureCasesPageComponent: React.FC = () => { </HeaderWrapper> </SectionWrapper> <WhitePageWrapper> - <ConfigureCases userCanCrud={userPermissions?.crud ?? false} /> + {USE_RAC_CASES_UI ? ( + cases.getConfigureCases({ + userCanCrud: userPermissions?.crud ?? false, + }) + ) : ( + <ConfigureCases userCanCrud={userPermissions?.crud ?? false} /> + )} </WhitePageWrapper> </WrapperPage> <SpyRoute pageName={SecurityPageName.case} /> From 026c31cd22f03b1409a2b571a5793436f900ac30 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 25 Mar 2021 07:46:18 -0600 Subject: [PATCH 32/52] [Security Solutions] [Cases] Update readme and add jsdocs to public methods (#95245) --- docs/developer/plugin-list.asciidoc | 2 +- x-pack/plugins/cases/README.md | 117 +++++++++++++++++++--- x-pack/plugins/cases/images/all_cases.png | Bin 0 -> 260832 bytes x-pack/plugins/cases/images/configure.png | Bin 0 -> 285182 bytes x-pack/plugins/cases/images/create.png | Bin 0 -> 300838 bytes x-pack/plugins/cases/images/logo.png | Bin 0 -> 4692 bytes x-pack/plugins/cases/public/plugin.ts | 19 ++++ 7 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 x-pack/plugins/cases/images/all_cases.png create mode 100644 x-pack/plugins/cases/images/configure.png create mode 100644 x-pack/plugins/cases/images/create.png create mode 100644 x-pack/plugins/cases/images/logo.png diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index e1c2c40a31384..9214701dca478 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -325,7 +325,7 @@ Failure to have auth enabled in Kibana will make for a broken UI. UI-based error |{kib-repo}blob/{branch}/x-pack/plugins/cases/README.md[cases] -|Experimental Feature +|Case management in Kibana |{kib-repo}blob/{branch}/x-pack/plugins/cloud/README.md[cloud] diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index 069441ab640ee..090be109b94f1 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -1,18 +1,92 @@ -# Case Workflow - -*Experimental Feature* - -Elastic is developing a Case Management Workflow. Follow our progress: - -- [Case API Documentation](https://www.elastic.co/guide/en/security/master/cases-overview.html) - - -# Action types - +Case management in Kibana + +[![Issues][issues-shield]][issues-url] +[![Pull Requests][pr-shield]][pr-url] + +# Cases Plugin Docs + +![Cases Logo][cases-logo] + +[Report Bug](https://github.com/elastic/kibana/issues/new?assignees=&labels=bug&template=Bug_report.md) +· +[Request Feature](https://github.com/elastic/kibana/issues/new?assignees=&labels=&template=Feature_request.md) + +## Table of Contents + +- [Cases API](#cases-api) +- [Cases UI](#cases-ui) +- [Case Action Type](#case-action-type) + + +## Cases API +[**Explore the API docs »**](https://www.elastic.co/guide/en/security/current/cases-api-overview.html) + +## Cases UI + +#### Embed Cases UI components in any Kibana plugin +- Add `CasesUiStart` to Kibana plugin `StartServices` dependencies: + +```ts +cases: CasesUiStart; +``` + +#### Cases UI Methods + +- From the UI component, get the component from the `useKibana` hook start services +```tsx + const { cases } = useKibana().services; + // call in the return as you would any component + cases.getCreateCase({ + onCancel: handleSetIsCancel, + onSuccess, + }) +``` +##### Methods: +### `getAllCases` +Arguments: + +|Property|Description| +|---|---| +|configureCasesHref|`string;` route for configure cases page +|createCaseHref|`string;` route for create cases page +|disabledStatuses?|`CaseStatuses[];` array of disabled statuses +|getCaseDetailsHref|`(caseDetails: CaseDetailsHrefSchema) => string;` callback to generate the case details url from the case id +|isModal?|`boolean;` is All Cases table a modal +|onCaseDetailsNavClick|`(caseDetails: CaseDetailsHrefSchema) => void;` callback for nav click +|onConfigureCasesNavClick?|`(ev: React.MouseEvent) => void;` callback for nav click +|onCreateCaseNavClick?|`(ev: React.MouseEvent) => void;` callback for nav click +|onRowClick?|`(theCase?: Case ! SubCase) => void;` callback for row click, passing case in row +|userCanCrud|boolean; user permissions to crud + +UI component: + ![All Cases Component][all-cases-img] + +### `getCreateCase` +Arguments: + +|Property|Description| +|---|---| +|afterCaseCreated?|`(theCase: Case) => Promise<void>;` callback passing newly created case before pushCaseToExternalService is called +|onCancel|`() => void;` callback when create case is canceled +|onSuccess|`(theCase: Case) => Promise<void>;` callback passing newly created case after pushCaseToExternalService is called + +UI component: + ![Create Component][create-img] + + ### `getConfigureCases` + Arguments: + + |Property|Description| + |---|---| + |userCanCrud|`boolean;` user permissions to crud + + UI component: + ![Configure Component][configure-img] + +## Case Action Type See [Kibana Actions](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions) for more information. -## Case ID: `.case` @@ -101,4 +175,21 @@ For IBM Resilient connectors: | Property | Description | Type | | ---------- | ------------------------------ | ------- | -| syncAlerts | Turn on or off alert synching. | boolean | \ No newline at end of file +| syncAlerts | Turn on or off alert synching. | boolean | + + + + + + +<!-- MARKDOWN LINKS & IMAGES --> +<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --> +[pr-shield]: https://img.shields.io/github/issues-pr/elangosundar/awesome-README-templates?style=for-the-badge +[pr-url]: https://github.com/elastic/kibana/pulls?q=is%3Apr+label%3AFeature%3ACases+-is%3Adraft+is%3Aopen+ +[issues-shield]: https://img.shields.io/github/issues/othneildrew/Best-README-Template.svg?style=for-the-badge +[issues-url]: https://github.com/elastic/kibana/issues?q=is%3Aopen+is%3Aissue+label%3AFeature%3ACases +[cases-logo]: images/logo.png +[configure-img]: images/configure.png +[create-img]: images/create.png +[all-cases-img]: images/all_cases.png + diff --git a/x-pack/plugins/cases/images/all_cases.png b/x-pack/plugins/cases/images/all_cases.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6adf8ff2de28129cb34eecb278ae0a93b0e8e4 GIT binary patch literal 260832 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�dP<bt(k5x% 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/images/configure.png b/x-pack/plugins/cases/images/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..02a2a6dbed3142eedd3de63c7d17db1a7276020d GIT binary patch literal 285182 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�H%F?b^Rk~+G~whiu+9r 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 mz7r4MY5h&p&tPaq=f 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 IdiVbS07Qc#;s5{u literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/images/create.png b/x-pack/plugins/cases/images/create.png new file mode 100644 index 0000000000000000000000000000000000000000..df9bac09d53459e3263c78417a16acd527fc766b GIT binary patch literal 300838 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%0D>W}0??49JsYEmUdd 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/images/logo.png b/x-pack/plugins/cases/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7c56b0a667fe333b4241d15a9d39c4a8be372305 GIT binary patch literal 4692 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 6c57dd738f55b..885559dfc5e65 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -12,6 +12,10 @@ import { getAllCasesLazy } from './methods/get_all_cases'; import { getConfigureCasesLazy } from './methods/get_configure_cases'; import { KibanaServices } from './common/lib/kibana'; +/** + * @public + * A plugin for retrieving Cases UI components + */ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, StartPlugins> { private kibanaVersion: string; @@ -23,12 +27,27 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S public start(core: CoreStart, plugins: StartPlugins): CasesUiStart { KibanaServices.init({ ...core, ...plugins, kibanaVersion: this.kibanaVersion }); return { + /** + * Get the all cases table + * @param props AllCasesProps + * @return {ReactElement<AllCasesProps>} + */ getAllCases: (props) => { return getAllCasesLazy(props); }, + /** + * Get the create case form + * @param props CreateCaseProps + * @return {ReactElement<CreateCaseProps>} + */ getCreateCase: (props) => { return getCreateCaseLazy(props); }, + /** + * Get the configure case component + * @param props ConfigureCasesProps + * @return {ReactElement<ConfigureCasesProps>} + */ getConfigureCases: (props) => { return getConfigureCasesLazy(props); }, From 191c58e53ce707fb664b43973410cec02eb27b3f Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Fri, 26 Mar 2021 12:55:38 -0600 Subject: [PATCH 33/52] hoorah, fixed w master --- x-pack/plugins/cases/jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/cases/jest.config.js b/x-pack/plugins/cases/jest.config.js index 6368eb8895ad1..69235e35bc609 100644 --- a/x-pack/plugins/cases/jest.config.js +++ b/x-pack/plugins/cases/jest.config.js @@ -6,6 +6,7 @@ */ module.exports = { + testEnvironment: 'jest-environment-jsdom-thirteen', preset: '@kbn/test', rootDir: '../../..', roots: ['<rootDir>/x-pack/plugins/cases'], From 439d2e1bf52ed3ea29b4b0554f7df863e9cf7536 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Mon, 29 Mar 2021 15:47:07 -0400 Subject: [PATCH 34/52] [Security Solution][Cases] Migrate case_details to cases plugin (#95086) Co-authored-by: Steph Milovic <stephanie.milovic@elastic.co> --- .../plugins/cases/common/api/runtime_types.ts | 8 +- x-pack/plugins/cases/common/constants.ts | 4 +- x-pack/plugins/cases/jest.config.js | 3 + .../plugins/cases/public/common/ecs_types.ts | 58 ++ .../public/components/__mock__/router.ts | 40 + .../components/add_comment/index.test.tsx | 176 ++++ .../public/components/add_comment/index.tsx | 133 +++ .../public/components/add_comment/schema.tsx | 27 + .../components/add_comment/translations.ts | 8 + .../case_action_bar/actions.test.tsx | 104 +++ .../components/case_action_bar/actions.tsx | 86 ++ .../case_action_bar/helpers.test.ts | 50 + .../components/case_action_bar/helpers.ts | 24 + .../components/case_action_bar/index.test.tsx | 111 +++ .../components/case_action_bar/index.tsx | 144 +++ .../status_context_menu.test.tsx | 51 + .../case_action_bar/status_context_menu.tsx | 64 ++ .../case_settings/sync_alerts_switch.test.tsx | 57 ++ .../case_settings/sync_alerts_switch.tsx | 50 + .../components/case_view/helpers.test.tsx | 58 ++ .../public/components/case_view/helpers.ts | 22 + .../components/case_view/index.test.tsx | 882 ++++++++++++++++++ .../public/components/case_view/index.tsx | 553 +++++++++++ .../components/case_view/translations.ts | 130 +++ .../components/edit_connector/helpers.ts | 33 + .../components/edit_connector/index.test.tsx | 141 +++ .../components/edit_connector/index.tsx | 298 ++++++ .../components/edit_connector/schema.tsx | 18 + .../components/edit_connector/translations.ts | 17 + .../components/property_actions/index.tsx | 100 ++ .../property_actions/translations.ts | 12 + .../public/components/tag_list/index.test.tsx | 122 +++ .../public/components/tag_list/index.tsx | 176 ++++ .../public/components/tag_list/schema.tsx | 13 + .../cases/public/components/tag_list/tags.tsx | 33 + .../components/tag_list/translations.ts | 14 + .../components/use_push_to_service/index.tsx | 2 +- .../user_action_tree/helpers.test.tsx | 185 ++++ .../components/user_action_tree/helpers.tsx | 373 ++++++++ .../user_action_tree/index.test.tsx | 416 +++++++++ .../components/user_action_tree/index.tsx | 594 ++++++++++++ .../components/user_action_tree/schema.ts | 24 + .../user_action_tree/translations.ts | 72 ++ .../user_action_alert_comment_event.test.tsx | 78 ++ .../user_action_alert_comment_event.tsx | 80 ++ .../user_action_avatar.test.tsx | 40 + .../user_action_tree/user_action_avatar.tsx | 24 + .../user_action_content_toolbar.test.tsx | 55 ++ .../user_action_content_toolbar.tsx | 58 ++ .../user_action_copy_link.test.tsx | 69 ++ .../user_action_copy_link.tsx | 40 + .../user_action_tree/user_action_markdown.tsx | 109 +++ .../user_action_move_to_reference.test.tsx | 35 + .../user_action_move_to_reference.tsx | 38 + .../user_action_property_actions.test.tsx | 51 + .../user_action_property_actions.tsx | 59 ++ .../user_action_show_alert.test.tsx | 37 + .../user_action_show_alert.tsx | 43 + .../user_action_timestamp.test.tsx | 75 ++ .../user_action_timestamp.tsx | 47 + .../user_action_username.test.tsx | 69 ++ .../user_action_tree/user_action_username.tsx | 32 + .../user_action_username_with_avatar.test.tsx | 43 + .../user_action_username_with_avatar.tsx | 45 + .../components/user_list/index.test.tsx | 41 + .../public/components/user_list/index.tsx | 110 +++ .../components/user_list/translations.ts | 14 + .../public/containers/use_get_case.test.tsx | 113 +++ .../cases/public/containers/use_get_case.tsx | 116 +++ .../containers/use_post_comment.test.tsx | 147 +++ .../public/containers/use_post_comment.tsx | 103 ++ .../containers/use_update_case.test.tsx | 148 +++ .../public/containers/use_update_case.tsx | 151 +++ .../containers/use_update_comment.test.tsx | 140 +++ .../public/containers/use_update_comment.tsx | 131 +++ .../get_case_view.tsx} | 10 +- x-pack/plugins/cases/public/plugin.ts | 9 + x-pack/plugins/cases/public/types.ts | 2 + .../cases/public/utils/use_mount_appended.ts | 1 + .../security_solution/common/constants.ts | 2 +- .../case_view/case_view_from_plugin.tsx | 210 +++++ .../cases/components/case_view/index.tsx | 3 +- .../public/cases/containers/api.test.tsx | 2 +- .../public/cases/pages/case_details.tsx | 20 +- 84 files changed, 8067 insertions(+), 19 deletions(-) create mode 100644 x-pack/plugins/cases/public/common/ecs_types.ts create mode 100644 x-pack/plugins/cases/public/components/__mock__/router.ts create mode 100644 x-pack/plugins/cases/public/components/add_comment/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/add_comment/index.tsx create mode 100644 x-pack/plugins/cases/public/components/add_comment/schema.tsx create mode 100644 x-pack/plugins/cases/public/components/add_comment/translations.ts create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/actions.test.tsx create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/actions.tsx create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/helpers.test.ts create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/helpers.ts create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/index.tsx create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx create mode 100644 x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx create mode 100644 x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx create mode 100644 x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.tsx create mode 100644 x-pack/plugins/cases/public/components/case_view/helpers.test.tsx create mode 100644 x-pack/plugins/cases/public/components/case_view/helpers.ts create mode 100644 x-pack/plugins/cases/public/components/case_view/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/case_view/index.tsx create mode 100644 x-pack/plugins/cases/public/components/case_view/translations.ts create mode 100644 x-pack/plugins/cases/public/components/edit_connector/helpers.ts create mode 100644 x-pack/plugins/cases/public/components/edit_connector/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/edit_connector/index.tsx create mode 100644 x-pack/plugins/cases/public/components/edit_connector/schema.tsx create mode 100644 x-pack/plugins/cases/public/components/edit_connector/translations.ts create mode 100644 x-pack/plugins/cases/public/components/property_actions/index.tsx create mode 100644 x-pack/plugins/cases/public/components/property_actions/translations.ts create mode 100644 x-pack/plugins/cases/public/components/tag_list/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/tag_list/index.tsx create mode 100644 x-pack/plugins/cases/public/components/tag_list/schema.tsx create mode 100644 x-pack/plugins/cases/public/components/tag_list/tags.tsx create mode 100644 x-pack/plugins/cases/public/components/tag_list/translations.ts create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/index.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/schema.ts create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/translations.ts create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_username.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_username.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.tsx create mode 100644 x-pack/plugins/cases/public/components/user_list/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_list/index.tsx create mode 100644 x-pack/plugins/cases/public/components/user_list/translations.ts create mode 100644 x-pack/plugins/cases/public/containers/use_get_case.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_get_case.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_post_comment.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_post_comment.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_update_case.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_update_case.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_update_comment.test.tsx create mode 100644 x-pack/plugins/cases/public/containers/use_update_comment.tsx rename x-pack/plugins/cases/public/{get_all_cases.tsx => methods/get_case_view.tsx} (66%) create mode 100644 x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx diff --git a/x-pack/plugins/cases/common/api/runtime_types.ts b/x-pack/plugins/cases/common/api/runtime_types.ts index b2ff763838287..8001eb80cec73 100644 --- a/x-pack/plugins/cases/common/api/runtime_types.ts +++ b/x-pack/plugins/cases/common/api/runtime_types.ts @@ -25,7 +25,13 @@ export const formatErrors = (errors: rt.Errors): string[] => { .map((entry) => entry.key) .join(','); - const nameContext = error.context.find((entry) => entry.type?.name?.length > 0); + const nameContext = error.context.find((entry) => { + // TODO: Put in fix for optional chaining https://github.com/cypress-io/cypress/issues/9298 + if (entry.type && entry.type.name) { + return entry.type.name.length > 0; + } + return false; + }); const suppliedValue = keyContext !== '' ? keyContext : nameContext != null ? nameContext.type.name : ''; const value = isObject(error.value) ? JSON.stringify(error.value) : error.value; diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index 29cf7917dd7c0..f9fae2466a59b 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - export const DEFAULT_DATE_FORMAT = 'dateFormat'; export const DEFAULT_DATE_FORMAT_TZ = 'dateFormat:tz'; @@ -53,9 +52,8 @@ export const SUPPORTED_CONNECTORS = [ /** * Alerts */ - export const MAX_ALERTS_PER_SUB_CASE = 5000; -export const MAX_GENERATED_ALERTS_PER_SUB_CASE = MAX_ALERTS_PER_SUB_CASE / 100; +export const MAX_GENERATED_ALERTS_PER_SUB_CASE = 50; /** * This flag governs enabling the case as a connector feature. It is disabled by default as the feature is not complete. diff --git a/x-pack/plugins/cases/jest.config.js b/x-pack/plugins/cases/jest.config.js index 69235e35bc609..de3c3d08eb801 100644 --- a/x-pack/plugins/cases/jest.config.js +++ b/x-pack/plugins/cases/jest.config.js @@ -10,4 +10,7 @@ module.exports = { preset: '@kbn/test', rootDir: '../../..', roots: ['<rootDir>/x-pack/plugins/cases'], + + // TODO: migrate to "jest-environment-jsdom" https://github.com/elastic/kibana/issues/95201 + testEnvironment: 'jest-environment-jsdom-thirteen', }; diff --git a/x-pack/plugins/cases/public/common/ecs_types.ts b/x-pack/plugins/cases/public/common/ecs_types.ts new file mode 100644 index 0000000000000..a900e3ed219e1 --- /dev/null +++ b/x-pack/plugins/cases/public/common/ecs_types.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +export interface RuleEcs { + id?: string[]; + rule_id?: string[]; + name?: string[]; + false_positives: string[]; + saved_id?: string[]; + timeline_id?: string[]; + timeline_title?: string[]; + max_signals?: number[]; + risk_score?: string[]; + output_index?: string[]; + description?: string[]; + from?: string[]; + immutable?: boolean[]; + index?: string[]; + interval?: string[]; + language?: string[]; + query?: string[]; + references?: string[]; + severity?: string[]; + tags?: string[]; + threat?: unknown; + threshold?: unknown; + type?: string[]; + size?: string[]; + to?: string[]; + enabled?: boolean[]; + filters?: unknown; + created_at?: string[]; + updated_at?: string[]; + created_by?: string[]; + updated_by?: string[]; + version?: string[]; + note?: string[]; + building_block_type?: string[]; +} + +export interface SignalEcs { + rule?: RuleEcs; + original_time?: string[]; + status?: string[]; + group?: { + id?: string[]; + }; + threshold_result?: unknown; +} + +export interface Ecs { + _id: string; + _index?: string; + signal?: SignalEcs; +} diff --git a/x-pack/plugins/cases/public/components/__mock__/router.ts b/x-pack/plugins/cases/public/components/__mock__/router.ts new file mode 100644 index 0000000000000..58b7bb0ac2688 --- /dev/null +++ b/x-pack/plugins/cases/public/components/__mock__/router.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Router } from 'react-router-dom'; +// eslint-disable-next-line @kbn/eslint/module_migration +import routeData from 'react-router'; +type Action = 'PUSH' | 'POP' | 'REPLACE'; +const pop: Action = 'POP'; +const location = { + pathname: '/network', + search: '', + state: '', + hash: '', +}; +export const mockHistory = { + length: 2, + location, + action: pop, + push: jest.fn(), + replace: jest.fn(), + go: jest.fn(), + goBack: jest.fn(), + goForward: jest.fn(), + block: jest.fn(), + createHref: jest.fn(), + listen: jest.fn(), +}; + +export const mockLocation = { + pathname: '/welcome', + hash: '', + search: '', + state: '', +}; + +export { Router, routeData }; diff --git a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx new file mode 100644 index 0000000000000..84883f6d000ac --- /dev/null +++ b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx @@ -0,0 +1,176 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor, act } from '@testing-library/react'; +// import { noop } from 'lodash/fp'; + +import { TestProviders } from '../../common/mock'; +import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; + +import { CommentRequest, CommentType } from '../../../common'; +// TODO: Timeline Integration +// import { useInsertTimeline } from '../use_insert_timeline'; +import { usePostComment } from '../../containers/use_post_comment'; +import { AddComment, AddCommentRefObject } from '.'; + +jest.mock('../../containers/use_post_comment'); +// TODO: Timeline Integration +// jest.mock('../use_insert_timeline'); + +const usePostCommentMock = usePostComment as jest.Mock; +// TODO: Timeline Integration +// const useInsertTimelineMock = useInsertTimeline as jest.Mock; +const onCommentSaving = jest.fn(); +const onCommentPosted = jest.fn(); +const postComment = jest.fn(); + +const addCommentProps = { + caseId: '1234', + disabled: false, + insertQuote: null, + onCommentSaving, + onCommentPosted, + showLoading: false, +}; + +const defaultPostComment = { + isLoading: false, + isError: false, + postComment, +}; + +const sampleData: CommentRequest = { + comment: 'what a cool comment', + type: CommentType.user, +}; + +describe('AddComment ', () => { + beforeEach(() => { + jest.resetAllMocks(); + usePostCommentMock.mockImplementation(() => defaultPostComment); + jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); + }); + + it('should post comment on submit click', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <AddComment {...addCommentProps} /> + </Router> + </TestProviders> + ); + + await act(async () => { + wrapper + .find(`[data-test-subj="add-comment"] textarea`) + .first() + .simulate('change', { target: { value: sampleData.comment } }); + }); + + expect(wrapper.find(`[data-test-subj="add-comment"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeFalsy(); + + await act(async () => { + wrapper.find(`[data-test-subj="submit-comment"]`).first().simulate('click'); + }); + + await waitFor(() => { + expect(onCommentSaving).toBeCalled(); + expect(postComment).toBeCalledWith({ + caseId: addCommentProps.caseId, + data: sampleData, + subCaseId: undefined, + updateCase: onCommentPosted, + }); + expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe(''); + }); + }); + + it('should render spinner and disable submit when loading', () => { + usePostCommentMock.mockImplementation(() => ({ ...defaultPostComment, isLoading: true })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <AddComment {...{ ...addCommentProps, showLoading: true }} /> + </Router> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeTruthy(); + expect( + wrapper.find(`[data-test-subj="submit-comment"]`).first().prop('isDisabled') + ).toBeTruthy(); + }); + + it('should disable submit button when disabled prop passed', () => { + usePostCommentMock.mockImplementation(() => ({ ...defaultPostComment, isLoading: true })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <AddComment {...{ ...addCommentProps, disabled: true }} /> + </Router> + </TestProviders> + ); + + expect( + wrapper.find(`[data-test-subj="submit-comment"]`).first().prop('isDisabled') + ).toBeTruthy(); + }); + + it('should insert a quote', async () => { + const sampleQuote = 'what a cool quote'; + const ref = React.createRef<AddCommentRefObject>(); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <AddComment {...{ ...addCommentProps }} ref={ref} /> + </Router> + </TestProviders> + ); + + await act(async () => { + wrapper + .find(`[data-test-subj="add-comment"] textarea`) + .first() + .simulate('change', { target: { value: sampleData.comment } }); + }); + + await act(async () => { + ref.current!.addQuote(sampleQuote); + }); + + expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe( + `${sampleData.comment}\n\n${sampleQuote}` + ); + }); + + // TODO: Should re-enable the insert timeline action + // xit('it should insert a timeline', async () => { + // let attachTimeline = noop; + // useInsertTimelineMock.mockImplementation((comment, onTimelineAttached) => { + // attachTimeline = onTimelineAttached; + // }); + + // const wrapper = mount( + // <TestProviders> + // <Router history={mockHistory}> + // <AddComment {...{ ...addCommentProps }} /> + // </Router> + // </TestProviders> + // ); + + // act(() => { + // attachTimeline('[title](url)'); + // }); + + // await waitFor(() => { + // expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe('[title](url)'); + // }); + // }); +}); diff --git a/x-pack/plugins/cases/public/components/add_comment/index.tsx b/x-pack/plugins/cases/public/components/add_comment/index.tsx new file mode 100644 index 0000000000000..2895ebe1c2517 --- /dev/null +++ b/x-pack/plugins/cases/public/components/add_comment/index.tsx @@ -0,0 +1,133 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; +import React, { useCallback, forwardRef, useImperativeHandle } from 'react'; +import styled from 'styled-components'; + +import { CommentType } from '../../../common'; +import { usePostComment } from '../../containers/use_post_comment'; +import { Case } from '../../containers/types'; +import { MarkdownEditorForm } from '../markdown_editor'; +import { Form, useForm, UseField, useFormData } from '../../common/shared_imports'; + +import * as i18n from './translations'; +import { schema, AddCommentFormSchema } from './schema'; + +// TODO: Handle use insert in timeline +// import { useInsertTimeline } from '../use_insert_timeline'; + +const MySpinner = styled(EuiLoadingSpinner)` + position: absolute; + top: 50%; + left: 50%; +`; + +const initialCommentValue: AddCommentFormSchema = { + comment: '', +}; + +export interface AddCommentRefObject { + addQuote: (quote: string) => void; +} + +interface AddCommentProps { + caseId: string; + disabled?: boolean; + onCommentSaving?: () => void; + onCommentPosted: (newCase: Case) => void; + showLoading?: boolean; + subCaseId?: string; +} + +export const AddComment = React.memo( + forwardRef<AddCommentRefObject, AddCommentProps>( + ( + { caseId, disabled, onCommentPosted, onCommentSaving, showLoading = true, subCaseId }, + ref + ) => { + const { isLoading, postComment } = usePostComment(); + + const { form } = useForm<AddCommentFormSchema>({ + defaultValue: initialCommentValue, + options: { stripEmptyFields: false }, + schema, + }); + + const fieldName = 'comment'; + const { setFieldValue, reset, submit } = form; + const [{ comment }] = useFormData<{ comment: string }>({ form, watch: [fieldName] }); + + const addQuote = useCallback( + (quote) => { + setFieldValue(fieldName, `${comment}${comment.length > 0 ? '\n\n' : ''}${quote}`); + }, + [comment, setFieldValue] + ); + + useImperativeHandle(ref, () => ({ + addQuote, + })); + + // TODO: Timeline integration + // const onTimelineAttached = useCallback( + // (newValue: string) => setFieldValue(fieldName, newValue), + // [setFieldValue] + // ); + + // useInsertTimeline(comment ?? '', onTimelineAttached); + + const onSubmit = useCallback(async () => { + const { isValid, data } = await submit(); + if (isValid) { + if (onCommentSaving != null) { + onCommentSaving(); + } + postComment({ + caseId, + data: { ...data, type: CommentType.user }, + updateCase: onCommentPosted, + subCaseId, + }); + reset(); + } + }, [caseId, onCommentPosted, onCommentSaving, postComment, reset, submit, subCaseId]); + + return ( + <span id="add-comment-permLink"> + {isLoading && showLoading && <MySpinner data-test-subj="loading-spinner" size="xl" />} + <Form form={form}> + <UseField + path={fieldName} + component={MarkdownEditorForm} + componentProps={{ + idAria: 'caseComment', + isDisabled: isLoading, + dataTestSubj: 'add-comment', + placeholder: i18n.ADD_COMMENT_HELP_TEXT, + bottomRightContent: ( + <EuiButton + data-test-subj="submit-comment" + iconType="plusInCircle" + isDisabled={isLoading || disabled} + isLoading={isLoading} + onClick={onSubmit} + size="s" + > + {i18n.ADD_COMMENT} + </EuiButton> + ), + }} + /> + </Form> + </span> + ); + } + ) +); + +AddComment.displayName = 'AddComment'; diff --git a/x-pack/plugins/cases/public/components/add_comment/schema.tsx b/x-pack/plugins/cases/public/components/add_comment/schema.tsx new file mode 100644 index 0000000000000..9693219dd5196 --- /dev/null +++ b/x-pack/plugins/cases/public/components/add_comment/schema.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CommentRequestUserType } from '../../../common'; +import { FIELD_TYPES, fieldValidators, FormSchema } from '../../common/shared_imports'; +import * as i18n from './translations'; + +const { emptyField } = fieldValidators; + +export interface AddCommentFormSchema { + comment: CommentRequestUserType['comment']; +} + +export const schema: FormSchema<AddCommentFormSchema> = { + comment: { + type: FIELD_TYPES.TEXTAREA, + validations: [ + { + validator: emptyField(i18n.COMMENT_REQUIRED), + }, + ], + }, +}; diff --git a/x-pack/plugins/cases/public/components/add_comment/translations.ts b/x-pack/plugins/cases/public/components/add_comment/translations.ts new file mode 100644 index 0000000000000..a3d96a3b9b5b6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/add_comment/translations.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from '../../common/translations'; diff --git a/x-pack/plugins/cases/public/components/case_action_bar/actions.test.tsx b/x-pack/plugins/cases/public/components/case_action_bar/actions.test.tsx new file mode 100644 index 0000000000000..886e740d56447 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/actions.test.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { TestProviders } from '../../common/mock'; +import { basicCase, basicPush } from '../../containers/mock'; +import { Actions } from './actions'; +import * as i18n from '../case_view/translations'; +jest.mock('../../containers/use_delete_cases'); +const useDeleteCasesMock = useDeleteCases as jest.Mock; + +jest.mock('react-router-dom', () => { + const original = jest.requireActual('react-router-dom'); + + return { + ...original, + useHistory: () => ({ + useHistory: jest.fn(), + }), + }; +}); + +describe('CaseView actions', () => { + const handleOnDeleteConfirm = jest.fn(); + const handleToggleModal = jest.fn(); + const dispatchResetIsDeleted = jest.fn(); + const defaultDeleteState = { + dispatchResetIsDeleted, + handleToggleModal, + handleOnDeleteConfirm, + isLoading: false, + isError: false, + isDeleted: false, + isDisplayConfirmDeleteModal: false, + }; + + beforeEach(() => { + jest.resetAllMocks(); + useDeleteCasesMock.mockImplementation(() => defaultDeleteState); + }); + + it('clicking trash toggles modal', () => { + const wrapper = mount( + <TestProviders> + <Actions caseData={basicCase} currentExternalIncident={null} /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeFalsy(); + + wrapper.find('button[data-test-subj="property-actions-ellipses"]').first().simulate('click'); + wrapper.find('button[data-test-subj="property-actions-trash"]').simulate('click'); + expect(handleToggleModal).toHaveBeenCalled(); + }); + + it('toggle delete modal and confirm', () => { + useDeleteCasesMock.mockImplementation(() => ({ + ...defaultDeleteState, + isDisplayConfirmDeleteModal: true, + })); + const wrapper = mount( + <TestProviders> + <Actions caseData={basicCase} currentExternalIncident={null} /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeTruthy(); + wrapper.find('button[data-test-subj="confirmModalConfirmButton"]').simulate('click'); + expect(handleOnDeleteConfirm.mock.calls[0][0]).toEqual([ + { id: basicCase.id, title: basicCase.title, type: 'individual' }, + ]); + }); + + it('displays active incident link', () => { + const wrapper = mount( + <TestProviders> + <Actions + caseData={basicCase} + currentExternalIncident={{ + ...basicPush, + firstPushIndex: 5, + lastPushIndex: 5, + commentsToUpdate: [], + hasDataToPush: false, + }} + /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeFalsy(); + + wrapper.find('button[data-test-subj="property-actions-ellipses"]').first().simulate('click'); + expect( + wrapper.find('[data-test-subj="property-actions-popout"]').first().prop('aria-label') + ).toEqual(i18n.VIEW_INCIDENT(basicPush.externalTitle)); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx new file mode 100644 index 0000000000000..74d2a40f1ceb9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty } from 'lodash/fp'; +import React, { useMemo } from 'react'; +import { useHistory } from 'react-router-dom'; +import * as i18n from '../case_view/translations'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; +import { PropertyActions } from '../property_actions'; +import { Case } from '../../containers/types'; +import { CaseService } from '../../containers/use_get_case_user_actions'; + +interface CaseViewActions { + caseData: Case; + currentExternalIncident: CaseService | null; + disabled?: boolean; +} + +const ActionsComponent: React.FC<CaseViewActions> = ({ + caseData, + currentExternalIncident, + disabled = false, +}) => { + const history = useHistory(); + // Delete case + const { + handleToggleModal, + handleOnDeleteConfirm, + isDeleted, + isDisplayConfirmDeleteModal, + } = useDeleteCases(); + + const confirmDeleteModal = useMemo( + () => ( + <ConfirmDeleteCaseModal + caseTitle={caseData.title} + isModalVisible={isDisplayConfirmDeleteModal} + isPlural={false} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind(null, [ + { id: caseData.id, title: caseData.title, type: caseData.type }, + ])} + /> + ), + // eslint-disable-next-line react-hooks/exhaustive-deps + [isDisplayConfirmDeleteModal, caseData] + ); + const propertyActions = useMemo( + () => [ + { + disabled, + iconType: 'trash', + label: i18n.DELETE_CASE, + onClick: handleToggleModal, + }, + ...(currentExternalIncident != null && !isEmpty(currentExternalIncident?.externalUrl) + ? [ + { + iconType: 'popout', + label: i18n.VIEW_INCIDENT(currentExternalIncident?.externalTitle ?? ''), + onClick: () => window.open(currentExternalIncident?.externalUrl, '_blank'), + }, + ] + : []), + ], + [disabled, handleToggleModal, currentExternalIncident] + ); + + if (isDeleted) { + history.push('/'); + return null; + } + return ( + <> + <PropertyActions propertyActions={propertyActions} /> + {confirmDeleteModal} + </> + ); +}; + +export const Actions = React.memo(ActionsComponent); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/helpers.test.ts b/x-pack/plugins/cases/public/components/case_action_bar/helpers.test.ts new file mode 100644 index 0000000000000..ed5832d19b4da --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/helpers.test.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseStatuses } from '../../../common'; +import { basicCase } from '../../containers/mock'; +import { getStatusDate, getStatusTitle } from './helpers'; + +describe('helpers', () => { + const caseData = { + ...basicCase, + status: CaseStatuses.open, + createdAt: 'createAt', + updatedAt: 'updatedAt', + closedAt: 'closedAt', + }; + + describe('getStatusDate', () => { + it('it return the createdAt when the status is open', () => { + expect(getStatusDate(caseData)).toBe(caseData.createdAt); + }); + + it('it return the createdAt when the status is in-progress', () => { + expect(getStatusDate({ ...caseData, status: CaseStatuses['in-progress'] })).toBe( + caseData.updatedAt + ); + }); + + it('it return the createdAt when the status is closed', () => { + expect(getStatusDate({ ...caseData, status: CaseStatuses.closed })).toBe(caseData.closedAt); + }); + }); + + describe('getStatusTitle', () => { + it('it return the correct title for open status', () => { + expect(getStatusTitle(CaseStatuses.open)).toBe('Case opened'); + }); + + it('it return the correct title for in-progress status', () => { + expect(getStatusTitle(CaseStatuses['in-progress'])).toBe('Case in progress'); + }); + + it('it return the correct title for closed status', () => { + expect(getStatusTitle(CaseStatuses.closed)).toBe('Case closed'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts b/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts new file mode 100644 index 0000000000000..35cfdae3abe21 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseStatuses } from '../../../common'; +import { Case } from '../../containers/types'; +import { statuses } from '../status'; + +export const getStatusDate = (theCase: Case): string | null => { + if (theCase.status === CaseStatuses.open) { + return theCase.createdAt; + } else if (theCase.status === CaseStatuses['in-progress']) { + return theCase.updatedAt; + } else if (theCase.status === CaseStatuses.closed) { + return theCase.closedAt; + } + + return null; +}; + +export const getStatusTitle = (status: CaseStatuses) => statuses[status].actionBar.title; diff --git a/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx b/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx new file mode 100644 index 0000000000000..0d29335ea730e --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { basicCase } from '../../containers/mock'; +import { CaseActionBar } from '.'; +import { TestProviders } from '../../common/mock'; + +describe('CaseActionBar', () => { + const onRefresh = jest.fn(); + const onUpdateField = jest.fn(); + const defaultProps = { + caseData: basicCase, + isLoading: false, + onRefresh, + onUpdateField, + currentExternalIncident: null, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('it renders', () => { + const wrapper = mount( + <TestProviders> + <CaseActionBar {...defaultProps} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="case-view-status"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="case-refresh"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="case-view-actions"]`).exists()).toBeTruthy(); + }); + + it('it should show correct status', () => { + const wrapper = mount( + <TestProviders> + <CaseActionBar {...defaultProps} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toBe( + 'Open' + ); + }); + + it('it should show the correct date', () => { + const wrapper = mount( + <TestProviders> + <CaseActionBar {...defaultProps} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).prop('value')).toBe( + basicCase.createdAt + ); + }); + + it('it call onRefresh', () => { + const wrapper = mount( + <TestProviders> + <CaseActionBar {...defaultProps} /> + </TestProviders> + ); + + wrapper.find(`[data-test-subj="case-refresh"]`).first().simulate('click'); + expect(onRefresh).toHaveBeenCalled(); + }); + + it('it should call onUpdateField when changing status', () => { + const wrapper = mount( + <TestProviders> + <CaseActionBar {...defaultProps} /> + </TestProviders> + ); + + wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); + wrapper + .find(`[data-test-subj="case-view-status-dropdown-in-progress"] button`) + .simulate('click'); + + expect(onUpdateField).toHaveBeenCalledWith({ key: 'status', value: 'in-progress' }); + }); + + it('it should call onUpdateField when changing syncAlerts setting', () => { + const wrapper = mount( + <TestProviders> + <CaseActionBar {...defaultProps} /> + </TestProviders> + ); + + wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); + + expect(onUpdateField).toHaveBeenCalledWith({ + key: 'settings', + value: { + syncAlerts: false, + }, + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx new file mode 100644 index 0000000000000..0f06dde6a86d1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useCallback } from 'react'; +import styled, { css } from 'styled-components'; +import { + EuiButtonEmpty, + EuiDescriptionList, + EuiDescriptionListDescription, + EuiDescriptionListTitle, + EuiFlexGroup, + EuiFlexItem, + EuiIconTip, +} from '@elastic/eui'; +import { CaseStatuses, CaseType } from '../../../common'; +import * as i18n from '../case_view/translations'; +import { FormattedRelativePreferenceDate } from '../formatted_date'; +import { Actions } from './actions'; +import { Case } from '../../containers/types'; +import { CaseService } from '../../containers/use_get_case_user_actions'; +import { StatusContextMenu } from './status_context_menu'; +import { getStatusDate, getStatusTitle } from './helpers'; +import { SyncAlertsSwitch } from '../case_settings/sync_alerts_switch'; +import { OnUpdateFields } from '../case_view'; + +const MyDescriptionList = styled(EuiDescriptionList)` + ${({ theme }) => css` + & { + padding-right: ${theme.eui.euiSizeL}; + border-right: ${theme.eui.euiBorderThin}; + } + `} +`; + +interface CaseActionBarProps { + caseData: Case; + currentExternalIncident: CaseService | null; + disabled?: boolean; + isLoading: boolean; + onRefresh: () => void; + onUpdateField: (args: OnUpdateFields) => void; +} +const CaseActionBarComponent: React.FC<CaseActionBarProps> = ({ + caseData, + currentExternalIncident, + disabled = false, + isLoading, + onRefresh, + onUpdateField, +}) => { + const date = useMemo(() => getStatusDate(caseData), [caseData]); + const title = useMemo(() => getStatusTitle(caseData.status), [caseData.status]); + const onStatusChanged = useCallback( + (status: CaseStatuses) => + onUpdateField({ + key: 'status', + value: status, + }), + [onUpdateField] + ); + + const onSyncAlertsChanged = useCallback( + (syncAlerts: boolean) => + onUpdateField({ + key: 'settings', + value: { ...caseData.settings, syncAlerts }, + }), + [caseData.settings, onUpdateField] + ); + + return ( + <EuiFlexGroup gutterSize="l" justifyContent="flexEnd" data-test-subj="case-action-bar-wrapper"> + <EuiFlexItem grow={false}> + <MyDescriptionList compressed> + <EuiFlexGroup> + {caseData.type !== CaseType.collection && ( + <EuiFlexItem grow={false} data-test-subj="case-view-status"> + <EuiDescriptionListTitle>{i18n.STATUS}</EuiDescriptionListTitle> + <EuiDescriptionListDescription> + <StatusContextMenu + currentStatus={caseData.status} + onStatusChanged={onStatusChanged} + /> + </EuiDescriptionListDescription> + </EuiFlexItem> + )} + <EuiFlexItem> + <EuiDescriptionListTitle>{title}</EuiDescriptionListTitle> + <EuiDescriptionListDescription> + <FormattedRelativePreferenceDate + data-test-subj={'case-action-bar-status-date'} + value={date} + /> + </EuiDescriptionListDescription> + </EuiFlexItem> + </EuiFlexGroup> + </MyDescriptionList> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiDescriptionList compressed> + <EuiFlexGroup gutterSize="l" alignItems="center"> + <EuiFlexItem> + <EuiDescriptionListTitle> + <EuiFlexGroup component="span" alignItems="center" gutterSize="xs"> + <EuiFlexItem grow={false}> + <span>{i18n.SYNC_ALERTS}</span> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiIconTip content={i18n.SYNC_ALERTS_HELP} /> + </EuiFlexItem> + </EuiFlexGroup> + </EuiDescriptionListTitle> + <EuiDescriptionListDescription> + <SyncAlertsSwitch + disabled={disabled || isLoading} + isSynced={caseData.settings.syncAlerts} + onSwitchChange={onSyncAlertsChanged} + /> + </EuiDescriptionListDescription> + </EuiFlexItem> + <EuiFlexItem> + <EuiButtonEmpty data-test-subj="case-refresh" iconType="refresh" onClick={onRefresh}> + {i18n.CASE_REFRESH} + </EuiButtonEmpty> + </EuiFlexItem> + <EuiFlexItem grow={false} data-test-subj="case-view-actions"> + <Actions + caseData={caseData} + currentExternalIncident={currentExternalIncident} + disabled={disabled} + /> + </EuiFlexItem> + </EuiFlexGroup> + </EuiDescriptionList> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +export const CaseActionBar = React.memo(CaseActionBarComponent); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx new file mode 100644 index 0000000000000..29cca46d372f0 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.test.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CaseStatuses } from '../../../common'; +import { StatusContextMenu } from './status_context_menu'; + +describe('SyncAlertsSwitch', () => { + const onStatusChanged = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('it renders', async () => { + const wrapper = mount( + <StatusContextMenu currentStatus={CaseStatuses.open} onStatusChanged={onStatusChanged} /> + ); + + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).exists()).toBeTruthy(); + }); + + it('it renders the current status correctly', async () => { + const wrapper = mount( + <StatusContextMenu currentStatus={CaseStatuses.closed} onStatusChanged={onStatusChanged} /> + ); + + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toBe( + 'Closed' + ); + }); + + it('it changes the status', async () => { + const wrapper = mount( + <StatusContextMenu currentStatus={CaseStatuses.open} onStatusChanged={onStatusChanged} /> + ); + + wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); + wrapper + .find(`[data-test-subj="case-view-status-dropdown-in-progress"] button`) + .simulate('click'); + + expect(onStatusChanged).toHaveBeenCalledWith('in-progress'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx new file mode 100644 index 0000000000000..2922b797f9d40 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_action_bar/status_context_menu.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback, useMemo, useState } from 'react'; +import { memoize } from 'lodash/fp'; +import { EuiPopover, EuiContextMenuPanel, EuiContextMenuItem } from '@elastic/eui'; +import { caseStatuses, CaseStatuses } from '../../../common'; +import { Status } from '../status'; + +interface Props { + currentStatus: CaseStatuses; + onStatusChanged: (status: CaseStatuses) => void; +} + +const StatusContextMenuComponent: React.FC<Props> = ({ currentStatus, onStatusChanged }) => { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const closePopover = useCallback(() => setIsPopoverOpen(false), []); + const openPopover = useCallback(() => setIsPopoverOpen(true), []); + const popOverButton = useMemo( + () => <Status type={currentStatus} withArrow onClick={openPopover} />, + [currentStatus, openPopover] + ); + + const onContextMenuItemClick = useMemo( + () => + memoize<(status: CaseStatuses) => () => void>((status) => () => { + closePopover(); + onStatusChanged(status); + }), + [closePopover, onStatusChanged] + ); + + const panelItems = caseStatuses.map((status: CaseStatuses) => ( + <EuiContextMenuItem + key={status} + icon={status === currentStatus ? 'check' : 'empty'} + onClick={onContextMenuItemClick(status)} + data-test-subj={`case-view-status-dropdown-${status}`} + > + <Status type={status} /> + </EuiContextMenuItem> + )); + + return ( + <> + <EuiPopover + id="caseStatusPopover" + button={popOverButton} + isOpen={isPopoverOpen} + closePopover={closePopover} + anchorPosition="downLeft" + data-test-subj="case-view-status-dropdown" + > + <EuiContextMenuPanel items={panelItems} /> + </EuiPopover> + </> + ); +}; + +export const StatusContextMenu = memo(StatusContextMenuComponent); diff --git a/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx b/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx new file mode 100644 index 0000000000000..f1e4bea2e57ee --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.test.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor } from '@testing-library/react'; + +import { SyncAlertsSwitch } from './sync_alerts_switch'; + +describe('SyncAlertsSwitch', () => { + it('it renders', async () => { + const wrapper = mount(<SyncAlertsSwitch disabled={false} />); + + expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).exists()).toBeTruthy(); + }); + + it('it toggles the switch', async () => { + const wrapper = mount(<SyncAlertsSwitch disabled={false} />); + + wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); + + await waitFor(() => { + expect(wrapper.find('[data-test-subj="sync-alerts-switch"]').first().prop('checked')).toBe( + false + ); + }); + }); + + it('it disables the switch', async () => { + const wrapper = mount(<SyncAlertsSwitch disabled={true} />); + + expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).first().prop('disabled')).toBe( + true + ); + }); + + it('it start as off', async () => { + const wrapper = mount(<SyncAlertsSwitch disabled={false} isSynced={false} showLabel={true} />); + + expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).first().text()).toBe('Off'); + }); + + it('it shows the correct labels', async () => { + const wrapper = mount(<SyncAlertsSwitch disabled={false} showLabel={true} />); + + expect(wrapper.find('[data-test-subj="sync-alerts-switch"]').first().text()).toBe('On'); + wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); + + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).first().text()).toBe('Off'); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.tsx b/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.tsx new file mode 100644 index 0000000000000..406b8dbe51ced --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_settings/sync_alerts_switch.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback, useState } from 'react'; +import { EuiSwitch } from '@elastic/eui'; + +import * as i18n from '../../common/translations'; + +interface Props { + disabled: boolean; + isSynced?: boolean; + showLabel?: boolean; + onSwitchChange?: (isSynced: boolean) => void; +} + +const SyncAlertsSwitchComponent: React.FC<Props> = ({ + disabled, + isSynced = true, + showLabel = false, + onSwitchChange, +}) => { + const [isOn, setIsOn] = useState(isSynced); + + const onChange = useCallback(() => { + if (onSwitchChange) { + onSwitchChange(!isOn); + } + + setIsOn(!isOn); + }, [isOn, onSwitchChange]); + + return ( + <EuiSwitch + label={isOn ? i18n.SYNC_ALERTS_SWITCH_LABEL_ON : i18n.SYNC_ALERTS_SWITCH_LABEL_OFF} + showLabel={showLabel} + checked={isOn} + onChange={onChange} + disabled={disabled} + data-test-subj="sync-alerts-switch" + /> + ); +}; + +SyncAlertsSwitchComponent.displayName = 'SyncAlertsSwitchComponent'; + +export const SyncAlertsSwitch = memo(SyncAlertsSwitchComponent); diff --git a/x-pack/plugins/cases/public/components/case_view/helpers.test.tsx b/x-pack/plugins/cases/public/components/case_view/helpers.test.tsx new file mode 100644 index 0000000000000..f266c574c27da --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_view/helpers.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { AssociationType, CommentType } from '../../../common'; +import { Comment } from '../../containers/types'; + +import { getManualAlertIdsWithNoRuleId } from './helpers'; + +const comments: Comment[] = [ + { + associationType: AssociationType.case, + type: CommentType.alert, + alertId: 'alert-id-1', + index: 'alert-index-1', + id: 'comment-id', + createdAt: '2020-02-19T23:06:33.798Z', + createdBy: { username: 'elastic' }, + rule: { + id: null, + name: null, + }, + pushedAt: null, + pushedBy: null, + updatedAt: null, + updatedBy: null, + version: 'WzQ3LDFc', + }, + { + associationType: AssociationType.case, + type: CommentType.alert, + alertId: 'alert-id-2', + index: 'alert-index-2', + id: 'comment-id', + createdAt: '2020-02-19T23:06:33.798Z', + createdBy: { username: 'elastic' }, + pushedAt: null, + pushedBy: null, + rule: { + id: 'rule-id-2', + name: 'rule-name-2', + }, + updatedAt: null, + updatedBy: null, + version: 'WzQ3LDFc', + }, +]; + +describe('Case view helpers', () => { + describe('getAlertIdsFromComments', () => { + it('it returns the alert id from the comments where rule is not defined', () => { + expect(getManualAlertIdsWithNoRuleId(comments)).toEqual(['alert-id-1']); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_view/helpers.ts b/x-pack/plugins/cases/public/components/case_view/helpers.ts new file mode 100644 index 0000000000000..ab26b132e0489 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_view/helpers.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty } from 'lodash'; +import { CommentType } from '../../../common'; +import { Comment } from '../../containers/types'; + +export const getManualAlertIdsWithNoRuleId = (comments: Comment[]): string[] => { + const dedupeAlerts = comments.reduce((alertIds, comment: Comment) => { + if (comment.type === CommentType.alert && isEmpty(comment.rule.id)) { + const ids = Array.isArray(comment.alertId) ? comment.alertId : [comment.alertId]; + ids.forEach((id) => alertIds.add(id)); + return alertIds; + } + return alertIds; + }, new Set<string>()); + return [...dedupeAlerts]; +}; diff --git a/x-pack/plugins/cases/public/components/case_view/index.test.tsx b/x-pack/plugins/cases/public/components/case_view/index.test.tsx new file mode 100644 index 0000000000000..c59db393a174b --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_view/index.test.tsx @@ -0,0 +1,882 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import '../../common/mock/match_media'; +import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; +import { CaseComponent, CaseComponentProps, CaseView } from '.'; +import { + basicCase, + basicCaseClosed, + caseUserActions, + alertComment, + getAlertUserAction, +} from '../../containers/mock'; +import { TestProviders } from '../../common/mock'; +import { useUpdateCase } from '../../containers/use_update_case'; +import { useGetCase } from '../../containers/use_get_case'; +import { useGetCaseUserActions } from '../../containers/use_get_case_user_actions'; +import { act, waitFor } from '@testing-library/react'; + +import { useConnectors } from '../../containers/configure/use_connectors'; +import { connectorsMock } from '../../containers/configure/mock'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; +import { CaseType, ConnectorTypes } from '../../../common'; + +jest.mock('../../containers/use_update_case'); +jest.mock('../../containers/use_get_case_user_actions'); +jest.mock('../../containers/use_get_case'); +jest.mock('../../containers/configure/use_connectors'); +jest.mock('../../containers/use_post_push_to_service'); +jest.mock('../user_action_tree/user_action_timestamp'); + +const useUpdateCaseMock = useUpdateCase as jest.Mock; +const useGetCaseUserActionsMock = useGetCaseUserActions as jest.Mock; +const useConnectorsMock = useConnectors as jest.Mock; +const usePostPushToServiceMock = usePostPushToService as jest.Mock; + +const alertsHit = [ + { + _id: 'alert-id-1', + _index: 'alert-index-1', + _source: { + signal: { + rule: { + id: 'rule-id-1', + name: 'Awesome rule', + }, + }, + }, + }, + { + _id: 'alert-id-2', + _index: 'alert-index-2', + _source: { + signal: { + rule: { + id: 'rule-id-2', + name: 'Awesome rule 2', + }, + }, + }, + }, +]; + +export const caseProps: CaseComponentProps = { + allCasesHref: 'all-cases-href', + backToAllCasesOnClick: jest.fn(), + caseDetailsHref: 'case-details-href', + caseId: basicCase.id, + configureCasesHref: 'configure-cases-href', + getCaseDetailHrefWithCommentId: jest.fn(), + getRuleDetailsHref: jest.fn(), + onComponentInitialized: jest.fn(), + onConfigureCasesNavClick: jest.fn(), + onRuleDetailsClick: jest.fn(), + showAlertDetails: jest.fn(), + useFetchAlertData: () => [ + false, + { + 'alert-id-1': alertsHit[0], + 'alert-id-2': alertsHit[1], + }, + ], + userCanCrud: true, + caseData: { + ...basicCase, + comments: [...basicCase.comments, alertComment], + connector: { + id: 'resilient-2', + name: 'Resilient', + type: ConnectorTypes.resilient, + fields: null, + }, + }, + fetchCase: jest.fn(), + updateCase: jest.fn(), +}; + +export const caseClosedProps: CaseComponentProps = { + ...caseProps, + caseData: basicCaseClosed, +}; + +describe('CaseView ', () => { + const updateCaseProperty = jest.fn(); + const fetchCaseUserActions = jest.fn(); + const fetchCase = jest.fn(); + const updateCase = jest.fn(); + const pushCaseToExternalService = jest.fn(); + + const data = caseProps.caseData; + const defaultGetCase = { + isLoading: false, + isError: false, + data, + updateCase, + fetchCase, + }; + + const defaultUpdateCaseState = { + isLoading: false, + isError: false, + updateKey: null, + updateCaseProperty, + }; + + const defaultUseGetCaseUserActions = { + caseUserActions: [...caseUserActions, getAlertUserAction()], + caseServices: {}, + fetchCaseUserActions, + firstIndexPushToService: -1, + hasDataToPush: false, + isLoading: false, + isError: false, + lastIndexPushToService: -1, + participants: [data.createdBy], + }; + + beforeEach(() => { + jest.clearAllMocks(); + jest.resetAllMocks(); + useUpdateCaseMock.mockImplementation(() => defaultUpdateCaseState); + + jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); + useGetCaseUserActionsMock.mockImplementation(() => defaultUseGetCaseUserActions); + usePostPushToServiceMock.mockImplementation(() => ({ + isLoading: false, + pushCaseToExternalService, + })); + useConnectorsMock.mockImplementation(() => ({ connectors: connectorsMock, loading: false })); + }); + + it('should render CaseComponent', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="case-view-title"]`).first().prop('title')).toEqual( + data.title + ); + + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toEqual( + 'Open' + ); + + expect( + wrapper + .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-coke"]`) + .first() + .text() + ).toEqual(data.tags[0]); + + expect( + wrapper + .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-pepsi"]`) + .first() + .text() + ).toEqual(data.tags[1]); + + expect(wrapper.find(`[data-test-subj="case-view-username"]`).first().text()).toEqual( + data.createdBy.username + ); + + expect( + wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).first().prop('value') + ).toEqual(data.createdAt); + + expect( + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="user-action-markdown"]`) + .first() + .text() + ).toBe(data.description); + + expect( + wrapper.find('button[data-test-subj="case-view-status-action-button"]').first().text() + ).toBe('Mark in progress'); + }); + }); + + it('should show closed indicators in header when case is closed', async () => { + useUpdateCaseMock.mockImplementation(() => ({ + ...defaultUpdateCaseState, + caseData: basicCaseClosed, + })); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseClosedProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).first().prop('value') + ).toEqual(basicCaseClosed.closedAt); + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toEqual( + 'Closed' + ); + }); + }); + + it('should update status', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('[data-test-subj="case-view-status-dropdown"] button').first().simulate('click'); + wrapper.update(); + wrapper + .find('button[data-test-subj="case-view-status-dropdown-closed"]') + .first() + .simulate('click'); + + wrapper.update(); + const updateObject = updateCaseProperty.mock.calls[0][0]; + expect(updateObject.updateKey).toEqual('status'); + expect(updateObject.updateValue).toEqual('closed'); + }); + }); + + it('should display EditableTitle isLoading', async () => { + useUpdateCaseMock.mockImplementation(() => ({ + ...defaultUpdateCaseState, + isLoading: true, + updateKey: 'title', + })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="editable-title-loading"]').first().exists() + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists() + ).toBeFalsy(); + }); + }); + + it('should display description isLoading', async () => { + useUpdateCaseMock.mockImplementation(() => ({ + ...defaultUpdateCaseState, + isLoading: true, + updateKey: 'description', + })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect( + wrapper + .find( + '[data-test-subj="description-action"] [data-test-subj="user-action-title-loading"]' + ) + .first() + .exists() + ).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="description-action"] [data-test-subj="property-actions"]') + .first() + .exists() + ).toBeFalsy(); + }); + }); + + it('should display tags isLoading', async () => { + useUpdateCaseMock.mockImplementation(() => ({ + ...defaultUpdateCaseState, + isLoading: true, + updateKey: 'tags', + })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect( + wrapper + .find('[data-test-subj="case-view-tag-list"] [data-test-subj="tag-list-loading"]') + .first() + .exists() + ).toBeTruthy(); + + expect(wrapper.find('button[data-test-subj="tag-list-edit"]').first().exists()).toBeFalsy(); + }); + }); + + it('should update title', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + await waitFor(() => { + const newTitle = 'The new title'; + wrapper.find(`[data-test-subj="editable-title-edit-icon"]`).first().simulate('click'); + wrapper.update(); + wrapper + .find(`[data-test-subj="editable-title-input-field"]`) + .last() + .simulate('change', { target: { value: newTitle } }); + + wrapper.update(); + wrapper.find(`[data-test-subj="editable-title-submit-btn"]`).first().simulate('click'); + + wrapper.update(); + const updateObject = updateCaseProperty.mock.calls[0][0]; + expect(updateObject.updateKey).toEqual('title'); + expect(updateObject.updateValue).toEqual(newTitle); + }); + }); + + it('should push updates on button click', async () => { + useGetCaseUserActionsMock.mockImplementation(() => ({ + ...defaultUseGetCaseUserActions, + hasDataToPush: true, + })); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...{ ...caseProps, updateCase }} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="has-data-to-push-button"]').first().exists() + ).toBeTruthy(); + + wrapper.find('[data-test-subj="push-to-external-service"]').first().simulate('click'); + + wrapper.update(); + + expect(pushCaseToExternalService).toHaveBeenCalled(); + }); + }); + + it('should return null if error', async () => { + (useGetCase as jest.Mock).mockImplementation(() => ({ + ...defaultGetCase, + isError: true, + })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseView + {...{ + allCasesHref: 'all-cases-href', + backToAllCasesOnClick: jest.fn(), + caseDetailsHref: 'case-details-href', + caseId: '1234', + configureCasesHref: 'configure-cases-href', + getCaseDetailHrefWithCommentId: jest.fn(), + getRuleDetailsHref: jest.fn(), + onComponentInitialized: jest.fn(), + onConfigureCasesNavClick: jest.fn(), + onRuleDetailsClick: jest.fn(), + showAlertDetails: jest.fn(), + useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), + userCanCrud: true, + }} + /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper).toEqual({}); + }); + }); + + it('should return spinner if loading', async () => { + (useGetCase as jest.Mock).mockImplementation(() => ({ + ...defaultGetCase, + isLoading: true, + })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseView + {...{ + allCasesHref: 'all-cases-href', + backToAllCasesOnClick: jest.fn(), + caseDetailsHref: 'case-details-href', + caseId: '1234', + configureCasesHref: 'configure-cases-href', + getCaseDetailHrefWithCommentId: jest.fn(), + getRuleDetailsHref: jest.fn(), + onComponentInitialized: jest.fn(), + onConfigureCasesNavClick: jest.fn(), + onRuleDetailsClick: jest.fn(), + showAlertDetails: jest.fn(), + useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), + userCanCrud: true, + }} + /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find('[data-test-subj="case-view-loading"]').exists()).toBeTruthy(); + }); + }); + + it('should return case view when data is there', async () => { + (useGetCase as jest.Mock).mockImplementation(() => defaultGetCase); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseView + {...{ + allCasesHref: 'all-cases-href', + backToAllCasesOnClick: jest.fn(), + caseDetailsHref: 'case-details-href', + caseId: '1234', + configureCasesHref: 'configure-cases-href', + getCaseDetailHrefWithCommentId: jest.fn(), + getRuleDetailsHref: jest.fn(), + onComponentInitialized: jest.fn(), + onConfigureCasesNavClick: jest.fn(), + onRuleDetailsClick: jest.fn(), + showAlertDetails: jest.fn(), + useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), + userCanCrud: true, + }} + /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find('[data-test-subj="case-view-title"]').exists()).toBeTruthy(); + }); + }); + + it('should refresh data on refresh', async () => { + (useGetCase as jest.Mock).mockImplementation(() => defaultGetCase); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseView + {...{ + allCasesHref: 'all-cases-href', + backToAllCasesOnClick: jest.fn(), + caseDetailsHref: 'case-details-href', + caseId: '1234', + configureCasesHref: 'configure-cases-href', + getCaseDetailHrefWithCommentId: jest.fn(), + getRuleDetailsHref: jest.fn(), + onComponentInitialized: jest.fn(), + onConfigureCasesNavClick: jest.fn(), + onRuleDetailsClick: jest.fn(), + showAlertDetails: jest.fn(), + useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), + userCanCrud: true, + }} + /> + </Router> + </TestProviders> + ); + await waitFor(() => { + wrapper.find('[data-test-subj="case-refresh"]').first().simulate('click'); + expect(fetchCaseUserActions).toBeCalledWith('1234', 'resilient-2', undefined); + expect(fetchCase).toBeCalled(); + }); + }); + + it('should disable the push button when connector is invalid', async () => { + useGetCaseUserActionsMock.mockImplementation(() => ({ + ...defaultUseGetCaseUserActions, + hasDataToPush: true, + })); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent + {...{ + ...caseProps, + updateCase, + caseData: { ...caseProps.caseData, connectorId: 'not-exist' }, + }} + /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect( + wrapper.find('button[data-test-subj="push-to-external-service"]').first().prop('disabled') + ).toBeTruthy(); + }); + }); + + // TODO: fix when the useEffects in edit_connector are cleaned up + it.skip('should revert to the initial connector in case of failure', async () => { + updateCaseProperty.mockImplementation(({ onError }) => { + onError(); + }); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent + {...caseProps} + caseData={{ + ...caseProps.caseData, + connector: { + id: 'servicenow-1', + name: 'SN 1', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + }} + /> + </Router> + </TestProviders> + ); + const connectorName = wrapper + .find('[data-test-subj="settings-connector-card"] .euiTitle') + .first() + .text(); + + await waitFor(() => { + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + }); + + await waitFor(() => { + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); + }); + + await waitFor(() => { + wrapper.update(); + const updateObject = updateCaseProperty.mock.calls[0][0]; + expect(updateObject.updateKey).toEqual('connector'); + expect( + wrapper.find('[data-test-subj="settings-connector-card"] .euiTitle').first().text() + ).toBe(connectorName); + }); + }); + + it('should update connector', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent + {...caseProps} + caseData={{ + ...caseProps.caseData, + connector: { + id: 'servicenow-1', + name: 'SN 1', + type: ConnectorTypes.serviceNowITSM, + fields: null, + }, + }} + /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + }); + + await waitFor(() => { + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + }); + + act(() => { + wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); + }); + + await waitFor(() => { + wrapper.update(); + }); + + const updateObject = updateCaseProperty.mock.calls[0][0]; + expect(updateObject.updateKey).toEqual('connector'); + expect(updateObject.updateValue).toEqual({ + id: 'resilient-2', + name: 'My Connector 2', + type: ConnectorTypes.resilient, + fields: { + incidentTypes: null, + severityCode: null, + }, + }); + }); + + it('it should call onComponentInitialized on mount', async () => { + const onComponentInitialized = jest.fn(); + mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} onComponentInitialized={onComponentInitialized} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect(onComponentInitialized).toHaveBeenCalled(); + }); + }); + + it('should show loading content when loading alerts', async () => { + const useFetchAlertData = jest.fn().mockReturnValue([true]); + useGetCaseUserActionsMock.mockReturnValue({ + caseServices: {}, + caseUserActions: [], + hasDataToPush: false, + isError: false, + isLoading: true, + participants: [], + }); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} useFetchAlertData={useFetchAlertData} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="case-view-loading-content"]').first().exists() + ).toBeTruthy(); + expect(wrapper.find('[data-test-subj="user-actions"]').first().exists()).toBeFalsy(); + }); + }); + + it('should call show alert details with expected arguments', async () => { + const showAlertDetails = jest.fn(); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} showAlertDetails={showAlertDetails} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper + .find('[data-test-subj="comment-action-show-alert-alert-action-id"] button') + .first() + .simulate('click'); + expect(showAlertDetails).toHaveBeenCalledWith('alert-id-1', 'alert-index-1'); + }); + }); + + it('should show the rule name', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper + .find( + '[data-test-subj="comment-create-action-alert-action-id"] .euiCommentEvent__headerEvent' + ) + .first() + .text() + ).toBe('added an alert from Awesome rule'); + }); + }); + + it('should update settings', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); + + wrapper.update(); + const updateObject = updateCaseProperty.mock.calls[0][0]; + expect(updateObject.updateKey).toEqual('settings'); + expect(updateObject.updateValue).toEqual({ syncAlerts: false }); + }); + }); + + it('should show the correct connector name on the push button', async () => { + useConnectorsMock.mockImplementation(() => ({ connectors: connectorsMock, loading: false })); + useGetCaseUserActionsMock.mockImplementation(() => ({ + ...defaultUseGetCaseUserActions, + hasDataToPush: true, + })); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...{ ...caseProps, connector: { ...caseProps, name: 'old-name' } }} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper + .find('[data-test-subj="has-data-to-push-button"]') + .first() + .text() + .includes('My Connector 2') + ).toBe(true); + }); + }); + + describe('Callouts', () => { + it('it shows the danger callout when a connector has been deleted', async () => { + useConnectorsMock.mockImplementation(() => ({ connectors: [], loading: false })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find('.euiCallOut--danger').first().exists()).toBeTruthy(); + }); + }); + + it('it does NOT shows the danger callout when connectors are loading', async () => { + useConnectorsMock.mockImplementation(() => ({ connectors: [], loading: true })); + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent {...caseProps} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find('.euiCallOut--danger').first().exists()).toBeFalsy(); + }); + }); + }); + + describe('Collections', () => { + it('it does not allow the user to update the status', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent + {...caseProps} + caseData={{ ...caseProps.caseData, type: CaseType.collection }} + /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect(wrapper.find('[data-test-subj="case-action-bar-wrapper"]').exists()).toBe(true); + expect(wrapper.find('button[data-test-subj="case-view-status"]').exists()).toBe(false); + expect(wrapper.find('[data-test-subj="user-actions"]').exists()).toBe(true); + expect( + wrapper.find('button[data-test-subj="case-view-status-action-button"]').exists() + ).toBe(false); + }); + }); + + it('it shows the push button when has data to push', async () => { + useGetCaseUserActionsMock.mockImplementation(() => ({ + ...defaultUseGetCaseUserActions, + hasDataToPush: true, + })); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent + {...caseProps} + caseData={{ ...caseProps.caseData, type: CaseType.collection }} + /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect(wrapper.find('[data-test-subj="has-data-to-push-button"]').exists()).toBe(true); + }); + }); + + it('it does not show the horizontal rule when does NOT has data to push', async () => { + useGetCaseUserActionsMock.mockImplementation(() => ({ + ...defaultUseGetCaseUserActions, + hasDataToPush: false, + })); + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <CaseComponent + {...caseProps} + caseData={{ ...caseProps.caseData, type: CaseType.collection }} + /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper.find('[data-test-subj="case-view-bottom-actions-horizontal-rule"]').exists() + ).toBe(false); + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx new file mode 100644 index 0000000000000..ec73b1fff75e6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -0,0 +1,553 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; +// import { useDispatch } from 'react-redux'; +import styled from 'styled-components'; +import { isEmpty } from 'lodash/fp'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiLoadingContent, + EuiLoadingSpinner, + EuiHorizontalRule, +} from '@elastic/eui'; + +import { CaseStatuses, CaseAttributes, CaseType } from '../../../common'; +import { Case, CaseConnector } from '../../containers/types'; +import { HeaderPage } from '../header_page'; +import { EditableTitle } from '../header_page/editable_title'; +import { TagList } from '../tag_list'; +import { useGetCase } from '../../containers/use_get_case'; +import { UserActionTree } from '../user_action_tree'; +import { UserList } from '../user_list'; +import { useUpdateCase } from '../../containers/use_update_case'; +import { getTypedPayload } from '../../containers/utils'; +import { WhitePageWrapper, HeaderWrapper } from '../wrappers'; +import { CaseActionBar } from '../case_action_bar'; +import { useGetCaseUserActions } from '../../containers/use_get_case_user_actions'; +import { usePushToService } from '../use_push_to_service'; +import { EditConnector } from '../edit_connector'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { + getConnectorById, + normalizeActionConnector, + getNoneConnector, +} from '../configure_cases/utils'; +import { StatusActionButton } from '../status/button'; +import * as i18n from './translations'; +import { Ecs } from '../../common/ecs_types'; + +// TODO: All below imports depend on Timeline or SecuritySolution in some form or another +// import { SpyRoute } from '../../../common/utils/route/spy_routes'; + +const gutterTimeline = '70px'; // seems to be a timeline reference from the original file +export interface CaseViewProps { + allCasesHref: string; + backToAllCasesOnClick: (ev: MouseEvent) => void; + caseDetailsHref: string; + caseId: string; + configureCasesHref: string; + getCaseDetailHrefWithCommentId: (commentId: string) => string; + getRuleDetailsHref: (ruleId: string | null | undefined) => string; + onComponentInitialized?: () => void; + onConfigureCasesNavClick: (ev: React.MouseEvent) => void; + onRuleDetailsClick: (ruleId: string | null | undefined) => void; + renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; + renderTimelineDetailsPanel?: () => JSX.Element; + showAlertDetails: (alertId: string, index: string) => void; + subCaseId?: string; + useFetchAlertData: (alertIds: string[]) => [boolean, Record<string, Ecs>]; + userCanCrud: boolean; +} + +export interface OnUpdateFields { + key: keyof Case; + value: Case[keyof Case]; + onSuccess?: () => void; + onError?: () => void; +} + +const MyWrapper = styled.div` + padding: ${({ theme }) => + `${theme.eui.paddingSizes.l} ${theme.eui.paddingSizes.l} ${gutterTimeline} ${theme.eui.paddingSizes.l}`}; +`; + +const MyEuiFlexGroup = styled(EuiFlexGroup)` + height: 100%; +`; + +const MyEuiHorizontalRule = styled(EuiHorizontalRule)` + margin-left: 48px; + &.euiHorizontalRule--full { + width: calc(100% - 48px); + } +`; + +export interface CaseComponentProps extends CaseViewProps { + fetchCase: () => void; + caseData: Case; + updateCase: (newCase: Case) => void; +} + +export const CaseComponent = React.memo<CaseComponentProps>( + ({ + allCasesHref, + backToAllCasesOnClick, + caseData, + caseDetailsHref, + caseId, + configureCasesHref, + fetchCase, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref, + onComponentInitialized, + onConfigureCasesNavClick, + onRuleDetailsClick, + renderInvestigateInTimelineActionComponent, + renderTimelineDetailsPanel, + showAlertDetails, + subCaseId, + updateCase, + useFetchAlertData, + userCanCrud, + }) => { + const [initLoadingData, setInitLoadingData] = useState(true); + const init = useRef(true); + + const { + caseUserActions, + fetchCaseUserActions, + caseServices, + hasDataToPush, + isLoading: isLoadingUserActions, + participants, + } = useGetCaseUserActions(caseId, caseData.connector.id, subCaseId); + + const { isLoading, updateKey, updateCaseProperty } = useUpdateCase({ + caseId, + subCaseId, + }); + + // Update Fields + const onUpdateField = useCallback( + ({ key, value, onSuccess, onError }: OnUpdateFields) => { + const handleUpdateNewCase = (newCase: Case) => + updateCase({ ...newCase, comments: caseData.comments }); + switch (key) { + case 'title': + const titleUpdate = getTypedPayload<string>(value); + if (titleUpdate.length > 0) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'title', + updateValue: titleUpdate, + updateCase: handleUpdateNewCase, + caseData, + onSuccess, + onError, + }); + } + break; + case 'connector': + const connector = getTypedPayload<CaseConnector>(value); + if (connector != null) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'connector', + updateValue: connector, + updateCase: handleUpdateNewCase, + caseData, + onSuccess, + onError, + }); + } + break; + case 'description': + const descriptionUpdate = getTypedPayload<string>(value); + if (descriptionUpdate.length > 0) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'description', + updateValue: descriptionUpdate, + updateCase: handleUpdateNewCase, + caseData, + onSuccess, + onError, + }); + } + break; + case 'tags': + const tagsUpdate = getTypedPayload<string[]>(value); + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'tags', + updateValue: tagsUpdate, + updateCase: handleUpdateNewCase, + caseData, + onSuccess, + onError, + }); + break; + case 'status': + const statusUpdate = getTypedPayload<CaseStatuses>(value); + if (caseData.status !== value) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'status', + updateValue: statusUpdate, + updateCase: handleUpdateNewCase, + caseData, + onSuccess, + onError, + }); + } + break; + case 'settings': + const settingsUpdate = getTypedPayload<CaseAttributes['settings']>(value); + if (caseData.settings !== value) { + updateCaseProperty({ + fetchCaseUserActions, + updateKey: 'settings', + updateValue: settingsUpdate, + updateCase: handleUpdateNewCase, + caseData, + onSuccess, + onError, + }); + } + break; + default: + return null; + } + }, + [fetchCaseUserActions, updateCaseProperty, updateCase, caseData] + ); + + const handleUpdateCase = useCallback( + (newCase: Case) => { + updateCase(newCase); + fetchCaseUserActions(caseId, newCase.connector.id, subCaseId); + }, + [updateCase, fetchCaseUserActions, caseId, subCaseId] + ); + + const { loading: isLoadingConnectors, connectors } = useConnectors(); + + const [connectorName, isValidConnector] = useMemo(() => { + const connector = connectors.find((c) => c.id === caseData.connector.id); + return [connector?.name ?? '', !!connector]; + }, [connectors, caseData.connector]); + + const currentExternalIncident = useMemo( + () => + caseServices != null && caseServices[caseData.connector.id] != null + ? caseServices[caseData.connector.id] + : null, + [caseServices, caseData.connector] + ); + + const { pushButton, pushCallouts } = usePushToService({ + configureCasesHref, + connector: { + ...caseData.connector, + name: isEmpty(connectorName) ? caseData.connector.name : connectorName, + }, + caseServices, + caseId: caseData.id, + caseStatus: caseData.status, + connectors, + onConfigureCasesNavClick, + updateCase: handleUpdateCase, + userCanCrud, + isValidConnector: isLoadingConnectors ? true : isValidConnector, + }); + + const onSubmitConnector = useCallback( + (connectorId, connectorFields, onError, onSuccess) => { + const connector = getConnectorById(connectorId, connectors); + const connectorToUpdate = connector + ? normalizeActionConnector(connector) + : getNoneConnector(); + + onUpdateField({ + key: 'connector', + value: { ...connectorToUpdate, fields: connectorFields }, + onSuccess, + onError, + }); + }, + [onUpdateField, connectors] + ); + + const onSubmitTags = useCallback((newTags) => onUpdateField({ key: 'tags', value: newTags }), [ + onUpdateField, + ]); + + const onSubmitTitle = useCallback( + (newTitle) => onUpdateField({ key: 'title', value: newTitle }), + [onUpdateField] + ); + + const changeStatus = useCallback( + (status: CaseStatuses) => + onUpdateField({ + key: 'status', + value: status, + }), + [onUpdateField] + ); + + const handleRefresh = useCallback(() => { + fetchCaseUserActions(caseId, caseData.connector.id, subCaseId); + fetchCase(); + }, [caseData.connector.id, caseId, fetchCase, fetchCaseUserActions, subCaseId]); + + // TODO: Handle spyRoute (pass as a prop or allow component to have children??) + // const spyState = useMemo(() => ({ caseTitle: caseData.title }), [caseData.title]); + + const emailContent = useMemo( + () => ({ + subject: i18n.EMAIL_SUBJECT(caseData.title), + body: i18n.EMAIL_BODY(caseDetailsHref), + }), + [caseDetailsHref, caseData.title] + ); + + useEffect(() => { + if (initLoadingData && !isLoadingUserActions) { + setInitLoadingData(false); + } + }, [initLoadingData, isLoadingUserActions]); + + const backOptions = useMemo( + () => ({ + href: allCasesHref, + text: i18n.BACK_TO_ALL, + dataTestSubj: 'backToCases', + onClick: backToAllCasesOnClick, + }), + [allCasesHref, backToAllCasesOnClick] + ); + + const onShowAlertDetails = useCallback( + (alertId: string, index: string) => { + showAlertDetails(alertId, index); + }, + [showAlertDetails] + ); + + // useEffect used for component's initialization + useEffect(() => { + if (init.current) { + init.current = false; + if (onComponentInitialized) { + onComponentInitialized(); + } + } + }, [onComponentInitialized]); + + return ( + <> + <HeaderWrapper> + <HeaderPage + backOptions={backOptions} + data-test-subj="case-view-title" + titleNode={ + <EditableTitle + disabled={!userCanCrud} + isLoading={isLoading && updateKey === 'title'} + title={caseData.title} + onSubmit={onSubmitTitle} + /> + } + title={caseData.title} + > + <CaseActionBar + currentExternalIncident={currentExternalIncident} + caseData={caseData} + disabled={!userCanCrud} + isLoading={isLoading && (updateKey === 'status' || updateKey === 'settings')} + onRefresh={handleRefresh} + onUpdateField={onUpdateField} + /> + </HeaderPage> + </HeaderWrapper> + <WhitePageWrapper> + <MyWrapper> + {!initLoadingData && pushCallouts != null && pushCallouts} + <EuiFlexGroup> + <EuiFlexItem grow={6}> + {initLoadingData && ( + <EuiLoadingContent lines={8} data-test-subj="case-view-loading-content" /> + )} + {!initLoadingData && ( + <> + <UserActionTree + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + getRuleDetailsHref={getRuleDetailsHref} + onRuleDetailsClick={onRuleDetailsClick} + caseServices={caseServices} + caseUserActions={caseUserActions} + connectors={connectors} + data={caseData} + fetchUserActions={fetchCaseUserActions.bind( + null, + caseId, + caseData.connector.id, + subCaseId + )} + isLoadingDescription={isLoading && updateKey === 'description'} + isLoadingUserActions={isLoadingUserActions} + onShowAlertDetails={onShowAlertDetails} + onUpdateField={onUpdateField} + renderInvestigateInTimelineActionComponent={ + renderInvestigateInTimelineActionComponent + } + updateCase={updateCase} + useFetchAlertData={useFetchAlertData} + userCanCrud={userCanCrud} + /> + {(caseData.type !== CaseType.collection || hasDataToPush) && ( + <> + <MyEuiHorizontalRule + margin="s" + data-test-subj="case-view-bottom-actions-horizontal-rule" + /> + <EuiFlexGroup alignItems="center" gutterSize="s" justifyContent="flexEnd"> + {caseData.type !== CaseType.collection && ( + <EuiFlexItem grow={false}> + <StatusActionButton + status={caseData.status} + onStatusChanged={changeStatus} + disabled={!userCanCrud} + isLoading={isLoading && updateKey === 'status'} + /> + </EuiFlexItem> + )} + {hasDataToPush && ( + <EuiFlexItem data-test-subj="has-data-to-push-button" grow={false}> + {pushButton} + </EuiFlexItem> + )} + </EuiFlexGroup> + </> + )} + </> + )} + </EuiFlexItem> + <EuiFlexItem grow={2}> + <UserList + data-test-subj="case-view-user-list-reporter" + email={emailContent} + headline={i18n.REPORTER} + users={[caseData.createdBy]} + /> + <UserList + data-test-subj="case-view-user-list-participants" + email={emailContent} + headline={i18n.PARTICIPANTS} + loading={isLoadingUserActions} + users={participants} + /> + <TagList + data-test-subj="case-view-tag-list" + disabled={!userCanCrud} + tags={caseData.tags} + onSubmit={onSubmitTags} + isLoading={isLoading && updateKey === 'tags'} + /> + <EditConnector + caseFields={caseData.connector.fields} + connectors={connectors} + disabled={!userCanCrud} + hideConnectorServiceNowSir={ + subCaseId != null || caseData.type === CaseType.collection + } + isLoading={isLoadingConnectors || (isLoading && updateKey === 'connector')} + onSubmit={onSubmitConnector} + selectedConnector={caseData.connector.id} + userActions={caseUserActions} + /> + </EuiFlexItem> + </EuiFlexGroup> + </MyWrapper> + </WhitePageWrapper> + {renderTimelineDetailsPanel ? renderTimelineDetailsPanel() : null} + {/* TODO: Determine spyroute changes */} + {/* <SpyRoute state={spyState} pageName={SecurityPageName.case} /> */} + </> + ); + } +); + +export const CaseView = React.memo( + ({ + allCasesHref, + backToAllCasesOnClick, + caseDetailsHref, + caseId, + configureCasesHref, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref, + onComponentInitialized, + onConfigureCasesNavClick, + onRuleDetailsClick, + renderInvestigateInTimelineActionComponent, + renderTimelineDetailsPanel, + showAlertDetails, + subCaseId, + useFetchAlertData, + userCanCrud, + }: CaseViewProps) => { + const { data, isLoading, isError, fetchCase, updateCase } = useGetCase(caseId, subCaseId); + if (isError) { + return null; + } + if (isLoading) { + return ( + <MyEuiFlexGroup gutterSize="none" justifyContent="center" alignItems="center"> + <EuiFlexItem grow={false}> + <EuiLoadingSpinner data-test-subj="case-view-loading" size="xl" /> + </EuiFlexItem> + </MyEuiFlexGroup> + ); + } + + return ( + data && ( + <CaseComponent + allCasesHref={allCasesHref} + backToAllCasesOnClick={backToAllCasesOnClick} + caseData={data} + caseDetailsHref={caseDetailsHref} + caseId={caseId} + configureCasesHref={configureCasesHref} + fetchCase={fetchCase} + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + getRuleDetailsHref={getRuleDetailsHref} + onComponentInitialized={onComponentInitialized} + onConfigureCasesNavClick={onConfigureCasesNavClick} + onRuleDetailsClick={onRuleDetailsClick} + renderInvestigateInTimelineActionComponent={renderInvestigateInTimelineActionComponent} + renderTimelineDetailsPanel={renderTimelineDetailsPanel} + showAlertDetails={showAlertDetails} + subCaseId={subCaseId} + updateCase={updateCase} + useFetchAlertData={useFetchAlertData} + userCanCrud={userCanCrud} + /> + ) + ); + } +); + +CaseComponent.displayName = 'CaseComponent'; +CaseView.displayName = 'CaseView'; + +// eslint-disable-next-line import/no-default-export +export { CaseView as default }; diff --git a/x-pack/plugins/cases/public/components/case_view/translations.ts b/x-pack/plugins/cases/public/components/case_view/translations.ts new file mode 100644 index 0000000000000..41ffbbd9342da --- /dev/null +++ b/x-pack/plugins/cases/public/components/case_view/translations.ts @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../common/translations'; + +export const SHOWING_CASES = (actionDate: string, actionName: string, userName: string) => + i18n.translate('xpack.cases.caseView.actionHeadline', { + values: { + actionDate, + actionName, + userName, + }, + defaultMessage: '{userName} {actionName} on {actionDate}', + }); + +export const ADDED_FIELD = i18n.translate('xpack.cases.caseView.actionLabel.addedField', { + defaultMessage: 'added', +}); + +export const CHANGED_FIELD = i18n.translate('xpack.cases.caseView.actionLabel.changededField', { + defaultMessage: 'changed', +}); + +export const SELECTED_THIRD_PARTY = (thirdParty: string) => + i18n.translate('xpack.cases.caseView.actionLabel.selectedThirdParty', { + values: { + thirdParty, + }, + defaultMessage: 'selected { thirdParty } as incident management system', + }); + +export const REMOVED_THIRD_PARTY = i18n.translate( + 'xpack.cases.caseView.actionLabel.removedThirdParty', + { + defaultMessage: 'removed external incident management system', + } +); + +export const EDITED_FIELD = i18n.translate('xpack.cases.caseView.actionLabel.editedField', { + defaultMessage: 'edited', +}); + +export const REMOVED_FIELD = i18n.translate('xpack.cases.caseView.actionLabel.removedField', { + defaultMessage: 'removed', +}); + +export const VIEW_INCIDENT = (incidentNumber: string) => + i18n.translate('xpack.cases.caseView.actionLabel.viewIncident', { + defaultMessage: 'View {incidentNumber}', + values: { + incidentNumber, + }, + }); + +export const PUSHED_NEW_INCIDENT = i18n.translate( + 'xpack.cases.caseView.actionLabel.pushedNewIncident', + { + defaultMessage: 'pushed as new incident', + } +); + +export const UPDATE_INCIDENT = i18n.translate('xpack.cases.caseView.actionLabel.updateIncident', { + defaultMessage: 'updated incident', +}); + +export const ADDED_DESCRIPTION = i18n.translate('xpack.cases.caseView.actionLabel.addDescription', { + defaultMessage: 'added description', +}); + +export const EDIT_DESCRIPTION = i18n.translate('xpack.cases.caseView.edit.description', { + defaultMessage: 'Edit description', +}); + +export const QUOTE = i18n.translate('xpack.cases.caseView.edit.quote', { + defaultMessage: 'Quote', +}); + +export const EDIT_COMMENT = i18n.translate('xpack.cases.caseView.edit.comment', { + defaultMessage: 'Edit comment', +}); + +export const ON = i18n.translate('xpack.cases.caseView.actionLabel.on', { + defaultMessage: 'on', +}); + +export const ADDED_COMMENT = i18n.translate('xpack.cases.caseView.actionLabel.addComment', { + defaultMessage: 'added comment', +}); + +export const STATUS = i18n.translate('xpack.cases.caseView.statusLabel', { + defaultMessage: 'Status', +}); + +export const CASE = i18n.translate('xpack.cases.caseView.case', { + defaultMessage: 'case', +}); + +export const COMMENT = i18n.translate('xpack.cases.caseView.comment', { + defaultMessage: 'comment', +}); + +export const CASE_REFRESH = i18n.translate('xpack.cases.caseView.caseRefresh', { + defaultMessage: 'Refresh case', +}); + +export const EMAIL_SUBJECT = (caseTitle: string) => + i18n.translate('xpack.cases.caseView.emailSubject', { + values: { caseTitle }, + defaultMessage: 'Security Case - {caseTitle}', + }); + +export const EMAIL_BODY = (caseUrl: string) => + i18n.translate('xpack.cases.caseView.emailBody', { + values: { caseUrl }, + defaultMessage: 'Case reference: {caseUrl}', + }); + +export const CHANGED_CONNECTOR_FIELD = i18n.translate('xpack.cases.caseView.fieldChanged', { + defaultMessage: `changed connector field`, +}); + +export const SYNC_ALERTS = i18n.translate('xpack.cases.caseView.syncAlertsLabel', { + defaultMessage: `Sync alerts`, +}); diff --git a/x-pack/plugins/cases/public/components/edit_connector/helpers.ts b/x-pack/plugins/cases/public/components/edit_connector/helpers.ts new file mode 100644 index 0000000000000..36eb3f58c8aaf --- /dev/null +++ b/x-pack/plugins/cases/public/components/edit_connector/helpers.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseUserActions } from '../../containers/types'; + +export const getConnectorFieldsFromUserActions = (id: string, userActions: CaseUserActions[]) => { + try { + for (const action of [...userActions].reverse()) { + if (action.actionField.length === 1 && action.actionField[0] === 'connector') { + if (action.oldValue && action.newValue) { + const oldValue = JSON.parse(action.oldValue); + const newValue = JSON.parse(action.newValue); + + if (newValue.id === id) { + return newValue.fields; + } + + if (oldValue.id === id) { + return oldValue.fields; + } + } + } + } + + return null; + } catch { + return null; + } +}; diff --git a/x-pack/plugins/cases/public/components/edit_connector/index.test.tsx b/x-pack/plugins/cases/public/components/edit_connector/index.test.tsx new file mode 100644 index 0000000000000..3b6d4bd3f33f2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/edit_connector/index.test.tsx @@ -0,0 +1,141 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { EditConnector } from './index'; +import { getFormMock, useFormMock } from '../__mock__/form'; +import { TestProviders } from '../../common/mock'; +import { connectorsMock } from '../../containers/configure/mock'; +import { waitFor } from '@testing-library/react'; +import { caseUserActions } from '../../containers/mock'; + +jest.mock('../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'); + +const onSubmit = jest.fn(); +const defaultProps = { + connectors: connectorsMock, + disabled: false, + isLoading: false, + onSubmit, + selectedConnector: 'none', + caseFields: null, + userActions: caseUserActions, +}; + +describe('EditConnector ', () => { + const sampleConnector = '123'; + const formHookMock = getFormMock({ connectorId: sampleConnector }); + beforeEach(() => { + jest.clearAllMocks(); + jest.resetAllMocks(); + useFormMock.mockImplementation(() => ({ form: formHookMock })); + }); + + it('Renders no connector, and then edit', async () => { + const wrapper = mount( + <TestProviders> + <EditConnector {...defaultProps} /> + </TestProviders> + ); + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + + expect( + wrapper.find(`span[data-test-subj="dropdown-connector-no-connector"]`).last().exists() + ).toBeTruthy(); + + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + await waitFor(() => wrapper.update()); + + expect(wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().exists()).toBeTruthy(); + }); + + it('Edit external service on submit', async () => { + const wrapper = mount( + <TestProviders> + <EditConnector {...defaultProps} /> + </TestProviders> + ); + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().exists()).toBeTruthy(); + + wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); + await waitFor(() => expect(onSubmit.mock.calls[0][0]).toBe(sampleConnector)); + }); + + it('Revert to initial external service on error', async () => { + onSubmit.mockImplementation((connector, onSuccess, onError) => { + onError(new Error('An error has occurred')); + }); + const wrapper = mount( + <TestProviders> + <EditConnector {...defaultProps} /> + </TestProviders> + ); + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + + expect(wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().exists()).toBeTruthy(); + + wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); + await waitFor(() => { + wrapper.update(); + expect(formHookMock.setFieldValue).toHaveBeenCalledWith('connectorId', 'none'); + }); + }); + + it('Resets selector on cancel', async () => { + const props = { + ...defaultProps, + }; + const wrapper = mount( + <TestProviders> + <EditConnector {...props} /> + </TestProviders> + ); + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.update(); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + wrapper.update(); + + wrapper.find(`[data-test-subj="edit-connectors-cancel"]`).last().simulate('click'); + await waitFor(() => { + wrapper.update(); + expect(formHookMock.setFieldValue).toBeCalledWith( + 'connectorId', + defaultProps.selectedConnector + ); + }); + }); + + it('Renders loading spinner', async () => { + const props = { ...defaultProps, isLoading: true }; + const wrapper = mount( + <TestProviders> + <EditConnector {...props} /> + </TestProviders> + ); + await waitFor(() => + expect(wrapper.find(`[data-test-subj="connector-loading"]`).last().exists()).toBeTruthy() + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/edit_connector/index.tsx b/x-pack/plugins/cases/public/components/edit_connector/index.tsx new file mode 100644 index 0000000000000..56f1a77fc407e --- /dev/null +++ b/x-pack/plugins/cases/public/components/edit_connector/index.tsx @@ -0,0 +1,298 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useReducer } from 'react'; +import deepEqual from 'fast-deep-equal'; +import { + EuiText, + EuiHorizontalRule, + EuiFlexGroup, + EuiFlexItem, + EuiButton, + EuiButtonEmpty, + EuiLoadingSpinner, + EuiButtonIcon, +} from '@elastic/eui'; +import styled from 'styled-components'; +import { noop } from 'lodash/fp'; + +import { Form, UseField, useForm } from '../../common/shared_imports'; +import { ActionConnector, ConnectorTypeFields } from '../../../common'; +import { ConnectorSelector } from '../connector_selector/form'; +import { ConnectorFieldsForm } from '../connectors/fields_form'; +import { getConnectorById } from '../configure_cases/utils'; +import { CaseUserActions } from '../../containers/types'; +import { schema } from './schema'; +import { getConnectorFieldsFromUserActions } from './helpers'; +import * as i18n from './translations'; + +interface EditConnectorProps { + caseFields: ConnectorTypeFields['fields']; + connectors: ActionConnector[]; + isLoading: boolean; + onSubmit: ( + connectorId: string, + connectorFields: ConnectorTypeFields['fields'], + onError: () => void, + onSuccess: () => void + ) => void; + selectedConnector: string; + userActions: CaseUserActions[]; + disabled?: boolean; + hideConnectorServiceNowSir?: boolean; +} + +const MyFlexGroup = styled(EuiFlexGroup)` + ${({ theme }) => ` + margin-top: ${theme.eui.euiSizeM}; + p { + font-size: ${theme.eui.euiSizeM}; + } + `} +`; +const DisappearingFlexItem = styled(EuiFlexItem)` + ${({ $isHidden }: { $isHidden: boolean }) => + $isHidden && + ` + margin: 0 !important; + `} +`; + +interface State { + currentConnector: ActionConnector | null; + fields: ConnectorTypeFields['fields']; + editConnector: boolean; +} + +type Action = + | { type: 'SET_CURRENT_CONNECTOR'; payload: State['currentConnector'] } + | { type: 'SET_FIELDS'; payload: State['fields'] } + | { type: 'SET_EDIT_CONNECTOR'; payload: State['editConnector'] }; +const editConnectorReducer = (state: State, action: Action) => { + switch (action.type) { + case 'SET_CURRENT_CONNECTOR': + return { + ...state, + currentConnector: action.payload, + }; + case 'SET_FIELDS': + return { + ...state, + fields: action.payload, + }; + case 'SET_EDIT_CONNECTOR': + return { + ...state, + editConnector: action.payload, + }; + default: + return state; + } +}; + +const initialState = { + currentConnector: null, + fields: null, + editConnector: false, +}; + +export const EditConnector = React.memo( + ({ + caseFields, + connectors, + disabled = false, + hideConnectorServiceNowSir = false, + isLoading, + onSubmit, + selectedConnector, + userActions, + }: EditConnectorProps) => { + const { form } = useForm({ + defaultValue: { connectorId: selectedConnector }, + options: { stripEmptyFields: false }, + schema, + }); + + const { setFieldValue, submit } = form; + + const [{ currentConnector, fields, editConnector }, dispatch] = useReducer( + editConnectorReducer, + { ...initialState, fields: caseFields } + ); + + const onChangeConnector = useCallback( + (newConnectorId) => { + // Init + if (currentConnector == null) { + dispatch({ + type: 'SET_CURRENT_CONNECTOR', + payload: getConnectorById(newConnectorId, connectors), + }); + } + // change connect on dropdown action + else if (currentConnector.id !== newConnectorId) { + dispatch({ + type: 'SET_CURRENT_CONNECTOR', + payload: getConnectorById(newConnectorId, connectors), + }); + dispatch({ + type: 'SET_FIELDS', + payload: getConnectorFieldsFromUserActions(newConnectorId, userActions ?? []), + }); + } else if (fields === null) { + dispatch({ + type: 'SET_FIELDS', + payload: getConnectorFieldsFromUserActions(newConnectorId, userActions ?? []), + }); + } + }, + [currentConnector, fields, userActions, connectors] + ); + + const onFieldsChange = useCallback( + (newFields) => { + if (!deepEqual(newFields, fields)) { + dispatch({ + type: 'SET_FIELDS', + payload: newFields, + }); + } + }, + [fields, dispatch] + ); + + const onError = useCallback(() => { + setFieldValue('connectorId', selectedConnector); + dispatch({ + type: 'SET_EDIT_CONNECTOR', + payload: false, + }); + }, [dispatch, setFieldValue, selectedConnector]); + + const onCancelConnector = useCallback(() => { + setFieldValue('connectorId', selectedConnector); + dispatch({ + type: 'SET_FIELDS', + payload: caseFields, + }); + dispatch({ + type: 'SET_EDIT_CONNECTOR', + payload: false, + }); + }, [dispatch, selectedConnector, setFieldValue, caseFields]); + + const onSubmitConnector = useCallback(async () => { + const { isValid, data: newData } = await submit(); + if (isValid && newData.connectorId) { + onSubmit(newData.connectorId, fields, onError, noop); + dispatch({ + type: 'SET_EDIT_CONNECTOR', + payload: false, + }); + } + }, [dispatch, submit, fields, onSubmit, onError]); + + const onEditClick = useCallback(() => { + dispatch({ + type: 'SET_EDIT_CONNECTOR', + payload: true, + }); + }, [dispatch]); + return ( + <EuiText> + <MyFlexGroup alignItems="center" gutterSize="xs" justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <h4>{i18n.CONNECTORS}</h4> + </EuiFlexItem> + {isLoading && <EuiLoadingSpinner data-test-subj="connector-loading" />} + {!isLoading && !editConnector && ( + <EuiFlexItem data-test-subj="connector-edit" grow={false}> + <EuiButtonIcon + data-test-subj="connector-edit-button" + isDisabled={disabled} + aria-label={i18n.EDIT_CONNECTOR_ARIA} + iconType={'pencil'} + onClick={onEditClick} + /> + </EuiFlexItem> + )} + </MyFlexGroup> + <EuiHorizontalRule margin="xs" /> + <MyFlexGroup data-test-subj="edit-connectors" direction="column"> + <DisappearingFlexItem $isHidden={!editConnector}> + <Form form={form}> + <EuiFlexGroup gutterSize="none" direction="row"> + <EuiFlexItem> + <UseField + path="connectorId" + component={ConnectorSelector} + componentProps={{ + connectors, + dataTestSubj: 'caseConnectors', + defaultValue: selectedConnector, + disabled, + hideConnectorServiceNowSir, + idAria: 'caseConnectors', + isEdit: editConnector, + isLoading, + }} + onChange={onChangeConnector} + /> + </EuiFlexItem> + </EuiFlexGroup> + </Form> + </DisappearingFlexItem> + <EuiFlexItem data-test-subj="edit-connector-fields-form-flex-item"> + {(currentConnector == null || currentConnector?.id === 'none') && // Connector is none or not defined. + !(currentConnector === null && selectedConnector !== 'none') && // Connector has not been deleted. + !editConnector && ( + <EuiText size="s"> + <span>{i18n.NO_CONNECTOR}</span> + </EuiText> + )} + <ConnectorFieldsForm + connector={currentConnector} + fields={fields} + isEdit={editConnector} + onChange={onFieldsChange} + /> + </EuiFlexItem> + {editConnector && ( + <EuiFlexItem> + <EuiFlexGroup gutterSize="s" alignItems="center"> + <EuiFlexItem grow={false}> + <EuiButton + color="secondary" + data-test-subj="edit-connectors-submit" + fill + iconType="save" + onClick={onSubmitConnector} + size="s" + > + {i18n.SAVE} + </EuiButton> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="edit-connectors-cancel" + iconType="cross" + onClick={onCancelConnector} + size="s" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + </EuiFlexGroup> + </EuiFlexItem> + )} + </MyFlexGroup> + </EuiText> + ); + } +); + +EditConnector.displayName = 'EditConnector'; diff --git a/x-pack/plugins/cases/public/components/edit_connector/schema.tsx b/x-pack/plugins/cases/public/components/edit_connector/schema.tsx new file mode 100644 index 0000000000000..a12511f704be2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/edit_connector/schema.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormSchema, FIELD_TYPES } from '../../common/shared_imports'; + +export interface FormProps { + connectorId: string; +} + +export const schema: FormSchema<FormProps> = { + connectorId: { + type: FIELD_TYPES.SUPER_SELECT, + }, +}; diff --git a/x-pack/plugins/cases/public/components/edit_connector/translations.ts b/x-pack/plugins/cases/public/components/edit_connector/translations.ts new file mode 100644 index 0000000000000..ab69c94321703 --- /dev/null +++ b/x-pack/plugins/cases/public/components/edit_connector/translations.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../common/translations'; + +export const EDIT_CONNECTOR_ARIA = i18n.translate( + 'xpack.cases.editConnector.editConnectorLinkAria', + { + defaultMessage: 'click to edit connector', + } +); diff --git a/x-pack/plugins/cases/public/components/property_actions/index.tsx b/x-pack/plugins/cases/public/components/property_actions/index.tsx new file mode 100644 index 0000000000000..170af5fd3b28c --- /dev/null +++ b/x-pack/plugins/cases/public/components/property_actions/index.tsx @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useState } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiPopover, EuiButtonIcon, EuiButtonEmpty } from '@elastic/eui'; + +import * as i18n from './translations'; + +export interface PropertyActionButtonProps { + disabled?: boolean; + onClick: () => void; + iconType: string; + label: string; +} + +const ComponentId = 'property-actions'; + +const PropertyActionButton = React.memo<PropertyActionButtonProps>( + ({ disabled = false, onClick, iconType, label }) => ( + <EuiButtonEmpty + data-test-subj={`${ComponentId}-${iconType}`} + aria-label={label} + color="text" + iconSide="left" + iconType={iconType} + isDisabled={disabled} + onClick={onClick} + > + {label} + </EuiButtonEmpty> + ) +); + +PropertyActionButton.displayName = 'PropertyActionButton'; + +export interface PropertyActionsProps { + propertyActions: PropertyActionButtonProps[]; +} + +export const PropertyActions = React.memo<PropertyActionsProps>(({ propertyActions }) => { + const [showActions, setShowActions] = useState(false); + + const onButtonClick = useCallback(() => { + setShowActions(!showActions); + }, [showActions]); + + const onClosePopover = useCallback((cb?: () => void) => { + setShowActions(false); + if (cb != null) { + cb(); + } + }, []); + + return ( + <EuiFlexGroup alignItems="flexStart" data-test-subj={ComponentId} gutterSize="none"> + <EuiFlexItem grow={false}> + <EuiPopover + anchorPosition="downRight" + ownFocus + button={ + <EuiButtonIcon + data-test-subj={`${ComponentId}-ellipses`} + aria-label={i18n.ACTIONS_ARIA} + iconType="boxesHorizontal" + onClick={onButtonClick} + /> + } + id="settingsPopover" + isOpen={showActions} + closePopover={onClosePopover} + repositionOnScroll + > + <EuiFlexGroup + alignItems="flexStart" + data-test-subj={`${ComponentId}-group`} + direction="column" + gutterSize="none" + > + {propertyActions.map((action, key) => ( + <EuiFlexItem grow={false} key={`${action.label}${key}`}> + <PropertyActionButton + disabled={action.disabled} + iconType={action.iconType} + label={action.label} + onClick={() => onClosePopover(action.onClick)} + /> + </EuiFlexItem> + ))} + </EuiFlexGroup> + </EuiPopover> + </EuiFlexItem> + </EuiFlexGroup> + ); +}); + +PropertyActions.displayName = 'PropertyActions'; diff --git a/x-pack/plugins/cases/public/components/property_actions/translations.ts b/x-pack/plugins/cases/public/components/property_actions/translations.ts new file mode 100644 index 0000000000000..4066254878657 --- /dev/null +++ b/x-pack/plugins/cases/public/components/property_actions/translations.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const ACTIONS_ARIA = i18n.translate('xpack.cases.caseView.editActionsLinkAria', { + defaultMessage: 'click to see all actions', +}); diff --git a/x-pack/plugins/cases/public/components/tag_list/index.test.tsx b/x-pack/plugins/cases/public/components/tag_list/index.test.tsx new file mode 100644 index 0000000000000..296c4ba0e893b --- /dev/null +++ b/x-pack/plugins/cases/public/components/tag_list/index.test.tsx @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { TagList } from '.'; +import { getFormMock } from '../__mock__/form'; +import { TestProviders } from '../../common/mock'; +import { waitFor } from '@testing-library/react'; +import { useForm } from '../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; +import { useGetTags } from '../../containers/use_get_tags'; + +jest.mock('../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'); +jest.mock('../../containers/use_get_tags'); +jest.mock( + '../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', + () => ({ + FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => + children({ tags: ['rad', 'dude'] }), + }) +); +jest.mock('@elastic/eui', () => { + const original = jest.requireActual('@elastic/eui'); + return { + ...original, + EuiFieldText: () => <input />, + }; +}); +const onSubmit = jest.fn(); +const defaultProps = { + disabled: false, + isLoading: false, + onSubmit, + tags: [], +}; + +describe('TagList ', () => { + const sampleTags = ['coke', 'pepsi']; + const fetchTags = jest.fn(); + const formHookMock = getFormMock({ tags: sampleTags }); + beforeEach(() => { + jest.resetAllMocks(); + (useForm as jest.Mock).mockImplementation(() => ({ form: formHookMock })); + + (useGetTags as jest.Mock).mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); + }); + + it('Renders no tags, and then edit', () => { + const wrapper = mount( + <TestProviders> + <TagList {...defaultProps} /> + </TestProviders> + ); + expect(wrapper.find(`[data-test-subj="no-tags"]`).last().exists()).toBeTruthy(); + wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); + expect(wrapper.find(`[data-test-subj="no-tags"]`).last().exists()).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="edit-tags"]`).last().exists()).toBeTruthy(); + }); + + it('Edit tag on submit', async () => { + const wrapper = mount( + <TestProviders> + <TagList {...defaultProps} /> + </TestProviders> + ); + wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); + wrapper.find(`[data-test-subj="edit-tags-submit"]`).last().simulate('click'); + await waitFor(() => expect(onSubmit).toBeCalledWith(sampleTags)); + }); + + it('Tag options render with new tags added', () => { + const wrapper = mount( + <TestProviders> + <TagList {...defaultProps} /> + </TestProviders> + ); + wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); + expect( + wrapper.find(`[data-test-subj="caseTags"] [data-test-subj="input"]`).first().prop('options') + ).toEqual([{ label: 'coke' }, { label: 'pepsi' }, { label: 'rad' }, { label: 'dude' }]); + }); + + it('Cancels on cancel', () => { + const props = { + ...defaultProps, + tags: ['pepsi'], + }; + const wrapper = mount( + <TestProviders> + <TagList {...props} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="tag-pepsi"]`).last().exists()).toBeTruthy(); + wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); + + expect(wrapper.find(`[data-test-subj="tag-pepsi"]`).last().exists()).toBeFalsy(); + wrapper.find(`[data-test-subj="edit-tags-cancel"]`).last().simulate('click'); + wrapper.update(); + expect(wrapper.find(`[data-test-subj="tag-pepsi"]`).last().exists()).toBeTruthy(); + }); + + it('Renders disabled button', () => { + const props = { ...defaultProps, disabled: true }; + const wrapper = mount( + <TestProviders> + <TagList {...props} /> + </TestProviders> + ); + expect( + wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().prop('disabled') + ).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/tag_list/index.tsx b/x-pack/plugins/cases/public/components/tag_list/index.tsx new file mode 100644 index 0000000000000..137d58932b6ef --- /dev/null +++ b/x-pack/plugins/cases/public/components/tag_list/index.tsx @@ -0,0 +1,176 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useState } from 'react'; +import { + EuiText, + EuiHorizontalRule, + EuiFlexGroup, + EuiFlexItem, + EuiButton, + EuiButtonEmpty, + EuiButtonIcon, + EuiLoadingSpinner, +} from '@elastic/eui'; +import styled, { css } from 'styled-components'; +import { isEqual } from 'lodash/fp'; +import * as i18n from './translations'; +import { Form, FormDataProvider, useForm, getUseField, Field } from '../../common/shared_imports'; +import { schema } from './schema'; +import { useGetTags } from '../../containers/use_get_tags'; + +import { Tags } from './tags'; + +const CommonUseField = getUseField({ component: Field }); + +interface TagListProps { + disabled?: boolean; + isLoading: boolean; + onSubmit: (a: string[]) => void; + tags: string[]; +} + +const MyFlexGroup = styled(EuiFlexGroup)` + ${({ theme }) => css` + margin-top: ${theme.eui.euiSizeM}; + p { + font-size: ${theme.eui.euiSizeM}; + } + `} +`; + +export const TagList = React.memo( + ({ disabled = false, isLoading, onSubmit, tags }: TagListProps) => { + const initialState = { tags }; + const { form } = useForm({ + defaultValue: initialState, + options: { stripEmptyFields: false }, + schema, + }); + const { submit } = form; + const [isEditTags, setIsEditTags] = useState(false); + + const onSubmitTags = useCallback(async () => { + const { isValid, data: newData } = await submit(); + if (isValid && newData.tags) { + onSubmit(newData.tags); + setIsEditTags(false); + } + }, [onSubmit, submit]); + + const { tags: tagOptions } = useGetTags(); + const [options, setOptions] = useState( + tagOptions.map((label) => ({ + label, + })) + ); + + useEffect( + () => + setOptions( + tagOptions.map((label) => ({ + label, + })) + ), + [tagOptions] + ); + return ( + <EuiText> + <EuiFlexGroup alignItems="center" gutterSize="xs" justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <h4>{i18n.TAGS}</h4> + </EuiFlexItem> + {isLoading && <EuiLoadingSpinner data-test-subj="tag-list-loading" />} + {!isLoading && ( + <EuiFlexItem data-test-subj="tag-list-edit" grow={false}> + <EuiButtonIcon + data-test-subj="tag-list-edit-button" + isDisabled={disabled} + aria-label={i18n.EDIT_TAGS_ARIA} + iconType={'pencil'} + onClick={setIsEditTags.bind(null, true)} + /> + </EuiFlexItem> + )} + </EuiFlexGroup> + <EuiHorizontalRule margin="xs" /> + <MyFlexGroup gutterSize="none" data-test-subj="case-tags"> + {tags.length === 0 && !isEditTags && <p data-test-subj="no-tags">{i18n.NO_TAGS}</p>} + {!isEditTags && <Tags tags={tags} color="hollow" />} + {isEditTags && ( + <EuiFlexGroup data-test-subj="edit-tags" direction="column"> + <EuiFlexItem> + <Form form={form}> + <CommonUseField + path="tags" + componentProps={{ + idAria: 'caseTags', + 'data-test-subj': 'caseTags', + euiFieldProps: { + fullWidth: true, + placeholder: '', + options, + noSuggestions: false, + }, + }} + /> + <FormDataProvider pathsToWatch="tags"> + {({ tags: anotherTags }) => { + const current: string[] = options.map((opt) => opt.label); + const newOptions = anotherTags.reduce((acc: string[], item: string) => { + if (!acc.includes(item)) { + return [...acc, item]; + } + return acc; + }, current); + if (!isEqual(current, newOptions)) { + setOptions( + newOptions.map((label: string) => ({ + label, + })) + ); + } + return null; + }} + </FormDataProvider> + </Form> + </EuiFlexItem> + <EuiFlexItem> + <EuiFlexGroup gutterSize="s" alignItems="center"> + <EuiFlexItem grow={false}> + <EuiButton + color="secondary" + data-test-subj="edit-tags-submit" + fill + iconType="save" + onClick={onSubmitTags} + size="s" + > + {i18n.SAVE} + </EuiButton> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="edit-tags-cancel" + iconType="cross" + onClick={setIsEditTags.bind(null, false)} + size="s" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + </EuiFlexGroup> + </EuiFlexItem> + </EuiFlexGroup> + )} + </MyFlexGroup> + </EuiText> + ); + } +); + +TagList.displayName = 'TagList'; diff --git a/x-pack/plugins/cases/public/components/tag_list/schema.tsx b/x-pack/plugins/cases/public/components/tag_list/schema.tsx new file mode 100644 index 0000000000000..d7db17bd97cbd --- /dev/null +++ b/x-pack/plugins/cases/public/components/tag_list/schema.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormSchema } from '../../common/shared_imports'; +import { schemaTags } from '../create/schema'; + +export const schema: FormSchema = { + tags: schemaTags, +}; diff --git a/x-pack/plugins/cases/public/components/tag_list/tags.tsx b/x-pack/plugins/cases/public/components/tag_list/tags.tsx new file mode 100644 index 0000000000000..b38cf1745307e --- /dev/null +++ b/x-pack/plugins/cases/public/components/tag_list/tags.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiBadgeGroup, EuiBadge, EuiBadgeGroupProps } from '@elastic/eui'; + +interface TagsProps { + tags: string[]; + color?: string; + gutterSize?: EuiBadgeGroupProps['gutterSize']; +} + +const TagsComponent: React.FC<TagsProps> = ({ tags, color = 'default', gutterSize }) => { + return ( + <> + {tags.length > 0 && ( + <EuiBadgeGroup gutterSize={gutterSize}> + {tags.map((tag) => ( + <EuiBadge data-test-subj={`tag-${tag}`} color={color} key={tag}> + {tag} + </EuiBadge> + ))} + </EuiBadgeGroup> + )} + </> + ); +}; + +export const Tags = memo(TagsComponent); diff --git a/x-pack/plugins/cases/public/components/tag_list/translations.ts b/x-pack/plugins/cases/public/components/tag_list/translations.ts new file mode 100644 index 0000000000000..54e9cd05039fc --- /dev/null +++ b/x-pack/plugins/cases/public/components/tag_list/translations.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../../common/translations'; + +export const EDIT_TAGS_ARIA = i18n.translate('xpack.cases.caseView.editTagsLinkAria', { + defaultMessage: 'click to edit tags', +}); diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx index 335dd0deaff54..a50db393a116c 100644 --- a/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx @@ -27,7 +27,7 @@ export interface UsePushToService { connector: CaseConnector; caseServices: CaseServices; connectors: ActionConnector[]; - onConfigureCasesNavClick: () => void; + onConfigureCasesNavClick: (ev: React.MouseEvent) => void; updateCase: (newCase: Case) => void; userCanCrud: boolean; isValidConnector: boolean; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx new file mode 100644 index 0000000000000..a4693e67ad2f3 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx @@ -0,0 +1,185 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { CaseStatuses } from '../../../common'; +import { basicPush, getUserAction } from '../../containers/mock'; +import { getLabelTitle, getPushedServiceLabelTitle, getConnectorLabelTitle } from './helpers'; +import { connectorsMock } from '../../containers/configure/mock'; +import * as i18n from './translations'; + +describe('User action tree helpers', () => { + const connectors = connectorsMock; + it('label title generated for update tags', () => { + const action = getUserAction(['tags'], 'update'); + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'tags', + }); + + const wrapper = mount(<>{result}</>); + expect(wrapper.find(`[data-test-subj="ua-tags-label"]`).first().text()).toEqual( + ` ${i18n.TAGS.toLowerCase()}` + ); + + expect(wrapper.find(`[data-test-subj="tag-${action.newValue}"]`).first().text()).toEqual( + action.newValue + ); + }); + + it('label title generated for update title', () => { + const action = getUserAction(['title'], 'update'); + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'title', + }); + + expect(result).toEqual( + `${i18n.CHANGED_FIELD.toLowerCase()} ${i18n.CASE_NAME.toLowerCase()} ${i18n.TO} "${ + action.newValue + }"` + ); + }); + + it('label title generated for update description', () => { + const action = getUserAction(['description'], 'update'); + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'description', + }); + + expect(result).toEqual(`${i18n.EDITED_FIELD} ${i18n.DESCRIPTION.toLowerCase()}`); + }); + + it('label title generated for update status to open', () => { + const action = { ...getUserAction(['status'], 'update'), newValue: CaseStatuses.open }; + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'status', + }); + + const wrapper = mount(<>{result}</>); + expect(wrapper.find(`[data-test-subj="status-badge-open"]`).first().text()).toEqual('Open'); + }); + + it('label title generated for update status to in-progress', () => { + const action = { + ...getUserAction(['status'], 'update'), + newValue: CaseStatuses['in-progress'], + }; + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'status', + }); + + const wrapper = mount(<>{result}</>); + expect(wrapper.find(`[data-test-subj="status-badge-in-progress"]`).first().text()).toEqual( + 'In progress' + ); + }); + + it('label title generated for update status to closed', () => { + const action = { ...getUserAction(['status'], 'update'), newValue: CaseStatuses.closed }; + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'status', + }); + + const wrapper = mount(<>{result}</>); + expect(wrapper.find(`[data-test-subj="status-badge-closed"]`).first().text()).toEqual('Closed'); + }); + + it('label title is empty when status is not valid', () => { + const action = { ...getUserAction(['status'], 'update'), newValue: CaseStatuses.closed }; + const result: string | JSX.Element = getLabelTitle({ + action: { ...action, newValue: 'not-exist' }, + field: 'status', + }); + + expect(result).toEqual(''); + }); + + it('label title generated for update comment', () => { + const action = getUserAction(['comment'], 'update'); + const result: string | JSX.Element = getLabelTitle({ + action, + field: 'comment', + }); + + expect(result).toEqual(`${i18n.EDITED_FIELD} ${i18n.COMMENT.toLowerCase()}`); + }); + + it('label title generated for pushed incident', () => { + const action = getUserAction(['pushed'], 'push-to-service'); + const result: string | JSX.Element = getPushedServiceLabelTitle(action, true); + + const wrapper = mount(<>{result}</>); + expect(wrapper.find(`[data-test-subj="pushed-label"]`).first().text()).toEqual( + `${i18n.PUSHED_NEW_INCIDENT} ${basicPush.connectorName}` + ); + expect(wrapper.find(`[data-test-subj="pushed-value"]`).first().prop('href')).toEqual( + JSON.parse(action.newValue).external_url + ); + }); + + it('label title generated for needs update incident', () => { + const action = getUserAction(['pushed'], 'push-to-service'); + const result: string | JSX.Element = getPushedServiceLabelTitle(action, false); + + const wrapper = mount(<>{result}</>); + expect(wrapper.find(`[data-test-subj="pushed-label"]`).first().text()).toEqual( + `${i18n.UPDATE_INCIDENT} ${basicPush.connectorName}` + ); + expect(wrapper.find(`[data-test-subj="pushed-value"]`).first().prop('href')).toEqual( + JSON.parse(action.newValue).external_url + ); + }); + + it('label title generated for update connector - change connector', () => { + const action = { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: 'servicenow-1' }), + newValue: JSON.stringify({ id: 'resilient-2' }), + }; + const result: string | JSX.Element = getConnectorLabelTitle({ + action, + connectors, + }); + + expect(result).toEqual('selected My Connector 2 as incident management system'); + }); + + it('label title generated for update connector - change connector to none', () => { + const action = { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: 'servicenow-1' }), + newValue: JSON.stringify({ id: 'none' }), + }; + const result: string | JSX.Element = getConnectorLabelTitle({ + action, + connectors, + }); + + expect(result).toEqual('removed external incident management system'); + }); + + it('label title generated for update connector - field change', () => { + const action = { + ...getUserAction(['connector'], 'update'), + oldValue: JSON.stringify({ id: 'servicenow-1' }), + newValue: JSON.stringify({ id: 'servicenow-1' }), + }; + const result: string | JSX.Element = getConnectorLabelTitle({ + action, + connectors, + }); + + expect(result).toEqual('changed connector field'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx new file mode 100644 index 0000000000000..ac5e66d51dc6c --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx @@ -0,0 +1,373 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, EuiCommentProps } from '@elastic/eui'; +import React from 'react'; + +// TODO: Timeline integration +import { + CaseFullExternalService, + ActionConnector, + CaseStatuses, + CommentType, +} from '../../../common'; +import { CaseUserActions } from '../../containers/types'; +import { CaseServices } from '../../containers/use_get_case_user_actions'; +import { parseString } from '../../containers/utils'; +import { Tags } from '../tag_list/tags'; +import { UserActionUsernameWithAvatar } from './user_action_username_with_avatar'; +import { UserActionTimestamp } from './user_action_timestamp'; +import { UserActionCopyLink } from './user_action_copy_link'; +import { UserActionMoveToReference } from './user_action_move_to_reference'; +import { Status, statuses } from '../status'; +import { UserActionShowAlert } from './user_action_show_alert'; +import * as i18n from './translations'; +import { AlertCommentEvent } from './user_action_alert_comment_event'; + +interface LabelTitle { + action: CaseUserActions; + field: string; +} + +const getStatusTitle = (id: string, status: CaseStatuses) => { + return ( + <EuiFlexGroup + gutterSize="s" + alignItems={'center'} + data-test-subj={`${id}-user-action-status-title`} + > + <EuiFlexItem grow={false}>{i18n.MARKED_CASE_AS}</EuiFlexItem> + <EuiFlexItem grow={false}> + <Status type={status} /> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +const isStatusValid = (status: string): status is CaseStatuses => + Object.prototype.hasOwnProperty.call(statuses, status); + +export const getLabelTitle = ({ action, field }: LabelTitle) => { + if (field === 'tags') { + return getTagsLabelTitle(action); + } else if (field === 'title' && action.action === 'update') { + return `${i18n.CHANGED_FIELD.toLowerCase()} ${i18n.CASE_NAME.toLowerCase()} ${i18n.TO} "${ + action.newValue + }"`; + } else if (field === 'description' && action.action === 'update') { + return `${i18n.EDITED_FIELD} ${i18n.DESCRIPTION.toLowerCase()}`; + } else if (field === 'status' && action.action === 'update') { + const status = action.newValue ?? ''; + if (isStatusValid(status)) { + return getStatusTitle(action.actionId, status); + } + + return ''; + } else if (field === 'comment' && action.action === 'update') { + return `${i18n.EDITED_FIELD} ${i18n.COMMENT.toLowerCase()}`; + } + + return ''; +}; + +export const getConnectorLabelTitle = ({ + action, + connectors, +}: { + action: CaseUserActions; + connectors: ActionConnector[]; +}) => { + const oldValue = parseString(`${action.oldValue}`); + const newValue = parseString(`${action.newValue}`); + + if (oldValue === null || newValue === null) { + return ''; + } + + // Connector changed + if (oldValue.id !== newValue.id) { + const newConnector = connectors.find((c) => c.id === newValue.id); + return newValue.id != null && newValue.id !== 'none' && newConnector != null + ? i18n.SELECTED_THIRD_PARTY(newConnector.name) + : i18n.REMOVED_THIRD_PARTY; + } else { + // Field changed + return i18n.CHANGED_CONNECTOR_FIELD; + } +}; + +const getTagsLabelTitle = (action: CaseUserActions) => { + const tags = action.newValue != null ? action.newValue.split(',') : []; + + return ( + <EuiFlexGroup alignItems="baseline" gutterSize="xs" component="span"> + <EuiFlexItem data-test-subj="ua-tags-label" grow={false}> + {action.action === 'add' && i18n.ADDED_FIELD} + {action.action === 'delete' && i18n.REMOVED_FIELD} {i18n.TAGS.toLowerCase()} + </EuiFlexItem> + <EuiFlexItem grow={false}> + <Tags tags={tags} gutterSize="xs" /> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +export const getPushedServiceLabelTitle = (action: CaseUserActions, firstPush: boolean) => { + const pushedVal = JSON.parse(action.newValue ?? '') as CaseFullExternalService; + return ( + <EuiFlexGroup alignItems="baseline" gutterSize="xs" data-test-subj="pushed-service-label-title"> + <EuiFlexItem data-test-subj="pushed-label"> + {`${firstPush ? i18n.PUSHED_NEW_INCIDENT : i18n.UPDATE_INCIDENT} ${ + pushedVal?.connector_name + }`} + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiLink data-test-subj="pushed-value" href={pushedVal?.external_url} target="_blank"> + {pushedVal?.external_title} + </EuiLink> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +export const getPushInfo = ( + caseServices: CaseServices, + parsedValue: { connector_id: string; connector_name: string }, + index: number +) => + parsedValue != null + ? { + firstPush: caseServices[parsedValue.connector_id]?.firstPushIndex === index, + parsedConnectorId: parsedValue.connector_id, + parsedConnectorName: parsedValue.connector_name, + } + : { + firstPush: false, + parsedConnectorId: 'none', + parsedConnectorName: 'none', + }; + +const getUpdateActionIcon = (actionField: string): string => { + if (actionField === 'tags') { + return 'tag'; + } else if (actionField === 'status') { + return 'folderClosed'; + } + + return 'dot'; +}; + +export const getUpdateAction = ({ + action, + getCaseDetailHrefWithCommentId, + label, + handleOutlineComment, +}: { + action: CaseUserActions; + getCaseDetailHrefWithCommentId: (commentId: string) => string; + label: string | JSX.Element; + handleOutlineComment: (id: string) => void; +}): EuiCommentProps => ({ + username: ( + <UserActionUsernameWithAvatar + username={action.actionBy.username} + fullName={action.actionBy.fullName} + /> + ), + type: 'update', + event: label, + 'data-test-subj': `${action.actionField[0]}-${action.action}-action-${action.actionId}`, + timestamp: <UserActionTimestamp createdAt={action.actionAt} />, + timelineIcon: getUpdateActionIcon(action.actionField[0]), + actions: ( + <EuiFlexGroup> + <EuiFlexItem> + <UserActionCopyLink + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + id={action.actionId} + /> + </EuiFlexItem> + {action.action === 'update' && action.commentId != null && ( + <EuiFlexItem> + <UserActionMoveToReference id={action.commentId} outlineComment={handleOutlineComment} /> + </EuiFlexItem> + )} + </EuiFlexGroup> + ), +}); + +export const getAlertAttachment = ({ + action, + alertId, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref, + onRuleDetailsClick, + index, + loadingAlertData, + ruleId, + ruleName, + onShowAlertDetails, +}: { + action: CaseUserActions; + getCaseDetailHrefWithCommentId: (commentId: string) => string; + getRuleDetailsHref: (ruleId: string | null | undefined) => string; + onRuleDetailsClick: (ruleId: string | null | undefined) => void; + onShowAlertDetails: (alertId: string, index: string) => void; + alertId: string; + index: string; + loadingAlertData: boolean; + ruleId?: string | null; + ruleName?: string | null; +}): EuiCommentProps => { + return { + username: ( + <UserActionUsernameWithAvatar + username={action.actionBy.username} + fullName={action.actionBy.fullName} + /> + ), + className: 'comment-alert', + type: 'update', + event: ( + <AlertCommentEvent + alertId={alertId} + getRuleDetailsHref={getRuleDetailsHref} + loadingAlertData={loadingAlertData} + onRuleDetailsClick={onRuleDetailsClick} + ruleId={ruleId} + ruleName={ruleName} + commentType={CommentType.alert} + /> + ), + 'data-test-subj': `${action.actionField[0]}-${action.action}-action-${action.actionId}`, + timestamp: <UserActionTimestamp createdAt={action.actionAt} />, + timelineIcon: 'bell', + actions: ( + <EuiFlexGroup> + <EuiFlexItem> + <UserActionCopyLink + id={action.actionId} + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + /> + </EuiFlexItem> + <EuiFlexItem> + <UserActionShowAlert + id={action.actionId} + alertId={alertId} + index={index} + onShowAlertDetails={onShowAlertDetails} + /> + </EuiFlexItem> + </EuiFlexGroup> + ), + }; +}; + +export const toStringArray = (value: unknown): string[] => { + if (Array.isArray(value)) { + return value.reduce<string[]>((acc, v) => { + if (v != null) { + switch (typeof v) { + case 'number': + case 'boolean': + return [...acc, v.toString()]; + case 'object': + try { + return [...acc, JSON.stringify(v)]; + } catch { + return [...acc, 'Invalid Object']; + } + case 'string': + return [...acc, v]; + default: + return [...acc, `${v}`]; + } + } + return acc; + }, []); + } else if (value == null) { + return []; + } else if (!Array.isArray(value) && typeof value === 'object') { + try { + return [JSON.stringify(value)]; + } catch { + return ['Invalid Object']; + } + } else { + return [`${value}`]; + } +}; + +export const getGeneratedAlertsAttachment = ({ + action, + alertIds, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref, + onRuleDetailsClick, + renderInvestigateInTimelineActionComponent, + ruleId, + ruleName, +}: { + action: CaseUserActions; + alertIds: string[]; + getCaseDetailHrefWithCommentId: (commentId: string) => string; + getRuleDetailsHref: (ruleId: string | null | undefined) => string; + onRuleDetailsClick: (ruleId: string | null | undefined) => void; + renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; + ruleId: string; + ruleName: string; +}): EuiCommentProps => { + return { + username: <EuiIcon type="logoSecurity" size="m" />, + className: 'comment-alert', + type: 'update', + event: ( + <AlertCommentEvent + alertId={alertIds[0]} + getRuleDetailsHref={getRuleDetailsHref} + onRuleDetailsClick={onRuleDetailsClick} + ruleId={ruleId} + ruleName={ruleName} + alertsCount={alertIds.length} + commentType={CommentType.generatedAlert} + /> + ), + 'data-test-subj': `${action.actionField[0]}-${action.action}-action-${action.actionId}`, + timestamp: <UserActionTimestamp createdAt={action.actionAt} />, + timelineIcon: 'bell', + actions: ( + <EuiFlexGroup> + <EuiFlexItem> + <UserActionCopyLink + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + id={action.actionId} + /> + </EuiFlexItem> + {renderInvestigateInTimelineActionComponent ? ( + <EuiFlexItem>{renderInvestigateInTimelineActionComponent(alertIds)}</EuiFlexItem> + ) : null} + </EuiFlexGroup> + ), + }; +}; + +interface Signal { + rule: { + id: string; + name: string; + to: string; + from: string; + }; +} + +export interface Alert { + _id: string; + _index: string; + '@timestamp': string; + signal: Signal; + [key: string]: unknown; +} diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx new file mode 100644 index 0000000000000..be46ba5148f2c --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx @@ -0,0 +1,416 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor } from '@testing-library/react'; + +import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; +import { getFormMock, useFormMock, useFormDataMock } from '../__mock__/form'; +import { useUpdateComment } from '../../containers/use_update_comment'; +import { basicCase, basicPush, getUserAction } from '../../containers/mock'; +import { UserActionTree } from '.'; +import { TestProviders } from '../../common/mock'; +import { Ecs } from '../../common/ecs_types'; + +const fetchUserActions = jest.fn(); +const onUpdateField = jest.fn(); +const updateCase = jest.fn(); +const onShowAlertDetails = jest.fn(); + +const defaultProps = { + caseServices: {}, + caseUserActions: [], + connectors: [], + getCaseDetailHrefWithCommentId: jest.fn(), + getRuleDetailsHref: jest.fn(), + onRuleDetailsClick: jest.fn(), + data: basicCase, + fetchUserActions, + isLoadingDescription: false, + isLoadingUserActions: false, + onUpdateField, + selectedAlertPatterns: ['some-test-pattern'], + updateCase, + userCanCrud: true, + useFetchAlertData: (): [boolean, Record<string, Ecs>] => [ + false, + { 'some-id': { _id: 'some-id' } }, + ], + alerts: {}, + onShowAlertDetails, +}; +const useUpdateCommentMock = useUpdateComment as jest.Mock; +jest.mock('../../containers/use_update_comment'); +jest.mock('./user_action_timestamp'); + +const patchComment = jest.fn(); +describe('UserActionTree ', () => { + const sampleData = { + content: 'what a great comment update', + }; + beforeEach(() => { + jest.clearAllMocks(); + jest.resetAllMocks(); + useUpdateCommentMock.mockImplementation(() => ({ + isLoadingIds: [], + patchComment, + })); + const formHookMock = getFormMock(sampleData); + useFormMock.mockImplementation(() => ({ form: formHookMock })); + useFormDataMock.mockImplementation(() => [{ content: sampleData.content, comment: '' }]); + jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); + jest + .spyOn(routeData, 'useParams') + .mockReturnValue({ detailName: 'case-id', subCaseId: 'sub-case-id' }); + }); + + it('Loading spinner when user actions loading and displays fullName/username', () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...{ ...defaultProps, isLoadingUserActions: true }} /> + </Router> + </TestProviders> + ); + expect(wrapper.find(`[data-test-subj="user-actions-loading"]`).exists()).toBeTruthy(); + + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().prop('name')).toEqual( + defaultProps.data.createdBy.fullName + ); + + expect( + wrapper.find(`[data-test-subj="description-action"] figcaption strong`).first().text() + ).toEqual(defaultProps.data.createdBy.username); + }); + + it('Renders service now update line with top and bottom when push is required', async () => { + const ourActions = [ + getUserAction(['pushed'], 'push-to-service'), + getUserAction(['comment'], 'update'), + ]; + + const props = { + ...defaultProps, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 0, + lastPushIndex: 0, + commentsToUpdate: [`${ourActions[ourActions.length - 1].commentId}`], + hasDataToPush: true, + }, + }, + caseUserActions: ourActions, + }; + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toBeTruthy(); + }); + }); + + it('Renders service now update line with top only when push is up to date', async () => { + const ourActions = [getUserAction(['pushed'], 'push-to-service')]; + const props = { + ...defaultProps, + caseUserActions: ourActions, + caseServices: { + '123': { + ...basicPush, + firstPushIndex: 0, + lastPushIndex: 0, + commentsToUpdate: [], + hasDataToPush: false, + }, + }, + }; + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toBeFalsy(); + }); + }); + + it('Outlines comment when update move to link is clicked', async () => { + const ourActions = [getUserAction(['comment'], 'create'), getUserAction(['comment'], 'update')]; + const props = { + ...defaultProps, + caseUserActions: ourActions, + }; + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper + .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) + .first() + .hasClass('outlined') + ).toBeFalsy(); + + wrapper + .find( + `[data-test-subj="comment-update-action-${ourActions[1].actionId}"] [data-test-subj="move-to-link-${props.data.comments[0].id}"]` + ) + .first() + .simulate('click'); + + wrapper.update(); + expect( + wrapper + .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) + .first() + .hasClass('outlined') + ).toBeTruthy(); + }); + }); + + it('Switches to markdown when edit is clicked and back to panel when canceled', async () => { + const ourActions = [getUserAction(['comment'], 'create')]; + const props = { + ...defaultProps, + caseUserActions: ourActions, + }; + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + expect( + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` + ) + .exists() + ).toEqual(false); + + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-ellipses"]` + ) + .first() + .simulate('click'); + + wrapper.update(); + + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-pencil"]` + ) + .first() + .simulate('click'); + + expect( + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` + ) + .exists() + ).toEqual(true); + + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-cancel-markdown"]` + ) + .first() + .simulate('click'); + + expect( + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` + ) + .exists() + ).toEqual(false); + }); + }); + + it('calls update comment when comment markdown is saved', async () => { + const ourActions = [getUserAction(['comment'], 'create')]; + const props = { + ...defaultProps, + caseUserActions: ourActions, + }; + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-ellipses"]` + ) + .first() + .simulate('click'); + + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-pencil"]` + ) + .first() + .simulate('click'); + + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-save-markdown"]` + ) + .first() + .simulate('click'); + + await waitFor(() => { + wrapper.update(); + expect( + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` + ) + .exists() + ).toEqual(false); + expect(patchComment).toBeCalledWith({ + commentUpdate: sampleData.content, + caseId: 'case-id', + subCaseId: 'sub-case-id', + commentId: props.data.comments[0].id, + fetchUserActions, + updateCase, + version: props.data.comments[0].version, + }); + }); + }); + + it('calls update description when description markdown is saved', async () => { + const props = defaultProps; + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-ellipses"]`) + .first() + .simulate('click'); + + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-pencil"]`) + .first() + .simulate('click'); + + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="user-action-save-markdown"]`) + .first() + .simulate('click'); + await waitFor(() => { + wrapper.update(); + + expect( + wrapper + .find( + `[data-test-subj="description-action"] [data-test-subj="user-action-markdown-form"]` + ) + .exists() + ).toEqual(false); + + expect(onUpdateField).toBeCalledWith({ key: 'description', value: sampleData.content }); + }); + }); + + it('quotes', async () => { + const commentData = { + comment: '', + }; + const setFieldValue = jest.fn(); + + const formHookMock = getFormMock(commentData); + useFormMock.mockImplementation(() => ({ form: { ...formHookMock, setFieldValue } })); + + const props = defaultProps; + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-ellipses"]`) + .first() + .simulate('click'); + + await waitFor(() => { + wrapper.update(); + + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-quote"]`) + .first() + .simulate('click'); + }); + + expect(setFieldValue).toBeCalledWith('comment', `> ${props.data.description} \n`); + }); + + it('Outlines comment when url param is provided', async () => { + const commentId = 'basic-comment-id'; + jest.spyOn(routeData, 'useParams').mockReturnValue({ commentId }); + + const ourActions = [getUserAction(['comment'], 'create')]; + const props = { + ...defaultProps, + caseUserActions: ourActions, + }; + + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionTree {...props} /> + </Router> + </TestProviders> + ); + + await waitFor(() => { + wrapper.update(); + expect( + wrapper + .find(`[data-test-subj="comment-create-action-${commentId}"]`) + .first() + .hasClass('outlined') + ).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx new file mode 100644 index 0000000000000..7a749d89c42b6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx @@ -0,0 +1,594 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiCommentList, + EuiCommentProps, +} from '@elastic/eui'; +import classNames from 'classnames'; +import { isEmpty } from 'lodash'; +import React, { useCallback, useMemo, useRef, useState, useEffect } from 'react'; +import { useParams } from 'react-router-dom'; +import styled from 'styled-components'; +import { isRight } from 'fp-ts/Either'; + +import * as i18n from './translations'; + +import { Case, CaseUserActions } from '../../containers/types'; +import { useUpdateComment } from '../../containers/use_update_comment'; +import { useCurrentUser } from '../../common/lib/kibana'; +import { AddComment, AddCommentRefObject } from '../add_comment'; +import { + ActionConnector, + AlertCommentRequestRt, + CommentType, + ContextTypeUserRt, +} from '../../../common'; +import { CaseServices } from '../../containers/use_get_case_user_actions'; +import { parseString } from '../../containers/utils'; +import { OnUpdateFields } from '../case_view'; +import { + getConnectorLabelTitle, + getLabelTitle, + getPushedServiceLabelTitle, + getPushInfo, + getUpdateAction, + getAlertAttachment, + getGeneratedAlertsAttachment, +} from './helpers'; +import { UserActionAvatar } from './user_action_avatar'; +import { UserActionMarkdown } from './user_action_markdown'; +import { UserActionTimestamp } from './user_action_timestamp'; +import { UserActionUsername } from './user_action_username'; +import { UserActionContentToolbar } from './user_action_content_toolbar'; +import { getManualAlertIdsWithNoRuleId } from '../case_view/helpers'; +import { Ecs } from '../../common/ecs_types'; +export interface UserActionTreeProps { + getCaseDetailHrefWithCommentId: (commentId: string) => string; + caseServices: CaseServices; + caseUserActions: CaseUserActions[]; + connectors: ActionConnector[]; + data: Case; + getRuleDetailsHref: (ruleId: string | null | undefined) => string; + fetchUserActions: () => void; + isLoadingDescription: boolean; + isLoadingUserActions: boolean; + onRuleDetailsClick: (ruleId: string | null | undefined) => void; + onUpdateField: ({ key, value, onSuccess, onError }: OnUpdateFields) => void; + renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; + updateCase: (newCase: Case) => void; + useFetchAlertData: (alertIds: string[]) => [boolean, Record<string, Ecs>]; + userCanCrud: boolean; + onShowAlertDetails: (alertId: string, index: string) => void; +} + +const MyEuiFlexGroup = styled(EuiFlexGroup)` + margin-bottom: 8px; +`; + +const MyEuiCommentList = styled(EuiCommentList)` + ${({ theme }) => ` + & .userAction__comment.outlined .euiCommentEvent { + outline: solid 5px ${theme.eui.euiColorVis1_behindText}; + margin: 0.5em; + transition: 0.8s; + } + + & .euiComment.isEdit { + & .euiCommentEvent { + border: none; + box-shadow: none; + } + + & .euiCommentEvent__body { + padding: 0; + } + + & .euiCommentEvent__header { + display: none; + } + } + + & .comment-alert .euiCommentEvent { + background-color: ${theme.eui.euiColorLightestShade}; + border: ${theme.eui.euiFlyoutBorder}; + padding: 10px; + border-radius: ${theme.eui.paddingSizes.xs}; + } + + & .comment-alert .euiCommentEvent__headerData { + flex-grow: 1; + } + `} +`; + +const DESCRIPTION_ID = 'description'; +const NEW_ID = 'newComment'; + +export const UserActionTree = React.memo( + ({ + data: caseData, + getCaseDetailHrefWithCommentId, + caseServices, + caseUserActions, + connectors, + getRuleDetailsHref, + fetchUserActions, + isLoadingDescription, + isLoadingUserActions, + onRuleDetailsClick, + onUpdateField, + renderInvestigateInTimelineActionComponent, + updateCase, + useFetchAlertData, + userCanCrud, + onShowAlertDetails, + }: UserActionTreeProps) => { + const { detailName: caseId, commentId, subCaseId } = useParams<{ + detailName: string; + commentId?: string; + subCaseId?: string; + }>(); + const handlerTimeoutId = useRef(0); + const addCommentRef = useRef<AddCommentRefObject>(null); + const [initLoading, setInitLoading] = useState(true); + const [selectedOutlineCommentId, setSelectedOutlineCommentId] = useState(''); + const { isLoadingIds, patchComment } = useUpdateComment(); + const currentUser = useCurrentUser(); + const [manageMarkdownEditIds, setManangeMardownEditIds] = useState<string[]>([]); + + const [loadingAlertData, manualAlertsData] = useFetchAlertData( + getManualAlertIdsWithNoRuleId(caseData.comments) + ); + + const handleManageMarkdownEditId = useCallback( + (id: string) => { + if (!manageMarkdownEditIds.includes(id)) { + setManangeMardownEditIds([...manageMarkdownEditIds, id]); + } else { + setManangeMardownEditIds(manageMarkdownEditIds.filter((myId) => id !== myId)); + } + }, + [manageMarkdownEditIds] + ); + + const handleSaveComment = useCallback( + ({ id, version }: { id: string; version: string }, content: string) => { + patchComment({ + caseId, + commentId: id, + commentUpdate: content, + fetchUserActions, + version, + updateCase, + subCaseId, + }); + }, + [caseId, fetchUserActions, patchComment, subCaseId, updateCase] + ); + + const handleOutlineComment = useCallback( + (id: string) => { + const moveToTarget = document.getElementById(`${id}-permLink`); + if (moveToTarget != null) { + const yOffset = -60; + const y = moveToTarget.getBoundingClientRect().top + window.pageYOffset + yOffset; + window.scrollTo({ + top: y, + behavior: 'smooth', + }); + if (id === 'add-comment') { + moveToTarget.getElementsByTagName('textarea')[0].focus(); + } + } + window.clearTimeout(handlerTimeoutId.current); + setSelectedOutlineCommentId(id); + handlerTimeoutId.current = window.setTimeout(() => { + setSelectedOutlineCommentId(''); + window.clearTimeout(handlerTimeoutId.current); + }, 2400); + }, + [handlerTimeoutId] + ); + + const handleManageQuote = useCallback( + (quote: string) => { + const addCarrots = quote.replace(new RegExp('\r?\n', 'g'), ' \n> '); + + if (addCommentRef && addCommentRef.current) { + addCommentRef.current.addQuote(`> ${addCarrots} \n`); + } + + handleOutlineComment('add-comment'); + }, + [handleOutlineComment] + ); + + const handleUpdate = useCallback( + (newCase: Case) => { + updateCase(newCase); + fetchUserActions(); + }, + [fetchUserActions, updateCase] + ); + + const MarkdownDescription = useMemo( + () => ( + <UserActionMarkdown + id={DESCRIPTION_ID} + content={caseData.description} + isEditable={manageMarkdownEditIds.includes(DESCRIPTION_ID)} + onSaveContent={(content: string) => { + onUpdateField({ key: DESCRIPTION_ID, value: content }); + }} + onChangeEditable={handleManageMarkdownEditId} + /> + ), + [caseData.description, handleManageMarkdownEditId, manageMarkdownEditIds, onUpdateField] + ); + + const MarkdownNewComment = useMemo( + () => ( + <AddComment + caseId={caseId} + disabled={!userCanCrud} + ref={addCommentRef} + onCommentPosted={handleUpdate} + onCommentSaving={handleManageMarkdownEditId.bind(null, NEW_ID)} + showLoading={false} + subCaseId={subCaseId} + /> + ), + [caseId, userCanCrud, handleUpdate, handleManageMarkdownEditId, subCaseId] + ); + + useEffect(() => { + if (initLoading && !isLoadingUserActions && isLoadingIds.length === 0) { + setInitLoading(false); + if (commentId != null) { + handleOutlineComment(commentId); + } + } + }, [commentId, initLoading, isLoadingUserActions, isLoadingIds, handleOutlineComment]); + + const descriptionCommentListObj: EuiCommentProps = useMemo( + () => ({ + username: ( + <UserActionUsername + username={caseData.createdBy.username} + fullName={caseData.createdBy.fullName} + /> + ), + event: i18n.ADDED_DESCRIPTION, + 'data-test-subj': 'description-action', + timestamp: <UserActionTimestamp createdAt={caseData.createdAt} />, + children: MarkdownDescription, + timelineIcon: ( + <UserActionAvatar + username={caseData.createdBy.username} + fullName={caseData.createdBy.fullName} + /> + ), + className: classNames({ + isEdit: manageMarkdownEditIds.includes(DESCRIPTION_ID), + }), + actions: ( + <UserActionContentToolbar + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + id={DESCRIPTION_ID} + editLabel={i18n.EDIT_DESCRIPTION} + quoteLabel={i18n.QUOTE} + disabled={!userCanCrud} + isLoading={isLoadingDescription} + onEdit={handleManageMarkdownEditId.bind(null, DESCRIPTION_ID)} + onQuote={handleManageQuote.bind(null, caseData.description)} + /> + ), + }), + [ + MarkdownDescription, + caseData, + getCaseDetailHrefWithCommentId, + handleManageMarkdownEditId, + handleManageQuote, + isLoadingDescription, + userCanCrud, + manageMarkdownEditIds, + ] + ); + + const userActions: EuiCommentProps[] = useMemo( + () => + caseUserActions.reduce<EuiCommentProps[]>( + (comments, action, index) => { + // Comment creation + if (action.commentId != null && action.action === 'create') { + const comment = caseData.comments.find((c) => c.id === action.commentId); + if ( + comment != null && + isRight(ContextTypeUserRt.decode(comment)) && + comment.type === CommentType.user + ) { + return [ + ...comments, + { + username: ( + <UserActionUsername + username={comment.createdBy.username} + fullName={comment.createdBy.fullName} + /> + ), + 'data-test-subj': `comment-create-action-${comment.id}`, + timestamp: ( + <UserActionTimestamp + createdAt={comment.createdAt} + updatedAt={comment.updatedAt} + /> + ), + className: classNames('userAction__comment', { + outlined: comment.id === selectedOutlineCommentId, + isEdit: manageMarkdownEditIds.includes(comment.id), + }), + children: ( + <UserActionMarkdown + id={comment.id} + content={comment.comment} + isEditable={manageMarkdownEditIds.includes(comment.id)} + onChangeEditable={handleManageMarkdownEditId} + onSaveContent={handleSaveComment.bind(null, { + id: comment.id, + version: comment.version, + })} + /> + ), + timelineIcon: ( + <UserActionAvatar + username={comment.createdBy.username} + fullName={comment.createdBy.fullName} + /> + ), + actions: ( + <UserActionContentToolbar + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + id={comment.id} + editLabel={i18n.EDIT_COMMENT} + quoteLabel={i18n.QUOTE} + disabled={!userCanCrud} + isLoading={isLoadingIds.includes(comment.id)} + onEdit={handleManageMarkdownEditId.bind(null, comment.id)} + onQuote={handleManageQuote.bind(null, comment.comment)} + /> + ), + }, + ]; + } else if ( + comment != null && + isRight(AlertCommentRequestRt.decode(comment)) && + comment.type === CommentType.alert + ) { + // TODO: clean this up + const alertId = Array.isArray(comment.alertId) + ? comment.alertId.length > 0 + ? comment.alertId[0] + : '' + : comment.alertId; + + const alertIndex = Array.isArray(comment.index) + ? comment.index.length > 0 + ? comment.index[0] + : '' + : comment.index; + + if (isEmpty(alertId)) { + return comments; + } + + const ruleId = + comment?.rule?.id ?? manualAlertsData[alertId]?.signal?.rule?.id?.[0] ?? null; + const ruleName = + comment?.rule?.name ?? manualAlertsData[alertId]?.signal?.rule?.name?.[0] ?? null; + + return [ + ...comments, + getAlertAttachment({ + action, + alertId, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref, + index: alertIndex, + loadingAlertData, + onRuleDetailsClick, + ruleId, + ruleName, + onShowAlertDetails, + }), + ]; + } else if (comment != null && comment.type === CommentType.generatedAlert) { + // TODO: clean this up + const alertIds = Array.isArray(comment.alertId) + ? comment.alertId + : [comment.alertId]; + + if (isEmpty(alertIds)) { + return comments; + } + + return [ + ...comments, + getGeneratedAlertsAttachment({ + action, + alertIds, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref, + onRuleDetailsClick, + renderInvestigateInTimelineActionComponent, + ruleId: comment.rule?.id ?? '', + ruleName: comment.rule?.name ?? i18n.UNKNOWN_RULE, + }), + ]; + } + } + + // Connectors + if (action.actionField.length === 1 && action.actionField[0] === 'connector') { + const label = getConnectorLabelTitle({ action, connectors }); + return [ + ...comments, + getUpdateAction({ + action, + label, + getCaseDetailHrefWithCommentId, + handleOutlineComment, + }), + ]; + } + + // Pushed information + if (action.actionField.length === 1 && action.actionField[0] === 'pushed') { + const parsedValue = parseString(`${action.newValue}`); + const { firstPush, parsedConnectorId, parsedConnectorName } = getPushInfo( + caseServices, + parsedValue, + index + ); + + const label = getPushedServiceLabelTitle(action, firstPush); + + const showTopFooter = + action.action === 'push-to-service' && + index === caseServices[parsedConnectorId]?.lastPushIndex; + + const showBottomFooter = + action.action === 'push-to-service' && + index === caseServices[parsedConnectorId]?.lastPushIndex && + caseServices[parsedConnectorId].hasDataToPush; + + let footers: EuiCommentProps[] = []; + + if (showTopFooter) { + footers = [ + ...footers, + { + username: '', + type: 'update', + event: i18n.ALREADY_PUSHED_TO_SERVICE(`${parsedConnectorName}`), + timelineIcon: 'sortUp', + 'data-test-subj': 'top-footer', + }, + ]; + } + + if (showBottomFooter) { + footers = [ + ...footers, + { + username: '', + type: 'update', + event: i18n.REQUIRED_UPDATE_TO_SERVICE(`${parsedConnectorName}`), + timelineIcon: 'sortDown', + 'data-test-subj': 'bottom-footer', + }, + ]; + } + + return [ + ...comments, + getUpdateAction({ + action, + label, + getCaseDetailHrefWithCommentId, + handleOutlineComment, + }), + ...footers, + ]; + } + + // title, description, comment updates, tags + if ( + action.actionField.length === 1 && + ['title', 'description', 'comment', 'tags', 'status'].includes(action.actionField[0]) + ) { + const myField = action.actionField[0]; + const label: string | JSX.Element = getLabelTitle({ + action, + field: myField, + }); + + return [ + ...comments, + getUpdateAction({ + action, + label, + getCaseDetailHrefWithCommentId, + handleOutlineComment, + }), + ]; + } + + return comments; + }, + [descriptionCommentListObj] + ), + [ + caseUserActions, + descriptionCommentListObj, + caseData.comments, + selectedOutlineCommentId, + manageMarkdownEditIds, + handleManageMarkdownEditId, + handleSaveComment, + getCaseDetailHrefWithCommentId, + userCanCrud, + isLoadingIds, + handleManageQuote, + manualAlertsData, + getRuleDetailsHref, + loadingAlertData, + onRuleDetailsClick, + onShowAlertDetails, + renderInvestigateInTimelineActionComponent, + connectors, + handleOutlineComment, + caseServices, + ] + ); + + const bottomActions = [ + { + username: ( + <UserActionUsername username={currentUser?.username} fullName={currentUser?.fullName} /> + ), + 'data-test-subj': 'add-comment', + timelineIcon: ( + <UserActionAvatar username={currentUser?.username} fullName={currentUser?.fullName} /> + ), + className: 'isEdit', + children: MarkdownNewComment, + }, + ]; + + const comments = [...userActions, ...bottomActions]; + + return ( + <> + <MyEuiCommentList comments={comments} data-test-subj="user-actions" /> + {(isLoadingUserActions || isLoadingIds.includes(NEW_ID)) && ( + <MyEuiFlexGroup justifyContent="center" alignItems="center"> + <EuiFlexItem grow={false}> + <EuiLoadingSpinner data-test-subj="user-actions-loading" size="l" /> + </EuiFlexItem> + </MyEuiFlexGroup> + )} + </> + ); + } +); + +UserActionTree.displayName = 'UserActionTree'; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/schema.ts b/x-pack/plugins/cases/public/components/user_action_tree/schema.ts new file mode 100644 index 0000000000000..8c455818bf910 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/schema.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FIELD_TYPES, fieldValidators, FormSchema } from '../../common/shared_imports'; +import * as i18n from '../../common/translations'; + +const { emptyField } = fieldValidators; +export interface Content { + content: string; +} +export const schema: FormSchema<Content> = { + content: { + type: FIELD_TYPES.TEXTAREA, + validations: [ + { + validator: emptyField(i18n.REQUIRED_FIELD), + }, + ], + }, +}; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/translations.ts b/x-pack/plugins/cases/public/components/user_action_tree/translations.ts new file mode 100644 index 0000000000000..256e7ad66eeb6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/translations.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export * from '../case_view/translations'; + +export const ALREADY_PUSHED_TO_SERVICE = (externalService: string) => + i18n.translate('xpack.cases.caseView.alreadyPushedToExternalService', { + values: { externalService }, + defaultMessage: 'Already pushed to { externalService } incident', + }); + +export const REQUIRED_UPDATE_TO_SERVICE = (externalService: string) => + i18n.translate('xpack.cases.caseView.requiredUpdateToExternalService', { + values: { externalService }, + defaultMessage: 'Requires update to { externalService } incident', + }); + +export const COPY_REFERENCE_LINK = i18n.translate('xpack.cases.caseView.copyCommentLinkAria', { + defaultMessage: 'Copy reference link', +}); + +export const MOVE_TO_ORIGINAL_COMMENT = i18n.translate('xpack.cases.caseView.moveToCommentAria', { + defaultMessage: 'Highlight the referenced comment', +}); + +export const ALERT_COMMENT_LABEL_TITLE = i18n.translate( + 'xpack.cases.caseView.alertCommentLabelTitle', + { + defaultMessage: 'added an alert from', + } +); + +export const GENERATED_ALERT_COMMENT_LABEL_TITLE = i18n.translate( + 'xpack.cases.caseView.generatedAlertCommentLabelTitle', + { + defaultMessage: 'were added from', + } +); + +export const GENERATED_ALERT_COUNT_COMMENT_LABEL_TITLE = (totalCount: number) => + i18n.translate('xpack.cases.caseView.generatedAlertCountCommentLabelTitle', { + values: { totalCount }, + defaultMessage: `{totalCount} {totalCount, plural, =1 {alert} other {alerts}}`, + }); + +export const ALERT_RULE_DELETED_COMMENT_LABEL = i18n.translate( + 'xpack.cases.caseView.alertRuleDeletedLabelTitle', + { + defaultMessage: 'added an alert', + } +); + +export const SHOW_ALERT_TOOLTIP = i18n.translate('xpack.cases.caseView.showAlertTooltip', { + defaultMessage: 'Show alert details', +}); + +export const SEND_ALERT_TO_TIMELINE = i18n.translate( + 'xpack.cases.caseView.sendAlertToTimelineTooltip', + { + defaultMessage: 'Investigate in timeline', + } +); + +export const UNKNOWN_RULE = i18n.translate('xpack.cases.caseView.unknownRule.label', { + defaultMessage: 'Unknown rule', +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.test.tsx new file mode 100644 index 0000000000000..a049deb264d4c --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.test.tsx @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { TestProviders } from '../../common/mock'; +import { useKibana } from '../../common/lib/kibana'; +import { AlertCommentEvent } from './user_action_alert_comment_event'; +import { CommentType } from '../../../common'; + +const props = { + alertId: 'alert-id-1', + getCaseDetailHrefWithCommentId: jest.fn().mockReturnValue('someCaseDetail-withcomment'), + getRuleDetailsHref: jest.fn().mockReturnValue('some-detection-rule-link'), + onRuleDetailsClick: jest.fn(), + ruleId: 'rule-id-1', + ruleName: 'Awesome rule', + alertsCount: 1, + commentType: CommentType.alert, +}; + +jest.mock('../../common/lib/kibana'); +const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; + +describe('UserActionAvatar ', () => { + let navigateToApp: jest.Mock; + + beforeEach(() => { + jest.clearAllMocks(); + navigateToApp = jest.fn(); + useKibanaMock().services.application.navigateToApp = navigateToApp; + }); + + it('it renders', async () => { + const wrapper = mount( + <TestProviders> + <AlertCommentEvent {...props} /> + </TestProviders> + ); + + expect( + wrapper.find(`[data-test-subj="alert-rule-link-alert-id-1"]`).first().exists() + ).toBeTruthy(); + expect(wrapper.text()).toBe('added an alert from Awesome rule'); + }); + + it('does NOT render the link when the rule is null', async () => { + const wrapper = mount( + <TestProviders> + <AlertCommentEvent {...props} ruleId={null} /> + </TestProviders> + ); + + expect( + wrapper.find(`[data-test-subj="alert-rule-link-alert-id-1"]`).first().exists() + ).toBeFalsy(); + + expect(wrapper.text()).toBe('added an alert from Unknown rule'); + }); + + it('navigate to app on link click', async () => { + const onRuleDetailsClick = jest.fn(); + + const wrapper = mount( + <TestProviders> + <AlertCommentEvent {...props} onRuleDetailsClick={onRuleDetailsClick} /> + </TestProviders> + ); + + wrapper.find(`[data-test-subj="alert-rule-link-alert-id-1"]`).first().simulate('click'); + expect(onRuleDetailsClick).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx new file mode 100644 index 0000000000000..8f090b52c469b --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { isEmpty } from 'lodash'; +import { EuiText, EuiLoadingSpinner } from '@elastic/eui'; + +import * as i18n from './translations'; +import { CommentType } from '../../../common'; +import { LinkAnchor } from '../links'; + +interface Props { + alertId: string; + commentType: CommentType; + getRuleDetailsHref: (ruleId: string | null | undefined) => string; + onRuleDetailsClick: (ruleId: string | null | undefined) => void; + ruleId?: string | null; + ruleName?: string | null; + alertsCount?: number; + loadingAlertData?: boolean; +} + +const AlertCommentEventComponent: React.FC<Props> = ({ + alertId, + getRuleDetailsHref, + loadingAlertData = false, + onRuleDetailsClick, + ruleId, + ruleName, + alertsCount, + commentType, +}) => { + const onLinkClick = useCallback( + (ev: { preventDefault: () => void }) => { + ev.preventDefault(); + onRuleDetailsClick(ruleId); + }, + [ruleId, onRuleDetailsClick] + ); + const detectionsRuleDetailsHref = getRuleDetailsHref(ruleId); + + return commentType !== CommentType.generatedAlert ? ( + <> + {`${i18n.ALERT_COMMENT_LABEL_TITLE} `} + {loadingAlertData && <EuiLoadingSpinner size="m" />} + {!loadingAlertData && !isEmpty(ruleId) && ( + <LinkAnchor + onClick={onLinkClick} + href={detectionsRuleDetailsHref} + data-test-subj={`alert-rule-link-${alertId ?? 'deleted'}`} + > + {ruleName ?? i18n.UNKNOWN_RULE} + </LinkAnchor> + )} + {!loadingAlertData && isEmpty(ruleId) && i18n.UNKNOWN_RULE} + </> + ) : ( + <> + <b>{i18n.GENERATED_ALERT_COUNT_COMMENT_LABEL_TITLE(alertsCount ?? 0)}</b>{' '} + {i18n.GENERATED_ALERT_COMMENT_LABEL_TITLE}{' '} + {loadingAlertData && <EuiLoadingSpinner size="m" />} + {!loadingAlertData && ruleId !== '' && ( + <LinkAnchor + onClick={onLinkClick} + href={detectionsRuleDetailsHref} + data-test-subj={`alert-rule-link-${alertId ?? 'deleted'}`} + > + {ruleName} + </LinkAnchor> + )} + {!loadingAlertData && ruleId === '' && <EuiText>{ruleName}</EuiText>} + </> + ); +}; + +export const AlertCommentEvent = memo(AlertCommentEventComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.test.tsx new file mode 100644 index 0000000000000..1df780db3bdaa --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.test.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionAvatar } from './user_action_avatar'; + +const props = { + username: 'elastic', + fullName: 'Elastic', +}; + +describe('UserActionAvatar ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionAvatar {...props} />); + }); + + it('it renders', async () => { + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().text()).toBe('E'); + }); + + it('it shows the username if the fullName is undefined', async () => { + wrapper = mount(<UserActionAvatar username={'elastic'} />); + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().text()).toBe('e'); + }); + + it('shows unknown when the username AND the fullName are undefined', async () => { + wrapper = mount(<UserActionAvatar />); + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().text()).toBe('U'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.tsx new file mode 100644 index 0000000000000..80b048618bfc4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_avatar.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiAvatar } from '@elastic/eui'; + +import * as i18n from './translations'; + +interface UserActionAvatarProps { + username?: string | null; + fullName?: string | null; +} + +const UserActionAvatarComponent = ({ username, fullName }: UserActionAvatarProps) => { + const avatarName = fullName && fullName.length > 0 ? fullName : username ?? i18n.UNKNOWN; + + return <EuiAvatar name={avatarName} data-test-subj={`user-action-avatar`} />; +}; + +export const UserActionAvatar = memo(UserActionAvatarComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.test.tsx new file mode 100644 index 0000000000000..dc14011087a86 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.test.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionContentToolbar } from './user_action_content_toolbar'; + +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useParams: jest.fn().mockReturnValue({ detailName: 'case-1' }), + }; +}); + +jest.mock('../../common/lib/kibana', () => { + return { + useKibana: () => ({ + services: { + application: { + getUrlForApp: jest.fn(), + }, + }, + }), + }; +}); + +const props = { + getCaseDetailHrefWithCommentId: jest.fn().mockReturnValue('case-detail-url-with-comment-id-1'), + id: '1', + editLabel: 'edit', + quoteLabel: 'quote', + disabled: false, + isLoading: false, + onEdit: jest.fn(), + onQuote: jest.fn(), +}; + +describe('UserActionContentToolbar ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionContentToolbar {...props} />); + }); + + it('it renders', async () => { + expect(wrapper.find(`[data-test-subj="copy-link-${props.id}"]`).first().exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="property-actions"]').first().exists()).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.tsx new file mode 100644 index 0000000000000..f1f0a0148b9c6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_content_toolbar.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { UserActionCopyLink } from './user_action_copy_link'; +import { UserActionPropertyActions } from './user_action_property_actions'; + +interface UserActionContentToolbarProps { + id: string; + getCaseDetailHrefWithCommentId: (commentId: string) => string; + editLabel: string; + quoteLabel: string; + disabled: boolean; + isLoading: boolean; + onEdit: (id: string) => void; + onQuote: (id: string) => void; +} + +const UserActionContentToolbarComponent = ({ + id, + getCaseDetailHrefWithCommentId, + editLabel, + quoteLabel, + disabled, + isLoading, + onEdit, + onQuote, +}: UserActionContentToolbarProps) => { + return ( + <EuiFlexGroup> + <EuiFlexItem> + <UserActionCopyLink + id={id} + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + /> + </EuiFlexItem> + <EuiFlexItem> + <UserActionPropertyActions + id={id} + editLabel={editLabel} + quoteLabel={quoteLabel} + disabled={disabled} + isLoading={isLoading} + onEdit={onEdit} + onQuote={onQuote} + /> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +export const UserActionContentToolbar = memo(UserActionContentToolbarComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.test.tsx new file mode 100644 index 0000000000000..51381bee98978 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.test.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// TODO: removed dependencies on UrlGetSearch + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { useParams } from 'react-router-dom'; +import copy from 'copy-to-clipboard'; + +import { TestProviders } from '../../common/mock'; +import { UserActionCopyLink } from './user_action_copy_link'; + +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useParams: jest.fn(), + }; +}); + +jest.mock('copy-to-clipboard', () => { + return jest.fn(); +}); + +const mockGetUrlForApp = jest.fn( + (appId: string, options?: { path?: string; absolute?: boolean }) => + `${appId}${options?.path ?? ''}` +); + +jest.mock('../../common/lib/kibana', () => { + return { + useKibana: () => ({ + services: { + application: { + getUrlForApp: mockGetUrlForApp, + }, + }, + }), + }; +}); + +const props = { + id: 'comment-id', + getCaseDetailHrefWithCommentId: jest.fn().mockReturnValue('random-url'), +}; + +describe('UserActionCopyLink ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + (useParams as jest.Mock).mockReturnValue({ detailName: 'case-1' }); + wrapper = mount(<UserActionCopyLink {...props} />, { wrappingComponent: TestProviders }); + }); + + it('it renders', async () => { + expect(wrapper.find(`[data-test-subj="copy-link-${props.id}"]`).first().exists()).toBeTruthy(); + }); + + it('calls copy clipboard correctly', async () => { + wrapper.find(`[data-test-subj="copy-link-${props.id}"]`).first().simulate('click'); + expect(copy).toHaveBeenCalledWith('random-url'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.tsx new file mode 100644 index 0000000000000..0cc837fcb60b5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_copy_link.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { EuiToolTip, EuiButtonIcon } from '@elastic/eui'; +import copy from 'copy-to-clipboard'; + +import * as i18n from './translations'; + +interface UserActionCopyLinkProps { + id: string; + getCaseDetailHrefWithCommentId: (commentId: string) => string; +} + +const UserActionCopyLinkComponent = ({ + id: commentId, + getCaseDetailHrefWithCommentId, +}: UserActionCopyLinkProps) => { + const handleAnchorLink = useCallback(() => { + copy(getCaseDetailHrefWithCommentId(commentId)); + }, [getCaseDetailHrefWithCommentId, commentId]); + + return ( + <EuiToolTip position="top" content={<p>{i18n.COPY_REFERENCE_LINK}</p>}> + <EuiButtonIcon + aria-label={i18n.COPY_REFERENCE_LINK} + data-test-subj={`copy-link-${commentId}`} + onClick={handleAnchorLink} + iconType="link" + id={`${commentId}-permLink`} + /> + </EuiToolTip> + ); +}; + +export const UserActionCopyLink = memo(UserActionCopyLinkComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx new file mode 100644 index 0000000000000..7018f5019fb8b --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiButtonEmpty, EuiButton } from '@elastic/eui'; +import React, { useCallback } from 'react'; +import styled from 'styled-components'; + +import * as i18n from '../case_view/translations'; +import { Form, useForm, UseField } from '../../common/shared_imports'; +import { schema, Content } from './schema'; +import { MarkdownRenderer, MarkdownEditorForm } from '../../components/markdown_editor'; + +// TODO: Need to migrate user_action_markdown.test.tsx still. +const ContentWrapper = styled.div` + padding: ${({ theme }) => `${theme.eui.euiSizeM} ${theme.eui.euiSizeL}`}; +`; + +interface UserActionMarkdownProps { + content: string; + id: string; + isEditable: boolean; + onChangeEditable: (id: string) => void; + onSaveContent: (content: string) => void; +} +export const UserActionMarkdown = ({ + id, + content, + isEditable, + onChangeEditable, + onSaveContent, +}: UserActionMarkdownProps) => { + const initialState = { content }; + const { form } = useForm<Content>({ + defaultValue: initialState, + options: { stripEmptyFields: false }, + schema, + }); + + const fieldName = 'content'; + const { submit } = form; + + const handleCancelAction = useCallback(() => { + onChangeEditable(id); + }, [id, onChangeEditable]); + + const handleSaveAction = useCallback(async () => { + const { isValid, data } = await submit(); + if (isValid) { + onSaveContent(data.content); + } + onChangeEditable(id); + }, [id, onChangeEditable, onSaveContent, submit]); + + const renderButtons = useCallback( + ({ cancelAction, saveAction }) => ( + <EuiFlexGroup gutterSize="s" alignItems="center"> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="user-action-cancel-markdown" + size="s" + onClick={cancelAction} + iconType="cross" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButton + data-test-subj="user-action-save-markdown" + color="secondary" + fill + iconType="save" + onClick={saveAction} + size="s" + > + {i18n.SAVE} + </EuiButton> + </EuiFlexItem> + </EuiFlexGroup> + ), + [] + ); + + return isEditable ? ( + <Form form={form} data-test-subj="user-action-markdown-form"> + <UseField + path={fieldName} + component={MarkdownEditorForm} + componentProps={{ + 'aria-label': 'Cases markdown editor', + value: content, + id, + bottomRightContent: renderButtons({ + cancelAction: handleCancelAction, + saveAction: handleSaveAction, + }), + }} + /> + </Form> + ) : ( + <ContentWrapper data-test-subj="user-action-markdown"> + <MarkdownRenderer>{content}</MarkdownRenderer> + </ContentWrapper> + ); +}; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.test.tsx new file mode 100644 index 0000000000000..acd3814786a34 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.test.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionMoveToReference } from './user_action_move_to_reference'; + +const outlineComment = jest.fn(); +const props = { + id: 'move-to-ref-id', + outlineComment, +}; + +describe('UserActionMoveToReference ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionMoveToReference {...props} />); + }); + + it('it renders', async () => { + expect( + wrapper.find(`[data-test-subj="move-to-link-${props.id}"]`).first().exists() + ).toBeTruthy(); + }); + + it('calls outlineComment correctly', async () => { + wrapper.find(`[data-test-subj="move-to-link-${props.id}"]`).first().simulate('click'); + expect(outlineComment).toHaveBeenCalledWith(props.id); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.tsx new file mode 100644 index 0000000000000..42f6031ba1a6e --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_move_to_reference.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { EuiToolTip, EuiButtonIcon } from '@elastic/eui'; + +import * as i18n from './translations'; + +interface UserActionMoveToReferenceProps { + id: string; + outlineComment: (id: string) => void; +} + +const UserActionMoveToReferenceComponent = ({ + id, + outlineComment, +}: UserActionMoveToReferenceProps) => { + const handleMoveToLink = useCallback(() => { + outlineComment(id); + }, [id, outlineComment]); + + return ( + <EuiToolTip position="top" content={<p>{i18n.MOVE_TO_ORIGINAL_COMMENT}</p>}> + <EuiButtonIcon + aria-label={i18n.MOVE_TO_ORIGINAL_COMMENT} + data-test-subj={`move-to-link-${id}`} + onClick={handleMoveToLink} + iconType="arrowUp" + /> + </EuiToolTip> + ); +}; + +export const UserActionMoveToReference = memo(UserActionMoveToReferenceComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx new file mode 100644 index 0000000000000..0e8a30befd000 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionPropertyActions } from './user_action_property_actions'; + +const props = { + id: 'property-actions-id', + editLabel: 'edit', + quoteLabel: 'quote', + disabled: false, + isLoading: false, + onEdit: jest.fn(), + onQuote: jest.fn(), +}; + +describe('UserActionPropertyActions ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionPropertyActions {...props} />); + }); + + it('it renders', async () => { + expect( + wrapper.find('[data-test-subj="user-action-title-loading"]').first().exists() + ).toBeFalsy(); + + expect(wrapper.find('[data-test-subj="property-actions"]').first().exists()).toBeTruthy(); + }); + + it('it shows the edit and quote buttons', async () => { + wrapper.find('[data-test-subj="property-actions-ellipses"]').first().simulate('click'); + wrapper.find('[data-test-subj="property-actions-pencil"]').exists(); + wrapper.find('[data-test-subj="property-actions-quote"]').exists(); + }); + + it('it shows the spinner when loading', async () => { + wrapper = mount(<UserActionPropertyActions {...props} isLoading={true} />); + expect( + wrapper.find('[data-test-subj="user-action-title-loading"]').first().exists() + ).toBeTruthy(); + + expect(wrapper.find('[data-test-subj="property-actions"]').first().exists()).toBeFalsy(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.tsx new file mode 100644 index 0000000000000..c0d2075a278bb --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo, useCallback } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; + +import { PropertyActions } from '../property_actions'; + +interface UserActionPropertyActionsProps { + id: string; + editLabel: string; + quoteLabel: string; + disabled: boolean; + isLoading: boolean; + onEdit: (id: string) => void; + onQuote: (id: string) => void; +} + +const UserActionPropertyActionsComponent = ({ + id, + editLabel, + quoteLabel, + disabled, + isLoading, + onEdit, + onQuote, +}: UserActionPropertyActionsProps) => { + const onEditClick = useCallback(() => onEdit(id), [id, onEdit]); + const onQuoteClick = useCallback(() => onQuote(id), [id, onQuote]); + + const propertyActions = useMemo(() => { + return [ + { + disabled, + iconType: 'pencil', + label: editLabel, + onClick: onEditClick, + }, + { + disabled, + iconType: 'quote', + label: quoteLabel, + onClick: onQuoteClick, + }, + ]; + }, [disabled, editLabel, quoteLabel, onEditClick, onQuoteClick]); + return ( + <> + {isLoading && <EuiLoadingSpinner data-test-subj="user-action-title-loading" />} + {!isLoading && <PropertyActions propertyActions={propertyActions} />} + </> + ); +}; + +export const UserActionPropertyActions = memo(UserActionPropertyActionsComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.test.tsx new file mode 100644 index 0000000000000..d6005a8bd521e --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.test.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionShowAlert } from './user_action_show_alert'; + +const props = { + id: 'action-id', + alertId: 'alert-id', + index: 'alert-index', + onShowAlertDetails: jest.fn(), +}; + +describe('UserActionShowAlert ', () => { + let wrapper: ReactWrapper; + const onShowAlertDetails = jest.fn(); + + beforeAll(() => { + wrapper = mount(<UserActionShowAlert {...props} onShowAlertDetails={onShowAlertDetails} />); + }); + + it('it renders', async () => { + expect( + wrapper.find('[data-test-subj="comment-action-show-alert-action-id"]').first().exists() + ).toBeTruthy(); + }); + + it('it calls onClick', async () => { + wrapper.find('button[data-test-subj="comment-action-show-alert-action-id"]').simulate('click'); + expect(onShowAlertDetails).toHaveBeenCalledWith('alert-id', 'alert-index'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx new file mode 100644 index 0000000000000..4f5ce00806417 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { EuiToolTip, EuiButtonIcon } from '@elastic/eui'; +import * as i18n from './translations'; + +interface UserActionShowAlertProps { + id: string; + alertId: string; + index: string; + onShowAlertDetails: (alertId: string, index: string) => void; +} + +const UserActionShowAlertComponent = ({ + id, + alertId, + index, + onShowAlertDetails, +}: UserActionShowAlertProps) => { + const onClick = useCallback(() => onShowAlertDetails(alertId, index), [ + alertId, + index, + onShowAlertDetails, + ]); + return ( + <EuiToolTip position="top" content={<p>{i18n.SHOW_ALERT_TOOLTIP}</p>}> + <EuiButtonIcon + aria-label={i18n.SHOW_ALERT_TOOLTIP} + data-test-subj={`comment-action-show-alert-${id}`} + onClick={onClick} + iconType="arrowRight" + id={`${id}-show-alert`} + /> + </EuiToolTip> + ); +}; + +export const UserActionShowAlert = memo(UserActionShowAlertComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.test.tsx new file mode 100644 index 0000000000000..de2dc90ac43e9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.test.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { TestProviders } from '../../common/mock'; +import { UserActionTimestamp } from './user_action_timestamp'; + +jest.mock('@kbn/i18n/react', () => { + const originalModule = jest.requireActual('@kbn/i18n/react'); + const FormattedRelative = jest.fn(); + FormattedRelative.mockImplementationOnce(() => '2 days ago'); + FormattedRelative.mockImplementation(() => '20 hours ago'); + + return { + ...originalModule, + FormattedRelative, + }; +}); + +const props = { + createdAt: '2020-09-06T14:40:59.889Z', + updatedAt: '2020-09-07T14:40:59.889Z', +}; + +describe('UserActionTimestamp ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionTimestamp {...props} />, { wrappingComponent: TestProviders }); + }); + + it('it renders', async () => { + expect( + wrapper.find('[data-test-subj="user-action-title-creation-relative-time"]').first().exists() + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="user-action-title-edited-relative-time"]').first().exists() + ).toBeTruthy(); + }); + + it('it shows only the created time when the updated time is missing', async () => { + const newWrapper = mount(<UserActionTimestamp createdAt="2020-09-06T14:40:59.889Z" />, { + wrappingComponent: TestProviders, + }); + + expect( + newWrapper + .find('[data-test-subj="user-action-title-creation-relative-time"]') + .first() + .exists() + ).toBeTruthy(); + expect( + newWrapper.find('[data-test-subj="user-action-title-edited-relative-time"]').first().exists() + ).toBeFalsy(); + }); + + it('it shows the timestamp correctly', async () => { + const createdText = wrapper + .find('[data-test-subj="user-action-title-creation-relative-time"]') + .first() + .text(); + + const updatedText = wrapper + .find('[data-test-subj="user-action-title-edited-relative-time"]') + .first() + .text(); + + expect(`${createdText} (${updatedText})`).toBe('2 days ago (20 hours ago)'); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.tsx new file mode 100644 index 0000000000000..2e3973458c249 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_timestamp.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiTextColor } from '@elastic/eui'; +import { FormattedRelative } from '@kbn/i18n/react'; + +import { LocalizedDateTooltip } from '../../components/localized_date_tooltip'; +import * as i18n from './translations'; + +interface UserActionAvatarProps { + createdAt: string; + updatedAt?: string | null; +} + +const UserActionTimestampComponent = ({ createdAt, updatedAt }: UserActionAvatarProps) => { + return ( + <> + <LocalizedDateTooltip date={new Date(createdAt)}> + <FormattedRelative + data-test-subj="user-action-title-creation-relative-time" + value={createdAt} + /> + </LocalizedDateTooltip> + {updatedAt && ( + <EuiTextColor color="subdued"> + {/* be careful of the extra space at the beginning of the parenthesis */} + {' ('} + {i18n.EDITED_FIELD}{' '} + <LocalizedDateTooltip date={new Date(updatedAt)}> + <FormattedRelative + data-test-subj="user-action-title-edited-relative-time" + value={updatedAt} + /> + </LocalizedDateTooltip> + {')'} + </EuiTextColor> + )} + </> + ); +}; + +export const UserActionTimestamp = memo(UserActionTimestampComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_username.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username.test.tsx new file mode 100644 index 0000000000000..f664da71fc1f6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username.test.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionUsername } from './user_action_username'; + +const props = { + username: 'elastic', + fullName: 'Elastic', +}; + +describe('UserActionUsername ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionUsername {...props} />); + }); + + it('it renders', async () => { + expect( + wrapper.find('[data-test-subj="user-action-username-tooltip"]').first().exists() + ).toBeTruthy(); + }); + + it('it shows the username', async () => { + expect(wrapper.find('[data-test-subj="user-action-username-tooltip"]').text()).toBe('elastic'); + }); + + test('it shows the fullname when hovering the username', () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); + + wrapper.find('[data-test-subj="user-action-username-tooltip"]').first().simulate('mouseOver'); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + wrapper.update(); + expect(wrapper.find('.euiToolTipPopover').text()).toBe('Elastic'); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); + }); + + test('it shows the username when hovering the username and the fullname is missing', () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); + + const newWrapper = mount(<UserActionUsername username="elastic" />); + newWrapper + .find('[data-test-subj="user-action-username-tooltip"]') + .first() + .simulate('mouseOver'); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + newWrapper.update(); + expect(newWrapper.find('.euiToolTipPopover').text()).toBe('elastic'); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_username.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username.tsx new file mode 100644 index 0000000000000..78309eb56d620 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiToolTip } from '@elastic/eui'; +import { isEmpty } from 'lodash/fp'; + +import * as i18n from './translations'; + +interface UserActionUsernameProps { + username?: string | null; + fullName?: string | null; +} + +const UserActionUsernameComponent = ({ username, fullName }: UserActionUsernameProps) => { + const tooltipContent = (isEmpty(fullName) ? username : fullName) ?? i18n.UNKNOWN; + return ( + <EuiToolTip + position="top" + content={<p>{tooltipContent}</p>} + data-test-subj="user-action-username-tooltip" + > + <strong>{username ?? i18n.UNKNOWN.toLowerCase()}</strong> + </EuiToolTip> + ); +}; + +export const UserActionUsername = memo(UserActionUsernameComponent); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.test.tsx new file mode 100644 index 0000000000000..3b6c956017120 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount, ReactWrapper } from 'enzyme'; +import { UserActionUsernameWithAvatar } from './user_action_username_with_avatar'; + +const props = { + username: 'elastic', + fullName: 'Elastic', +}; + +describe('UserActionUsernameWithAvatar ', () => { + let wrapper: ReactWrapper; + + beforeAll(() => { + wrapper = mount(<UserActionUsernameWithAvatar {...props} />); + }); + + it('it renders', async () => { + expect( + wrapper.find('[data-test-subj="user-action-username-with-avatar"]').first().exists() + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="user-action-username-avatar"]').first().exists() + ).toBeTruthy(); + }); + + it('it shows the avatar', async () => { + expect(wrapper.find('[data-test-subj="user-action-username-avatar"]').first().text()).toBe('E'); + }); + + it('it shows the avatar without fullName', async () => { + const newWrapper = mount(<UserActionUsernameWithAvatar username="elastic" />); + expect(newWrapper.find('[data-test-subj="user-action-username-avatar"]').first().text()).toBe( + 'e' + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.tsx new file mode 100644 index 0000000000000..c538403e8b63c --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_username_with_avatar.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiAvatar } from '@elastic/eui'; +import { isEmpty } from 'lodash/fp'; + +import { UserActionUsername } from './user_action_username'; +import * as i18n from './translations'; + +interface UserActionUsernameWithAvatarProps { + username?: string | null; + fullName?: string | null; +} + +const UserActionUsernameWithAvatarComponent = ({ + username, + fullName, +}: UserActionUsernameWithAvatarProps) => { + return ( + <EuiFlexGroup + responsive={false} + alignItems="center" + gutterSize="s" + data-test-subj="user-action-username-with-avatar" + > + <EuiFlexItem grow={false}> + <EuiAvatar + size="s" + name={(isEmpty(fullName) ? username : fullName) ?? i18n.UNKNOWN} + data-test-subj="user-action-username-avatar" + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <UserActionUsername username={username} fullName={fullName} /> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; + +export const UserActionUsernameWithAvatar = memo(UserActionUsernameWithAvatarComponent); diff --git a/x-pack/plugins/cases/public/components/user_list/index.test.tsx b/x-pack/plugins/cases/public/components/user_list/index.test.tsx new file mode 100644 index 0000000000000..9c6509eeabc15 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_list/index.test.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import { UserList } from '.'; +import * as i18n from '../case_view/translations'; + +describe('UserList ', () => { + const title = 'Case Title'; + const caseLink = 'http://reddit.com'; + const user = { username: 'username', fullName: 'Full Name', email: 'testemail@elastic.co' }; + const open = jest.fn(); + beforeAll(() => { + window.open = open; + }); + beforeEach(() => { + jest.resetAllMocks(); + }); + it('triggers mailto when email icon clicked', () => { + const wrapper = shallow( + <UserList + email={{ + subject: i18n.EMAIL_SUBJECT(title), + body: i18n.EMAIL_BODY(caseLink), + }} + headline={i18n.REPORTER} + users={[user]} + /> + ); + wrapper.find('[data-test-subj="user-list-email-button"]').simulate('click'); + expect(open).toBeCalledWith( + `mailto:${user.email}?subject=${i18n.EMAIL_SUBJECT(title)}&body=${i18n.EMAIL_BODY(caseLink)}`, + '_blank' + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_list/index.tsx b/x-pack/plugins/cases/public/components/user_list/index.tsx new file mode 100644 index 0000000000000..d4d5d56ccc0d5 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_list/index.tsx @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { isEmpty } from 'lodash/fp'; + +import { + EuiButtonIcon, + EuiText, + EuiHorizontalRule, + EuiAvatar, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiToolTip, +} from '@elastic/eui'; + +import styled, { css } from 'styled-components'; + +import { ElasticUser } from '../../containers/types'; +import * as i18n from './translations'; + +interface UserListProps { + email: { + subject: string; + body: string; + }; + headline: string; + loading?: boolean; + users: ElasticUser[]; +} + +const MyAvatar = styled(EuiAvatar)` + top: -4px; +`; + +const MyFlexGroup = styled(EuiFlexGroup)` + ${({ theme }) => css` + margin-top: ${theme.eui.euiSizeM}; + `} +`; + +const renderUsers = ( + users: ElasticUser[], + handleSendEmail: (emailAddress: string | undefined | null) => void +) => + users.map(({ fullName, username, email }, key) => ( + <MyFlexGroup key={key} justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <EuiFlexGroup gutterSize="xs"> + <EuiFlexItem> + <MyAvatar name={fullName ? fullName : username ?? ''} /> + </EuiFlexItem> + <EuiFlexItem> + <EuiToolTip position="top" content={<p>{fullName ? fullName : username ?? ''}</p>}> + <p> + <strong> + <small data-test-subj="case-view-username">{username}</small> + </strong> + </p> + </EuiToolTip> + </EuiFlexItem> + </EuiFlexGroup> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButtonIcon + data-test-subj="user-list-email-button" + onClick={handleSendEmail.bind(null, email)} + iconType="email" + aria-label={i18n.SEND_EMAIL_ARIA(fullName ? fullName : username ?? '')} + isDisabled={isEmpty(email)} + /> + </EuiFlexItem> + </MyFlexGroup> + )); + +export const UserList = React.memo(({ email, headline, loading, users }: UserListProps) => { + const handleSendEmail = useCallback( + (emailAddress: string | undefined | null) => { + if (emailAddress && emailAddress != null) { + window.open(`mailto:${emailAddress}?subject=${email.subject}&body=${email.body}`, '_blank'); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [email.subject] + ); + return users.filter(({ username }) => username != null && username !== '').length > 0 ? ( + <EuiText> + <h4>{headline}</h4> + <EuiHorizontalRule margin="xs" /> + {loading && ( + <EuiFlexGroup> + <EuiFlexItem> + <EuiLoadingSpinner /> + </EuiFlexItem> + </EuiFlexGroup> + )} + {renderUsers( + users.filter(({ username }) => username != null && username !== ''), + handleSendEmail + )} + </EuiText> + ) : null; +}); + +UserList.displayName = 'UserList'; diff --git a/x-pack/plugins/cases/public/components/user_list/translations.ts b/x-pack/plugins/cases/public/components/user_list/translations.ts new file mode 100644 index 0000000000000..73610e5959345 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_list/translations.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const SEND_EMAIL_ARIA = (user: string) => + i18n.translate('xpack.cases.caseView.sendEmalLinkAria', { + values: { user }, + defaultMessage: 'click to send an email to {user}', + }); diff --git a/x-pack/plugins/cases/public/containers/use_get_case.test.tsx b/x-pack/plugins/cases/public/containers/use_get_case.test.tsx new file mode 100644 index 0000000000000..a3d64a17727e5 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_case.test.tsx @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useGetCase, UseGetCase } from './use_get_case'; +import { basicCase } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useGetCase', () => { + const abortCtrl = new AbortController(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => + useGetCase(basicCase.id) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + data: null, + isLoading: false, + isError: false, + fetchCase: result.current.fetchCase, + updateCase: result.current.updateCase, + }); + }); + }); + + it('calls getCase with correct arguments', async () => { + const spyOnGetCase = jest.spyOn(api, 'getCase'); + await act(async () => { + const { waitForNextUpdate } = renderHook<string, UseGetCase>(() => useGetCase(basicCase.id)); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(spyOnGetCase).toBeCalledWith(basicCase.id, true, abortCtrl.signal); + }); + }); + + it('fetch case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => + useGetCase(basicCase.id) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + data: basicCase, + isLoading: false, + isError: false, + fetchCase: result.current.fetchCase, + updateCase: result.current.updateCase, + }); + }); + }); + + it('refetch case', async () => { + const spyOnGetCase = jest.spyOn(api, 'getCase'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => + useGetCase(basicCase.id) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchCase(); + expect(spyOnGetCase).toHaveBeenCalledTimes(2); + }); + }); + + it('set isLoading to true when refetching case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => + useGetCase(basicCase.id) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchCase(); + + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnGetCase = jest.spyOn(api, 'getCase'); + spyOnGetCase.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => + useGetCase(basicCase.id) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + data: null, + isLoading: false, + isError: true, + fetchCase: result.current.fetchCase, + updateCase: result.current.updateCase, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_get_case.tsx b/x-pack/plugins/cases/public/containers/use_get_case.tsx new file mode 100644 index 0000000000000..11f78892fd91f --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_get_case.tsx @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useReducer, useCallback, useRef } from 'react'; + +import { Case } from './types'; +import * as i18n from './translations'; +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { getCase, getSubCase } from './api'; + +interface CaseState { + data: Case | null; + isLoading: boolean; + isError: boolean; +} + +type Action = + | { type: 'FETCH_INIT' } + | { type: 'FETCH_SUCCESS'; payload: Case } + | { type: 'FETCH_FAILURE' } + | { type: 'UPDATE_CASE'; payload: Case }; + +const dataFetchReducer = (state: CaseState, action: Action): CaseState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + data: action.payload, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + }; + case 'UPDATE_CASE': + return { + ...state, + data: action.payload, + }; + default: + return state; + } +}; + +export interface UseGetCase extends CaseState { + fetchCase: () => void; + updateCase: (newCase: Case) => void; +} + +export const useGetCase = (caseId: string, subCaseId?: string): UseGetCase => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: false, + isError: false, + data: null, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const updateCase = useCallback((newCase: Case) => { + dispatch({ type: 'UPDATE_CASE', payload: newCase }); + }, []); + + const callFetch = useCallback(async () => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT' }); + + const response = await (subCaseId + ? getSubCase(caseId, subCaseId, true, abortCtrlRef.current.signal) + : getCase(caseId, true, abortCtrlRef.current.signal)); + + if (!isCancelledRef.current) { + dispatch({ type: 'FETCH_SUCCESS', payload: response }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [caseId, subCaseId]); + + useEffect(() => { + callFetch(); + + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [caseId, subCaseId]); + return { ...state, fetchCase: callFetch, updateCase }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx b/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx new file mode 100644 index 0000000000000..907827e396c70 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx @@ -0,0 +1,147 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; + +import { CommentType } from '../../common'; +import { usePostComment, UsePostComment } from './use_post_comment'; +import { basicCaseId, basicSubCaseId } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('usePostComment', () => { + const abortCtrl = new AbortController(); + const samplePost = { + comment: 'a comment', + type: CommentType.user as const, + }; + const updateCaseCallback = jest.fn(); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => + usePostComment() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + postComment: result.current.postComment, + }); + }); + }); + + it('calls postComment with correct arguments - case', async () => { + const spyOnPostCase = jest.spyOn(api, 'postComment'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => + usePostComment() + ); + await waitForNextUpdate(); + + result.current.postComment({ + caseId: basicCaseId, + data: samplePost, + updateCase: updateCaseCallback, + }); + await waitForNextUpdate(); + expect(spyOnPostCase).toBeCalledWith(samplePost, basicCaseId, abortCtrl.signal, undefined); + }); + }); + + it('calls postComment with correct arguments - sub case', async () => { + const spyOnPostCase = jest.spyOn(api, 'postComment'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => + usePostComment() + ); + await waitForNextUpdate(); + + result.current.postComment({ + caseId: basicCaseId, + data: samplePost, + updateCase: updateCaseCallback, + subCaseId: basicSubCaseId, + }); + await waitForNextUpdate(); + expect(spyOnPostCase).toBeCalledWith( + samplePost, + basicCaseId, + abortCtrl.signal, + basicSubCaseId + ); + }); + }); + + it('post case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => + usePostComment() + ); + await waitForNextUpdate(); + result.current.postComment({ + caseId: basicCaseId, + data: samplePost, + updateCase: updateCaseCallback, + }); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + postComment: result.current.postComment, + }); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => + usePostComment() + ); + await waitForNextUpdate(); + result.current.postComment({ + caseId: basicCaseId, + data: samplePost, + updateCase: updateCaseCallback, + }); + + expect(result.current.isLoading).toBe(true); + }); + }); + + it('unhappy path', async () => { + const spyOnPostCase = jest.spyOn(api, 'postComment'); + spyOnPostCase.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => + usePostComment() + ); + await waitForNextUpdate(); + result.current.postComment({ + caseId: basicCaseId, + data: samplePost, + updateCase: updateCaseCallback, + }); + + expect(result.current).toEqual({ + isLoading: false, + isError: true, + postComment: result.current.postComment, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_post_comment.tsx b/x-pack/plugins/cases/public/containers/use_post_comment.tsx new file mode 100644 index 0000000000000..65f9719d1ff58 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_post_comment.tsx @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useReducer, useCallback, useRef, useEffect } from 'react'; +import { CommentRequest } from '../../common'; +import { errorToToaster, useStateToaster } from '../components/toasters'; + +import { postComment } from './api'; +import * as i18n from './translations'; +import { Case } from './types'; + +interface NewCommentState { + isLoading: boolean; + isError: boolean; +} +type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; + +const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentState => { + switch (action.type) { + case 'FETCH_INIT': + return { + isLoading: true, + isError: false, + }; + case 'FETCH_SUCCESS': + return { + isLoading: false, + isError: false, + }; + case 'FETCH_FAILURE': + return { + isLoading: false, + isError: true, + }; + default: + return state; + } +}; + +interface PostComment { + caseId: string; + data: CommentRequest; + updateCase?: (newCase: Case) => void; + subCaseId?: string; +} +export interface UsePostComment extends NewCommentState { + postComment: (args: PostComment) => Promise<void>; +} + +export const usePostComment = (): UsePostComment => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: false, + isError: false, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const postMyComment = useCallback( + async ({ caseId, data, updateCase, subCaseId }: PostComment) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT' }); + + const response = await postComment(data, caseId, abortCtrlRef.current.signal, subCaseId); + + if (!isCancelledRef.current) { + dispatch({ type: 'FETCH_SUCCESS' }); + if (updateCase) { + updateCase(response); + } + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + } + } + }, + [dispatchToaster] + ); + + useEffect(() => { + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + }, []); + + return { ...state, postComment: postMyComment }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_update_case.test.tsx b/x-pack/plugins/cases/public/containers/use_update_case.test.tsx new file mode 100644 index 0000000000000..65309d6d29e05 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_update_case.test.tsx @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useUpdateCase, UseUpdateCase } from './use_update_case'; +import { basicCase, basicSubCaseId } from './mock'; +import * as api from './api'; +import { UpdateKey } from './types'; + +jest.mock('./api'); + +describe('useUpdateCase', () => { + const abortCtrl = new AbortController(); + const fetchCaseUserActions = jest.fn(); + const updateCase = jest.fn(); + const updateKey: UpdateKey = 'description'; + const onSuccess = jest.fn(); + const onError = jest.fn(); + + const sampleUpdate = { + fetchCaseUserActions, + updateKey, + updateValue: 'updated description', + updateCase, + caseData: basicCase, + onSuccess, + onError, + }; + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => + useUpdateCase({ caseId: basicCase.id }) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoading: false, + isError: false, + updateKey: null, + updateCaseProperty: result.current.updateCaseProperty, + }); + }); + }); + + it('calls patchCase with correct arguments', async () => { + const spyOnPatchCase = jest.spyOn(api, 'patchCase'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => + useUpdateCase({ caseId: basicCase.id }) + ); + await waitForNextUpdate(); + + result.current.updateCaseProperty(sampleUpdate); + await waitForNextUpdate(); + expect(spyOnPatchCase).toBeCalledWith( + basicCase.id, + { description: 'updated description' }, + basicCase.version, + abortCtrl.signal + ); + }); + }); + + it('patch case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => + useUpdateCase({ caseId: basicCase.id }) + ); + await waitForNextUpdate(); + result.current.updateCaseProperty(sampleUpdate); + await waitForNextUpdate(); + expect(result.current).toEqual({ + updateKey: null, + isLoading: false, + isError: false, + updateCaseProperty: result.current.updateCaseProperty, + }); + expect(fetchCaseUserActions).toBeCalledWith(basicCase.id, '123', undefined); + expect(updateCase).toBeCalledWith(basicCase); + expect(onSuccess).toHaveBeenCalled(); + }); + }); + + it('patch sub case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => + useUpdateCase({ caseId: basicCase.id, subCaseId: basicSubCaseId }) + ); + await waitForNextUpdate(); + result.current.updateCaseProperty(sampleUpdate); + await waitForNextUpdate(); + expect(result.current).toEqual({ + updateKey: null, + isLoading: false, + isError: false, + updateCaseProperty: result.current.updateCaseProperty, + }); + expect(fetchCaseUserActions).toBeCalledWith(basicCase.id, '123', basicSubCaseId); + expect(updateCase).toBeCalledWith(basicCase); + expect(onSuccess).toHaveBeenCalled(); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => + useUpdateCase({ caseId: basicCase.id }) + ); + await waitForNextUpdate(); + result.current.updateCaseProperty(sampleUpdate); + + expect(result.current.isLoading).toBe(true); + expect(result.current.updateKey).toBe(updateKey); + }); + }); + + it('unhappy path', async () => { + const spyOnPatchCase = jest.spyOn(api, 'patchCase'); + spyOnPatchCase.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => + useUpdateCase({ caseId: basicCase.id }) + ); + await waitForNextUpdate(); + result.current.updateCaseProperty(sampleUpdate); + + expect(result.current).toEqual({ + updateKey: null, + isLoading: false, + isError: true, + updateCaseProperty: result.current.updateCaseProperty, + }); + expect(onError).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_update_case.tsx b/x-pack/plugins/cases/public/containers/use_update_case.tsx new file mode 100644 index 0000000000000..731e44bdd9da5 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_update_case.tsx @@ -0,0 +1,151 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useReducer, useCallback, useRef, useEffect } from 'react'; + +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { patchCase, patchSubCase } from './api'; +import { UpdateKey, UpdateByKey, CaseStatuses } from './types'; +import * as i18n from './translations'; +import { createUpdateSuccessToaster } from './utils'; + +interface NewCaseState { + isLoading: boolean; + isError: boolean; + updateKey: UpdateKey | null; +} + +type Action = + | { type: 'FETCH_INIT'; payload: UpdateKey } + | { type: 'FETCH_SUCCESS' } + | { type: 'FETCH_FAILURE' }; + +const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoading: true, + isError: false, + updateKey: action.payload, + }; + + case 'FETCH_SUCCESS': + return { + ...state, + isLoading: false, + isError: false, + updateKey: null, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoading: false, + isError: true, + updateKey: null, + }; + default: + return state; + } +}; + +export interface UseUpdateCase extends NewCaseState { + updateCaseProperty: (updates: UpdateByKey) => void; +} +export const useUpdateCase = ({ + caseId, + subCaseId, +}: { + caseId: string; + subCaseId?: string; +}): UseUpdateCase => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoading: false, + isError: false, + updateKey: null, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const dispatchUpdateCaseProperty = useCallback( + async ({ + fetchCaseUserActions, + updateKey, + updateValue, + updateCase, + caseData, + onSuccess, + onError, + }: UpdateByKey) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT', payload: updateKey }); + + const response = await (updateKey === 'status' && subCaseId + ? patchSubCase( + caseId, + subCaseId, + { status: updateValue as CaseStatuses }, + caseData.version, + abortCtrlRef.current.signal + ) + : patchCase( + caseId, + { [updateKey]: updateValue }, + caseData.version, + abortCtrlRef.current.signal + )); + + if (!isCancelledRef.current) { + if (fetchCaseUserActions != null) { + fetchCaseUserActions(caseId, response[0].connector.id, subCaseId); + } + if (updateCase != null) { + updateCase(response[0]); + } + dispatch({ type: 'FETCH_SUCCESS' }); + dispatchToaster({ + type: 'addToaster', + toast: createUpdateSuccessToaster(caseData, response[0], updateKey, updateValue), + }); + + if (onSuccess) { + onSuccess(); + } + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE' }); + if (onError) { + onError(); + } + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [caseId, subCaseId] + ); + + useEffect(() => { + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + }, []); + + return { ...state, updateCaseProperty: dispatchUpdateCaseProperty }; +}; diff --git a/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx b/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx new file mode 100644 index 0000000000000..9ff266ad9c988 --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useUpdateComment, UseUpdateComment } from './use_update_comment'; +import { basicCase, basicCaseCommentPatch, basicSubCaseId } from './mock'; +import * as api from './api'; + +jest.mock('./api'); + +describe('useUpdateComment', () => { + const abortCtrl = new AbortController(); + const fetchUserActions = jest.fn(); + const updateCase = jest.fn(); + const sampleUpdate = { + caseId: basicCase.id, + commentId: basicCase.comments[0].id, + commentUpdate: 'updated comment', + fetchUserActions, + updateCase, + version: basicCase.comments[0].version, + }; + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + it('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => + useUpdateComment() + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoadingIds: [], + isError: false, + patchComment: result.current.patchComment, + }); + }); + }); + + it('calls patchComment with correct arguments - case', async () => { + const spyOnPatchComment = jest.spyOn(api, 'patchComment'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => + useUpdateComment() + ); + await waitForNextUpdate(); + + result.current.patchComment(sampleUpdate); + await waitForNextUpdate(); + expect(spyOnPatchComment).toBeCalledWith( + basicCase.id, + basicCase.comments[0].id, + 'updated comment', + basicCase.comments[0].version, + abortCtrl.signal, + undefined + ); + }); + }); + + it('calls patchComment with correct arguments - sub case', async () => { + const spyOnPatchComment = jest.spyOn(api, 'patchComment'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => + useUpdateComment() + ); + await waitForNextUpdate(); + + result.current.patchComment({ ...sampleUpdate, subCaseId: basicSubCaseId }); + await waitForNextUpdate(); + expect(spyOnPatchComment).toBeCalledWith( + basicCase.id, + basicCase.comments[0].id, + 'updated comment', + basicCase.comments[0].version, + abortCtrl.signal, + basicSubCaseId + ); + }); + }); + + it('patch comment', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => + useUpdateComment() + ); + await waitForNextUpdate(); + result.current.patchComment(sampleUpdate); + await waitForNextUpdate(); + expect(result.current).toEqual({ + isLoadingIds: [], + isError: false, + patchComment: result.current.patchComment, + }); + expect(fetchUserActions).toBeCalled(); + expect(updateCase).toBeCalledWith(basicCaseCommentPatch); + }); + }); + + it('set isLoading to true when posting case', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => + useUpdateComment() + ); + await waitForNextUpdate(); + result.current.patchComment(sampleUpdate); + + expect(result.current.isLoadingIds).toEqual([basicCase.comments[0].id]); + }); + }); + + it('unhappy path', async () => { + const spyOnPatchComment = jest.spyOn(api, 'patchComment'); + spyOnPatchComment.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => + useUpdateComment() + ); + await waitForNextUpdate(); + result.current.patchComment(sampleUpdate); + + expect(result.current).toEqual({ + isLoadingIds: [], + isError: true, + patchComment: result.current.patchComment, + }); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/containers/use_update_comment.tsx b/x-pack/plugins/cases/public/containers/use_update_comment.tsx new file mode 100644 index 0000000000000..e83b91a574f8a --- /dev/null +++ b/x-pack/plugins/cases/public/containers/use_update_comment.tsx @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useReducer, useCallback, useRef, useEffect } from 'react'; +import { errorToToaster, useStateToaster } from '../components/toasters'; +import { patchComment } from './api'; +import * as i18n from './translations'; +import { Case } from './types'; + +interface CommentUpdateState { + isLoadingIds: string[]; + isError: boolean; +} +interface CommentUpdate { + commentId: string; +} + +type Action = + | { type: 'FETCH_INIT'; payload: string } + | { type: 'FETCH_SUCCESS'; payload: CommentUpdate } + | { type: 'FETCH_FAILURE'; payload: string }; + +const dataFetchReducer = (state: CommentUpdateState, action: Action): CommentUpdateState => { + switch (action.type) { + case 'FETCH_INIT': + return { + ...state, + isLoadingIds: [...state.isLoadingIds, action.payload], + isError: false, + }; + + case 'FETCH_SUCCESS': + return { + ...state, + isLoadingIds: state.isLoadingIds.filter((id) => action.payload.commentId !== id), + isError: false, + }; + case 'FETCH_FAILURE': + return { + ...state, + isLoadingIds: state.isLoadingIds.filter((id) => action.payload !== id), + isError: true, + }; + default: + return state; + } +}; + +interface UpdateComment { + caseId: string; + commentId: string; + commentUpdate: string; + fetchUserActions: () => void; + subCaseId?: string; + updateCase: (newCase: Case) => void; + version: string; +} + +export interface UseUpdateComment extends CommentUpdateState { + patchComment: ({ caseId, commentId, commentUpdate, fetchUserActions }: UpdateComment) => void; +} + +export const useUpdateComment = (): UseUpdateComment => { + const [state, dispatch] = useReducer(dataFetchReducer, { + isLoadingIds: [], + isError: false, + }); + const [, dispatchToaster] = useStateToaster(); + const isCancelledRef = useRef(false); + const abortCtrlRef = useRef(new AbortController()); + + const dispatchUpdateComment = useCallback( + async ({ + caseId, + commentId, + commentUpdate, + fetchUserActions, + subCaseId, + updateCase, + version, + }: UpdateComment) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT', payload: commentId }); + + const response = await patchComment( + caseId, + commentId, + commentUpdate, + version, + abortCtrlRef.current.signal, + subCaseId + ); + + if (!isCancelledRef.current) { + updateCase(response); + fetchUserActions(); + dispatch({ type: 'FETCH_SUCCESS', payload: { commentId } }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + } + dispatch({ type: 'FETCH_FAILURE', payload: commentId }); + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + + useEffect(() => { + return () => { + isCancelledRef.current = true; + abortCtrlRef.current.abort(); + }; + }, []); + + return { ...state, patchComment: dispatchUpdateComment }; +}; diff --git a/x-pack/plugins/cases/public/get_all_cases.tsx b/x-pack/plugins/cases/public/methods/get_case_view.tsx similarity index 66% rename from x-pack/plugins/cases/public/get_all_cases.tsx rename to x-pack/plugins/cases/public/methods/get_case_view.tsx index 7e840909a5648..f8b726385c1be 100644 --- a/x-pack/plugins/cases/public/get_all_cases.tsx +++ b/x-pack/plugins/cases/public/methods/get_case_view.tsx @@ -5,15 +5,15 @@ * 2.0. */ -import { EuiLoadingSpinner } from '@elastic/eui'; import React, { lazy, Suspense } from 'react'; -import { AllCasesProps } from './components/all_cases'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import { CaseViewProps } from '../components/case_view'; -export const getAllCasesLazy = (props: AllCasesProps) => { - const AllCasesLazy = lazy(() => import('./components/all_cases')); +export const getCaseViewLazy = (props: CaseViewProps) => { + const CaseViewLazy = lazy(() => import('../components/case_view')); return ( <Suspense fallback={<EuiLoadingSpinner />}> - <AllCasesLazy {...props} /> + <CaseViewLazy {...props} /> </Suspense> ); }; diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 885559dfc5e65..a6ea35d29216f 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -10,6 +10,7 @@ import { CasesUiStart, SetupPlugins, StartPlugins } from './types'; import { getCreateCaseLazy } from './methods/get_create_case'; import { getAllCasesLazy } from './methods/get_all_cases'; import { getConfigureCasesLazy } from './methods/get_configure_cases'; +import { getCaseViewLazy } from './methods/get_case_view'; import { KibanaServices } from './common/lib/kibana'; /** @@ -35,6 +36,14 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S getAllCases: (props) => { return getAllCasesLazy(props); }, + /** + * Get the case view component + * @param props CaseViewProps + * @return {ReactElement<CaseViewProps>} + */ + getCaseView: (props) => { + return getCaseViewLazy(props); + }, /** * Get the create case form * @param props CreateCaseProps diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index 846e1555d9d79..5902c5cf7486b 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -15,6 +15,7 @@ import { import { AllCasesProps } from './components/all_cases'; import { CreateCaseProps } from './components/create'; import { ConfigureCasesProps } from './components/configure_cases'; +import { CaseViewProps } from './components/case_view'; export interface SetupPlugins { security: SecurityPluginSetup; @@ -38,6 +39,7 @@ export type StartServices = CoreStart & export interface CasesUiStart { getAllCases: (props: AllCasesProps) => ReactElement<AllCasesProps>; + getCaseView: (props: CaseViewProps) => ReactElement<CaseViewProps>; getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; getConfigureCases: (props: ConfigureCasesProps) => ReactElement<ConfigureCasesProps>; } diff --git a/x-pack/plugins/cases/public/utils/use_mount_appended.ts b/x-pack/plugins/cases/public/utils/use_mount_appended.ts index 59c0c897e623f..d43b0455f47da 100644 --- a/x-pack/plugins/cases/public/utils/use_mount_appended.ts +++ b/x-pack/plugins/cases/public/utils/use_mount_appended.ts @@ -5,6 +5,7 @@ * 2.0. */ +// eslint-disable-next-line import/no-extraneous-dependencies import { mount } from 'enzyme'; type WrapperOf<F extends (...args: any) => any> = (...args: Parameters<F>) => ReturnType<F>; diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 181ef2bb35d64..986a1c03f3d34 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ENABLE_CASE_CONNECTOR } from '../../cases/common/constants'; +import { ENABLE_CASE_CONNECTOR } from '../../cases/common'; export const APP_ID = 'securitySolution'; export const SERVER_APP_ID = 'siem'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx new file mode 100644 index 0000000000000..4e783d6c3410f --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx @@ -0,0 +1,210 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { useDispatch } from 'react-redux'; +import { useHistory } from 'react-router-dom'; +import { SearchResponse } from 'elasticsearch'; +import { isEmpty } from 'lodash'; +import { Case } from '../../containers/types'; +import { + getCaseDetailsUrl, + getCaseDetailsUrlWithCommentId, + getCaseUrl, + getConfigureCasesUrl, + getRuleDetailsUrl, + useFormatUrl, +} from '../../../common/components/link_to'; +import { TimelineNonEcsData } from '../../../../common/search_strategy'; +import { TimelineId } from '../../../../common/types/timeline'; +import { SecurityPageName } from '../../../app/types'; +import { KibanaServices, useKibana } from '../../../common/lib/kibana'; +import { APP_ID, DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../common/constants'; +import { formatAlertToEcsSignal, useFetchAlertData } from '../user_action_tree/helpers'; +import { timelineActions } from '../../../timelines/store/timeline'; +import { useSourcererScope } from '../../../common/containers/sourcerer'; +import { SourcererScopeName } from '../../../common/store/sourcerer/model'; +import { DetailsPanel } from '../../../timelines/components/side_panel'; +import { SEND_ALERT_TO_TIMELINE } from '../user_action_tree/translations'; +import { InvestigateInTimelineAction } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_timeline_action'; +import { buildAlertsQuery } from './helpers'; +import { Ecs } from '../../../../common/ecs'; + +interface Props { + caseId: string; + subCaseId?: string; + userCanCrud: boolean; +} + +export interface OnUpdateFields { + key: keyof Case; + value: Case[keyof Case]; + onSuccess?: () => void; + onError?: () => void; +} + +export interface CaseProps extends Props { + fetchCase: () => void; + caseData: Case; + updateCase: (newCase: Case) => void; +} + +const TimelineDetailsPanel = () => { + const { browserFields, docValueFields } = useSourcererScope(SourcererScopeName.detections); + + return ( + <DetailsPanel + browserFields={browserFields} + docValueFields={docValueFields} + isFlyoutView + timelineId={TimelineId.casePage} + /> + ); +}; + +const InvestigateInTimelineActionComponent = (alertIds: string[]) => { + const EMPTY_ARRAY: TimelineNonEcsData[] = []; + const fetchEcsAlertsData = async (fetchAlertIds?: string[]): Promise<Ecs[]> => { + if (isEmpty(fetchAlertIds)) { + return []; + } + const alertResponse = await KibanaServices.get().http.fetch< + SearchResponse<{ '@timestamp': string; [key: string]: unknown }> + >(DETECTION_ENGINE_QUERY_SIGNALS_URL, { + method: 'POST', + body: JSON.stringify(buildAlertsQuery(fetchAlertIds ?? [])), + }); + return ( + alertResponse?.hits.hits.reduce<Ecs[]>( + (acc, { _id, _index, _source }) => [ + ...acc, + { + ...formatAlertToEcsSignal(_source as {}), + _id, + _index, + timestamp: _source['@timestamp'], + }, + ], + [] + ) ?? [] + ); + }; + + return ( + <InvestigateInTimelineAction + ariaLabel={SEND_ALERT_TO_TIMELINE} + alertIds={alertIds} + key="investigate-in-timeline" + ecsRowData={null} + fetchEcsAlertsData={fetchEcsAlertsData} + nonEcsRowData={EMPTY_ARRAY} + /> + ); +}; + +export const CaseViewFromPlugin = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { + const { + cases: casesUi, + application: { navigateToApp }, + } = useKibana().services; + const history = useHistory(); + const dispatch = useDispatch(); + const { formatUrl, search } = useFormatUrl(SecurityPageName.case); + const { formatUrl: detectionsFormatUrl, search: detectionsUrlSearch } = useFormatUrl( + SecurityPageName.detections + ); + + const allCasesLink = getCaseUrl(search); + const formattedAllCasesLink = formatUrl(allCasesLink); + const backToAllCasesOnClick = useCallback( + (ev) => { + ev.preventDefault(); + history.push(allCasesLink); + }, + [allCasesLink, history] + ); + const caseDetailsLink = formatUrl(getCaseDetailsUrl({ id: caseId }), { absolute: true }); + const getCaseDetailHrefWithCommentId = (commentId: string) => { + return formatUrl(getCaseDetailsUrlWithCommentId({ id: caseId, commentId, subCaseId }), { + absolute: true, + }); + }; + + const configureCasesHref = formatUrl(getConfigureCasesUrl()); + const onConfigureCasesNavClick = useCallback( + (ev) => { + ev.preventDefault(); + history.push(getConfigureCasesUrl(search)); + }, + [history, search] + ); + + const onDetectionsRuleDetailsClick = useCallback( + (ruleId: string | null | undefined) => { + navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { + path: getRuleDetailsUrl(ruleId ?? ''), + }); + }, + [navigateToApp] + ); + + const getDetectionsRuleDetailsHref = useCallback( + (ruleId) => { + return detectionsFormatUrl(getRuleDetailsUrl(ruleId ?? '', detectionsUrlSearch)); + }, + [detectionsFormatUrl, detectionsUrlSearch] + ); + + const showAlertDetails = useCallback( + (alertId: string, index: string) => { + dispatch( + timelineActions.toggleDetailPanel({ + panelView: 'eventDetail', + timelineId: TimelineId.casePage, + params: { + eventId: alertId, + indexName: index, + }, + }) + ); + }, + [dispatch] + ); + + const onComponentInitialized = useCallback(() => { + dispatch( + timelineActions.createTimeline({ + id: TimelineId.casePage, + columns: [], + indexNames: [], + expandedDetail: {}, + show: false, + }) + ); + }, [dispatch]); + + return casesUi.getCaseView({ + allCasesHref: formattedAllCasesLink, + backToAllCasesOnClick, + caseDetailsHref: caseDetailsLink, + caseId, + configureCasesHref, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref: getDetectionsRuleDetailsHref, + onComponentInitialized, + onConfigureCasesNavClick, + onRuleDetailsClick: onDetectionsRuleDetailsClick, + renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, + renderTimelineDetailsPanel: TimelineDetailsPanel, + showAlertDetails, + subCaseId, + useFetchAlertData, + userCanCrud, + }); +}); + +CaseViewFromPlugin.displayName = 'CaseViewFromPlugin'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index e16f1d7683abc..fd7b3433db56c 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -480,10 +480,10 @@ export const CaseComponent = React.memo<CaseProps>( export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { const { data, isLoading, isError, fetchCase, updateCase } = useGetCase(caseId, subCaseId); + if (isError) { return null; } - if (isLoading) { return ( <MyEuiFlexGroup gutterSize="none" justifyContent="center" alignItems="center"> @@ -493,7 +493,6 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = </MyEuiFlexGroup> ); } - return ( data && ( <CaseComponent diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx index e6ecf45097a1a..16e7c5287ce33 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx @@ -8,7 +8,7 @@ import { KibanaServices } from '../../common/lib/kibana'; import { ConnectorTypes, CommentType, CaseStatuses } from '../../../../cases/common/api'; -import { CASES_URL } from '../../../../cases/common/constants'; +import { CASES_URL } from '../../../../cases/common'; import { deleteCases, diff --git a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx index edb84db89b878..12aece8903dc1 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { useParams, useHistory } from 'react-router-dom'; +import { USE_RAC_CASES_UI } from '../../../common/constants'; import { SecurityPageName } from '../../app/types'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { WrapperPage } from '../../common/components/wrapper_page'; @@ -16,6 +17,7 @@ import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; import { getCaseUrl } from '../../common/components/link_to'; import { navTabs } from '../../app/home/home_navigations'; import { CaseView } from '../components/case_view'; +import { CaseViewFromPlugin } from '../components/case_view/case_view_from_plugin'; import { savedObjectReadOnlyErrorMessage, CaseCallOut } from '../components/callout'; export const CaseDetailsPage = React.memo(() => { @@ -41,11 +43,19 @@ export const CaseDetailsPage = React.memo(() => { messages={[{ ...savedObjectReadOnlyErrorMessage }]} /> )} - <CaseView - caseId={caseId} - subCaseId={subCaseId} - userCanCrud={userPermissions?.crud ?? false} - /> + {USE_RAC_CASES_UI ? ( + <CaseViewFromPlugin + caseId={caseId} + subCaseId={subCaseId} + userCanCrud={userPermissions?.crud ?? false} + /> + ) : ( + <CaseView + caseId={caseId} + subCaseId={subCaseId} + userCanCrud={userPermissions?.crud ?? false} + /> + )} </WrapperPage> <SpyRoute pageName={SecurityPageName.case} /> </> From e0616b754ee20bf6f4c9f70d2ccc562853b78814 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 1 Apr 2021 15:48:42 -0600 Subject: [PATCH 35/52] [Security Solution] [Cases] Deleting files from security solution and removing feature flag (#95176) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 👯‍♀️ --- packages/kbn-optimizer/limits.yml | 2 +- x-pack/plugins/cases/README.md | 54 +- x-pack/plugins/cases/common/index.ts | 1 + .../common/ui/index.ts} | 2 +- .../containers => cases/common/ui}/types.ts | 8 +- x-pack/plugins/cases/images/case_view.png | Bin 0 -> 554933 bytes x-pack/plugins/cases/images/recent_cases.png | Bin 0 -> 50037 bytes .../cases/public/common/lib/kibana/hooks.ts | 20 +- .../components/all_cases/index.test.tsx | 3 +- .../public/components/all_cases/index.tsx | 34 +- .../all_cases/status_filter.test.tsx | 3 +- .../components/all_cases/status_filter.tsx | 3 +- .../components/all_cases/table_filters.tsx | 3 +- .../public/components/bulk_actions/index.tsx | 4 +- .../public/components/case_view/index.tsx | 3 +- .../connectors/case/alert_fields.tsx | 2 - .../public/components/connectors/index.ts | 2 +- .../connectors/jira/search_issues.tsx | 2 +- .../jira/use_get_fields_by_issue_type.tsx | 2 +- .../connectors/jira/use_get_issue_types.tsx | 2 +- .../connectors/jira/use_get_issues.tsx | 2 +- .../connectors/jira/use_get_single_issue.tsx | 2 +- .../resilient/use_get_incident_types.tsx | 2 +- .../connectors/resilient/use_get_severity.tsx | 2 +- .../servicenow/use_get_choices.test.tsx | 2 +- .../connectors/servicenow/use_get_choices.tsx | 2 +- .../public/components/create/connector.tsx | 2 +- .../cases/public/components/create/index.tsx | 26 +- .../components/recent_cases/filters/index.tsx | 4 +- .../recent_cases/icon_with_count.tsx | 42 + .../public/components/recent_cases/index.tsx | 96 ++ .../recent_cases/loading_placeholders.tsx | 27 + .../recent_cases/no_cases/index.test.tsx | 26 + .../recent_cases/no_cases/index.tsx | 26 + .../components/recent_cases/recent_cases.tsx | 99 ++ .../components/recent_cases/translations.ts | 46 + .../public}/components/recent_cases/types.ts | 0 .../cases/public/components/status/config.ts | 4 +- .../cases/public/components/status/status.tsx | 2 +- .../cases/public/components/status/types.ts | 7 +- .../modal_all_errors.test.tsx.snap | 48 - .../public/components/toasters/errors.ts | 19 - .../public/components/toasters/index.test.tsx | 307 ------ .../public/components/toasters/index.tsx | 136 --- .../toasters/modal_all_errors.test.tsx | 70 -- .../components/toasters/modal_all_errors.tsx | 75 -- .../components/toasters/translations.ts | 20 - .../public/components/toasters/utils.test.ts | 128 --- .../cases/public/components/toasters/utils.ts | 149 --- .../create_case_modal.tsx | 12 +- x-pack/plugins/cases/public/containers/api.ts | 2 +- .../cases/public/containers/configure/api.ts | 11 +- .../configure/use_action_types.test.tsx | 1 + .../containers/configure/use_action_types.tsx | 10 +- .../configure/use_configure.test.tsx | 26 +- .../containers/configure/use_configure.tsx | 41 +- .../configure/use_connectors.test.tsx | 1 + .../containers/configure/use_connectors.tsx | 13 +- .../plugins/cases/public/containers/types.ts | 169 +--- .../containers/use_bulk_update_case.test.tsx | 1 + .../containers/use_bulk_update_case.tsx | 15 +- .../containers/use_delete_cases.test.tsx | 1 + .../public/containers/use_delete_cases.tsx | 18 +- .../use_get_action_license.test.tsx | 1 + .../containers/use_get_action_license.tsx | 13 +- .../public/containers/use_get_case.test.tsx | 1 + .../cases/public/containers/use_get_case.tsx | 13 +- .../use_get_case_user_actions.test.tsx | 1 + .../containers/use_get_case_user_actions.tsx | 22 +- .../public/containers/use_get_cases.test.tsx | 1 + .../cases/public/containers/use_get_cases.tsx | 84 +- .../containers/use_get_cases_status.test.tsx | 1 + .../containers/use_get_cases_status.tsx | 13 +- .../containers/use_get_reporters.test.tsx | 1 + .../public/containers/use_get_reporters.tsx | 16 +- .../public/containers/use_get_tags.test.tsx | 1 + .../cases/public/containers/use_get_tags.tsx | 13 +- .../public/containers/use_post_case.test.tsx | 1 + .../cases/public/containers/use_post_case.tsx | 13 +- .../containers/use_post_comment.test.tsx | 1 + .../public/containers/use_post_comment.tsx | 15 +- .../use_post_push_to_service.test.tsx | 1 + .../containers/use_post_push_to_service.tsx | 18 +- .../containers/use_update_case.test.tsx | 1 + .../public/containers/use_update_case.tsx | 22 +- .../containers/use_update_comment.test.tsx | 1 + .../public/containers/use_update_comment.tsx | 13 +- .../cases/public/containers/utils.test.ts | 46 +- .../plugins/cases/public/containers/utils.ts | 19 +- .../cases/public/methods/get_recent_cases.tsx | 19 + x-pack/plugins/cases/public/plugin.ts | 35 +- x-pack/plugins/cases/public/types.ts | 8 +- .../client/configure/get_mappings.test.ts | 25 +- .../server/client/configure/get_mappings.ts | 6 +- .../api/__fixtures__/mock_saved_objects.ts | 20 + .../security_solution/common/constants.ts | 7 - .../integration/cases/attach_timeline.spec.ts | 3 +- .../integration/cases/creation.spec.ts | 4 +- .../cypress/tasks/timeline.ts | 1 + .../components/add_comment/index.test.tsx | 172 ---- .../cases/components/add_comment/index.tsx | 130 --- .../cases/components/add_comment/schema.tsx | 27 - .../cases/components/all_cases/actions.tsx | 93 -- .../components/all_cases/columns.test.tsx | 41 - .../cases/components/all_cases/columns.tsx | 268 ----- .../components/all_cases/expanded_row.tsx | 80 -- .../cases/components/all_cases/helpers.ts | 47 - .../cases/components/all_cases/index.test.tsx | 912 ------------------ .../cases/components/all_cases/index.tsx | 596 +----------- .../all_cases/status_filter.test.tsx | 86 -- .../components/all_cases/status_filter.tsx | 53 - .../all_cases/table_filters.test.tsx | 171 ---- .../components/all_cases/table_filters.tsx | 201 ---- .../components/all_cases/translations.ts | 109 --- .../cases/components/bulk_actions/index.tsx | 112 --- .../components/bulk_actions/translations.ts | 15 - .../case_action_bar/actions.test.tsx | 104 -- .../components/case_action_bar/actions.tsx | 86 -- .../case_action_bar/helpers.test.ts | 50 - .../components/case_action_bar/helpers.ts | 24 - .../components/case_action_bar/index.test.tsx | 111 --- .../components/case_action_bar/index.tsx | 144 --- .../status_context_menu.test.tsx | 51 - .../case_action_bar/status_context_menu.tsx | 64 -- .../case_settings/sync_alerts_switch.test.tsx | 57 -- .../case_settings/sync_alerts_switch.tsx | 50 - .../case_view/case_view_from_plugin.tsx | 210 ---- .../components/case_view/helpers.test.tsx | 50 +- .../cases/components/case_view/helpers.ts | 120 ++- .../cases/components/case_view/index.test.tsx | 854 ---------------- .../cases/components/case_view/index.tsx | 627 ++++-------- .../components/case_view/translations.ts | 149 +-- .../configure_cases/__mock__/index.tsx | 61 -- .../configure_cases/button.test.tsx | 113 --- .../components/configure_cases/button.tsx | 73 -- .../configure_cases/closure_options.test.tsx | 58 -- .../configure_cases/closure_options.tsx | 54 -- .../closure_options_radio.test.tsx | 77 -- .../configure_cases/closure_options_radio.tsx | 60 -- .../configure_cases/connectors.test.tsx | 115 --- .../components/configure_cases/connectors.tsx | 119 --- .../connectors_dropdown.test.tsx | 203 ---- .../configure_cases/connectors_dropdown.tsx | 121 --- .../configure_cases/field_mapping.test.tsx | 55 -- .../configure_cases/field_mapping.tsx | 73 -- .../field_mapping_row_static.tsx | 60 -- .../components/configure_cases/index.test.tsx | 593 ------------ .../components/configure_cases/index.tsx | 224 ----- .../configure_cases/mapping.test.tsx | 47 - .../components/configure_cases/mapping.tsx | 62 -- .../configure_cases/translations.ts | 240 ----- .../components/configure_cases/utils.test.tsx | 64 -- .../cases/components/configure_cases/utils.ts | 80 -- .../components/confirm_delete_case/index.tsx | 52 - .../confirm_delete_case/translations.ts | 42 - .../connector_selector/form.test.tsx | 69 -- .../components/connector_selector/form.tsx | 70 -- .../cases/components/connectors/card.tsx | 71 -- .../connectors/case/alert_fields.tsx | 106 -- .../connectors/case/cases_dropdown.tsx | 73 -- .../connectors/case/existing_case.tsx | 76 -- .../cases/components/connectors/case/index.ts | 42 - .../connectors/case/translations.ts | 109 --- .../cases/components/connectors/case/types.ts | 18 - .../cases/components/connectors/config.ts | 39 - .../connectors/connectors_registry.ts | 57 -- .../components/connectors/fields_form.tsx | 54 -- .../cases/components/connectors/index.ts | 57 -- .../connectors/jira/__mocks__/api.ts | 45 - .../components/connectors/jira/api.test.ts | 160 --- .../cases/components/connectors/jira/api.ts | 93 -- .../connectors/jira/case_fields.test.tsx | 263 ----- .../connectors/jira/case_fields.tsx | 214 ---- .../cases/components/connectors/jira/index.ts | 27 - .../connectors/jira/search_issues.tsx | 95 -- .../connectors/jira/translations.ts | 77 -- .../cases/components/connectors/jira/types.ts | 22 - .../use_get_fields_by_issue_type.test.tsx | 105 -- .../jira/use_get_fields_by_issue_type.tsx | 96 -- .../jira/use_get_issue_types.test.tsx | 107 -- .../connectors/jira/use_get_issue_types.tsx | 102 -- .../connectors/jira/use_get_issues.test.tsx | 80 -- .../connectors/jira/use_get_issues.tsx | 97 -- .../jira/use_get_single_issue.test.tsx | 80 -- .../connectors/jira/use_get_single_issue.tsx | 95 -- .../cases/components/connectors/mock.ts | 121 --- .../connectors/resilient/__mocks__/api.ts | 16 - .../components/connectors/resilient/api.ts | 42 - .../connectors/resilient/case_fields.test.tsx | 134 --- .../connectors/resilient/case_fields.tsx | 189 ---- .../components/connectors/resilient/index.ts | 26 - .../connectors/resilient/translations.ts | 43 - .../components/connectors/resilient/types.ts | 9 - .../resilient/use_get_incident_types.test.tsx | 71 -- .../resilient/use_get_incident_types.tsx | 94 -- .../resilient/use_get_severity.test.tsx | 77 -- .../connectors/resilient/use_get_severity.tsx | 91 -- .../connectors/servicenow/__mocks__/api.ts | 19 - .../connectors/servicenow/api.test.ts | 40 - .../components/connectors/servicenow/api.ts | 31 - .../connectors/servicenow/helpers.ts | 12 - .../components/connectors/servicenow/index.ts | 32 - .../servicenow_itsm_case_fields.test.tsx | 164 ---- .../servicenow_itsm_case_fields.tsx | 235 ----- .../servicenow_sir_case_fields.test.tsx | 221 ----- .../servicenow/servicenow_sir_case_fields.tsx | 282 ------ .../connectors/servicenow/translations.ts | 99 -- .../components/connectors/servicenow/types.ts | 15 - .../servicenow/use_get_choices.test.tsx | 144 --- .../connectors/servicenow/use_get_choices.tsx | 101 -- .../cases/components/connectors/types.ts | 53 - .../components/create/connector.test.tsx | 187 ---- .../cases/components/create/connector.tsx | 103 -- .../components/create/description.test.tsx | 62 -- .../cases/components/create/description.tsx | 32 - .../cases/components/create/flyout.test.tsx | 79 +- .../public/cases/components/create/flyout.tsx | 30 +- .../cases/components/create/form.test.tsx | 109 --- .../public/cases/components/create/form.tsx | 119 --- .../components/create/form_context.test.tsx | 682 ------------- .../cases/components/create/form_context.tsx | 120 --- .../cases/components/create/index.test.tsx | 113 +-- .../public/cases/components/create/index.tsx | 81 +- .../public/cases/components/create/mock.ts | 101 -- .../optional_field_label/index.test.tsx | 19 - .../create/optional_field_label/index.tsx | 17 - .../public/cases/components/create/schema.tsx | 58 -- .../components/create/submit_button.test.tsx | 88 -- .../cases/components/create/submit_button.tsx | 31 - .../create/sync_alerts_toggle.test.tsx | 79 -- .../components/create/sync_alerts_toggle.tsx | 38 - .../cases/components/create/tags.test.tsx | 79 -- .../public/cases/components/create/tags.tsx | 49 - .../cases/components/create/title.test.tsx | 72 -- .../public/cases/components/create/title.tsx | 33 - .../cases/components/create/translations.ts | 38 - .../components/edit_connector/helpers.ts | 33 - .../components/edit_connector/index.test.tsx | 143 --- .../cases/components/edit_connector/index.tsx | 298 ------ .../components/edit_connector/schema.tsx | 18 - .../components/edit_connector/translations.ts | 17 - .../cases/components/filter_popover/index.tsx | 119 --- .../components/property_actions/index.tsx | 100 -- .../property_actions/translations.ts | 15 - .../cases/components/status/button.test.tsx | 90 -- .../public/cases/components/status/button.tsx | 52 - .../public/cases/components/status/config.ts | 82 -- .../public/cases/components/status/index.ts | 11 - .../cases/components/status/stats.test.tsx | 66 -- .../public/cases/components/status/stats.tsx | 40 - .../cases/components/status/status.test.tsx | 72 -- .../public/cases/components/status/status.tsx | 43 - .../cases/components/status/translations.ts | 72 -- .../public/cases/components/status/types.ts | 43 - .../cases/components/tag_list/index.test.tsx | 125 --- .../cases/components/tag_list/index.tsx | 176 ---- .../cases/components/tag_list/schema.tsx | 13 - .../public/cases/components/tag_list/tags.tsx | 33 - .../cases/components/tag_list/translations.ts | 17 - .../add_to_case_action.test.tsx | 235 +---- .../timeline_actions/add_to_case_action.tsx | 68 +- .../timeline_actions/helpers.test.tsx | 2 +- .../components/timeline_actions/helpers.tsx | 2 +- .../all_cases_modal.test.tsx | 8 + .../use_all_cases_modal/all_cases_modal.tsx | 19 +- .../use_all_cases_modal/index.test.tsx | 18 +- .../components/use_all_cases_modal/index.tsx | 26 +- .../create_case_modal.test.tsx | 128 --- .../create_case_modal.tsx | 67 -- .../use_create_case_modal/index.test.tsx | 157 --- .../use_create_case_modal/index.tsx | 60 -- .../use_push_to_service/helpers.tsx | 66 -- .../use_push_to_service/index.test.tsx | 269 ------ .../components/use_push_to_service/index.tsx | 212 ---- .../use_push_to_service/translations.ts | 96 -- .../user_action_tree/helpers.test.tsx | 185 ---- .../components/user_action_tree/helpers.tsx | 436 --------- .../user_action_tree/index.test.tsx | 407 -------- .../components/user_action_tree/index.tsx | 551 ----------- .../components/user_action_tree/schema.ts | 24 - .../user_action_tree/translations.ts | 84 -- .../user_action_alert_comment_event.test.tsx | 75 -- .../user_action_alert_comment_event.tsx | 85 -- .../user_action_avatar.test.tsx | 40 - .../user_action_tree/user_action_avatar.tsx | 24 - .../user_action_content_toolbar.test.tsx | 56 -- .../user_action_content_toolbar.tsx | 53 - .../user_action_copy_link.test.tsx | 75 -- .../user_action_copy_link.tsx | 46 - .../user_action_markdown.test.tsx | 89 -- .../user_action_tree/user_action_markdown.tsx | 108 --- .../user_action_move_to_reference.test.tsx | 35 - .../user_action_move_to_reference.tsx | 38 - .../user_action_property_actions.test.tsx | 51 - .../user_action_property_actions.tsx | 59 -- .../user_action_show_alert.test.tsx | 49 - .../user_action_show_alert.tsx | 43 - .../user_action_timestamp.test.tsx | 75 -- .../user_action_timestamp.tsx | 47 - .../user_action_username.test.tsx | 69 -- .../user_action_tree/user_action_username.tsx | 32 - .../user_action_username_with_avatar.test.tsx | 43 - .../user_action_username_with_avatar.tsx | 45 - .../cases/components/user_list/index.test.tsx | 41 - .../cases/components/user_list/index.tsx | 110 --- .../components/user_list/translations.ts | 14 - .../cases/components/wrappers/index.tsx | 5 - .../public/cases/containers/__mocks__/api.ts | 114 --- .../public/cases/containers/api.test.tsx | 465 --------- .../public/cases/containers/api.ts | 341 ------- .../containers/configure/__mocks__/api.ts | 36 - .../cases/containers/configure/api.test.ts | 154 --- .../public/cases/containers/configure/api.ts | 99 -- .../public/cases/containers/configure/mock.ts | 160 --- .../containers/configure/translations.ts | 17 - .../cases/containers/configure/types.ts | 46 - .../configure/use_action_types.test.tsx | 102 -- .../containers/configure/use_action_types.tsx | 73 -- .../configure/use_configure.test.tsx | 326 ------- .../containers/configure/use_configure.tsx | 365 ------- .../configure/use_connectors.test.tsx | 96 -- .../containers/configure/use_connectors.tsx | 72 -- .../public/cases/containers/constants.ts | 9 - .../public/cases/containers/mock.ts | 377 -------- .../public/cases/containers/translations.ts | 96 -- .../containers/use_bulk_update_case.test.tsx | 130 --- .../cases/containers/use_bulk_update_case.tsx | 157 --- .../containers/use_delete_cases.test.tsx | 131 --- .../cases/containers/use_delete_cases.tsx | 151 --- .../use_get_action_license.test.tsx | 90 -- .../containers/use_get_action_license.tsx | 85 -- .../cases/containers/use_get_case.test.tsx | 113 --- .../public/cases/containers/use_get_case.tsx | 116 --- .../use_get_case_user_actions.test.tsx | 710 -------------- .../containers/use_get_case_user_actions.tsx | 325 ------- .../cases/containers/use_get_cases.test.tsx | 204 ---- .../public/cases/containers/use_get_cases.tsx | 255 ----- .../containers/use_get_cases_status.test.tsx | 92 -- .../cases/containers/use_get_cases_status.tsx | 92 -- .../containers/use_get_reporters.test.tsx | 100 -- .../cases/containers/use_get_reporters.tsx | 95 -- .../cases/containers/use_get_tags.test.tsx | 89 -- .../public/cases/containers/use_get_tags.tsx | 100 -- .../cases/containers/use_post_case.test.tsx | 114 --- .../public/cases/containers/use_post_case.tsx | 91 -- .../containers/use_post_comment.test.tsx | 147 --- .../cases/containers/use_post_comment.tsx | 103 -- .../use_post_push_to_service.test.tsx | 101 -- .../containers/use_post_push_to_service.tsx | 116 --- .../cases/containers/use_update_case.test.tsx | 148 --- .../cases/containers/use_update_case.tsx | 151 --- .../containers/use_update_comment.test.tsx | 140 --- .../cases/containers/use_update_comment.tsx | 131 --- .../public/cases/containers/utils.test.ts | 170 ---- .../public/cases/containers/utils.ts | 150 --- .../public/cases/pages/case_details.tsx | 20 +- .../public/cases/pages/configure_cases.tsx | 12 +- .../public/common/lib/kibana/hooks.ts | 24 +- .../common/lib/kibana/kibana_react.mock.ts | 7 + .../components/recent_cases/index.tsx | 120 +-- .../recent_cases/no_cases/index.test.tsx | 40 - .../recent_cases/no_cases/index.tsx | 53 - .../components/recent_cases/recent_cases.tsx | 70 -- .../components/recent_cases/translations.ts | 51 - .../overview/components/sidebar/index.tsx | 6 - .../overview/components/sidebar/sidebar.tsx | 109 +-- .../security_solution/public/plugin.tsx | 3 - .../flyout/add_to_case_button/index.tsx | 2 +- .../public/timelines/containers/api.ts | 4 +- .../translations/translations/ja-JP.json | 183 ---- .../translations/translations/zh-CN.json | 187 ---- 371 files changed, 1454 insertions(+), 31378 deletions(-) rename x-pack/plugins/{security_solution/public/cases/components/add_comment/translations.ts => cases/common/ui/index.ts} (87%) rename x-pack/plugins/{security_solution/public/cases/containers => cases/common/ui}/types.ts (95%) create mode 100644 x-pack/plugins/cases/images/case_view.png create mode 100644 x-pack/plugins/cases/images/recent_cases.png rename x-pack/plugins/{security_solution/public/overview => cases/public}/components/recent_cases/filters/index.tsx (93%) create mode 100644 x-pack/plugins/cases/public/components/recent_cases/icon_with_count.tsx create mode 100644 x-pack/plugins/cases/public/components/recent_cases/index.tsx create mode 100644 x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx create mode 100644 x-pack/plugins/cases/public/components/recent_cases/no_cases/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx create mode 100644 x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx create mode 100644 x-pack/plugins/cases/public/components/recent_cases/translations.ts rename x-pack/plugins/{security_solution/public/overview => cases/public}/components/recent_cases/types.ts (100%) delete mode 100644 x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap delete mode 100644 x-pack/plugins/cases/public/components/toasters/errors.ts delete mode 100644 x-pack/plugins/cases/public/components/toasters/index.test.tsx delete mode 100644 x-pack/plugins/cases/public/components/toasters/index.tsx delete mode 100644 x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx delete mode 100644 x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx delete mode 100644 x-pack/plugins/cases/public/components/toasters/translations.ts delete mode 100644 x-pack/plugins/cases/public/components/toasters/utils.test.ts delete mode 100644 x-pack/plugins/cases/public/components/toasters/utils.ts create mode 100644 x-pack/plugins/cases/public/methods/get_recent_cases.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/columns.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/bulk_actions/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/button.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping_row_static.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connector_selector/form.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/case/cases_dropdown.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/case/index.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/case/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/case/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/config.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/connectors_registry.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/index.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/__mocks__/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.test.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/search_issues.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/mock.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/__mocks__/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/__mocks__/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.test.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/helpers.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/connectors/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/connector.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/connector.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/description.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/description.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/form.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/form.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/mock.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/schema.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/submit_button.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/submit_button.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/tags.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/tags.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/title.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/title.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/create/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/edit_connector/helpers.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/edit_connector/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/edit_connector/schema.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/edit_connector/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/filter_popover/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/property_actions/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/property_actions/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/button.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/config.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/index.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/stats.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/status.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/status/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/tag_list/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/tag_list/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/tag_list/schema.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/tag_list/tags.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/tag_list/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_push_to_service/helpers.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_push_to_service/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/schema.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_list/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/user_list/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/__mocks__/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/api.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/__mocks__/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/api.test.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/api.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/mock.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/types.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/constants.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/mock.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_case.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_cases.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_tags.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_post_case.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_post_comment.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_update_case.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_update_comment.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/utils.test.ts delete mode 100644 x-pack/plugins/security_solution/public/cases/containers/utils.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/recent_cases/recent_cases.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/recent_cases/translations.ts diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 5d363081e3aee..14d37a7b5839f 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -69,7 +69,7 @@ pageLoadAssetSize: searchprofiler: 67080 security: 189428 securityOss: 30806 - securitySolution: 283440 + securitySolution: 187863 share: 99061 snapshotRestore: 79032 spaces: 387915 diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index 090be109b94f1..9905c1d6ba40b 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -15,7 +15,7 @@ Case management in Kibana - [Cases API](#cases-api) - [Cases UI](#cases-ui) -- [Case Action Type](#case-action-type) +- [Case Action Type](#case-action-type) _feature in development, disabled by default_ ## Cases API @@ -52,14 +52,39 @@ Arguments: |disabledStatuses?|`CaseStatuses[];` array of disabled statuses |getCaseDetailsHref|`(caseDetails: CaseDetailsHrefSchema) => string;` callback to generate the case details url from the case id |isModal?|`boolean;` is All Cases table a modal -|onCaseDetailsNavClick|`(caseDetails: CaseDetailsHrefSchema) => void;` callback for nav click -|onConfigureCasesNavClick?|`(ev: React.MouseEvent) => void;` callback for nav click -|onCreateCaseNavClick?|`(ev: React.MouseEvent) => void;` callback for nav click +|onCaseDetailsNavClick|`(caseDetails: CaseDetailsHrefSchema) => void;` callback for case details nav click +|onConfigureCasesNavClick?|`(ev: React.MouseEvent) => void;` callback for configure case nav click +|onCreateCaseNavClick?|`(ev: React.MouseEvent) => void;` callback for create case nav click |onRowClick?|`(theCase?: Case ! SubCase) => void;` callback for row click, passing case in row -|userCanCrud|boolean; user permissions to crud +|userCanCrud|`boolean;` user permissions to crud UI component: ![All Cases Component][all-cases-img] + +### `getCaseView` +Arguments: + +|Property|Description| +|---|---| +|allCasesHref|`string;` route for all cases page +|backToAllCasesOnClick|`(ev: MouseEvent) => void;` handler for back to all cases click +|caseDetailsHref|`string;` route for configure cases page +|caseId|`string;` ID of the case +|configureCasesHref|`string;` route for configure cases page +|getCaseDetailHrefWithCommentId|`(commentId: string) => string;` callback to generate the case details url with a comment id reference from the case id and comment id +|getRuleDetailsHref|`(ruleId: string, null, undefined) => string;` callback to generate the rule details url from the rule id +|onComponentInitialized?|`() => void;` callback when component has initialized +|onConfigureCasesNavClick|`(ev: React.MouseEvent) => void;` callback for configure case nav click +|onRuleDetailsClick|`(ruleId: string, null, undefined) => void;` callback for rule details nav click +|renderInvestigateInTimelineActionComponent?|: `(alertIds: string[]) => JSX.Element;` space to render `InvestigateInTimelineActionComponent` +|renderTimelineDetailsPanel?|: `() => JSX.Element;` space to render `TimelineDetailsPanel` +|showAlertDetails|: `(alertId: string, index: string) => void;` callback to show alert details +|subCaseId?|: `string;` subcase id +|useFetchAlertData|: `(alertIds: string[]) => [boolean, Record<string, Ecs>];` fetch alerts +|userCanCrud|: `boolean;` user permissions to crud + +UI component: + ![Case View Component][case-view-img] ### `getCreateCase` Arguments: @@ -83,8 +108,25 @@ UI component: UI component: ![Configure Component][configure-img] +### `getRecentCases` +Arguments: + +|Property|Description| +|---|---| +|allCasesHref|`string;` href of all cases page +|createCaseHref|`string;` +|getCaseDetailsHref|`(caseDetails: CaseDetailsHrefSchema) => string;` +|goToAllCases|`(ev: React.MouseEvent) => void;` callback for all cases link click +|onCaseDetailsNavClick|`(caseDetails: CaseDetailsHrefSchema) => void;` callback for case details nav click +|perPage|`number;` number of cases to show in widget + +UI component: + ![Recent Cases Component][recent-cases-img] + ## Case Action Type +_***Feature in development, disabled by default**_ + See [Kibana Actions](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions) for more information. @@ -192,4 +234,6 @@ For IBM Resilient connectors: [configure-img]: images/configure.png [create-img]: images/create.png [all-cases-img]: images/all_cases.png +[recent-cases-img]: images/recent_cases.png +[case-view-img]: images/case_view.png diff --git a/x-pack/plugins/cases/common/index.ts b/x-pack/plugins/cases/common/index.ts index 37c11172b50b2..3d277d12d6826 100644 --- a/x-pack/plugins/cases/common/index.ts +++ b/x-pack/plugins/cases/common/index.ts @@ -7,3 +7,4 @@ export * from './constants'; export * from './api'; +export * from './ui/types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/translations.ts b/x-pack/plugins/cases/common/ui/index.ts similarity index 87% rename from x-pack/plugins/security_solution/public/cases/components/add_comment/translations.ts rename to x-pack/plugins/cases/common/ui/index.ts index d94a4a8607d1e..6cc0ccaa93a6d 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/translations.ts +++ b/x-pack/plugins/cases/common/ui/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from '../../translations'; +export * from './types'; diff --git a/x-pack/plugins/security_solution/public/cases/containers/types.ts b/x-pack/plugins/cases/common/ui/types.ts similarity index 95% rename from x-pack/plugins/security_solution/public/cases/containers/types.ts rename to x-pack/plugins/cases/common/ui/types.ts index d1c17ea56df65..9acc8893f7028 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -16,10 +16,12 @@ import { User, UserAction, UserActionField, -} from '../../../../cases/common'; -import { CaseStatusWithAllStatus } from '../components/status'; +} from '../api'; -export { CaseConnector, ActionConnector, CaseStatuses } from '../../../../cases/common'; +export const StatusAll = 'all' as const; +export type StatusAllType = typeof StatusAll; + +export type CaseStatusWithAllStatus = CaseStatuses | StatusAllType; export type Comment = CommentRequest & { associationType: AssociationType; diff --git a/x-pack/plugins/cases/images/case_view.png b/x-pack/plugins/cases/images/case_view.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb14d7b41b26e8b40b6dc938b9682e592de105a GIT binary patch literal 554933 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 {i;K0h}%vABv7sCLC(Tp*Mrm)eTg!9N5F zuh)NLFl9s;p&BYirh`wcC%!31)yibFJd+jWzUzl&fHsuET|M}@{NK2K0ayT3!l)rp zr+Xi*il{#HsuWrE!Q6nl^WQKxegqdVpc*eGmh6H%mg45UK1dlDWS3xOyZ}_>Q-m$V z3_?}fd2dxoCH~8f>CfqSq}pb3*WT<}72K4Dkn{W6Et(8hr_RxpcvU4|RWOz3vY;Om z1(;i|42JaKCI$`=?YFxTCnWa&b8W_f8u|twveLh$5{xu$Km6UX78!xCUd907D6m9S zZ{(FjoEE-)E$Qj$XRBEUPxmmovSmi8iE%OB&;Dn$fq`>lQYbYG2nd`$awWis{1usj zC}j@p%HNQg!$CBvMom<r!XqPjM7{;(ji=x8JqF%}4Wwek!JUoxzubQ{4QAZ%crZQs zw{;g<3bvm3$Tk@FxNOQiR`~XVl$KW0l+{gwrU`8IOa$0!{acJIzItO3P2X>Oliwfi zH-iMkh<+&|)*Mrg{MQleAM?z2_;Kazo@$obZ2wkHT0?Y<!6#r#`*7spO_LXcylAim z^ct{bsHgiizvKQkGk;r&{v2{Y7SXk-MG_9U-`>_2mlbweF*&GKtg89??F(*&O7l~3 zQEq0U`)jiN(9*g6%Hkdk?BaWq-T&=Uew3NEdgH}aOH2CsX!y2<m}u;2zpWHF2(YvL zL^)}|Zj3%Z)QSQxD$mafCr+q=3bf<f{>P#HH<SFI#a7f8Uou1{E?{#s<_R97RKYSe zHMim}YLCGi=|=_hak*gw2$3COuOwZ6QsOE?5+5^@(RcPH#4Y1XOT7#+K%Dr1F8*s; zprnI4ejW@ZbL5+gs@`WPxu3a7;o{->^DqdZ!>W_R{YL}-X-eReuO9=B&uZ?seE}MK zWJ9VgBhQHE)n-YO^oq5maixknl#KB`in^&Ee+{_81%j2MNw{Nv?o=7rs-lHO%F|P9 zNeSA?NCQd<o5BeE_09jfy5hWteGSo;w-TT#a3&wLr{gZ`u~4gfKi7*po*5c|kNT#B z==wJgtwg9XE8QDUq5)aHd6aV5O5Us+_2mmkYdbyx0g@69utP+Gjeq{zAN+YJ`0FPJ zZBhTK?)!OKwiN8(QSWuGy7u${W<l9r?sA&7<S`H(iIvsW>wg*ds0jSQ5I8)fPOqdn zH)@k&6`XLwP6q^h^K_TGG@L;&I_~x|NcjIX(tlXO9Q~UWAE=vq7ytEJ>6vgpSE?qn zfH+%KnQUSe%w@Xw;lC^vm4RqgEr+PiHf~6U6?C%66$iG8I-r4_2EmUC{pRlf<))&; z2)KsJtD6mJxIPyzhr6KC-O=$mxdwd=Z%eI0N>g8H{_+Q3IHt^TL#L|dD_cbM6lU3m zb60r-!xbt)!6q18_jw&+*y*NI)Azr=|6eDi?=EWU4{u4Vin;XWSbtB|wTaU_*;|Ge z<bnHtj>u6M_=A!4@y6Xyl7UO`sB+Yv2^{3-PgH~I>7zcb)kZhmr~#MHA5njg-@lCV z7dHyj5iRNJvJ%D_!7?U!S6$rm;e;xQ^p|Nw%TcG+Tll|ku}Z0XglfB=dFw1MFQY<{ zqBFo&IQCn_|Mfk7{Q|TIhy2bqdbBYTscAv)y;_5_MA1mTB5Onbn_t%O^`z8OiR212 zuy)*#eGe?{!E#@7Usq%~T)i*FkID<RvfHPEonHJh!uadS{`2bq0|{h^ux>6QfeA=( z5#c{&*h9RQH$%OFV2{x7>R+yi1I31`yF8}hQ;Jdgwq)192we{f*_h-5%vRwN;r9Pv zHW`qJO2lb1hjPp*zW%R_1f3w9#tT)#*^=t+6s{ChD1WZy=k}PmI4#%5M~l*^&~;dT z@!vw<Uq<3LA2gC$eDJyIOVNZu)Y>j!U}8g=cRtM2Bx3)1f6?bC52qBD!IuT9k>d}1 zHR8aomY(p#^CoeeDCVZ~bjDvZ?=J!B*T4YAIPz}`u?|{=R?HrED08G5{^4vybvdwq z-l!d~av<p#IE2@RjXoX8*-!uuEqEyds)yyAFUy0$R>40|^8c(`{I_=kMM;C$XjIQi zwK6Pxyyq25MlT;G(Tyi+KiRKG0tzx3tlUgYvR20%ExWSPQUq)&Mga4MJT5M7=fk#| z8$C72R$7$%SheQmufhClQ2Om<q1wJ)3szAV9kh-v!=Ok4bv|het$9vp&hVd;U$hYL z@PV{dS$U~P_Mz{0gw=qvo|tt6qJ=P!{utX^HTdm<|M^b7aL;h6*TAH=UZ%eF<U{C1 zt}nFdXA6@zo=^NaWzj0ZDs;|wKYHXFg(T3S(%3*Y?)mcwG{}plEg)|fEHn9=1N@&g z?hkLD#<im=fDT4_6W%ff%cy-vDe~}QL}kR)!C{HC6#He6LmWF^Qd|N8n!5T5d50M* zZYg>BgmNGW`0~4T!s5djEP}E5|HTh=L03a_4xXbeyDm}KgG??qm_@@)&cccGN`G1( zB>-%l4jd|hNjs2h-1we^DkLOCISMntir5P$N)G<R-2cOixlv}S7`iastE4)=PXCyp z=|A(eBX?e|tcWs2bMd49zb5-?71(-z_nxmdwX}nNr25<umyj@{TZv(+122ks>ikp5 zpDX!)9xA})Q`&yEo=crv&0Sj0Oefn05;)~*#cogYe~SHcppSyUqg#(t259Oo9d(>( zsA<Cn`WrPPpT>wHPG`=)fP=hP%X9n{y?(jxuL1bu=Dtj5yE;|!G4ccv1{xB5FQxY^ zHB1zP0TQ==&Jxi>gfohd3DyGVGW|VjQrz*k{>{q8IMi~);{>-%g<%390oy^Uf;k() zMmH6)17Q~E)|A>#GMCUlk5RrndH*vt3v5VsQNK~}(O<XBM>WSDZ>e*Yo6$ta_pXjk zbNs7xOeYCP9HD)?lP_4G+c(3>GW=9sqIQ4--$?20+i%Ko@%uu^GQb{OMT7gzH}v*Q zU|zJ#t>gab+kYDFFQ0&@ZufppK4jVxl+n-4I?6QrC0W@@org8;`$OS1O5E3JX96f& zEL4XQ&)dz7j}$2dk)A=f{!yWB(L6066>|QX><~@)Xk`7Xqd$R$kUqm$IlKOkFJBNW zn?l!ea=m8PFGCnd9f6dRD*p7PBh5~65y+AUcKYf1^2!itrk_<lTlGj3*h;m=?6>^l zzuf8Hrx}i{?;PWV)JV^T9@ZlVFG6NK`q~O}B8OuGF_ZuZcs=y)(ll)MN3EuTfxO!N zRtvkaw9GU_@okB!ocTme$OC2IyXS@nEw}7mS0y@zPWzr2oO}h*lPwAhyiVIS?>Aj@ zCOH9CSrFmvhFFD{6|h*f<Ex$h#GdF>DS7(>i!`)uf<>@3daOvDI+L*3^5Cg@t9=j^ zZ9%Xl6XxptRFRx$H)`JCAd*oUmK3*&k;fS^gZ<CI9pr@{El&}Q95qva{$&9Evt!<% z=6<8;9gOrjb}4K-DDe<y455n_c+ukbvB;Kw9^#ZTNj<^+LJCv%>iO%4SAD+l$j#0? zLg%C*!NG?!-LK40Z>sKC+;+-b)(QY&qVLULFlb$RsI6B+y2)emX_!d**KF}7_HKq_ zb;M<#h`gQAofx##)v>uboqT1#$=H0a-TR4!77!wGvDU~~@V@pxAz>Y})Ey!p>h(IG z->QwoM8E-Z&*k7<>q%V;xYAkUorv3sP76_0e~7OdxAi=8O5JW<gN0f}Lyein|Hs&S z$FteCf53N#4yw9zsMUemEk$juqIPQwlD4Q#Yp<ZKR;yL3#MY`EVpBqLxAshph*)WB zq(lTEL5BD0z50B9@AJI(`(OT$M6T<+&ht3F>wu_ra<`p+KN|CA5B&4k@V}Pz9RNr@ z=+~1H(oVbkN#CZP6SjNjEq3akedPb%_<s(qS-Z!>VR>_3OZyvDc365m`h5$>&1%d7 z#LcVUD%7{0*f20M@Wp%x9=v~_Yt7CFUhgGU;BNUazT1Gd7nocqO4r={i0gLjJd`Xc zgYNUl^_GGXp=UJjRpZ#axl+fuxvQgdeg~vc&Xb$nYt)Q7e1?6|8|xl(Q+0_t_tCD= ztuxtgg?3k;s%!jAl3PZR6c>h(nK+bo%;DZRB?7sQ@{~TE01$bhWXC<b_HrVkd~Rb) z*PHGk#e>~p2E2Ls{m+Q8R-yd^dD#1r4rra9+spZ*--hyRp+U|d!lRnu$cSs5^$({l zirAHIO79$+c-}@wM>8)|!c_s>WQ#U><<Y<HYwxrU-rQ-ld*d^HYTZL6^n2QCTQwb& z4Wp&4Bez@&Up*KixBe~1EH60Ueu5Z5S3~8jy%{N6a&R7mUe=PF8z?`=n}Iug+vi!s z+1=F~)ajktMVB*bPBw)S9S<&6x_<L?^EJ6EAsqU~^7iiPP~%KR)&-%6^^!4iU?Y3m zBVUL5AP3f?0;o0~?uxvQJuc=rhqNS>CwRU*)?QG4uv<4pJYD4FHS;+rcHB4*>UOOj zI&l&V-8`#gxF<T;v0T{0GST6hPpo`<_|t%E{6j6oyVMxF@E4})k*4uco@`WPpWuIg za{lAtx^!vx{s^YteYybG;v91u6S^SxDB))AwVe5Dt+}U#wIKo|jT}G+outrfSQkkA z*y$t^2H<uz#FITPEG8ASF!}*fDxNB7ZMEDyW98=e$OE8AQ{PHh_Vn-xsPjn!qwJG_ zh=-oMcAu_qt$NK;(5B75vj7I9@8m^GWoZtpbdt0VD{-1>DaM@0`l(Q{7cPHSY8A=y z-pF;?jVOGw^h}yhf1@-V9uawQJGzV=knAeNSLQ`13@MeUb&JcyD4QD-6nzGqik>@W z&)>!&_FR<F0Du1c*-XJn@9xh=up<%tAHVv49jd;fl`eCk`mbO1+lnn@LC@3PG8=l! z!IqA7A+PokdrCgq;2+&>Ak_F>5Vk9`*Dt|VJtM5L$Z8M2zGJS;xZ^*r`Y5}8j;eFV zz76z}O`?%yQ^=};U3x<0D=K6*gOX~%YaU}Wy3=^wsselgkTSnz6=IS^3~!}Kq!eH| zh`l1@ahnOSKzbY?0Fanypgg2#bXv?b&o9Df<2NF^8wl*XP(^ne$Ug3+3#8F<m`|Su z?%0_#;->0bFP6sZI+u395zGY_fbCCv&97l$0FxoRi*`ERp9S8T0GKp;2|J#tCyo~n zS~mk3Y!)iufP#QG$SPZW10@Q0#MLDaZMDM)!Gdx!rwpf>TuQ0akpzcoN21JD_iN<6 zR#6W`PMlBU);{q&=grQaKcDXb6I17L{<!?`n)3$6!-=)cok!Qx&T#J4)i2Lb$bY~3 zV`SCfAP<iz7Bk{jBO)Tw-m;VTN~U(6iG!SVZtszG#tlr}S5nU4vdfm;QJ`BhdRzzn zcJR$Q^`|w}(PamdM~lJ6wUnJ&ZxO{zY0Fb+_BJwnr&WT^E-sc^>uTlc0@mB?jHy)y zY1{CPu22nP;r_5`(Hnt2b;&tz3KA%+#2`>sHlU4tfUoz8u_&|nWN}{I)Vui`2)@u~ z>(^q^$V9^odQ+z%dw?5~zz_^pvz!|vRUkp3^u_NReZc`VimsV&b@=vzLAr+H8-7i} z8SlJr<MdSN#AEXz>kU6bJaFv5`7L=W&ToU1cbygL+g~TZijZ~|5r*RmFbmTyjB*zp z;_VVM9k-$Us$y-x@5(gp9fx6wM)Ef1g#*>4CuKq$ORUiwi`bNUFSa9j*oE|j3)FS= z_~i)JMnm)X)ZNmq?XYE&tZU+ER>VBXzb0h*>gMRjN7``mmh?bPU$aV2M+an{v@S$d z|9wM>MBgQ#jqbF+i!yb7D?Y5u-kwk)of%OUy?7BsFkBD&TsIF+m9$elTl4+IUe0>0 z(Cd~g6$pBeiLa(tKKqjA26eNMWl1pXf|eQv29Ga}lu3n}96esS;V^U-*WeW~T`!%X ziA`rxgqRLZ=}~1R!XygMJTpA;{na3VQ1n+y`&*LsKaVKk+rb=xQV>a6^z6G`M!}BH z`$8kDkUJ))Sk@itsul*isg*P@0@_eeXjqTNKTh%fAlY~{A?}5gM1W887mvwWMby<# zP1m)-Yhjy<a8;Y@eHzf1U;)V5xP3(wF#Zq{?q*RMRZP?exl!kK;!Jo!OSm27EgDj2 z%2*c7lsjIHyrmnT{$twugKj_wWePXf-!PrBW1O)#T_LFg1J*&G2cc7_W#+Iz1ht>O z_Pz2-$&EzBaer`2SU^gqx7zXA5tc{9mSs~QiR7L%Pt4<}nMG0}-zxi^D!_LH-0fei zaDbnQa2F2P>{_jM>>Ri{q3AiL1xWtRNn?DLvGaL=IKoSFtL=hWp^<p{<wvo&2wcYn z9)hf?=0+MpD(?BNPSZ3gNzI)etQxjx!0~GoShQ@skCaAf8A_NZy&`t8cr<cKIpI0Q z^m_wK;$Tb)T$@{who70ZG~Lo!*UPd+21=)^xs^?ZGN8-QrXe)Mv~h-(*+SdW@KBjI zls%NRlX0X(hHsv^+G#0zi5<@?hw#4fyEN!(GIhX10u(Y@_g2EztjV7=GhVB~iYwY* z?>!-dL0|5Pc5Dc#qfdS$Atv&z<6T;IW6}?HxnJ{}+=R`2h;P}mlmjJ&5;Ue}5vo4a zDQSGjfPWti21zcJB?z>H1}2748e8`cHQXY`G`D^`-Vy(n2CJj0=%DvEuY51QiZ-cR z{c%UuAVzYB6aappBuAC<*o2N5YWLxK@ef;EcFsU$2kYrmVMYESG=20vbqvZz@7?8t zPNKz4Zd7l4?OdPiNo<L&jto$RLh>LxV@rpJb0&)GvnDqCWXm=^veF;1vSAP!o*XDS z;*+WA6Kk%t-ryLz&VN6Nad6b<%8?}QfpUPX=eG|1cVzfTSH|!4L6IkmrV{It<?t$s z8YUo(@DyY~uP(7Wv-N?&N6c9-o|{5RG|cp(chS#vT=y(S|LKG*jSok7zE3FktjZ+e z99^S)vKVWxehL${^yz8L+^QIIn_E3JX9gss8Te5(p_l<gK>}NZG4CN`S>cIVx8v}& za@rioewS@|VUz3XS;W*r1nufB9qxvOB-k!|HZricHC`>*`}P;=jlw_6b<fk|O2TkU z3tV~+azQ#MGwMO^^i*@k5*}$P7?}sRF0iQBr*XE%rR6*C=mvL}dkVHAj;{yfF|f}V z+EjU?S}5}42z;n=V1}kDxZ<@~N2Z+F;4X9T8dbWb{!q)Okvw`<$4>{y)H0C&QHB9T z+AdF*hYO9~rX3e^>hf!yq<&GPG`Dm~&X&G6g`(tZ{C_-bJQVimg{n>Zok|P%5RIZ~ z5dqrpd(Z?M;F)$TJ*_$C4Fu{+o!*5n3(pRWSOJI7(#4D}Nd;i<)7!VooaSsth3UP? z9k*KdZM1|AmNveEgbjN@Kxac`V=~{BTfKPzu<eO``z(XV>K92$o-jbMbTdU<oIG(g zDAIJqpoUP+HaE$7o$^<CX|7&x(A1nRpfqK&_UZb>WMjoOovb_&6f)rKEe^ae0T|1B zeP3bNzZRFjJvKV%31uvirsM-|oaFPGY_#<jT&ZNdPG@x(#Eilk8`Q1$VfdsC(c52I zB!Ss4DmJai@utr8hNQH#OG;C|riFVFa-hNcob=xC$qGsBv{5VTraPM5p}-+q@+61v zEz@<&Ea*qOl5l3}g_;X3QDtZvUxK>-k4m-ev6_;@N<haJ{Vb-46YJjEK(H4Edeo}j z1$*|j2)}%(Uou}oUgz^q*C0o(4aaNtdKgZxk&1Z@Uhzu0b7<D>_I{9hueGzV^gt;t z^6|kYZzW!5C2!^g{A@tP+}xvOC~B82{qZ5IR8-xq#gURZZ)^=t3;oTIP+82_TeCJt z>@DzLkjE-P_f+SQhwSKwBs`Fx3Y%6>74|%`Iz@<DN_&*-gs+}k_O4wce}7g}wiw3R ze`urh{*w3Gj@W%pJJejO?_m|9#{AMS`=JgM()xl;BWqy4nfj?kYv35gH-~tXx_ESb zMfp;Vadt$P6A3K;cA{0gB|+TXW;3|&AQ~G;u$O}@;wn6{zpDmKrKc17HlW%QK!oZC zA@D1bhc>*}-E#glVy1#SlNpg68n9S%#k=qFpuupuL+HjCCy6~3CRls4#?1HcX5<R% z3Pkhjwp!2uYe}-kb}-C>Y!4x@`D=ZtGw}f?0f$wOTzb9R_F$>|Z?r#a_@B*w-a>li z_I8};HIEzBBIjS}PmBU2qnB=~?HQ#Hs2f`!y>d!~;k#@(7N?;{c%A%$8_d2R6FIkC zd$FU<V5lTm|D|y)SpS}>fifdAXujcU)_lWYTYjCP<s}gvLp_74YLSAEw(*zlNX5us z`dB2!*P2{({G!bC>C6D6ersk7jN@O6{{v}S(OW^2_jNAh=N~+MGets1r$6+%!;>=! z4prM83yN+pGM5{+Bn$jsnk{=_Qg~21M%yOP?iNXl-PMMK5J-n<+ENY-;rh|5uNYQ_ z>k(2uChgdf@mp~&X9^;!?D=mM&5QdgG_HPBbZ?_tZQPW8p!jg*RbGWC-G16e&XjMY z!i8)gDIA8&ZZKfbU}=|)@((iGyPRS5$+b6Ne8*a5Xm<JcpRM`+SUK9bnK!z&F0Wqp zFvr8brM_GAR_QKVhuS9(DyE+{OFRWfPGQ$RQ};L&b)`yA%(C|j1^JMAY>p2gKbu~| z<Pu{|Q}wsj=9&jEt~1Xwm)A-=?0~Z|WH`97^p4EViusu<Yo5YZ3_p&rfGG&jqQ^Vx zqA$f6UGk^rw5&0y7n(iS)wty~l=9IC(7ii^o}!<nns{>OORKThui|0vwe`B_n#}zE zDMOr$X@)@o9W>!K1qTMgbVc?<<Kp6y-G(8?8{rEc%XLqRWZ2Ar9lxgx{UQ?qqm!5P z!C@@vbTm*Wj426|NGcv3PK{rmoJ>lW=us&oe&_6Bul4#271#;U-@D{Q*b9biMtDp> z+6Rxe#uxxyH>lGzTSY_`b+x1Swif|X-`0dX!(o^kT%Bp{?4lmDnuj+-ETyl|&ibG( zB!hG2b21T!mI#L4NV2F$ZiSvzt~|MoZcDX(d98)?g~G$5x#nN$a;LQ*Ta_RwUTCmv z4T*H&NG#XiVQ8MJcNdp0G+moanQzkg0Nu`Efy=o!NcTQ(9v!8>i&XSU1hS=yN<G#5 zI(ml|pHR!6yk^gjHJB<<)rnS;H<9ied{isyF0kL1l_fDD>AKIW;QeD-?~ZUfDHJc- zN{=S@Hk6hTuSAk;1#l3d_syp0n8o{+2?6dmN13KD8CIVU{o?brW^G^ZRXr1fC6wc_ zpv$^RCLKiAH$P#?m!-}HPH}6;Y)g#ZY)f1c^SDgwsxtTey!Vamzczo5Cr`YP<A|4l z$vOx>t)7@>ZF#;g`t8HO_T4HY8@blSIwz-twhdojUDdOxSq*C3DX78j2iiand7W~; z$%sc8enWd?o39zvauxu0>{%lX=ykdQs3W`7EMHQX^zfR<_ShBWdtjx=?``@dP3{UE zo$UTS;cMLnA&<sftzo0Y5%J@*c{}#5<qWPa+A`L1xsefA;pg89`C-<YI@59ZR3>>z z61S1E*g#l~!fo+2jjRA)B|BEXT_jsxnm0ZG(UKqAg@;$PV0-PJ#@D!*q%LCNw&ply zZ-xTe!0F{Jaog%>pqv|ue%OnYT-$zra^oUlu@bau*12kbRf~x)qSzwA;cm6zYYPUL zR`5A{^&>*L!Z>gw(wf5rqrsel7v+Xp2tsGC2cbc8*1576oz_<fcVw@z^Y^2LH>!wh zBgyeyj`5+^^ZZVweGyx8N;&;)^1{d<LPR5(CjZIOEB{-&4{F<HDG+HN)G7d;20gCp ztueh-4pNvKtD0HcPHHf>{kXeYU-b8o1?TL^nd$K10J*m4pn%nuc%A?hW)U|vR`vsD z)Cu>YO^Q(Gjegdt8TaNa)vce-0P&Yer_Ha_15-+@HXN;8P`EM%)|lnLnhp86$Xn^Q zz3y6pIE1<{acY`wwuc5fH|n=aS3|HDB!iw=W9m^P_5c*R%I`K({1{pCe2&t@I7hEX zxF#^B!<LUk`ZaGa9+qPk5Szzk!AxM5t75MQ;T47_iG)yPga->a?Rk9TV#3tB#fnJJ zREIDgJF@_Ht5hzGPnJmC(woeJ>o?w2d40=UFfr!Mj4tyhj}x}{sO+8RT{C}pabm8m zUfb85_>Dj2{&15GcW)}f&Nh$FBC+!PH#Y^zFN}D=1hXf`aWdsT+(PO?V*4wDk5=Cb z!aX0O==Q&O&i{@Ghn#zN<_7YhLWkJJ?)M+W%EevFDnWDAW-_HW!A9b)j?4BaE3;!s zPltB0cwk*)xWXpJG;=;4yvvxrt7ffrTVbuMD`(l^pY}`bxK;qqQq9oTd$AS?C3lYQ zplR^zuz?c|PIVrzr?7y%-)AN|`X;{74`$iEQCTwE<i$8_TlJl*;z&V`{MKC6P<_A7 z=mL9pwI*w&5qZCqc$$3!<_FG}kj_w|dOm0|ae%;=8(l4X0RKYpvYe%nqq(IJYvpM} zJ}~ph3fX+1>kXg!o#~yg7b-#)pYMyW`@WzYcUFJ+0nwl!me;IqPyqE_r@T;gj+c^9 zQXl3vc6w_w8RL&_38(jS{zOM6>A%lZ2apu$5!`Vom9W^bi8{G^-zC>*L-OxII1TO` z_usID7SP(Zz1!G36ue}kqymAn9z&kA4z_G4GRc&FbrSte#R(e098@hqK>KCU1~_kM z%Xr8>CulrUB4K-9i9!}*G?Ode^(ckd7W4+VCWnK!QgFyzA8Ry7pk5nDP6s(8H<h-| z0TFkL4`JXB#P6kYncz7~46O-axmTep<m=b#%I*@Hl<}6%(&i@2-lyuY7@;Oe4s_l~ zXEsa2WxRq?lM2k1<IyZjnuhKVGr6PIN=5A1ZgH9tifmFW$4JWfP!2x}6Ij8oKvNaM z%g#9wbR?ZUbUblpMJCcD59t~|HQ%csgwj0^O#ASJpC;+R3B|`*do4|~)TjX^SjU>C zS*OXeH!0TS4cG%u>M4_eLRT#-&!IZQNV<>#phyf+s7MgB{zpBrm#nl9zH40x_m_0y zlEroWg-(;+Z$IQCzm44WEIHPGpnY3|-}B$7X+W}YRVqwHW>Da5x!L>I7E%xi*O|G% z&M+$ktSznPago*=^!*Lokk`<WAed(V_HBuj4I!Iw27FG=X*AusgLDvBt<qMA{E@{m zAg`Lh%WYvlNi(RJvIY-=J6=b01DJN1{Z@e*oq3>wh1!MBjRZ?_okYo?+4Tc(2hiCC z4kr>8F6q;9g+M6*7AI)KLJ}4#Q_;dsZI*K`BqEF|FgY8swQA@_tcL9FY5)V0!32`C zzlCRJ4R=}Wfm+Bk=Eqsv5x(SEeHw93L%rH(3T;gXxz#`DUmT((!J9J(zEp0x;M+nK z(59;OY`QZux*N<O*vMf*16t5wb-wKkvwF|B){HANqTN7V&lE!qNWl3#?9qqIq4=(R zz1O&Kl44MsvkMP65k)ZE0?Qg?pxaJCL7R#=&FG{FZ2*!z8KjEqnJ|QPN56F0^BMSC zJ7Z^%^%1Nkiv|?FvxA*E0ogePn7`@@_94kG_ae}i|8ld=8jB8}3@KjUM?K^@zpgy| zC_J~WY@ZVgnvFtxzC?n2Lvcyzj-Yd6bX!{4T4uTivw!s|o$%J(5}vOzh11p^{Gf|U zC=~!oW6#|oycYfNM}8#sBF5KBEAZ22w}BH>Zp^nz!v>i>HzVy{wxhNBQup|Jwt^pB zbbEJ=4qM4PYKF3ve(7$ZK;Ms<J6h+v6k)Dx1sliq8r}^4R`xElcj-{ff8X!^<|TjI z9RWB*M}jDt4+KiUQ4-yPo2x=Er-J62nD&8h0$GhLpGL1QAC@(qYYZ8xK>UirCj90e z-*cEFa-$oA=5)2{o%+|z%BPf<uRyJt9G%P-MSBcmkwkI&Doja$xo8E>mxajru<sMj z4NaK<EqUd=J+^D({AePB%OQe|-+zqPvIE|N?)d=b9>S+xeN?OJpK)rJZT9%{xX9k9 z$AHRqpwG3DGObz=*5EQ(kxA!XSXj+bH;YlITZ3CgZP=fb&XNWQl>|u@drIR(D7G1$ zK#mcDN&vAkRChR5xz51l0mU+O7v6h{(T(vKZDP<5VVZ(6Qhxk!^d)aJge@NfzywuF zgz!uUdP!p%X>Hv|T%K_5K5IBP*F8MNfaF}&9j|K{YaxSHxyM5HIaQ!&R>~1fBlZWk zVbSWl(}xD#^VP$+{eP|!pd<I-{4J+sxy&+09d>X=&w$Z8Zi@tl2VGDPJ-nip^{vT8 z%jzs~R(Y5T{d=__Hl5Pn%0f(#nAJSqdw+BU5zPKU_+!j-wDLCB9LX&Q^TeA}laD#U zwfmWaaK)3-5Cv~<g3rX{Rz+HI8S4C#C{NJl%PWt3f0D48;pfXm8=Ew%ecu8ctaWUP zv`q!&;W^Qa-`46KVm7KS@{?|SJN|F2&zi;Wyh+&7YHpH+V#VqBuHmh{_g8*s2KBBQ zGj<PJmTDv=B^N+pb{DtX9+7OG75lC&cPX2FFjJ_g&)r$eR#W|?dI<*5BEH1Y1kQes zu>SU-)|#~fK|>OD26gU+7m2eA0aW;E?3>n8b9Js=mQTYsNZ7>hiHSoE1iU+P{4!9g z1;L=gj-A=uHy6`D0#~K_)V`jP@|v)pMchrd1{TSEPtPpgTKhWpxMJ$^RM=2f<378( zyfPWo`*sq7d{Gv4`4YB~{Uj1mxjJVJrdTG{J}rq>9yb-~+u{Nz19Ra+H&}R1^T7sB zeAHeiXlsqimmoq}!uR%9A#sgv!<uVfE|`XqsfW5E)>k<J=V=*Z^LV`GMN>6)r4)qy z^7Uzj>6XaZ7sP@YOY4sf4w3){VWayd<LmedYhb?QG3w7Y?d5UZo>8xfITS<4uK~wf zZa<!{?^pq4D*|5VOTbxf*zm;D-aZQ`_OikBTZ|!t9syObI56WRdA=|{jG}t>J8lNR z5~g5NL?g@wbd>qbbcgNoDxY_KgC5WnJm{%hw3_Z>+u617oguZ;z!H&*$O_U~TJKm< z(!<d;F;p`%v;3(70ren#&^P}IT~FcL2llQ>6lYk^%#TWAHJ|!d^`|T0-5ONOgnXMc zRDTb5j8A!38qh>(?Iy>}u8fnH$+tlzlTE0%CAm!(LoW4SQT4-zt$fV7#w%+nk(!v4 zIIUUhT%<YhAD)f>E06eVvF$#0<ZSMxm^V3Zi-!`;YTWNiY;xQO<H<AYIj+hd-TeYh zF)PhDYnkLz#2oJal-E+{_6YruFkZZRf}1~*!H`JbV&_?~0B32v`$UIXsns(J$FSue z(>3TaFzXdjCWM}iE91;VWb>gu?tBt+B8_?>97c;Ih3g*<9!pnbSyng#vEm7@*naQB za?#d}`&ETW6;FyNb&X<a0|tO24O&!iy`v7z2F@^A;ZN?nqV*?jq(*af@yPXYy#q(M zTbf{Qm$ZIMn4pB;rjaKo%bhhU@O^v=V?RL5jrW~`5$k90uBB5=Covkk?_3XD{jTKP zQ)`P@F2|h86}pIXz;$~NX00D|kqoD4<HR!wEEauZZA4yuveV%)gy2HmCLvN!<<Jk; zlJr4PEBKeDlh#^+m}#glLxAUFU~hTDr0~;yw5l6LD9hknAr&p}k8Hl6iPu&`T&de! zg+HP4wI3IF(!wp$uyv?=NY>o+%obPI_P~W2OnMHHQRWOxZljQDftI36JDWny7_Fvj zytOXu^QR08uOJOiAuF)Z-!ZXhm#yUZ)L0ETLZ@8t2Q!*qosT>&qTZzGIAt2?w=_+5 z3;D`MPI(2)5p!_{4T7v@8n@txo_8Z2`J~)>kK&O_7ymxdsP&5&w|Wk)B4vewin9*L zbr_)HuUe>RuClRobW{{N;P$dQ4sMHe(hg0sP0O;1pK>qlTpW5AC_=S=@XaaX-_=Xk zPkf0qAk;JZB&W_|`*$pz%<ms}CU&AZjHNWLTo)9;8jiAAdQFZarDhH^ewDK~`{JTJ zr_O=^QSdsKVt<x`>3lzANr6ta%MzRE;BJtJQsFmAR|rG&K~|cq&rUt$aDwnD>T0lO z<>{+HlvKA~Z_Crz<D#hZKC)2El&<v?fduuyrH}T0Q(j<4aG0?kJgL;>fm6E+q${l| zxvVGi&K>7`qx2!U;Jc6#P+fHZ0v%Q6avJLwRX}N$oe?tvIyHHhW~p+SYXqR`a!p%? znx|Ynf8KuiBkSayAcs-bY7y_=k%aq3Mz1f5igrh_)pdx=AT~e(3NA78J%+c}%Pbbo zf=2db3pL}M9t`BnR7g|~e8b|+%h*iyvwXjYGppp!*?X-|(KQQ74=rsOY-#OvVm&*o zz^@!KWD}$?>Vsxo-{wB;-akQ&1d6ErJc6m2-pXfP%N&rY%~aa?)u{@iX}TI%2KBKH z3C~sy>UN;3ElrQ6R5?EH=7m8-QCJ<lLt!Q=0gHF*S}2b@Tb|4*xLY)!yw6{Fg=CCZ zIl|Ofo~Ghv`7c6fJ+}ZYjc9NPtk^Mhmn|Xo<M_8VI>A@7p@}tTP3U>|Np`U`>=B34 zp4BY3A{1u)SvjcZ^+NLG%z{BE4wx#WzYx694<;*o+}^%#9*68mcc0_~w``4u&2Fxq z4nh_hXLdaak)NDcET-S5OtXA9uma5}FjKu3xICTV>S}Wu1Og603LEK8E}AVhQEHr6 zjMaErAsuQdVOi=*#wiDqrj;xoLZ>Gee8Dw-Ed$Pb9)G@+V0|6i%%{{qsq$KGw$3`7 ze4{p#FtCV+CWy-l0{*<oXWH<Fu97J|KSqR;NApmfq(O?}W69i{a{awO^8c*ylP%)8 z6U3(eH|6)2T<k7~y`>Y};?f1)UKpn*G33j{GB4?;#QclyXo4r9M7Fy}fv_#`fgEzG zXShM*A`drZSwnCs%5zXI(TtIiy1Y6Bdih2}^d~eyXyp?gagW`W2#S0qDa`1|q;%!O zib50ywTPAih=lxEC);|@#=dM=Q!GL<yiklr+Q|xMOvNv2@F{xUeG=_AIgulo&h4<M z%zo0yr#2#ytMiICMRR9T*l#`*V_XroV8=DpnA92*-^HyoHK)u0Uvm<p@-dEyoG);R zcbV$6ieRUxDfxd4v$MW>B19kgs^I$5?a_}-lo%l^eG2Mn0Ji00>4f{BQj1v5GT-SX z{LGo-wH^{N@%%>>R?3+qPEYq3pjpKU^MTcNnDcqNCWIpG$>U@;|CR9K9{~%#ZIcX= z&&O71U!Ct%U3Pv5wb1IwV8eZQ{ot3p=cfX?ms<Gby^}VwY{b%cR?BX{+gAibH^nR5 z>k)zOnVvaUTJ+c_F;Qg?o{xilQ><$!DBF9MSimZETOz*Kc(d-&hv&X+!Du>L4@_Lp z1w;k2`^>!pvku-2n}!2e&6q>_2t>;=SGIf&)V{YHpyn;F7B8tra;JHGQER!oK#257 z9q4HHYb4ia=2Q33Z!HWJ%rS%_<Scz!h=pDbyYO0SF5`sq1_H(MnGM|m`^{I}@$<Z? z8ZE)1__oFr=?hKPG{;-{N0Y~(%U7U(;f-mP5sIk&EXfb|vd6tAv2(C}YP|prpbM%~ zgG8{rvRzYb2y?v{m|bcUfxy2ZxWIqm{P~+`n!2PoNg3uaZUPLDDS=BJI1#$b`u0YK zq@Cfxc*wB>qJ1xutJdb|Xv3q_SC^E)Q;KQYbG8Jl4IAo&SA8QDa)sB4Jjx@h-o%|W zTx4oT%0VA}>r&JA;W5vjI_y-v4=z4qNeVrNb%q1o)7|I%M-k9LUlo}<i=$<i?peqk zey`eU@oz|@7Dw%G*nt+kg103apd#I8;qgD~S^z7Ad*hMX8q9kIp7<IEGoxa-Hx`ul zZA=p6a6Zy|;$j0&$fVa9;32S@9x2^5h_4t3!t@hjtqj-8ri;Docj3Jzg1TDh>Wh?G ze>%{+Sizr8`w=dHcXjxSIUh!?f4^I?n0z><m9uOcjE3jRTFEq&4lL3J9FTJeq>!(` z+V=V(mis%Kr|mht05;uitmNQA{y8*@P}-71R>vt6(>q91qcn=qJ9QxDfvAiksc4qJ zICC<P7T5Q)a~^it<dI<HR7~)F;U7c87`KIYSC8WXs$JBfY2y){<kL=&Up$k5^;<^K zkK(Hwix~daI+JKc&m=t|)wBMAN?qT3TIiGK0DAaQZo&J>qTGe_($Zq&<J^?Ye)-F7 zYFthErxLKlwH~;4-%w3CG<2V#-*%Q;q&DRAxm+l%08t3K%3peJa2=s-Iuu2^5U-Ie zaVe{`H8SW26+wus9j}oggi~AAg*KUJJxsW3yE6+EC=KGUt5B+WwU1CIQRC6Q$iLA{ zpLY0;ctTo?G2P1v|2+uKe*2-*<km(h@9d;*ok*!s_dBz;bco_lP2-a0X|D*pq``QD zm*B|iT9e<zlV`(#(XO3o_1HYrU&xjH@W8as^SO=o2M?G`3*}LIDCZ3kd}JX1F>X(# zVh8;`g5>`XY&zlC7ZuHkK%puyE5f8j;+#Uml94F8OCL|)c)paySLtVk*wSq>Qad{e zQea#tIc=$Nm&FLQn2CJ=VBxPR%U2ufj{N`%vrTn`r5@$VC(ZJ;#YO;U1+{pt__faV z%A!}*mg*3eCkf!~92{!$K-XdvGLW1omb;uI@s*^I9;p=SAE~>H#vnmuf@{`iMg!P? z;nhFJ*X`;?16C#~G*fPwE1SZfyXzQWoQK*5^LV8Llmiyu8ZikLTeHI{ImS$cM?wEH zs*6FkO5J29Ko0WRV`D#{cx4>KT)(aWB8|l7+$3aRqo(}Xyphsob)(|Sn@;(RNi878 zN1MBw1_&&Dge_XDhKpFTmbWLAgptfvQ|Gp>N6T9aJrh1M3BbUIE+QmcTD#9LYdQ}b z!?NVV`mImL38_w&iZ0?~tYGAc$l@{wMkdi4O#;;g&aMy(ZY3Td1?zq?V`U5hQy-+I z?dmV<>~(Yo>g#1u05JK9vz6?d%_R>_P;fYa?mNkS&c$C~94K2Eb5)(lO|o7*@+5S+ z2qgy|P^~EOfNj`odhV{zF(mG%q#zt})+e1goD?o)4g#W~Q#nGjyeDyfa;kbz!3~Xi zZ|HSh?MM8NZ(MkH9g9VK_au{A%8dO=EY3-ob{wX?+m=t0saN(BQ>_C5*h?<7u;QYK z2uIjb0$H;mLS82AH`^`ahPwk7kWin=YRLLv83b+?i2SPduk^HV@$Lya{}rDHyl&%_ zp|?A`%LjrgY{c}%_CSmbpB_Yeg2W8b?AyytYoc42Mrjs!hzf8zXLEB8zOZ^BAqIDe zTxxI-4m|mXw0KoBetjD!yb!Nho(hR{5L-QX(5wZ-+qm+XEB|STL(_9cD2?w&K$D~} zTorp=I~R4%4w}sjzy-eDFZ9t`rm^e;ZYu{6F|dm*g&hos3yqyVsqH+T`lEd8_aLjo zDo~rZ3{nh`d{e7wr?<XDUr@OHgP{^e)`J|3++hV7%FBC$dPmDA=C)4hg*@Y~Bl~G@ z_ZlmKNde;kdnMNTJl>dhKHRT6yaa+q074+3sro77C8=>&(kK(Hd)GcUZx3Fc?@RY9 zk9v>WRrCIw8aH)1v^Q?KrwXA6G^pj#B{-$QXz>7Vgih;o>$KYsC}4-liliU`Dsv>n zy>bOO@zy52%5w?d)k4+>_ZN6&zA_UC3&QW03!Ll)Gt?n=6qU;lCNKUhMm&a_>M<G{ zhb>6gTjJpnAjfAGA3ntEw;S;0cPq!u0Zo$P`=Rr`Ix(av=#N+*Ek$Kz9q$&FMum%( zc0Ql4jQaqga@8lKRjrfnMWFQdp@ycf;nYI}>2~8y`s4jVbk0Yk#djRM<>_B(s@^ot z{m22FX}>u1-tO6L<`$PYiORlBWaP7)$$+bC61w<z|L#MIbx8m<;FxRhL(qt5T-G}N zW4^=LpUT}s{OeDc%@4{I>wZ=e9+1FXdEC~|Oq``nnEA8W4OH_A6A;WgXHNP|s=;7l zaYwoN!(@s~vQq&a<N2RZd4T%3ZZ6i&8wD1W$AA`wTqHW12Cx*(nGRFn+3|Oq0tPxp zy1f8m$F^ZdehMT{X0p+&Wj)-&GDehmHAx1eA$|%nISyn7iU3g;Kaqd5-^jbIxt$h^ zoY1vF3rI4GRT-ys@5GmcrBMOKTwC{Wl4q>pzOccbDxxC7;cjb{j3!IaHM8MvY(z#> znRb)fuqj}Pbm-*5692*iIKF2{HXvl37p=Qtxav=PodV7YXUh5rCI2#9{a5AayW0l< zR2=poj#F2Qwn<=!gaQ-@0T~7f)&+XA7$o5t#yB;we`jWT)Vj<gIPeGD1#ShNm^TP1 zz#Rz6)T*#>y`$Ho&^-+u7KRMw>6jaLL%yue@W2cT40v0{-LK7jd4Iw8stU;6qT&IE zKnvgO>hpQs!vZQ&e29^~!6C;lj@-7p*_Ixgot~a!HKpcnBPpeKE2Sr;JhqZOV9q5# z1UiS8Qb*nD0xb6h)M)~8)q@TvVZP42O@Uji5#p_<EkAX-fDkop#TRRF?mFf;i^FLn zWwpsw=Z=6iF`s^mYrr{B|JJRyPh$>u1ARqV7@Wv>9x6X!9XL_2@p_vp`3?VSvw!m< zXT^J_Wg_;7=T3zBWJ;8Rbw1tXX&NxScTGi8T-i2|JSi>K?{|dPQWs$VVIr*`^gi_C zI<H7xwJS7Q@XtM0@mPNBOG4>1&g=o|r;_|#-A=15bRazJk-E@!D#d_T5~P9hlB+3) z6b*L1v4g<x&2N=~>S6(eQKr>AKHcwFKfThu5UOivAKuKbNZ>Nbxb1z$5x6M5Y!tl! z8xO=yzFWBPIXXk(5}8q!A0YG7QTkYm3ouXNqRNK1;|jbT_P;3Hs#)6~{!Z-eDV9h_ zTX#;1OXMZYE9JeReW2_C*nMZiy-gGE=z3a;KiUrcBf9@zeUI{qORl?Y0cYz^xuXg4 zLX6yW(at(icJ0dxL9i;x5-v>~^|~ldJ7J6VO6Gs9u@t~eepzAoA!DPN#^K(2Qc!fm z+g<ve&Vbc>qY9sL{;h>rj584WUOgPmUJqCS0)$ij_>_Ee3$It}2|}#`m&O*Ri+Cki zmYe=ccSTG&hPb-s7uu??e6&)GAa5u+<Ca?hy24xXA#?I;gzvC1t}$#_$sk@({<?+@ z`(;=zLMn_NP~!IFRn9A`MDnmt<sSf)w+E|7a=bS?X!5**@$a=}1qPx_l7Qgo-Id(J z-3vULh*Uj66oJ#aXfaygPXK;4DT;mLF*`5Ti~ZTnghk$)oB*7M`))l6;f>n&fXn<= zAVKM@2z%uvFvv0c-g!wq{kY!D`GLE;_@702{&r=7^WRY1C+BZ}*<Brbf>m@7=QV!n zVTF!lYR}46vK*EI-y_;JS3d4s>J`YBqT2A>!WFDKT*R&kd8IbC)onrEz!HI(TZz(u zBwC3Op1Zi&FPe3&E&7D*4f8)z10@y!HK-$pqk0_%IMZu^9d<AlMF?kTm(GCBY_{@D zuVr!%B`p28avYF5S_cQFySLnH-Dmd6LPkA&w%D@YV$Uq1z$e$+7tppeDsKI0GZV(_ z^`xFOdNgjnWEH}c!K|mWwdJd28i5b-|K+;_9}-x<A_=~2-J@7~a{bY6WgwP9%YEq7 zKQ6}qL3r%dekZ)osV;U2u)`eJOA@c-{W>?+eL95H%j5K|$j5N~<qWt52Ovb=3`&4+ zWYI*v{X#Xkb9duW@YNfO_5_JxtfPY?5A<GiI1LX&^dHjP2w0~QO=`fJx%V9TW?yPu z=j@XBy1!R5HSvR}Q}<BAv1&>;$i`=MY3mOH<Y(sJc<oE6G^GpXUT)EU{F_>pd&_QA zQBN5u_~>7*(7zn{F@U0Y8*meI0(l5`*-=7enW-ret$jS30X3_8BCI+N_}lHSetfb( z^WVys1GQS$4|SE^@jj8J!W#s-dfBe_*3lCC`n>3vnEl(dO>)I|jt!&7C8ZJZ1r0!Y zNAG7HLnnZ%Sx~5X;}Cww<IJ^p4I{;gXii(_;Cmcp*ROMREt0oJEnY&u6%2m2ZO0P4 zhJOnJwy>Xyj31PTrO=<%FmEpOT<^3Upt$`bm`?^-oBdiyX)?5~uG8D<PZwF2!mgO^ zw&%~Dz5D}3QLITyN;>b5v*04pCAuyBKF348xBc;xjo26V&C!QqdKM+m%Pn2*;sy)~ zXVU(|7yaLRNa4=i916nl%M27=cs0g!e(cg)l^13FA__7-86U*mZm(d_id{ez<UCUt z>4ZZ}S*47rh(5G|TX8qeXS^Aj&C*rodz$R0cXuTL);x`veBT;5*W{r(H}Lg3{~T~a zY>^uRsskntZ!vQFtNn=H9<{(&Qp1f!%ef@O@ty)$ZMT)H<<sv!nNHFU)9?-d%hU^c z@doRIt_S6J(Sh7uLqOP`Z&tvW2jM9P)xGtddt%M4@*?_ABm3>&I6S#dn)tb2v(m1{ zs7>h|JARByhr_m95b3xDx-#d-_0>x~Ouv5Ra!HUmNeV6c-IJ#gsjH<J)N+RV-*$p( zncE3_ssWCu+GS42R`1|9dG`Pn2tW=U{Vea~{)-R%bfmH$av57P=ag-d=neD%zNFPp zr^RNs)!6iimteHy>^$%5gO-0B$0dTV5qqYAtf8pnp>zNG0NT70-tUyMI7`#^4JOlm zgU=ZUrP$$MavSj3{;#ipWkV&1?KV07q7LtQ-|k~@le}^_kk0Z_jbQ}QzjTq;>CYOR zOYihYAZnomYTT<9@}*kk5+Ht!9sE}_kFVXkcl({N)W1B}-oyL+n*s1yzdbcz&$w9j zujJfl6cFEny!*}nrzJCH>YRG$p|`_Dj^%id(E4{WfV8RyRiSiZq?a1z@R!SSQ~jiY z>cOt(LsNHUeqGJ~{_3mgyUTl>Hkx=4)8~tVgf{e!tT7C5h)b5^S2?#r<gWkoa6kTf zaO|X1#<yC)7&y#?z+4zWWJELI&J5O`hhjLsDNR+Era>a)fvgcLiWK?Ze44@y9Gr$) zRt|roH4|;hd=(Y|fm=7Fti1R%`Pch__&2MBy3#Ip4%-@;!!g=TfeVsAR+G!&6JI&2 zk=A9&`N_a!<7H>Z`M=GsGkuflz@fApD$n<CE5XU(-DM6ZOJYLF#W0Cni=+Zy&(U0$ zfqx1|&b%nzglsgBOlEvdvE3UcIJMtq7ye0b6#|&TVE8s$h&4YhWsw`;<0^7gB=*_5 z!tn&|g^AYL|Gp>u;-Y>(aH2k{Y<iu!QaH+7dtixr@#`H=B=0_RG)}acU~UZ?X^cK9 zeBz0VNJ>aJJ()=TNdMa@sPXFmIt5X!3khxc7wPt~r=&&eg{_v$$Lp)!mRf#N2VX(} z_Um@!=d54f^50+mZvO7_KBtXsQ+Dnjnd6IWjR-|yhuEPiVF}tktEIdbV@JdTE%Jl* za#RVwIL{fIXLi%z($LMDN5eWfw{33UymS3#XyR2fTBFOTYM)VH@^5GDKL<@)7fv<$ z(dBD0#desqzBPqv8hj2M8*PgSbr%qa6oEd!j(Pm6AY;;Zzdv|9SN<Np(#geHpE$sm zV7x=ovwU%3Y-NfQzdloXL#_1<0_TIjq@9$T+JN4^Wj16sB_Jjg(mWaD!6R;7T5BIj zj9aGBb8<xXTb3^%I>X)%U8$S>{rKURK@E?{faA_ydEwCi=SC%bc=s!qPilHDQ$&T3 znj<o2zzYivkT7^v<Do*mmi0u2CifT$?C>ygN54{YV?{4=YV=3<0=QK|j~FgBiMRJ+ zTkz?<|17}YBW2&E+Z4qvMZd&6uL1Hw@JpTxqhxP=V`BzI&-%p$o0f+q`M?0+BbXx# zp@Ty{1=Pxj>U+I~X+*vens=km(uZaC=fhp8>OX!f8T@*Q9{%zp5KVNng46Mr2mhaS z`|Iw~93F4I8twXOYv{N;%hyKdjBjt1iL2s+3xOw;A48ReJ!I$So#D<iJdp+iG%2K8 z{J^V}OEM{MRBa>#ZK3fwu;gD`(USV^_oq5Ej~^z^-Wq$|=vSng9p!0eHZ)D;4D`*H zBy3yBDHbfv-ciMc8}?}WMi4#10XJUEaUM-ww!U#9!K&iL_`Q4koeZrcB=<vn?~nM2 z_2}-de(5W6djCHc>c16DQA+$_wk_^Mi&-FFr#Rp0Q1j<~ko5+mo#2#wCnx0z-Fnr; zge49C-XjTd_DflPp7`})2|SbPelYX1eb{|YUc;o=0FPS*A3XGjBHC$f;>y3i?{~1o zk&L%$5?Lwf8$Md~4M3`Z!KD-9h7c2WD;qj}zT03TC$e?Qb#=3r=(OJ3?adQsq6v8( z*ksz1`bKT&-WDXXOF(=1ZHfomcjCtl;OD)9$(*aJD5I#l<dp+q1htZ%gMZzR|M#oM zQ1jo<z9AEsm)y+IAek3l3${ZceLJ%-tax6ElfuQ`S|1=iVFTjA-Q&F#5XYo4KzLN$ z!yJ%ZUbq_`9cWqdFj(P9RYb(-ug~7S8;{55J-e@cTulAcz(7x`RLy%281kaJy2Iyh z4->h&*(wa`4c0u!092Y4PHLB-ck2nt${ywyY2R%bV(nvdff&%#;Z?--OdtX4Gb9i} zK7;ZT9p~JIzll8mdOwh8aD0<CL76L1_5-xDI((4OmsdT5??uE^3jME#O8658=dm|+ zve)6=^@3GhB^Md~6UPg{*|CAAsONuXX4Be@?HVl2ti0Zipp__rHdfkI&ZX9GtLqLY z3|aPcYKZ^L!TtNwUz|U}r@7i#Is0P=lQ@ta8^M8xJP7A|b}k|_mC3HLhtkWvV?J!F zNpPF0;~eNRlk(d~)3=t@g3N&%v~g3fR;^bZa$W|wJ#FyMX|YeDA|&tQt07M9u_@Id zy;k_@keVO$tX>$5leee$`hIMZ;~NbFgH)+TJ@9fVnw?bT*vS|OXx%8!_nx{CK5-1{ zJW=oEyT#id-pa4x`C_C3f@z3L$v(chMTE>!G3W#zHoZK21AAW_7!}VCCSGn_sx~zK zZELr<W$DO3z{lg|!^84UKfc_Xk397ZAf@CB21U4ozPtVp&ROfuk+JlLWzd$HX|^^v zn8>3{AM25uop&TZnAfoZ!reZ}cw4zY&-WP<J(Fqf#L#q0N=Z70Ur0}CnNphrCQU5d z<WlFAykj4mGHx0RlNJ}D$x4ezrly$fPfh;rOzR^cIBD*#zha;&8xBT`x@wI^Yt=ph zz|B{o9C%<elG$8RU)a7GN!PGZV;keqM#@1`$jkH(O8NAz{Zqz!opcU#H8r#f+J2!k zWYJReY|_`K9_hb3aS#+8Y|#-<0i!1$f%YLDAqfner+YbyRP9AE*!$Df8P3NQnPz6@ z=2U@6TbJx}4fQDfH;VW0pR=z1hOc)JBZvzMGT&uE1HVUa!lbtD`1YN;wPdjn6>A26 zV2oVs)7%bzKN&{(jZi<3J#N^WircQQGJE(qXgb7n-{H`U^Sky7g(n<>`d5yW*<N^% zIfbtRX1g~wxp5V}B31Z^3yc%0RHq(E{r632$@!0y0pW-a(49hW-5JV{sN3E0#2Mbu zU2ZC!%9mo$U4}G~{c`2%I1&h|T%N+k5B`!+p745{l@*D8tq{SiG1(ULl;{F5fL<Uv zEp}aUCxAv=RvP4-dG;nJQ!3sRI<U~>xgfXJAKl=XGyh5i(i_JU7)U<_#5SWtf;Q`1 zJ`xSvICfWu(Mp+XBwx4T!l#t{r~9U5iP=GKd@>Pz>C{*?<@@<Qj9$M&Lm<vOe8NWm z&|}RVdl6H$ty*)apSAADN*-5V%Om(m=^Rh=vH@i94IXgF6Cq!^l-4~eyd<WYwzXS; z$sWlkrG3`xGTHa5Eh@m3J5Ng}T2`|u*5KrOt$H7i)p-a>Y?vt9))(Y=b&9_B)Sd>W zilol!&*b|r40%rkO9MMI>>}&eA^#t*DuXy(wdyJPB11Dhtz7(X>MGWkB7{_4<*NDS zOtm#101}L)Kc9lZp8s<++;-Y~BUvo|pv!~w&Qoa;)!8c3;%;tkI`i#1Vdu~oyNkAN z6CcR2z4b(*af+T8<-k!k^SjtF&S!Zv)@lQ!%j;>_M+T>=uwAqN!4jx5^v}aI5Ci4~ zuH|T$X|^%E{c!NZ%Cn-A+0-`z)UuKCu(oCYqZ?y+#}cro8vGY9ayuJJ7bh(4`-Hn) zP-X`UX7g_35o;a+IK@ykw%;3m)Ko)MEH^v}i2|f~jWt1<TiCsffTo2GQoh&3#1v~4 zBrJSZR)71yN|o*sj#ctH!L6l4YAArA9`$hJVAnF2bvo|FKbN3ViOW?~@v3-;#Wi{P z-h+<<<$flooR9x%Vqh?y39;*|st709b&tJ0=C`xFY_oz78`^lu_EzH3!z4@a^7!Lg zxa6myI@|Gr-@PROqO#k-dG4#Bi9ZJRf@`l6eaZ5iFw&)k-iAjpeG}K0hcU3)vA?qb zWN{^cI^h!TYKwu1YB`EOeC3lF!rpe!?E6_o&lB9DGK@Lvbd`XnGP{Q9AkTC;XQ%Za ziM}sF%AjgRc_$L$ih5C#IIbD7?zWf70#6bz<R%<{qbYN$Q)!1`)f7Y_d*Z@E2MmWD zBMyq-K5<NHY1K#FzWP5>c5<}{vm$GQNgKXEf#B=&>O(lgMmz&ZJ$N-AFlYIzb~(Yl zi@OtucAcFa{8m=xS(9`@0I0#%*Vpq_IUSp0v0N~Np4_vJOH-_Vg7l7l#>T{*!DZA$ zXpeN9-A(dl;bVtcs?bT~AFGD;Zco1M(>C_A=E~jGkvlEA8mx7{Ew=?TTPhu-{No+S zx8qDvH{L}lfe^Xl09L{ZwV1=Lr1O2}CO^$n(2(<x@U0X8r)zM{b?!|~EVV4{(ih9U z<dXBKsb-n12P0x4wIdj0r66izK>S-n8PqM*4txJrmzo?CNr^~k<<T?>CE&GDELzys zj}P%v_1l{(6FxrDl2&ZD`pEMDz4{CYbue2-Qv~smJHFnk-2QG4JsV5PHmTK+i}Ld3 z05mPrDG>D9KKL8Qz!h)DniU)b?mUpySnbW)7eZ;_X-4wHw0V@r@S~-cep@r~yaOST z%ts~RE*(qRh~~VPA#EYz;wVDI5X#{!1rZMO^ZmS5P-U^djv3YuD!Ki>nco6lIHKJA z=4$hg-QredHV9z!<{2^D`3?NSh&f5s5nMg17s4RZXXAM#v%VHt<){&tYF>K@OkAC} zk9T-52{`GMY^&}USQOh_cONY~S2U`rvxrp{asQ1%s@M_ZIu)@<vqgo6G;YnGoz0D` z2lD=#MF=~UZ3lA~Jyggep+lA5o{7F~n#pL~&qgL>WQYodZzeLE{nHyE5wJb|tRUv2 z&K_r&!(#1eCGTcRf*(d*&qQrCn4s7q>*F(g&U$XFBThC^CR=rT`3&Ll4&n!t+L7tg zOU1;)fOHU~@zodCycXNi;%jg-CuP|kB}*lA!UI3glv2z5fqQiT3d5%hl_eW#SwUda zMWF-)o8jYPZz*A&+N38SPR#MEw<s~g3wS)d=R%R^=8orMHAnY{cl5!+r?3cUahCV) z4wY=jfv_Qcv93_6V1@=jCpye@#N|x~0rQqpd{9>?!*gim$4&vNYcE=}84j)QEaULY zCWaAA{Zv+SUkeOwT_LKM=J$i4)tO0vLHu8b`jFI%-@CC0d$(<UyWYp#y5J`*nL*dR zXXO3}i<Qm_v)0Uv(NMWI@3t=g6_^C{kVY5=ZY~8F!s>P@d@#>vwkS7Mg%T2=GC%fV zPR@_K-Vz)z+=U_kbz~kb=OWgu0;@9>(!VkCt`UXfx$=$b7_SQA%L*vOfH2enRf;kz zD{#ETcYC2omu#-Ih)L(s*t{LfD=Pz>9?I5stn<TmJ}onodXhWL;cyfz38diBW6M2| zusu(8w-#%mZ%hhBR^PTN-!`oGX6cn$!xx#&YW=V2V~%eI8b}56(+r?4eNDntKbp~1 zZevOfVq95LqjU;Dn}1(_pX(8@$bYg<lNGYEp|k^N=wt^xq+B9K1s+U?#mRciHV+i< zuR8j7k@>6K1XzcuBR0+9HGRxkS%A~DBl`n=$k5^v$k&$T9%!CJ{j15!R;*c8(RR0x zNOuVfJjo5@4(rUQtV#T;Tx09CT)*ev5xsOaHOrH`izczQ3(rj`PcYU*NYuicrlP|K zNRt+dp7`0Uncq26oM>N(1y(71C_mK3T+GnIDhlNV)a2#<M$*bF(c0lequP|u2fBd$ zA!hCOsF*y|$SdR9mQT}I%Z-GFooA0egzr+~rl~PkzS!@&L%9ybD-53Fnd6kEp@X8r zJ)cwts?aBE=3Wn*CU?fDyD2H(GvXE=$WYMB5!}i`I-K&C;tO3jsc|v((~jZGf^H^u z`aV1F6((SflMyJ;PrmiVtU(r3YZE%PfZp*8qlEXRxy&Y;Y6QSlLg^eZ&ETE>uZ3wO zzFSbhI<7Q(vi$wNZD5A{d9kdoJdblCuU~*rCw!3YduM5|qo(RJ6W-R|O$(uoANtGh zXe0Rc0gk)GwE-k$V!m-+<qhD^>|O;Xj7*$rw&EMA#Yxyav;2Qp`_8bawq$LQBq*XH zqGXjERdNPVkt{g}1tsUuK$B5XvP8)!S#l0dgNR6y92#h%lA%crG|+@^;mjPlbI&|? zzB%)6KZf3WtyNX4>aD7`NC%ehY%WgMW7}PG!b1>H=h=1%6cfaIy^&DpY2&h;Im)*G zRf<@xTz{6<ekJ}IpV+(@X6*U>43Z>QK%}t3Lv~eQx*|WHBUdH87F`=AwsW0K({N@- zV@N#?HMndGF`)REtXyR^jQ-FVUK<Wa*fcJVzEI3`n%}Aa>;yR378h^K?Td02akpY8 zmL>|yc&%Jr*2_!TG4UzrzHi<LeVRlPgIec^Yn_R*Qig%FMIV{~TfjHZRLev{x;kYp z!DD@cvBg|^Oeul#8fsFjJ#JFM@_5fHc0r0$&yXE8TKVp9hn=<}++e)A$J6hFQ3E!q zi4OR_dz)W$V51uKEwkG^QUM#doi5esHq6<n<~SoEAs24&ExEh5dA89HIdApK2uYAy zr)f9L*rPk&ad(?v*JYpimatVO*^<-0{!}`{`_RL-A2N9;NeexA`yTU-z>bi_lO7Rw zYwY4Pjs>$JW3>2?v1R_^W(QSAG90v<wN%=;x>klz38-W#c=g(Dc2e;QswEg92M%j^ zOk3%NmcR3O+BiRK$iFw!`?RJKNfJtFz~SYAiMYZjH>~*mH@5d%EiMgn;@B1Q>B>+> zqb5HVE{G1zpwfNN=^3&((iJ89CfEr;v+cT8qZ#s>>DhRatVbbV>4Pj2eO@DhEO9)W zg&5;=J-LB(X_cF!m5w01SnPha@0eA$7kS}2rWzVnn%VJqGO@O`H<0$G&bR#lPzIyI zt?Y<Fz5>CFrbJ$0w1^-?Lmhhb;C&0=%x-M)!=>v&XIf~pYTp>7iZC!?OLSfByNyVn zH*wkTk;Wa9{8&l!`dS5XW`TDO)}`->W<Hp@Qc%911}Oz~2pNEY&3UcxeMhoL1>}p( z=v2dnR?AmIJ2bW5F1X<vN#3EqcA+)J?FW%k^Oq@yiES&zJ9&DD$5WlQ2;#RM2JjeF zRK2+qNtH)aZKH3#rq19Ul$H@HhnQwX1~;$lh0?YL<&eXe{m+8Ntom(pjQO47PdAaq z5xPy*S_UpP3uXsjW!0V$ByS(}U#d=iP3ogwX+6P4dT~spSq-V6<lTrtgZd6I(7QNr zR;XdhADv{MMWQ)J!7&*0aerd(0L_hFL9AXNxB=M~XAkjR>8ew<tNsvE4*%(@=EZAj zq+5?pu8HGoEf~}Z7!;8SrDX3n+|v3I>hcU8iy2311yO_>Js!e(CmfGbqiI=})#nF4 zjZPk~2avrPXdlw8LFkEz3|%*|K|EQ0b6Moe)_%&sI(D>Td93?6U+GQElvn1V2X20C z;TrUin~!f0^ZXo1o;bgAOE=x&SXt_9zmdYV0$r-4N*g3ooKf%hk^EHFeH}Y?3m?ol zrZ3Zq8*_;UmLgr$^yO7*O=_-(7cI4Y5t6F`zu-MoewlyOYG^0>J@J@uJ)adqc<_S_ zoi3~XTJKbb(Y@Zg!?Gk5jvJsHZfR%vaD;-B9{as4{rR_$k;?P)^7zb2_DN)4su0qU z6qlhJN^jyL^5vUPGg<!wYyZqe>=sbKsaP@0PeI2vEBEkdErpJ2gdRlg2HrZ!KdckI zFpI0=Ym0SWm%_H&AH-5^g<i#Ng)^5vpN>F#!iZt;HB$%eoAgwK4{A@{MroJ8)IF+% zdoI@6(uw=mmoB0_9_#Ar4#)++5)2a?bpfIO!I9<489h;gsMvR0RT5)r_4}-@jQnEV zjf0l$?R-8p*&M*>N3k!-Zrpo&_&5$wS5&kc<t^KC*`MiyUwY9<6+yE<Z10Y$z@HfJ zDkX^8au}ct+Ek*nOb{~pr1$jh^@#1tiVk;tQyZ!^eQ7l-L;;URD$HF#q{C&I_URXw z<}v!%s>Y1B-5nq1R2C_PVaI-ck?%^x5W5xddV=JX>*53I)Q9)8y5Exzs^ID}%Ew0Z zWy*`-7|o}79^JS%v!PEewY{Bc>R;Fp-;#wq6OUrLe(yYisSWI4u8nET{Y~yS%WT-{ zDjlEajSIn}JHkFL6Y{o#-Bb(c$~L<ir}>M0r4Jd-WZMvm3TjV4*8&bMc2r1QkDw7h zV2#Iuszeczl~6u%->AsQnF%cI7CvU|(cNpj^m*Zyq=xKvIh+92vaMUJ)W^Kq*C^B< zA^L_tN#(V_6@9|7CuHS~Ga@kQ(UNO^gZks^R|0k;S1LwVUlN%l%aknNZ7f-?^dB?Z zags*LoL5F-UTdlhe)_%#4`Y-#y1MQ4>98e%mU7G2Jaf@s$qPHqoSHzK-zYno+Gv$# z!<!>`^y;qd33r9-%7B<#HQAE^41|}kU~H^*Td^i=WRN8Nkpy>tR;T?%A8Y}_v^aN| zX4%UDjO`YTX@KnL>wWif8s9E3h*}*Nk?+qda-`uk_k>JBy)c@0=&3Hek~kW^?Ko<& zJ^sOZxVTqc7LFuAic9S12yM3BPC7)-bwbz!Axpzbx)qkIv}P1_7_VhL+i0ZSq>9ie z)pyk7v2Dxe*Jj%lE_cAK(lZV<L_+fSc)CL(Z}1p7x-LT>7^#5{@$or{qw0aJ@j)E~ zbSb8$Y%JBTb|aX(K2jVq{&SUX6WkJu8DvQ=hcbC;lgFRw5e8N667tSo0D~L*1P3j( zFDsU;S*{WV9Y3o-(*uJTVGLJ#J{0Kt7@W6h|69iTk5Kq;H65S1h^{gW*K&$=yfi(I zNIf29>Mj>yMYt39$rJ|cl#sllaT^~w`q`;0$v^RN>r^wM<N^Nus7RSWCr3wxSB)Ht zW4TpCcdnv*^RE<YuZLPsCS3DTR1T+%M2T%mxub&@8mr2}inwVCEjSAZQRf7&y^ySY zu-E7K_-B;ZZH4d6K$GUbyFW~!zT1bn&o{O+<%>-U^4qW8131Y864}ucs*OZ_@6aMr zl0p)<v<9^b<w+6BgI<{^Xg1N$me!|%gRcC|#I5|WIZHK?4Gw1gT7XS4U%1NdoO`o3 zOUsCrkk-vtZE+pMQSumCi14)NJi{EFmyI-?mo|{!D9xUM;y4n8#mbZT#oG(J@R7%2 zAxAOsqU&HhDWzLO5@bTC-lq0SCwf+>ztf$4)-n<CdXCf9o}Jhd7NBUZ0k`IB-$PGE z$OP`wmDmKpN5yp|HKh&qwVg>`9qrAt-Pr26Elwp?C>!<75o7RfDY!8raTU>%M$lBg z`N3Pocq&cCll*c;XqCsae5=7sc|xK26@tiT{{1EjuO^N0)xEyMHP;7N6B=wA@|3wP zhS%@+vVG!KN@a~=R_^btXT2UlQY+5)>^+$(H2aK3v=>bxIk<bvcdZsrJTeGU#5O9? zwst}%T+?BIO8;O!)n;@3wzSu4OYDzw*{+H%Ztc-bd1WKOr?InF(*4%U^zge5cYMo0 zxMNG!dANs5R9;c-myv5*!y{M)5uynzgkd7=ii2U1v;^HKWFd0daKJuSbNc)D?~$b9 z2dzYC;eaCyUBSfOOjNkLK(qePr(|7tzsMq13iov&jV6+a)^e9ud&KSQo0i#`C?#H_ zu(#shR>u|G$}Jc~mq;W>(dJK71NNV{M^`4gT8S@wxVZ^J6ya18N|r&VIX*FaAD^0q zk7%@Iq*bcG%jJR`lub@*vzEa4<+=+5rhI4e)^e*RJoId9H#~%n51inEA{`S}j>-+< zj*FRbg2*b{aW*YOa-!xXvzVhKBBhBb@68Mc$2YkNR@qsIa_6%jJ-Ds-=E1$j_5QF= zpSc)16mM4j^vD=CwZA#r(5CmzP$F;3X)7(j5<juEtUL7GV!xRX64V3IS6DteTfVQD zr)Ot1PvGD3{>hPwOZaye&tgmWJM_qO8M?jw#MZbV{|_d}cugm}5w<JsL#YtJIpWH8 z9(nlZejZDXq^N(v#zK19&+$a$$Qi4Axe}-cw2qUg^_yPw(J7DcO{%Y&*wEEEV#Nee z;ryHV3}t<}CU(6oSj%QEy$W{kY=xwhAs;l%`pCWI=hyR2rX5EIigR8ESsZ#b`lXJg znXcOb51UFThD7x0vD-2=mB%!zi|2Xh^-2nJm)sm}F#2z6FM)>JsmAai&7Wu`{;Myl zY$of+iN^5Q8GxE<YED!;q?;GZ9wSSi=OsC|%c=sv0r{$K<C`ASxdqZP5<30|fU{`6 z{Oz>})M#cpuiYx?gym234;@Zj7WBF*eb|%%xj=z2x4iy_LmBBf%K9y(UVoc4IP7yS z+b7gVeBSdS^j6Y_u1S=hp8L7es({<hEXrHZ;=OWSADDjn&3&NuwLJ#Oy{VmUY_38| ztQk1CoIAgvM498^u9R^<Q#0EW-B|^PHB)^Vq*+{CbW|)`_S7JSdp&?@+Ki5|RgHND z(5@=%5AOi%wmh#(zbUvsOUXI5;$Dd+%Z`%nT~&4&4`#dB$FOmrVB2vubhg!ltB!0w z_2S3R(anL@HI;kYwu29C(#W-u@hurv=WKswDJm^+nm@%Y-7lN|A<qTD!VfmTDY<D0 z;1&H070@@^hmYIjou80Q8{Zf!yFD{(65dv|`H42~X>)<z@!d5TXO~;Weo3-_kxmtq z9gH@vD#OI@P}Ct@`RQTLW>X!}o!(IZi$S_eSRK0txk}VyR;g^Ct0B2YMMq11Dy(mw zBl}z)^?KH>J~Pz7WsY*jwzn?+0oBiD3L^&KbRrOjc`(b*10wECsS_wzDfNX1R&=_I z<r|q4A~!t`?>DW)8O8z@O4zsr|JKu9ZqlpHwQc&rF>?v#)tJnY{-o~r<}Drp<&D19 z<vWcw4GG+|V@GQgr2a9k@U>avGeg)K7Z6dkEvP7CYj-H|C5k*r&OdF&;=jGjROeMn z<glE9cqn1w+!s_7E-Koi6Skv_y=X8_JUs#I{$f$}Jyi`o392ogTSGGiuGlxZ>d2{l zo@ac|MgBC^po0J7vUR8ooeH5Ap1_p|PJfD+xKo$kXG5k-Cr+RnEcaQQ2}mR?j<w{{ z!{XqtlWA>7YYR%3;B>D0)oyg_a};ax^H1NkT(O!=4RZ%5lpy^?w!?m&%d~@PZF|@g zvkyrO7n8s7&?7-|#c1}Mwg$%Vx`Zr~Qql?)oTPQ1KOtso>%yK%GqD<uOLD#*%n;y{ zknByv^}BNuQ<~+VZQZUL!k*>PeVNmF?|UnAa!}QTYpVB7%@zup3W+kmWYuuEgSP2s z%W7Oo=P^?Npl6;S>L}QE<!87AE7~x5jVim)eDFJ2r%6qP$IM+OYR#HWznam7*T&`> z;HGOUZV8;R#I{DXm^S)Xc_JsZ?<mW~ur0ns@P2*4OcEMKz4y|<W&ZXf(c9de@ymtF zUzXAH!Wum326-FYA+f?P7ts|68N~AK6;#HwC`r*0@2L9wZGt1`M9tX?^*hGf4{hd2 zS_v>n;*3W6iq}qj+7xxl{wC!(I%3_=6%%T2K1CJ@^kmsM*RFp-XBO7DHp&{MLrOJX zpg+|u*%Wo?&Z<kN=t`;Ly0dE)^2TUM>}bdgxeAQCC70V!5oN5ddSxBruT><Iv~nG6 zIV~c(kHxoN&u>!;7wA<P)*r57TiY9sQy{BCwk%^+w~IeYDXhV%*^P4srK;kChFyif zs^1*M=t{LLklY^?ubXg17IxXV4brZ`2~qsX-CnaAYSX){W@`C}B^$dqJ`Qh{rjDe+ zN1<G?M*!}C%qIAlu*JIykSn^dJ(kp*B+b)0Mjhz)5QAn*bRo7(hMmi5_PL0AUI#(b zI&cBw02s8$i|U63>N`9ngTCiU-T9$#gU>P_rkKZQrLkU{^~`GH$2;yz)glllsUi#* zdz&0I+i-Xk_&r&qn`9KqUgvGLisUkY3Yje<tE%*es#U)8D9fd={rskAzXQcB)!ows zJ?`##k|I=Rj}LZ#sxJ22?HhVshpVXlrxcF#S&~xz1qG?P3@%pDQL9?CT(fesM-4FY zjPUok!-SAa5#xm1!rV80LwA07mwRr73cq4f@Ep=<@9KJY5d{s>92ld>B0pdM4yD&m zJe$e38Ykg>n`bhSnUlK~<TB=Fa^`D}_gYLx^_-Ht2sLvUQbXN2En(y1+9201l;N;- zcg1#cLtNYtM+Z(oq3@P!=eEyc?d9og?{PA!_r&u_48Q?>RQe2RS#=BIXGal&?Q(`V zBcm0hF>lFSUnbQB%A7Z_98@dNUrIJi5?4!sa(U2Axc0`%h>Phf2~NA2A$%@J7}V`j zEsn6e3U-FofCTdcT+{s=`?aeVI4#K)NaXODNm2-Y(UZgyy&X+U5}T7Fd$4SC)}paZ zkFR$%@s4*0dSTxj0UU3h%=@p1D|2}ecT!*Pugs9NK02@LvwoCVnJa=3*B!InA~2nF z$9UZkTz?9aPcU$*a9*3x@t0bn9f!5@A@pY}%gzJWsWjYe=?2X5?3-}8Lyv61WyEC9 zD9OjsrK%IOS=e=Du5vOSpX9uyc`-eX4oS0867NG^_3IZt$cSVM6xYCjg$K>Rz`|3Z zy!L^QW?M01Ui8$g(p@@rN6;?D2*z3DUVgXheG13mCyfpl?H<5Kf=j!Qnm1l(y{<_C z-;_gp*YRMmD%inK6DSd9SKJ%`N%Hw^w(q5=;^rd^e1iMC^ehBN{U(gv%fVFR>E)t^ zSbV!WP9yKV7%J+}A+0-rM>D>tw)T~i1YtvYZv`@W6IC@SG+rmX20FZs9qYLSY(}lU zHN`kQ><F{V6c{x~G>n{k_vYl!WctI<28f^$I<LAX6ZbR_4cOH{(Mh`r-<9R_6VW%N zX(9VQ&vu{WYOT$@pYID=)g3Wlwv!yf@(d#(<zf8spAd>g7PBisJKiC#7m%kMoZkWc z6F+}Ey{b$z*|M8Pj{%wPK#saxt&u}@64W~5ec&o|8YN-6&zwiybJQ6g$+YcsJgL&V z1Ja_~(Bj`oQ4j_}H6?joevoZT|3bOb+SL{thJwmIdh{)YrrF22Qc>cNk*fYM{YjVi zAui2qUh2{Oj@ZV;<-Vzx{bMd9d=_py^(E5dHgU=B??eaDHz8sv=Lu8Xa@2)uUx>mu z%IklSM}%IZ4&E8I_qs{vx&Cep#BGySn*cfZk*rydjAt$KU74QiogeinXVqPBoM11@ z@O1ato-~h<N#CZhNfda$WdzzZ6m;>|0R@FKo7p3(bckNZwN8cWWpHfup7G<N=N(p= zPT4yX(n-$?4nC0^!~2KtcFTcyGP7+~5uTVV(<yU)r2c51>I7M=2YD~M0)3qxs~9cG zovsP5*}S4_utR85+3KURVuznhHCZ|gz^Mb~hPy#jImOMf<>xTWb&;hr(dahMi+YCr z$BrT-pa>wz;agbuEtuH#;%x%cM8p0*k~5<%^;Ud+u+@nQ;~5fxa=;EgIztt4_#?O| zquW4)%^F!U$A<wcA733a^YC0Z48GRd!M<=J-<wH`OzVcSut^kav-(R=6T(;T{V}u` zL0^2uE2Ktx&*MGDu*U@+x0Mpql7Y}Is!=LgRfDEb7`|V?%XSgdePx5}62W*6Rq$XY zL+8Xp_}uem32;kwbaXaz_7r-G&B|q^XZCL#_sXOS!U6ythoIvOOT5rBquDXqB-Mp& zuh0Odq+4FsI})q4uARraY}UO?)TSbxPg(0_-h=zm=qt-YMk+TPyM@-cwL_a{q{*W3 zshnzJ`?YpO>B>6utyD2(2|j%#(Yu?o=hrq|N3cRa4~1q9Z{7DssO41~jqb{2%NL{| zi|pu-Vt+o5<Qef*25Ku(!%B}tQC_FqgHqvU+jc%?>cn7%IRdJP&_UzV=$1~sV{(6o zgUl+8Phe=1eAf9tYEE(Rc7*+Uz5;xgs_U|1hwG|ac1A|VNp;q;VQbe#L1rF3Z|E#L zQDS?|M#?pBOlG-v4y*{-WJ!IiWk6iDw6tsnY2*{#AdtU}N|mq<qIQos?p>)TfK^{% zi)9EjaQVc5(z2$24wnTsgLb#{9nJcIZSC-%7hj*NC?IL|K0ds%IK~KJlqQi(9-mTR zewi`2zq)wrOFO3oaxmMkBUfZAgw0h|kJiTfl_fe0j2B5lN4yD0>Wo05iyF4n1;5Dz zbAWvD-q%T&>fo;5RjogM`W7%*Wuy2J`T+%$eSNIgbwjqRx6B(QsQByiWz~$TSNzX+ zMG+E?B`(*sF<n2bBYF(YuHo*E4kBm&$_N0Q?j`pL?K|Bsd*wWoS>@x7I8dXI4I4Cp zDO`iPqPL)Gf}<+_*br*tcfrfL8ajrH!9ds)YN?J4+_ozapa(L=UI6Kvf26;z`OMaM zbx($tmZc-^n5k-fm6XwHwlDpA`UE=hqQrr{(9y05Ae_m{%4)0VEW#MvMpZ@TW_b3# zqIe8iLT9UghQ*u&h9U;Qwu%6VxZflIqg%di0d70<H8rX?14lpa;;+q~#6kgdluxD# z(?ff`kK9Fijm?{a6Ws*fzD9^Zx(whWh#X(`a8ju1Txa51Ijvc}r2WgikWfDNrp1Zk z7x_E2UZBt2aaN-<nMpCxkahp)E#Ki*zp7d$e<{H8lAp1uh2P-m5-Xp6NYNUf<+1F* z#A{SxNj?I2B)(D=!)NEHG87Z_nnm2P4I8hQGYnuzuT<te{FfEnB<)B0%Z@rA6|Hly zeLQoBk=RPPzcL?fXA(kg_rz$@gu>9iKFNJ<an8&2J+<2u&fL6QWdAWP?k%Gq8wt=n zb<CPi6>n|E(~z<^Zm2q(k#Gqe7J#SQhe3PP-5aJ3oJ@A63s#X?odqB375)JV{}0@1 zhB3_#p_dwT_0w>?F=)rl_SwwlW`VAj#AJ3h2e!WBYoB$I+i}Mu7Fn+?JA}Tz7WeRM zsl(HZ)AN0aA4-;yC%B(eOc51MijQY}iar*0tybH*3sbTf@uFvdO~c4b7h77>pZq8g zwP;kh!RswE#Zh$BGI3a~|D;IDP|?-hDAUBU&5xP7w4-Hh5%=efh;2=V@*<O^Xd)$i z6<8t0BT+<n?o*N(?z0KWaIqJ=#Wz(Oyv1NkqN}xLMX)g!0~P=$mlLNnBIc-`gv1=* z18m%p1UDLv=BV5qMiur}v2>m=y9Rj0f=RCnF-Vy#EhWWeVee<|<3N5YR<#-VfN*F- z)65207=?Y~YICW8bbQro1!jZUKZtYbr7(BmfA3>`22f>)UiaS)GZ`(vanEuKJu&wW zAY`{v3_Er`Ufe6zE>VCU+i>i~JYGAwxLW0B<aHH>nF!HvP|54IB-a%g@y!<q$-)-a zmA>7oFAF3SCefTm{mn^zhq^WCZrIpo-na$wk`Hb9p9&r}W=2&-W{Bwkzhc~M9v|La z?zL`+909AvSd=ei7S(MghzeNd(|jcRoN~{-4y!v(qjK%zcn9!McreZuRTaA9y_M-F zSnK#uu8GLJ$0I6}mN1*yT20Qe%G&kWxZotV^oh`u^cZ{Ldf*E<7V=_*YICT#cA}{y ztA$SB>8RH2r=yG9OrX019~u%5Pob<t^mygBiNqR9R?38n&pENF-kdl}I=6#HuKB!= z@X#}J0$;mYy*P(V=EgUt-v)tgr<tPJJdZ45d!HOk3>vmcS+*L=zx#BTc`RrEGl@{9 z<gdHaZQ`7b@yZx9ONH*R0<UQ7xWx-D6G%cgy#<0J4<oC5ZuVg*Hy<W&qjtm|K3nZp zQsSYyUfF^-zm^!ZMtY#PA=ZFpaN}71Gg-%G`Dz9L#!kwbd_%sPs%8}|)7hfh9x(9Z z8YL&q?*cjcO9Fm93}g|5?e@Yh<_NWW_wM}|a{ma)&@erAvnesP3$HtJ3y1t1>b!TD zTyt+@`vxeJW-`JMYUQzZcG=w$;J0Lo*(q8;QWV8JV+`u}5Qjio0Un>_Fu(zqlzRZW zIL>S<F;n{_iEj0rVfKxUB8zq4R)_$dlJ1Fu9sIjne~&W94o_;>ba)QE!me+G)bW}X zA|FwJsxcU-=t5UJ9pC;^;W!D>$+LN94u=4uhoe~FrVAh<^yHD!=MvqDPhD>5_@?lu z>TAJ4no_QR#|O9gonrYEvNdFbDY&_G3slBk_E%wRvm^80gkz)t{ns;byGr@)6ay~} zLikhGd3tnsm1-tQ&4`z9L!&4c9PVyioBUA&f9P%q^$nr|8JGaC?+C~YRGtU;q_UF+ z!H&4<gkEzWZFw26!ylwcTE#4B!O)-*Kpb|z1~Y-Pb9HqLpgm<T3d*f3OjanJ6O#`7 z@v4>^C+rgok2hL~YcjWKY8R9$gY1iIa|E0r(8P=N#x>%)-UsK?6`#~ZBfHm_SccQh z=;p<HutoP@Z7Qv+(x8c3J#d36%Wm{D2gB`L5(QYyki)*#qN_Y89=D=o$4%Ky0H2QZ z3!&=_1FI}^#UA7K{Y>#u8jxouVKIapc9vT7zd$|+6W?dKA;z{j>@l7b<}_c=mUpxd z>YsLRfj-?)IQ0dWN6@v=?wk`SDMq8nrMuv~2dQNy5-=f&AYDS>P)sMezRzk+Ho%?2 zc4%OE>?hS(x(1Lkr)o{C_qRGNo9m;<`Tgx>MVDzB4e3drHIhlQlqws0ou(g@l!(Rn zcgn&sApti2MhWM1M}y!cY>`$z6L%H?zXrF>S~aH|W&BAbyluw<4sA7BCh(%uD4s;e ziXSMqo;%!0%&j~OSioj$c8-NF?|;LCz!J|CDJd55YdChAS$Rikei+1*DwTYxtF`+a z5HJhJi1$34G<y>!UxWl~2+3Y;QQz8b22!tZK#zOns%S)9AOh~Vr5-*8{rNFyC#gxg zM&BxEgieomId?LX!gcn*LGb~dIl5C0)9>)&84)jK@e|d1rKb0*Jk-5IUwz#%xJFM8 z>u{$2T}9~onf9_haWj+hjh_UjB9OZN+zZu3>Jb{VoE=B8E=I?i3sc7#wqzvVWAB6; z73!93Drp5GV{kOZXYb^?nQj{hZApln@GgW>2?%{iH0OSV`%+i&E*~G?sBH<(NPL;$ zy$|gw_55&!g@rHYy8)pCkK&~zjd($eAiIXb;q`bfjKK7_aK+YMr9e8vmc_|J=sZ54 z_qp2(=zWrEH`_ZhP2XN&dR+0~1c^c!Zn;?bvToVEGAH5Vvn#o6ofXQLc2d8ZQJyO~ zQlkdN>_R5Ij0i4z4jUlwN%oT6AI+$Y=^ChKze@GyI@|}N36MV4E_ww|yiSnPRgZd5 z9o%-8$viupDU}Zz=DE?Vwe!Tx7B{i>$_38R*MQ__`sGhk5YD$}zqru22!;YV7{=LR z#Ltc+mDuTNea7xGy{Q(~YSy&L{_v25drAEy6v5Xy%(p>^s|xik4xqzFU%Yrx+sM<+ zW!6g-F&Hrl{u!Fj-K0@8`;)Da6Q@7zd<wLZ+WqTvY1c~<lnDw>h{%JK^73m~r}9qQ ztwCqD_ngMtGkVW{^6;@}Ed-cXm&^ORCYpsCR-g3)=G^gt3t0DE)V010^4M`(L+j0J z@`~D7kn(OLQx4k-Rir}xO$*odsdTZQE-mwWt;J3H_^937dLcCBE9YK+(dPI&Px=E~ z<b>?n-V202<49KDhCjaD{+E)`uKJ4xVXj5jW(>ub^Lb`6$dv6rC0oV}Pi-yL#f`~* z=>3+1$Qj|&5}AJCwRQ}gG9wBS$|Tkk<g>~KqE(j~LwOYrs(I?c!<?7>lyQ}uW$;{Q zhJ4)P>N5KIqph;;OuNZevnb7XH2VupO4o;>D<L<^X5-CdV2S=XBO;1Vc0o)hk{ac~ z9R~n$fGq2_Z4V(wVVD>B;09i=rM2_fStx~Uh8;d|GLRA7t0uY>Sf`l8)}u?Jo86Tx zB51_1&iAIY)C=oclhI4wMSHlnu@DhBmP%UbzRn|dy%a;>&!;a20;AQqTjk*ogB$p7 z9updnjn9#^F73Z0YP&aakR9bc@{@~<a>B0RM_27(3l*FAd=kOE-48gf6#ps!N*Z62 zHk)J)|LSe2Q64bQt$X{n;o%^j)v|o39Ai4)Q>wG~C1Vr+XlDTRWnamAm?NwlDto@p zs66d#e{S0yc@cG++|<U6%OQ|%@?C+4&)bZG@hg)`fSN!~tAM_OOK?Ymwz(@+JO!YX zFoFk0*CklH{mj!^^x!H~$cR4R0NZ|1LT!qQk9LV&ju`Zf3G1XX4&lGHR(W)|wxf|c zK<fVjVHmf(jWn5q-$UjK=Pk2q=0_*mji_V}R`%8iY~}eqBe@36hV5@fc5vIRSW{vT zc5^hKa1^|Qa^M7Kie{&9Ux9$C7tH&q(y%p<Z`(WjJSw}6#iXVFk~O810d4}wxH(~3 zZqw%_Te#(G6~V^6(>Wi&WZ>YVvnt#(V49Q_Q3Y>cGcBnZCM`5SE3pt)+6%WWS*oCz ziJDJAbAv?_xE|aK(OQz4YaJa$=9Oxg%AG}$*k70`iHG@{y2Bk<?R%>}`<&Mg&>l1% z5d``o&MOJ*EJ=AyJ^~AeM_;OYSFx+<;o@MD4YUWLkNa}purf-saR{N;!+JesY~=2e zdzNDIf@UM<f;-v@GoP9_^DWWVDbXTE)2o2;!I9IT(LJX*YfPEkB$*mhxB$*zsV(;4 zTDj#ejg3fcOgP_5?{OE-nT7PF_D5<l*Z_>gl>)<+WFWy5+1=6e3gp(wyr#&R(r=Dq z4lQy@N|m0V^i`>~9~(~%;?5RiaRJwI#$hN8+S-(Hz3BC#$a_o)37e69qr2mT`@EpZ zWTj1_+PDU8hHIZ?7pP!-p@mMGbb<Jk++0F;OK9;*`n)9Su^Xw=5$DBBu8eSF!$?8q z&=d;N{^Lt^quNE?QWci*%a!f$7fXk6dz*erpq}XHLOp87)mD!LN5H}{m)bBpEZ-15 zdLs}6&p{l4Y@m?W#_!3$r-K%Eq7^xO9g>!dDden_>woLw`Qm=X)bQtv$%&gMWm?rr zA-^ZU8&6(4r^ruk%2Rfa(e%g&>nfJiBDN+^Zo0i`W~~$xV|P^ac$|n(Kv-5zb4#ld zNo8nU2hvLk*~+Pm-QogFOC5+$>79D|CSP9QdSYz=e0_f3d=WDl?%6bqSePU)DBT5g ztMvxZTl9I%`X!sni(u9o7277stzwWc6tNim<ZhhzxV*i%viI-RZmxWmgSs$uD1OoV zpv+7LZ9f$ZwCTz5L78HT$G(m`$f=<|+@068aQaoYo~vM)Z49PN<moyL5VTl}h#)?H z(0n)$VQtT5{zf(LrzPJws9b>=d<92I^C+*_TscFkjQKTbC;7ldPz%uQ)8wT96LanR zIzQVZP5KTL+I`Ngv#63uwAy}56?uLYVVOZ1|0$w57|SjUg6(+XHqu>xhei`r?dw(A z>V^hA@_P-&x%JuQa*p}3xX!GsthU1{NZ=R1ps5x<lo4wq%Y`{>MMDL4S4eKoV}#37 zHGB@Avw7^i84X{piket!qV;*ed)<;5UW9}!SZXELXlmI^cF}2aFTnHt`n?ZVH(xbZ z^!taYthHd*U^3<H_D>b|4X^Vqyb~?h5))f*#Cj^>(*(cvgKn+dX74mJ%a_f2N$PV; z^)27^i1E_r!6)qjHLE3I2)6zm^ka6mDhns8fh@cF?XU~92LO?g!EiZ-=5kP5op`#L z@`%TuMK!6$3#Ggd^*I*GK{Lg-nL<(A#R<gK3$07;ef>N$(=xByL5t4S?Q+Tmc+UX_ zl(r@vPNWj;oH@MmsA?55=Z@MII|==i-XLgOsDGpWzn}c-@b;Ow--XBK$04a`*=)GP zd5f~T#O(wtf0Y#;TJF(G2Y6}u`mWSNQSP(9BNk}5B#ZmzLb2xA3yJNP$->)RJoF`) zy8L9i#i3a%Q<PQ*<mfY==*Oj8mkiHjIGSPy6yPo~_R%kz0nPy<pTkh1%?uE$4bDcZ zDLI}M38wJ5tt-`i5_j76N94a254fr4mE@WJh@xW~Q4t-?ZSg})zYdfOo-it*GNjUb z({D|)!#cY_8A-F~kaq@1bE1tBqs(Hyg5iv<fE6eyVimZHUM+ws@=Co%$DHH$yE3z* zW&#HQ&A4%}{={hb31-}e)~P__pe~9a?X{>d2g0lwR42_Aj|K{VXrAy|ea9&8?R>F6 zO*5R<ASrTi!kaf_@1S}^CEx|+7psvUx;0CmI>y^ec7{QS2|(FoMD_<gJ3;vXb<kN< z>AX1B>lIyxY7#*>FeMTvfolA@@fD6#`vV8Z4o-pg#q87stI4q%^w_23@kK9d_&C4k zuG&2eV5a}1rn50C#53jsOG9jczBv2)pQr?EBXQa3SX{zI?^6oYf5lV7L@~t)R468c zDuYCTXCNl+gNsyiUq9xXsROfH+rlNdT-fX_=|`13NK-xg-YStRk_cG2C>G3^GZ*Z- z4aUR)S}LvmFO9AZT@@Y~1g&Nbya*C}56tqRcRG=Cir0>gYQFYe2m+Kp#0R}Yjk_3} zdp&oJQ+Gw(VLMEAEtIEQ(4f{8#ek8x)8jq{M}4J=s6e`Ii<h-n(W^E^Hb&GL#(~0` zR_-}C;J+e7j>VG#6xn=gSi~Zx8)2wN-*1>S%`?RBQDo@Q{M@mlQ(&%EYa2b^#w^p` zG3VVc8;}c9)!n(DmaNwg(1#fLq$7zVw-07krYd<+l~%|{psU8a(92a?PVQ6P{?b8? z$-tAPn)xIfL#t)|HCd=<-JD+4(d}+=5nb`!b(6{Y5JN1wTSRNL5^huVEe+xP<z-vx zRA`mw;j+tug?JudO8ubkrZVHit@~LcU>Y!Nz0oz;%}OkcV=pqlRZs{UnJ$h=N*^(o zh~ujn9p}T$#;cY*!-t5Cewp+sdIuu2YD_>?X#M2&{sPp)jQQ|}(12&559W}xUV5-D zYR^%U2z}#OQ^D;NPX#4@Bd)jn7Uau-sio!My8-Kd1Lro+Tsdg^z>Lex)dRvloUW&h zm|Bz-YSiVP)eiN1FsEx`vQ_ik>bP)X>LhgjxW1$)K<G~r;-6E<PipX;X|M&+>>Bz^ z&UxH?Y%w81XTFr&wHUrE4f-B0T<1T9Bt)D!n@~gaN?}Ah+u!;{)_cCi;&4DFfG{}} zXy}+r)j|%!9SuvsfN@Vp6x?w|c;O3itK}r+3_F;0%C(<mF4ZzpmL&&>GQ3b*is{qI zBvb-&BxJ>dQ%`Ow?rVF{Og`cf_ma^1q^-g`a4mm79`U|nX%47nlF28{f*<NHLx&7G zdB4`QiTcBw7gbd&<TR@8<=7NSagi9zQSA0ziXng=8<st4Pw-869fz50NJ23oL_x7t z9&9Ot{GnDNdg;C8P|mbx>+BN!H-ZA+YFCtQuYHOkl9KP!Jn{B7L0;QLlkxP9xcQ4w zmV86OT*8x(RdWqfzO<|l5_&{}w{JJqxLWELCQS<UA8_n8sXL7AbW5C+u?VdckBU66 ze%kb?_jt=Cn!BN4#)Wi`Af-EqfO6ZrZv*uG@T3m)Le^HiuB|jr(1G;BT-mf_3-fRm z{qnx}Af`(fEiQj=tsl$<PQVtZ)&~McnKp+4P0nL`V_n?@v`*TZ8NADbTL!xl?4pW2 zGBlYWrL-)3?%&r4WgIHm7)vp!uP*!M$(3)^FrkmpRgrFlIf=t3<G2i%bVhWt)^NX@ zJ=#v*uN$!1YoTLL>MjDExQTZb8ktt=(%YTAP5Pf43@Yjgc9wrB)wJMR$XI(jn0I^) z{*93ON!#8Shn_1Y@7uE15$OAnd-SN*$%xjmwNd1GBx2Xd+dV~e!*r(OX5-RK<IgQx z!)=6RuW^lGV!(H-IJjPiLtOqeq9$hOIqAzzoUA;-W!qX^nT4N@O!>Vu3AmL{@c;;) zRJ8f2Y0sa1Zl~>0Fw<MHx4uYBlR<QODO|tVeB<5f7)3T;Drc0B=1k$28UgJUpU2O0 zUFY5b7sMp&F7V|GsB^=MkI>y3AH!{x6cuCUTg2IA5<Vrl_FYm63>$xtH!&jH^sbl9 zbM)~0v7TSu+0tWFtLxE<ZpFq!H5JeTp)uDGqx8J@A6~m_*3Cwc(4SVPa}h{*m8-`5 ze(IwH$0rTbwMCzXlbClRt7~&_K9wCb^tBVcx7-zBZ9BeE)Hp>K%ki#T{P2D`an|d+ z_)C&$>v&m8$z16zAx=u`>r;fuY#py4m0wWqy+4YQ?LE`wDZh#Ke)b~`E-*gqTcMc! zj7$1vB=+wFQ>Pj}PYO1_su}Bf#F{_e0d4L|f|Y|Kgl*5a^MnRX;|eC2c*G4E(G*1v zN+T!jwO?0E?x)d%mcH{JA5fh-nIk<v8gkQ4LE-W>M#}4BT1_Q8s`*Ezxf%KQGz2jp zbH}6zA8!-LpdQ{16CVI&nQ@%hX3=}~YK3Hr>D}Q%bLM-4qLhaqENH7RYI;klYAUDT z2ig+{Eki*@xr{7i+ma5ta(C|X9CN}_#BpoOT**u#zs=67>z6!G!SZ%rr{Lzu)25VY z1V!DV2vfD=?zBsiT+K4V&i+%VrSF*1{&n<=PFK<Waa%JmCwb%Y?h%%;uST9Un};M_ zIZ>EZi+puADR&)uL*k|m)B9uRrN3876h_sfyP)^%dv15R*1wDl4kY>Qocw-*N=izX zLX`I#a~Y_XonM-mv=xiR0tPDWd)6|)<I1T9iXP%pCGwFrwQuj;wYO9nDFF%*U1mZD zMpAQkPN>UPvZ#kutZsnLgwz09%3C04EJTS<)`*84)tIF^(#ogUnNS`upMA(mpXUqa zP1K6+43mjGzmflvT2x!2$;j>LM+LbQ$}x?!ZLpJakHUjQiQ$rjJ?8*N0C{U`YXqo4 zJRz&wy}wp+KXcFZJw3@>{pP0&bVt!5l!pg`pzSZCl<3HIr1W8V0`^DqWHolJp(quw z34DNc{aH;t$a1S1Z)|qn^XaABTMs0OjC{xVT>e@dI!xrrsJ=cjmj%Y$@}*|S8}wd5 zkNIZEe+%AK8ysfBMA7HYg4VRt$uZAqx%)t^Z)+AgN()X_Wc&9^VeRW>XuU;qEnmiF zTLtFe?fJ!!jf<@>%*;BjqOUK5wDOF|4>jciX2{MG7oXKoYZWKSk%-^NYY`f4;R-Rs zfpoM>o>Ditbx7<nE4>dvfnb~#4`ebZ#s{#T!fzLShjvo5I#GSqHt(5IxN*>PMpjNP zsMo*q9DQ-w+2CuOv4)VHZ5r1@7tRdnz{+|X=+E|i9jBSacipohzp@g#RrRcsuDrji z2ma^N4#CO7n>3z<{FW8$CtuDhRB|bzqcbK>52Q;`$n8sBGXnh={R%n|t)oS;Yr_$e z@*2tow`Z5t<<l;sj-LFWiKw{Umo`Nz!SQakfh#UGmMbcTT}!UUarOajAmQLA);N8~ z63`d@(xyw)51#;3*_U5QPv)wd615mucm}IQbb*Qrj$`a(RjKEm-6rTfoe7uF6fAm( ziv(=!ab;bi(p|#KAqK<+mQVEA1-<PiaH)puBDSgcTM5ucs;YNS;3;rrk_#1Y`hn(Q zi6rN~w;#hL&F-J^+a=~WbdUe;W8-J~;(5CtAvL{OJpF!23pLGT)IlJ;KzBQiLwh~T zvvi$D2flB|yl#}Ga04{vCOCqwPg(RF;xQ*09ZU2(Soj}LENmz3!|gFME~iB2xnECo zuF3bN>I#4B%5pnoKb~oS@aFP(CL*>(NTWQ#dUTW%=ImKV%4SgEuf|tt+I(+gbzfqw z2($<v@0~X}^S9Gjkv>cLom(@1SbQtUJ@@wsoqj4VA_C=1h(f_4ia)-~*zU?7di;{_ zYZ^O^$ksjbhQ6IFM2SpGt^0`O$Zk_=WSN*%cnTsVU;FJ3)y3+7%pdOtQCYVHnCbOq zxLCP?PX5M+|M!#MEoRVa-D;p}c<B%4OY-v7bBc1b<XvrT4u-lXvHJ<*i|S?1+zoeG zq4<%~#cYkzz4^f_U18PD+4IBjmqCoOC%V(uTftz_@X;U?3^-W9`ih-i;GdB&MqCG* zPWDsy4)LjP+`Mv5F`l14DaL~B<Ld{bRVa(IrMXv#<H@r`@p)Nbvk1P;?lr6D*r6}E zwWrunDsIt*R1D*p7U2CkJa=m8kJW*;y!Ci~{WNRet-q6}sAYu_nLU3l|3Wj?d2v9m zudk1h`XX86_*)o*&A6tlPKAo<@kAZ+DJXf0%{5eM9}<?7(_(EPOJ|`}Bx=1Dy4;%g zKXvoei~sf)X)Gt?2JKpLh~ITQPt@`5x2Zh}Y!Z6fMl}C8&=sCT4@=bIXXlgd6R?g7 z>0~WEOyzBpYl~RfQfQk<VVqt`db}oklZZn83ag<)JB>D&wrHd)r^&&d`Q35j9wWpF z4~m%vP5rCOEen6zeE0h+hbcfl?w_d!s?NU$Q(%i<Hs{hKbETEp`p<cN{|6U9>$Oet z3Y;g<gr8yg78LPRILm7DQ*3U(HRoSF5wQZ!mz&(@15VKweZJh<_Vy|d36MCOA0@YH zKX}1bBU4gvRBjRvpUDx!$I)TG9Ir=rw$z*A6xq%H+SOmzAH4%u2~$^vF~cd*`w9dq znV$<}$!Av(U{aB;Zhob8cz`d7?`Yw<R^7L)WBZ`03idy%s!sj?KNj;Av?KC66yo1L z#os`mASp;4+cU#T8POS?kr4rQOA+Wwa;2=SY;V|8r0vNfP_KRSW8Qo(AjQ#XIB)f5 zKYjYoA_PygVqW*ol~Y>bf0i=L<!mXC&htPz-|EEd*udmHJUogymmRJa<2*q!{x|lC zQJL1nzw~Askr`P;Xy(-x6#p4Z7z4c(<1MFUY006rFaIaG8bcUxN50lv3&Hzscl^?P zHNyv40dIwZpooY}WaNE7As{eP$@vh}w_LOC_DI6BJ~QAdBRM4ZU~VYTH-GXK->Iel z=}|wXKG9((&g(>fn5{Esd+|;><V0PPh+1C+zmIXXfysif<mLSj=BSZtgg8`ZDh$A2 z?<?<Wwr|oeL!SPhq=i>xfP?=-|NJBW-%zL|2dGY(DS1jX{|0cc4wPhPWMy3en?)Y@ zYqM_s7dGpp10sk-@g5)*T;Y%<W{mf>CIzm#jgn+6Td7p(Zaxx-ROnw8sb@qlvlM73 zy4u?#lah+{r1&*WD%a{y)FS1ts|8CMxv2}W;(K1<{K02ULPC8zVTB+evtz6`^pnLH zH?30sY^mn0dsX6K4h&cRZ_188l<l-e_)7i&Y*>m(R*jEO3Bwzvw3{P9^STqQt%ubk zI^Tiw24UZ$@=ELAsFP)^{`F<V`ho;rxpm;qIG}acDF4WzHhu0yp_Bje?)#tBy~EGS zDtlkeh?=hJ`}eDNHB6D<q&;+N1v8%$wGnjwD76Lq#PiqpiSbf`FzS^(xY5WWY><_C zrlzJ}EjxAuf2}0wFR$byk>IOm+3*~k5o@AE;!+wB=eX!-b+*<={XzZwK<CDP>708{ zOGDiMsn(Lfg6~4@{z>P2$y?jn-eqJk5GkhI<Knpa?mH^JZ*`Km^h3nRXLXjdjb~UI z?(D?}h#$fKPf<E^_U-M@lhFTdUq9sbm-}1Cwza;_K+z;Kiirgfmr7*{782s79ekN- zsSvN;HPHSSgfxFxE5EOor`8hw*)EmfB@vg7WF=V-A0SGkNdf&|=wK|$;Zkt}%Shol z|6f<o)Q^A9AT?P1^Zka0|7E)P<^3${l>v*NO~@*<AXa*I6w;NC+_XQJo@yZIXYJv` zHdon811IK{kmBFFf({IL{`sn7nIbUFR`9x+6qC$3qBGK$>7)#dc(X;`qE6QC`C+4I z>ux-$f(NFyUiKUR)^+-MlJB3-;g?Z@-b|_ylm9Yz3`&6%fd`h<S6Xt>7`sYz@(%95 z{0^XcQbW17^1w)U$1jn|QJgeLNZi1{K<h=e)?aGpqf(lD8SmFc(b)X&U3xwUh5u!q zrtnOem2b=gny<3b4EgL7B}sl=lgeh9&qp6kp|{Ujp4_Sd!T;W6cT^ZJi12@R$~<1W zYX7Aq>#;S9dyr;C=Vf$wxgA2IufIRQMkhSo_rG)Ev6ALX<wQ&zRI&N_3Koc1Uu%vW zH=8OTwnzU3vE?OOR)06>YYliM%*jVCqF}O?mX?2WXuun|i2kZ#oH%~KUgS>?7hCkM zhH-)Y2S}eLv~n%$*ZxTVWsQiHTxeb-JJC70)(57@O4Jgbsq}{@`8(E=ia6NdNYrck zoL`O~*T3hy?!sRDlj)OuLN6ksSN_D>d})B<3jj$YW8yhMek!88+?gn_>HcH>$JbI_ zPF@xImtV!<_hd7AzKQ8F`v|zOKNvvRTE9gG^}C+@de~q8bsPYTZk9wQ$1s8`0$}qT zxq`n$Y4yJ#N{$MR+R31!yX7SxJ=Mke$5_{Kz<YUnICfi*_{3<${bi$ZVwmc8?+ZFX zV_!1L2$wHEWoyl9{@XPQUZC}tU+|I0e0CV%4L`q}h!cyff@CEORK5$_L`8ll$g2Kj zUt9k2TTbGLP(0J@P!LAEkPRD2!#UwY`<qt=%$~uOzijq^w-GI>Symbum3*6K6vPqu z<VC0*3PvQI)RSM4oc_VT<?yXTI{!3|Xaml@nVBq0Gy@6=iHf#i1$n&^W9ZON24k>* z@&AI|{^eGJa~RRli8Rp!N6iIz27wU_8cMPGZ(Z6awn>4O=HmQIMxfuqkR`_4Ts%{g zr_ClXV7hl6{$<m|GNm5Q_lpcRl*lZexKx)<6Soxbl{&@d-lAd%?mqDeb{_rZ*TjOn zdHb-v=8ITUKoE@Rf(VnFn()2AuKto&<^O`b>Pl&5_v{jN$7e=>lb3JV5i`Z^pc*Ul zTU1UiQW(QuzDN}TsD9Ew)ig2!&=)Jo%52~vKd|bk6#V6IK>qR~fbC#Xq9g-&+OLk5 z0X2XSFkU5Yw(Q;+zk1>X+Wr?zATL>BbTq?<nKqNA_;?*9$x5}B6o8|wa*#!mL^hj^ z|96}Yd3q4WTMM!S@>0d%FceH41YCcEQ%*dNzb>|agHtlvx&zDj=&dwsomUxIS##AR zLbJ%TZBDER&0n`7l1fTpAe@sm|MInW`Uwkz?!(Ha1`w_$=i1|~aLZLf{L_AgrhmoZ zKe>y5DoD%Tw3sYR%*Zx-BE=u8NnMHjkM4@|uAF^U){&e(M>mfT;Bu-%MKR@_RL`-M z1(ES7OhQ?2;*^?$DB^x(%E`ZVoXvD@#?7#v{Z#6+t*bhnCY`DNN)BJ-a>41?`PQX` z_o7Vsv!;q{n!+wC!20B>B$Tikp8d}(^)TXDKV3t6ZEAhocEbS+>+;Z7TWw#l=XvT; z?K0H2HNwOV*=Ri6aKh3~<296lB=Rg*BTr)Zz$&|LXJBiAU+{F28hiwl_W%17j;!9r zq;UCg>9Y8Ep_^?3pB;*=Y4;afcSb441t{6jH_OM4mIN^V5v<|hojq$S$?v`i?3Zih zjOqMi1Q(>e(uP$@O|ko4v(Ya<o$3GAyxgd{rn6|ViDh1Er%Uyw7t)D`&YUGj+DQn_ zd`D;Q2$2xAuU>Xg`U6s0fuH?gswTzH(|<rZSp2x<q8J0}cx9Z>^Xfw^;rhI}KkuT( z{pih)s#l{w(yQX(=c-=CSMgX-e1LQLGTzmQ3AF_SVbu(x9AliTtU>e!Pb{xIu7RZJ zn8lB;7@XB_WjvTWb|2vvfnmpCZrD__)VFUUMogpD822#od4!BEvFGqKu6$G9``o<b z&v;Jq%-Ku6XYlCH;QXt{&pvoPMY7I6kTzQ_h-DTzyf&tXvWe4D9vPN4Z0hxns?@YC zFMt2Sx(QAfJ$qT}>&|$lEZd;VH%vub7Nn-9r@s-HMkq!jvuUH%fBye}!s@(tXP%jI z|MYgpLaK?(;g8p*q#Sb1mI7(t-8Zq#ds7UjmT(|F)o^BH(H3IO@$jLH+Psq3LtpE@ zy75^$hPOV~mZW59i2TyzzPx9ntJXFs#`~8`|GhW6;hzsji`*U8xP+@6KOB#pb78uL zqy4s4F~@i$$dV-M)E;6=d@qENH(WM&T9*BGcUb!e2x=!oZ{4;VYvFk7v-qFBeYnWo z?a)!U-YV~S3@?y}C`UUcXz<foF@D~ug|EusAXbEK1>_?YdwcI5<F`JV2)~F~Nf-=> z6sA8b74!10hPZu6tufL6b?9K_>vVqD0wbs6$UA`6i}1Jx$FPgRt}Q#q^rrxP;4{;2 zaq)}h`h2(KUNDDQL}=LCn~?lOf8p)4_4PN=-Y8iQFR<Wby#L_cxkl)De4fRF#>1n4 zR9~JpgO68ZY=?w#_*C$Je?2|p`D%aZ>}nGelUY7j5QGr`V*eO6MkA+4!$glKs?2_p zPZ*yn#E|Oeb7}kkmePMI@&__g-iwH_25r+Yu?W$7Eu#`NtqfKajraagk?LbS{jzxl zh|I%>Q5_ElK6pVc(^GNHHJ_FHcrJ&KaZvC-SnCHP^!om+vnN9HSgIl5ABXEh2z^Fz zYM*B~E|HN*C$S8X3qun`n1o+{Y(5r-tjfN-{BFh-c9|jZF+@v@C3o)fxlarsxto5$ zgZT2N1oK}#`W~Ol*z)d-f<pQlV}cI|54gHAzOpOk0?CH-o^^fod)FQpo-K^%VYPK6 zYYs{q4x@>X;xDnw0NdOmMV}LSC##*1OOt{_>bKhbOY3rUJ0cRxSCk_55XKz7NoP%$ zB>O7Ni^VDBK-`>2@zj4~V8+pUJgk0$o{EM{F<E#=l3?UPJ@iD02>!oSSW<2kF-9ip zcXWu(IX1>lDU=dk%PcJr-b-WT#rbUnBB=460dcaZ^_PA?p!4p&=8FiMUkc0+h*qwg z&!LSTz^A{YE_+>V7MCLLeC#Rx`<IW$mmlXICNR6&rAsfz?va+0c4zF$ljJ_xV-vT& ztaxh2c459&J7YIi7jjq}gYS%l(bTFvc<{0z)u~imVmmE^>+FB9>J>ytSV$Vm<n<+G zwP&)4;<#c6FZxW`RB=W_+QL(&;4{<IHK~%qo??sDg$46lalyha3y%;*fgP5)s+px4 zEg!k@1_B~2&;LiCAX;m|M}w^I^@$*xRyfO!NV_$-%y7TM{K{`-{+x;@D5yyQu8z4g zBiFA450rR8f<i*Jve60-^B=*szq<MVzwH)>2}yje%Q;e4sc2>;THo3;<@RS~vcbjg zUmJN){4nYdt@uobuYdEYnvi<zvu7rk>7k^n5kRs7@Bc%xU$=a0?pSQ0^NBr=8m-9s zg7Yfhm^N0NS~SFVqE7Z<km!B8D(`-2PQd(zryBIxu7M`2r`Ubdu|1AkW_x+Mb3WS9 z&VlBS*ZprLnMys&T403krb%3E{T6fd7WK1?O&3khc3{m%R~0mOO12JUeal)L9q<E{ zTw1<;jbM)n2GvpEqztkLa@DZ?HCZ`MDx`8tA20pG5KM1OU<1J508Yp0l9nTx{_L=H zUW>l#RPY0=!YhiIp;G0T53*!3(A>9*mwZ3NuMAfmQ@H2UxjU+@j@5X23>Q^dXG5?g z(KbWSS;qaT!+LQWy3kWndrD#d@n}r`7;L>r3u*Q;MVAiuy;oe%zsCf!;cv@-&<gDM zhbg8PB2E&AzVkjt^BUATCV%|+k?in_<7}(kF}v;?w}i;^gl)C|kF&Roin{IkhDA^e zLR3T=LFth05@`e^r4{LBkQ!hBQMyyQq`Pwn>28qDA%+-g7;1+1?-l2Ht@pXt_1x?E z#wQjt9LKTuul6<@Nn8yN3eWujQV(!hWTd72s?V;i&~oq+$_LyC<-cykb1JY8YnkQz zCfiY~R<{ht4XwoVLjpcYnjoA>RHY2E@U(AKQcN_YWWFU6Fmy)R^4X{+EbYz=<n3p3 z{{77U{Sf@!6BXZP0?N^{xObjt`+5n<k6#J>H3v$wx2fK(Y6lJY{p*FK5xnQ%uy+8( zjoHv((Pm6s^D{Ac@uwJ5DvohhOg5+!J|L9!u`!0s0oO?A?!W5<r^p^wWwXm>XwYfr z`m4|fR2WTPw_ciEtb0W-B5`iRJrbW|RW5s0C4*1FDu$ZtGRU39mc^Kr2aa<8?XPY_ z18?jlFJYOHa*wMm)Y~qte%vQmv*1I?C2ERyIfA6gY+t+D3JLCyq9f<E9uEX&)K)z0 zaX^Cw*bExK@_9ky`eWJU%Xq!xjsuC<ViX14;XG`H%_(j?!_09kW4mSiIbVQ~Y{Ep3 zJD8{qiu~&L?os)DoB5h__G>4dQeb{Mz9yp{?buf>ju5<>rnj%{+}wVO7!L306ex5> z*K#Y6hH!Zl%RObmHWBn=%~6n+q?I_Eo3iHeW32=<{V**;g+gbXugv#97kaK3y9wOs zea0A>zB!yGNy_!JZp~7W`4J&jCD{YB7m=O+`j&)Uy%ZNco=aiz+KxwpQShWr?T`+s z|MRN-{hw8<l~91sEC@mb3|bx7O_yKKPyO?pl6tY!zC$5tajV~@2n-oNnk=9sW{e!E zWEW)JL$5Nx8I3=lRvr}*$G%cD^U|zLPZy($%~eh|HI&^^QyHx;Sl_6eK-<h7J6{?d zWtpLWrdiHpk^>_R#7=nTnkS;?YHV%UmqQZQdv3C%0wP9X1KQg_z@$^MCz0DcD}btB z!5y@f8~utpuUMyQAw)f@=iK4&H83PH*S)!)*5N#7j&}&Q!L?3^;%oS@D)OTI3z8rx zl0$_+$mt*}g+s5A@y^r1b@h~WhLN!rqlot!8axG`9VHG}IJ6FT9Is0_wSTAV*bzjA z1vw{^nxOYzs*hg)-HY?PzgqLdQEZceSSC}<YtI@-FZg_qlfN8sAc>LBo_#?0DCCHK zx~vr=lc$`XnIc%J4y+o^Hw&|Jq{2JzSt(wbJ?;dg{x=-0r&-9&pjVho0b6jnemavn z{Tg+dvT6UM&Ql^H$tC!2)O-_4cCO`fg8pJATKFkBxs*7%IURDoYJLez@Qc+E=@mhm zSQfJTmyN`62Y9&-fRvQ*j<Cmo`P$ngj{7sE26@eEY(fyalJP3ywdSa9XFi+Xtn(`? zGI{(DFK|!hYRFAedla7Lkr)-*3DR?1Um;#SxSzUPqnwgz!!n#ADk~mrjX|#1pI#w) z@;|m;Yc#uYGOOplBz8X~(zD$)wy|OLx<M0uIjoa1zLDB=7S}5f5d|hR#?rqd+a<VR zJ0cHYzz8ud6%Q)gw~VEnW366^ijTT3BXW2O)YZQqt4wf@#AY|Uhw&3-cX_K5P@Km> zo)U6hi?e&$Tg?<&PG6K+3a+}i99(M+pFm+F-6&(qvQ~#xYG&;Nc`z_RKi{oFkI+gs z0`p=Xv)Yrs6Yb!2eRMPSkV8ZzLi|h|x+8E>=YeSOb=n%9Xub$B)pOpR&TadJb?kJK zEpQegen4keRqaMz1%d^~J8e*6gxrJUSufNMgk6_t1&8AIUz}iV`r?ki?;)_=0Hf2> zQIwD9o4#K$xqG>vY-Y+*<Nwr#w``mrc4?(HoyNaw#^^o)W}wF`QEa~W`x^a6ar*a< zhZPbEJ2Rp6r-b{@xjTD=`m!7PMenLz7SBFLn=~x5PVe(Y#E5$EF*8QfUVL7~tjCwk z=_s@Dm=qe_(a=>M9{Ba6;)y(Rq`<13n_=wp(J4b=W1s2VUd{BEz2E8a6N^x%s@|wA z+Po`4s}0pz4!hYGLC-M6?fErU{M8g_oiQWv%c@WD&OsFpx}CBP)Q8%%1U^?s>ns!+ z3ko<SPU$@J^k(mmsNl~r(>GUJ={-BaaxM7^jbC=wuEXT|J&J}Os^0_JPhy(+{9z|r zA0(j=c&}Q-iy#svp<@KBT~--wr(-Ztm%e?XUeH7J0$txC;NM!)PHNIn|J9G7N&b3& zliCE3Wow$huh=uBJ|30@nse*FI%WR=Dw-w-$m<%!@5O6JKC@GYLXC=M;=|TgNWVUH zAJ*3UuRpC#3J~IeKT{KuN^ndUo0YC*^pJ5(lQ7kGFu5M+S6g+xaY{}a3vl0ZF4ATT ze^LzI9MmaXKICl}IMGbYiJ}wJYVt@Oevl>=L$8wH9M7IeS7n+eaHO5$Mdf)YN%m@P zBSRq%bhIYkX|E5=D5lCA>TC~r((NT99lY>>Z;F}%KI4(Ngji-6Zdqqg${a1f0C{D; zA)HwIp6LiLHmLKx>vbNazg#72ZnaeGm?E^KRjhMD3~UhC3h-r@+%J$0F$)*(y=ifH zPvsGD&&HYAb5Tm{(kIQm(I#amRR~496ybe}+FsJ}Bxvd?=wR6#N|nc2n_J$!d11SF z_AW)p)4tnNObO>CzS3p_QG#|V)xLHZ_27CfY;)#G#t#W@=}SQ@7Cq!8?#LF16K+5) z5a1fuS=*bKplv2q=c+APjvQE(zhkRkU`fY`dO&_Er+O5238?b{tG{X*()@r~(XYP= z&=u#cosJe#=Y4<f@>6dnJk6yC{NF0;EgVmpNVQAe5z6zZGq&*gG8i^(#Jhz@UU6G* zL1}@>?_-6n&HCeyBqN-kI7t=ImoSd3n?62yRB1cqT0}5eY)J>7stVCPEh<>zC{$)` zxZ4XDqf;->$n)8yOxlN36rX($YMIp7Y>a))4Iaedo+UI=$(BLp8!b~EkEa~usT+M( z6Z(zqx$pR(MT}qhl2`e3-zhp@n2F-!Vvdu?+K13i=Cf8(%rlySWflyiV2w#^&2U-I zS?tFfpx^q9t!bJ&V}!}b-+ta7N5=xx=&u43yQxpZiRPOS_fmm&Y&=)~T@ICZ=b)0c z_(5tl0&(RKS<Ld~jHgb|ggBJwW_Prde6ilKV|heaCp{hLl1cu8*?5Ga5-#XQ(=X?v z@8RP^_l7roy6>EPHP!VlqK&$2-*`$h;9DvZi({Uzks}u+%cPQ~&lOXQahb$LpmM-v z%|8qK+SG`FWvh~mcW^{(?A8<Cr$=Oef0&T8D@JzR(o3e>p}(2Pp<SGtnI0Owd)ISR z+pM!%<FGsf_dO_s{^rNl$}cWjCx)BFwb1gyLomV0P%Kln?yEdt)NN+n{1-02Q1@53 z)?zeE7IPd+3mYp&n!n!UCCy5FmiFIIfb&FORa`alD)zxDTZqrBCgOkM?m-$n#b8f# z#F1PdM|-LvX!?d=>J}<UeMZad?)CY7b?I9NB2@(GJx?OUWk_x=WS97BGKU9hEJh`E z9bTt&odRzx>r9XM0{2f9d&hOY?g(;X205)ey~mvP3-wI%s~(Xo+UyOjp!GIODnnzS zNk9J5A5vUt+3B4j=%7msIn);r?>wfqLoeOE`z+pG0HpT{qa7L^%-WFGsmfk>c+>H* z-8-Fgcmvo0_Yk9lQw~qpW0)6)qCE9QCE{CIfYQOP5+E*2+I7?6U)9Tuz4Y2^&W-sM zMZH7rJd?V4zdJF{V7QgX=3t`bijOPI1(Sk=Pb{x>4R>|jga^6^OjI#nZp8p8z(oRD zpESh*exvMR$!UHM*xhUF|EXL4cLnhA8NpFgXx$upSG4o{EKJPlXi~L0Q1*8-f<LKs z-9yOz$VjmUw=2-2Op8?!zds>UX@|PpMse_aTR(5U98xIA{oZUXyh#)HjZbm3-1W{3 zZD0iUh1<(PaM>i0WaY)<n+(+Xy#?(SW0>w5k<LK8m)hBg`EZJSnl$KMB>D>Ru=;uc z$k&|LQ?S(*KEL3pdEUjt`2dxSIyjL`32kx(6{D_DxtGYtTZjO(y$lFH5}JTIQ$Bcc z=IbMVU*JxmAuzS9c7Kk+&xG3ZwW#J($x5B759=9gP5y_0a&t9XG>&={6nZ(vOp4^n zJz-@-8}*CCWPF;PJ&i%xrourhWDvbyROfLN9D_z9I>76HBJ~%V3=oyzo0lRS%O7dU z_#P79_h70>JLi)Wt`1RG^gr%N)0bHVGR)2vh??Lv#q}p|aQ#QDDtye*_0cF1C=vUe zcA5T5zgzBIxkGxUE~;sWi6(Mh_ZqB`q#QeF?ibAU^5*dX2UIQvsm^gZ|5lmQ4B2?u zO!c;J_d@n#z!^gI@`ftf{oc1FFWevPArv&dzF)yRH<*ue=SGM0xERng?G_pK>y_7z z<6lnpg$NEPP+f9Pu8UsEzrQf+p1yaQpRL*|F!VFq<Qn<y=l$8(I3GL&=87DjAlHb$ zTYZP1(i0u#I>_50b`e>q?XjdU=63kV84qrG*OFaFWFDmA>_ip4M&~#p_&VlcD-)M{ zKi*n#vHtJR`|wx5xJ7Wo;7$H5otifzhMt;usfQS!2n*B!V#<v4%V7Edg<$1?a|$%x zuTt|CCt*<gR%S4I$p!vfW=R<05wi%i;nMoD#00M?g)h}F)9+=#exVLxKBW_xZ^Ooq zhc;;?s-Y>`Hw#118ElgVC<vC8)xPGG%A&12>*@9uC+s<A_aL)g=C6s<uIKB*Kf_1V zk$}ytr7m5-(;m1>2Tl*y#ZFwEHu9vDq?WwL)?hrK$q#8cg_<lAfvePg?wA1VrTJR! zB_2Dp)<gL3%&-Q0?*D@OfiCLYkS6EU8YALOpL%24itw#|mM!hAaw9mfllR%%(t3UP z?nb|IdYzp@VhyCQzQ(hT-Ze-~qfy6tnRh$$)s*Z{J~|04`HxAzZ}+{B;H$vbxS}YY z{i(xJrD9OB#pKPvqU9;`(t%l7r_v-|$DhNXQAtGTK%PiL*yyE$5Y1z|*%0XRQVUu+ zVc(lO+S+F?)lmG*uMN$(!lWAa8C<)+WRFuHjN@#oNSt%+?({Nn8xfLViCXgGVh_Z& zF4ADMlsD@Ma}%=rN)U<13<y)z0%yIv9tU4sW1lxlboK=MBpo~@C1vt61xQK(*Z06p znEs2TTwQ%iLr&`Mw`4IpjmM|aF}xcM$BhAAt^oTj8m(cMK2jmUhs9L)3g%XB=@Z<8 z{p!GOzL0Se9BGf7vTmW>V$oz(p<pa{&}ut%KE=O5i~AZRqe4)-(CnBasMIx-&j>C( z4yhzCe~q6eD8EmI&>+m(*i8~xJrQWX4j`b8N>pp$^f-Kd^U<s6U8G2O-Yw~+eB7Af z6fs``)u@5G<pa(tl*|6O?~;Wh3ysSZ9GDCpsbVVXynpt2yQg*WR(I**RT5VI=N?Z5 zVipm)h@6`$(3CFOaRpIqf%zlYUhclION{1hm>*=~XHc?>*Wm9U9-#HsDYH*MIJH{8 zG&=$N6nl|tk0V4mIE;i6j<@Psyc(Ql>L#H9QM0wOC>n6dMUlSdGxX9Nf?RurX7&=_ zh}*9$mFvlF`cOX*ARLjw=OrV#fuEgS8EZY}PCI~7(F~;Tm?~~P!Y$f;^`_Z*B4f;Y za|<%CIdy3!Sk{t|HY`b~Of6>fTGJylI0qjRWx7Wa^R^8vbK!Faa1ew0m%O#M6Tx$} z?gI<{r2m&*h~rN$<f=j?tv!-<EE+kz78)jO(a!Ht&HEM>a#u|z>Yh1jRh&^j^kcrl z6hpB3O?RD4y~gg7&q;ztl7*u!+Fz45fAY=OdeixBDyNDm?u_T=e7$oLazmUU#L;R& zpTBxnkmmEkITP2}8)SO{_MN-Wo}s-|2D-M2L}XRObQEm4^1RW`YV>lepQ*%-n<z-R zj4;ioHaW+gK@fr89ftK~I}zgHiA5(Nm+z8!vH+kIf|puknw2@AT?#~?rMK@y<;2J; zR-41WJjlnxPgIZ&5qTq`yB1E_w1LbcksOq!@_HLCL$;isn6e!h^E_3=UH4#sp*P4v zfRw=eAq-;eu^O7?jdA~_Z=iNM3ld+G=RDph)ZE>6jdJrZ`!0LBA;zmb{276b-pTW- zHr*wt!cVhYKCtb<9C>pXWKl!Tb;1cQ<}*8<vfYk8h7GXDjCh6unP4+|+e)5iBexld zlDN%%bEbvu>z=mDTUsKMoN3p0RlcmQiGzO50PxI&6c!Vs=6Hk1?2rw@=5^=!4F}*M zkmL$>8regMdYsvq(K7uLC>7GqRge(;nyW(Le)0$n4;)!Ytl9$Hv@1k!8oaq*ziz91 zSO-05#gVb{%NybLwmS>Ns{>mu<fl<M#>uL|-aBYAvB^YwNxpmtV#b9C$^~?ySI77x zLPl_x=`bQETPJ-Cioy_%ddhJ1l`(+^6-^F`s<xwN-?1O;6j5#o8h(tH6Um9V>?4-) z%li?On&PqmaE*?`vfJf>rUH<)pGuJ$sz0W|6+*;BTl*Rst(9||OcL?y;w^LKi5P*i zJc>A8wNss~!8pI$4~VmXBVa9mnKL(@N789Nd2W}MrM~9TpWXNDkvD&RS!>dH^Q`Ps z!{!Y|($|Am+d&icgiuMeQ00y+)qNgWrWO*ERx6eLNdkvaRCZ;5Yr&e~;Z~}+uqUBH z0{D$*56ENQV7fIG5irwTPIQ~#_R?+5i<3r#_K_=M!@a>AKz*6Cz893b4K?uXiU|<4 z;S<%@{6}Jz(mo|nH{nvK9mvq-`%v1Z)=kA9Q@~(nLJCLk@`%BoPT=j|od5v#>@Q$5 z%lXK8O4C=E3Qqe2rHl3D-@9753LZYJgwD&^2~lHl+@8l$-_%!I@ADcKb6{KUxBG+3 zH*48;2LpU_6tzbWiLy<dQsP`j1JZllAs^R1tu<_Sv<aKK#l?wSXXCynK)YqQJ#ufa zFe^zQ>!<0Wm8QyRsLD%rKJU@C_$|_~$L3T*Wm1F-0>zK_kIckh%^PUCsI?56cVaV9 z2OtJ=@mU6OV@bKCECKcgbh9(jtzHlvk-W8Oy9u8v;yPiSSq+#hhzY~XI`a~6I|f*g zNIesr5jy{S@5R?H+VxBWD8=n!VeJa`e$=DzN#3to`z~Ogz3wut-nz|GFLy(<+!pRn zQ$;&d4^8Ch*}nJ+(qq84<T|m6MAU6+0&V@f{`>VR_45xuo(*yrH>5T}QD7gNf3cwr zvjV1vvK?I=d*B90$0Y}o^)zd|P=Bww&)y#@X4n8c;01)(m8I@_f1F*OzbzgJMJ_LY zbFtM^Pj=M>7lqsY_X53;^M}k>5VCr-*z5vh=WRw{F1L5StoHNj6f9(8@#J5yoVI!2 zH^`Ev**Tv|wj3hF9hBKb+9(Qgne!w(vEK9@)X7&UYd_-ieviWm$|6&~w_f0|{1IVj zunkMF3ZfBBkW+H;E7ah<d?vczv5UmW8E$rRzQ}ayx);gqK33u2z0f0dcXXY$UWLQ! z5<=tmVM^#gZ=+M(zI8&rq*BRUqw|xLIFIZTSeP<a+`_W3H^$hBM_Q52xSgq;VCIt_ z5nazC2J&OA-(lG9NaNP{yU1NND44^e`I$19N9(1lTDAp9?}UUkb3`^`CizvKSTmbm z?L<IUdPIzpAaP5b2p3a?Dp<IyFIx6CY~(R6V(uYo(VO<N9ayI!?}=9a9`nI5i;}mW zd8R^d#|x^wwE{prIs?c{y!w{B<K}zyd-HX;uzpJu_6?eY?srSo8mP&hKDtlGfj_|S z(Zhv=nzmJ_S0`WsyNxJ5!RM3epU9P~J4rw8o33W%&`SOm7yuSvE$3>n86}`EM2s16 z+YX2&n<>5|sq25{<jmSTq4n`V5Q_J;y<bW!^XeUq`l5vMvv4i;R&d>spf~dx!{oiX z!WJ=Dlwv?If{S5wT=9+4=AePxL~elF^#aJlQ~Yl8asoiX=J9jf4103gRSGtinr7D? zY85>@jeib3ZO0?s(9OHb*G#Aad&<8lUAF@WiF4%viiMFQmb8}j=7>6*HrHdcgAie{ zpAWz9H=IH$5zns#RGfxX_Zfc#^vClVSM2Q{pfAcvmGrVKUNFBOJW;%LU$7L4-l!cs z(kLw#oCv$6Qvp!T3<j-K;dqrnZVZ2v`@ht4P7x6RHcszwzk!XOh>Tz*Kk4>1Yaz;k zSp3Eoyx4y`{IuWnSN#a1N4O1WX(t^}Y@&6n9uk9pJmbLQEn?NV%sGF-FT)-|E*uT0 zQVd&Dg!Yh8GN4HYWA3bDNsdSe1Ks`u0?w}tTf>PjmYI3T!_8#~v+y3KDs+Vi-ehWv z_n*sdT-FQ>YIz_b>9vU8OxW7yN_ArQ65~1t@sBccZ{sHiXFdg^c>GJYgf7v)n;nUP zl{oJ)ZpDUGY1f=xzCkMSO!Aa|;C^}}UiAV!F6SJ!xv4bA&9-ku8WlTqj~zQp@O4te z6*5=TvGM?Z1v=!JfgSIc4w)Gc(+t=On99H|HH)UA?w*ZM*suS(v31XEJevOD_4_$` ziCzDZ@m&;|2iXne^~b=AwkoF{e*t?R5SyvZ&EV4hpKjj+1!txjC5Pvk4WD55R`0Zf z+-IX3)@&85pBW&br%!1-PB!0xOBL9vL?LcoCGMXSIe$?9Y9>an)_xA)>(mK;{};IZ zTNeKhGl86lZ|rzk!_ImOAUDQYsLn_~PV(=t4`ZIKI6IjvzmADtmktz*p4Ds3xjjpr z<+C7|Z_%<4JN)VG+W}><4|1=#+_k)ypJ$G#I}s5@Wg*IBQ;MU~;7<OdXZyO#?|oR! z19xABn-ab}{Zh;n)2&-MQi##jOvknqqzRS9oN5SQjfU<#87c;W(_`kg0Fl75giSqv zE;m=?m=Tw;@E57@)fwdqZ~liVnB@R}vierW*(UQ<jl*jW^VL%qHvO#-&bkBhH@8iY zZ-qD8MF+nirh^3BxHExk@5jU+w3nQwpqf|9^J$GoB^d@LfNy{cf0x+tOT=S;6V!SC z<^ifhIZZ(KZY0QSO1$U{hS>-+^0M3+fYNfIr`;;j3Tg8wY=l9bJs?A5X5oXgTRK!j z)$itq4H3|}gesyF^QbEFqF+Jfa9#_$StCRl(gkgG`eEu>#Kwj35Pb5dj$)01azZeU zS_-jN+`OPUU+POG%@xi%qV%A&6h+F3iP&}ibB|11O{WzhbH8_Tt9ykLxn%8K%+EUJ zA$3n^JcN~%QPcD8`L=Z@lv`0?VP_i_BarHq$CYQkkd@U9Bp(TIWG`;t$JY>r98>IH z!3cwc!!wI@xYXhvyc)XkKS2cAHlafBc4wGulO{FbN3w6vev23qrjM?JZ960QK{DRM zjfe;L6KQ{$7;u@o2b{^=)k*juBTs<^XqCFMe;0kK$OgzF*FgC}3alo~Z6X+(v0+=h zcZ!hSqny^<4W?99r{{uLu)*A0dGVTz2W-HX2}yzbdKq;34J5B&$(SZhjbzSRm%!#V zuGdYcg1^@}lYt+-YSlqGwBHWDa^0JhYUwg1jMSW!rgS|nkEUKb$E{|*UdiKHFXZ2K zlf%JC4u8is4hahA-C}NKOt>his?%#_^0sj@(_=?=C5ItU2)eB&$0OQCwpoOC$p~=) zfWz$f>PcmKp?aO6x?nRFAt8~-$@I;Mr0q;zx|dk^Ggf_O?GnAJShsV0c4mobJ7#_i zYGfa$cMdz^3CJEnFL7pv0HBGmLtB$ZUHHj-3%B|AMEjE^c^_8wQk^Sepl$e}%(8XS z^98oW+@HzkR!{1&nn`2my-wM1=~Bf#KmY4*8_s`Ry1#!sdiXOIGK5ck7I<TfsFW$< zFdIws<`~dAHXTr)<|&}_`-rHVZCW<yl%AwGZJ2SHE++Egr`EZ$6S!Bd)@A<o(DH4{ zE!Cx3Go-Ns+gDBj#)uGgRR&a(<9+z#@SsvZ>5Co+QJr`M_9O=SMTee0S{RKYtgEo< zqUC<wO~qI+gXAkic?;fg2G48TPWWxRr7o2f!Vf1WY7T2JoXp4QBA#x}3h2Ct_2XPW z;j-q6V|=ea9m*kb*2aNL$vqAlbts%H7=pN=%O7sxs;~aSx@3+xakbj1khJYME7{%l z#ife0-b0~XZkv=DLS@SMcrUAJHesx|AJT=K=UV2t;5)yh2i}@ZbFez+DqnmB1YFC~ zb)S#GsPYi8xsqU8)p<?4ue#GQA_dMOFhr8N%xGKNFCP10CGHmAs$q~(m7x}^k%W6! zelhqfr&m*+I{^?N++<56zQ}%&o;0<GwWPc?xTW{z^aS&wa%Ap?-XT}p>&tt4dT_J9 z`)y<T*X6HG`%?Ni+b~cFH2;%dW96m1qY8OYl+ONl?7=FNVI|?WZ`hiO$X+BoQKvkI z%?NCb*cP-}0?UfH)?YLm;3C#HI(MId?Hfw#)^>ysY}1K4#IpcqWq{fB3VrB8VdLjx zu;OxCQ}7nB9mk7Hj?Z?EM+45ep5x=y8r-Hs^z!PXKW@HpLyyU=612b>Y+kU`Yk8x3 z?*V@DW;l_r3wzXNt5;L$@jLoN-Di@OK_F_N!dg-M+tTu!YU#E~L-*0Tx6YEXnvTvC zA-<?U-0p72<O%4_K)CHLn<dJ~I~$);^s=cpGBG_qs4mm(0~Uc2EUU5!F7DsDRIO|B z2&zm`+}DN4)+!C%O8<uQ9`q#bwn?14NI->6t$6Pdp(gS6C4l@v^^fBE61;!f&XvC* zXwOJ-XCx#@n)3cq)TTS&+sw+U+pJGO(yqBj_{7kKo4;VUww2RTYt$@PDOLKqmXt*F zo?rtmK<DnOt*1^Q&``Wc*pu~DIhjxj#broc&yk3r`q6yJa-@Aj{)5&V$52BLv~5GL z6s&nHD{<}{(_e<Rzpu}K^uR&?P&g3MK6`)Ae0;V4=YP)vXy>1XM66w$s9qRHs0Mv? z-|=4aCcSxhrua<{*3gH8(@Q{(A!XBR=^yt`V}wPBV}5Ry)z#V{ZVWlBRG06`tmB`x zFke}O=x-q&k`yQ}YP(Ofid<hl;xzFLr<jEaQQeQm?mx}Kt((Jsr722q4nCU={(^*S zCJ9)Qm3(N>vW-?hIDrvKtA}K$sz|1$Ncdl+3otsNwaJHma)PDwS`8Hee?UUfULw7q z?_(65xkv9kyfl7q&M+!&$>r2b<i2DW8EK+SYUy|E!^;o}aRMLo$@zUUzUvbKtQ4?# zV%;sBVMdhJF2ON)O5Wk>vvlq|K=b?6vpseqI=~5U)(^RhznAB7B!o1X&Gv}IYx^T% z{}H1;m%kuH4d0J+*}n|;_a@^H)T54@uyYp1sua0o#SMag_u~a7twjt9^tZ<vG@eyF zcQ7D+eSumg$scB!E^bVb2!0}8@XPmSkye>{2&fUZ%S-FS;+InAEq?mpHr0!GKQ832 z^qKc`;<>Wa_kp=F5u@iv>g%UP%4t0QY2eE01>0=~x}5=H>p^;r=pyyJVbzXq8ROSZ zpGCNtfeI}r=o`y?ZIH?+a}BHf+`|r^ZEBr+ndkW~_3iZX7g}p)Kv^G3;hm>Q)X>zg zWDNZyap<3#{h~`c?#%_iNBPZAins;p294Ajo`yDnzp`tZ9|oX<xTT$fp3)t(Ot0Av zh}PjA7P{T55ohoimwlzR3pEJfI4BVcpP1Yc9!A!eK}`o{7<Ek=madU}<JhV0O;n$q z>Xr%Z2=Cm!Ph7t!p((0Y48ilz((y{3xZbClDG1vrA0~b*)HUS&d|}PTPv|W4gkAzv zAGq-){Ex4c`)?1;+QUegu3|hyK0W+7o$Cs9Q+pMCBB>Jc#?9#tT6`tt9gkD|AgJ{m zv$}fgba4DEb3?mW{~bkJKOw%gHb<QO=Ob*X39}NDiEMFl`X#Go6HNUN0gMx%!uOpM zSkFT0uqv57*ls>zjQ2`1d0BBQ*hC`PDUUjm3@1BM`o9+WhmCqag)|uR;-gJs7sC9^ zWFrzSFxxZUd%OGKq~*qa@(cf$_BV1Oz<LAC4t32QB)m}+%{b*cPOa=>bEANf*xK(C zmCzzx*nzgrU{%7?^dH;bMu;Ci+@D81w0&x?1-G}D3sAl|8CjpKzR&|{L-HXd4aghc zthvsof1Bw3C$r1)y+38~9W^TF_cr5lhMNU!9O*#TaLsaw*-odjdKAY&CTD9UCX3Yo zaw}fn#V?R9*R4T8QRK(H-Xga%4EMZJTLX#2?U(B16S+)(hLTeM40xMf@Bp)p-jg&| z#;T-{uppe&ZPf~W%{(_g&?!H`Bw!NWpg>JDLB-e?2Z(eDh6PvAI_WVvHIO{@l)Zdr z_wYZ3RZu16upy`Q12QTJKZF$6Gy&LPOl}SV;wtE>`GKf@TeSNWQwZ!2?<Kz&`tfs~ zbt0D~tLTLZ(@7*anzp9WG5hk=ZutN-rU&pO`%3@;JZT5&rwggfGj!R<gf}{SYa2;7 zx!P5}tgNt^e3rs0IQqjcNpnm#Ut<>zJ$~$U2r;UWQ_k*GevHbt(aCOIwCm!;b~0B< zxDrnFOB)S}k=mJ6x;Uu?!)O&^=)>Hvv2h_eb@Moh10vZ*0dPev;@j8{C%(E@ZP516 zY8D*@zaj|2<`kq+C%!^S5k@*+VutP~D@%un6}lw&4l=V#mP}qL?$6|Z4Z+2`{4rg& z{L>|Bxu(UdQC&U?hlQ3lx;6-M>G&k~$Gp1?fb~3^2o|^V($9{HLzz_Rwh1s60wso3 zhNWBH0tM5j1?xkhwawwJ0f@l&R<l}h?5SOHQ2XaPdC<gfvTsMlZ>|-uDVsbmxJ>2J z+mE3uXL~cnk3EiR<BF!oBO^+@Q9{l(bl59XUR#KshN`WwR?9U6nR)zB67NF<dkDvE z6E8>msSAO3`+b}B1m^xQlDnsCU#P6UnKrGbdWxTZ{zP?q3Fm-E)fq7ouyfvbQn};v zwV}Xfr=IRHL$@QeW=CaSBl-j2NS{~~5dkx6Gg~dUB)gH*s9`v#{Z_AcI%BRH{+Ny^ z|27@T$@#E)CteKIq&Bt02|KRn%Wdlm+7m_^)LRrhU;CJ{z-J2=5d8Mt@#p*%O8Y3X zhfq}i9KRP(&;~*)k-Jcv+<`6I6wb5ji&oQes#ei%Nl1#NGr$N9Ws21szUg1Q+Y2YW zyKJ-UFyEuSl}}jJW}oJ~Z6We;$6hm4&?z3y@A>ZFSBDfHsgN3G+xu+xL1+7~I`#9C zI)1&{n5N$WW^!`Emk|?TMkN`nR9~|$oF?Dm@T3bIk<9v8PD$b4tgPcY=KZqoJxT_h zjieNM7+i~s8RpwHOV3mTy8mKT$lOc6B8GQ-RO6E!bqz<Yq*P~LsX+~U3l;6hs%J*T z7l|7qx#(-e*%E`MPjMrA+HvwXk?USuZ1MOaO`qDr4*TPyc^~};PkTui%Jrr?{#RGu zHv8^an6<X2-&zjwL5S`VS}aQb%%jl(meiAk;46MNrHCF`cQLYaqj7pxI6feB+5|;A z@A8kgNlNV(!5lV;yCOHbq-)<(@j)F{eFU5*A9$1}1KgS$Q6LE!pV2<;m4^FUNsrYR z9l&l2yV6Y@PLVYR5~zxj=I<8g)WOTbcz5{IP~lGt=BK9<DuQN_unb8m19gt7E!GT< z?swDLV}qnmc7l2oKTIFp#+3(^&m~rw@BCUO*{R=-*cc20gPxb703xQ-7p%WG^UG^c zkFP9#eo|cI+8voxmM<+h6+`C!Fw(iddm!=EM2@1hWrVCe3}OW>z6N2z`eO8qU;>Dz zDTOGe6J@Ybxz$G1d#QqBr?^R4!8<$Q)cnDKBc-_bbDe?(fUuvI8cy{7E+UxTOpWL2 z$ko-F&`z$6MfX}IR?UOnu(K;;C9uSEWHh@w4M^A!Yi9s37j(d{-GxB|j=8Dc+QL$* z?Sko}*w3$kC0%x<5AM1B2qs}+uFBLZ(4E&G;bzuqqq_cMa5#d16GcpOd(X(sO2@HH z_OWUU7yp=`xSlx4tda2=zMfa*-hJ!99x+$+z+7dMwO_wEG5^vEytyYR<a}J+`^HPs zGjDjbZW*E?ju6h^8z_LZ)<e*DWoSwbgFa&wYLvdjq!H&CuccfxYqk{|Mr<LU;~3VW zMoxs-m;S+DIpU1m2$>#Fwenl3gqyFr-GVl&)&!sLy*=N!%B%}<zvuR(e&Uvn-N`ZW zI)d6f0=fv|?}09UekJY2Ey2fXQz%SNuZ3aUS!hVOpvK1mT${Fl@%TSon=fBV#9JRn zlE3SWP$N*C3=#d{xQsE%4|97G6jHZJot2$!`Te<>Pe9&EK%+*1+RjjLD~TPrK$-4> zkMyQZOMJnfkX&iXFyDBZ5_ut@TklZdIS==DvyL87@n+;?q5rsPhixL&u{j19F<?=r znKF9;n-Yc?EOe~fljGH|clMIm>@#*|TFj=5`x8&5$xGlbe7*6~9ud0h1HPtY_)HV; z<eQXkN-c+#&-)4FiKuDy$X%VIyE7{h{_jKG+B|hlw*DZX*}0U4hn9OJ-5v5<87`B@ z@8}$6Ao+-vWyL?PxFTzfGKKWOHbc#551+loB@ZLq-eYVw@!xX~&2^SgCs>WNR5D0@ zcO>{SIq>?-tW;kRIrJmof25H9-HxwN-Tzay7h`0{rmFG|qLO-37{kB7*IK`9PYPbX z!*Q}bzo7XZ0(lE%^{S&YRk-nKVSc~Ky~QF&Jcl}-<1?SJ0T}aH?X3bX27b$>Vopbg zbg2Cl)yvJNH1kkdaqbt<d7s^MTX&PgVuhUH0+KntzI9yg@GH1iw-p)}eWfZIh1bWF z@3avZv2(#ZQdkJ;M;CYwgDZf~7MRU#=0AS6-?WBYcWJ)Ud-tx8(ZgkO(NQf#$k{WR z-KQ%9Tal4m&iy1BxnKI+iiC9Fvw96!d8`Q&d0}~Kuc-OwT^o(S8Oy16dqL&MdD`T1 zLy<5GE5g7@?07*%hcJ>7-&**I$w=hDl~)a<K`@$$dLDyT#i~q^$X~0P9@E^v-*oEa znzXeds|?Qxey~xEi|Z7M-6QlnMAS!zFp`oJgvVxhoYMfX)Mg`TY{P=d#A}I6+6PQY z0vK+cftVnxuT?$%Lunj-F-W{Nt0u2P;A7Q>r-Db9s3DcwRjen_LW3s%=RwVEro$<H zl|vYJ)zWwc<Ms*X^R=b92vZ}M%kY2dwIk+b@cO+XM8N0u5BITfeSbdCcvrYC^ynp= zd4?iNl8>2Lm+BjLuT0>Vg?r)eM4SL7DBS1Yxg@-ZZ@^bzJIvmPL>d!D!fb8lojI4E zukGbdNx%LH4W;7t-5fGv)t>izrMajg8=Cn_(H_0Bjyzj=m&cFrhloU42{pgSnM3kG z=Wpqt0|ak=JWS*j947zBZ?}+fMoY(P{sK0RSWKJD&qS6;8QOb~uGQtekqTYWTN>`d z#50sNP55+MPDokIoqn|YYFMoEj-V-u-9QL%U>uSYE`pmCn_Rs)W_Iiy;o=7ujjhjx ze;rG72|GC0Zk0lZBn(@gwb1`{?C<mz);&t~H~eUgwta()FKxsXfw49Z8G0z1nQodQ zZ}wK)A@_949qy+BJG_#3Eaf6X>iGUwoa)8Nb>bHczx7#jr+UczF+NezYmZ&KC>@uG zh9f_E=luT9b(e*M_+n}Q4vH;laRi!3V~byZJKMW>vD8Sh(d|`!>9BD|!<lzW2b#{f z<oBD|X0BZAZn^uz*h$w4T=Y?GnyApgt>tex&LH&pZIjf>v}4FpFaQXZ^?6)tIcam2 z{GrQynZPOh5EQewAYWlFft-|i!y3aSF}*`|e0U;)2Zg$k`={;BiF;TvdJIz)T`n~k z{!^stzE{#b2vmtbhnT2VH>^=6=LQ4ph5Eq!`&l>@+V2m~<-~>yc535~7@RG1#&r^n z7$=`BC}}7*+rz2_v@+mLnt=1}YHB8~{&*5LJ2G4RXe5-%X{GNQ;Ho%i-sZMT&B$<a zmIK}(!1s_O;7E3~-Ec%qfZ5tmNr}>qYr>C2c0o0_)-2(tlty)C1$f41)e$XA3Cn~~ zgF&gb7zwpIh4fR7qJrmO(H`|a*2*e#6%zHjL7MqYDc1{G4LgShPcNlvhCex=UlM<j znLPl>cT9CgoeMw#kF#rFb0CU`fCd9os-(af=#ZcwV!9UW1?@NDZ=PAI_q+!T@;?Tw zx-ot}yAB3Whwk5nQ^lm}{I(xnP>pi!PCe%F2Edl*BZ!nEpfqkC0m_fMN_@0b>>;@X zIUfYra9XWmxAk#cljWHjF!6Kf68Kf06>eS>!#x3`_R~q&G<n`7p{^!FraEM|=wi3T zwA*kgz`N}@;zoi~W57OuVBm$Eh68IlYP_q8O?>Z*@KSnN^0JkuM6>%<Nd3V|q@dZn zvi;&K)GeKs&87xa%Y#U?MQ<LcmrN|3%T%H71#_kOfDA|LHEmfXUc@iS>Y-#Pa}}1k z7b6R$*q3i+gGsh#)|(PL5dnCSS4ZOO-6~P`_m4%q@1A>f+ds(ucS7cWc25Jt0GV=( zPPTKWzSvxKcS=4kp%QdTYY_&8Vj2%Q4DLr{_zuC<E~_osdYb5EG;B@_IB99^EeuK? zL$xkQ6;nGu+$+}i3)ZMRGX)C~n2T(Lh6uYtSOV6k{V;o1`5)D5mZ<hNpKj!#9-crJ zmM3zYgr~msFfmN6Vho3MtqIjOFu6$Ugs#~croO0to21ALWxLTO?ZI7*yE+GSkOsRL z0W42XF<xnE?I>C7f}g#Smvg)JCw68H3Bb9&7yRVSPL2w~?iVLUATgLYO<wg`|F;kH zrapUP%hHDyA$slEHkk~@<F*>!6}lwPErzytV+VH!Oi%J5QoGx^F$`fu=#v~xZqOex z{+7;CZ^hk9#zyA0sd1l#@2$#dS>0tVpQcqg@m*Z=+6<P0s%ZFar~4O-A|94|FSpF2 zYl_Xq&Bf@=jl;?|1`-mOHCZ`|+_`t=pk;{yiuNafA_BYDPLc44f@>x^YL1Gg=xqI? zJI3R1J>tsZ#@C2#x{yF+|G<?T(3<8__j*=@T-8%r)<0#cv-!3x&7okZj(Nv&{M!mN z1-CV0;PvoEM3+W)yZ`rhF#yX0L?KmGj&M2F3@NT!MEwC{?5)3%%_#M^=`uZ;St@Yv z12erfo6IskTg$t`LIBER*Q>Q*z>GaM+5wF96n8rd41c<*mZ;U#HUur_ukjb{0qZox zPWN5A$<r^(Z=HdU*mfn;6yM(3?zr<%;2_H%+X1|?E)J$x=<mRHW4UhYv&V=seKk)F zrh45szu%#M*qF?3KklSybyUnsDO{a7ZC|4rQYQ+dUIz9ob0bRf?&d0yk#99$H1<F^ znU?t5&SkgSun^t%KWY(*DCfdOCJ8^Nqzev1E`NF75c=oR*4Md?uv=*>^g_`e+a6t7 zb(l4b3{#RbzDwfS#8}BdeYbhObu2D;pdnQ%i$Zl`DEM!YsepSrwI=Muj2|h}+AYtY zEUAp(?C$vb?-u-;;kWL_8Sol!HP^SFk9Us6P~nOG9KNsq-;76XX!?J6u+hhK`+854 zEb0(FpS{PLG8G5U$Ti)9g(eG)*`26|j}ee8`Q6&2U4Q6UWWN~MM|Os3rGHtn5Axlq za!@Pw0T#2Baq+Ct3qPQ(gMTgujj*JN6W;w)>$Hccff55Kk0e&I6@y0`RT&}RA){Y@ z@9ZXIb8cR3bHVIIJe0~Ug;Od<8+}3%l}!aF*E}q48P@YDR!{%XR9mvMKW*PDVQAO0 zG&8t+VCqvmapAG+w|UaE82w1mBZHp0V+pmlAqZJu1aIzC9>?yX3`S~q_bE~;-9SE@ zKgK%P5(*=x3;4DZ!R`k2&kGvi4>^j4K>f}DbzoA;EjFPzIN~$+@dmPuRe3hpzYx)C zHbqM+QF^vDGEUAm|JWR?l>=DXC(9)b)(|^Yan^-XpjNhI?I#hedKVXZUM(rF;;_N{ z_XGEQTLB*$nP@Ee7FzJ)8OfA68%d`)MVpw#NAa2;83hbau8<C&Jx73k+-8S-T9$ZI z2q3lHlbKV{XPrjgWB&L?$=UOTwjxtk>0Us5vJRys&Y$O=hp1Oq8c;jpzYcMX8KOUT zYBYKOBQ&+j9J^%#5il!YMzbRQue)T(=-C+LZQl4c`U44WZ+CZh{}*6}wQHRCTTk#y z9y20ULItZ=e-nOxR7cb}cPIFv9PAS|AU-KrPeV*8l&%s`9z|2Tn-NyFF{WBKt53+d z;?8YfdL*`fyzeCjZq^^NUj&S@zEFj)@kkm4jAOsOs$krK=w)ABX7e2<2;1#%By5HU z0(cK_#X%YN5^WvILj%s&{uan2<OaFMQl>kk08>uKHM31lWfA1^IBAD96F<<BPV! zR;HdSkb^ZKs#1+4-)x^apQye#<JW!ov{!}A(4N`9I-dbBYm1W*SMLmIh~9F$9NZyn z08&Hx%|~-fB6#UfaM_)XPFD)dji#^_hGaTJFEh);Pj}|sG0J~DeZuD*m`?j;L1KdD zO{G%(6yWO@6>mGPDOBoewp;!Bh?zn)&^$<7FPYCir(ojiPG?Z-h7gj_dwR)YOv!}M z&f<PJ3@{_^Wu-x{1_~*Ko9Vt**hB9Zob~+QNQ8eNkzU1{(KAjdPu%rUwKAO$i<=<z z&G-N=F*)MkJ8H4pB(u)jgb!LBCl=zl73q_RCZo9m2lImrm{HH=cB;%y+@32dPZo{f zcKUwPF4d2k(B;s|MqMtFNk?C~FpF6a5s(7apwyDkr3!cS`2Mz+X!9Tpje!<GM6Lbj zSLtLX8lB0R%!eud1n&A-WbUI)wrO;X5XrGDo#LLwBhtnhc%<V4n#%3*&7THlthWKb zhUa6NCM%@ST8k*O_(O}&@#c_i=^CaSb?I%veliFMCg`nn?}D>|FxH+eu{J_nsQC_u zK^=q+|K<yiqqyaCvCdET8whmBTF_-rz%jQ!hC$^C?l(9(aOtc1lrPZq#gDA+^GSY@ zFd>*4_!*Q9+mb0E=XNnpd8=g5^d%A<|EHK_FT&^DT42dTrrxz)Q1n$MZm)70mpVPu zII5zq1C61R4Vx+&{mq&F7>K;70n)0FH^$!SYHmuAQ8s+far%U@*mlX%a_Oc>yX<}B z^TY&1HZybmVwyp$pX1c>9j^_Qn&svO?wv8&+f!M1j0Z0tKTiXQEUL%y<L6b#g(~82 zQBjUFF+rkq?EJmyvk69AGOREdxB19>^xYvqdjUeT-uw|%=+x5SR%?-HTg>&vTN?D+ zHJiyo0W{l%)gs8TRL3+9g20c?UMRd2(e#!&bxtew+XZ0I@r5_Qcza##Q!yL0q)=pP zzKUw}ym&BGtZ5`pNlG*1NX|S)-1B<U{`W%kPo=tJpnQU8Klu3g{j1TWy!Y5S&U!dy zhk{=^MY7iG%8piokLx|5TPuGlRctKwzi)d*<IBy*;=j?z8K&Sz%V?!UF140scNpPS zr$}yV^^o|tku+fy&N0s89{r_e_rU-uZ$a6-lfb~hpX;=4$G|4gSYE|v%#4*gh16hW z<o@n?z?q=qe#&=V2@|@Z6u}s%La>oC++#$%_CoBiqZ%AJI(E@TOb`iWq#9OlQ0wzK zTxf9WcF$H@4p{!O!GAS*<0rN3@BZKF6A%(&`IEnO4X0L~;Yc}Qi=3Xb&l^^2EzgOU z_+VRQ>Y~uY&!~DD^wOp82MeL*12_rdlLm+iN^2gqvC{N`$f80r)TdWI=rrr=_GF`f znBHiCdfrr4%5=VATxDQJeJ!Fox*fdGGg0kcByeBD&>B-X_{ja;=|j+?eE=k|?KjWW ziy`+X3`(6ISgqrW2z{E`N~a@u09(=YuzVT4eY!g@RjMqf%AozFe^|h&`z?6w=rOQ+ zAfN!IR~HR)@Dh_zjC#x9v^iMq)uT+t39?C9T|k)nu%=J^E3<G^tRo=x5?46agNAaS zB*;E@q})u~Y(Sd!0^dCQO3#F~L>;B+WR!N{)_V(FVaD6Q{vuwUlBUUdmjHfpaBG0~ z@HRv2n$M=Fhd1qTRw2p3vVNl*f$3A<1MtOW^5SInjK?MOfM;)UpGMYO#{nV3!)I@I zOa`w+SiZ`qGpi?^VGd)iS&xOF0E+viB=9p@vS2@k-c#9hK#a)`B6zONk)tRosUoVW zYw`msPu}Ic>szBAQI;yZn#yk<^~ynukXejjjnJ@QS;=1Ou34@1)iYuat#5z_nWZ%V z{N`1uh!RetHi<V$y&KnReJPN<tMhaPQqr8@I(yeKgi#>m0-14bM=5-kXCsTw#`S{B zr%$?IJUZLYXRFNVl&MS!1!^N!`h71I6G~N^2AJlFN$yV-Y8P3ByY21>x#1cu=y^QT zMcb27cQDl_$EX3RW!2N7p3#2IUDo!B<_L^yF96N#$nO9&yGDl9z7?$VAxpO++Y<cB zcpk<wV>xj~{l|xLs!$T#Vlj@GTgmv4DD5(wLTZPh>wgIRVdd8^kWE#}SPVab@d-Kq z4^u1T(MbU_9C_<awe-w(z-qE;lbML8jiw3fj!7EKieW5b(zDWU(mmeaX4c9vuHE~p z+yfi@X3&UqoZE0TI2@D*$vJ6$YRiaVlNu^Qiu_6C6<+JVYG7`;CFLc~+Y00#iP<S= zNJIhRpfN4CNSi%NzacbZ;|~HC2BdgFBBdI#vIUpDAgUi`t<O~G<mUV$1VeTs+o^jM zr(}gRXIeg?6S(vkI8L@xhm7pK^tK8j_!^``m-^^R;orG?L6q$GE0o{>lG7ITK)T{_ zO_eF8&-nQuk^I?N+g-Z&6r%2LCrlMLx2J~O?ImON<*6;F7y1V9aLYl@bT#)Rqf<29 zv+hNQ1qNm$?D9E^7}eOn$-SOUp%j{m-nLl#x$~4_%@e9@3%Uhw7UX6E><FML{um5` zFuuJ>dEZSp54TsyR0~<1u4_-t^rNbl0FVdgY!Z)qYZe<_Vs`<{gLZwg$H44o_gFos z!{KiHP|=Vk#kcv({cy+IsY4HH6M?5^Y+;sr@EfS*8uFXqyY#(IqTjXF;s)niT(FU3 zKZU1kFQZ|v4iK3RQ9taL%X+p?XG3DSJ+undDoj$G6y#a-Gc(l}ulb_g+P}}$?9yV+ zWj|mX@_vRO1FZkdiO~ORPQ?FyV9Za*koV1X>KRT%D?>ehR@Tnf=Z)9D;;dtZG@1La z0MM5vnEm{{3J&W+hgzw#dH=IRi)Pu455eWLC%_ao%cE)7gN^|FTq_QZib*s&;&W$5 zfs;f6^f2;Zf3B8K+oS)3#XqbLWY%U@8&k@XIVuSr(Et%vyl<L1Ri$+t|L25=+5>|V zQn{-@{#q(IN{MP;-r*e$OF@f3W!NSc^%NO%rBd2G9@)c+?*z9a{BATZkTc8MY($=U z3GwzVGO2!ZeVYF~9AfXOE-K9tm}>J8!pj_iVbsA?TvGF#gxRQb;o(joXSK;rf+OFN zd5ZY1@~ajag(dUxjUBEZ<CflDl(>w9Wanvt?u|&)#>hHDzGambn3qgo#h_3xkI((e zu8<N~6Q)Fgx33|P0gAsD_$SA1%FV#I(Mp>6>4bGR^_hU18$6bS)z*!B6|XF1R!Br- zp+GPZcE&`6Q*4fz!ZvYd7?u$=*$%|<IuHzTjyRBv|9oVgYjDLL&)Qgc+dMjz&pAc^ z)P=GTle#qj<Hz&Da~u4r&=ib{NjW}#qLq%Tnh64u_fEBWroX*rz4f^~Kn8IDhiQA? znCi9*7J<eh6qVtH6xAu!&wL5%k3yzVuoMuiB?-Ic3M(}CwdVkZ`8a|x&rkOM?_>Ml zkNX+_yA)EdycLNFZ8%oV$$->3;}BGmbDL#RKo*!@mjHV1WR|o#Gvn9Al>QvWgq?|~ z&#aQx`ei_%@~uQVQa_whSXnWlB;(G*1R-AOKfN;!6W>oji_xnUzSHY}S0%Sk-7HW7 zdJ*54A{|rpM(kMb)4*kR>y2btom)?(-KlxUM&#M0Lf);}*HO|{ZWUQ(HGf!q?7I+~ z`%3FC;OQkAzF_3u8}t(S+dnp%;xgRc7KTa_I2J_N*S<Ns4zDug8Ak-S#`R`c5n~LS z;!$e?`&fURwW%uN;>0_7E8EQN{Nfo~(%5<gTBRgfo!~14C#ab8k#6aNI<3e4RV<yX zO9Q$$YPp~**_QPxlvFeYU@7cNg}pBEcr8vF8wR=0@H%k`sj{?6gg?MT|D{gp_vqLl zZz+pD=gLII_~AE%kye@MeT~1kMIq4ZI}My=bpWZvpOkZ4pRbEqEmtIa@v`YZdIRJx zx^zZZ_9SC3w<MN70on_r5>ATU;#pXW?(oSLUB0?7(7NfT*fy_qw0Bqx&6N$>dcF(k z6m;C&0D>|D9<3%j54g8u#q%gk<}wT^!MXyjyGt|2IxsZ(WSP`Z5?_|*#c|U9ocXzM zxkh!<#jfqyyUz9+wq+Z3Z0811s78raj|hq32=ccPF~KE;fCVF^z+n*($i1G0&*fm- zE>}!Eo-FgGpCr&OGt9Y9JF!2rwvh4_)lgEmWF={;AZ#AD5!LS}wK+a%S)~yJ>UY_l zVUIZp^0J>Pz6ch(w)i3P%zTydP||4amVrkDvtj>-3Q!o{hgzee#sow&njT>9|3B9L zIxNbq?H`8)K?DR81U5aiv>@GzG=kEN$^g>c4I+XHL-(Lk!Vofa3rcr8G|~)R0}S!I z*!Q#D+|Rqek9*(m{g21UF>_sOt+Qi&PDDM-@L(AAwb(KLWdO^U`*8WlwCv6w%pZX( z(6-7yx||lj6F1{!Ezjtlon;gAfUAJ3u(ONUgwX`V_FS^BZ&#ntIRUVDJ)z3~c606T zYs*r<Zm9-@io9U{-tWx+QNZLwQ?GW-9HU|FAyFD};Jeg)LA5FISVnI*<rXD-0%yUd zlBJ$oI0*|KNilHq?jOa+!1VR`z8P^QQ6k(_RyDh#Rwq12nwWRB&G}+?ipz1Ao~I$9 zrb<l9Zyl3!jlPwE!NI++O)WZ7!)Up6zl3t3%h_mE(}J0g&fxBDx0YM)zune5-R*5~ zkvUu>Ne_vAEbOqehS>d<E_LQJUXsDGFYpRzA@FoeFMR#JmGj5FI4OTgr3CJ@(LtvU zhR(n!Bhd<yz(Q9x*VUnKjvD0LhOxUM&Mn>7y?=aDtajLD$Wlv(hLicm4rDz-?k670 z5%!6nqo!Q|bQ!ao=v{XaWwNEGD!vVeiz4+%Ab-%_d&j@%NOU99L2yYUM@{2!|GJ}H z74cq`PU|zFv#G5ziM_|#w?I(FMt>qLDl0EmRQ!4N&UC^R$5XGxr^DHj3!8_s+rA6C z3k}nr%}Zjyl_#$_kEPR7^sP<o_n2548W=jd-}!}1#LoLy`#y;AwXy8r+y}_{^*?Zm z0AQp3s9UA3L!j_?f^zBmbe7XlMfO`m2R@sTce<~x_>O<3D_!K09wAaC%DEEAM4Bkc z$gf(iA^G9r(#?VG^v9-<tKiSJW2GZAj)Y&tedh11PaJVc=w-*Ya+WE2ISLE^-ks+` z>Jai$<rc2#Btx(bzw5@t8wSRx`y;ULMs}J&nU&%vIF4&0@&Db<_j_mGj1(qY@gJ#W zx%2y~FYn?0o+~bjxz5Gv8*?4<=-4~p-j@9z_lfGD;6Tiy-1mpm3!MqFZX+6e?eE8C zfm+}|+buentjg~IAYXd1g`N4ybsV<9LOfgNKq--JFcW=L#flu%0Gtbk|G>HU=J%+F zp~kf9W;pR+tnPrh2Ly_g1j(95E}%oMAYu=5n+1;apN=1-4b}9b-6z(7t4Vi&IK{nI z%I$X~%0O?P89aQT;WNCN4HJBEc=qA16_TXfHYEynZvhRTW8r_4-~Ki%ASmm=8hYqP zMWbKS<^SH-gQeNT>S0KS&cU-cXT!HK!KX;S8JiQGnSrd%QpZ6u{c0O#ph?s_NUaor zIk5beL)U(z1a}IT^!GCZDPm992~|CKkll7gFG?joD99^mrBNeGDK3*WL7fPQeTVk{ z1FW<5(`4@lEPV~F5ywR3L_JL2PoJ=l=fx1|?@Y6pWA}aldY1&$K0p2tG*n<M?@R$) zN|rVZ%#c5SPcyyt5ucoU;HZJ84=`dHHYzvFx|8E}=G$efoR=;%yn50A^U7=}ev9oD z>))?He6hzC79P0)Kt4tg<1<|aGcq!s9%O1Xh2;VbJzPK2-hUfoRNbjz5vX%pqUNK{ zf_*D2emFg8Cah!AfS$OI6CYeEl`EKI7V4F-gh?ZG!{50wN*~ZphyxW>!jS)fq$q3X zM9mw*Lc?XL8FxpP$hv`8yx0N{a;~R3f5!HK^DJKwrd5^ZJ*mqPw^kaBeiY=se{bw^ zdhDu{ChF=`0|h(RUvwkh{WD$hw-Gk~Ch{XUV6+M$5Vi|oz8}~CY}4!4kVbg>>5r5B zlZz`tQvX~Ppp+XH&zPUNxSbQ7UG=B3h_0B|(1dTNR21XnJ@~VWFq0o6>3)2$sfa?k zK}G#-+K4NNZ?)|g0E}1vXqx^97^*`>N4r5l9e2j>yix5-(meN*a3vw@w1DJKn13Qk zK!~xy2f7JwzyUTcE^pf?m50i#O@L9&$z34i57Il5<Ul4k@7aH_V}k~Brw*n!UBzd+ z5{*ee>u`aYWEXnY%{jnEMdfYMeZgEcc4j&gz&Kd{yrucK9bE^h18Z92hSZ47u~jLd zMgZ&ZA~G&p6|-q%zr<5$#Q-2Ub?i>$ebQCMCOGm481e8PsM1WS5u#4?FG%{Ia8sGd z?);RIi^IZ$^Qv2`D&MYGMGo6O!0yo2w7z=@$FmYp*$N}1)Z*<lBvc%jU{khF8a&mG zb1l9-(Ul2BfcAOv&$aeM?`g75Z(8<OWc;91Ys6tQK|8H(Z1||1bkfc|>dkJW;?DyI z01qMqu0zr|fmgTDC=X>R^Hlpuq#FKMXOI1Mk>|hELG-sx+wv%r==Qqcv1zAQc=&a- zXsQ^&ufcl?!(*DCd={8QBnk2U<gl3r%+$MrT6voDc(^G)BI-Rgz!2uui7FvkIk{*R zt~VgW!>S9AQGtkmtW>U?Cb!hRCfmmL_bUklm_Vtx{|RdTT9#5uJSMxiT1Yxf)sj}h zUo9dm_|kbWsbT0iv@yA>xRl-qUmwaP2jF$?c^WJ7iCAA?9FqTIQM+<1P=E@$YNoa^ zshHz`98q}g+f&^yuT0^*@ZrP^`XOk6o&N5KeD;fLKU;@0!5B$*1ew5aG0~RmkoAEq zo)8lvc>r&<7I`7=KXDfSwzvapkeGhsA9=3of9@8*O)cRu+6bq<ol>HJ+p*ukddJ{P z29zkA>(Z@*n|&A1t85p9N#=E~9ba$)fa`9%60S1xwM~JH|9`Gg{cWiX@auj#`KGP& zd|)A_b!8Qy;d0vK84h5R0oQp$J~A-g(SGaF$?TfUAIsu<O(}s5-^}BVm|0g+3f~f! zv>yJo#}}|=ZlIw*a4RqLV?c0#^+<l$#*4FAwxH+1qWjSpaK19mATUkkhF=^|{N?)R zCS1B9`+NdF75B0?CyskzdS(FA0~WbcZZHZcVcOYT?h&-KG@zog|GA{THyQNb!0y5N zNqK+~-7w;q0FA)c?t712$!?Q)C<Q>QZhNXn&et~9?E}vTP`ge4xl!*cT9HCwT3piY zS1@V<C_rKy9v^|$!B>a=64edz0El0L>n)Hq>uxt3IJScS+OY)zu-}?4{9&a4_@=W- z`0LjotX8id)#!bIpUYnUC!&4k%;UgvnPETUJ6zLCl8wLDwxg2Y1{%*&Ho+r`yen8~ zc;Nea?drv?zvQ0~vj2cxADvf`3zPh5FfgtQ<F;KvB$coL|1K~8wmP+LL;*r-QXqX8 z-vh+4{%;Wnz%EyOZgfvrT2L_l`Q$^RAg?Fjc>-@EPW0moc4PU8+w!-g-@jrvD1f0I z#9H0Hp1qu?yGlJ|fYm1FmG@>}^5%v1XZz>2eR*^*-8=AJ;H8$z03*P}b^tw053eDB zq*z2$R-qAE-NWN$9e2F%or^<@`R^Q>8fM|jU~84>Wbr)l`Dm51Jq0L*U5j09zxa$B z`vNifpF>pxs`GToct+*&ZQ~imFBbwzLqqzAA&}E`WkMdS?Nv<Y!j2{#a#Q_+IOhK) zT@VNy*N=zA7jAa7Cq27pa<w~BJ}T;8DC5@TyZskp+WlV>Q}ZtBO|o0Xw@HxMg+{`` zHdsNX5|&3#>wuR$`ft7D^%aDp-PCV1q%uY|^>1##p_x9V#=wy+{<n_o`*+={4gud5 za)w~eC;4p*<07AkE-><p$vY))Uof@ee}}07JamVxhwhp#u@h5SzbmypO>(3!=z^a$ ze&^@CQN|n*;}lws<aEQ4M}G_T9t4@kWI)|M_1fdFdKkKBD!apabTo6>2!XByR$|(1 zf1MO?9`SGoj4}|bDuE&E%D`j?I15k4q45<A_|zjJ8Zr6)eqK$^yF^)!V#d79Y%aN- ze{?qg8C?9~0Xalse|+e__^iJuNp8=AjQlkD&SfPV5a5sN;E;a<k|tmsbYVB1PZkel z?bh6;2m?S8JYhFMNF&r??i&}blWP*GJYr_;u~Yxx)rE#{-Z%7|C@0bS1YqLLSGLNx z&R!P0D}gWZD$QTtfHPcRg9A3@F&)t0!uSFGaf;?TNP0wUZ2H_VW0$<BPv+cWQ}Rk? zcDeA|bUlc1RxrcI_wU~a)qT9f5Y7;UU2|RO$<38I<%B7**9^K(zTq82h(Eav$qU%4 z_H{d$j1izuO0xZY6(7AI;U1lmk}@xpgfK%%vC85pgzz;FY;@^g8f9{6xQq1fvygxP zX9f%3X53SnkUBhyk2zeS{T_bWOkIiC<=-i&NyA!K=Tpou;a<w#+eeuNxNUOs^2&vV z6JwGRUrdeEqy=rO4zU_e%FGgmbMvZb+9?*xnN<F5K<l6LasT`z?RHav-`~Kb!ZOG8 zjuv}dytu`D4`FCC@1-Gz0n(6wS72Y~rANHLY-C_44=@2$KJ4AQdwO~%k9EjOlz;)e z$I<5}H710#5n16j$C`VWcK7E#FMSFmx${&fl1pE>AyupV5O?BU&81<}R|3264$Zrv ziPYDzn0V=*j8$y1^YRu0BN}0eVQ0X2_tpV+IF$;i9+#70q2?2j65Yl<p^rG1W(@!J zwr}1K^u_sT*18ew<*Y4oPMy~(2TA^LY3{Z#HwMfr|EO_N$a&=D{I_op@9DyUfsIBH z)FRKZ!MP0HhV{92D$;^ll)d4nIHq89;Z<!adOacn{J(x-z|V7b0B$un<ZqPwtUOn* zeGy3FgSAHZ=j>$+EIy8z6bTD;r;k!kPW&2b`|4}HCF8+WqDVlX6vy#NbVOTWU1&Z* zI4K(_OZj&EJ*TCP!z+6aFP-S+r~S!h5i+3ubnuzEr!K%<#d2&KA796cm-IQlZOgvA z<eQcl1t3_A{pud?h+*_m<Jr+twZel34>D0{8Lh0Kl&TyPj`oeaabOK@om&JQWZa2r zJ4<3RPAQ-BtGsbZetGf`X3S%E#fGDCPaDIJ)DaQRLB+@J?M|8z-NdHX?*F-qnTOY3 zD2xc%wp7kbgFu1O(WUn=5QiR^@ThOVDm*6v249<U*CnLQu6A79|Bm_Bo4&Mt`S&ko zPt=dQnxa|NHs&Z^*<PZyG$41nq~J#nMzFv!3n2%S%q%Q&K9Z|Wa;u&okoOv#GFHNc zN%i^jIp&@&>tWLx_*!vfNBre;`;)+zK7DzDQ5R!oO!A5=QL5-RS8U|dwI`H|e=h2# zFf&%^3mZ+%*h9dIrlck=lXJ0-*BiNqy?Ilzh}$l==*a}2>*>hJ{&_He?~@J2v<nGj zpEX<ahYiZmA}mtv^XT?(7{CzjThe9<m-Wf7<n!WSXQVK=D6QGsBGgos2Jqm|+1uP= z04D>O8N5YI52Ctn_)6~YE$ff12U2t01SFcBUCC!KJ5urB$R|2+IbkUs2|T*x4fj1+ zIY5zs4Jk-}Mb<wa_{aA?WBUwRL@28QLxnP*FH{Mp6$IpK>BmFzZDX?{vA`v<F^&KG zC%-y?z?&G;vAG#BR|A=Fv7)o)-beu4A(%-*pvMZ#mq&6^;QsOQUp?uM?>XRqmwoPg zv2j%eg;;P&xeR(k6XMDt`xF{rgY}q#_>V9C-3Q*qRF!tynSavm*D$RKAy7!*_GK0o zZNc0*@{yL629EO2hhlzr3;F{K;P1161MVS<8f{W);tNc8d;36@hCQJ4Nt%keKX5{s zK`G7eZ-o9-aF_W1|N7erD=>1rfE`Z48quexsDzgoU_%E?pLFf${1~^736N?k_SR() z{aXxX@CCQ+8Yadz`gEYo+Mfet?LNbc#J=8UUdP7B@HZFs)7-H?4KekV+y({+i0i>x ztrW^*fbq<9bdis-fG5h`Ot@?>{vM?mXHvvH!A?#fJz`>#EaxRjVsd$D!DyXp7zl+` zKEYoq&wt;+JQz^b)>=_%{Fa%ypcE!WMZcAStcGtbEsNlU*Xd#yh}R?~SN}edf8Rsf zEM|S!T&Ny~-lI;pwTV%@HaS_@1&8>yG)W9Z8-kDTA1)H~9<#nZJILnw^N&da7zkB1 z488Q;P}P@Mz!6@LfA$Y43~I#(oQ^QE@cl>0!VHK_)SKz_J4V38n953zek=G(Fr)Lk zn~-;JIWqn+waWwSn<_uB5T<YjN=u8nZm<>?7r!*MO}j2m40(5jUFIJ@kQ-zA<@VS7 zfc)unCZp=Tte|{+R^k#YFyn`g#9vyD|0OvAy4a?}^uQzJz}@~lZmW#j+uMf^A74ne zBL(F@R~PkcF>)-d$EW6kdZNhzHa0fYcW>PW{b!n-=e?|{Zw$*@g#$E6GdU?UkJ}m- zFE1~dO01rFhZkUR^z1uc|Kkngy$~M316pl``4H*z2}~NY<<1Fy#N_{fO5a^OU3hzE zxKuw+TJ=E;;7#1By9+R4Y(nEdWkekO7yG(tKBn?Ss;Wv#e76wbl@Z_f59M1G3Jt5A z?mhymr2!VqmxAUW6340h!oi+vxuFOgC-cp_7zo;{%)qT>A4!v*_^=rSpdvxsGK~MO z34W@q|K~BweG#(y767<XiqX-S12vmB!`?B2sM<M#18kUFDX9MGBH;mA5+k?6_uo;9 zfJAtC?*o&6GIcgT5Yy1uYC!<MAIwbzcxsMjn*UJyNPi*Qdgtf)_`>^Dq0n2IwD_cT zf5f=mbOiq<q}xkF?$>_q|1$5I(j0B8^HdT}?*$TWD?}Gg;sD<4$Fd-vs9ONP|0k}M zCNO@se%tg_;*VmC{s5b$!qZ36f*5Jn@c_m1ACl(T#A6N+j2^)~d919Wl7HwU>A=7Q zI2R8--+1%CG{LX_D`G6Y`}xU}CqGj7pXoY1|7fD3q%E2fU}I?LqhzV~0N&~nb(k^7 zY&U%?OzI{VZs>E_gi}XcVg;4x`Aq4K#3z!9J*3RhVhOiJOCa-X(Iz`&9Cwbod^UnS zBP|<5o@D@jH?=4+M}ILcaXRFV-?=|jWOiOe{#SGsrpK&umRFn-w@_$2@yt}9->sMs zuTpFCLtGv(dL3L4VE^Or1K`J)sIY4ruT7{C6BEPTh(w;2exD3w@*0;6J3<AJhD$&- zMn2mF!kaUnhTLQJ&t+)62lN*eTr+jw6ywApYK00eeGB`QRD8*$e_ZO|$L4DOEC`;{ zGT8j&l8%3h%ao$B=8vJLG086iGO8hpO-$5fZ!@34#7)er!4X=E{hH!V=YB`9Y|>J< z+#zc~eXo{}*j27@s5)(A9Zl5Ic3^~)>ddJDe?8xuAn#;JIt9*2qWIN0NrRNJ_RL|5 zf#5I!cf84}CCEMVqk-m3kABP^zI&I&8zO;?85r<TRyNH3q>^5{t1mtAPFnR|%;6!{ z_KMnx$}?>K-)hc#*PWhD5-O_Vy<CqOephe!L_Ob1gw5|+2sLT!a9(lE0d2Xkz;6bh zq>UdG>-jqJ(*DZ4XR^Qd7nLF=*~BtaPPp?tuboV(Op4>O(1Fm`4_O{jL)TE~?pw^A zZ)niE7<#Z$PI?5yV&%&*4Sci0|Dg<=)ik^##-OKmnUhUBYoh)8Deh!Wjgw9Dj)l^O zp-4&42Cl4y#pMnEmCC!R{Utq?$)IAhWaNpWAm^=jmwo^i!<fbb2DP$5m@sy)`i^b{ zGYJZEkJHSzOTIt6+7GuFHV>P0-8-OQ-A&v{;AUXvk<i&86O*u?zLh?c&``bxe~sG; z?c#Xn`zvi5!1Xi~TsAUvM5?Szt1<KX-vR=7dVmqrh>+t+-~7v$SkA~}rj-HPo21}i zC`^XRt)nnq=vtY1Wb;6RPCP?gCpa>=y(!~xY5LS@%OO9OP46MzVsA<a<GtIzA`Hl3 z4YR*^8}8go&-OpblwzW9{}!X(<i%hGiP?3%2RBUfgoT9-<ZNCKiwG-rTOEw7Ti8;B zwb1HTFdA^&hUxcc#uUUBMDpIlSt_LUHf~mDsZ2{MSoyU!dZ;RW{<i)Z(#{%3tLH<w z&3q;W#h=zCaE^TI9hJmgk;a#%G11YP7MstA$;nw?n#!J?+SO4bs+SH!)V^E~VULf6 z>*$DJc!!^Gy8$8%@M*S}&3rE6>aUK08bFwnEq4iHP+#qO(0Ug$<+2u#X2LEF%GZ)T zSa@<89dot)qZR-uO2b`T?8wI9<baK!F)4~$wna0nq%W9~=R0J_)@%fE(xDy_ReFva zYcvZRv!`jPe{|Xs@c1~1p!?NQz$&1pXW#3O(k0XZ`4Y)_5cbygA<tzEAp8MSTiR`? zt-d`lGk^(j#2U^R3j)?~CBkjWOEhwwZ0;I8(@-q$Vl!5BThI1?q$>tm(&97=8f&y@ z`?VwP;DlY;)BCERh8dVP<kVPYrn=Gi+5PhSuiyIIRJ@4eKK<#IZ*+``wD$QZZ1gUW zEV#asszG^>KgNkOvM!vZR-rrWq`ottl(QysQtwyex)#^V?b-poiWBiGbCgr@rKQ3B z%{4Pvy2;s|<ddFDxvoGB-7i93U@47H_w=Gwun`;D(t>BVCDTl$_GGBs0m%@gMPEU@ z==_&xsCBEc6GOV?$caOL&SJhy+si8fbRP&dD64h7?G^UNTbI}`=FY!@&J6i|WmP;T z#V?vs>%$h6K**H#?W?FrO@!1<Mt}dkhM1Dw>+Ab#UI_|Q&#@W!z2;v5-jaxc+^^Cc zf%$+}ks=WB_R<mort@J8MHRERh37Ji*R|f{08x>WlD7Mr*A!P2=rR`95SrJ_i9)Y- zm{fn#{G@T}@k*F&oERd(wzhWr&$a*cCq8<>O(4;Axs)K9VZuF>YnYG{fy|R{hq)l3 z#E|`?t_Orkg!$9--hK!leW-1FC%a-X`+{n&Gb6}bNy3Pl^B2r4q7K9w5k6xgmOuF? zP~#zpjZLxiasKAQ6W^Gat3cQtlc|$F3rI9idv>;s>h<<(#4+GqGzT-}DP~j7?Cm(# z3eD=0_=jmx$XF3EOn6S0MswgLqx)AX9%2ea+l$|Gpd|7?QvkvtSUwqYd#ZwAx{6Aw z(a<_M1sfZ~i0iGZ&ZX}A+KBVka*gGcj*|~$McVh3hCU@85vUE2VS&|%#cM8|)X(Q# zj@|=rT)3KdNog)c1j3e>ETC}>{1&B;(>!(Px6y}(sZZ`}!&>dUP^^G)P31o!DK<4J zyd#3z=u}H$hXb$rrqw8U*)0Cm%Vs>VR6~IP5sc-vx5ns&M&u`MSWhSvRxPgP{}#@B z>F2`Sfzlvm@>MFy(iGe_AR)XMIwk2Vuk7=n$&tV(&!!fz^l;QDS5C()?Wkk?C(nr6 z4WCaO-#LC1WC3}9%tR3Vg230QVP94N5BA-=xLugBOFkC;H~|fx0<Gua2Z$Tx<(24R z)<=EyVq!feY2H+e#t3dvG&DSE7mX*Wo-XLrR&4t4ous-qrmRF<c1OASI02eJX<^j> zWbB(|Eq?OOUo-PfVO${bBh!!D_A0sWPYH6^!76pgxBm{YYsbyD%GZX_><wT6`KOYI zJM8SM^E7%dQPeePh>gLS_e)fC-K!#pUD@ac&8Rik$Il{O1=##{JNeT3FVp(xGC&5n zHz5SRqJYBqw>LXs@l#u4gF|m@M5iWxA_bEyWPONXmXw^Gr|!p{Kti=r7QR%|usTGt z`s+03#m7V^Xp0`<MEBgf33-I`diatz@|UX0VE`MTzm1Pit@zMdu_jl;`D`o1m039+ zvdgYRXgT_-C(R@lR#eTmCQ5mk9VsyD8?TD7urf0%KYt!{qdy=&m&LnU%^;y5`lU>9 z4%*VIhes{yM7{Vd3tGNb38)A$Ne=2?Cg&?JR+EqRY3eq4T=0rogm_&~z<-Lfs;cJ^ zwEQjSi+yf_`Nhrz9>z(H^$hpcZs0;~9x~EQ*3fXmk#4kjEy4EBb7o+DFXayeUi|Mf zazRL;5)2A)aP+rt-;{vxI6p3Dj@)0R*2d3%Va3C01*(x%W2Lx(={dOW&L?&gB9U~w z_RElzj{(@0Z5B`*NcSy&U~E#V3*4y(AxDbb1wR=c8RmL-b~}xx5zOy&T8pgbcKaN! zIC<Ky;Oq>lNp-foOUVTKXw^&P2t1EhShJ>VD>~%q{26#6X_pWu1Ij#6^uahDV=niD zi8&<CACT48>k8UWF{B9E!XJDQU94Jya>TKxF%oQ6YuFXJ!{&R^#K7J^g(Pr|`?Jr! z-Ac*Rcdm)2$yy01*0CKMq1455gXyO}GS^&HRrk=$Z0+{g;JF_^nwNHEZE{$>XBhoA z<NO<p+?$9@(a<!fnYQ~PFilT3_0N#9b7`k98pT2;(AryNJl>DA*j(JgNc=XE5cC*` zt{45}Kl%8tlnn4U)mK+A5JSV~hBd1Cr8Z_EdK#N?@NBa;IhhubcF*2;ST-Z>2ZwgN zO)Al#SuAd)jaRlBi6s|v+up0%sJ33%A6@hw8#&)kD78Vfkc{lRIB>mq?Y^-_!NPCQ zKHTxsc0lT|r%s=Rl0=k6YRbUfP4s$<yBs6y15d@6SaG76*&wlum~d|$`?yno8!>vd zJ!mi*+*a$j)2?Qs<YM!-q*obc$XN${!GpcCkRWF4^WD-!(ylmFtGc!%b@*O0ObbFR zz;3?(Sx=M}1HrifzWaablR(a!x>ef&oX1`@%X3k}4YxZI46L-cSsoQ}*h`o<a{u<@ zHc(TeI>Q~jxoSkPS(XQXwRvmIOa64+?8i%9ph`sB+mVwj#YpG3SDeE&@u19#yo1jF zWJQmZ8ZudCoxooSi(31>U6f;@kFT$FfaK9pXpctJT-VZH`Xc&2D{B+M+;FgwA$eVQ za`Hn}SCI7;xL~z7`*FU#bOU+x)ib7T*(2~)UptUEG1cOgFoLyh9GVwAJTKw-p>x)2 z?H?z|SkpcgjMkVO4Ineh94-CObF6>^#)rBBzUcv`g+Ia(P;hQO+QKaV*I9s;@HkIB zb8hI@3Tg#(_HePt(8BCO%r(}(g%7F%hW#+7^vPWI&RnEas7aC>GBH730YJ-4qn-9c zr}0-cB$cEhl4b&IDroD#8xuNBgwCqX;czqL$Y&&AALuDW!H>VY^8d8s2w9LY_4u^r zyW#dpD2WW*>ZullAaS)=Usn4n+|hA+%x_H9-~R;mZ8I`r`H1GNB&SeW)u@Jmw!7|b zt(B87i@xCc_4BW;nOEVSZ^&ay>|qrB&Qep2xNWpWpz;4Z7z4)zh*5jX7x3+T*(c3Z zs(Ju7^{?eTJu=Zd92N|VKpEK18H_M7rD$#Cd=Un0O*&J-4=?MwYxEpmE}IM}!D@M> zICjgX5~=o*f^=ZM>4Derq?0pEl8}4$Fxhpie5)du&iUd>2ENdgN1gadU$A<m!ZW?% zAI?dlTxKaV5serKD!V)mDj~Za7w?_0)=Z67^2`_gADw2tU?d4!=BXqKBL?MRZD;jf zae&(B9PGjT!!SdPuqNnr3#hF_P4^E8TaOnSXQw+4d>uz-7c(J%)f;Xftw8Oz1GycB z><{PfaibFxUlagyk8O;1N)Am)7`(g~jnkMkrl3n}8B=jW?Vm^LGM}DdYLB<98_ciJ z^K?v$Rfzezunb@zCXRL$vR;)*pu6nwflABxy{7HIv`>HdV<H+~Xd>48=P@lG*Qi|o z1_)DW(y`Q$wS4IdW<7#-zJ(h=n)gHRZl2b83@U*eI5$)WbkZA)f=W2;Yw0LWOG-$j z$-kxM0u(ILa*(}n+NZ9`YP{C-jiLM3Zs>lsgLmCHcr_N6B|mvw4``$27%21Ru|Pl_ zalmtPb6Gn_!)sbSbNNXc7phvc)6aQna>N!|vQZ8DfcV%PuF%gQo9PO($b9Vy{@FbM zPm%VT{Z2Ng(=lcnnq|1{vnb;ya*qj#oUSl}zcOt;@&BSs!c0HAN7!cPG3O1qaSzw@ z-$lHOQcf2>mf6eF;*K9ZR*N^JeBky->|i67%3vC473L#7lE9(VQ?tq5D_Js*iGf%< zc<Ug39Rz`X0R}3w*w^nz9GNMW4mF$#<{Aj?kqfT8YxMem$!6dhGbG9(-}jsTql0Z; zDT6q0YuP8ZGIsJ3oox?Fzz>xuXGLwzejR|R`RkP~6ZBru&vjj=gB6tbHXN!aOPo|% z)N%V9Z{s-4hLC%V2@H8<<Pz4H!BE_V8v*%t4!c|xoz?qDiSc+&y$56EcFY7+Q*36P zuddBVr0M;1gy2cia$k$JIBrL;*jjh)4A*4!1__Mly|psduq%ARo|5(iOxQZws|gu) zf*(&qW;K`v1uyc^;DdMqxl`o6J)_rcYr&!z?`rYcHB+aY59+8Ls#G(S3W|-V{bO&u z@S~_g5KK(;{LDJ_)U1^P6OP!{n@v;&p!PDE^cv215Y_wkA`V*+YW|9_{_>{9!9v+L zWKktOd7$Agp4$NKhxY?j_wj>uKHD+Q-uh&Ty#UPuulgLW8Xjs9r-vK0u;Qh=^6#h_ z%B)9sN{b;Pfv(82=uP0#sP^fm&e2Lvoceod43VOpDyLSOij*r(H0{91sKskt4>y6b z5rv>lCRSIk?5MGK+0nemq>9ZWoxi4+Fbx(TVB31#TUZUii#Z1KuU47O+A@aM&1uz4 z0Rga-ssd_8@Z*Z<g#;7r_C+oO@Ob$;+;Y$yQR%4honR6JfpA__jD-4%pR%VkkoX)O z<v<0!pKU3B1vh<bKlr%+8#RPR)aK<|8lnEd*1Gr45FFeM6DRMM_^MV~s514-@YRqL zFVPc8{}TxXYN&xqX1_NbX|QjNkH<;fORt?qS8Hs3yXW`~C}Mq7d7@$B4|D;bPk}7M za@z_qUHa4R^g?<BU_ugnD-5CDRiV3@`KkL+x49p;>ACgR?k<E5IQmHCgazbZ$Ix4H z5~jcB=;*jJYC<J}7Dcb&vE0=g8qCJ`K3I$MKc8H&Y}jhbgBm1yXu}~~SbO9|_O;vP zxKw9%fcno0?V!M@A+wtJnL=BR{ov%?7#jX7h>vF0z1qPz`!UGEPD%PR0qZk}GzcNm z^235G25+HLtW$J%L1$W_7wRivYpXBCh?@3K&v_T}7XQM3TalW{(i9R#ua$tm_uW^o z_o)IVCH972#UbpFc$cg%Bfi&ny0dmqjjq?h=KqnY%1Qjv@eXIc%CbRUelnvSd*HoW zOP*5UwBtkQZ#4tet}8!!bfC{Ix@T$M04~#(m3+j*&eD~8;BRgHvtpS8tAuR_NU6ub zh{}}}y`^lbg}9><3EP9F)T-Sq@5rftkr055t(#Csxv8a>lJP^t98Z4BeKPl>w7U3b z?n8JM)2&U*ePXM_X`lhoPqa)Ev9J7Qo5O6q{Ofa_h_bK6W7AXRfXafG_O8%ChIcP? zzs@+gfZ+vRR(s#<AQL?=uUWU{vFlf=X=NvM&~po+g)~pT=Z#F(CqYN}ZFz|F%<3Y# zkrM_Yl=WPGq{~mO^)HuUEzDQ@Z0z%sWFh~Nl0l49@6LBZ#+#OdAr(_zI&zT|o0k6Q zf)Mpu4`BKOK0;<D-M_rOGow{+SSWJg_3D&*t09$|LI~cJ^m6fAQo9rldXTq9nio{2 zVY6Ot=frvH@g@MCo3(OE<bBNLV@q2xyZsvMGdt-%oe-7LB21;3=Mphgy{0ZgOv7c8 zbQeyu!>yH<*_9$Dv$NE@x!0Ws=m<ULcHzH_pHh=CDIx2k?(a(NJ&a#{Ej~yx9$m+` zK0qeem8N)zzXQ?*uOzE*adDkY21CIM9VQQSvIl<vgj*Zd0b0qBh#&DO$ixN$51A6T z(5hYID7#5-#G4UQ2Wf38or2@^+P)7Z`34PBgF*!%Kp4=L5$SbK7OU+)LjQ+3jJo~# zYGHMxDM9OMc}DVREa2Y{AO^jZ1V8ASY(fj7V@_B=)_L>qsPD<|jWmtmrEivsA9XAH zk@?#^_|{{49F5KAa@K!ywtBQ)b$<lk<n%aLT;x-oGiMZG+hR|;Ji9>t`WlZ|51{{x zd+{(3BuL+n2ie2V(FauXFL5I+8V0jfWAn6nrJ(dpcHY%k;QjfLLL*jXsl&&6Us?9; zi&)7`eD-2Qo~c1wK4XfxZ^WYMJcjgyfFb2odjra;3#Vulke9D%zech)x)K#i7fZ$k zbsDi4zJY<rj|Nl!rTTM<4=}o4Zd2^DBS+5Ow)oN_J-}wUMBL`^4#mBL<>`(|iNeZ{ z<%XWkr0Qi#9n)!Jb$$JH`V$z4+(C1NhO=OCWZ6e#Lc0H|WeNGU27VP5l~fxZ{m5BN zcy*IK{MLo5=~M1gm9M*P_Noc)Ux1cikQEch>H5<@ijdY0F-0eZm$;{Nl;ogq|4##v zL``|=23=b0Z;)A2bHxV_p63Pj3}P&7M*7Dcp7!4oi!+<%N?0=9n0<TR9m}kqr;BTW zkk~!8*i?#SlS$16bm1-;&mD_t?LmZzTPncG&(ldU;jAO*himJtbpG)XY1JWXc^=!( zo$NDeWc`mE4iFXw4d6a|EN|2X2?0ytxpgq7?&rsDn^SX$a_K-!KC=#w+!uD%>2ZTA zw;|n138~^EU3$*IP4*+Q#=~tM<#%s*@Md-Q8%(l{YGO?iR|HN+Qt(SoEXXk7^lSWo z?TJZW!>aBvU^FR2FuD)1GfJcwLjt*$o$>%Dfx!0~QmE2EyXdUD<i{C0MIndW1hTUb z`RZ={$&R(>XGH%;it0cy5V{dgw6H=}AU?O;w9_lek1@^;bt9;q^3X6sz+GWE5@iAT zIWc;#ffSI`xgp0z<ZIrW#0n^Tf(-^|i(W{zt39D*4#pqRrtlNYm!^?MW21G}Z{`Dz zKJ+uGfajM*w51PR3PCk<DP_c`z4fN#$`+l&ROhiRlM&jb$o+Zz9o^IHXBA$V{su>9 zsJNc$pYe>K_j$0mItBu;ES8eEhjk}aZUt*6?g^=`+SpaAc^nVVpOt#<njd}9^mkDs z67SPgioZc1cz!TWc{JOa4sMO`mu&?I5fIC*rNmuTnr-Mi95({@rcN`d-jhL;TE+|- zW?7L|t&bSY1EAXpJl$Mhb&Af6dc-yjR}P<hU%-pZck(ni9j~r`P4`-LL>!}}vQMp# zHfrdYOzLX~YINM$3@agnYFCXYsmEWia}*k!Cor+FC{@AD7CyeoYwuokW2}DXJy!1< zTDw0Y1|L7UYJarTI|<`VaAt?vmPu?$lOW(`u(D~XGhGf?H*ZbOD|dmr>G55xRlUM8 zP)o!_9sA@_K(792MzJPN*@^oSH=BOx>r|}|wVIMe@S(b_i205<4sa?k_xts9YPy7x zpQkM{5r9&Vkvsxd?MIpr_*pHqBa3QUzH67)WFLPTFBGz)610gfFgT9~9A*7;g@)P# zGj-UA*|V!24JSKN092EG8t<FiY|rhA22=>?BpHBtro|@*Xi5&Byd{_Bg|d8qesXq~ zJrQTY6MGf_FkJGy$w$d`-OIVoCZ2flxaRQV>V;orAYtB>xPX{{MOB!PEWmS6y5f4I zxoaWA-a1m`pHgZ&*x}sm0X*V<Q3{dN@xyGjbY?V)&Y}9n&Fx`qXZ2HXzFmdW0y_+t z{os$&Ri34k5Z$q)9X)ObqdF*yO$x||CK%^<O>P{bOpujIahz;gJf9eZ4E@t$*|i2l zMrM+_j4iy@RiJ#6np#9{$Tw4aH*|6bL>6PZ*|aK)gwS>K(Uc=Rie%h|^D8<Hes!Nm zCqKx9b`^McAzkKJI3W3UT0K&|)l&jD^v4ouHcJ;HrOZyN_j}3=%WWt`rq^UlaJ*`d z+Y?J!B;@MK_bG?^Tnr6U_l?!JQ^VDJ#S@yltQm=8^e24PG>~J%sKsY8b?JESn;O$s zfz;7+0oTnDkxArOU4cZ=hplvfW3$sHWs}`i&4S|)r%=z0y)qBAjM&X_A_<oUadg+< zfjLy(*Z$<kn<8+qr=-A(!lM0f79Zo&kN68?)`bVUNS+bNQ<ti;Q&Js6ZXIJ_oGB+N z$S?h9;)Ix6XJbMg30IammXmL712mYGk-Y!;ZltGwFDq$BLV|T+osv}w3TB$NH#X|) z4?rowZO7e2T$Vq_a%qem`+0_lOsx)ctGF+hEsml0M~7Qn(}3xZYV66I%*V6^o6X0^ z0A!qd0q>sgBdHZSyMaxdhC~Cy0uxk%YeYyFs@l2Ry6B8%KY#Z|1%d5fnsDmK3oi`Z zKRUjEPhwY=!@hvmesxp}B4(9PoHF2Jc)Y7hQR-1JY~i>B%QSS{oHiSnNQ}$Lzk;E+ zsgcuwEYdu}w9nAP)A4m(tHkAV`L3X5;x2taw2O)`KniT-k7A$J3=XxEFsVVsd#aO4 z78Q!7PE*aiTL53GA>(Z8Yb20x;R41-$1gMXtAG5KG?3-2^n}nm#TR{`{7(77X4_bq zGOK5y?Te?QQxQL#8$i()3Quixv~G8>T~QIkI<|jqDdn!p$@aU%?uw}zFWB0-slm4h zzQ&Uof728>IBLevnvOY~EJ5hnqXfLH2tNi@9iNjq@&T`hI=zk$ML`C&`q*qwGCo?Q zBW&r3F%YC2^$<y4oL3UV29F+>ZE(3}8la}2`}ZtV4zMQpzu)uN`V0y9<jq)6D&o@i z1=9B%2qqRdNM4rZP}x<g7FO@zQSdsIPJ%;t1p+EPwhj2~PMC6xEcSHy_m-hkx+i%g zqC+!lGYPLkUoxzpc^Lvg1J?-DgW|`|c6&LpzP_14_HJzYrHZ-+`JC=osA|chs%MUR zb$o75#IC}xsfQ9$Exep)avhSM2Ikr*y`!AEx%|j=)w5b^f8LY@r1O2E&@3ot(%54@ zDs+BjQSBu`mDO(!d&}E9D;6AU8}yN0)HKE(#@zLl)fPru&RO)2&{cSaO?gzSyLSN$ z)m~RKqE8iXN3HjO;H@|%wY8*IvJ($qa%jyl=aGf+i}O@|tD(L@GM|DK$r|@fn+KVr z`lov&Mbo|(K|fe(7g6Xe!z%cQr&f`1_sckcw-$EYPw!op`<nGek{r;3ZUo+h)ciwL z>viSWYA69aCfhObIb3lICJ<~oQZAB~m5x&xJ!XaSp|YGfgw9NM6dPJp_l_gIjbyF~ z64;JQasczE<KL!++7*5HdO!G8*0JcY<mvH#w5ZVJ`;sImpA(n$R;fi~p?apm?B}^0 zl<`NZN&j=-0l2KQ$lTkBXRX2`E%seFzg4>;&1@w-9!u@chFC|qesZZ$MtTSNdDS&| z(n9U}$0%71r3ED=jak&7-1f;t6q$lX9<$gZsH<X+^XZ&C_WEOqdSCpe&oQ4ZxZ)j1 zo1vN^M;J9$W-VeQg<f-}ko>WrS;R;%MYuf8Ixlmp=SptZviAsRS9Ij5mDOOH`$z)0 zSm|zU#CpA=q9UJZ3$>?NqqSSi()O5jQ9KJuz^Q)o1_hsVVbw9a8l6!e5e%57!k0N| z_ep0{du6D&ZizhoK$P}UJ>q93;ifPdhWlrMi37^m_5RYlWmBsd@3*v%xFOdlZVYD& z(yr%3T!^r9oWAtI9MLrSsX?rS<#y`$=Jiv9w_+feFV&QDI$Ph)o4TakPtCTpFTB#V zzASl@c=?|0H}{C5fbXC;qEVSz$fZeG!BH4VOPho{okToWws1??=qT=r5HNeWs`)na z^PgED)zT}o-%ZKYR8`A&o@+~M+lxKLYwP$_ysL`FgUg>yah&_rY<yqf`@FzGSI6dS z@z%kMtjk2YT5>>}TYSl9JLP8kQiBgi%rq34Utz&O1L68t{{4lPruR8wmKSyvPU*8Y z?eCDBll?4frsLB_z?!NC0vL;VKwkk>v+WDKiWUugxK2W?Kg1sEwl8B;6!QwMj^Ae0 zrvxLaW(9T~cblA3ciA{@)hA`7S9ex$-GT2aT)$vD$s%1@V20EOvk{{h$i4z|ee%OY z8po>=Ht#j&FQqHv)*{yR>7S(QxMyj48&%2^R8)VhZp6?lfag6MOZOAiCl&ReCdlVD zF8!imsT-Mr_^O8GzRww2BNu!XMhPb%RJTrC->BKVO;FUGgjUMCZ&7!~k7cKpAx97w zj6<l{a3&A)uu4DLHTP<Aq&!~h&nT+XOOAA1op=#)Z~dv6SEKqVb9lX5{rOode`}e} zH5`h_ebF}$r3LR54Vrh;Ldevl%<>|W?K>z^`JB0|AqKFLYdV{$;-1O1$H^7Mc2+f` zOK_du!e}w~kr41?QBKxogPAcScEM_`z81P-+P?xbN*|%mfvSdC<hZ@fEwldQ+Lf5` z%**$Y)uHcb;badQPKlsL%^;OpU2$|>^-NI5CIAM+($|}m+BA}D%P2bE>5}PA@_NDE zJbl=BO%9`cL|dA>KzZ_>gzPkOU1<!+=CatPBWGMjO-Fr~celEQrbRY$k52%2&B2v~ zskho)zH8fyJtEfUohsON1$i~jquemjQi)gEc%#<*9s@*4%e>!XD6JNLG@OmiyhWZ( zk#mE@p8dGJtK22DMxReaI`qjginOUBoyf?uTR=yT-rU{wiUp(jpOvyppW0pqh<*2J z$R!&;8F9{hTpv5_?N@AG)O83hIVoctv+~a9j041gd&2Z)gllJJm&v$5)^F0w$+7YF zuO^oDNLS9FX=aT;Qu6V)&Z63pYLXo9ch^j)_$y`h?4G4`(fm-yFTI8XF8kaX+)e9B z6qoDiF70N*9{0@kOP*F<8>!Bap!<s9Cfl94DFj_Z5g)cfcx6iB&$>GUx3uuV;cK9= zwL-PKJ1sLtma0X?L-x7pTz-^qa-swQ>+eN9p8YEZ+Nn-9KB?jYhuB9ey+a(uD}FuP z8pdZ+Rg(xaAg>>{k;hzxKks^wKw|;t1HrV;Xg#+2Z{UC?X#x59Jex6pib|-`G1#S4 z85n<JeWydh@{?sh5<eC14Zz^;Cf<_3y^hJ&(@!6AjcVMLVcH+kUGnw!eMkyB7qE&a z#sO4sqaNN0rO`gUP03TBU`s!LSk?dyR^^GLG-r=E1L1eG@_fZs6nGyeWKY|kF4aJ~ zRVJvk)Cr+ye83*GdSvoEsPH)QxtO#$5eYRPK4II~>40~tMN=B-BLQvi)rl<m?^|XL zx<ea9k(*qegSbmoSA91mSGp@Kck?Hv`I)ce0ImcTQ)hxdbjq9_8GIF<A@?rMeag3Y zB`2`XG8@wYxb(BPHrz`x;VhcPmw};Ir{%rnyg*pC!u5jIZ@wLZd~m81&uNK07i2<} zCRzt_pY#kZ8{NZ%)A^p{YW4FS-W1^UnVD()JnUxC3pGD=lC8j%bhGVjb2V?Ue{t?G zT6;Ry$DXGjCsMboYifsad&4zvE=Q1nx=+4zz(p>naMG*2A{*0sE3>F~W=R_T;<4jM zSFY-H9gg*Kt4VGTXO8!uiZ&ex^{bAyTj_8Si@H=SYDwHh^~cp^N33)WJi#i>8$-tA zb>8k3?EV&RCOF-$yE8J8Vl3-pWl?gdiFM%@eU-|iP^dMBFo=p8kB;|*8JS>yP`ox- z)2pet{^O->j#|nct-MtG0%JHh7Z^(G3X9+Qa`n+#cd9(f_59G3s8d6Yrhs~#aPeTd zznSmz*Ag$g-sDXjx4y|b6N@cPa~73E&LSSKL48=!Er}dF(hjjY;AaICXc23@qFncB zy)_^I!4@E*Q3N{rH}dIr2Ch_H!~t->{?(y6^bLoJvhGvkkDbWT^99ZIVY32;d@YOh zblG!0x+}}yi($@Ol4u)z&*jGKvABQh>ia`z15JtB6h7}Oq)xvCSF}~H%Yz?uDnB@g ziQ;`A*zt@Yim=w)?IeGZ6-31@YQE;t-%vo?d7BzC%v<fUPQPp7DKI%(nrGusrspoL zjgu&9`zl9Rr8@X*^jY5*znyP$t+Yek%YMs0FV|FJUvI4zh_Ii^!9ZkY2E1<nS}*Qa zkK5HO7Wi_GN)&BZ=Zaug6uwQ>e{~3A)4F{+pF!7zGhJ9!SuXCqIk$5dkb%*va1FeB zyPby=X+qiW+!Nkd!UsZ+7;JVd^Ug_xX3duS`FiV-Ufp-w1+cAgsiI2(3x{druv7=- z<*yv6P$Pm_nSgG74w5>?l|%7+k7$aZCX}=_tS}HQs43GtdSlZNWg-A6FeFeN-^fa# zv|oZC>tWcv0;SLd6Jvw1GXH+OB|R}-lf8*o1T>tKkYPoR7gpap2~{i&PLC@TD+<$G zMw0nmhH8&WfPAX(dw=_??G~hjZS~Eb-SrBx<Wn-Dl@x86nC$M<@Sw3x8xnmjo*K%9 zfh@X?zGsXQGT$4GZEui6h94(Pkr~N+I6o<QbnS*uyJ^O_z>CKw)h?>J^}kU&4enD? z4n0lOmV67OJI<~e?`S?8lH6Dg%azc%@bpGa+zTG2%<O4u%nDUv=1nacb9k)Y?lBn` zb6*9yBBwa@W%tWM-hj_e`uq=ZaKOPvtq~NKAw!a<oTuy^)oLg(4%lC?qF|-(!<&-4 z=0UX%#z=86S13$)m5`fO(&r(N0_!sUR9;jkI_gz8h#y~Wiw??xm)ME<jxiP6>ovUC zPFWP(k4ZBfOd_O#3RN^#bz0#cw5_>j2V<F7qbAAq!-NZV`%s}4P+KY|E~`pSm;(#T z@xm@oeQ8te$o+GaEX+NER$^i@cC}V}eP}gpL(znY@~-#=v9=z6&1sB#*ZP)%KEYUB zLtU)Jtv6-sMMmt_C$TG*oASZYltVm^K@F2GhLKmV5k{#=9(8%q4NB*3+$+dc+oW~s z<PypnW(KE;y+js%THpAz*^J^BrL4U{*k*M_+e8B>lZT1#Y{@tcJ`$=Fs#u)tRYcjP z%^!^0my8k7h%ymus^T`UddK;t<3cAIPd%M26l667Mxm6G-VLNThpqKsA~<Ttvq3^r zKCO6b#?Jd%s)<sSCR;l|<Ho$HY0;+Ev830C9%)cb+c!lGv)QIt15Ga7y9VsBYPfx? zp)jZiJd5Ny)at<zxn=<|+}B}v2XLU!2Wj&OT5NRec!V_L!IlCjG@Syj84^`9O5Rh! zjz5m{{L9+~pbSjCTQ=R{ynJ4@IZjeyUy}8+zLQKshvR|zv22-xd}xFbxIG#rqf@O9 z4C3JFEww^g-NFSpkZ>@&JGTB5$LqM7yxMIAOseQvKiOaNdF6N}Aiuosw1;>XHMrq4 zuTaXJE#~U+A#It4D(R<YAz_mi7PKxE7<_-86tFhfE}F?*D{co}Ue78Zm5fQ0c$6an z6YLChmA7Z5Z67o|?`6^38J35iZNB?K#H5%7w|Mi))V|O)Eq`h&bYgVQ(gGEAqm2w^ zl_zSf-;U66OKa~4SbKk8Mi#bR#VU5&yn>mDNjETM1~1G_S{uf(355Lo-!spFsj&*& zHEYDZT>O$JTc#vfd#@03|0=e@-AK4WXv1;sfy^)=4_MmQ5N@Cbs^1?T?Zzyzo)bry zB60GvM>OUYw}8(Iv<Z7W-oLynk3H|S37emh22v(teBfxc<v8*EiF%=-9!zoCpT8?d z%MzcA^Xa6OkxZpUYSg$s9pE^(%&dMs_F46th`E+G<;RirAWJ*vWI01^0@h5^G)xMV zsGRKQa3r*dCQV;@7Xn3%2ejU$Np^ORyv7f*QBoIqW=dlp*G6h<V-6A=|8Q*%IjaQ) z)O;beWkt<Z_;`5=@&kh8fE~88grhti50oXVirQsVhh^8_lj<5Ik7rt6x0^mY)n4ZM z-bC02B*8igDkfLndM~Bz7i<*@Vo60333>OuMaK^6SWE;;dpBo>nPz(JTdimt58Ddl zdo1@o+pQLRK~tnHRh~2BJmTiw+&web2?+BXwuyBTL7Uwvn$C0YNl`n2kfB8#)YZou z&s~E1d`%_?o;%4iVOnWxkvOw(#1desMj7wFSG)*l#!vS*vL8_@SDFI3MuSYijfS4- zPikGw-e{*ebE%-~^l<>`xAw7r*tc&O#+yarP)>R5+Uk9N`r+Qm*0W$)DRD^u%B@|) z6I&<=0jmC}1vcWXQfWJRe+&?n%CkmWsxBNN=<#MSPGg+gWYNORm3*`>vI(CD!WPr& z`O1w7yTQa$RPJfxDMlDCORaA%t|KzD_f384awe&X3FX9eG7)M42w|MrUjj!=ncV<; zrle)-Yu|@@J;dT(HlCo81;m?G>}7?ef7#M;Qyat)RG`Nz_dQsQfC{$_daSmJJ#6*z zr6M_xmsaUx8LODH0{fA*s%%itYlv-cuI`iLq~`=eQx0{Sk`2igKu9^OCgn2+lpFR? z{rWER_`B2fzUZvXBlM4|IQI5B)D)LRx@-Kt(95@2U{`S(>po?fg_7QQgWUtkiAa5> zIfRA2Fm}`g@{$AmyGXhgQ0HF*yUM}Z-cd-I{OIBuRYS44q399iC#V>|WV+MO560fA zRB;v4c2#Ih$3)BazHM{Vsyt$7H_20Y*wWK+AF#ONKqXXdp=Bs<0~p$@10dFJiV%o_ zke2-Tl%Q!K8=o6cZQ!;!#t8JBm9uYRPq$3aOyH42PWNK6RGT$Xl1(AptZ(UTwQ5~a z=!2TgEbCF@4VHe;2!%!JEYM+*-8d{yUUwEA%Wc%L>duD=XOw#z&%DXCPo2a4Vz?`L zv3x>b0-lT;8po-}kQph66-vg_P#gc2nwKeaQ(5L!C)|wAdrZo({Nc_*r*+6E|2K0r zN=h23Gc)ggPwIQ-LA6ICVm<I4pU-<VFe~%QC99DxHub8VD(IOP(yK0{PQp@H?JG?5 z5ihCvWT2GoU|wqD60M={6Li&8cq4KhFSGH!6~U6#XYNB$TuC_~3Px9D+-GEEvWY|z zmRi!K+0`Gh<XS;%W)yq-B@kNXgL$>98%4Xvr;0LA{rl?vmfJvSIK?E$XCXHt{}gCL zx^LOfzzp%K9ZiZL_bD(F1fjbtrj;w~rbctc#EZ~<mZ%Mh9pvh?I@uXIui-bi%q*1j zK0f6)7n9Ch>>FjG%eORcjYHX!*)xyzJC}K@gCPgM+1b~u>(Z@n<<-@pDND!qw$t3F zW1eKR=s(I$gVi)h6g}HESe<&tH3D;o?JZ9sj7fJYJ2d%hE!dM+W1|A{>uKHA4o8pc z-;?G`9qrv)@{ZIt9O>vhm@nj}qJCupIK6Lw6B%0_%Qf|`LKa>-FdvzN6>&wk$K;6E z>T~JAf^-B(4V;%$kFErk><C-z9Zdm!XIjNRgNs}{5l0W}u6ejR>3A5~7LJ$qx_%z3 zaa+IRK2&7U9g602pTbPyH7zge08*YE6_n87b|dUDtLw)*t#sB42yHgsb%^_8a<ae7 z;wWf=7#l}gThBPPI!UA52zp~496j*gjE~|~mk6M)3<|Iz^ce_N^<3&nTig^K?=spa z&a^?mM`&m!Wdnn%>2`krwPMi*(+V8R?^~)#;{671n~W`_fOK?X!+qPbv&GC1r_wJf zx$0TsA#c{|#ea5=MUm;&dsVn3Zo|q_Ug;#)SPH>5)^;57P4wTIuvu5o#OIOXweOXe zWjUN>oSQr1Sfi8HHw4F*_S*4UlNpMEYsStTpcLwx6asdIOiWCR*HiwdBl&eI?8n*v z$J%#?!?|^RA3_8{nn?7Bk`M$@q9-Cc35MvxAiAj0BTWz`N_3-_8KaCk7&Ur}I(msd zqeLBT_-^MrDev>1?|q;1<@s+euIt|Sz4u=2w|;A_-DXamVy}QP-}Z4w*%GCO)hyiB z^aiHcUIz;_;pdrD@s_fwnX&EAV6D;2WjeYN;<lVSAqgWy?9=xn_guTDm*554J3V!M zSrDG+6PNK0;Q09-u3NazMWGY)q&-Fbb>z92^?<Aczr{{ZScK=MLy8jI1A5Htq?XUE z&l<u0mZ<?y=ZCw`)6yRX2f;xc*O@DUq=$Qo3}*VyK@3bw!sw3l<wMf`sV}Kob^Xbj z-_q;)rW`W0;^4;jQ(Yf*O=PB!rn=nmE1qgK5bQA&2HbCKU+Q!c42X4D0oF`OC1C32 z`yN3g06Ckk?}Oy;wya{rE9|-Lgey)VAU>t{_i;=%`Qd=CetrC0koxyt04G7)6tl~L zt1VouSCrv6-W`|(<lQkus#+wLu=}W}IguG^fOqX=@>PUsb&KHz1k#?~qo6Pcz|)kW zyG};uDX35Te`#3hV;B;jz$!OWRS)vhg;C%{y;la1swJ}y3t_QBZi{^rT?TV#J0&dN z7+-a@LsH~T4R&ymF%^X@Zl&*f`eY%%stgjcd1e^O`>vYNMIVmAcNEzs{DGkhqKT1q zZ*_LdAs8fK^60=U<lUjSlW{8$*O%4`osKs0`Dn)E!y<LG8*!1ILRbsP=EL|WPm(bn zlt*8hoVsgn)Erfe(9WaS>=mc$--^pvNtYbItV>0^esd1aNr$Fj^z4wWUT2t%zG0lB zOH6j6jl8cj#Y3?GM3gj-?PLhU8xPCzgIms6A4bbjMCg|AsJIyE_84$gVrMB^Dr!h7 zn<<6A_-Jfb^q{Do!0J(q4Yo3L-`RcNxdVUZLpZ}e8e;(#-5th_*AJQj)Oy{kcQtPl zAQatf6n7r)P%CYz&o9$SmWb15rm*rqVx+ds2Y}Oj5~Zs&UnccxDrY4w8sg=E#F7m) zckg6GH!#GkOX^s>TN)rBsRKDp#Pb<;HP4!A6oA6Z1w8@yIX~71%lOe%c=O09pZnxs zGbnktdNomxl_MVG<>MRvA?dbMGZ7efj5OFes$jDgJf>Sok%Z4?NgXeIkjPrNf-G&K z?n1nayCXhoJ#ss1B?M;wv5@zy^QR)m%m<xL>AP>|iX2<s2S<Sjh8^k(9m*)s7xxY~ zc{AJ~1W8Vg0QB@VQLDPWBN9jwi#uVR7^KE7@i-%A#~ant-<R#%m$#)&H<6>~DcKW0 zyv${c&>~nKsDyy-3XJhpjIP>`487rlJhu~OqVKIdJ~~KO!CH*PKiSmX198<>WLau( zD840|%cx5X9_t*0&o{iak=mV-xytXHo|Qjwq{pRgzJ*leVm>fw&I4%RT#4)B(>hr_ z9m@h`fylDwiZ?p!+(^KaKAr(p;`@sn#t`dK#kf02Z9}82%th|j6-$70<TwD5n+#gs znR*EqV;)_cI7s{>*?ZIt{%{1@UPydBUeHq-NaKo+zg(u0I%G{0Wr7#jGFj_}0(86` zu_UZ=86X$+#2dY2`|msxtMP;PFTUW-Yhc1%vgNE7D&I8h7MTv|>AUvq+9BV&cN;DO zxRT^{5AG$wDC!7F^nL<1a>T`I&0@aeu9kytbOUIp^Z>~;zUIQ+xs5A8QfkDH4LAZ= z6Hq?;E)GXT;rTB9&V#(Qbt9j>k`hr7W?1k{v)U)wpvmGvHHc6TbhgqOZD;9m+@PhW zTW1Q-%w3ZxGVdm*Ga2}@QcK{St2U+g+H5MQy2g3Azf&V%2o>w|<eE|Sq3R1XgULV} zBF#|MeeJ5SYh-_J?8Y=XZfB?Jz`F_W-GaaOW-Cbz{?*45|86i$SE5W0t-AB=r=tHg zD;Nfqepp|)(}Z=S|L7Mq*k&Y_x{?_tS6_IIHAiR&;H`^#3Cuq1hRWk`%eTlc3mu_G zY3EWovzjKK7EMK}4V{ZKC`a0%!oFA|9nIihuyZBWdc+C<yQ%Il*e3VpvvsGILe%D< zNsriL{vQ;ctiW2c6%E80fUisP&X*Tk%8=q{!w!+>F335KB}1rjSjXHByA)O!aarEW z>pr``s9+@tP|MU;DW!n8yOx_&t%FY!mn=xM7;<U{MOsBc-%GXf*4XXJ9F14D7x^r; zXs5U7Oz0JPiqg-#;?<5!@WjoXR0o^VPk*-i1R~IpuyUJIGEiM{9jm)`f5jRwBnP&^ z#g=rst&dJULK}FNP~Y#h@*elx>gi0l*$ZHvH(Dohv`B&jH->|9Bn{o?s8xxT+@5tz z7)u{dIL-v4M}xZ3#6E+C8P$f=>~&J_wF9WvW1j=>U?i$dYNy~@D6P#v*eBJxl*WF$ zXhxo03;*D?XJ1+_^1w6}9xkEFELwaPVvV<eu0gJ9YgH)uKx(cyHiF@)Z@H@r4Q5Kp zSGe;%qY<tvqLzEgdTQ~2ubTHYI}w<t^w_=k5O;LY4j%gUxXabs16RPQEJ|_QS%o_y z;rH5YS1kfu5c><OiXG@U>!XZ1JlyD^_+F%NWNwra@9i=VHG9#us?FK2L9nc=VZi|b zQ3rA2v+g0zV_!4FH@Jn-9|6Wgt1JyDnj^_(Y1jZz?AnZ2m(0=AM%L5yS(e1$29)ZG zbb1JcTH{*@khVm(CHr{`h&z{?7Ed0Jy?%DPcoj}Drjk0nEo6HiChRF{=I|7t^C7^k z>M-2dO@ddOot`#U5n>6el-8MpMx*~1ps+J>u>@u=FJd`Lmb#_TahxSLPf*<an6`e6 ztS$#3xTg{WazxV})$(RuDVm4PBH{VF@>8Xu5+lkd@#k2C=b?YR#0_pe$vJl^1zzS{ zQ_DxL4ex@1X%I|^jp*anKx(6Mw`)5Gky(6E#BPs_j7){mNQJ!WeZ@^tF>S?2kv=b@ z07TPTpYWWFxSf+*6oyfvLLN1W$wbhcFG~b6VFTz%`A|l0_{x4P=bDRM#kB#xu>tRR zVD<j!zXvOeiSB&c|2!0VpE{Pb)GFI`8h!lY6+&2(_hzR({069vTG2W>*NOCj=(o7x zbp!uTY(Tq`qBnd4_a@xk0*dWs@bR9|#MfG5<~~Le-WYIe;z9o|o%@&RqW6DQU*6TM zrEI}0O?sQ%T|(zpu%!^_BxaVux!-Osl+JIrS4u61Ns<pfX&=!pdrC(A&BeVCd6U_? z7cpPMcX1&=YoYh{1J#(Fya~>OV|gUCq84Or%q$38o15lWRNMp^G<(yZ<6^685aMpI zZbhB`AULqO3Lh|Wo9h%}HSo=j`>hvdrJ#HLhJ$|?Z)WMe)$A%dWwI(Ait5b%D3k8G zk_Hhv>&Arx2uBT|Z)YWi4_@?nh{pnVe5RLqh8L#QYMsv$K2U>S)xq~`ga!fdVb+Ns zX5fwOe4F$r=Up=Z%qt87>>h!TN>S^ePw+&&Vrzc~(`S_jrE9J=RG+HhMM=`}1IE=u z1p1yjOs{1MR%c#p51`F9B9~TIdr^8ENc_&Ixa~y_m8iGmG@c^>J?<E9Um`xaDr<pa z*rliz(twp`4_K6t!6k+Pp}(Sn7PJ|X7OftdAWJ;0Jq>tiX=9ITk|Z8fgjy0SH4yhf zJT~~;``=72uc@snhVOLM6N6V=c1$1U3#>5x83xg<y3po%ELE;m^G2|%6;bt&8Q1Xp zesap|3cM{aoi`_ZxyCAQ=}^_a#G^u%Yq-)4(l=NEQo`<?b^8F<EeRuGdWP8=xQd@G z(YorQmMB^pUAemP&U_pzAh1U1ZvDg{f4V>O{B`A+9aQA)m3s8N!Z6}$WpFIs%WB9_ z2A89<YD!AkQffchTBVku`M#`1jVQFpa`W;<b^E7+{^Tu~KsiS5w*5yhPpeOQnWnhs zTbiOcmJpJ@fHq&HaRu0mcb@J>CkFPTJY6DA7-*8kVP-h2Jgi$aPDG20h7vzlZI}i? z)rF;i^&Ve{8}X-JPOPZm08j@2);G)R9@G*RyKQ5C@vyvJ(`#+hs1di77cph4^LNF( zEwO~U6g#h@#O6YD&C)IU$Q{`UEg1L!cK7+TlGB4MMu0~Cw3lBMm%{*pxu#U%=UHxQ zW*cXgrU`ua^c)bxV}O3Y>?SX?J9MV`bWnQrGIj!KhR}MaMB36-Mu?C!+6UdxVA|-{ zNdtk)s%q53FC3n~yXfst*;21I`SC7O6^|#?DsFjZnSU;0U4>$H+9NpQ#k5J1i%v-x zmzv$(g)ZGJ<?SaDYq@7zx^72FEyR%}ujVv0(zMq4dBgvRJKbQ>k-)vV;D40XMk$H9 z11`U%w^JzaAV;0eY@KB-#<WQ}OnB0xc_~c*pq#Ew)=ZAAj(G+-z{k)iPmAX@K2k@s z0$j;C)M_Whup=%TV*2*To3;%0<u7x^K42ts9H_y6fyaI0opI>fiCS!(iDG5XN*=nP zEw?d~;IHYHT4rBflThhW!;D@`-&Gs9=k}y+q{ZvGHndpAZb#JH#@sIY=mXNWLgFoq zEVuc#kC);ziLsItf)0SP^qKK~_0j%lSX=F?URx#X$p{?~(9`iaXA>Y(=1aF-1qXR+ z_8)reEL*SDyE~JB-B!oga8eFiLxPJ!z7xu%cIe>oX(59NfNUqev)d<%Rd%JGp2DQA zei_&3glrSFZx3!1nXB^MoAc@tiC1}4fG1DP#Y*Sbq{;?8sZ(-M=3>TD-WYj}s&=Rz zLc>duuN_^P#F*o$0d(Q27u>*giH+Z5%fZua&{TI}I#1WiKAm9cY9B{{$5J{$BM_fx z?yN}}yL}|*t&+}ERz=#PgrGBGYgHVhrS{Q!_Nc~94^lU75`WPKl<NvETgIO<z72}I zdoXwvb-JY2wl$m$?kdp~!ch5+2+g5F%Qeu+8;da6$4w?~)V>bYm9Z>YBb_g?@=qC` zSsN~D)})ct6?AUgppsZ~U#+g&<aJ)WMN5metl#a?Vw;(gtYeBhQ(DZmld1JlzuC!O zfysULn&tXdL|x@aZ6iI_h+}eDx240>vkXGLn2U#o=Jwe&L}LX{BXUadm5bP{`+FNZ zoD0vRNLNb*2n-Wx$4#NLak#-PcKCf*zFDF=`6i~K8h^TVV-AANU66PXsst$;uf#pU z&UYqWqvlGo?X0YMmNBXY5A|uA1e^gZcA|;u$t2Cz_IdhmuAynBi%lO$BS;LahQ zf}6iOhd;uWH)r~>2f;wFWVW+el6^><D$}qIblj0JtovYFv)mBcu~uUQ%;rk%8<Rd& z2-lOi4ip|_@5O8O+&Mt}=%?2b0&ppGB$^zq>C_iq_1wABmppvY2&c-<91rxE0^*<e zV(G6JFFZKKvKnU4^iEvRli^8?%+4X=?pG3Dk@@$}jD<pxc*i9ZHUR^M)hCn%{bmb_ zJ)CBtW_=N*Dq5$(xRp`+w|4c3A5Nbsi8E1FRxTefApz5H`}Dox<nY{gzMYa5Z(pqd zG__GVhmnXCz)^R57!)*Eh)y=Vp{wD)Cg%zGLT!V)JBS0mv=pUrcKzGhuQg7pcHB2- z`R+jl`7OG<aNklF-~{Xk+whc3c9qa~oyA3`BLPyr+(tZEBv3RlV{;79t<rsu>i~f6 zS<4y*rf$~=ACPs~pC4Vz&?_?>tim_u+0oI^SR_S|NUT=W2*LFNed09iRjPM`%VzzV zd=SDVj4QR7JOC`X5<+X3`*?;$=NNr@Z;)Q*TYsgS8@8%=+?(9lO$z?<#k%Z(^10`7 z@{L+6St+s<yqL(I1x`2_V&8CdBQ~<_<6v?guT^|Z%py^@J}mbn(K-3WKF8BPtKGl- z(-V+OW!wVG&<sEujo@5>a8#-ceW`|{JZFITI%+>NaOK&>BiEXTl27(SG-B`QOM~)x zDTbpsL2Vw4hQ8j<Th^^>^<U2ewh*1CXKyDq+2k$n*gftR@Q%8qVorF{ivuV*Te~Z? zVnYHh`YPJD&S<q$o<&wzx@27=KV6@Be=*H*KDMz>oN7htX+5~7w$!uNx_TYurWBsz zTxByXm*kMUQ`9Z9&|m<&iu{z1oaaQQn^V9>a<l>{k|y*vGBs}A8RNq^_3uu2<~kHr z?;IaG!7bif=c9BD0T8^;wTgTdr$`YfIetjm4gA;y>PK2~!bge~Of5%+*v4W%dix%X z<A8RBZJrTY9~p$43#d=K+8^v=?OWaiXe4A#y<84rzi|k}t8knG>JyM0nF7o)e0KkH zM7Idq97wx5OuLLv98IKcuC{tF3wCabns1%ilu76wZ-f%U2a;W^`sQ`8uZfc=pI*Mu z(d|_>P}#1VHYxRv^6H|OZ$TwVO%{p&^0=Qdg*MfdFU@<8-h`}gwizk6)IdyAZGpg* zr#neP%{=zlxtGe*Stw;%pi9I<?~JXRf8a^B=jxq;d?A4!fz_|V8<tt?GG1LU=!;j! zxWUPUYkMJXZ812Z7-L)8o7&>`<vhjLn1NOaW3tJ<2YW~UOmISBAgs^dcAL;gIw=hE zo6Y7Hamur4JenS?D0@;<BlTRaG3iHwESLHWkYtl6mqENS6|i5$P87bq$ryi&wt!ZE z&jJ)yf-L>N-8DvnvKmc~dSx^2Ct|Y3kYF=uEj7basR9<ADt-4(NvvXmM}{eZ(VxY` zZxVGgk>2G|94yQ*0xk(5x0iflh2^6jTZ><FB(L5kKsDhct~eg;2q{f?H$X*U?RsTL z+@X@L#fq?TIi~RxBZ^Db1w#@ptNr&@tBR@z?%3|<7Jxj*@#CAc{qYjkP$Y$7n{AB- zc}qnZX%c!SUeY$4<B`yD6dF8I99w6gVKDg8+@G>r3|j=e!E4JGxibDdUFFl}^#*At z1$~?4$c#!Y+7gaRmen|^qev}y2xA#avM99f=>vRHPo6<@7&O%~7>0gnNG_T|4QSep zu1Z=9%*Y_$cwO%ds>`{G;FNz0M<$t5xk5t<?FALAxU(2Vx#TDY8J6r&&R3$6kBb$^ z6v?mTtvS^7*ug9;<q_QX<{pjEsvF$wT)ae|)UnKm@i8>G-JJ6(z6YO)UOTA`Y6uly za_-}Vd*snRII<XZJt<aPKq(qs%<q7h5kiR*kCr;04SdVeD|X~$vOa^aBZ+T&OQRX( zoymz?;Htg^H(XA71w>aTAgMC7P2wH!=v2tQV~^|r+d27gBVT+cnR~@#1h8?K9oHeP z1()9SOqIkK#JMd{!&Y}3x{yIL4+vvVhyrj^DaYCOARrT#zLP$Xz@;sTHdNj$bc$v) z@z1ueSUTPF2Y!!T+V@*6!Ct+-?@7g)#Q~6yeP>hYyt1UZFwnJs2oUaHxlfed?T+=Z z7iN<Daua|~CSOCmpc#GIGPM-6V>}C>yj#F5_JWWGyl(%3q3?9-n_nBye3t@g55i{k zds+>JuP<j^qPT)i&FqKL$BNy{1fb>aqmwSD$4;Nm|G>Yq!lkVM`$R&~Iw)CFzNJ&p zB%0yV3DvXB>fKAsHQjbu8{@wlcIh0@zR8rMI(&w+h12WM@5<gm+Hqp;0yE2jMCAlq zcv(yt!r*~xWaDdd7ildj`|0{d{^z~@1#(c3T>Kpr`c3D)$KWV|4h7p1JVQHIe(z0T zR-Z4quGu<3VqVV`Jx`!BK0R1-{BZ%YHuWY@oaB7*7a$^VpYmhB2WOe)Y#2%Wo&ct4 z(1Mp}`;;#mXcXRo5NR9tZ?E3&pKg!?FP8^w^vFSm;(;QBD4{IntGv`IX6l|~07Jk5 z#1%49$5#o#XZy*(1GBFUPu)zrrU(y#4LENC^<QT{0{95SZT+{ho^rHzJl*>X!jfGb zq+OSKsS-zvM@PF($X$1{QoVMD7qsS7Dka9!v_gwz9P6+pv`f+&)ckIC_Oi`DyEct$ z$WV?eG*xg^Zc3#j%2Nb%4PaVetQBFbSwfaCc|=7=NX4wA0Ot6Md;tcvQyaX85Y)jR zVX04WLPtBd?(#h54}58&rTpH{`2N}KGpU3u=I5i*3_I>J&8)xZFupHK8qRv=v@`+1 z#Z<xzvW}{i7wthMf~wtJwJb$nIwbK1i+QU_m^h=()xw&iO;yOK#*vrHnosQFxs8ws z|5b}6h%YoSNjPg+j;So@s7eaI*8G4(W+hb$jn?-}vyCgs%k$_Qm?-dgD%CFP-~kj_ zc-DWd=&KKT?8~@@T2So)y$dqwks_y(*cx($Z*_0IrW%`h&bj==`O5CRo?QeR#?7Ka zR-4p!UZ?DWwWBnEKTtSgZQWwr)o>mLW+O+Ez0^^jJ5}OyIi}6Q(Q=ILEI!Ng@gA*v zP=rIpTo%M!A)jvirF(_bmJh=$x`u|l@^ELA-puj9_0&?p+ReMnu>6SVXx>oCopi6g zxzCZ&1AY^Om~L+%<sQOuWdF+B??~<n%6=d1x?p(xVa&bRmi@D}QS;w6EcII<-SW05 zRZc+Z<~<vI<dHPu;F%R?8ZbRnDay!fAvkH_pFjQPE0?r%>28<A8vXYwq#I;@MT{}G z+6U)W3asl3#aQ_{774vQp0Ad#Kw~(s!8lvq%^{Dgt*eD5=x>_)+9uT8*HVQ*sMjjy zdxF!|(@>l5P&a^H`syxW&TWyF8{=-1FlM!+eke#OM0~^H;!y0}P0t?ctqU}CVFL%w z@>>3q5i+Iw*jY6xyylYQbB?>)#YGp4cmfD?4DgS&{fdJqX;B*px@yG1vPVnUQ;hYB zQL#!9qo8ApD~vVIsOH|oU|QSz6)-LMPL-DMmUg|{YX9RnL9ygozRDTg<U;%PP{}1y zI*jRYR`tBD_PUb3^B<UXjwGIQnV89A!D0K!ckIP4fMaZ19<GUrUP>P96vnChRY{u& zvwzszr^BnC?sPtr-zQ7chFmBO1<FZzRViCsG0rLOzM{_YSGs!dK_k@cZldhUd5%CE zrJ<io7#GB#gbQdRHH9(TQYwjA<E6nB^}9PmY2@?=vk}wl=Mp7ic1yNhCk48zm?3BB zp2lY)zJ9rOYR0xQW#Kud-?GVUWyD1t?jdM7l3tkLK5xkxqpRL!HCdNrHP{N!QE%Kb z;8~i_(S*vRi_YpJzzTbF(UZ!=stoT-gO1KJJ>Pwr8JI~ajK#!Ngr^xeH#R$UTk<l9 zCd`nMjLvw#VRD#1_LA!$pJn_4nztA5>eP!szVYqs?CfW%PDqV3=tC9z#2{U33i7Ie zc^qe6fN3uzcqUX#%dTqO1Bt69=|qo@s$MvSaD`Cfk0QEby-}18Fa=;odBg5@25<Wa zcZ@}rMYr|Jk~x0%V(5EHdJdk7wuP3DX#?obR9jcDPFoh+%SEFAIW79~ZZ2k0s#^k= zdKLr`MlBj+B-|#SLZNXCq`m+}dvr_6vKLM2Ij&-mxP^gvwDC3H;dSU(9Rfnp4_Ej& z=dQTi*iOHw2gQw`YP-|Dy)y@aW)b1hh90ujhgRVWxDQDO8mf{Cc@@xRp5S}kmd8hb zGV{doSod;Se4glbe`#+;@PQ{Us1`)h0P&gMiyU~%TbUb_;IyODyZ1HkU4xdRs#)5B zrQ4wUx(wtjUf$7(t9dj>=o7EewY3_l+ehy5;&R7T*u5U9KC#Nh<6tj!yy3CsV0Tiq z)h2d8it<K=kN=PZcC%Z8O)lG4KisMZl-nG_kbflX7O-bdh!>lWNsEu~9)GZntU6dd z=xh)79key#(#{JHC86LuE@)gWvNkB(%bXC-KE_Xo9UnARQw@GMiNBi3N^Rr$!)?bI zYbnLI{A}sIYxC-ric7_(nCas`y*p(I^oY*%dn)`LSb141bz%1~3$(GZxW{j?G#{Ct z|ETnhcs6HqsbulPwwYyR?y0eH+{lyLS3W(tbE_LmhS;m?x48To1*<W-fnB&Y3Y)aF z>l;zWzxT$C;2voLCNTB27cdHi(>Q{2QDkw3Kpo}b(v1|&&TJ5~9?Xjx;WUQ5mhsVb z#u$X!!)YNRA)2k7f=1{h{cR^t(?O81HeA<?^X*`+PJ`wf6_@JLFW0(UFkI#BpSZ6J zTK9j@K3%eaWsasaSiSL$I^cnFw$ol9wYnj3zw-;ENh4WlJRuf%34?JEZ$;`Nzl(uH zrf7*Z*XgWUY~RWk>T}w8`Zq-rvKC5RS9FQ*qm~TgbMQ-&X*u=j6|~mzLRl|(5}|>) zl-WyPAaJ4t2*iF~l}<Z*%7yaneS|#d`B;@@geFu|0ifMYCi3eSnZp;Q_Pv3>JTApu z-8kz-Lc#E?AHpFq0o0=`Pc8TRyX`oA8VkaEEm~m*KreI-4kKib6EKj(D9pmGWJ$=u zvWABD1a!Fo=7Jr(iuT?aelFrLT53D*=6B>ixS1=}p5uedsLaOi8K(F!I%gyE$P_tz zwR%xP5eI1)rnTHhH8fiJhVXfmUE8B?dHQO;6F|}<@6CYJIjC+4bU*PiOgd_IWjlYt zu_v{09;ZFm7M1RU-{%C1K%<scP+ClVDZ87Z`e4;Q>Q63F^YuLY7AC`pxzvSns{zh= zocZ2HrJ<mqZ`VTSfdRhEIB8E`=-DIREag(+BcRl;y{H>`EW(Nub>F~lS-e<+v_Bwe z-yZANkixYdx3KI97XLjNg2SN!Ce?x?7m|+{p`LAoQ3*U9o^>K^W)J$p^8siQP=Dh& z<&P`+2cf5`w1shkn0=+_WzB2nLF^iaj|hfsp%s~if!61qHbx>5me1=r6FlwW$b9Dl zDWL6=&B8Yi$-Q2fv!6m#IHn(wVS(yU&V5*XncX;Ne$7t!oyVZNE2%OfXhXD~^8g^R z4qzx5WJd%m!Bv2Ixtzo>++}2-ZF?vUx?})QO7@FBYhFg-OC@`&@v-Y&&hp<T)ugPU zp-pbkV1iTou&GqxTTocbggY7qG}PGotkJo1Gb@30!A%5Br0lXQcJA9df0x_43&TZb zZNhyIwCnn*WpvI-CodA6KD+zK(0!Z2$xn{Sy;f6)rvgT8+bv-3V^P1J1sN1tdCTba z?QtP>E(z7XG!z7j+tH`|+iK=81;0-Br#;t(-P=oJ9BdXoZKoS-dMgVKBin`AYZa8t z`a7uS!`)oOrMuLdpPak#cia3>+TT<~x^xY$-NXWAF}!mjipG#JnX^Bqz=qH0lgg1w z=`9dQ1ecm|9|cv%zB#p%dOnNM3fN;{F1m)%RbOvE@}+!9fIud_XW%Wk|2ZInoE|;> zfI%I+o+T|r40b7L3aWG#tQ&f;@|w~rv%3E9Hi*G7LRsBNsoHLQ|8oO-)qYPcPF>4w z;M#BO+<L1J(-Zno*@K$t(u5g3PV3Ju2mfi&1c#~3-(O&a0ta77P+fi`D4;so{V z7F~*#l>K`qnZCLDagN0z)q8Ng`Nv|tM))43$?7u2N&z)qho1Erspu27!}0=C%B88N ze>d2s*6!SwYs1H$2NoI%LgRC1nlmGw`icU8^%8g}^ry0Y=}VL_YQL273c(lf=K2Oi zdxC@c06n&>5(O?wam>YkYynGa;r6~Xgtl8iR0_t|9N;w}N4~r$<LXad{v1yAjOSZ2 zU*?{s=iAV5$K+VJwece_IBo=OuWbP+i_(OTh4e<s{SqqiZ-2PYnc-kx$hQeq@BiV) zKsLLupya<PrUc9;5KqB5r}Q$oE=F9Gyef1*$$kFq?z646(2IJdVHnQc%BKyddj`fV zx(+3M4ktWU!%A)Snn!K^_6ik<5u0}z@ur#QhUNPhUf0`bP_K3-y}LJM)w|j6ts*-- ze)n=-2@WWaA3s<KbNhiKGKZlEMWr%m7L0^lLS?V>J!ds11PGvW3aYBAJJp+sFD$+r zivaEABMqnc!A}^u<;nwI{Ri3|&eB2`0$MyV*13}}(vB(RytaDeT5I;lSb;I>6Vu3q zf(0T3H#3Zl1Ik$#D!HG|s`XrjE%($|+1Qv;oUjz<z%=2(WnQ3In@-s99R<@8=`6Jf zpJg*C2R(17xK|Akp<nv-JLjdRAY>ged>Z?Qu>6HN1D<O6Jk$<ncQvYTeZ5&`R*Lt? z-e0CBRZe(m0*_!wY9{?V(+d2pc7j=2+SNXWt?7Gu?hNyz1Y&3TLFD#)yJ?}kW-4?& z70MhBVN%{J8E>SvnmMFKIPQBHRpaC2gu@ksch={Ij+T=70j}=MmwR;(-z4r$UkGo_ zk&rgfQHX__Q}Y~yNUnBSNP_D~PH(ZLsi&wl6ZzP2?R5-J)5q%#Trcq!AR1Oxs4}}; z0C@D-otBH0^7ZS86;r#+t!pz8NNEF%k5tm7_f05%_Iyl=430@I&zlla!k^96K|R#U z*ST)p50Pe;gKEK90E-%CH2_mMwY}-EJMABEMCN>%=v+%~t-aHHTlU8^wo8->B~Vbt zTe4K9{^i;ZLon4&sq+#9K<b~w9&TUKDYZe89!7I%t6~OV*Zt|e3Y?c;RQH39J==da zoBVlEPJV$;y1>}PDop&8JZT|v5n)`#t@&&##K&ivN4R}yLc~pTF<-n^&j7d#J{I<M zadi?@YHp?>Sn6zt9QR#ksWy2`3=VoR<osPANeM+`x`i*WzAOm%DWbpr`oFVfG9!h5 z!U|!sgqa?>Gw+?+gQFW+QnI16TpJs7Os#{q?wPN0)7%PP5Dj)4uv_~c$)wg5SRAif z%|>!w15xGiM#cA!7(|b)psz7kj<zD1f3a47dv%u6fv-*^nsNT65y;NVmz(($<0jJ% z51cddwGSxxslm8fk)1fDhcf4Na9DL6DT~<8EIs4=b{rhcNEK_Ps8d+QWN?=qaz3fz z48gDjTer*K8rYxJqteL*03<@r)#(1qYc2Z_7~Iq1?dnAF1U07ek@`14UoAJAqYnIw za0ZV_%!CiC?+bD3->eHB4V<NjglcMWuIg!UuGOdwl9+Nc6X<Z&{cXJYJ$^h{{*Y5z zdN5z0q5M0x2>jCl5R{#KGQ?BTxAnmO8Wt@l)Ruzi%-VZP5H5TB29)iXM>a@Zq<Xa- z=%!v;Zx;nCc^8mKAdYC!`{k4Vt|KFJ`^iX}J)+H>pX&jQC6}B`(N9?EKRU3o<Zm<G za(CbRDx#`Yg_Kxluh-jTv+p!-HL7WRW9A};;ATBfEgmA9x*A3p^4XD)h0QVjehHa6 z)I{fIqMl(}_R57h#kGK^2lH`6U~d8HvqZms?axJj{^~sgbSyp9VE4<3doiC2e#mz2 z%=^A9x3VWs-U_Gnysz4rXC^%@W1`r8A)Gth5<&22bgxbYGo&)8Si64*YIKU~mk0cO z`meugqk%K_zRP`<?3Z^6tu>+sr(KB1uG$)rCe10hrPM<@^hY*|5IDZ+JUA7=eIw`o z-yZ!f6yV4mcMxCyWsDee)XSTffbK@ojV2#sL>VKFQAZzV=SYBYIf`5|2R487yUIxq zDwbPgWuynO_sM^GrN3S6@H%i&q@3#HfB7Q$%kLkiT{uJZdC42kR!Gmm{89dap@(-e z(d%o^={feiMy_5c0QQODw?8HErIS;>lIgUArZcOSb{NIm`<h`YSy6s?p+BrDS(vTa z#!9xYF=Jg)-u|jdei5Y~hV%&NQjLWmjah&BXZpq4)L@spI#Gd9fOLO4JT$Iw8io)M z(EU+ja6YW$!s^KWxv=euFFz`)f7ycna^H`EtF+y%fBV8OI~Y!E!byb{2@xq9dtrI& ziYCZ3jn5rEd5%>5p3pF7nk}$M;)UN|<SW7O1lou`=t2F3fcIOT2N#DwMca1`Ea`me zAP26~3eZI)$^ktHG`U5;z5Ksv!CkqRFLQn8Uw!<sZ9tbl)!HR*?}aBK^yd>}yivy- z;Si=f8D@Q`m-tF{<5S6{G=vDPdILQsLWCiW?k~Ih%QJpjm?<W}O*@JufB1{}kw(1i zYKY@Rpz^WlgM6TSLM-_;f@4JBP6Eyr_IR^&TVN4^-(G~1AmTL&uu0c@vLAq`hlMAv zJ|#rtsG1v@69F=@^YHg&qCnOp(GYETDF})w?0KdP3S(eTc_gx@KXUcbi8QeN2c#j5 ztK}hxc=$b(`JidEf$hrK46$hZ)pIA0r~d87>qu*d34*}(nt)J<0A8PBjhmc2Faiq< z`%r2Ns13#6-Xe}EeK)ga0HOr=Pxe&;${U-n0WH#-*nMR1=N3`?_BSNH?8C;X7CMO7 z5F+fW1%O+`(5&DldEoZA_O!IEFcBF3rm|F$2#n$>{(lMccNwmg0<<<>fab$5mc$S2 zC(mj^)+j2hKhAfVRE~|Fv|aDiLxtN{_@C<BN3?=tEk^;N3;t8+S|uma{?}FhAUHnr ztqT3$6s$vD%|`u`JG2q<cR2BrboYpd!6|3UB2Fcb-FEkj@UD`x{M-EFPe}uQ9i5+Y z&;M6(zBQ$vMToHa=pd2`OgBt_WrKM1ZnTx)kzGtx?H~!wzh`v11^@fTWOH7D(JYK4 zi2}X;QE8Kv*I6%-aX^&BUK8#-Y;{#Q*MDMjUI+bqYG@(uUzLO?!NNP3Xw&`ag3qaZ zOUK&8!_FK<zG&j*;P90I=Ij$C_y7O)nuJit+&pGapIes#vvm=C?w++-;n9F1r63~A zF>I&?uBWhKDc!5&KQ*0x)xULn#L-*-%_caD0P{BUk*PAbE(F9i>2WgCk-ZJ?&PcpR z;F$)lWIbbbV$tdv|1G;5#@#Kra_}wm)-TroTSV<d(u`AH#i2NLWN^S|`Xwo2R)S%c zBWJcr<K-2mWMwBECVhTxCEx!|Q-|I3vvJR}oRrJdUnKeABrsPJ?F`aGT0cW`9P%&| z*DeRkvP}`CAA4R0>lr2i=rkC8Yj1I!6<7?;l$^>^B3XVZ>NfsIy6^w7YHc3bH+?5< zVt0vOOq48FvJ9fDM1tow02tmYo%C#Ale%)L`FY?@TVuH!uwSHSUg?s$*?K#y|64Zt zn||NFiW!G7A%gP;SI;xe{TiwJ8=IspnGJ29eSl{lu>7O5sC82LS2s+jRx=dz)+7<@ z;ru~1_59=b-ZlI*!d5RShgpew7>wvBUIDId@b6w-XTmNDZNTU}NVOv#COFw5MK_)U z0cK<SNE>aUdw=S?@)rir{x@|2pd~Nzmj1;<VkKWBLwG#TLmk$~a58dvG-KDiSf(BR zGHQTGDE+QTsFN-#=Q<gLk`IWoKMrV(U!#n8^!}v{XRh)}5%7Ge-+g{BsR(+jyp{+I zlGNI#y29hWckekpNc~fWJkg2fNci3D2m3v{!wGbrO|S+@3#HQ9NxQxwlDWp0VMf~e zr|$xsg2nHi0^p|tlowW(3Uiwp+(Y>r^s4{46HdQy`>jcS4>cGhttC9M_f4a<n+oty zqqN@b4AZfVGTeLgXEeg|@A-B~*83JbSALyu)=CHn7cjL;MB8mGxu_88Xd_PymQ%WM z=|XeQHdrU{e(l7K;cC*~7UU`Yft9K!yFm21M%hm=3^?|EmS)B^sK*F{^F)8T@>5^` ztuSE<nfb3KQ?(X}z`7T{2L^+hKEC>G{Rt2cE_Iptp8oR+1^)gOdUA_BWCnPA5*_)w z`xk<mX7P11+05~`qNYoM4;a7jyB~1t994_q^QGa!0w^<Gz{9z;Ycp)TQqR7J3BWlE z{O&m~5hXB27YhUA_ZYnKH;W5r-zi%TJM$VJ=aCKp&nN%g=eH7yQdvV=T-SP4^JPs! zs-#}z0z+X=0pXxfyZk6{hq`{-7_b>T7K|T}wP2e3eL-O=F8l}l*H5&l{qM>zEBO#h zVF+bQU>-B}{n_1Txo_@I&pKIJJUY4iJpX~azg1q0f-=xWJiGHyS}0NdG;S2wa<<>! z@`_ivz}$Bvuq6(;c3!uiB@n$%`H#N1bIk)#SnxwYb#ksz?f=(!;6LGT0oq^NS%Tv- zrJS<#&g)QMof8M*uYlt}u|PO6%g6UOFJbk4hKCEYt=`Byy(;4T>P^4s<)HK7Dwo?I zom|b;-@ck0Q_eNTsJ4bC)>LQ<CB1kO8Dc4&zj*RL_3+BsTT!9GiX!w;q3=Fqy|NL_ zIlEE@?2p**n%{8Z)Sm3&IsK8n4>1#gISi-#l>u8e8)0dodUE+0{{xrb8QaTqIpl%n zeJxGmVbTj{-}WZ9ADumOqIIZ$R|Im1ObTPN$q-r1sUNdH)5}R}5ey$5Cf^l4cP8C~ z;=uLs$w%1z_VHf+GX3OY7%DviurPofPUL&GxNw2&ZN&d)VDLB2C=eI#rS_SG1U5fR z<GXs;N<#$hQ!smWVjstU+dke(hBadvm&VpLOW?F2*Ixq&MOBqoYip~5B*gXIpGGp| z9~nuY6(m|8WmjY~R;;q|>e{wT@ljz{(?=0b$m2{+(j3jgT+Mv-Yjl$=Yd?y<hGqyw zX|T>q&brFlp#u~K_k^;KOtp`juPF8Wc@@O|(N*xX@yNS+_U&A#85XSPbAwXZgjw}5 zD_y|e3?f5G5j6rz*K7soZ``6kMymxD0Xxi6_R8iCZB$A_H4C%eXUJ(Fj^LH~M}aSM ze3EsSQB~U;Q<q0Y4@&~oQ}itZt*F=KRA_FGRtXwu!G|xE+4m<uJZ}`W`aQSc_w~9l zv>AH8u&WXJ%7*pAc|33JyX==XhKAL9p$5>F%bospz&)M#XTk<<cj_F#3bh9g(8>Cn z;$TLJ#>;j`?`1)cT&Kea*je>p9&9;U8TEFI1kp0zF@J<!Ei%1tiJcjC++e-v0PKfr z&78!+D&T7~5dXs?0HRM=vrx7Mi1QQg4AYd!op2Ss4e&a|I>RP5yf<4C1P<!y-_-hR z7n08qI}_`mL}=V>V5O!Pf}6nK3V7M*LoQ95Esadv&>{VAsx0yB@Z;~j0R9V{`yB!L z^P>P5Xm~^4X{Sm`)`Eo6N<SV`=(#wP5fqE(w~r<2*ZxCTW3%=rni+PLATh|LLcd?= za`1x_yY|{&jg>k6>S!?v&`6$y|9B5_CjHZ%P+6%rOO-b|uy)AsB{)xfAB4GlnIJ0& z$_#5L6y+8J@3OX1o!*OnDl2bqAGyr-&$JS7+A6PNk9L*$sE%St9{T--rw?CG7AQOk zZ<GM#DnCTgLdnSY_<l+OX}c)YOG;_}PxvMFp9y!VIGQzPDYX02=2WP=@uj~YfiQ1E zAm^0F2#XGV=W}h^f%RY_BXr^;prB;_Stx!2i;$Y{&j>V%@0v1RA^r<d07t*<Y7~uj zwxJ7(^RiJsO>v<3s_q;$ILILhh{I7t|M*~#S+8SpW4HpFi7Htr2+ra*=~C&-{z5nu ztk&IN=ToWwWA?=j$G?I^U=M}(nn~ZQwo=mXBj4PA`kX$ih2)VwFW_b_A8`C5#Np&K zan84kK=C^W7pxXg=ce7{B?>N6`396Rn{CB(cWhHiEuXvl^?ifuXo-fwGqr9RC|@Df zcPOXjG(lGTTU*dI9gw0HzUE}pQygN*5V9gg0A6SK>gSol6KNjR49!;VVKW@}!htyj z8)B1wYKDb&PLIsFCvM0I=dqY6&Fz9U&z}1J@V^tM8xwyDk{XEsPE*=-q)Z?k9b6Vi zwLYM|9meJ9I-16`C?P@Rxz*|P{JQ`GGMx~_Ym;UIUgdu_qzwcWHW4o8|J3J#-_I+r z+1iw*rT?xqTQXEs%5!d7z4{J;!Wsv=H>{gZs%=3E&d*Whus!YAdvBl*vfOvQhIf*M zfeB*r5M5w?_o{~lIV2?V>Hmn1G%7LcC0Va78M71U;1<k*ja=Vfnj8NM)RKOF?tKm> zFr;lP_NC383)FxCKTQ=cPdv<$<o#a^0JdlI?Nxpa(7l27auT&jOq60JN#NdO&0(Q} zkR63Wh9g^s4l3}bV92V#J(kD9$G(_p!MPkp|4eavwbg{o`fiUm+t8?}3XIxDul*s5 z`_tX3-POmqlE@KI+vooWXXFPSynOWp&eOS6*O8$V-FnigflC`6?l{-hT74iC#;&px z&51-3vs=p%3<H2h5Do9gyH38*C$uaiH1s;9lqRj<NSU;eUa3vgO^wW0d@$V_F9mIX z#N+~R7%=Xq<rBBwY_F1-(gW|bJiBgy?6AM>+noSV<+$#ablx<tlnpZNjG^JyW!ap^ z8&1)-inV>>;^HV4;c>^QmIawGx_X?e`ffzdwXpcTkS^WagAceWr((J}(%6-Je7;nv zBqo`)R=osNg2ct|A+ZOLdGnF9!G>pLwel(nDX7+dT<R_^tdzhmfC`Fh$YL-~h83&w zcS{whyPr$l38`|gy83Xl3Ay2sKTrIw*hfjetI9Wg);~3THGz=V<R|Ij?-GjAAIVRw zqVj10VcQW_Dv6Cqul2^ykw;Wg&Y=lDak$}$9YO@agaqn^-Q~?Y;|!8((n2K_8GXLl z<>+p&S-d2t;r^tWSQ+nB>9WFNjn0cWe_gKG=wPYk9>SxOc4=e<vs*nI>^9*8qI@>; zKyue1Onh@WsMVjm7&mHfwD%3~L%g%L9HQLS&}A6E`NRI(Tz25WI4CM>hYk1*r2wGv z*>@eTLN!YgdlM&y_tXzrApu%ZFEo^rT?`vo$Q!4RL}WO2FdgVh!QC!}4VY5Mnaq3l z=PGX-OLa1s{*qGuaWH?$wcl6n6ZIoN-EsD9y`xSU3|#l>?I_-OtOsZ0=;L2Bvycvy zt+eG!<S(=7mDvSDV6YzcQtTl7I)3sHqM4`Pnh<d%Ohr-~k_=QV55l9Bc(7O31l(sD za0l%^2ZE8Il8l^c_=COK2I7$l^_7=yM!W^S7H(iGM%SH+gzuD+Gho<D9$EkuFnqDv zilM7^kpb^!P0HWC<Vf}CUa9>21mN^^eRq1EOPp!(kYXwY4ZX~jn9Rr41IZmx*QWn5 zaeT?*L}+4jjLl7wHA%FY)CUaW8HO~yU)xrn#e>tuafeFtGwMa=6j%9dj1SWyc$hs+ z*MO;R#Y^*5N)`I768Vel)LdF&g4Tm=7u6(a@`3gXMounNPKGAZT5Dfs%J(v{bIGqM zBa`>p$8}4r6jfD2?z(+fjVrKx%r)(uW%JS%BT?Z(!?%_Z(NQq1c4`Tr1Fz4z)bS_N z(3`s|AJ;FEAwTB0-<X{fq4=(VZ(Ih(_j=ad<$#uSwTSYYe4uQ37t|O(sbSv>Yzp?L z_}K6QT@|`vW*q?i@N=ao!;O#6l&kk#g7=HGe4dow<NU;Zt(oZ&NR-}4&Pw~{jGvF= zH~QfMHdX?;*=imVg#h}JkLK>+seFW>RI1%&26ySi_=H3wgh#w`5=ysPui)PN5mJXU zvh|}3t=1=UwQQ~fG$$le+pUaov%s<)yg%lGFrK?i>TjxE^HAq*=5uPKG^$!NK>Bcd zf9!yy<8n#(x>R1|;iG<fF_=4i_b#g2^47s@MU+;}u4UAR1D}k$t_N>bG8~cN>zm6D zHC=>`nn4@mhua%?Lfq*x%f!I8+*0~Nqda8S8z!yTzLMw2-c^bsZ<JyF69_=1yA^G} zkQWtYRhdrf)DSl}o4ijwcQ}KM1Nh>;M;qK5P33RRqkR$$6{F9}k2YAvtspS8ZZPX5 z*<-6}917CuDVeE2Ef75~-D|Y(?Imd)b(lOaeLNga^GVmLYn0JYqf0XLQ)I{9DBpTU z<;GRTWq;f6#_eB)>g4E>%Sr!KFvJ3AxDl@u{*E4?MYt^zT`HDG3+^3WKOgWQeZ_L2 z30C6+Oj1)X%{@5e2T8j&b*#-*VD0(xrDi^qZhSfA)_l-QS7-c4)NSdSQuLAKj#`q4 zD$rW_8c>*U?e*#GFdN%$Yg<z}0v%7oue#c;sH1m!Kn<)#>^R!c>8*ZGn)TP4$1lV* zHot|E)RO;DGq*0@o_<2@>?E4x7D(EHVIBk&GwdZT!EkDVHDKxT?|lz-u!R6gS3qW= zP0Z+)5C>)T%!{S<`m+~3wgUravo9?RNKi#YP~|a7Ipf<WW0~P66<C9qFSP5X0dz%| z?IZKLy{uiA3b4)Ip=#o{n7m3JBt3dM>KsIwFX_B=@4^>_v2<D7I5uicBSZ%RZOFEt zbW|1x$J2a}4;rnJ$25+5Wp(p8%Adk<X<qO?o%38+kqnzRd?nH_-v=P_6}FDH8o}Fj z1<y%XSs(6Q=TNe9w{Iyu-j&@r{N{esDBsQMK-*qKF=Rwa*e8TCV`6KBYTb3?olobM z#YoJ!=<Y~WH&M|zLPyYjJ??tATC^E<WA@?PZY9}7rmpku&bpm{dcw?uv_$;bjEc(# z|5KXT?<>oR9t{$WLAq~VjupeXEqN|@BUbYRbFcgRvI<(2ck^fvgD1V$WZb8vc;iER z<MWTTDeulE6EeY~jodXRmT@7&QZK%Es;hy5RL-_A`X2Ia)H|tNevvr7u11JZliFn3 zbC@#jYb50kiLglW(Uc%jG01K*%qqa9Ci&Ngyx#o&ettF=0VDFIjR>3uy)sjv#u0F& zt#(V6<HR+k{vJy_mmmX5f<PKBY#I!CHtJcga`GyS8z=n~P`-x^9F4GS3|Vej^<D(B z<)(js*g~FohuC@F5=Q)@_TIA%^*+q#`X5VPCa7I^s;c9lvx%4^m@-O(L>D)jRdrZs z9?!8g^0gMa(OV+dWRxYWW!n->8R}!o**9`Z#Y#IY4&%LOl~-W`H*|)~Fp9V4%6!az zMuqAyM6_yl42=2<IiD&FQ9P8&e3k41tvDXJ!*>`<A7+pbT}X02PJcnIJFd2^n2~PP zsJ?N4;9jqWY29G67ADz#szBLNEoql>=r+4HA9JKc@|Y^mNP*sk>M)2F;!QQ;Q{TX$ z1bAm1NYN{Yv&oYkJ8D5faV0*s8iMv7Iq96^Bh1Soz)UY%+boW(re>H?K3DT6?x^bl zoB6mbvilsgE6W!0xYnOB;t!|nCq?Fx_Meuf)i^Wnl9<bg^PbgL^aeKH2@F&+u0sn0 zAQ242V4z>>%{}l?_UC9Dw}T8C$Vb4r=)D*wflF|8#2J)jd5?FU2Fr!+DX*f|&i5Hb zaUwUS5AbZlWsW09ZadQK3r{WbJNLe)V5Nn~faKnOXy4MIR^hV;QK3;W0Ij5iNG8R` ztESpr4Tu6L-+zw+&}jt(I^LyugC5#hr&MAz%V_e(IJHqCGFmXj9FHZSN8gy2ooNxn z<0u8aqe&WeX6UJe2u3N{w(Lh{UsGX<kRe>qi!T}wjp`3{8wn_In*M&Vo{kXcZLg)% zU>mpn;T7MNb~Mw?W<faZ+7SgckN0}M!_rl`mFqZXJN7xy6)j%TGo#ojrU$r`XzYk! zIIMf9+h(+e$K4~2GzC*QY6aVgG2nP76>$nd<-H3#d(=d6gfX_MnUGULVaz&}(lEg_ zw-4Rit?OAvqjWe<gO8t}RJz=EvAgSbZ97dn2TB3-W$Jl(uA>W`Ofw*le2Jou`c9cR ziA5SF_sti5a)0@Z>qpB?z+sO=;(4Ta#*9_%wQ5pHSw=a_>Krr~8G(f%r5*HWEhEXy z`ER@yD1jdNGPikw^lpp)!JQ%?3WP}mQE`XnZKs(gm0oO<Z)<){C-=9HH?;E-IBry? zy<F}r+ltDsiPcSpIEyiQZuwY_&PTEUP8L~tv@43=XHR(Yg#zW>a-FKgfMDfL8TO|8 zOg|5rRD>qcEs(M;&TLU0^qB8T#}N7t@I}qci6Fq2#{a<oJT3__!??;Y=dw9dF*-g^ z3hwdv`cw?NX{PDBr{N~Ab$kw6Of#VR<jQFrU#<)(Qzf>sh%?}h2L)*h4v1A8dd3~@ zH?un}CrUQAT%#D{%rkE`@?|qTsP&+p!|R0xGgTkWt$m&DDWpocA;=jW!qi7sQIB20 z`-aaSXnzz4$-Q|1#YLAdD@yNlm$>&H)wO1dF{}<yTXB7Id0i8Lez80=37$%q`dSIp zwN;2Nf3uH{4YTbNrJhSsBKLu}$En=AyPXs;zuoFn+Gjx8qIzT&Om@N7zM^;YczUH- zu{Gh9(X=C4OsYNmYI~=<aQ3;isH_!h-Zjz|phE6Z)peoo%J91z^=lmKXTtuM)9W== z*K9VM%{Q-+%$1wu<SGW#4bH3A_(%+AnX4c-^A61F7mQ+O#K>AC_lNrUw<6BZkNGoI z0F}MjHREdNY6?2}SpJM4R_02}KK3O?OEn#&W7O3K+p-B(8kgmQ@%6)q*RgT_zK*tr zufK;OU;tl4%3z<c(o!eF==iO|0j?!ALP>Ghtf<z`$NnT_|MaV{4tt6+-JmJX#x@?p zTn=p^@rs2N>QKtpBW#6a%Z1PiEElxR`m1AirBwU-CA)%+Js4#)V3X}A?H^4KXt^PU z^Roc&B?<HV+1GaQ(eWg_mXB_6&vN{p&FG7l!hBvH?e4)Ddf0bK=#}h3E`s3{jiX2s z$=yc%uh2eR1h(5Ma>LPDb8cK?&E-_y{+rJ)ZQ5v9SNe~?O~v@CoHKxzJ?(Vl-|D)o zV6m)AJnTu*5u)wyow@L|cmE45@jhDYQ+|7dD^<DQ)NHr33GuKm;5)hBbNwHAB#qK1 zVY)eIjQhjNO|$We?NnGJCEdOsQ2y1kd9(a55DVT}HtMVfH0h*==gUJ}2D$?oD&Ytz zwjFKj)2?W$mkr9$SXiC^hFmC)s9dX%7|-Ef8NCYqx&oiy{R^hxa<J2!yK&?)YQXQl zami_Ut8e5z<?`jmaKHf%EbQU<&R;1ICVRkgUgO3fa&b(<WZ$|ftuXs6(`GOL`t+~? z<bcba#Unt5;s-39C-?Le!hYPVn7-8BjCbA$?!<JY`zd#Vy+RignWgL5b$9bf0b$}@ zJuJMmu95C_wJaP;=~8-F!>e4NRkMoa(9JQrV&~uk6c?s8XGHUGpreaI*R_%aNsjih z8ILz*wM7To7Z21Ty&cCD3n#k_IJA$^a8+2SAk64-1uSft6sm3uwaVL1_-v+4hzLme z5(*j^$6LF@`q&K@UNvX7yrS0Y$OHDSjQBdjVNPq$X+=n<+yv&ey=k@geERg}h%TtD zB@0)gygXvFrbs;e;I%!(?jjWvP5Jwgr`-e17hbmoTt40sh{Sj-|G<m?PT&v*-_LP* zebq^xA&g;j$@r$h{+fN*p>3D`pHZ@$2>?{=ZPK(gMsM9-z+wv5fC7%3bJk)*rQB+H z$kH+!5EgKq6(M>a3Q=QYiBM)S?|nB%?|jM3c5)sO?fnU#pcTn#pOx*h*%I_Yd?{n| zDBehjU}~52>R3y^IM_kn`A297e*3a-JwZb=u_1=6G0=<O11JOtdZBv)8=n0UTA!TX zYt1i3kK>ZFDBLs2TB?Oy{T9!`3|CR*u?fCj3`G*pcdVB17%KD1zJTr7kPwm>TRghi zh&M{^bj5LnKy}eMy8LZX#SlCF#)KT1JvS&>iK%(sjc;ug18sqM%A@OVD%A5mh6$Uu zDd~1Q9;b{0K!<|6s>!ZEPZpYMvRS5bQhfOTu=dq)QKoI%3xWztC?(xp0@5icNaxU@ zq_jvksDMEuAZ?H{<j^gmbSN+kjYvsL4Kc)b;i~Jt-#+WU?>>L*@8^QfJ@*x79OrSI zr&7n$4#hp6`ps-)z~!rY^=TY*;`ZzEdtMt_d**{2AL8BnxvyV{Mqtbp>|IbqdVbR1 zZ;<44lAH@B%CffFIhJEc)BI$=jY3Juwa@qcRll$wHu3TOZ%%6y)v(h+W>z)XlY1&> zK7CvbsBb$7q<doL(*xUe63a85fMc`m{pfJv&Z0XK^)%G3{^k?|Xj1w>C1aIzTJ%d0 z%ZBc;o(e{BS{@xxM9GV;gl{fK&pf6v$pR|LyG?uZH$Y~rlDrkMRlVJ_yRJQ2p>=Dl zF(avkAUEQPSo#{y7Zw`MWsmH+7sbeFiSHTK^QyDYg7OP5!H&;UZVI04+1&rwGtD!W zdLYW|UrVv%@wnZrw1MJoeYO%<zxPUI*Cl?K#tZGzm#K#BDYLky*UA-r?7tXlH!Xgy zWc>gV*4chWZzpwcn1FNk7D<IF2@hfld4@;y#t5xRvFu7AmL(AwS1@j<G>0W&q2$0M z#&pKgjJ8taNPJ`GZU6MBSom1J>Gi#UrqiXoCJ){9INC;#pefN+sk)V_-EwV5iTw{n z8!@;Wi_9f<JQ%||hJSx)Jh;9&Cl&msEa!CdVkrsQNm=M>L08-b|IHPCUyuDak~M}a zoV?PkXRbJ!^Hd687#w1bA3tTE^a&OFI4+#&GA)0%)r6pJciqe@GRr=ka`O>@YS_o8 zWLJ6zB#0NyQ-3IPh))4T+ioJubxM>KHd11z8Ax#G27l0etAD2G<%JWjr04f?i*eN3 z%k#hEokvF;u__^ywbH^S0mh$Ci?T}i#XjXVkyX<`C^7<f1id-`&^fVPa;;nFRNafi zqrSQK6cdUn{eAxNoM|<NOK(VwEJw!N`Q3XA_wEkbxjK$^$0gEo<WOt&3w8SdtMz+U zv7fVG)0W0<Ihi~w;m;~0Cdmhx;~91EU_NcREmGvaP`jIVl1^wNE~($vRizkYV<qWK zxZG+uz8#Nqya=sgTot7cXc#Z1N6tmK&TgA_udMDG>Ww%~*xa+N)bVfh>b|gU;kcI0 z29k#pM112NBWvqU&d81YWby61K`kY0ukF~pUJa-{{0G|p<I?<O@Y<}u#r$&vdHu65 z6w;r@bB@bO_#C-kMorWntFx#b$)6^mv6i~{N&znch)bWX2#lmT-zx=hQuKx9)5-p* zqVAN+wllQ&u>df;NPrx%Sm_m$gZS60EFz0+JV8&jz_t)FcR@#!cNJ?Zm2ac6Mo#Qw zy4QvQ`S!vPP?UkFL`}LNVk{36o<YJ-Cmt|%Cr^KU?Vj9vkB2#9+-5OR;;hd1`$V^d zo!Ucf*!uDU<m%v~_V=1`D%ivMfk@vkc)*v5WBsw^;}@b;&(}?O1Zb1I;buPG8RQZO znwY<mK;ua1!?JJ&LbAOvpOfNmVk8_bHD7(q(C^yEa|M9lo!WA94`~uj4Pn2n0+e8L zs|th`0U6v+$>giz&CqVQ8BB}>zic^Drc{JvmE%?|J}))}vEZ@pwC`Fcv-PoR$L9?u zMpv0b_cGkdMI_mE86mzQ2~+G8kn36TE*Zc+eeBzJ63$Jb%4Vipdhzmmnd^I~{5{(G znwSwAp7<fs>z7@-lgr@_!*}yEUepc1^gyT5J5M@^DTEiUnan8f<eVz4QK!!41`g_t ztYXfZn*b0@Zp?B*Ku?;_&@x|h_Q&2sL~Hl$e*`Z97a!(*eA>TvFvxdE>&Fm@(>6DM zru)*V;4L%p)g0lH%7}LWq;vTLq+5;z#oWsbtf<32EKzsnfyH>`cHzcC!BaO#>c(Pe zW3*TA^cFqm$cps;c#YkN!`*5Kgkx7o)S~PS5!#X-0LbE>tt{8du_L#Qe~G!G>mHE+ zeOzF=CCDP>@p!l*a2PaN>h-HA5Q&uB*by_?bxnt!^^Jj^hmo0l@HmiTRZJqD4!pH1 zu^=3vS=S6=xleT}0Wag{>xan>Hd<M#XD0hq1R%_&{;zeTC9AG7dsp`Ip|aMuQ5<az zA{(CG7GtumPCG()vvaPLt!9Z;>wD_3Oi-OkHffKy>nCS!Fm*QjGDK|f9D0zT8*h`7 zi(AI^ms|2JVU}?rYfG3<#u7MOSG1-%;3Ejf{1&mp6~1buQJ*$P-@b{-^|8^39;fcN z2N*{A9~j2P`_BM=pb7CjM4QQ4^N$VftQhcH&*Ao3QX$y%CO(gkmG%nJpm&AIMHUG9 z9guYi5&(CKCHj)B6Q*v&vV;H3vFAf;_EBxQs0||2PxP=sasBYssy(|P=kZ~~R<OYn zVI`zZgW!B7ZWPLA);H;(lfw0&c{DOE+x=XCRXfVB(9b2b>sjSQovEIu|Li`aYP?=O zBQ!v?LBc1vPRKe~)ah91e4CWGLwcQL6JBqFPqXG-6`~!^o6FUsI-jea;I{G@RwI^` z$f6~WDteivi3OYbA4O#_FuT?rU%uswF}!UgoBgJsAqaK2R<7_6pMjMp5X6#+lIQ{l zjrql_N!9Mzhlh8ka~yiv0%Aw#=u&c<guaKae*sU>(ZznNs`hvNxvH8Glt%}PgNqRh zxy>*E-Qe&JkN;NWN!8)vkI<-f6}PSDS*03y>uei-nl+DysV)Oj>HZZZS|P^0J~!cc zVz8ZsXxrX?RQ#cRe4;dRt{vG}cmZf|m63yZnZ4es4%#&PU-ZZiy0!WTr#?io4#bn5 zshR3gEJe1#I8rGdwREk2vo9@XFkz`(yGIgyUXjB&oL%YuZrto<*$<5U_XD()Afkv) z)SHZR5W#^bkRV8y_KH@upJLwgef<U=-T=q(ojJ$VwYP7BmfdFE5oV?}P$*4cr!^wW zy!s-)QHbyHD`@Qqa^a{S+mh&h1D<_CTtyh-DMh?e`#V;oaPx?%jBZBsE{!|-Q`}-w zbbevD_~FhrXaF=h4T6Ql`64mn3{ta;X41K9>wP!6&7dKG=}dz9o8qI43+eZh&i?<M zbQ|;SPi|t35S6fEs%`37IeC?*UwJo*hwcl*o2Z>J@e*Mr53KL>#VVRwPSCz+aIvuH zQ@p(U^*-lxJIM2wdEy*9Yt?~H358IxJiMDMG|FR66C!%1HFIrVcObO=2zB*(8*_<= z$zB1UDhj*yJGK?_Ce<JLULSNguN2nWu>L?}o7{P9$T)IjvLL$V)t4OncGN+yib1XD z=aqw^!FY}@u;vB;wF~<KQ@!sw2hbiiv%@;ES^I4@>ca5^TD~>SGY=KUTxEk@bGi*U zk#$=p!H1Jl<MK)~BJfv1`A3ogJGIiSt@_VjHF{8u6vu*k?uA&G?CVFJk>ShLK-7a} z|J_IZ6{`N4<og;v`X6hkEE8s#_C&mb4`cWlN2ZA7+mjlzioQ_o1T=6W0)QioKez|m zH_o?32JSND8NSe=;^G?<*(xOME0(X`EqNQk1JznA3Us(=vf$RCT|h+OU6Da6rM@3! zW{FyOoKIllQ9SPjZRryno!NFdr&_LWw2ny6;e?yI*vVBdKRta>BY1SiYI?AEi?UH; zV$aVd_<25l;>7#H7&ixlUaaeJX0Xvt<a|4|b9Zb8sbhHKQNkvLa^;{?`S5&bcU&b) z)f%gbyN-z{8fE~qn%SC#yR8VZ8}TbpAoJ*`Ba0Zj7a>n;C-%hsk}pLgkjSZloX{@5 z_&afOZ^VcXZX@L~`{T4#KkMs-QG;^$Asq7we!JBEx-<Ot?BH$*fwQ<;@?b%6b5MRj zFimT*ZD2>|E3#*cmFsE)p&rWs`rDFlpTwlM@HfqtmV1P>ru-}P<onNl4|)_Y_tR!* z%{9?(zGnLt5z(QsQq{=Hgb<b%F}dfd1s?@DT<9$UTaZZqgBS5>NB1&u{A7YtY{cjr zE%-H=MLk|l^h`p6%-sbfv9sk9C|oRX*xI0;os9(YT>Ff_y$(;>r>=oox67Wu32GI( zMGoW{3Rw|e+2-`D6Xts^vG+)Kjv~*r+;UqeX>*>1T@U(T*{rs1VC>QQ=urhn*gIH- zQiM`gmSI-o{r4!ZTZ2yqmX3|%a^_ygu#|H?#Ah%41H=8RKUtcd#1K8{J2~uacQvL* zi2FJYS~E2y7hg&>b{Scx7YO}{Jyg7OB6#m81WW<|^pvw_gr_nAQS_X&Uz#k|sE7Zh zcSUDFrDam|yKM!u{3Me1!bvrTs~6C-9h&I*>}82dksa-xe(W`3`S{5J>uv4qy%s-k ziN7-LK{D$^CpTo1tSHuTkKR@z2dcwmmc6T*NieaV-R%wc8a8A%%FYC8=jJnv=4ZdV zW*O935i+wOd6KAz<RUg&sk?9h9xr=)O8K##fX6>cTMD{xX0RFi4)+#77bEL-9FYyX zqE|Dy@)OYxA{XOoCk_o-0xI7aS6P+XZF~|`uyi8a`jKn=)w0qR>wT@nf8(cRIV{A& z%?=lJV#d2OluU+fP6%q5#(zmr(*`O>#1q#Kdj%Hz;zSI9UBJi!h_CHEp38BbRv=Kg z^F2@is-lk6prdimZe@Yl(dwm7X*4BfR-!d7B<%$nN(qI-EX|E3EGd;C)2-5VD<Zar zi76jM&Qg9~oj=8r-vbvuvbOB`<O<NjsC_V3SCiu@r>aK9L+MGeOSM+^4f%$p?GG%< z{a>BdiQ+c*sQEUA79fv638j{EZshID8bI)4XqH!H0R%%@%s=r<kRiI(*cEdMGpHl! z_8GIm<>KkqT3QAhs_I_+-f67Avyi_53SqQrui*U`#Rnx0X*hNx<ZjESml!VGSxTxl zS-Rr@D34h>?Wqjaq-j6G*mpqT1b_sC_}KVc83Ei)Hy;M#=|0Ffd-A1zlmfw*`f%27 zbIEY;=BJB$x28^m;;|)<R*j{Moh}b|0RfC%azyCq*aq{Hxldb<|7y*C{Hz#>YdQTp zC$U9!l!-UD!B#Vno3Rrg`zTNAwM(X3-bJlybAvqH5NG%p{T0?92S=R!cM_Y9Oa+9C zN*BXmo3@HkK9HM!yQo>k7W|(jR}$Gt(rWWPg8>3Rk0==?in!F@8qpq6LVACT-lI%0 z06nPQwYBYgsT3gkQ9-U#)vT>=Vjk|1-DGT0iMgZiSW299!d@Yx`(e@kiT?gC=)7Mg z{-C=5jscnqnE7HJ$v||((U#rU@m>lne=Xy`eSiTSl>aO5&vi6|(DiN1jVlZpkx48s z?&wp66<tz4-KldzY(M(xs{8|y{9g(1KBoE(;y}F|x~OOcJ)jSoFMzk`?|6M8!K?k@ zd;gIf@-LPNv=2Zfwbm}^ySIGqZHU)kOI<Za*~pxbwhRCDS0{ac-GaLH0!g$a4{5|> zEX+thF((QV%eXB5u?ldOjD9*xKPCNt1q8?dj_F^CMS->-WkW?)L?`ZX;MPtM3JQ>t zow430Qc+))f4jqJK|};?&}YlHNlw}-WS2SAkQE0azml~>z84by&thQEzhqD+MiSjM zt%_|he#rt8erxA9ur}TNeJ5)p@Nd^f3+L@AxDO*mL`PMx4HOqXr85ubmHR3*R`^ar z_`eE`;Xyd9P==BoQNX3vNsI$yo%o2XZ-`JSN+o)n{>pca{kQ7_G@I2chR;sug7kDL zYV7yX0GC|(*B@*7ZP|_Vq9F(ih;mDSl(y`PI~&zy0&FKjro``=!2eYann`r0M{HVz zIv#P%YQd_Kc=Iw-ungV!-ty%2ulnUbBDMdcT>~-&Q*28Jj)98~n@5+IFx`@fTFvHg z<CCvj`@f^o2mSvVa<~lBMZOSohzx4z8DJV8ho@YY1A_9ANF4hArXW`h-5&+{psyJ` z6ckQ#TmUL{Z%P)*_=`{EI{)78uzpM(FTBo08UcnjSwLhGfD|Z~zx3p@C;q)n1ASer z6J1f{9CVz}hxz-BAEt8@|Jz4jbj7d*$Z0xSTP&BcK)Vm(|EiqzVO}4&yEf^BPp-LR z8wk^-(4J3rJryhiMHV}geZ9V+|MvP?Vo*m4Vhoq|iU9q49xj}N5ysgT+6=UaEghC8 zeo^W>>G1z9O#fIW{VD{vqsA7z0;S@APwxv9-75K}sikUqfat5^C<+Eh1_U$!;XYG_ zy7+&|f^uL`$GZ1OO+V1r$+1FY@DXJzvJvYV7_cJtmOFz^BB1|<CfBwI6D~#tlY>vQ z_;EI!h{nYV&M%*+);RyIdx^ycqh=s%x{zqcJdQSb=I0a^E$Z=g2hVZZw5|&!aS1q{ zxZr;sWP$L+v^JsS#ub*AN6uRh@_^*4|G%eQYsUogO;Z(Y0~hm`o**`XUSo*)$KuW1 zK-B7~%a83=ns;jzZ!3{yvD0DVY7t{)Dy`Lf5@vc{#UhC|y%u9CON13aaczM*bBBkH z4iasuwbMhsnlC;)Zb_si)Gn~opCsxECjCw>JAIkX@cbh@CX{*YinZ&j+Urf)^;3Tp z3>!=iBKthuyj($j7@a-h$e_}@2<!C4X!lSO1ILy?HuC8USb|LHMR>HvT|CQw1Dt)$ z8iMA}e%VP*-{gAsvn0I`iwn|0R$_-^fHT+!r>vwV3_Sj=M4zj0zyIhS=E*~v3IFv& z=&|pWtK=spCVs{ke*OBl4=Ah6$ooD(pj5_1KOAix19v_Mi{-m?RYUI6-pH4xcgt^R z{tkaVN!z_5e+w*H5beE}^dqx5OZQRfwN{?-Eqje<h`3X{su97Bn;OxuhBAeFLF=?i zEgD!?@gB|FH=iLZJ?Hy(nd!-TeH6t!sL!64IA{G6S1m{Yqh7<|9XzC9@Fqz#$#B_W z5Ed2|E{SED%XPJslV{xi_6$}%)OmA0TJygxdVP(5AG%<`P{<|L<2sf_Wdm2MPQvNU zTYq}}o1|y)@kx1kc}sLSHeVp1hfO9SmckC>tii#-BeXM*Sdyz5oO{m(Q7~SNJ~<D) z#&vo1r|&bhrr0tEM^*08{qkjlWX_)hFVa5T==3-WwUgv*A6WEfj$S(Z%{-loTu7D` zgw3OQP|`;v1{bcmQ+&29)CrA5h;QsZ%BYKxDrZtp7TM~d`XL4UkJ0{1gO5$Ga_-LV zn<(yUF|?<y$KP%c`$Ic-^6xycx#BxXOHSKPV%+-BaN2wt<$sZo@bhZ*){`L6q452O zqrIJ&v6@X8EtWt<{%lpCUy1yYkpIX1{lIl+drq=?=i{SHf9C2;#k4EQMLn}We@{9t zj8`}Eb+784YqK-6buNGCFwu|!IsvxVe{{iwzc{szKGRXHT)CwtT2{oU_}rfx=iHz6 z>#ty?k2shZ7+3G2ic<D<;5Oc>7g@fnKd|LH^D_`pOjL|*$@%o?Jp~mN+tnt9QBT^7 z;5OE$ynD%PZNOj>6yz|J88}(RxkD?J_1IxZXX`H$sGm^Z;M>HPp{?0B60Vu5Cvs2} zb!8FC(A8ls2|GO1eAO5aT6W)v=ZMcz&cWXpG%{!wKY#emD$$Xi)9>)tX`>*##MX56 zD%^gO59jPz;x{FlJJ)d9LLFhywxc{qOu3y&e`B(&R*s+Oa@^;?Eg*iqrq^D)Zrq{i z+zwo|56s|+<#rv*rSaWaH6a)B(|Lf<%2DGs+gc);+7#up!{)JXdcQu+n#2=(#a3(2 z=c8V>ke>J%0-9KC=|gj|R3S&hy?jq~?G)D4RO!I0N(me`$%b<(NtW}G-4{CE8t<W< z$%UO>+SXaN$9BBNST#si3!fE#;qP?iwuU+`$-(Ot@$-)PED@ASM+a-QlBCqXzj-m4 z28rc12YgnEwCwchGs+q_gGi$#>4OdR2ibV-12IQqPFes;w$|=sw3Qp}Z1p^_92a;+ z_N)EB77=tI67tICMv9geb0E7N4{`UaqirNJyY5T32Sv$J{$j(8o_Y^@36`$Ko1CrI z_`;d_aOv<6O`z00vP~ssTz|LeMYloo2`OtnXYRK$+@#f!>URd7QFg9Eo`Ox%9?o&X zrh$@Uu96<hRXR|u<|zqJZfdpg7opK>c@OI{WYJ@6+nS0=$J11mYdxMVTzfw6HF6FW zBB)rplZ8Bd!sW3fuF}n*6}#CP*4Wjn$mW7%j7i?R7Fz+?CY#2&w$mM}hd@h1tha__ zTzwLhkB*u`HAc<MrJdQwVJ|;^?Y9zd8T%UWhA=+=hnA*4UC6p185x=AvHhJFW4>Rm z(K4@awlk|PX7XNsX_H1__`W+WN#5#YT7_!g#<aRhe_PTf^>DFML|z0n5_4UY4&9nw zuT^QvcqUc4H$9q3F;=833_%E5@5zNlfPvCEDNg17wd$5K$Gj?zw^kl(SC_b=twH_Y zRloU0v2It9*CYPB3maBB{y1%7RxdutVeOL7(i7aXr6YVCL=%Z<*l*IRczecBM(75* ziHNBdMMGBJebF5>Kx?*vakQHr&!_7mcK5tF*ix2fuf;OC$gZ!W1{)ig{22TG7ViIg zTkr5ZKQh%KiT7EY=Ov&;58o>Rl_KSR<R`UR{pr<a+#2#j<APWGbZGR5d*56feztOJ z!eUmoV(UjWKm0bRhRQL<eM?kobp`8Xr{zm|dPR|r(h`&|^mO94zi1?_ig&t=avNQV zn`%CtGV*2wXUX-I@;rWDQBn0qaVcM=^CWvj@)b{y8_tY$OR=G+Xy{(|vJrTlRl&dz z#^$n8A})qbcAUjMpJ0NH(!4sTTJ_L_k&ZGz^f*YS+I{}TSm5rJ16J45zdG)8UobJ* zW0^lRuJGT&%pkk;PC(tA#H}+%vNlsGp1(_R-b*|zoJxwRE8xO{%q|;)-JI(uSDC@+ zD$lj_R4G?oxJ@TZQC;lFZTy|&pyfczLMh>J8pXH<E(QFRxVMjpC{@*vD<ht<X2^rp zt!H*j|KnYPFJlexc7BFfDwDR`;NkaqlpP<se9R<`#ydZ)gWvcNIFE-*dC!;chxN{^ zYfF32(Xw4NEVp<CcX+EXtMao+{!0V<u{sD!yj0*HXZ7iU)W+S|Yq1gr=8v8<=}&vt z;?}H8)++0`4?Qzx5by)NuUQ{mWPV&W>b)`Zh)E^ae<@FWSGND?=xATm)YSAsy0VN+ zQ0^vT=}P{)I7~R0v~^D4GWp=)C2|bfjN&!P{1RF5!n*<;Lr0?5K|2$;S=b`Yo6Y3M zg}87#(>RvMI72}gOf{!7f>Jn3rino<iacTprwxis^ocSW2=ij%o+@#7Z~szfW)kt@ zF%2~E4cdF!PU4lxxY<1{90o+!II^myV*kAByldAp=QekpE;C59-V^Z*zL-4$j+y!r zpe~Eyyvc4V(!0r9ggmPEJ;qr-KBmoP*x?Vi28})ine-X|%H93>XKyoQEKghJsBOm2 za_S~IvC8dl@i%)uX1|>)mTy`w&!U!Yw+Opu*qLwu(ERXNFgvhqdkHy<S`p8dvSU?G zAFHUSmhO6rH1$VRI6F{D2gnW<OwuVtQ73}QiA&SD&;&5XDO3lle>M4v6B{{yrf^Nl zpmG8i(PUDosv{odKwP#eMf-rQfaP5NaD_KHhLp{`+wyx|yTM!@j?6`I*Mx)hR+>?7 zsI2o7Qq?S{G{aa4@4Nlwva4ft-r51r#Lc9S4?@mW@bzVSUk5T#b_7&61`6R&?06bU z68MUdZZz;U-Eie`knKnuiyyB6+%f^tSQv9Mfmtn8f<1~xau7|-sjFis<jg@*K2NB7 zRyE{YB99ThLL^nZ#fX5U*OzFiP#?UR&J=~ajVa1@1Gy~hTA7zk%vN%tC6YcUp>kH` zWF1m&<C}H@9zCg&tkOqSGL0>_R($N*fpN4QC~ml7Kce50hSuhQ<lS<sEGROqzB!6t zePOt$`C&u09U_mnH+`@D-4im$-ll-U7GDmNnlgTygrY<GoKbMQmc_}q^kouwO)MuZ zM<ODvIluP;pb-vu8GbY;u5HvtJ$*<5H(B8vt=^pLd_=@L+q*gMxRZ77Fa(!$z?2LE zIuZ2w{B~t#FMU6tJR=9{w=8Z^aWpYf?V1?C=9;ZCg3e9_tFC71yCP^iRu(c=@7sHH zWzTxxPQOj&VUyAE0V9~Cj9iJNl4K#{F&-eW>E6#K=F!nWtJtx4uSl7#^tz)0IJ7d0 z&o3WmrHZ*5vZ$moPzpQ3CBxuW%E}oN8A_{TYa^kW$gS-(_EFE}GXKcD9sNyf)y%7h zHL*;J7mdtpC^ZF-JM{|NmWQR=I9BHSwwHvrlwrNdP`t98fYO#&MRfJ8#`6^X%OQdC z!%?k(2y(4HDC=#QcRuNp#G}#EzzIHwEQEJW=04mvdT63YM@LzkPFDKsfcFzL2=?6Q z8b@3D@8Qb4jG+G_sGyg_3rrxFxO88ZaX+-A`rKE2e`{$}!LZDZ5e$YAN|rNO8>zmo zbGu7lXS?xH980ILMGJ*04>C>MJ-Q)d$K&jpTHn3eW`%H}w48k?Ap#0%1S4?qsF?~3 zg~)8?&r^NLO0VAq-o9THCC>4zLjRmYwra{?gTbV(8IHu=0pXFuXZPRYQ<tA6ncMen zl8}6F8z>=$30F-ikL5P195&NU;5K0^)%nQvAkja^4gqa@yKa$o`VvH%F*=8%GPEN1 z<L1LDxh%Dn<ZP#@>K!vuo&<H@ZN4<;#yII?bf3C!!GQD70C=7UX><e>dFz^)Hu+@R z;$>$WyhV4nnfFpQVJeQ`2&$x&rQt0Niqx?{Xdy53AW`n5L6x-41~RCr=CHnMdxA<S zMxD>DsQd+d3_ErIMv9%ndmmTC+&p%}uSCL-2am0uWZjy!#t&Vr2SZTK$m@;nS56`q zgIySNox};vUkxZQTP;4tiRCij@4sNP#!7OJ`e6IF!_BdQVJDlmkHLNW(+NJ$swc?~ zS0bMYKOx=I@YQX2x!OH^5wf{9P*Ptu5HR;(4z7cKhqrCWpFp-pZWVsgTKuJg3?y9- z@sa!bxj8tLf9$HE=&Cd-V<3Pquc)B%Vr<0Ac^Mg@$2ZAIznA_0(y4rn+Ublj3-38y z02cfltiz{2r}s+t)esqBXJZ=}shAwBN9@ZIeYO<Gvq}rJwI+!aBZZXD{#M=qY*Igb zF(dn2)sXF2Zg4miUzd<DqT9erZT!Bb<A;FU_n@((#GKlDJxJVmaX`cZtOa5%N8X(( z*m`vLmJ{#3RRb~i{v>ix{9Jk7)zlENG`xm8AIul_@<c_TnC%?T9JqQg;j0tADT4); zU!G&MXjE)>Kww!GIZhS+o<c1F!iF$egWf^JxNnA}O`#v+*nZTzP-wv4tj2G6>duYM zTtDiXC5jC}5^ap(D5LV|7jjgNU|uJ0!DyLh@%dpwema<Jc(-9$tUtPo<cVCmO=HnS zZR5e#t330v(jBjBj)-!Gr9)_oR)!e_hR{lR!LzvSH9ski-=t=PF^qBQOxRNCH3+fk zmuZ4nF?Wtps?_=no!sq0-35SJ;W;KrIl{~AC)vw*_WAUR5_6M}efKt!p#)(<P4$7x z(c$C*pG_F{1vtvqMMHnX)a1OmcllU+5DSOsA?c&|adf2iRUx~2z)m7QB_Q$3$R{Ys z2(u6qE?(hyaT_xGf_q|O0v{p0HrdD<BE_{zIKuzt2?32n^u3TLqExiP9^rsPsnBSA zty#gMk(Sq@;ZUlKU0hOVE+yvWJ$TC}E(sf|bJh6Vbd+%C+h{PdIPNh?$7s#+P>FI8 zzODToS2@X2X%ELr?0~e8kpT^QxwOL2sM|7w2(O+Ig4Ib!=yTuso<^;*T?PE23pVqi z4y6Po)vjxWrbYCvc#hJURw{M)Y2Cd?f+Qvw1|)6-1|+DhyjMP7#seaIWDz|*c;wNC zs9Kke@gWzKTy^>Q^Q)5N=#@aoi{?!lPY(=VBX<e-M3G(oK3;NL;do$f_gQZGQ}9}k z6%WHbk^H8m!93>aR)3qNxy3`vB|=3?=)Dpj?n_T{x*APJ2l?;3*4r-wE8kJY3g$x* z9%35Gpd4X|x>pBZ9<D`!es&Ry3gGTQL&#}=eRp0{W9WgA={*qto>Z~9FY!a0bKQvz z^bJZz*utK6B<8K^&$uR|Qf^Y1Le`DS@8%tmR4u;lP7$6BMhPya2s_7Ly&sme4|NGJ zyo?+~=?>=adnfXk49do5IjpqEZ!bb-OHC!20f4u$GZ|=)F;W6|*i)J=Zont!z~h$4 zX*jCAJFB$e(-MAnx&=>@9?oD$^6q^PyIDg%aa)ENjBts$)cW}2mVG}$B1i40H_N}3 z2kx^?(J$dT=cf=#K*_b%n5a%bueOs$-|ugew4a*>;Y_#zlGCM?LRm+!v-tN98mF$G zf<qZHp*6Ypa*0^fTzrx=8AFvytyLXbrPk0{2O`I;qYWjRrSk5!6LpU=RbpfV%xZgV zFO5jOo$IM5pye|R^k@+bFZWU1+Aj;U?AZ#Xl6L8va=*Q$ZSULp*@rrGM=)z*9wQio z-(wlepyY1+;nwwP)bcRIS@|hjjHS;sUcZZtI55{zYyHad5l4e=N^Q|g@16uIuE$!b z_z&2~>~Ag10>hg;veJup_G~l(E{XfukI<c)Icn5Q3MhxWb6p1HBDZsw$ErK8M2=J+ zAVrPht${sv8Y)&a3^;hyJO*hdJKX=gcGy^CikMXH;V^^+pfC)qbhC|_!xoWH+2!b~ zr<lzeBsM-a$?Yx7hwuY0w&>RXQmVAnvOT}D+DAI?{^BOgZ<zn?YOl0OLoY;ny9UyD zw%Btrz@X|*iQQfO0MpCrN>ACcD;1Cj2pfC<6|yS_2M3m&365}^HK{P~yxxHAO*QTd zd*rj1>F~hW<i>1jYT9?_q9yejwOijH<$aR4JQ1jM@7}$aR+#JC3|N-aOL6lJKZCkI z;V?g)-rkFMfNI<`fi;r)DM(h6YtEcLt+<B^nOUxO%|@wFk9N+m_p3PCwMqd;tPw&t z>etuQpm>hUI@UzI^4Z9MS|cyIbF6w(bp^Qk7+Y<Y<dK2M(#1dl8<lt^63);5CL!~< zWE^aZus16(N{ainVmY2gG<~HC!mm;!{I+f=CFXr3jD-Z3Pa+S<#voVCNnY1)t~GA- z76i_$j{ANR_lH|{q7odrAQ8gzwQIwuh=}&MmW3Az<!c-R*0hUPdR!|4VuF_6WXvm< zm|u5jrUBtNhi;+MsIZWj{ggb(k#=XfJ#rhjxrNW7fa4%Qz~_NJ7wId-hQ;IZuJlba zeM9OtkO(?VY)M!y^wiJ$Ha?g8s1;&?%s1sJsz)WS7#7YIiVYdbw=P|NS;Q`g1ou+x z0o17CcJ`Sfgo`JcUIrz4XSGi*A2pr(Wh&JDIHW!;Bo-2~;JzdjN)dfHk8(^Bw2vJ7 zz;PbNQEn%#7|XQL>|o~aXzYqcrS;`1f;k%%x~|&2y4)aAU0GkSf#3dcaWpj|f~1qQ z^9=2bu*d8~y{}fiwMp1V*y2svXp?HYa<}EJ$@wU;!t+AThVvQ-&zd!rFuE%7;7y=Y zY5#cj)WG|FxZgXDg|V#K5_=<9Z*P`zK*>t2k9yvYcU%kJcEAU|<5=b=onxW`j)?b= zXN7S>#}HURc{gH6#Qjq-6UcIg5cl_2kHX<;Z$X0n_F+(#*Oaj?41$Ov8TSA9G*>zw zek~28uDPXFmcPtVf5X_pHpU(wqi!+)J@l41GD+`_`MBG6R;_iDutrFoB#FgCP4~mX zwYRskBkX5asD@R+p&Qoo2pp`<+4?*ISzF?esN9L7_7T(x!ze#(GoSnTerqIE^aC8C zWVNKtW{JHGSa7xwdhtQ_DISlq=rAggJ2&hG3+LZkbO|$F$5ujoQoAv5>$lp_ho>ze zS#6@Fek<}m4a0^0tb6X=YuO&?#p;wwhj{C5X(4JoaWrcA>3Q<Llo4LDYKH5N11#;d z#r1d&^YlpYmnJeKycvckdsglo6~DNj2~lnhvg$SUPt~n2BWRP~Uixy~Ok0yW8bS&J zip27z!4%_&p!rgp-fJPTw30p!VgajNE(?PoEW|MA$Kmn7JauY&v6+6-42rJcrkp9L zgfH6oETYTp$_?-CwrTc{SL5#U8q^pIpa%x@R))@4Dg<t(g;P2oF$YJJq(oq(OZjsQ z->tJ>UR-)<=)QdY9NFj5!U=VHX)*``$z?Dp6!FSq8HPc5rqj0Z#>se03q3Oe5Qmr9 zkIGL*M(!PFADYXWu8<KglL@j4Rz@qgWw1}}k(1ozLS2xd+s7KnNa8|pl9cZ6p`RQJ z1P(XMKifs0`7H2dW8-l{(%V;@7osB+2vUrGopVU&(?K!eiwQ>MPMk|f=kwdE1k0n` zU=o-6NbC5Q7+k5k^o7O_Xv<CLNPcBhB{;Z~HSV4C&ym0T`P=nTrC*HOaEmIMjvA+y zsnB<l`~&r-ZlRxN`3I6<NxFS5PL=RhDm1NUS>zmq1aVrny%%XE!i1xOEi6p!B*DCS ztL2^Pm6Xi8S&vUL{s|$AIS2CHZNmQbgS|;4?0gCZh%87x3#6)NNHJP<>UmshN7w@g z+U>JF70r5S`g-fv&HZp8dc4g0$ra}hBX4yY15EagYMm_?;3R$JM(X_~gS3@T>F=NE zV09F)0jD73xW|?RN<byTHqUGPev&M)=ztrHuN01OY$Vc^L0xx@u&-}JZ?B|!Q%xYD zxD~kVp~l9L=n8^1v2&cT=yHE|OSB8Gan<ccm|myU-P;)xAbQ!_ncd9p=z*4&c66bR zTCS%ah8Kgg*LuL4F1_+a`FzitH+DTs$Rm#GyR%oa)v*myuqe-Z6$b4O=O2|^aW?MW zpIIlW_B>8^7<K`T#WWAP&bG<(U2gsd=t&jxM-IBtB4=9f!|m`}k(ya|uZP`<ap?n! z&rHj_yDf#y`<qhrSw=`T{1y58wHU*omy&YRn|I;;3}rm}#X($VH8-S@215v`w+qXd zQ=+Yq_g!ZVDW=y(J!L{8F0tEDr@sSxRtPOtOT7Y-5BH<FCbZf<QL#pLXf;u{*Fx`a zQmc!XBr@fzogyxNOBBYD!x2Pw_r!Crqdd;*!h-JZJ%-46kWE*=n_0S??<>ec4W`|Y zm~v};k*oGcN4gmJ`)_>-ki0?*@7oM@w`a2H@f^c#JB^LqzCi-pLcRw%xXN@`xdrX} zt+zW%Y2wF96FX9Osv<xD^bq%vxKS#$-O4HW^(XPM%89(<;)s=s&3QGYPj4SJLn1~D zWIT{P+%E%cn*v-&gUSioS_TeGLdJ30Mx-SxE<7~BOxQ2)G@zC8V<T9VekzThO1gb2 zgn1DR7nM)rX8b4X&kNSSHgJtcF+(a1eM)p8kE6W7?4um3Lb`DEKGb;{%kva`{^&qk zDZcP#D(Q=I+|PN>(+%Gcr3>(orn`>e2oxGMUX^kh@3|ypyfj1=z0y}6#%0vd=hlcq z_^Y0IGlbLWy}c;d*I+>wrkM(PtCMyD@mO`}x_x%Wvb5N6zcg4+5f>R5lwUJgwN7LO zChn0ZB9I7}UOez1g5~vzyhR5!KGhR*YS_b9<wD!H76eo+s%nYiF^1c`8f*6J{9=Og zOMfe<HI;89YQ+b#Sau60I!f(LRyunL|G~3w12DD&bf087Meq-vAz1B<V^yDxI?Q?3 zJ2|=F-2C>)2o)|4CI*rB1{?fTZT&OG_v07qCUhL9;F7-EF(K#3YMFG+w(EfxiDkHs zo8v!**CsXCz$e@)UQONdc^nqDyUTRvw&!59;8KcKxf1iChS!_I7JVS3%)dNMO%~6D zD1T}IDpV)#X?EPWdS<j_Qe5X*L^sB;=Bw7WU7R>PU4N6ZwlMhZDa_wbC#{&9J`|BV zefcTWZNGyvk9wriX_QAbxx($XFeaRDPwf1XX@sJJp3LC5UCne$WQ@;ty7c{GaQ+Vv z^?5sM3e3tkK)lP8L0VH_Sdie-S>dh&2IVXrf}$Lkvt^HUN>K^lH{j;P(aSzuo9VCt z!Ot>h8%J2PLL^1lmV13oIkS;a>(Vo^!$4NW*tZ)lFjAjTfVMsp6NGb|oKR4D@D+R? zDzi+Yv1Y40?L(3eEFj_~oYdfORBfH$?0X^ZlAS^czd0;R$pZ{N$zM8ry7aT4#pWR7 z83&X7Qj}3gbkiw0p(XSx@Vz!R@uxkVCb<AE=^^HE8z98B6w?ppsq}>8-=EmpzLyY6 zi`)JM_e!)`)T3jWAKSk$qa7_VbYE=E3tCo}=6yPmv0Xl%QR1>cpsAQ}C9eclbdu0g zi@75jm_>&M(<Kb}*VCj7dg~s{E<?@dpSDkD$#2_L@I^%2YF20m0d2U+=!lmSls?-u z?AADpZ}>BA8+57MZd`Y;X!5r4$gKj?{xJOI7%&D|QJPd&#$)&42OoDEbnwPZJGX^= zRP<Q&WVs;hK)ZtKc!l!JO8~+pts(oYI68)1=fl~TmXZaboimElAa1t#<`%*{&_NEB zs~H`!S-qTF6x6K%rJxunvRSUF_t+84J{_JP<e<`>5tKj5drpjj&>oAcn^LcQAC0yp zs%VQPNqIY&5#*pFC5Z{w%<CNbsd)9{p#P7bt>Rt-3d_rvZ@{_?j3TMUosvVLST*)L zwAn)Cr2#8Nv0(6En1>B8j8Jix<zmu{+d|vU00wm!t!N$?ERhr6TU2f>o}KVV&nB9Y zF2vhwXREv@n(Ro1JSO9XX3(Y=!(5uaq!Q`AcQ|;U$Zxk*+46qBMq#IL!@$|~QV)di zvXEZ1q~GpCodVNQw>7(*W4*&nIdnxf%4M3h<1-ilR6g6a7wMp1Deru)a~N_~Erdsp z$BYYyh@~vzuy<uttL~bu_txi<g6<*U+FAy_n)10tE;^%Xt?Nls;_p6x8XQ5)ht`Lb ze#|}m=xA6O+jRf*Q1TnxHlf=CDjut2R!c=f-!dy}yU|k5jDft-_XF7;-}cL6MZCSp zKEU%CI`*A(XIRL&;SuM_2FCIwq3CmDJR>9Fc<7+zw~E?UZ`(cquXC8Ld&_h7F*E)o zSHMz6pk*1VI!@=@OHdC`L9<qaLXy(rptorR65Ohq8<yCX7IsI4Qk1es`MABkZ2fXK z!Jw9xsxtK%kQe&OQ9RvcK@LG)-rnt722W-e`fYj%G_DIN(VWH@X1isj@yqM=Tksv+ zD%=|X4@FTlk+}9%*9;#P7oy_FQJqoJJkh;qf2+yNkV4Z0e_xM|FENvCb>5q*t+=FI zbe#!YZoAo|-9{BkrE|0?`_Qxt&0#lYJ4l!>(`oeOsOQj{HQstvwm(Gm{K~!%0P%a} zau54$dX%~i-Kp<I`b(j8YCM--Mv;L154eXa`g#Jo48D}w#Vhgqk62FMy?E&oTZaEp z2$yly(4e)$+d1GT!WIRWI!?m-(UO8N{5?Yop<GsskxGVR6j}_#UpK?%hYB6-$wfZy z+4FMQ2;Mn~rYREkb2DiQbx9sZQA^WH`fMctZ#z0?-gt`^HzE)DLVO20cLEsm-+F0r z$z!kYdhBd>*Qb?P?mX=rc%$U+bp&o5jRu(}g6kooY1|xb`Iy};7j<PS0`9ZmW1w%z zol%4(bVtyGM6=dVq#{O+L>EC10@Rqjfbkl~+AFpreIC*%$`fe2($z9C@VK6{-_Hir zf`pd|Mk_!Fz_GO-aP+3aq9t@+h3fsWviIKXJi-?uIA_gmC|<WVz$?gQSS2If4UWVj zl>yMPB{zb2=*vMk|FQvNkWANE{TfdvJ3L%`Qu|_vpAGK?Y3bu<Ns1EH92mo18_%m% ze|ZjGH-Am5(kgHp(na0722DaL9}{yf5E@hEg%|=9i356Z-goU-59fo3%R$weLp*Lo zg@8@3ViKGr!X(UnFyFZYRnXh`MpD01;wiV@u<d2woAj8R(<Sa69bhNYx86s4Dvy-e zZreX#UA9x<keGi!a>b~@Jl<`!Z~W3oMNh`DKf7UOF_T)V{xL9-2u8^K5KXj6ty6uO zQ~!j=<kYZ!i9?Csm#YDXPm5C_tlP<K22f)!o~idpDPjukB00}hi0YVu*Z5JWtgd^x zv~}akqHFVn?DlcM7}lP3mp)p1+i}~_Gz-F4ZU(M)z{HO7p39LsD(Ca)Y-b_~gaiWF zN!ywB3+ttsevk{Aw9la--Q~Jz`*7z;42zK|)6p}Qi1t&b@e`6t=S0F^N!4!7cCrG@ z^G+_x(M|V-A4!kiliDIagfJY8-pYUW?AsP;?Ysd@s}H=-CwlEl+?*!g+kJqxp0>y9 z_aj?qv?V_5e<ZC3f|kH^LC?RJ#+<|@UT{!sNvU<kCy!o1Uk?n!E#YXZ@t!tZUtj+a zmL}vMdY*=V%ngUce7wXlj!8M8YmkPRm?^76=gz+1C;6Oy)~KN#Q9z{_uzx>fCDS9q zI#XjdDb<(dddA50Bt%g>2~nO8H-{0--j}`J>`&WbZ0;+gJ09lapNmxVN|>nkxzS5A z?vV3f*1>K0(7@~jr)qJkLek5<;9D1S+c7OVIIQ&3&&=%f)w$YlrpN2)Jtp#T(Umdt z9Rh~Td>{5MqTgZ3#iI2F7)kGdwqwi>TBh|yDUJI?sLVgGVg3EqKz3Y>Vfx0E0k1Ak z9w!M{#fl$KxO^r9csg`ZXb{>5MOt|!fZAARK6$@G#^`E8%YYz*039XKrYB(1PGo3K zt>^H93RilNkGfHfEr}&UK3aFeZ$JN?q3HhWwpvU^QBdS{r+b0%6N2?0?g-s!tP{W? z?XkZMDwp&%)Ho}&InQ;zi<qQ>pHx~}n%yM(rJNu#l6qvp%-(rRd#N6cQXci7HVIHg zf4VNM7(;N3#$7+Ld_d7<f~ur7atxfvNpxEp86KcIaen4rJua-bvm5N{P0(uiQ^M0e zb|(4yn(c>9JYjUU#%J50=Q}^XXtvtlN<vjG->tQcljrvvBINFxcU+nV5E&J)lV*OR zGIPAU!yZm;c-vyfrsv$Dgf?x=mTWrIQLD%owZOy)c~1B(<X{h*aL@Oq4Zw(N#R^AE z{GCKfZzF07^39Ix`bx$03~0oP6-<2=n9J>rz$Jl3#^tEQfmmm_$ED)Mn^j-bs%!2W z3J8XQU|5?EC{=ClOzK^)P7`w<xy@gI;HB<5b^+?kQH?@i{KZJYe&K_W(cFgRE|>Yz zZdbm7Zm6a3YhGklvb4wRwddkL1-HZeAQ`y5x9O8z>9FJEkZ*>D&2+@~4<V3KhvZgb zNz_<`4}~z4k!q^>P@jAVx+9ppG_j-9CcwNz|D_}5`id+-C`XCr1O5R*NnGVO`<R%0 zU-JR04Q;gJ#LIGrk-B$RblYR!&F1X60-R`mr+g{1oAnstC@4lX)@an1t$Kon04i6z z-eF?`NaT}85IrCu%e0PI%=RG3)-v;z@<kbo`mUxfJS*wXx3$=tiHl<Pt#FW!b6m-P z;|TC|tHl|d3MqQwH?BQX%?g=z+auZZ%hVC4pd&UrtMyyO86T|kmk<R7XJm6!cjBEJ zDQ&JSE#XYJDy5AGZaaDwSy8-pvT5&|?JGd%cyKdtq*nSb1qLgS)QwiTl;-v3UXaT& zC}jcB*mPGODDm?LjCtbwL+<0ARm<R0Cgm|+-m1dI3EX=(AIs}Z6E;0n?Md<w6s*k3 zmZ&7W+OFu%Dv@m4=N8`tskKTgz+5$Q?V@^+x4c#%-KzeAemgYvsk$WN)&2m4jx}(1 ztrkI#-9b_4p33cgAe9k#ixSqLD~bY{x+A(JR2;(q;fX99??aac;A8l@ANHh)*#+;Y zX~ER|!!CbLA0M6FMhYwf^?{h%HjO7zh<~CeG{g|Ln0Z1O0Kr6i$#m<x&QHuq0*&<8 z=SZL8&UP-`x&yHtNejxSP{(c(b{gRVlkO8i2{(@=EDIDruOGgY1%NHpU5iz*+^cEb z_9t00bYkSB3U>mUjS9DeI&S9m&1|qlL}{CP$j)7P-Ew|z6umwA)X6Ce<QWA>csXX1 zA<bZCr!tp`m{0|jKo@a&DQx!B8ZF&om^A%xuJ>=CYi3Kl=C2PL)~CYPCn%l275Wgp z!+iZQaV(!js0ODAbgUUb$g_h5Mn24gfZz3bzHWaJmaX(EohN%0{pnrfHGjlzr(&E^ zLRZojdS}a9Vea4rloNIu8+a3heAhW@#BX_nm%PvBVeGsYh#hC3x=jLC?_n9z@ts)v z<q)TLab{rzv{J;70v(9ES{zG6Cg2_@shFL8|E_(}_2a?bxlgo&bnNB5_k}0B%%NV3 zpUT*rBMWz6KI)d8>xIpS4kJ~%6Fo8GFUA|DdeQ>7cVcl}V9au%=VJkxFX~HaMh?tT zJuT2HP`<iGdIaEl8`xmM@`4<SZ-b^XY30{2F)<mBIl^xf(b3tzy7{-=;(sm}2Yd0} znfc5&Tx*kIO1;yU)#>wFm2Ak}jqTS(R1T!PrX1tGV!EH|Pr#W$*_q!vhxB4^$(D?Z z2?8oD!lGbAT40W=KS1Cu;IwM);?mPmhE$!8IN?11hm8JDzmVY~(*G8Y+!}OW8aQd2 zexsqzyZmwW(Z;B=z16^HXX^cU5K5ldI5}}pJPDHVBRM;`Q49!A<_l14OK#F9yY@{( zz(6g|wj!jI2Y`=>pwN^5HJ<s6rAsG-iv_ACAk&+96Y}Ij@)11iT$V-?0fQS4>j@3s z#o%>cfva|bS3U$rN6FN0%@Y$8^cxT_OcAmEZ{L<!1dwz5#<J7K8vI#}OKGK7#Wmxt z4ZeO8D(o#>xH$<<h2cBTLG$%~j`sf*LjSuXHHW>f_uZM<3@~e7MA*Nn3(=yDf7+8a zqWt0I^*77PCk$b_1|0oziTrow7nGw4yUTImP5X!HNk>n1(V#TVVRjx|IIYBze{kV` zU%!Xrn1P4xiWLsyEIGZY@kYYVw%7!ROt$dM*o6pTCX1Hy8&`u5V#RlAOVBJyU<&26 zN3Z8Bj@w>ivu>B15o~A9+N`5sMy_vNb;KA>A2-Z(ys%=X?H3r6qn@$gst3j`w~+x_ z%wBf*!+(0JzWzNKKT`ebof>W`dlAr;IYM?JV%)2;!f&J?OYkz=jk-E6e%nR$5ofC1 zr7WxIv};$!!Stlt_vZNjbUuIi#J8s~(03f%xe3u%D|9M~9sJI>L!l);B*W<@Mz^;u zfZi@fu|Ht&6kOhW*y~HpLzEGSI#*_l34a{|{Z#P_7GWpkrxMqPQNT#is9lO!1V>v% z@#!;wQLIs{l2UyGWZ3O`!C_;>7zPC1gew2|{(t=z!TMY`Y41VeEh6sZ*JOpMpUV0m z>^n2k*t;bju1;?N*y~veiPj^i&AV{zY+mBypdkH&D#^e_045!i^U3{(2=1q^|MR;_ z7|`Y4aTtAcX0{6v7AplYuMQAC3b90#mimp9SCdAO;GD;e&1*1}89YHu8gg;k<g<7z z{sFN1lf5CV#2&+IoojohW9`OHmlAczc#14_K(oO<PETpxTTty3`E?6!$?_nFJ9mn6 z1GBr0xdH-?T=rWm_UF#FwQLc6-2Y!50=3{Tp%!t>>mQs4M0n*E-)<}gnU`$NHH+FS z@ARma7w1FiIr**jWxeO-S%KY}q6%GI#RZ|T-lBKo$D1%LY;5J|3L(>+Dazo9Up`vq zEjAbF6E9!eWAI;KqSK>Ynbe<H(y!0qUZU3%RN0nYu(}gxTycR`3h!wJ5kW^1jNn}^ zmHh(?2<!CNR^G+V<luECIvB?ZbpB{xuKq$aWRy$ugplr!3<{#d8F*9jx2>YS-i;vE zv%9zHhp}+#ByVwa{SnyHrQ=+}&~qQXfY%CjZTx-VA&xD>*R9M?5R_h??)<AwO&9aA zFXVI^avdFE_++Wc!ZkOSaoTF;7uRTW^&;GhgzJA6QvBtC3jTaS17S(T;&&ui{=xNn z;UDrE!bxlfPAc&mFcBj;m;|L6sdA;7DhQLF>`#`FKbcL+$S_qEYWVHij{n7IJfqZ( zl3SD?etB=q)q<4Zd^WxD-_2w2E{lwa&?of+Zy8;2X%Ued+1+69^IP_D@wgy|&uUFg zy6gSWR`^ec^FO%7bgt+dFovZpNSxJA9TDiDSZ7=1RfI%D^rb)am0J+OM&O3`t)RMB zh3M$$%o*<{7y%}^oXtxghtE>K*2(k|K7X8VBXP$1hq&S`1mjH!?~x_<xR_A+X*+}k zVy%3y$M7X&Z7XnHle{VGHw=TsEBnDV0YJ21)awv75%cQTC-ginDAFsYwy~bJd7brr zsW7lUL4TVXA`66bgxy{kdl4hZcH>-|VVz~mGV{iAQic>fF%kL1EcgNysHTWTKch&O zdUdY^=K)AYehyiFHYUIS;){MT(<36U<*{d%euNz|%fxh4=uf?>Ar{*~4(JNJ{K4lp zHJL4Kj*E>CPMu|I5Gh)^aJH?cLQ?^Vj#isBfB6t93{3c+^lpS?CwsH1T~>BjRk(6) zWxmUZ9s|pgQBUOUZLlXn4~CfOC@~+H{PL6a!6(z8Z~yV_371Yjd4f?JY=^n+I6R@j z_JdMePfDW_?BkwFU41>{no_vsMG)$Jx-&#iw<IHb>c@-!2an~ID`R}VEgjTX2LV-% zjQ5CnzSk^Tx;G;c<QMHrMK(_XpnoIl@objLf>!M1Te1ZH94hC&uk}NJ%o8h`(IWv> zuk(4a#b2e!GpZ`#N5SUEO7m1ek5(x%T+vEC5i^$SQPfJ6f3Zijhbi8QAL#{>*zz)G z?MVtM2NKwI%bqb1+OP4FKB;KF$o%!-f+eaUQ267B{Pk7?MdK$e8C2J>>j`%Z5S@}Q z2gkAa8=NMfU;~8gbEQQ&ZkM4ChkL^u9@L)(dBxXDMi__5yzdyVU`Uv7$6-baTX}TQ zz1%JTMsY$yns{K=?jERo8=G%}&FZG1-vP&f_|`9(VG<BJ(0_Dib(FV!>B?DQ*UdRq ztC=tKQ&PMvYHWHh9s?rrh}(i_sehJVH9T9$<NNyrKO^*NY?VKR140{K<1nL5k<`n( z4kEOVO(k_XiS2EXhCq~wN9qXp;f=B&`^eUdo)yk|!@g+k2}ELY7ozdT!+v@3fXWa^ zH+*N;8ncY|IyOFkm_FNtPb;KvSaF;5h3l)$%x^UgmBdsbtCu=3-FE{m_}@<sArYp$ zjIK$oJlNh`MIL_&4mwx@xe4wKIFr<V#Xhp59%=RQUfh1eBCO|@3o&4UZs%V$l+op+ z=iDUCCzTEiY&9*rmV6?mV+W$He{`jSs|ceVkqvPNHFKUhxf~M7d~&C~zkCdK7_LzT zV8+yYUfaIJ+0Rplv22<QVHW8Fz&XXGpLYFbA%mka0hP<WONxmS&O0>}%@B!(-pe=S zqOHuef*{NhM`L@O%$F~}FA?UBVFA=XHzlx^=sU#UkM(~tD-sHH6=y6VcRr>Wds9PO z=i1|p0#e0|0AK%IXaO9{qA`Q+g!^YNAT-yV#%!gO$nWvW>Tr2jKrvOMWEA-r6oYQw zj1EwxrFE_>qSkE%>B9QP#zp6~_pN>bj<DU`13gKe{1VZ~Z<n=1j?Pj>w|m6kM#7zZ zbg%ZI0kRM3%?(p(g$6AjnCU8mFKV!Z(>!_NQ>=k)*_mSdzHR@(od8Lzi~|@=T(_G@ z%xlns;kN!VBeN|mgn9%bm&GACGgLC2ZE?S0l{ceoPrqj8GqX)kx&Sq&!OJQ?P?X5~ zf0Vs-RF&VhKP*TI(%s!92#9neEwSm6MjGh`K}x!%rCYi~X;8X5M7ldR{1*3oPu=mp z_uTuBLmj|iuV+1T&Go7IYeuWesqtzkIq%TJ3P#yj>%{}2Obk^}WyuC%sR#W0qb|Gs zzKI5(U4KHnwb)}n)vk^4(W$UASuER)ydl3jdb-K}X0u%I%t35Oi<@Y(WPc!m>CL6B z-bB9T@pM~|#;?=9QDeueBh2|$(CI5WZu)3^;jyI2lS>#Y-xXNUuGMCJhCJ0adHEm* zxOo%65S##7iPQT=UaQV4sEpHYDDCh~g;KLzUKp+fE}v?6@f^SBkgis%M}%&ZmzJIC z_l-wC9-s(lZRTn`h#&rn(ea;QU16apIp`Cjk>lmL8=e^}wv5=EG^zF53+T4$8XjK0 zKrA~#?<IWq3?mv<518NoS0^iG$Ue;MV)H|^2kIAIzfbCz7gxvFj(1%$<F5}}PU~6# ztNxitP^w2M*_tn3tdKs6+(nzTR<eYr%3<A1)t7syq9kd4ZU}l^P-8W%1s(>Xoek+8 zPnDUs>Yt&Mq9C*Ct+L=K5?tK3&gPE}4KIGP_@Z4vJ>|;PXE*{`kg8{2`p*>3{=M0@ z6PL(6N_3f?S5<s9>B6omj|{fs0$Bfn=gW*$z7L|7b1iw|K?cSmxbb>bTju?V`>Z*k z+<$GUE|o{=t1~|njShtl6Jf*3b>?>j?*6>`?lGN+L`y`g_N-i{GacX+vP4BzX)iNL z$i#z|18MY#@9n^qO|C_Xf<O}zC<Ej?;16%!|A?<=P-DzLttw~gE8Zy_FHnpHVjgt- zi~hKRT(9n8w9V3M=OEx^>7BSg+g9yQT-Q@gog?INiq<ED*Z_f%T(Jd=21IglQ4-z} z@X}OF0yk7JvtXK&T(9EdLTjmhgv;oUOu&gO<bOzmHv!5&I^mzt(Fyk7Lk*S2CVk&9 z9f6Q9I#~Ypb(MKi1hLQfQ;Phjdw+FoBBfY`oE8PT?YAsHUt>q2#`R5zf^eUjQtdwv zRZ>9vr9e6pstXSAY){Ze{_kpZr62_{0Ras;9_uQnU-6G5g)dz3z}6)fxi`Cj{4VjT zuvE9fe)KFFuu~~c`(vXMb<XoHmSZ(}MGE_W;iDz>m$y~zKhyb_v!mX>h3K&Bwe6j0 zR_8~UPV~LQMC-f1J=9}VDa{=mC{tuF<}NloK1kQ01(;PG8xY^ueT=EeF8%`s%kjlZ z858`~poBd0|J8dRQ`Bw{U9Ca>y47opMu=0hghYpLxI{5(e2c-bR=fMe;Z%DHTv_zF zFE%CHLo?fjaZO0esLFt#eJlR|Qkj^5eJDxxGNZLq0+OI*1-w(vI}@>D@WS?liRmvK z!akFnM_9H5z@zk?<b})IeEjr04s7->b70mIoA9qpE2|H9b<hR~%A;-fu`(?*yDHHs zrLe`(Db=Ru@J#3`k?@z=Xl<++_!iMwF60J@W4NvOvFAB$N1d$~spOB93>Bxh8Js1# zpZ@%=%l&6dx%090F{*UypDLUG9bSRJtL6qtFxZ_e$%!hu-(aFhl`i3$|LU&#XugwA z=AC^<V*CVG#TM#-a(%l4xxP-4RJ=Xk8&&YQ+<BMw19&<9cJ_x{!WLUR#uaF4Tf%7N zVdg^3W&(n&XecN|ZadRxm!3-EKAxGT|Ccip@<lGGEV_KrqY1TyDX-4%GSqAAk8!Zq zcLQI&SR-1Jl9UVqpEu~WMEH!_rSanMGnLB`i3sPr+j>BkOk-7-CgnQs0lY6N*<P>b z+lm9`i#}+$-(7_Y`Gm#y(@LKF9xF2TlqoNZ$a6{wbG%r14K#;JfI|RD*+%c1eW0Jb z-WC>u-B=2>N%%bkEiZzOWOu5R_4vNibbbr3{mM?;YIhS9*&mf9>MWIzFV3d<2(P_& z3Tc4vj9h7PT{>^@HJrEAbTK71y_a1x9q~V}6vOZ=WjYg;2ng_@i3thhzFK+kCQpk1 z&Q^g2Ub6N7^-JbJOHm@>dU!AHaelCip^d80+^7!YytPu%-P=1qQTCTQQ#JMQj8O$> z;97q{D7Z{QrnCyV0fU+=R}iVv>H(2SVk_Gw%HHQC9t6U$-Mam;TuZs}w>#RZ^hz&k z3HhCOc;W>;FA1A(Zq}~HAKPZ{dGLi}T@ETGX3pcUQHi+Y()nFe=G3~EfbKbE4gsBz zZ9ISYMQsABj`p7+4vlqg=SOM5Ut6UBHgSq|SLfr$k2UOg-v$CQHNxB5eFgGDGUn+( zqx|xJT~Cu>t7IqN*A8H^&NKlX@#Bg4h&amc0iR*NS{YW!4YH1L3imDIwy<F|5a6VO zlNUsxPuKh2Irw`m9WswQa1WhX#wpn3NJW7$ct33}NYym!RuIYG_`@C!KFXTF@yn}L z!+q0C9PJET<5GZ(CK6AX0$w|={gU+b`B%U)nQ{&!Dzku(Ou9VT;7*@zm1fs!F-a-f zpXbQQRqnjW=UFDK{=F+Iu3!UaqCoQZqWc84j;b<|r;JGRBW!JPCDFiLrp9|*lc&~* z4q;x8wKnyCzYT!dMMWLr0hv^OWwS(8qEYe8eWp&>?tq0+wJF}_p(i3$CCd<VzHRR9 zyQxmZ%N>|0^|JYan{#4?-hJkuM2LSA&k0rVS=9v9sZ&n%YdcQ?J14)>hgTHym*MxE zc1vEtr=8<RgG$1($7_=3s^E~Bu7E-Sl5I&;)mxC+|5Z{>-e$f1L49Yc%;tS6$A`M- zcOD@{5q_niAOCT=?MU>mt+CApXv{9mY$jfLy!r5*6IpmStSSxwv{6YD{?~oTE|@*H z{YaiYs{5J_S#Hg|!7JNz0(D(Zo+IXZPsi_iz*%bplsijaFT-0B1e1#N_V3&;0s%MD zl?^>wr5-yS7kYf_gN@6Hq|nHzfUkv{)CGLrJS+4vj|189#?{4?m-89}Nz5ggz)0NU zarRf9CJY>vQpZ@amLOPmnl;lHcx`wsUtixOgVz}DNfGVT;2r~=#r{7Wl(&$F3Q2f_ z{Uo&g`Tz1`zDlXnskdaenl5`)yD|I#f<51r``nzehv#Y>4l6(r(5_S*+fF07-j6Lz zEET@<zIOS^pqdI*1P%G#5;R!7-=*4mwra8Ln{{7D8IW`QrTp7xX9vVrbd~8q@|@Vb z<wRjy%NM$cC2*`+sF3_)rpi~Tj`y`f6;$(8mZT*Pq3|dg+n`g5My~oK`@8(HfXjeO z2Kj%C4FTafT^D}V=}oAn!%N<DBV>!s1Lm!sU*`5)+pZk_?p|C<-_rHR(bwO#_2@dE z1AR*@za5NfyHR(TtbW;He9^eVKFXg53i1S&ckfYbHn+zM9B<ADXRDl3e_p@K0B?G4 z_ARgm<XO*-)wuvYsW7zVt%vW_v`faEy*lOe1Z6xac#Br-k^WJ6#9#yw=d<*=Sy4+K zGFkL0L0Sod#44~`jUe;zUOhZ)$(W3e_w_6ymaL0@$I61n?d3_V<v|W14;Zp|$6bD< z%g|=WhXHtZH)xnZqqpka!D50ReH0Bthk<YI(ladCfTTFtuQ)}&^SCT&wQgR~NamNu zGPpCX$5j81lTbim^yg)G><^)Bd+dONbamrwFW06!Y)u-@h5}+uB~M%7QD?TT3Cz}} zUEe4lDcRCF>#<z+)FF*qV2r^7*Rb(x&^srzYP($?ulJs;tctsr>YXNNs0?m;d!*h# zLATT&H%!t6A^m&LH8l<D_{@mtSaDwCm;HMvVxHN)N8Rb?h`$sy5qjQbO!LKI)$b$0 z(B60)##pO|+-P8@lPOjMyAljX3H|(!cbh^R?lUN8bKC<ZHkB4IzY<Db$r>6O*2q(o z>q!tISo%+Atr!ZD5XaoAQfk?;vmakvjQyy>B&58^TxW!t1?#vmb^O%v_6*bAZC^If zFwV4(#&W5jxnhHn;#q79Nj3-Xv%f#d|KB^U#^asV*PvN(4tRhV?E!F+2RuzDJ6088 z#R#{(<enx|d*t$~>g!#9YZgew^S~VA#K`m}!o{@md7m-uHnOXPP7aMt#SAV*V0O3N z_1zvbWz=qow^^P^e&w1N&j>Z}1gDNfknKJ`<l5z~!48bE$6$mM$3NPoTdyD+#oQa< z=6Ru)XZRhK^WfHw7C5;*n%mpkKNGyx&c7YvJXhr}P$Eq*k%`;chch8{v-rp7`Kr*N zlCSoTb<T3~KAOJDrq>757#th?C=`5^?X`{$!$-h6rV*ggTIA%o@eu|xv&kUh;(ev> z;Ud#C`d--2UPeM>oVd?H!ehk)`JX2o2%rC_MKe--T(pn1uy1jhAaSY%iqZrepgl0@ zyjlJ|$z@5>;|7|h-){8v;?3Tj#kg`bzW0~=sb@AC3GXJqlgw7{`cGDG4)wQrBa#e3 zPzw}E5`Xu{%||+KO+eJkZYJx<9XnlbaEeqKzb>`>sjnTYTlAeY-@h$xq*IK4<FbF> z**06Z2%N;6CPyOkLNHpy@c-zPL~5QD>K5or*11*Qsk5^NZm+NBAeuadEu`2zP<{J- z#*YCFhkm3@N(|m~eGn@SW_FPORo}+`?$_u!sua2Sq*q}H;XkZiaQ!D7K_cl9M_?)d zDsGwmCe$?bPtLs#-BsNu-x06%T>dUT-#$Lu9`A1x<k!QC{BpprihxS?=WJnw=r8N| zE9Xb^pVLnNGECs#vj7$rC(PQ%fd*=Ox;|<N2MDGzFQF<vH}2WqNiXUrp{4qb@?&{& zR=aW{Q&Qjm5fXy251S|k|3L@B%cHy|QDrkPbbN`9!CrBN-S;`f&Hft%y{FjOiA7%@ zPgzu}HgZ=^9?pb(@k(c?LWd2#LN5|;$%K%zUkCTS%$QS!^x$~|(tlim2oWF$Vj_fu z*8ZX=edLI3#fx4PB7apceJeEafyZ`%<xy)hS707xJJzg$UeNow2P9KizMEuUKs)l8 zt8PBKnczSwX;ZkY9=`1d-ye~!u=`a~C?0ryX6DqK7r%>t3P1d;RaZB{!)ZQ{o0-XB zjGzki<#cHO#1AcSzqMo@+LR!70Zb^PwHMqUIyUUgC3k-coEeFVeg^^r9O`Ph<PM#d z)^!)R*G*5W>Lbact4n-C?>CDeHbcs_*)56l=XNSm54jCg|LH>qN<ZS9lY%8rwh!AY zCQI_kgdN0em)q9kses=icb~rO(W4(rAqrdIy+;g%LTQ!SU=^R16TiA+J8VhsY-=93 z;ZAx-E!7Y50rZASw8neJvb}ZOPk*r}_P!vR28kP)=i8ev6#u4SB#yAHJI@vm-srs+ z?jLSvsj8i|``wqJ$LC_rT>F0N(Iz%WK31O&Z}Q4Um)UN!&vs}2wz>@s*Q(d|p=_c| zXMV!2=jSZvqocj<F;<|45nI9LpZ(;qmWVgC-$3_!m{}5SLbdP<#9FwjhZPwpdaHU# zLUd`IhP0vKH~rUB{n-{)DhVduUTd~*c=(=HX<XXIg{P`Z&sTqN$$mAc2FiylAHM|g ze_B7c1`%E4zE8P6z)=t2C`o{3vN6We<3k9~Cp8QrMqZ7n7psUr3cH&EkrQo~YNjUs z3=OUKD*Zm$7<Am9bCyY9%4@mzkn+~YD|-{u96lhi(Dp&Pxt>^CTa3o0spjPU7q09- zG!xDbZ61*O#`7rs8K!gQiZ`F0Z_{dx<sRrK`uy`!HOgXmP2tN{audN?OCszp3J&*A zH^FTd8JWGhL)bqm5u|j{`lW!20sOt^l!nIY&A0z>DpR;T>)P<MHW3WX8&rQYZ7WFn zY4-sl+`3lM2}AUE&>NK35E>Y{Y;;GRr$8|M?SfdPS1}DAq79N&%@(t=41qO)^Ho!$ z>(&t_01q1<jp)KTZpUBeG$<xwFP8^5{~!%D)5@=uJ*a;<&8e*C22m1VSI2{0eZi1R zGD*~L)p+VTk(T`Ye|jE(2}ILxpbvM^$FB7`V|g1(cM)@^r78<GB0O{Ux?H`N1bmY( zu9u)iq4h$ImcGxmY4AX058<OfaiU0-u(|YK_=ylM|CJR(Zx*@L0Qb`3_oc{vWUoEc zfq82VveqH;$oHM1e;!G{yWVua&b6U0*c>`aXPK>P-8f5bjtIrNu`n=Ly`Pq7;J1~( z2;cGB%OUn1TqUOqNra8+pLc4hyKp8ytleXh8E-vs`;7NLa!39a_?jP9@}KK?^=vpV z`@YQkY#k$q{;O%P%b%AWAmzuHB>}pJ8|*Y7sL4U#>LHOWo&QaHo3}36=D)H;F_eak z%B3Kf3>7OOdC~W%q0lDr0ZxrqJ;;Q*%Ikb`y2^OdmQlYn<ZORlhur9QA4gqXws`y0 zJk<?5ZX|?qwxLGCS>&Q`A@t;E&NK=rqA25jTa9*8Z}#N=%TD;mLH_su^S`1oB#$gh z6E5Ro$xyB;P-2=syy^e)^wsYqQjLvDgRCW<N<DqCs^jf$%r$+`T|XIhi6R%K#AViS z6*ziGd{njoqU90QV!O5f7k1bmANOs0gDIm{OBOc+gC=t!A&ch)DJBTN^VVf&ufQi2 zp2{RAAYg&PM0zglarVaLV1|`iDq<AX=iag$D7Vy?+Z@*Ox!x~`#R870$>o5dI}Crc zE>3EO2?QWsU3I0K;{r1jGdNK5_IIhQNlEF=*px+=7}VML*t)s@{`vmDn~OB0nPB7g z(#twE#-qE#>%C?n4?KqS0`eH)3Sm5m3|MrnwE_V5_ihTg4{(7fyZCjOvOHkS7;9AZ zbl=WPN+T=4{O6DM@56YzswqfutK2U(mq;{5#qYA86R`K-j63vlzh0=by3i1qAjVC4 zBhvvNWISJV0W&N7AOK+heG~rtfGUvT6UUZ5FU`x4${P~}SljvJN_T3Y2lhcf=x<}B zmhhbP<cYc<L2=om4~;E2+jHmS|DQG`1sZY#b|km04kXUz^?{$hjEmTOORO-nZ@ckK zL$x~0dg|q!iNvX{2d%#A&~cX#=<zZK#P<(>MUnHfO_wi61J%21v04$$II&${^Wh)h zYIo1%4IBLzULOLRhy|{d?5rduv@F1w$A}0ACzGYFH4PA8gZ3TaH)=tewK(kR5-4qW z2{qaqGoX-|6a5)^w=aBA<HPT=7fZ_Ty4$N3G@C7sAX{f`mvYloy}rJm=M4?4=hqW# zQvwz(_EH1NX|%nwt6L51pKr60O;`<Hs{c%o`5zM@9V96PRyEf%%xxQJs(JKdu^Pwv z-mq@<ueFIRDtm79w3>VHszX*3zRdJO;{<_+LJQr4Kpy^Ip5_BeA#Bn6N}TH#?UP^O zO}w$L`iAswyN8FBz^N`ZbMkOWbdXTx{s({M!kr1{R%SlZV{*pp`UJeznW4xnP1S`T zq(9$DMUuSEheUg8nO!M5-0I#QW7ErKaSm1bgogQ9cZ~N|nco=>SCCl=2=0sG9q@=? z(YViAyd#Z*2goNyJG4#lF*^~c@#1wG9eZ9!^hRa&4J4G94o>aIz8Y=@<9PMl_iHtb ze|hV-x+o;F>oE2zrNtV}u}gDVzty<S3xcaOyO*D+eKI^%iz<yF(&6oItey9{GdOBM z_+cSY!$5(0wyK?0Qix^m{>hodzr4BswG#don7nSQ8BXVd#Rj{B9(HmGum@1R<;LBp z+{vqtkCGv+g@U&=Ke@|wC1#y7T+}K$QU$$LLdz(%V5=N9aQnUg!tOzl>*9t13^Wc~ zveNLtjoWQshIcS%oZg~n_xR^-pa_&bUK@~}J9-9^2?~!tj5Ql|p8zXK{ru*vD+!0= z=Tg09{UuNK3NPRzxfQpyp+7nXw@LQ;8xO~VLZm+Z#byOITkZY+`u!L6e{T+I#xd&r zkZZ1QhIpK<r|W7>`l6R6@Q7W|tS0lDFRy-bO+uKH-T*6_yiKL|W-z%=yjJz*oGrD| zfvf3SSLIDx_2z7@gLr=ob!wTfyq(kjlw2g4pjoQaVB)Xb^Ilf#+tEsg>w#s*gN4kK zmHVf_2HYm#ej;(37oHo-De35bUOP=we~};w0EDQ>qOEBH9<Q2<&Cmy*(OipB^gOZa zs!<ncUsE)_z<gg*(u~j$&~<ZqoYiBMLW|BN^_ALQnhgTi0FC#J(^#8cD#5#1pm?^P zZj%&Y^%g#)1zBB@G45`2lK3oFl0)w^jf-k3G<KI-s|ys^#ZI3gBgcLhm+DJootNJ% znLY|xonyDFY@p4$H?G|*HO9*FZte|!ts-}-VmC9S<NG_2W%+~NGWh~;K}#%4_P(YC zF}|H(49DQ`ww`uEKMj0!9&#CfuNY=S1+>w)=ptOqd?+meL>X-fE|0XaRobrxsI+RE z0s=si!CY84_nsWPz5H75;!wEo)noqI`{{DbKkgT#6Xwk~pEcwjos_P&Ogyu<-~LUa zdho2!&w9C$K2Q3*egUnQh#G(Q@~-{CHFD+9<vF(Nv;!p#xP>ehC<y;c?fYubaUy!Z z031%|CnvE`#M*W@8VY8gdw(pFQm8^H@gN%O$`Ry2G?s1Oiqp6UM=<(#k0qKOnV<(v zrq`IV?LrH!c<}T1weE1fvu9=B2M4J_v3iCoNGsbbz}_ND;a4WpZ?^U&j9OOw>qIsF z1GopqaZf79PJAq&%A-;;p%OzGP}RA*U6W;+wsCq-wX89&#<wnX3SXE|@L9RflX;v2 zT26=N^Xq2X#;YJY*Si&R`SUX^mSq<o`l*I8HjmzYJd-WU$2PLqTxz{lsaE$MpA5%g zWTBRR&QUAbJp}AhCZlV4RhHv;jh>hK$w_as*FgTA3`oFqnt!3>=8s06P;AK8?5_@~ z|4?v|Uzfbl=(JrW;C0o<6BPJhe8{p=!*KuN{$mbtJYKw%wu-E*<vj&umea=?r#G&_ zxq-5>uf|}FMi&_t7xC{lQ>JHA7hRVxmzq7Jnm;aIt-83rH*as|Z?3rg`I5tk_Z)N8 z-8SOWahRxxFuC)tk0=NxdpQ<R{q=@;0o{!!P<rI{qSh)=_3rBUM-CyTZDu;3YYs?0 zRRJ7wAoJz$>RcPjTFM!)&xbLaxxTsleoJXP*m51-m6blLxB*a8GDbvHUeZ3Ru#Uqj zqgI#xR@|Z3z#gulcYE$*O{X>X)25Ar?H_z(lUO2S{@89*yu2)2XX#zR^E$ixYVqE6 zmfB>lh&gI|^`(I<20x#v45<*bPyHATykKsxU-Y7>r13gfoa9!<Q;K^un-B&QLZl+d z%tMSZueS^GitIAU*al~4JBk`@nuj=xf(dH0vs<q9y2_vTa=_4az$HJyHiVV;d-me- zA1#t1ulw@f;DjeSn<LIf+ehqCY2o#K`d#{g@ZY}_qYf_Dvvj0esz2_wQ{!rjV3MAR z^tEG{ew!B~smZcBzLuZ+{f}Yen}KUwG{X(?YfRhzF<iJ&i8tvM#@(OswikU{S);v= zkA$FtriHzmFR4sfM)L8y<)azIxcZq~N|bYmYVFMNvZX>kg-Ojk1EKxEMPI(0`^2C! z2<70;{ljlR1l&tH7GSod3(DBhEWWScbUs+nx1CEL4xx#bq)u2-tbLfb^Hfe5qn*s3 zPEyJc$lD%oFMyPY|M`sS@4T!2E6~{8wxV7EVzK{{>Wc{8QyqKXqG-Bbo?M6Y=9u%l zLiNRhElzYDuv+GHcG~h1SbY~;vq?S=P^EwdyUv>gN~y&v2!E$Cc0j8Ntz2}})vqA` zP$3~9%JNGa<~~@h+m}lwV?KP05>-M*BBSNm-TN<t-mxHz)Y^`JpLvQv_WNhdN5GwJ z9k$+X?LdO7*$;BI$LUqIk4q<?4(-m>?ppqwdFD~0Ywll)jTQONhxE56MiGF$bv*7c z=X}Ql=}S$!neeE7&ZbX))5j8P>c6+!qT*)o_ow>TH@Lxl{XGx^u@Ey*jxUtxjm*R( zuetlE(Mg;*Zy>*TJvRLTA)!RAp!dhS_xoQ=DP5u<NUIsD1-4I>m2{OeXSr229O^$~ zE=v12xhBznEpXSN@I2k};cIn?(Lle=yV~;nz0B-%zVy`N=r<v)96{z-fm;%1{+mCO zP?K`q;Mk46-AO)i?G(sf5A1Ao>~o(+Kx4^K8gQ<v=oJ~c2fVpZKw;N!$vWTl&3=lA zJ}NC%b3JRG7je(UiDUw7xC&NNwiFGqi7eO8aPiSr-qCvfIQ!n}arwb<0kxldwAPBg zShq;*O&Ee!&z!l0I#>gNdQma&!I$4eE`GH?S(5NC-9Z5gucSmat)oAgT`%~=@cQOH zqAK}Yi-<h&hE!Bi26XeoFR4ya=!BST{?d8#;m<t{anxlF4D^-&5f=Z_?iMw^e3S{x z-DS^SUU~plOEM_w-`CjhSs=GRbn|dLcDZ~^k<u1IsXE}Mrt_0ah0?$gcf+O8XBm~K z>MZ_eb&U?CYzlAw{9W2shKLDnf0f7-)O|zkzrAH-a9N>}A+h_NpH(P!sd1`$6*F+h z3lRgQJ*j>Qc?a=MDTSB_J~JQA$T9mh{}!22SEr`$_;@(Z@!$m9GBeAU8)U-q?%yz~ zxLvI4OyVo>sz~Bf&GwPButp2EyW{FD;%{LQX!A5Hrsc`(){T0vu2`U6zid$wv{K8u zsx;P$6RSyQGEkO%(3-?ZICr6>J$idyC88d)VycN9@*H;dn_1RQux7Q-N3*(dg7pj* zwQo;Mhtfi^XhPT*pHVWjIIJUxsx>>!$_9+5az7^+Ns>)GYTHe#9S$jl)naB}LKB8% ziAEK^sIVHg11rFU=A|dU91r~_GIcNisX*jnEpHH{sbJ53LpH+0<)zVidLJyFR4!<F zxC9-Ga9^C;=wU(H97->sQ_$(B!ic^+m`n#wFY!sMi5Lf#=-RR0Hvhh$9dJJa{Mf8( zOUT7$mufk&6Uzhir4PSo6@Cr=s;zPE(DG5l1P45e#0vd?|3(asXK&VL(5rKOaVdoK zC8NmFBT<es+uJt}iZD;ViA@*dvqJ;l%w&_H71K44y6j9uIBpKfVE06!F*QqXlk&L$ zAS!aC!GSt2?yGdr{U8oRzJl<jRLu%bsJ%O=go0J}2!dCar5cf^N9{>Pg9~~2O-l+G zQMSTf)?KDbabZ0?*8yJ%I4BKduG*6GYiz@#H4Ig;$a8$>PZ9OnebUSIn%NF-CyG>* zcP5GobsNE?*t?F0(WjMnTpSU%%$0ZUp|hh`AJLZz0^m>j1s}s+m!3{7>a}?VfjCpC z&2FLLFyBg}?yvETDkHt*__=r2r$pp^=Z^N6t)L^qOyD$?E!J;kT5NHbQ~d66a0l-J zbXI`c@(1RBS&%7X@3>Qgtu~a#5d@q~(#@`iF{*T(Wv>%4I17}LBAL`#qyfJ&H&d{P ztZB1+U*go?L^nf8<9(?&kVYG4kHRW@_00}7ne)P6m7!P+<Xhx6ZzYsySgwCkaJv5? ze4<J5?Lh(w2L**~^lQrDGHCpfFJ~5uksGb&YGO<*!*GZ(qDTdtG*5)Q|FB%&+{iA? zR{OrmlTE-e4G?}01xdX%ZpT>T<wQKC^mByi0FQ~Y_Y#zMJy^&CYE_kPWK$4?C(^sF zQ*S$dgW5hqIGPBe+y?|OjPMvwD#u?}XIz3<=kX+isl?k_{!GwiWqp-INu3KqH82q7 zvtP+F^z<J}7i32yHp~)zzuJW2fK{#|m~{X~es3xN-tkzX&Yu(d_Ta~82U5{~*S_@b zVL8EWf%K)kMD#w9;i$FL254yPP@0hV=8#@iI6iy7KL%m<c^Wv=-O1n0*);o|&bEo; z)5lm%m1+eR=BDB#%p{Dj-`{(Zdkb5Yb1c@&rgE(F4^Rcxmj4*d>D_P__;A6Z*W?rg zcoLT6{IB5o4Y<rFoT^dW{_e+~YjO^D>T31aCld6%NLzBhBz=wgL3y<+RoUJF-yXWU z6o^D{Nw*LJA|5C!pjc~ZIt3r}8yzG1JcH^`g86iFm<(?=2NDJbe>pvzqs+LGZmQQ( z7H$B$@pe|j=1{oL(Px6Jk5;hW?>xRUm`CoNkbTgQwm(F7b#9au&qSQII-BHu1%e$g zHYrd|2Qw1FaPDX7mZx_EvOJgDKAsRkE_;J#tFXE>K<G$L@#Opdy}uf>@o=JDrLHH5 z?GH=LyS%gqwQ$d{-hxEGLfMV5lR2B2!p4@R7r49`sO7LX!N$Fj<Nc}y63f2nOYZcc zZtR1!x2ho{i|{Sd2e{+mnY`|@bx+wBwtNTT*<?~UO>+<1Qq2T3IE?-7_nb8<GF&bX z1aJ21m$#2%a^Q{yme!A1Ix7?LynTQs^L)>dba;$bF0ua{8Fygx_OKuin_h7=yHmQW zdGp;hF-6i=`-oCbdiFEQMmzz`zBShY(c^pXlL^Ani?~1`8uu!blN7&86#H)oN12?? z2r-&}2GZqp!-Gsnx3G^%!daJ;dZNf_qsR{h`|8~Xd74}g+e&xBwI?H(cBjf%E2yb| zn8ADhsc1ilXWW4@I;=^Y%@*WEECA(K?o6d|xSsnIPfnKR_uE-O6(LPu$~Z(YBJkcD zeO<0;lPj#cz1S}hzQ2;Q<*}Jd&JgsZTi{0@(N_kky{-&)O9Juihtl~UqAsOc!dIYc z{%*s4H}CM6j%6Hf-m-`jWwf3Z>`U9qnP==?>W`o-Kaox4;>lAYOJdqo5-nPGAhWpO zgRA03F8C^rPd2h_emHJmelYrBw0zHUO|_roP$i~RCO}{zygqZ3yx?GL)R%lL#Y(Bm zuhAl&!&LW1j2F#2nnf{sqf*KKdUHy(=|QullQvQ^MU{VmJ`}%`;gJ0%iBe7}{PI+z z2D)YAvAsz!qs6AQB9B+boQwTZH+lJ%ZOKEb<i1I2vs^fP_cB9u?TTaTW3B^IZ-fiN zt38b2Q6DJcpwUOf%cO&A7iSjzmI;T4(5~6)e8NLiSqhyT5AOF%EtM_gM+-;!B6WM_ zrdtz5<4ypmbVn8Ty-zz@QY$p{8K5>}L1J3Dg!MVh#2kJq;JF^UEVC_Pps(L@x+d7i zwgm;cfXpuk^n$`ytArm35w&Y9=rW=r4WcNwv5yw!Tii>m*YgIGHV)xxD(qv#PBNx0 ziPN0VxVMH~9_pmq%vWC#_|&gxsfxV#dGT(FqC{NSSyRARF+)JX^>8WSu;lu5GskF6 z@E-W`Y8*G-YawRHxcSV&PdMDoJacEO2;r3J_B5)qCg+2?)G`k`{Cl$k@<{b&!j^3n zguOG@y2I$g_XK=`&1|lNhr*U!Lv*HEvtsh6i>AM?X{LX6ouW>ClL%k6^!iX2<zFrg zptVFofmIgz$plxmwl00P#nBb)6;gcnxd^k<C>XPKXp{Z!ckg?pxki(1WJX87Z{G?c ztRm^1HBX-t3uz+_^QcB0EWdT9M0%#!5uaFT#OKq2SfDF0uxsPLw`AG5eGP5af8B-2 z%riFCNpGrGHjt1dd+n(5b8B>KrxlUQ{+Ni*x0AAtXubh&<IS$V{kF_UBU)LpYn}5W z8mnk`id;e=BQEIm<}%x<7{yeZH!+jO#mnoM3lL4FR_=wHbPW-kuPZB5|0Qya)Wv*? z&yuet7P85dixtpqcYEQ8rFnKRZV;vkX#}v9%I?&!?)D3&ff^PDp`nYz>EN{<R2(vq ziHR0TVpXA#tV9+)#Z;b@?r0{}g2??sZSGBD_>W*h$mpktR5kT^)8GpOIm(I*3qib) zY9?fuj1uGT!23e|DLGI@PLlkk<%wFWwsy5g5sue(OtTAA3QUWra>kPsN}G4F(UIf$ zrq5RB%%6zzXBc;SjNrO*UYm?+;vVXOf_ZT`(d_DLRkgsTR`>*!<fu&Mo0TbiC4&SG zl8enZ>^`xE7uHt{DF%2o*H2e5hR&PUI{9EF7Lv&{(KC@@RF{Q@F7@W?(sNgIhMUdK zIk%^FLJ4rzdcdzfK4rsy#w5RMI9}k2u2sM&YRzKM7Dgw3H-xiTV@Z7@ixf&(?l&S6 z)`~{*wO8!LC*!~doZjckw1GKDA><s6r8r0fNXNYi)s%ArE(<h_A`tg7IizBHcJaGB zM5SaAu9ug=V55Rj0H>p^I_6=R)Ne@w-OgUB77WE-a@Xkvc^FJ)dz|mcuA-jIq)S_A zg**lPFGG&t>&TG|o!$HWI!Z-CPLo_6^@9aJaYx^o+D-^bd4=V8TLIup8waQ)WvD-) z=SzfQ&HWkeR-bzAX7(J%w%2}N+MYH#Xr)+b8Kx(GdCG$h3G+9v1Nr?aNItQd)u-5H zUixVMGfh(XVGko#d$;4Fe)%HSNTZoc7kw+r7yqkA^GGq|LlbjXh%7H5mOl%EAy8s3 zm3t5d3;8b0V8%9PY=>Zs*V#;KNv#qEzg?L8aJ<XIx*g8`eydwh8~s-;M!X2#A*cAK z$Y|Smmk3c|F0(Uxale9-6<5WgF*F!~a#CLo@SLIqR%+itWj(G>XuZ|zs+i20C*XbR z2qk_OL##}ex0y(f2a{N1zgj8H=kNUJz<n{({*V>M$@=}t@C)ybumQjA19Kl?Y1{j& z&dWeicUid76T?tZe2fcL-5QC7>6hm;#)}87y>FbVPcCOYC)Rt{;bKZlM#@z@igoS; zRZn&?`p7VUOqB)OrCgNo4E&arg}yh>vk*eV%n8#Nlx(gT>8jnF$RDpV%<tlA5p@Z} z6)aYr>n!k@xWDamx_Q6i$8SZq*SsK&2E!8AoOgRrXU1XU`*1EDuMpyisozRPRJX@f zw&=MSFTGr-&OqyYyKpW-C|IH0yTTEogn5GeuC~PgDN2_e>~kK`WPWpmJh@AMO=`-- z7J7t5T^`h`(>jrh8jP`K4>rg{OR*ch#Riv!9FOANECqu5s`oUcLvXBCPP*U{yEQYY zgbl%MCTR34x&if#V<2nlG~wF)%Ehz!Iw(^H;<|1d`AYp*mOoVfaM5MIvgaMfXf!2t zuE@-n{5s~)W$tCC1H(a#L(6J2D1{F;o64+$T#MCYsd5CL@4DM2nUGgB0gGl|Jm}^= z6IL&_?bcc@1^}qglBt*Yzm;8V*bF2ca^XvCs#)KS!`ee_Ui7NdTr{P*AMOj-A@Yxi zOOtR?+Q7d<Ge15)X>08$WRo4*BMegRXFh&MO+@<IMJi138*1goJV5~UNE-hoJ>!8T z4GAtWckv;vZg$zrs)r{iXue8*4?=b9*X>S7odW%bY)U1Tr_V9>0)~EV>HV@fU)yhX zy2>2<LAgUZ5KYC{T^G{0FuBY0i(X2eX~8|Z#3X8cHE|-_SYw;>k4*L_)HW*K)F258 zly}MnihAjRf#nzc4nGLSgB?oVVtr*mdf0;_DOL<g%lCSv?4{`v(zy?pU>`k4la{am zAEHY6R_*)rbkYc!>sO-$e7O?CK@XNI5!6=@*WLhu94R#J;&bq$M`5}UGXhtTGxjva z<eyQdmW+IrR6XXHrwp`D*eqe+MXE2Qld4L9*uz(0Ac^B_%DjpDBe;Eq`sz(!V%c2E z0V+}+g;*pWtNk|^lIr5SVHTW^M^1e!_k{rgSjs;Z&vxrb7c)GyVy>RPGSUri3de&p zuic$^mB0=u4#c6(No!sY)|74kb5zO%gjgJ`Rda^{@E;UxExud6OpYXfHGn~uGnAEl zceL*HMer7}*0Wv?X~V%_i>+_HM+vLk*lHnBHPl`sUBEqU;jB)Chc|6+sO)`Cv#I@o z126k4yQwbwui~u-<><RUWtYL+i<3OMaOXZSmoM%Gy>BMCw!Y8x7Tr)7etALp_DSUJ z3+YJfF+ma|b+{wd^7g5Fyls2)Iy8}vMrps)*RVU1sTg~3RX$?8v&sVO5TD<j4jr_h z#aGSuEb^?kOG6;-=*LE@Elw{MxFK#hD)QdFGzH7naNqzf@oREK(NJrtC&%qAx`;5= zYclb-eA17pKoPzkkVOD<Nr3Rh5aH>hRG057_Z9(k%}cJpKic;6(Lv*esTKUmLojos z;Pir7zmidHZqIz({d=wuWytBm5YF7-tP-Pb?T%UcCsfR@STn0#`pJ4EX&at*dbL%{ z5aJ<f$#iL)a&yoJLD-8_K~J8>NKw=VpN@s`x@?LY;*c&#GX~--dES*D8!G6=z0X~- z`gdTpNM0SVE@(Vjf`;M@OT|zD+)-zpx6t*3te4yCXP57N%WF}-qmr9%0v^YdwaG?! z7iJ2iQCMA}Y<dcZ0v?tonIkOpxP8epGiX-+EDL@|tJtfpu12aqct>+lN*&E5y>15x z3l%vwVeFs!3P}=QE{ot1dIe%ze8O?qj<t`U4C>&WVk|pJmZ<sxm-t0tNr}D!F3foK z?h7MCcU#42-Dkxvnb77W1jg-I-}D1+ZOWgO5J&rXNxykk*z$20=W1C*ZEK}jd;dRB zk7p&EU6DXEI7XZ68D;S0V!mntapIercET?!IjEr3`X@+_A8s?Ln<_>4GRDrAo@$D0 zf;5<3b!a-$Q<YWS_o&MXDYis3{%t@!vv(q-?9DQOgJ(NI(2|Y5HhMcdf^4#Qt})Zz z#%`UH?l!bW>N1=m{JHJNqzFTNC5pYZ-N?71V*$~OsK9kLGt&l#(|nn%WtEo8^~Fvi zkBb}iI??W&ihc&&Loo5je4^xr@^>Y&$#H6xO|xRYt5ce4OF;*w<{@G#w++pbRl8dA z8ts4U3S<3V1(q!pQulpwMEK~(78^8ghj>gZNcE}j-kXPtbA#u<q0e@hA+ax|=@_FU z{$MAdkqa_|X0up;a|)Zp-^`-B)Wu6o$K2!r29M<4<*wABS=z}}lU@s3?3<uzCz|$k z()vfI1N0^A19kXka+!rgwr?p5ml{K^I`m3!kv6XkdpcqWY+XD$5Y<9Nj~zyto=DD} zn4;tbkbM<^gBn*ABa+)-YIE7W4++Gx8ZRvN(p>92gCe5ms>YK=@g?51bYRqL2gQ2m zyYAi~TJS3uG*>Yx;Ez(G1!(iqYke#+7Hw<%V2+iqFNw5W`7>EaD-7~h`Yo&$zbL_g z=oKz^anyDW=Nje;QLtsL;4@0oZJEVXA1!eXW4`={+NuEiK~==r-Y9a_)*A)u3S~W# z?D}V4i)FA$%MI1vk)0@HaH%6vIuc0krLiKO9g1U+P{7e5?2lGgl%>)fa6_NA&r!lX z{a`lyLLyQpXm_u}-~Wf@?_2j{0a>>E#vl}`e5*??5sG=uyN}E#N2@szM(W?Q^-@Qd zSW;e&3P0TMcHOFmpO*8}*{7GN*85l5)ds9blCx*Xq!o@ed5y;a?wsLOg>EZT7eRzt zY-Jz=+=ef{YKTrFQ#LsqadP6KUM7M@wXGg0Tk1jNQ~tX3KsTjf){`cb@&gA~Qv~!K zX&?zm&=T|XZJ3Xe{n%^+;JZn>2r}-^$T)rG*5XGK*Qp1etSTWbS0Vz$I}<h*Y1L?A zewt-F51)6*zjlC2cyb2$)GqGR=DBC)YP8nfSs`{^+&L1H1Qr}7TW=Wg)KROk`#{Qb zWY6bxifR#@nF3c=*>t`HCb8Y=2P%?eQg6heN{Any=TOvHC;F+0&zZ5kWw&?O6aQr} z=fd*O&sj$u=(9)>JXP1}n>A*L+H)=oS?BlDTno1=b%^F#8_4t7t+R^@O!)y%xfa9{ zR<P4nh{^_<vABp)zm*1FJQl@$VZ)GBGrdY9_w6t;dPVD5SR`G*EE+dF|1+Ga!Pj5> zXPZi`YjrWlJgPijl!K{4yV#R>lklL5615n86p?$&8NR@V015UxKWw0TtEclT-Azim zRFD(z<SofJ*J^Z4<$&JxBma4m2p%R-&u6m-<=9RXDsLPL>$dmh!16|5JmncVr1m?t z&^35K<*ix@E>2s-A{r_df1scZ_;v0ByIuH&!PbfT7JZ&=>`dXI&n86B92s8?_lGt` zI8=myzgXGDL)em}QAe0kf|OnNUDAUO#I`pCFQE>di4LyNQT4tu%xCpXn@5S08hvbj zh*w_LLZ?E4=)Edsy7Kq_!KlLi-%lO+A+efVd8W1jBI-en0sWsJl0`^RVoJ%r$UBBu zQ4TC}*ED3%On+~cIMh>-2p5Rc`Hj`C2dmeDuJ0ydlTRM&9@AFji^<V9+*_0pEd{19 zq~7@Ozr|zMxlo;5ZYUW{h1J?aJlt!QAP>G2g=_d?<QKV9;1E%v*`^s5W{PmU`I+En z{=xueuolXZ{*zUXA6gvWvgDG;dOYED|7+gI_>uIX`S~)v)Tak^dv^E@ity5d8)k12 zF}vdyCe^0gV}Xw9+Jt0(@zB7s;iZQ!@0vS2^BiXp_ywlV%~wOQ3nUizO|;IqOEg%y zeFiB{D%vkprfpk4pMjBfDF_lqJs$y4z?pH|XMx*Su37m7_%m5{MTp-9-#`P*?*S5N z+0jACN$Q)gm?Gk4`{BP4JEE9JpT12JJHt&XD!S5TH5AB`geST%Z>3Sfc1c_uR%1S) zeC7W)w(jrLUEnhqOPo|@^L&jf-tZ_Ppq#)zkhwQvl5&YY4|IDhp0`Lg=`m15O$ofd zj0Ud=zMtBAPIJg6cYY_PZ{)hGO~2+oBRNn|OcBGPJdm+NGLeqLBsZMq%|BB6rP;88 zxNdw5ze+LnhIeTjM)i|=`5s0NrT#MkwG1NeV&z*Gn~8i~qq$`w?%gkI6m8q{1@yEs zv6?*(_q~}DInoBIWYG0W2tyI4*wJ}qvdii5y0p>G?rX8!8fDskTA{R|Tg$pThCSJd zP)0?oaP%1t<E|`_3Wh@2ud7Nrb7i{zUR>VD`AgvG=;g}-qVbQ9$@dK^UxGr@`Rfac zA3n$rTf4Gc^`VZctFKPE0KW{8pjp82sy27N^X?z9qu*B}2Z|KoKFy{jb%E;;nDZzS z4mD&GOxNQzT1FOC@?K1hwmWkbg23~v0OrKx*b8jRj(Oh|428`5R!Xdq-A<=Na<gA7 za5J8$-%~Q~$D^tlZ05K)2L_mUVYQ&tZN=n9zsmLaWE@Dk;`N%&oYqR=;($61Z@O&O zx!B)6`#k`tixrV&C>bU{9t4=R3cp}|z2JelvI4K1PiEgLW*@`0h^P|6q3{Cu4cjv$ z8!RL91%BXSz588QS!1iW!o3VG+G4~G`nx`}7+L~ovJ@z;-;i-jh&JpiB8mA`Y!5M2 zJ1=p*>I<$UYa?+$&bCJLI(`>q;*F#=3U6z@am9A(h1)nP9skHj9?}{Ai&eXBGEN3R z$p-iGutT&{ejDSH2u|pe%iSIY?c||GNJk0EueS)1CR^gA-xnR+))%xd3+(0>*WcKU zHTXMOeWW;;PH&bMGtceZu(@;V%?cS=A}?ewd?Jc1u>h1-+2F>Wheewvsm)iSFW9Wo z=$J`3xprgFaAe-NKd^BFd=F~1+F4KfnSPFEvSM(e5(;!+%oLOQo8Mk66HsZFh~OPm za9erP!t-w(ItXs9i9w>+il>8=liBW0chK+!&$>@He{na~7oQ}r>Elx(NK=Gcd2W_3 z2Ar$U`Wn8sv~s&T%C>KDk$)AjNtRK`wDp5E<jWCT^qU5z9hmY{jBnx+WV#L(78URs zu(LoN`*xRy)a2!Pn~2@3sq<THe7V(yBqqJ3zVZUXn8bu5tiGoA#0%c@u2)iZSeI8@ zqn+}Ko5j~Rg3Cq5{Ke{JVY0E)q~*eJ{L(TZh#W6~A8VcyfYyRrFOLN#pGsUNFli(y zH%wE&UedH+iTyH&TFmG6H7H0$*ME~;kd9G3fDs&mXEZ_jF`N(*Tq}aNHe$Mn@};Y2 z=JlMO)r5i5`N4<T!~{W<l#>b4>ZJSD4f{MYZFb^>pU35+X0?tRLm#vd>l}26Z*e(v zP4Ewz<m0B&le9dif66DE6uj;Jjde@ja7ELNA6Zw(Z|Bjw!j-_t;J??nt5kS@<;{6p z&=@<`!JZBuXwexe7qu0)cR1iJaq561Iw>U9)B<doZg}-v64AmTq9z1L>uith=sn6I z?ar%^Ire*DX>bid-rUCKM26K8MAz*~pssfA2rga+7PvFXeGf-$s2~C>BfeH^=A`d> zVb%NXA`k$c>E}@l(t!6$^jbSRuDxbYAdVxl?~eJI+IVh5-v=+A01HkHK)hdvV4*c0 zwr=jF37GCY*KTnuVrerJU15P+nJ;ueF@F2=GvP8Jm8Z7>z_Rf_ntKo^H;G&T>LZpN zfxnS2ilM>kl5A(ZpuM!STq*9^UGTpbO$)gA4lLzXE3@pd>sYIz$jMLGm&$+Qj|;^U zo(IlKm41)oD>ZeS=ZC|&#R)a)Up`tYnryCptiVfo-)sN9dG!wweX<<(jsS;NBl2?v zY*+Aeub;dQYp~a$Q8@#Yv_@R#=XF%Pu)okqoBOscdLxJ#;Te}K7=`+PKUtxvRGvVX zZw4ZDL2mec_3&BRa_<H0Lz4e^oQFz}UWTvTV&1#Ksqt%Kv|~SRyQrOwBB!C!sVxkf z+pZ9qAbxaYWvx~W-P3sDw6I_dv;bb*6*#!f#)jiH72RV|!hn>SO41?gK4aX_$--5@ ziSns@T^PU>mfNH*EqQVYQlRmR6t-7BF>YX%ipg|o6$ncjz)RD3olSNIT(7N{+TT=T zJB!H&+^QYUpD`Lh1e=<fB&0A*A9K7{egsB!4m2WN@9VM<^IU~};j&~Xspd}%#qLQa ziKk$y=KH8#qAhs_gQh{}3aiz?<Z}(7Ze%}4Bw2l4in!P<(`~n0r!4ejqOK&5RIX%Y zN18IeCM;t0V7fK6(;wS8ij+S_y-eR~?$?z=&Q?y8;~+0{$qJH50<Q=JEgM#sG)EHU zjy$=kL3U$2N<6emjR=ke!;xa;-7}8pgEz>ObZ{w5nuq9m6jrVezpzx@&3{Jg<0gsy z0kgn}<~9A18r2nok@`J8%jybP9NEuN!98bMnc+tkRdZR*I+qVw@WK886M}x81y>bf zMc)+w;uvH4G2jA-e|%fbu>i63j-<XTeef_=YLpZzFqheEFGO3|@IbL;OK?40%n3#( z3%%XV#-aQ(l&%V4O`0;6BBsC+o%yzkPb6gYSy#h%B@l^T!FkESSEM6Ah*f`~K?Ud0 z{gALolPjLf>=4?#e$>;*O=ME-csypxVQP=9ik$Y2!%zg>Wq+n^AK$&LlmtMYTeryD zH?LP4rgJTswMbx>KcSNTppxi-xryaf4>4TPFBkSagKmp~!s@b?%h=;|bkHTy6g|Zh zJvr_aY|)CUd3kyo2dj4WtVzUvb4aA1OPw_pbIt<)Ak?aTZWE1?b?hT`bZyBnQLtyV zQQoj=W?r)?btc=wSSI%r-<go%ubsTyW&Wv_?~5+3tc7g^(~L{xYRN*zc&wT$1X(rK z+hVJ3w~?}(tix%~oO~v3--72Mc$kk|6LEym*JL$cWBC%*6);wxRNK7VYo`#(cRnVZ znKL?yB$vTeVbrbN)FSAa?1gb7m>K$gx-YGn!XDdKS4AIN^(7xz!{`%x8-_6jJBuYo z!dL3U)5yM?*}pqH9*~}7diMKIBZD16@SF2{Y=dInEmuPHOAXfp?x%R^xdv!U@$QHd zzhpBv6zQg2N!!I2eFf;IPtD~euv1?n^z<R2-^0;Hd!PM`8bF<)whEwd*IWMaiFf+r zj(8e8Y;WB@A0d@YNos9LSSw?6w;%U&-D;FmNncL!GiIclmrwW0b-Rxb^4eWzCbPpw zgP*yMQw5>)TYCr-Yx|cr3&HS@Bc5)zzuTMJ-RE6gbq*kikCVQe5*xXtfD&5P`$FrJ z*`g;A-*2~<l{&AuPuFN!{rCX??$?g#nmg|Dmx%h5e^qTI`_W`|CCu2<Mta{ZL=~ey zglDuIQ8&c96sCzLf91U=hZ{4qyH3J;aFLwaEJjP|^KDUF`N@6EuljQ&;PgmxbmC;e z&6{4o@I{qx<~b~w@c8egQbH3}*-?yw8BPQT9(L9@@TG2t&OXJh?%h>)FP@T^1Rxmh z@R`lB7=FeXhgi4+amgaT4X<Fk@APi)^<f#m)7=<%K*`?Fy7|_2cv6oL9Z!k4mTJL^ zI`JkfW@W5_<zneK;lvv&Pq;LZwo74td;$^$WjYRLw*2AA?#!tc^%%_vq9Ir<y_Uce z4F1UqbC-BYf&Awhs&K}{wqNWk#lIobV%BdbapSx+TXCumsm2Ca6Mw+T29U{7SUD?; zlZNB5XBVlGQoXUJmQUx4sq)@pv6mu$_DUV;;Aj<Ol*;{Rbg1vo#@g8RhDa-FeRkfh z^b2<WVzwBHYKq}hAP1_K-p>t&ZTrN)&H}OwB+R4(^^h7`;o$-x9@v?+p5BM6YEq>~ z-VUIFghJem>BlDFh1AuX3VX{@?G0G9YhG-NA=KI-9a3~uBhda(J=Ur=%ibQR>sR3a zPP@?Yf}1aJ=E|=E5lStz1`t8E=pcr--VM_F8Uf*8ux~0E3ZfkDSiXA{r|AI0;@iQ5 zimzWc90&iLJ2L5%TpiP|x`jG=__+~Mnc+J5mqH9nc0eX_M1KkaYy?oI6*7IMO-nvE z9`9y2NG8C&s|O=BP@5b#h!)#E1eZS>#m!$5bey0hP;oy$4Z1U!D6fe9Oe^7xVQhkl z_RBCy>n<Gc*L_N1c*k2&qVKE?XjR#Q^-`UBrCYF=36kx0Y9tF}=;W`9c{Wbs*1EfD zPZuz53cI2g$cwG*6B}Mt0AWfRgWc%Hphlq8CC~boV)_h}U#Z-Qliw?=oKlb-TdlP& z$L+{*o`&!tnG3^#{!jIFPG%)Cv#HsBR7C~5_l*`Up)oGmJ3dRK42&ZInb?_CFE(lx z-xsD=d2&e#)2O=k2^5P5`V%E1-P_r?eQj>X0p-Y3_1(_)5MHwf)`h~!m+I|y-+c8N zCbK)I)u5-v9@U?nc?Fn*Ed(-;)6guB&a_3K<#1K@tDjIfGICVgh!3k64YO}{i6*-} zWp8;nE7+n@clcBjf`dh-^ybelN)76NaIHw!YOzA}tq*7J!(%k?`-=VXia%=`jSK<K z?DroKx?pqrmiGOJNxR~v0PP#ZmalU4nKG_ZgRU8)n3SIvJ+2a!txx^F;=Ia_S^$8g zb@lMl|6}c~1G3zf_F+I8=~8Ks4iRajL8Km}8w4M^yQD#oZbTaCPU(^c>5>jbx}^JC z?6c3=y7&9O=j`+S{OfrT?zQf<W@gQrxvrTU8iRSR<D!y6Fm$Mz$FpbXXADHKz3bL* z`JI<ws}ek(cUCjRhdqdq`at-kh>ZKjt0`rvd!|N4!}NLziS4S^3MO`^ex~~Za(VAi z`7OIGSr6{}1@};yX(<qmf?BZK2qrh3tHt>&o*slNDrCK;rxOjTS)LwZI2d6-oOJ+2 zmaX;t3!HB}++}>twYGb~W!uS}xY&k6$YQKJU8(e?$JE2CWVuxQPsNS*w7%q5eZ6`? z_-*sb+!&#J=N!J$WGRChe!l_L8M93WJE3E@&X{H1Q)zyYW&dLJdw=5c0`sRWssfdw z$A%F@$&UQ|9$UI((41z?o67^XbIV@)srFhs!{=T0s@vKP&h)MQ1g)`}MFr)=gFh!j z_Kvak#E1)wg#vk;d+2%HnD=f*^VzGQHieY?u5oqToUeLo4z+`4KkhV@<Z$eqe1cOy zdCeXBt5Nf#^`_$~H((u0qlNGiL)$8Zml}5giYrq(l6E`L7`Q7J9U*#;5Py7grW7Hy zLW730Bnh9~@NbTbwxNIUl=C<qiSI0)XUY!aXFgGE{??_`+}@QwZ<KNJL?NthV3ZcA zT3;smaz!;%2IHNh!$W+GC=N3Zi0)Ya(l-`U{Q4;rXuZQObIx*Q0bg#7g(g=-czAep z?pQ3}6!2l!L54zh+;MX{fkBzUiZOzOEmIJmQKLPE%tx$J9aF`dNvurpl3N$m&K^m= zF{BCHa5p#9VsI1lyA-_(lUr2BvBzw0F~Lua!qUp8%9WOtl)ntD;8=d(v4!U?n@WD9 zy+)|u&D1_o<eykdx|QwstWFs#4=rv9M{C8C<IwcEw%mD_8&s%vydVzQ+cXVp%GHz3 zyO8BtG4|^N@wpVlKr*w5^O5dicu5r-R(QI1h?5TnzyYr$_MRnzgv$e`NUOG!uH1Yb zj)GOj9GM^#9#eHu3f;*RUR6d(**eU>^v*K$P+l0JU`Q?%Zc14_iBSe~K0_QAz{yhR z6OUY9XvrqDzbUwNfvR@;>MWeXA8DLYWyvIbdOz+sqj?fwu@d(@a1w)<TZqVWiV}Xn zZ7xMon;Z?>BDoGjxSlVbdkf;!{}B~x6TYZpLoGC!Sm3v!0@h}<N@rla&UTZ8#}t%> zsg^gqF!=glDP&7ymh<(gG0)JQ1X0Qee^wG-T}QO|HEEIDP2fZl$@xpWHWO-jn?El> zAogYSE<EB{-*7&1uE}F`a@8g;s1MjYE83KT<_j_wx;&jyaetntK<)Q@=yJgON6JT8 z?XMGdrjv+s@-8bu9p$<b0^m=yPKs9AG|1h)UZeRe+P7U3`8hZ(IiN!Mg7Tg$3B4km z*lC1_#`DhaJ9uve36>1!;u}FD(~rvKdx$ZX3bje9Nt@C@a4$wO^*coB&ZdVkRI_}Q zAyjkwQj=OQX-(;&8P2(GD_+cnuirBd_YPd|EeeWn+fP^N_}$h^2xE5|Tt;a#ez-(S zN@!XI8tj`BlZ#D&0&LPdi~z93?s{lleU&~>X9W@oZxx*aj{$1``Hlu*w<Z1^PehCd zG+!NtbLO8_71w)jHU~f5Hj)S@l{1?tjvu#}Y8Y@XIjocu5^fMgCuWbirB1vzU_wKa z(7YQ*uU+S7zrls`RI8OdQG5A*h0B4;<C^7nGYgTtjP6(;96E6}i@Dy`1>C()@d3Q~ z+GC&o2S|ybL@KrRaT2Y`e0Sz%kkBvV1kN(wIdC=f|6&;8aJ_19?jT|NP?`JZI__J= z%Zf}bPt9j#r)Fo#(D&b@?lVgeX9tiaw3orO!cDO@64%)N3Ft`)$13T+lxrX1PVI;O z;*vzrMwq+%ym=g>ys7E>8?BZ-KMIzER<nn1Q!0-?o8jk0$w=}8Vk`_3&^saeD1Cm> z&saddql+W;U(n9qfVL-^x#0)d?@(V~zGt>SK4*U12obqOt(=KD$Xo>VIuY}Wi^f|- zT;yHb=$I<+M8DX5qTG}bbN$54sd`Z*40FIY;BNJmmuV3iC6~;jBDuUmcv6OvYYMdv zb!}SZ2HHLcvv_IPM85P)op9yDfXZ9Mh<6EJmwaOwxW9N_RmCq#-Ah`807=c*aM17< zOhJVn(dQhUKUJR;6shmqMd{na>z+;)l@Sa#Su1LtV?XRRYdn5|w4nfT$rq?M=>dKT zPPYJdSn0bBElkIguoO#eaNmSvF#s&7-<!KTaygLXYy#$)eB<+tK3)Z6Q?bixxZyOG z(s6|HbM}qyCcP_${Yy-1(~2sH>P+3@5I$~<|AkuHv;Mgt=E958pihhNLF<uA=l7Mo zPRWWp0UnRN{EZ6vW~iMRduK<`9Di}}oEF}bj7AsFd$H4nr)Ouwf!ME*MF{I*PUH_g zd&iYt!kIV1z_9B|iU}(bcBkM^I*r~G?-DS-58ABxsEyACN&Ps*5TQJ&d41_(5`y)r z7A=2pyhQa|wGQsi#?UBeoGSfTznwL9p~>RIs1R;r2nz(WSco9QF{T>rt$(m>u@(=y z&HJOKeWe<F1#ffXVg%xFU<!Df9lN#|Fg`W(M0fRkTSOjEatArof_p9NI6eYSddFL2 z-xf)~sk3^rWI>Xp3^A>|x0>uu^1c>Q!LO>B?P2>~j?jdPI*~PIBFVWM*oqN$4@|j6 z8d_dUe00#S(25a!MY*YWe+DZj?rdV;?c3MSlE&t^2jp1?Tq!S_{b|={9oztXS)A1! z>PkzfA_re?+zucZ0B}e@?Xnd%Oyf>1F%8dNuIDI)$7Q`2p0d-!d%gOp#wOZ$e4~nu z4>6@>U;Tz3TZw;(IRfM_I6_ld)j3Cbzw}KX-&S<BJq<838zjXDu#>w`2f^WCnnSC1 zHgLrYj=pEsq<aFv-mWQc0N__1AhTsF;MWZHFGKJdIY|Uwi#^+fQ|Imr!=Hrxl==2m z$CIAdMSXrZ*XDBsYu^fPIEPcaOtFG=Ai4|HR)P-K*#RN8v_TVnd%QpA5?f}(VJu7U zWvWwH*={H@_RTo#MP3?HC2|wgsFM@*JmR$!_~qA$B*|ZpC-Q&TkNt7lbMS3*lNR&d z##Hs=Q#6|`X^N<$hcQgb5W}{^togeXMO<&Ny3Ua!&7m0c1l{vb8M5)U>*>axTSr$W zmw63n)zfb>+{j}vL^CpWgp&k^=`@HOcw9yA2)ZzgHeF?~;a{-62*e*rHu?v_foNnI zvO@0Bg*WbbxgY;7?BZP#?>zmeC$^M%{zxpVsKw0N%kv{L89*3SQqLSUEQpg0wNPcm zB8X)?Nx;KZ7Z1X^DAd}oP#j*kIgNHbWUV(~FjABgOU@mFJk2JCrV6+}<1n3YI3Ef* zj$u)b8p*lwDmNN@7WyEO#6venNaY5m2*zP+XhQO7`pBU{s}I6c+w?;}17}p|U~02a zXkz6UW+<<Nxdgx<Kkm>IMJZA886PH`WGU9;XVN*u9WPeY4bMQqeWsW)TPtHTaUqHV zjm#72FwNe4j-n-tUo$nN{UlQMZByawwqJcWCgHbpbhuqnaG`Hp@R%z@5l@;9arZb@ zH%a)uBL^C^AQy)s@4ORo#(=Hkh`B1fYXJI=K+vCBU5i9hRVlCK^olUu)US<VknqX? zLMVHgic4vw?PLex^8hdCyj(?@De6ubRpshLB~>DNy&LfzBm49c*~e79i6;T_dHubY z2*Fuu>eR9H+ED@o0}fLa?#}^*EVkIWuBJ-(>XAR)M{J4~$(r69(_V+!>KadN1osUy zaKE6m4eX)l^#7Vy;1#cX6lQ?m?Qt^4E^5v1KK(F=Ot7iIRA&DR?R>&x683EWXKEkq zDH<<!__AN0zroR^WC2nC0wON>R`Fnh>{$`KL;$SbpABVpQY`VnU1u_L7(4oxbzs*z z8l3=lnxmUQ`o`7=B202{^UUO763)2r<w4#BO;Sb~e0ZA!F-!Cj;|LkXX3NgQ9d7mt z3@O_rQmIc_8gT{RJoRfrgA7fyRew8=gB7QT$dJ`y7%ktj$c{d#M-9E}^v<Z4+#DGF zq>Vwla+Z9cSO>L%Hl<x(I($#T+oIHcP7L+rv5rP$5}<b)Eig39PZIR+)7Ggui)nhW z>AW+}f>>sTIMd+dCv;Cl|8mCT8z;ZV&Z&0TXJypPv=k1u#9kL*G5xJcF;FGc$1uyb zR`>>$aH!?*qE!y*pyo(U;)I4@NmB$Y*r?@FnAFDos)Za+tlV-znY{A;JARCwJvbfO zA9Xzi&891{m!{q<nh2t;DshyGHOq;P=;}4o1*|RtoT2fJw`leP^to=8EedEVv?~^3 z&;NQf3u$|9)B4M&S|;Ukc=t;i;r$C*lEwoF&RL?Yr_}^FSF9@M8|!iBx3v(i64KG2 zN2~ik41&K2Xpg7!O+b=Z-vAcIIs;?Zlb@Mx4O#HL#|xrzI;X?4$1YQ695~u{BISwE z8kizN#R%_n{c=%QETY1qHu`v1goXSX7qta9=bEBMu(4=aEy+EQHYJ$svoHd8*C%06 zv4y+Rayuxk9Eq_}VP$arEtaM}!wRV3<fg@`^4U1@dKU1dE|!<v&)tIDa+u{{clk~p z9VM+^YY`HD`Z8a|Ag}ZY`7>JOy7*(<8pjVmD(8xS2;apd?By_<90uWZ*(rhE=tO`B zH)vNE*XJ-*`f$8GeQ#YY;qfcZeqAiOXPrpnD}4lR55Fkkt0TAt2E0I7=H_2hw8}r_ zsmSTWtWF8!mG4Xj92*glYf!}Yh5P<K--hQvYn>h52)0g+&_wYS+IJ-0jvhq+AK|o2 zMIy3WBO7%FU3OdVmSP^Iio#g(@7B!}*K>ZUb>0{?Eok#R-HXIp8h?>!o5y!Vxja>2 zq|_v$obyz(o&7rlck#M-Cr8>pf*Do3jIZh}16N}r&>a>vOeY#RgzsgDBu+5rO2r1* z4)x}wDk}{uI0FYk%5{GkA(mOSBQOB#u8$5G85tD@W1Sc5Or4O5EJwI=jBXtiRwY@> z&cTR1q19Kg_+8q<a5$3kQqnEz)dcnXM+?5;$PZm1{IxjU5AL_4!Yjo;(#^K`6nPhv zmr9d!+eHV*_Fz$!`-DZk+w6dW!_kHVyTi212X1&)kXDMEtQ>FU&IIPAwqL3%OdDnA z1i8XUHrldm!ko~rrYsVRhjI;0-Mql8gF#LFJ*ho*h%)&_(K`lB+4V+%oLy2geq=e0 zAUkoz{12EcWCv&91J)ZP+O+}STl#DJ@&qrr{&|KYzfb)W5o-`NvaT|V4^yhOeYudf zEAh5kw_1p^a?%HQ71tqO%3T_<v?WF{xw?-ckOyJ{@4IuJ&qg3RxW_Xn`<$O_ZYzc6 zSd3mUIZbkVbiI7h4#FYHemB6HTwRT6pBoOyyIdkXp(en{=jo^~$Hh2z?WEwfzV?<0 zT!WkXKuD$#OdpoFz1?1LJ`6CJ$!}QrnLm)*ieIO}B{{0zxF<g=;-;$T1Ry0%Bmxe6 zv|^zNB{lOcLXoL~<%Whsv<OM*I)cox-S%=rG+Vbb)L~DE^<ip_QMO#Fj7djJ^x~U6 zf^PjG*^2LB3tYuXXXB5zPaO!4a0f}@KR3vif1|Y}fg7K&;O#!TjX0;MItrshh2C?) zmruCQ*4X$y3wvOMtlhjl6Aiin8}xs#EV^m(CimQkd8^;@{Atc>=aYL+9DPD2ffYDt zGM|#mb1Jcf7%2M*yp$sB-k6N8U!~t@bqKgb7Dk6eCY)ma;v{HFq#4Tvq<2}h5$|rL zz^OIwBFd_{L6FT3-rh%e<*E^K;NlHvd0opx>g1dLXkG<>%F^r5c<tt#5>j6TV0bgV zHHno=X?kv*5QCzFb?Q>vUs6<e8%Y@IoWlSepTycaVm?{ZC$M@{))%%yHiycBt=srS z`0G4HLBGPI+}BF`u{?$$iztXs^G`X9etZ-n=odWv3U#$V%1{mawxH=`G7&d-*tLF; zeU5{YeyEy?hog7|&AB%$;z_!kBPCr+RLQYT1*nRo{MkB<7bvYqxa(s`OAZNa)Omee zB%vGDgYhhitzSBW#<dke+McGsi(uc)<0jhmn7zKvaeMkLgDTr3zvGtJG?Q3>HMx%{ z*=$yfu^3_N+Qlb{QMEE+vaRj*xbAwJHijS)KF(TPrF`D9O59X>Bz5h;tlrB8=ae24 z=^NJK9}N)iEzm3|cY5{vdiT=EnDpzw2_zmbj(4K$0Vb9d#BFD)#X8n2npLLE+O@8+ z<PXM^Q=aPGPk~dn4nT(0hv%2UTHbjo@~y~cXDfGEquLSzP&f*Swmbml1DZ|-(?b?Y zgMKKzKe`@5D6cT=rw*Jxd|4zxIFa}Iod}Vl3DsEPQ5HpZ+i}oJFg>U}3E2-N8qaxy zzIlK329)U=iNs!&N1(P8^qk*nLVH}iL70tFw(?0_S_!*0>34XsRu>s^5TE15Gpv^n zW!7pwqM|vKJ!-bsiY|V)1}Cn3za1A#KG%!4IoHB*2V8BeC7wE6Kjrth^xIkRB%h1O zkxiz{sa19OazqUPB9Rv2q}ng?dUFNDEMBc|a7TO(wR78@ch{))pxVB2BU^bC5pFth zI*Wz6xs(5e49-uYqA8UjnY|31LOQwb2<0d@t>VY`tMrX(7VWo>k6zbBfE}(IYfyhh zrT&%@TMvJ-K*srz#dKlS<GG3>(sRk#R|~-ar~naT!fhvOd{hc<c}Br}^4y3~OGyU( zQR;PP`NFs$la&Q}-S%m>PC0yDTQaTAUa@MvVoB{|U<2OGT%I=J>w>z{u@1@eDlc}q zWON4#7GjsB*$v6Pi7KyF<T|%YxFv<BfWkHf@1$tF(Bz(YeR^Q^iBAe}4?}3&7(_Tw z1M#UN#EA`qhEfY$o6;tf$#68hx0XAkO?t=f+d468vU8kkY+fI&cNSgTmGcJOQ~v=; z`i@Z)A1d|Ty5?eIJK#C)fPhqCtvYviXJ`vXx%De?Hwx$xc5@r&A+yZB{>%+xF3*og zb*?A1PiJ|ye<;L_VYE^ZzgmJ`Eas7oV-J)&rVp$&uP<*Kv6-l!_$;@Xr+Fy@k2Wy8 zaUyls`0KSD=2~|L(pc`{1s<cTQjT_rrh8c2RxRaMH>E+b8^*P%t73-fItwIp;<bAr zfktCuOO?BMqqX^>%x#+F!A2Xa<7U!auEfC(LeZwQapwnsfSwSu<9lLIzVl8ev%8Dk zd`+nFoz~=qiI|@lz;RmLa{E4Xh4sMR&r?J=b}<cj$CK%Muia<SG#fTnm3c`7P1O;8 z(~BS$sqgyEo1x?F=3Y8&@?b~3V+0Q5Z#iT}@<0g=Gi<d9ai~PV4VT*{NTbS<_Fzf- z-fp|2Fd0n1L6yf`5Z1}K<B=WlFBUIRnEW9|IaU{jx~ml2yRoN)E3&C;{a)B8VU%pa zue{?C$|DykztXV%;wi<#6T?lJuj@9V?h%rm1P&xMK13+DqDJ3NyJ|<$&=vG#?rcCk zQRC)G=64%NT3jg#x&LHnQTXbqZDc5Ee?W$~-Syh~3XQ*ugC0dh<Bv&5U8zNp>df`p zlwIA?-s7{NaIYTRPFiGW<NcA?VwpTNL@T9=f-9%Z`5AU)o*%8^<q@Zg$Xy*4GfqS0 z28^;Dv4Ifr3DEIEyU|tFqL<o_5XG+r-$A%ApzZ;?eNEi@eE`X45u6opIgbHEeN5VF z4R;L-K6#=IA76QZ3|gO`bA#W{=TN%RHQ1P~Z45aU8+#kF17Ds4NyVltD3Psi6(H~R z2_8w|_Z+I(k510E^Gt?QXNNe+DunurLP4i@zn21UPK`a1JWlmeq@tut+q+By-4DZ0 z8Abs`B!ewWx>r_C?G5mPCwKVAa^yUxbgnRynxkmtO!@km+Esy*5sR_tdf#0`jbEo| z5G%|W;F(ntI~7pUl>AsCs$PY>23_f+Ml;%6a3?c3)-rhJ^w7>a!->Sn++#E$s~D}R zq>HWzd~z(V^u&hMyI)L@@svo3-4Z#OO?sjX6l98*9pv``>oj+QP&e;kt=}FDoK~RD zZ}i|cz?yycV-3T!_??iJ8VK{so?vLP@Hv^%?i{e&|M({9VkKNtgrvQOw9g{e;40*) z1bF#UOy?O?BDvfipP>9xJ(AcN`^p9Vg9xQ<`>hBVzPeaiBuFC-HkL&!m9DyP+}B3$ zz9NEM%{X7Z!QHih%@CY};&f4J?*=ruc&1s_r)BFut6vnkYvj%^v^Se;BmFf=6P(}f zNW&Z5*rF(td88iKE(v(m`P>CUDrBr)jv*vZd;~6sww@NFsmX^clLvFp)v7h8L}q{b z)-!4hdTH7!5|S@x)rt3&gkJPodLhFnVa4gz*{drPG9jtE^KRrR(qQe7@VBVfNl)rz z?#Ny>2{)C3k`~7rFZ4~4Ji*l!UwEokarw)P(;DSDRu@vC6|Ym;%~eTMJ1*e$_?>RJ zx5c(d8||8EA5olFWvm`mTHM=Hs+Dq3$D8Daf5l@99WB7QLtu$B;9b{bIPi|L#4eWp zDFVo(HcF5*IX!){5&K-!f+16}KT6u>VyM(02L)2VAZG8)G|l69q^?o7ns09F9rD)1 z{=*jD+z&VN-ZyCMyOYvva>wlZCf_H?dK@nEIJe~L&KCV=Nr%b#@CT2>BHzSH3|>M> zk+rcM(V1B~YHUR>y%`_Px?p>3MTE0uhcHf#lhsTxWZ!Zyt?~_(ByCZ4Ed0!N)6p;{ z=ku8D6nE@VWL;)0E}0RX?AND9yK!(%EIyQ~p;&==v8i$oF%r7oeXu#PO+-6sdc~iq zRz}GVwf4k|g>4Ryie<^+H0h4GRw^{cenqs4Q6qPBk`#dqP8tvg34^V_$662&%QzY6 zlrPD)v00)yOjt$i9+=Wqcl~2U`n=HG;C|==9-w78;v{Pzi34Ci-WXCxnjqQ3YtJ`3 zy-ij(u=_g#EzXaG?gQIrapf`#kXD~|#re|)yIMF`NEgztCY2iNTxgK_1xtRt*)_tu zUfL%)k~GW8_BP1L3Od|1x04Vh>^d$^@Mrigy~Dzn;}R(ZCG3JjK!Y|q3tKDyiJK!0 zpUJJV_QB7$P?Veq3(Fr8O#kgFJ;uH7jsSsx=aQK;>?q5dD%Od*SFfFYUrcBR;y<a2 zHjAjg#O7dTf-i3xOc_bVMT#hW7M2@eVHscZ7_DkoV)#{}__OaaDOT!&I&KQK=arK1 zdZDPkh?qIdpWcqKwA@F*kVHQ3(x`86v=O}C<8Qq2&`9_uMQ)}F3D^8+58HTA+!p#7 zSDv=F4y4*k74mEyMguh6J&PwC^xhw--F6bqA*+t73JPCZp01X|Ot4rV!Dk0_Ld8gq zf_N!fH8GL9qq#Q0FRLn?c6Z)LZxw4dOO`b^-3f$^Kx)N}17W|8TA$I><ZdNF7Wb<e zt2^Q?t_>jddR1b|teIl{!Y?{Q`vn|bY&IGcJ100wiPTBDAh4Ao%8zdulr-=U-n7e? zuPC-~n;W;1ZL2!F`b?jh#2P7J_uc$GmnWD*p9ONs>gN=_z~{4%hqb%3RE#Bu{5>28 z^5eE3i6nfLS%dz$O8!-woI`Yvk4m+3wd-jBeM*F;mJb7p++XXzX;wAZulPvxG+Pb; zQqZ-=K%z_A?WiVGasmJ9v;8_=sI%2P*}2Ezk$7<Y&{!TuE1OsjK4VPI)>Oq?_Y1W2 z@ACBQt_+CJb6=FCObHX{XBhV1nbWf=8P8Lc=B=E^hfFo^d@(@AS0(|OHE?M~(K5CB z{+S|}_^JIn!$Ho4W=FUwQ1M4<(x8fryGMjInaM<9N#nKm^|cvrz8aLNqm}O(;y)DK z)2ew+A(ccIxg}>bc-AU8R2aMz8l+uF47mLo)sA-&z1MPGk4!%?bHwAxrZ(?|KYixT z8tk!<*82~e1W1YEGoGh5P3y!WrKx;eVf-Jhu?6W7FD^}yeQn5?wb^t7t4Q>PXOXg` z;w3nggg<|VA)HS8^r+c9JH72$k9iGEU+k4q-I%BsKELZ>S`g8CJ|;?$5COi%1rcj^ z0%O2EEZk^FU@O9bcxusXCZjTg+*}<maj5dE!ykZH%2B(O|I``|^tun2ovkxyy!U!_ zD{vZAxuF+()-1T2GnJn^lT~u>wOYm?s4iCfv?n(g%QxGFmQ%a#AjD(ZBXU5?O+WJ$ z^=-u#!Pk=30m{YICJUjm<NjD2n{NB-BSkrfeXWU=C+2BwCk>D@I`<z!*qg^x)p;kE zUw_oRLe^szD-<uMNq@NCPM#BtY0{bPiOf=ge8%>WlACZ{?=9A97%ru@pL1D;{8>Yf z-=-zIsTNJqyJ5=wd!J8y@-ePP>3lHja|J<G+g`F}<kQs2mn;c3lC##Qb>Zqz6TFXw zLLp&h!U)LZf&`EsJ8+2ULiXznV({KfJLv%bdhZ0M9SBa`hr8>e!LTBe#yQST^BGq( z?**+e8c%dgM=93t&_{SVZOQ=V#L?ztsPNmhoUw|>58>1=2a{BmUD6N{7S)e>Xgj`D z;66canNv<he>t$V9s^qLD)MPttobrZ$I!7L(d#en_+Ff>>_4iwTUdz-r6}K?|A4ua zkPnxlzMBP+jW5x9{3XLmd5{U5gHFxjBy07-1k6l`&D4YgwX4QQ?~gj~;^eM&ks03K zO*2hxfc~q3({Gq?P%Goo-IVK~^s=A5+Fjr=ql8TSOEuz69NBlY4JgZMLi*n3?{pa& z?))kDr4MjEE8T|-i^^X1o=;si$Q&cCFtbWZ1ka`d{m1c|JKB*Ra2qYZl2?Ndv|f5y zp()c5?2b-4yRc%pNQ{Ow#YN%gFGQd<V5K9jdU8cTkCoM{8#Cg$!H+~77*4=)o?v*% z#c%Th3lU>Y`t)9Y0Gf#Nouwcgoi!75qKOY6Ds@j@#XBPMWd$1`6t?AI_c&&ZG?1-4 zo;^3uCokwrrOkkheFa$VL%{8o3{WYYL3qvT30kK-Ug7%DVCl_tjN)zT_PD5eu2#5? zl>FTHR1Tq_26kW9Lp_nz{fQ4P)2-X?s4q2}(s=$}pq*--#eQv%!(C_F6Jn{xuzQ;k z0p-L^N7a@ebX8dr#=uBrsUwsJrk-69(_1RIXfab{tW8xUVih2wDzWG^h#e7e54>f_ z$-eL8WR>3lNG{ZY>DzGdv7^}#95}lQGZH_-Cw|Wf6cdr~$z|TL+Z5(uILVNYY)&+W zQ`{|^z{E!Iv*Po+Q;e#TPBz;IN-TaIcEBXu{AfWkicoNF-Ct?8&|`g}w67-e?amUF zPyN@3`|YU_DVj2(T6HoA%As1*Z#e-kM@rXo?s4}k|1XB0*YqI8pzyb#Oz4%>*H&Mo z5n-$={{pXr9I>a4ikzazvt^2^ZD%9Jq&0WL@lR-dKtOPEQm&>alr{VH$AUX|uy*Df z881-zCg@&qS+^9k6hvsRc-J$v%NN6m`CCW4VPv@tT4A|{kv>TQNawYD*H2f@H`jMu zJX`e$AQcRLRlkL=_`I3UGeNa2E|jJ*n|0|~q_zNbwnoj{OVBItQ<=BbV*-VD0+kvH zvNl8;C?XJi=|6E?u2T1DZ$mm?z0?lh(a!wZnDQ97QN~@LwBt=cnKakvq=|*MWNlb} zme~6J+>c3`t@c<n3ny6;nyup=vS*ixUWOr$y{*Ik?ld5`9_7N>vh`abwL+?LtuBW9 zYrz?YksoBRJQrI~X;u6vbPYZz@Q~aohx(n`sUW*0x;wRC_2fIduT!P0^P53GI*^)j z>!n6>t33)n^0Ubp{bcnc_&($3W%EFz&9Euy@YIWhAQ@~(smryU&p3&>YyuOJq9)48 z7fc)teQhh(^Q}>{+-n!*Pj2rDu&_Z!j%dDq+Uc}&+m6s(wj@P6%X!T8sZ&P?q3rvQ z_UcV<?#;qrufMO_G#Cbcl>Cd`(IShX>c@SEh~~}@Aj!PUa|5wnlf_BbTGgn~NU~j0 z(EtSA28~UxwCb4C$&#Cw2~hlQN}Qe2g<~Qpv*~o_6MT%SbphmQl+Q{LT>s>W{8r*^ zo&iobIN=FKP{I?otPlx6zlqXUXM`c>(s<i2zx{yfI%D%BwJ$-w$t-f_n7DDCz~9^o z)M&cT#nSO}svT5Pih^k>TTaF6Zo(m(y|Wf;O{VW%=!3yMsQXTkGruzMBS4+`uxg(t zVttbOJ@UO#8n{czIPl7Qf}h?H?%;4_p1b<=3*TA2$?~g>$C`Q?Rr$(m!P6Xc4*5zS z>wVSWmmg|Zz6r7ZvN`pkAn$HAx^|;s@=_F33XjOapKoz>nF<sy?2(algj1I>ySXZ? zt+ZYm%x<tA-Wn<^8b!M87l*u>6PMlKNTv-Cde*~!^|7b`Elyjry0NSncp|`}6fs?8 zMkO$fkqM$!1zR-UOaiAHg<5aRW_fP8JJTllr$?JA_lliOyRbxyberXaT(^^GC_d+1 ziOc5DcMT7Qk_k>>`2lE?M9t)J=0pAWu703Azv5`Nq23a>(#Y)SP8MtD@H*T<7@;%5 z$669~3y!mhg!=uCcU^HzZMq`^2hqN}zJBKS1?$sCGEa?{ILxn*upTdd(fDZo%%mg0 z-f3wlok{^uum7uMkOj4uf`NT{Wl-B~Ge(8NCbtt(evRU<=f=Yg^!RiUgY@Xw@18l1 zW-~u~5VoE})*L_3!(}y}0q}Pt`Qw`*Zklgp7*+Ghd7QQ<M(v9-UK=d2s(t8OjiL14 z%==`G2^x0z7Y)Od!P#ubJD3Fvq!rrRjEyoV6&h9|?5hY<iKY4?g|p5!D}lsr6@kbO zzuPtI+w&tck(G{^uhw;QwPw}pq{{2L1x?nB$}AZSI?Pv>mziIew|E5e>1yHmI2zs5 zQZ?tYa45rf=9(YNiWWXV<l+vbeEdatH#~x6&|n31EbUqq;=`>x4^Te&gLSV#ACl1f ze68Q|bAF8BuBL%XKT7ow_xmeS=3z#kXKN3PKUnXKiSuwbK{85i4oBHKE5{uvHI>4? z`t9Kjk`<I<pHL%mF7fzYFEEfQZ+GChPbe%!<Sf`Rkhr64C|tz{O~!-%HF4YAwukRX znUPW}2?xUf0qK5mJrP%7)Ier-h$ZKc)rV9~3Pc;V5`@DelId#f<z1`HFZb^7(8v<M z8p{sOTg1Z<Zqgpg!3?nD6st~oGo*zkMIPK_upWi*u^xT~RG6N@2=r=Oj9;EryEp?{ zUS=0~1PW<{Ew+~w_Y`aMy=@w0GOxB+^Nh^L+<zlPpuBwP+X}Z2$rM{Pz2TN~o=`2) zm^yZXMSLoAV^uolb9RhT4leYZ#EI1wb3&l*V7}|Cylerdl@KdvrTW=Qi|m8u@5KDh zrYU(;E*bB}N*q-*jxUs_0q&5g*5Rdm5J_7Zxc_P%wmoFePj3`*l#hplCsdX5VTriP zHhs1}Z>kC*?ACAo(#)Y%dyr&kbrsLK)vPC*f$5)U-ps46{jpCs(6cPugy;rP9rP@Y z!WAVY)C#y&w%0m+3CFBjQP$yu>#(L(WaM-`a88@<5YB)^<rJz71-GRpePh=r{i+2X zJI^Rzp7D>geE`<q7k3o{8l8QYta?T&cTqzk;ykr0xU}*+_MgZh7r#N1S^J|8!6Tjg zj1X$WfwiG)v+7+rte&t`)~Um5zg6`jjqyA^-;!@asCPR>k@JKI3`%sHDLkpB(04vP zNi!LJ6C-h#7uB)_rY4fAGvbKnjZ-G4g@!`N+AzA!rr-Vty6{tNL&Cj8>(T5YeW3;F zvyjeui1+2$w~Jzd+>xE?2OFY-0Y*{RiKzR=66*@odE&v@c#LsoNUYyh{!~hnH5ZFg z{jPQU7Ex7jlLUVIT_Wpff4lWTP&4EF#$)iPIHAMQno9AmCLFim<ZdGt-1k{aZI8B( z_~|9d2<7QU-5kG}>wnp9?^4P|tnQ%jB4kkSo>o^^ca*(Puj*^}i;~oL7-N%zg6*=* z>iJ21p!Z{Ex`UZ&jm!x<>_C}ygu9}M8Va;^b;L?@eL=ff%vfpHQz2{wj~@5CMZ1J% zV8Eh60+Tu$MWBqnZK3@n3^yF8@fJ<a;=2j;fk)9Y^xR+ePkKPCn1NRHCMkP*t_f5d zs4(J5I$f;v3vc;i1tOB>Iadx-5ie+jYW&^1f(Zv5rIuf)>{cyf!7lj<5aYBGjk<~& z<1uTnS6|f7W<N&KmC-z>fk&pb3N$;+s=2my*PN4YySSGM%1{mBPTv>wcq)~^hR_j+ z-DXj-r3Iy^G#)RfS0-2%4SYwA;g^QCx!drHU{6TNVf_bwo!cr#N63BYn$#T33HBu{ z<M}!V%^DiPEVZ&%J#IY0KBty5TawEMtAkk)n3HrnW_*w1XpdU@@4G)}cL8vLqqREK zBOjujL|VC2g$zFwG0)SmuB&tq;}x~F9L~|7Ua2%0MXc4G{kqm{HD4z#-@zXyjQAFp z4}LozU6{G;$F<PK_0>s6g9;96oXJS04UQbrxIjZd3a`Vnn$wFOBSi)qPx$cw_09Gp zkK3|&muuJ^!DPBJn@Lj0#`@|N2({=cs_pheH4s3XV!Y^H)H=B*<kf^Ml5sLGy?yL* zANtCi4J5=wxk+^5mdVG+X3bi&rAowIzG_%c-aC{48K#&k(qazeD^c69xoy#`^za(W z^Y|~z4?Z0{%(yGn=GMbJOn91hgO~B7;e%M5^={dt<c1&5XID$s_$iE!#*R2L$QGgr zukDvQaa{r7A&NSLK3v+#&uP*l&}&fJQv?7F+ZmIv#yTU(5crufZMOW0<gzv`d)v#P zBokNK4ObzS$Py{5kM7U`>Tk@m((rx6tFTJa60VQ?T3uJ+C*+rJS`QwYDh+zNeNAv& z=~d==hj1lf-HVuWbz0<Ogps0oZ!L~e9Cd&8$7k88Igh<C+v6=BkP5DS-RXS5^`$q~ z%y`y0;7Nmk^*}NIy}N;5?+hyCDRjf?JDzce{R-=?p@fMvKOqa3q*YgS0au=&yIpQl zUI^tWQOmD?jrA-Z;RZ(WNqkp@ErH9V``TS*r|_CUUf{CHgLuI0_5MisUMt(fbkQyr zcrKCp2tFssdyv4>j_R^Gefi+Y8@Hvzu2}Ji5Iw;DpddZBVdJlJee6SARC|A4F)M2p zefmAsLOHV&+*I{l1Tq#}Ysx*qJMZ3b43e?lH=C`2y^Zlm(Zgd8e@IM4lbYRIP4&c{ zZAZl`b;@&?rjYoP?!UzOQhnn^T)EPlM?8*B%pLR5a)!c8r^!5Wbde>Y#q(cQ;<xC% zS3Js=pl9mDZoM#H_*^=zK4MRezGJ6cd9$dj;1#(7U%cymTvbAm+uEBH+$^1c^6MgC zK1aNKNeN$`;3uT=4t<1?mw^}>3A4&f(8IeX3b@?n&*8F%JI9tB^=4}#{pgoPammAu z#+2#UFI<uh0HXEc^c<h}v`y@@`~@#2W4HT~N8em2e}{A=Z+C;0Eh0g8Q;$)6cs~(5 zAa_Z>>IxG0EZf39bBeV3y)VAxfuiq+=Vkih#-Ln_+MkVTgVf7`*;M1=(}1B55`_6L znhF)KK*h!!Z{IgPr=ULLFkrUvtt=t`danhRSqMti0yov|*jdx~ixgPldegbs8pKHn zU-H-<GVyg!C%J>B4zBB)R?#^2cw*(!aV+tQxca81++CceN`hm{U+xXNw=0dM$nD;< zm!^6a1_C$BbXKHuaygSMLHCd@bs5=Ii$!~EzlFZAKn?FK72<rFdmunX<h|f=kqjC~ z5-uB-XjddHcZEMyv<WyBswMv=O=Cv=lH_wNhZzBbN+oM!;-R+d-XiR60kcZbWA}sX z!tu7GL2nG(M;HHJ<sJwOmO2U;tvrRtlIxd8&IpnBO4L>~`6L>8aZgi843_#923PE? z5(+hWP~i5|<+8O84}Um&QE6<I!c8Eg6CgxzQTvZv4YNuce<q`%zXBm0>CSc_GWttz zb1`nT**D!nFmS%xGfpEL9Gh#v1taC+5q)#WZah>S!>h~?-e>*n*DYA2_s)`59m?!c z^!+@aX>-T)OQ}x88TXx^C;A(uiJT1!i~;4Ap8e$s-qoR?NH1QQnEa2`{%a}t^hoqH z-vBvj@2wfcw$ZPl$dprD>cqhZdv);TUsT1gddj&8j3`+@Css#<kqGLEWlA29f{@~; zFW>RO#F9{i$S*F)JcpA()PG`o#(s0c0u^~L=eCw)Ikbl^&w5KLfs$wCbAm4@)n8?Y zK-~7Ljx;=91l<cNZNAc+TMUxfgWfu>=ZEwiZ*e6Wg0nL~moCNr_o<2-V^3f91$Wmn z{JIw4>XZP325mco-`n{UkBbOS9u>d)4AoTKlOl@We(m9zI99w8mj%Y;!{4NmNB~m) zIO8HBd@ymHxB#-TiPx>4$`!toGrCEDs}-Yb6o^BOYLKs#2&ye#@H+Kf=>HlR`iJcA zX`q~5Tm;|5FCA!{^zgm<%kMNmfN5|~u5|fR3F#I)IM%ROICal2Jwc&YNODmnB_)Lv zrej>1f$Kapt4Xl1CEcpXZ_8ejfFIHUa4XZo;a(j=`Qq8FMW{AG07i1ZYB4mGf!ToW zf~P~e6%tm0z`g7D7g_$3GxbmV=7$XnayQs&#c{v>g`W>hdl`ne`L$LFoQ^O#k<f*o z5WxT`@l&eBRYG$A@{|<}br$4TAH?0<+IyEMB9x83|K<+OC4L%^RjKK0(rsYMqE~pf z9rc%j&c9mXpR=Q4`e2np+iAlS2Y!~0y-wUf1y)apiSM~oP4^C;vkyXf>(iAN_eJS8 zS09OW>f9ZEogt-Xjz^LII#C2bGh5F(+Ai!@26fjruKDM2dxPxWG3a7TX_vx-a_DOo zyveT%f3aEr$Ct%WP_BH6>-_LX>n{vtF$K6G2THLsHSTWIC+a>8b_>@a;JYIIV}C#L z?PZr8+~WEpvGQvXV`8jDuT2*diGf`C4-s->xjvpsu6_1pi1~X2-T7}$1>8iq!nZ!m z&|;2$C?Hg}FO9oB?VKvUXFz!l6c4}H_$bFc`6VUuzc1gd#oE8MSj(wYmJ~l5f|eOc z7|JO+anu#;?`2rsh(q)4U4BIQsaQr$+QnJ(0#`7M2|kS9x`z7n^R|&gym|6Z@8~gI zKX%Fpq>LDc#M;NYTkk*RZ*qK_GTS8lh;){EAxExz;Uw$xcU*o%@o?ODeHs}Nn*~|O zzCw1opUG&2W+6u8<gdE;3&HZ2FD*pRfkR=nD7hl~i+VY~LKdU{VMCg}`kH!9?u3N< zSyK}@Vf!lFwmvH>9!)*TVzX%8Cc>5{zxbGnE8y{GtME@D|Lc-%fn}OVLF@V@InV07 z_mF(<m7cyv?h8vjiwES|kdtje$RpjR7)bV(;RDW`0Kmzr1!cAQ$sh)Q(eb~I@{jS! zmv0SlI}hP3&aV@ENsYDgRixI>lSy8vg>kz1=HA)andZUXN5b3L@ymd!b*pW8|A%n? z-ecgOuPH_h7YWj@R~{rb-L}&I{ONDgqJ;C_N>C8@GlZ{4w~i1GR7ewYEF(}ZY|L<X z3y*B}6e?x>3YUUgdfgIONEopyLEMl87Mk?Yz%Oi&|HX#<<HdzevB7JemaX#tBCdY? z-ra>(e$P3juHkre#6xjb1d*n`ijenVl<T=n-M**xfA^k5HqZa`lJC4uP>_+Ph%uh1 zFHyNIw%GhQI{H8-!rDh+j(j_i>VGj1ut(ghKAN9?wnr`Sc-~%KFhLJE7*M>;AxjT0 zg7$V>ym3c_RW$m_pR1Jp*oXpxV)Oq{P+lTKBTGGRZ0IAZ43{l-!Acjp#W6)V3<fCv zr%DEc8^{f>MowfifKdIX<6#XxQ{KGk^^`8pXZ;VTV0*r;uF}pyKLEF8px0~@j1zwQ zLTA<tKO2=_RQNAnumiw}Of^uu822Z=5GN-m_sVz{DkV=I5&D252&)5-1t}s7YzjYp zyP`&e&OI>zFDLNlYK^~$^RHio+9`mI4zy#bq5f4_TBL+PSsIk8EzoPXdto7!1X>i+ zP}2{{i>v^In1Y$}tNQ<Z6#Z$^G*~u3ggBRz&@54YU4v4bz^F%_$Ex6%ly513;k7+w z|NpJU|C`XMmgvaG(8)hXg<f6Vp(Afe4I||NdKC2H9y53!QYNr?2TOnIc<_JeEF}gw z{GTP+wKD7dYR!VYC?fi!`8Eq+JUxG)A*U(kutb!Uq<+40#Duhqdn<g||IdU^4ds#y z2Il4lN6i)b&$gpma|m8|<76%S3#8Nv3M15cx%a;0`XLk0W#zu~3c45Q{Wc?w@?M%x zG94uxDgpRWhR>O59g(<3UhvID|Nfh5yZWyAIhI+Qg`8PPQ^J|d&VZE%F7Nku=O*+$ zc~S4<7%Ge&#eMq*Me!FAkql``Jy7*mo-MUpDLuZNFSocTzJ#>=pz`{;0pA~e8vpr8 zh!mU7^+ozqww%v2KXo=dlOShimOa!3=RM-|L;ActHnRy4N$_u1IKo`yBO)C1i4nCB zrybe(|JkMtj3TsyO)kWFQi%2){*Ufsu&U(zLdUtTCV6=@LKE<v0}0jb7xqXQJWX)$ z-G)1oUgqBg4#of6uIs12zip1>Jxe9zWxk_M_!;G=nX9y*g>gvgi%M{?!<L)mMMWhs z9S|^az?SDZ-V?wj2Y>NB_jU|X-JcpP{f~|Gy7|FmzNa{}CjHUniyR9NnPjT87$uJ5 zJ`^PaefnW$GR)Lxb(Dzy*?^{hF6#fb<PmQ0$PxYgn?5|kf4o}@s<BLAy!dhV8;21Y zRP|^c&JJjV_ILMb@6(WG7})ZJL>%(OT1@w!Iz#@Y!Qt)7ke?u9kte!MAlUuU!OlzQ z1^L+C-ZYJhN`vuK?Eyhwv35^XObi}z*fBQ>_;sF#V1SDu!aptTU%uLggPGJCX|vM) z^p5ZdBAmYF`8||;PS-e+5J=n$x<4NL?U<xTr_}Mg=<vUNIM$bDI9J`PG)jb%T^Uw~ zpZBGkJR&M;nL6kQ4$8sJId1>1`elM~ID52W9Qo8;L!0&6?F^}R%zADsW%~Wje=^h{ z!1z3rOcy~oKG0%y`FX5B8Z1-iQ@sb6o3T6x-Q+~*3_5dQU$qo`tDLrE240i@TUm#J zyHHPizT`v0h;L;yH(21^^OO2vDU;j#0g*|7nNq@~21};E*8MCiNDdPYdb0DJV5*Vm zG5k+*{L?!BA%0teu;pDlf^OL%e~4JiJiLP9=z=~OZ-ekQ`{UNK^cT;+f7XP;L0uZJ z=J#wzQemdP96G*dDyOGOWcsNE;9oZRA6n2Y3x^ODm1(^MS8EdYj_{WiA_prZHdm>H zi&yZ-<J}X_vUp+6PuBK9(Lg%NM581*9U0&JrOV!*#_?`Pi{Rnh@05Z4<3GHekuyz} z)zBkkB_;Pa61hCzZcSJ9nL*g(8s(QCflZ!}QIsW6?>8-+f;#wS{jnhb+ouZ!p@mKj z@}5h^h=-Ejqkqx}7`R$Zp;zdQFjMCaW?3d!8MWE*2*Gi#t%0>}69>n$*yM@TlVo<` ze=P8S^r=>tT&V;STB+3k*@O~G$gJ_q%iL%3K5RJ(Vz%qgYxqCv?jP3R_EUE?+_A+` zdR-NV5T|mKh-A6-KHF5SUAzm2nD=Y6=rsgdA<p4XV}EywXX-+}P+7#O_cTJB;v!L` z<cUe<?`1jFrSySSk_}<3`gf-MFAD)|ZNzvS`@zB|@jhxEo&*^6f@m)}I4G`{RP6sK zzyI5IfnWB*-Yf5VFIGk)^zjW%6vxe5Cbdc#KtfnS=#CQSd_02!TmIH2OXY7arBDlM zCQ`R)W+6(n_Di<z?99wB9<OPHykMr_(-f%xox1&bx-a3`eGB7WB)8=!WJhEs+z>G9 zP~_$1>0n+zd<GubUZcSHcORJs_u%0sLbqvY;YTK&x+pL&D<b%AntSgy{++%5Rc3_9 z7tr3pOl_FZ)6?sCZI$B}fDI8BNq^B4Ac+UG^KDd?&fi?S?p-+Wa^SRpvUN`s$Hg@; zb~tAOY^_<t-EtjMbss2hc_=tSuv8fS-AVn2qW}KswfBqdw*0KDhqQ@%YLN!@cc52I z?CsiM4QrwmDE{smE}}WV)yFJQ??8({$A8WSTW&^8O)cI{zDd;4=>1<l5+yS`TS`G8 z%FlEnH!AM^d&=|(#O~r_IH+hkmJA9GaA|}~m4g4G5&uT&w+N8O3w3%PhREXLQkcO( zCj*}iL<w`+%pidss>m|@n>!>Vgy0CI`_+3U-P#FggzPwhl+Ud$V=;~YO<fjhA}j?? zQ<bR_<e<FsLDUN41ejNABI18*z#v}cv6W+$O2Zh8D%aFKJw2pSba=hh+;6q4fqlr6 zp8Gc|^=H-d@(S!BucsAKd2*}7$gO2>XV}4;CNXpTbj1D}U-!4&61pZB@+;FJn9|^2 zNE~FBJYwrM^)h$myp`t)Zy?Y2R89Z3JSzc1SR~)5uVI>x5+N%at6VVYlDhX0a%&W( z6rTJ|f&OL%`-qzpFY3inKEAA7(8I*fWuSrvF#4@C2>;!FoWP~$D`Ut?bF`L$t@v>w zm<ZNxk46}rQQmo^e^Jl>(H;KR!S$oa%P``oyjvwtOMtlpzB~KjZj{4jHCVbuSs!4) z?kMvA-4}NAevyT0Fsi_z!N~!<-?=S=C|N0~-V@fha6r@K%g6q<re)q*L$>#l6PeMn zvCR_}w@xp(C!Icgerx+%6`23_6k$Vs$HmIhQCBb}EAGFVysQ#dP*jvHHGd#njxsIw zUuhi-Ts?vaJ_d7a93ER_IgN%RKyU&z-pl?kH>R;A1x6kBVZH0ND_b{>b2M1H))u9| z?I);^b8w7n9>3^7%^Ho8IsTIQ;<-xkbr)Jhe>KC!%T|<#IizkGxW6kkRYJM8S!^a0 zl2H*T5!zL*$(dVWN&S-yC|b_IA_Pj0|4oY!v5PP=GV)NVu{ZrYRb!#rQT0PwS~uqR z%5gZJuyD|?R#KsV^NC(wsK(ZXgyfn9&+u`{3YhcC?awqMseR2ws<FTnd!<+Y_5=Mk z#)_AyBgR|4bV#e*YDnmRsUe!M{iFrdO3ga5CG>bwQ7#AZ-2=&dSwh}$X9P6EXu#ZN z_~()R-94%BLhN~iVfA9>k|VPGdozz6p`@*Cxt~b(9cl`2`K9rTmHL}*2n?()xqUnK z(TGSoyQD0B0-qBFY`K7}{sW*O|DlT+F^OQ<|DHLT#*+p#yo&_9ryd`Fv@Fo9N1@6T zKTo{^^f???c+X|V0RAhiCKr^#3l4d`I#=qkT4_lQ;3R091bHh7Myb(&`26Om?%OhC zq-NhnZ%*F=G(D>iN!^S5oWkFw88>D39dwV@%(TtwRVZ>*<~e@%%y!t{qThBrP-BHE z93u)qxdV=NM^@NO><{HVs-L%=@;h;@CB_se<uL_}=Tif|ef;^+rZ~slFloNu4azru z*hg;W-I<}|FjMUNQQf^sJZJ_0?5BgMUfxY(m<2BL|KSNkUV{2LnM*h2wQ26_!(m!C zZ9mY!xknUJfSk~2BSP=X@NQ`2eDyKPW^tP*|B+qZi*ymSlb6yJ-;1F0muGs(WMofY z@am4x7tYLUIPT2Se~<`|Y?XUTy*Y7JQQg|OIM*7^k7INFfW%GY4euLFA_j{Yt;I<q zlY7lZF>j<|8G0?M=P3aVBiaW6?b-dHf!~E6Y>x=QWlKwsW2qll&CiNQfq#?n^s0m4 za$4(p#A^4SXvvnMH<{7rnBZvxW@Kff7f<pqUT1oKX?TVjF%HYVxs_<uuuLt3M$~HZ zR>G^WGs(U_JK**46d|PF&1#H%exEEP7Llf+K$8-oxsyt00`g&eih0F<H8obmA9V`y z`giZA1(rN*zf?mcV7xeT9$MbbqEo2_j5elMM_*&`ZR|*!>+}8p<RG|EczG6tZ>!R0 z2i=_Ttl*fEAoX}&yyjXfXjuuPPO@0$joG&n?{FM|&e={SbQ~#x)Kj`Nh*S`kr(ID8 zIkPQ~q0^Zq6Bvdq=S_#u;O;8Q-TjdxdFS_`iSL0+01@EI0Ow)+Mzq{~N(z{p220>d zu(FQ-C;m-@1blI0an9?@p7uaHx9hW2so36FgM;t=Y)1tp21gql_uq_uE@-~tRRrZ% zmXG?FgjA4Dj}z$?DhxyK9vKHDA$AX>@JkHvUd#qMOcrRWLU_-_=v`l6tCzlve9dEE z+P;K%xJ#?5JvF`?KL?|pth3S^+u-`qVuq$K?os%f5iR>lpJc|@7r%QBi!C_F%7scS z%y_7h-At1k<C|imb7p+hk8h1iXROA5VpO`N;ogrIwqi>db(6Y{$xHNVS~bytVUGxD zd3e-Q9{dQod;dISp`SCv`9RrZzA$gHt{P?v7s9R68A3{pfJRXI;Ubj>J%Z%%vPJD? zN|T5C$0f<=<SNCkW4$suG(wgrM-rAeht2CUUzgOnEnLBbMW;SXudO{j(JYHZv`g1Y zy`HEnThHczZ^4hU{TwC<(0j)hwNU@qw13==9;Tzl_HJ;*J5l_YeDC?k-6$JuA2MU? zf8vNo<iG>;BBktraf)6_SHnqIlI;)4`*mgk6RRI1Z?1O3OFb};HyP*ZwO1TwG`$Kj z>=zoHdXD&u(F;U1Z6A=&Y{tz%KYuxC+u%QniC$?OrfRF3B0yK#b~WId+3+k@`#6M| z9ctuN2w7~txsI;TNMV$YXFkZuL4Uw~*;;e*sc!h65fT?*zKuI<P4p?D906Opo>@rU z->*7)8>Ro2x=6h|Kitg{&5?d0GtiGrv~|`+=GjZ;Ie@x3n<nhelRZ4FQ>_LEb!d4c zaG_-XwE7#n&`0fy;FSO}qZ(x?R;t1oJAlV#vl%hUNVQxaYD!LB;+zM{lk9<s5fQKB zF`k?mUvyHf`)QTm97f}Jp(7texxEJ#y%>1?9<MyR@WPG%K2W0ve?yIs;4=&&ij?v) z8cr`+d3I`ERW#t0A$F5`INv$@_5l+F#XeoLg9Rs|_bpWM5FI47{ff??35va5SL$0l z7xUU`=|b##GAKaEi3VsN(X|yfgcG3zzu)S*>wmvbKTQ9D-<vI&FG*>3ePJ~B420G9 z6~|ZSfK{>s2l;<)m88hQ9UmfaWUmf*&+U>EKyg_b5A}Jj4rvrhEJ+@9Q!RTzy43DK z9b$C27U<k}YR1X<a$w7M!$_&B=O?;K9(@@qd*x<g*Xm;1fO5&KoUc^s)PC#??v!w~ z!P8Dr_n&y6Ch8a_ShgW%{xfp;BSvU#NVG50q|#jDIrOSd_SR$Fp!$zpO^|W8_rx&i zaKrsVXI14%(nkwB?@BYL^dx7Iueq(|k#JBmr4kkrzK_vesrRDvc*(-ZHjVQ8O}w^_ zw`Z~p3J##d86EetaY3`~4<GuUR>dC-^8J5|y>~d9|Jy&@R?DZY(SCFhqmwGCHEUBf zTC1hC1x0MBJ!4c$TeYgFt!C8-Ld-~2)r?ILLTw^e5+jj#F5mm}{r-;QcR%-YKY#ec z;UCBQx~}tlt@n8vcO?mf)`+$35-Ps!vAp2Lv7$%?A{Gjgt43=@vIqP`ZomJBtFydQ z`F8NN0CmjNGK+HP3NU((c>C_8XaI7TTZr~t`2W=o)U79Ja|?y(LG22}qfY6A^-Woy zD(~8ioN+u}Wfe-PuSQiw98hr^HbVn5<9*7sN9;;_)}2marAEN^YmNE_oX>V^oW#$< zL{se&gn1Vowvmt~<zjb5r15wa0AUiTl+^$VaiT`ssMJJA0@C{#C{&&I*od3!^3cbL z0!12YnwtN9uYyjbNhtx9_M62%`Iza@8cWASRsgipvz@2J%K7_#Eo~_HoiCz|koD<K z<0r#{N0rwXJImvD^^O0!wR8d};}*}ReW`2lMYkQn%Eb=%n^HxZF8fsFQe+$u{_t(V ztIAmea=f^~LH`GXDo-CFO9YbV`FHPLK|Qwrwb836onIa;@iPfq<dxa^{C8V)H%>r! z^`lj2QvKOW{zO3@uaCoUL-Pp$w<QT1eKd90S9Y-<ed4v@hcg<0h~A36l%l4coGf?o z`(rl}{9XN_OZRsvm;8;qxVM<00^W(oBmv#Et2Wut7%pMMA{fE1+jVRS9I6&VrO1Si zJ-H~Xb=bI0#(7QLgHd-qaYVn)LHq8P<=?eay6t|b(etfaPB0z}oUlXFe7}nTmo$4F z1Cy0Y-Rf4m%Efa+(RC*~oHNskDd8+E9q-OVagWz1h7$9!T=ZBTpWy_XR)~y>bm=El zb%yusX>s?p#vrZ__<znMKINn<Yw78DQQI^_RDjiCpTN;qo_2b)XJU1D4|{==oc1Yg z^;A2=ZH@d@>M2si;M0ZM@pgB|5Qb_DUI%RGVb}L*NXLY7Xp*jQGUROT^AT=?uYc|v z)DN6CSe|(~{yie$|C^=*e+@sl-v7;sRH5#MYpD5{{osCSIxe>b!TqSD)!vAKZvq$g zX05QaX@HC(?9=%M#?B_!w0f`l#`IX$^&_7k1d2N2kJIVCwO=W1nf8<kGBDqp&ut92 z1JNa$VsVG+q#Y*=k0)Tz{+HP1_b_(;bnAntZ3fF+9z@=!C;(qywy?jHCH1)eQ&Vs1 zsgBiSaP<9$>!^+6wP)Y~!yV^651BYRoAybqR7EBK9Pj3QLz7w)b71rEO-@0WfNeYM zDiDse)X9qp4gDzT9-N`<n#*L@r+jD;5Zs?<ko)L#Xqx0dI?<2t8x`^@Mu_ynRMx7M z<5efye>cCToRAu~d#x+oQn@8^>a4(HRk5eZTH`$yQs!%e8-*QJ{6$V__#WmMRQ7wl z@{pID#U9QQRb9W!f5-oCFLr$2$=876ahI{cE9W0xl@NL8)%Gxz9OT;a+4mswg^PAc zo<7A)N@bT39^opsK^l5?L&C0{?l~d30-L7Wv^r_$+t`*#sM*V|RoHbJ?Eh)!+Ftlv zygi_q{iw|CS33L&38IT)1f7l7m3oZ6OYkfRrq|TBuYdMj=;{K>pgn*>Gs~~bo{sks zrf#4Q=Todg5}l?)g!y3y#Uf_aV??41|Io7I{$3u(!OkP*j-AFsr4>B=d&S3A#v7-9 zq?~XC(HxIVs@U`9U{g0q(PD5|DVQ}tQOl+Qd$BaUvhmZ9#QM6=j4S)oj;1rJ5%xk{ zr!K*yOfTt4>GP+FKDgGl##EDDlib?-K>pf@q0s+YIpcw8A|T+x=D~1SRDM9BfK7CE z=8TDXINPTY5qKJxF998NLUE&Ri@Cl@ElB>`Za_B-X5Uo}ZEZL@uSUwMs6;3Y!!K=C zXc`)JQqpy@?pdS~y|ig>u!PHbW2_Rz8sJ%hg+T$J&=0IW&UYdubG^2ac<w6qOIStP zWVd!&F9nQ(k``~Np`nFZm^7)T-f_10k+A6-AZhZd2@Pu{9<-A&V>f>)F~C@&!{9$? z_JS5iyyEc5j=+JcAfRFNw8cyt6ciQ)gjZ7Q#Q>RDOY*6ave5N(W6>1Z?2kuZ>^f(x z!3!6y2$Gyu=aUz^o#Zcn{qN^<`DE^?4y4o6lZmuYq{8k5$mV$A1j@7R0~l!}-?Qju zZvU$~&c3}o6KR;NjN_SpzWV%|0E|URfKxzkyPZQ%JHjzNWBT{ThBQ!BH8s!&xzkP~ zX;PlOw^FFYiE~1AGOl4)%-0DxeaX!cQN{8`jaUV7#fl-KdpdmGH&Z9=Ak~ec6equK zvj6J91TLElaGO^LZ#W8;*icO#;xtZ|u(e&~gWFJ)lz8d))sYhIY<YJ!!XoluBQ#Wt z;3ZKWl>kLwbI9^&ka6^7vWxnMRE|{IcVBV}o-O7&@!I9fe!84})rGqjW0|69{}6$h zW9N?K=LOxc(#KbYi^0s}F}YlJLIbA^3=Hg-%6~y(Vx%cQ-=5I|<PQ1twbf}z7eD`( z=+#H|F)@+Qs!qOuKLrNG&*mJ}`g#9X4Wz^PM9Z;pV6}B;e-ur7&NjAl=HBwS&Gyb0 z@>M+?De0O%wN>wcE}vTS@+)y6l<!#$lE(@W{#nfQH=!`RI?c(KdH{UHu4<jRZ3Wti zBs-v~3>MRBkci!4RXF#-_XSZ2{s_#$BjNRmJ`^Jo7;HJ7+r39@=bsqmfgxQ&D}fE6 zA1mbCS9}sDJ%TnW+}*nsckyD-ru}5x<5;;>t<=5FlW_A=;5~j7mnG8~#UH|BWL$A; z^w>DCiT*CHShL83hMrV<Bfu&Z)clB>DV=M9Yg>X2%e#vNxE3&%ziEBzulSJ<U@6rJ z*hc8R*6M%Qo0OWL+<z+OHR}_0-A)yy?`3onD2ISJHSVmdr$-TQhe+$>(wqdwU!Nj5 z#IFsm7~13Wx84i%Rx<+2CZ5C?ra|Ob75`TX7k+T{9BVw$W8tDFYX5Taqpn}hQP|ST zR;3`BR>!hfr5D_3$HukPBkTlIb0(}S=l*Ftf-^>li5)aS54vfMw&qRoaTJ5OH?<HZ zsk6ORfkd;=bG6yi_tV+@rg6sjU=oqlHuT^R&9mozjJUT|-K&I*pb#8u>eEJFln$R% zc&Ay_-&Y%LTA7_D4qQ!Z*RxrNs(4?r#akjEWjvujg?uFsNw3fLCff9|-tYWzW^c+h zg1OXr#<}7^(zfAwsYwfg2YzgvSKhb7sYoVqqy+m$x7>g0rTAPFv;ctpHd9XjBss#H zL~~S+Yz5DSZYTdzY!xG$%`QHs3hbr!sx-6a;L6Q(&}-W=Wz{O9*ZTjP&C}6$0!Wm+ zC~|DoJmXttR`}XmZhuWD;D&u>ndR5CYQ^SapqW2g=YP<_Z-w}xM{|7LV_9)k&DRuj zrjaroD#0pG!deyJL~E&2HGhEKQvj3@o2e=sK&b3iMp2r-1{%HVb<B{CcNaKB#kf1D z^j&5DmVEQt^;CWNSwnsHPkOxa{$;@bFmk?7hyLX5hG$aQomL0njpPm+tQrY8DwC`} z!vNoC@IyZVmRsF8rJGX<*@F?v61b|CR^I_UJ!v{*Jn@AL_;{7s?wALE2L|;MTjaap zLy8$(iv2iM!~Y*bfmHeCx-TvuH!AYzw(ck#cN_310KHyW;<JW%l8{hwm6!38YCNqV z=+DDbJ)B1Swu)s8x59(1kl#g%J7*8p-}40w*dKlVblI~yp#Smv4}Wu}$D%?Nzwcb% zV^ODybk$D&Tm9^lxru@TQtC*)N9N$^OzEV5$u0A2;f}}Q1B*%znlP(!Fa}f{#@MjQ ztGTaQ?xR!T0$JF=5RPhbE3=SQ)kkk9&n(yRh8L2w63`yC-x8)1w)QX}sAsIgBa3@8 zp4_~_V4W(|p&1G2WX$_PC%+{$iIauUibZUIg5c>(Al+b2`fXOr{5ga%US!a0Aq)Ln z%G|N4wM!ui!ch#!ugAZ+ua?}<XRLYEudce>80B<nmv`R~ttB^f@+)K=uj=d+8r)v< zvIk_p5IWLkF>d;C!IQ1i!API~&>k9)Pv`~UY;fu0Yr=%X@!Nn;{P&r+JBJwypJcUk zbrX5z6TLbo-}GrD{5++5j}(q7mxi0&Rc^9tw$6tZ{5eKLVAgI3S_YMTE`9D3+Iwn9 z<Nq?C|Ie>iubtowu@I%>Q!m!Ivweo;;s(I|uEXKW;YS?o)sM3$nZQ970dFm!40Yj_ zKW;x(_Oc7Re%5riY7qPf#|_F{-&VLMm}MQ<J&NqD&BC=2M*U`NZH|{?(lP`jLiVLZ z9E}>;xcaBh7Fwcw%dAp-v-b&5a84QV+i|3uc`dTcV?RU61!*zdocO4V71Vw5H(FVP zTSlpuUsC>f)ggU1J7Z+q!nDCP)hf=d<4IU4BmqS#4_Y85<gG26QeAy~wFCAGmVSO} zXp>Mea##e`zke1kU(K><2K3a&-ljtT;KNtee>w7$3VdKo5;8V}Kf7r+*x_!1eoQ`n zi>MOsO8qc8W5V_c6QdqsE2Xuga#y)o;gNKiNt*EGN&wA!zT7qUTxhy)_&<Y9JL4a0 zv8b6hPdtk|ub88soHnfqY1G;CNct#gYG3QFzte#7Z}m9Y3AvoMbp-dBRIXmxOq)73 z{vI7Fh%gdi<$Qk&AjIXF;%f-M*5AUW)nB}!qrC)azm^j#!-}Mjg=vaN0Elf*5}+NV zMXPFqCX@U7J98X)l-_547{`gSAP&=NM~@zgBXTH;Md3F0^VQ_FlO3yjN1D4uKN4l0 zgw03-P=e~5E;C!m!>ka9e`JF=p}%?REq)tFd0uy|I8qZ9E+YxIB_IbEq<P);f7;Eu z_2+~{u6zF*hc*eHyJNX?PMPYJcRK!7#9CHTYDUJLMx77zNsBWVMXmziePPkGXQxS& z>Rcs~vF(IxpT2x!)ZI6h$9Hj@_R>Iy>Hp)aKU>#QNtffl=B8Kr*(S{#d8=EhHRMx( zaP0@kC)n0+MN@(}s}9RiO%7)=y9(5+p`}9s;D-+~Lf-uCX;IeN+HlJJ(w9;Mr_PRP z?Qr>1-3h+w;f>*9oRqkqjsIpD(X{yCsnor7c`yN>r}G)wcWY4M!Qj!aD02N)B<s}N z$hGlbz{mgKF`i4x3>b>2f7FWJz2FCQrTRkJ$l!V|(%{?EudJ;fd3VDnCkdk!>y*{e zBq1xkGe=&=mSALup;{I@fij#Jk#E?}4tN<(rj;)XnzmP6wlUQkcEH8R^O{1&<)xBP zypH?YxSBIoNo4k3jK0DPBRH6Ibfax4sxx3IbIvbXvPW1<S**-ly*UNmQV9spBD@n; zH`SsP&adhG$HcG+f4U-GAQ@h2EbTU?!#qB9iTZp9Nc1)0Ja^kw)z9#~;tH*WPF$U4 zU4h4?EVv&$)zU*3z>kE1^(_5G_W${Dp#J*xH;+q6ziU+rE2E|RW{IgC2>Zv+)1_4q zC=T)2Cuc7L@>+k5-N5W%L1%zL{?k9-^7GKyBEq9^HbUr=sl0{H4KWAqbAo!GX)Ns9 zxT#3%eiukfb#^Sb5FjFWYwA0a0Abp0rD{Rofp^X4JEjJ}reYCbrs^*EVn+XI!5mLm z;?{KNAyG8$t}&pK7kDl_@!V`-5wv!G{%@7&uXmSOO4z@uJxSTVaZbifha>)!mL0bI z!ehP17|shof-qIE_00VHfEXWvr4Tv2WcsFVX~YKh&-YC42FV9SQz4lw0<r&NIz&b9 zWEF4-MWlmY>f5vVZG+^F?QOf-JU0iWf5EEl1eK-}c1f;d^Utbo1Q>q-w|=itm*~_u z^C@$W<|po={=27w`?-0u9Tz$aVB=2`Nw__tyV|{FDYJWSa~d)8NniEr^9KJ<NHCt| z<in`XvcGO>>&7Ka>4cTmc73*`#crP6m~6hwamS#;E&)UI;=&yesT)?Qa&^%4K0cSr z?LTBtdFTsrbzg`-9h5HZ%@1{M540!dyN(ZfdbIm`&L?Q{yy8A&(6T>*WK^5KY$x#y zE#F=Ve#}z*^iRJ6B171y{L_6~rTFQ?-J%Q+YO&`^L1zA|H`u=U)Kf1tV8=(x^i}^c zL1>oN*m65B6eVi-KK!@vi|_Lx+5GZM^*+sO2V4JoD)F@^lhciVyN@@ib4z}MR{8T@ zRqkCZd+}rP_cQCo*KD4|ifj}&%}43sM23k_;lxt;<n>Jc!)JF=WVMu5gUod1?wvcL zU_Zido$EU`zCsF31b+IC<)_*K`it54888|x4UNyf+?R~OAt6_gzHgleclHXo8g_a2 zzUX{;AXFMepQy1X3yZz=iN2&m0~&q48)4L@b@1QfIq?2Ao|3#Ptrq4A*r+mCK=P>% zTIYP=*V$QIB`kX@-0)rK$lEiQ;$NTQ_~?W5ran)VaSA?2_}j!5W#m@yTS%Al!CR(U zXEsNWlEOjs5}P7i3jWu7BFot1P0~;wx{IP16onaFN)$YrX#cZefs&kJ6<`PsUXcpD z&&><VZz9i1fP?ZW<28hW!JH7w&^`LpE4MiCHUS<KVzGiRE3pW|yr6j_lkZyI^;*KD z=%!0||BeBvN5mctpo-!#cyfm)@EecM^HvzQ*5F2qru|ZHW^>Dmz^lECQBnF%(_lPk z)D2uY!B3KPoA4fp`m1`<LsLu$)^UwyE4}?oGCPQ2Z`vGOup3wmg4Rj9lbQhP7vMdU z2!;t}4x3CMWyRcm49^1(V&+VKe!f<eo~3<3Juq!(9`+#QbN%S}A@<i+8vGG&k)_%Z zI}AU#SplQ5?^_>eZj;2&ow@4Tc2f<ZO)fTc(LX=W_NC-u{N^W31oWsD>!C9?&{4AA zDLO3twF>xB|FLm%t9?s%^fz!%OQml>9D)88yGJq<brt;2XQsepm*fTjxp^q(F_4J* znM>P<pU&26i*AR^ED4{~qaUXTENS*g{~J$7#&C)*OI^`1|EEv3{x0}8iUk7LerJLB z0RL4N2cMxx-A`$0&gLZIQfy}D?`w)B?t14L2VTiK8RXQ1mmxEjHO@80mH<kgAG3{1 z7%ek<(i$1H<o!2(FYW75g4m<jCDeF(u3OD+=tBW5NV-ar4#)`|@28-hgAd;G?8PZV z9<Q$V^vh)edj_;e?j&)_cDiB}9oB<a0@eLD`vCv+OUa2lww86*)S|jO{P1T%2NdJ% z#2c}W=SD^0wHA~6cTAi7ACJ8ZKAcJc7k<_vkhWSlf>O;|HOBNsK|1%GOGYoh)umSt z=_MCs`Ae3XUpFK3Z1#S;FTRfuvu}-z3Cetf|EuZe$;&b>zL1}Y{tSOlM8$r6wU=gn zfpK4jI}HKsbttF`=*}wo0k~}$f38$2V~LFFPVJ!(BBfTH=|lBLUQ+V&60=*_9!BUP zUGVIsyE}_TJ2o}IT*-)CLeuzMDIW_t;|jdWbHTa(8@&MRa~Y{<wO&s{`oBQ+tqz2} zFFRxiQzOVWQ6rNMLoq%N>)p&h_%w6fwFskJSx?ABwne9OwPnJ|nlSPomV96=M+lAK z{0<v@YxM!ISPJ?OELegqO}a@!a?&x^ymOk|1;8r9i4G^XNn0k<{<#IY0p{Ibqmuh1 z2qN+l)T2)OqcuW;o;69Lu6r(AOtCMbzKQj+nr7hrf-|))k{WR|+iAUJa+O&?2tKOH zxouOHvx3V`I7vxMsrj%v<Hhf>f5E)~gR6j_6$%B59kn+3PksS>FS?({8?H)kBihYw zvVEfW+NEb62@p4V_2uMSUxnxo_5Z_w;fajj54NWK@*i!@u3rU{Qicj2Z_w6v8?F8e za4@4Yng7Eu!<%j#VXJtu)>D$-jpJ3|;msZ16;p4o2JUQs&u=<kHa!YQs_&;Zx;NGs z7q<SIAOSIa(m@QIm@eHRqpx^@aDD0fAH5A2`lz>;e<`xAz_n#gq!QN(E$%~GQr}&8 znrh5sSENVRpib5-bywkexM=vlI4AwB?fj60_2O%-O)C00e7Pm4zC=H8aZ-yQAp>Z^ z3b-(4`9mh^ZW6*=y0*;YaCohvk2OdY*l7@7)*$tRS_pzC&c(?Kn9sF~8*F|_zyWq4 zdXV0o49HHMUk0EPMu%QjaP!cglD}@or!(0(VA5_FgJGyz9>1x8lIq6g*I$x_o-vKP z0eSn6KT*&|^Je-^kl2ldVKE7GZ|?)&*~WRKo6weau(e(|<w`asP<x|szHvp_|G3%> zoeE&QN!zTU2fNGr_M?|2vsIm>iH+JJ{{e>KYcwYd^WWZdNM=4MejZpzZ%gAPijZEl z+*rI8!Bn%%gg5q^=CsRc`B9YR`DypZ#OqVh^MJESjSiu?$viHKB_8Zd_UAy024qql z>*sdBgO#ms>urz+0Udq79d4CYrStuz2*blY^Sckeep2vXIZv}o)A`r!nX7)M9U(@w z&&y4ok*%u#<^eN3Ct!;?rR$i{45t%T+LuJ{vXzXo6E3?BgiV|RRzHo1UzA{r9oaG} zGo7OkEou#otRw44#iYwZ@uTeBM~LgcGLtInoc(K+W(UW{<4?~_RJca~`Frg%fFnU$ z^ykMsd-CM_+GNtFx#Fpic13a9-&y<~5+$3zIJvuLTH@@awRGrbF5j^pwZyakGN<Eo z_UGt(5c9Fr43R_g1_PtiW1G5%?ulyJN%5_Bk`v`Fa>R5>jfTfIEsGZqfAc7f5cGZ! zbfZo0%`sEqguOl?fp_{$`*+faC74r7sbOJH-e)f>W&H$pciR1o%I?xvre6o_<kHSa zSaN{9J9Vfg;2IDMbzUg}Nkx2th`R(r65nL*Cc{mHYNtJ{B0n~co7(T<y@Gy%qxcjc z^FS^KR_~5Lu#;#HPImlmK6UfX=Bi4^RqZg>HQaeMh*g;Nr#0NE_5)ng^+wlJ@zZ^g z{2A-`2`@RT_i}n0Zq2qt{V>;31J)GWDWFV@g=ot61GWTo=rMyzfI<zM)+b8xfuk>Y z`c)CyL0wt0TA*gFaLli&Ob1In1M(N2N~A3@gWu7Jjg8u;j~;gR(VpJqXt2NVrQSNC zi8SJw`tr58Td`Ha8;d{<srs2;V<AHsn{&=9yS*Y%avU{FAgP<ju4I<;zhmsNjiVsR z9b55^G>(nPkwDI?=|DDT2@${e$k*8O!%e}W#r!kxZ+W@CI<eJp)4am^(}g=<Y9rGB z3&K_iYFqaUl@O<Uz*qZ%4+>l*xp*Q9Jc!($el)NAM+18Yj>h!-p#p|%{f)%8sDzg( zK;U1v#Uc09_Cp|k#^y@rE*;;R6@COwJ{7&5Sd`(J%Y)Bp{w!kpvs)Z+Jp}-lI;QlV zYE7O-94989QzTAlP~S{aSz=7Ko!DZl0cMNG+&_8o=5rvSITpZq(O(^SB801rYJb0p zx2&I(;v?MmD~p?aAOk#xb{9aLib=UiS%Zcj1S=q?2iWJ2jRV8Xv}m!GO&A@1Fii4E z;iRz@=vp6o^SjI>sgEsTF4nCYErU^zpdU1GETkq?^E(W)xyDF>xNqa&q(8aY10T#a z(Y=~l=~p70^F}oN{!>N&bJSPQpJ<fmh}3yn+7THly+}LK1`}^dNhzY-eSaJR4W8We zCwcAT9bm9wLL?jF@Jw!ge*6U?U=iCxB;=)X9C--TYEPft_ehPNPAQMaS@Clk8P|Vm zv!7Zl3#pA9xzn9!>?eM0R#wd3c_e8LzMM+>kikv%@w5shm0gys^&H_AviKJN9GLla zP;z}KGYHu^QNP5}H9Y)0U~&Ai&gcip0Z^`c@r#l|AVYE*TqM!wc)gu3s2YcJ83l2o z>5Qml$t8@{ZFLSgtvfHuZx>|-e#-EEX)6{c_TUrbyk)gx<#c@&7ud?L)|Y4{ptjUr zSpK%kiFB#h7#=GrVJa6VySU7nDtF`5^JXV-i&<^2&Gra(x(k?wgj!JUI4O=ThJESm z3XFYTVl<Ks$&Y+dV${84r6Uy{S<>X;^JN>z2}Lkdnq0q9yPB;BKIUpCi;(2`edf=D zeFuPPXq}q;x}SkuUqH7(@yk<A_%&8pVs&DHb;~AQ*Q!j0QsNZCJMn6&##npcFV!)S zwEO4mPzHvSCE=HKbK^<!ks1F?llPivpYvT7-p`bex6@7&h_%yf=^?cxjcIGbZ|CRq z1=2pk(OnIpquOuJEG)bx^(AoXKfv=FNg#vw28zV}@FxaTba@Na5fTgJA$?3m?`r}| zCv{MuTiXF%{$D_;o2xL(dfYxaU{PNggliL@cJ(>}5?#M@faF!K%yE~I@8_jIj4FD} zI@nC*y7e_o^+<BLPYpI(f}pqn-?8XL)pvGi<2((`$B4or8qvKKNXI1CL+Cv+v^E0- zY*}uQXj<E6i_xvWnFv!f7<a0w+^u6Iv#OSB@(id@6<^g3mp)S*bhMcQCe9Zs?EVza zm8qWGUL=V5<En5NHwHa4G%X-Y49I|`6m%PDjaS*{f4}eM<9oK)c2VA-QpU;+4MY{p zYZ=0c$}|JuCd+kUOmig+=PP8~Tsr&>Y}u<YCs}MRL&EZuN#Go*&GiOGX>{-Q*i3^q z9+^AF<#szI5(OGD&c2tL`tIAd2OV#fi^bf@S3C+j)K?G#@b{v4jk@LUI(9dk)Z!o6 z?jf9pAp83%WS9l^t@}m;aaqpMo16gQmzNwet7-_fGc*0171(pQ-nd~uzMWL%(W;TS z-|%|4+_GC<>GPcz;$0>ynLeTPHl9`pCTot^N}X5(!k3Rrj70O(WHr_A070GAW`;6? zmw<%h9?K%w_(Kow<13#rb?q9xCKWE}X4cxq%67@e)y)w?r0Fz%`xw(Kv7%riMQ)Ji zFiz?FS8OSPa6mF^%=5=Ii1mEgNA#ph7(@C}1s{LC=@ndjUDRCqvSR2P@=v+MZFs<| zr67qZQ^Zia@rK-Q#!uu@5Y09B1RQV|MqEAs$r<TxX>7WtCH?~>eZ=Lp1ZH2spMi*W z?kfnKT=Cq$mAh16)f19K`}xp|XM~VK_8Aw^PDPWCE1`Z5Y!}ONxZcB+Tv9X|&m9_C zVb*>X^v>SA#%DQja7FYU_E>k%)^m7_caXE^gplXY)9vFeO?_+b+BQj#9DyfY;-{4E zhP;RZ-v*a{@ne55yU7eBU@Oo6{%b?B-8K7Ag2Q5YFHqO(TRq>Pn}R>@N^AkvW8>o! zbfnVZ!KgtAgl&IlEw15i=>CG=1}!&B9_YCjiml+~^53zg*xc4gLcO$ltQ0n+0Rx!L zkH~V5`!Io`o^|yCLxgjvtO@hZPPyTRh&jR8FY!|_$YkB=#VZ*h<)d!?<+4^f*^Ink z2Zq};QkPFU{NX@sal#}LI{k-th`d+jOPpR*Xl!lV86detFY2OXcph>0`3|`(KTbq{ z2I9P(cS!xQ>xLtkN@9jrZ|urM+o-KFaXabGiznp`+v2!!T6uh;TMyjPFCqwU;!^HJ zk<+ckaOx|7j}k&W7P*)ddF!Uwq4lP=K)vqHN;2v`zdzP7P|=YeIhcbu(}+Hll;JQN z_sVE&N=Pe9R4f#;Y?zear9YSx6mrDNd2c@!yfXKj;ah;k%3-W}n#&KX9nYB)j6~@+ z*L5{_v!^jq??ZNnSlY<6ypW~AjbOp_jS5X^1%*LJJm?ykmY#`T%krv{hshhtF?N-E zHe(UgDOGJ^t8<s>qP%4U)u%0szd9(6(4bDwO38Gyw<^1lxjR!SnM^8f_Lv8eP&(0f zgPff|0O6v;rj3?R?vlS38}w?=Pib_s?7Sc(kGM!eUp`|jQ{FTa)%&7>oZoJ9gz^0) zpD97Id|i5tH)5P!>b7BYh%#~P&(GU69}aALU2fpH7hurQjc8zmB^yXucxXf>{-e}% zc=gz{&yy6TN4-u{g9M{|Et~pgO+UEoo?r<sJ_{bDM9(me$%6OYn_e2$z@{^dzDfs{ zD}CMaV1R7N4f8Sx_E0*}Z=cjB>-jFVmb1s)zE`pK#ju<FgKYOkJ_)k?>*Q!L_sct= zxAGaiLll|GRiB2H--ITDPHiXz6X*`2<7xP-ftH3fPcC}7QA_;FO3<Op_cc<U0rEDs zE>JWd3lE$^j0NwOnIal80#`fn8;@HE!L<ypUMDVJx6g@l^}Q9196lSqZ<j+Z7dP!t z&2y)fON`+H#JdeYKsOs{Pxa7C^YikMe0#){w=#{IzR^V75F_2IVkmu|Mw4k~-H5aR z^!YKH8?aSRx^?VG%Z8O3E@R13c#Kq}SoEkwtuLGkN}#iU!zNLApQ7iMYG#>{&d4!> zS&-B0v4773;D>zD%0KLtT?h^BKAYIH(JEXUI3+1uN?f{IWX{r3S<Z_2Hx&PmY8Y>R zlI-`Ct_$^JHobrR^|kSeki5&1^OSpvB-`=k8{=p1^{iJp2nLmA8i7c8lWw&;Rb{4( zVT$k5gv~INh;dc6<`-%2Fjw5BzQy8f<*s1YWpoisGR4uSFvIWQnZd87Lbs7f-R=HH z{;u2_Leq*uzza>;s=#^ctkNE>fkFF%$8cJe_>*B9O4Kxii8(cWPWch92GcKhG*Liy zH^T_b?1;J+qA~PQRiWif;IwB15aEfKHieEhZ7pgkgQBKeo%%r!k2qeWKwY1xAGyA- zF~O<P>DU@Zh7w=WsLp<26qFICG%2=L;}ytRM7W5ZxYMK$M0V{@NGR=ldz$#+0I$$o zeA0U`#QC1%=DGdlx%a;P@3L15!-078-DqZ^8YeIJVf%rZPha)fSkD^pQPxcYwu>F6 zoEH#}=WbnbER<QGDoWma33<kAiY1nzpyUX~&pSQ&w>~Y5-G>I?J~0=Z)IRHVV>{va zZjcO@_x_C}Lw(uD%t}=2F-&>Ri%hv1`+0M*pghgAC@sMLbS1~%@BfpRB!OXTP=W>0 zWVEH;;UFoMbB_1Ghb$7kG$|~8{!}pT51B;j<ZN;+t2`O8iYaJ`<Dk4&osye`)C4TI z1fk@n)+ZFGD39$u&b~K3>mE}hp6Xa_6sYJhHRm$Qra-2NtP#Tu9hPV*;C_@3k01W= zOf)dB?yxlimF|fYw}d8$6P6W}rI&@oj*YN`4qRQ`4-{Q@>`|So$tF5@K3Owx;C{?E zT-j(5A#Vc(J4&v)Q^5B|hWZpXSS;RByv@p+X2t6VPxkXzRDZ)t4F-BM?{e!yJ-;h# z?X`lvM7k4(d_Wl?`MzwM{yEb(QqAm>*&fK#H1qf0jq29c)2KUrWFAf@bPZ*tvVJ-u zZeo-*o4fkk(rfEu`*`5C{%w<pRo8neksowf6fbAGxvOXhX9vGrBz|2c`3|vRJMB{} z*D_^l*ry7u0{1D7BLT-jEp%Nbwv9Rj)TAG2-m=xsdn1A`==R#d%np|2nRhUoc--?W z5aY9K3L9l7h^=(M>t)ju5#X6v=i@edQk69`O8Jzj%HCGLjzwn4;1^?xNU#l*pH@ow zpCv!@uURr#R}_8(E&uTCUh@J}&B6JPMyYHsd)44}{(oI<#C_LWM)VbRw8km$`6!RN zq^UB|XiM#DuG*=0<5!ARXJP9N%B#r2_Q^)-B)6}nJ>faRrq!y8T!$kp5*Dho<;R~L z=(B+vb{f)AzKYEuTW!YA;GOO(BN8G{O*IFtD--qI{=`hzbl(EUr<-ZqX<*&O!=g5> z@CXPJo)RW5x4-cxN*G&>w3$zrw{+BEeBJoYMHe`#%q#9HUGWJTkXvtDV&9-jn^*-t zC24OjzVmyHI`GX@MkRMXscb)~=&nPRRDAHby>CStvZTtd#qEwHIRe3*!Vq!-OHagW z!HH*0eU2o1mJjV7a)L{e@}c9h$?L=kp^4qwjce;g^86@h{j>5$rETcNjgP@23L-Cb z*PDy1#{AUGQ_7>R=_{=&ia0fn>%)#c>5~nlgUYI<raRXgNTaMA#ClT7l$V}fA)Hjg zacNcRS@i}HySogDJk#mbR}^YYokg7HD(9H3DZA;+yW$DiHCY4GVn8(H<RI-X=|`t$ znRw~4^!8rPaT|`1U$mz0G>Rnz6e9`C<bu63g14-xou<ln)-U;O@^|fTlj3rj1y|Kz zRQWf_>r)L~HCT%UDMEIsp5J1RRsK@UN_bAlExiacUHZ0dQM5nDto;(VoPYBuO9f@( znu+tscOf`RT!%r2ru)Ipt#Bh_>yaS2`TK{BK^3tX$k45}=k>UZxoXyX*sl)RnIW0y zwNdM`4i)3Q_|U`FceGMImvyP7$7~;Be4B<?0w{8IVF6k{F4Zz<G(6YND@(mN!*!*6 zG;xeLq=yU1nl4QAV_>J}!NDQlu(I+%$7x=gC(9RFCTnGLJ05i8=|5Us@EM}N+(YQU zQ;O#)US=8()a7-;jr_^xk~6{I!>Ul}f)l%9Y>T6|?`SjS@}il@kajGK!uG@Ww<>(P zk#+$#v)5A_J)@hv=dxJVh}&%jQM}3jFDVo2(6f77c9g;~0nP{Cl;andj;6%$h%y!| z%P+CbcIgeU3PEH1rR4Lda~Bl9#ZPBk1~muI-+eq@f8#C!Keu0daCI!9);GoT)(0Bp zu6Zpu#H#9{GoP7}v$2SnI#Y`UBh1wC_S3p|l4u9(OTXVKECWWIF61Mgt4c$I&+L)J z8?Ybo1^AVt5tAJSVxcb~irGA;9q_0AtIfDWMEECetrB=*ZR*tZkz!?O^!D~EWqIxV zuqT+<TrQlru$s=R@65L+a%DPb<Q34CMilRF`fykbNH^!RXp8;8kIR^!spD14_w+fq z>`LN+>jhG+_K+5q5c|Sw2L11G%40m81`$FOh(WcdTA#~x{7J7UY>pmpZ*oo&p0yiD z0WkkXz`Qs408t6RPkyT&N0&EIsTD9a=$l}rfTrvfb;7W#vP0&SKxrTwawOfxZ0FLW zV$+}oD=*tZ0^X=x#=ytiJHlAf+&ulP*lCazG+(ib=97>rie`?l!%a#}!SA(%iRRC> zSrTue^ieIPrZ#S!T?!?|_yZq=BoQ;8WIX-(GB_BccXvo1B~(Ovn|{g^dW8@(2mDXq zfR#4#%q;3ufFlf$J}@5)^L;?w2M+f9*q&}hIQloo=rC0Rr}TP=W1YW+kuV{p&2aOZ zya6O=QPbve-4u*6=JOgvgl}sx+J-CM`_0UDaUx`8NW{YZM@zi`E(fCRs|}Iymm*A3 z6kGc=16>DPN9FX_Lp-ui{~UFlZTUMxW-2?@)&I=_A_O+(ndu;Iq4?_162F`%82abb zLuaHM?W$^-nH1{dd$}JT0%IevZ}aI+)17X$(<P{;-1Zz>9RUo+9J!ZDt&S>BmjMSU zsm<g<lFuqVdWm2g_o^H%UNR6JaPJRPL~J<#8P0|{$EPKk&3X@^JI;&4)|-QfK837n zTBFRzzo9MxyA<4V#yzAsQ?iO&2iC}a3W{S$2(=g&#SC^zwK<`=cCb=usoh~mYMw); zqg=PZEF{4?MLT<QA12;vB}>60bxIa{As*VCx~@MBv%Xe>`;^(|n4NZwup__Y>LQns zR`6xR*?qIh-35x;HyFEb4BsfPUoWg6g0T_I6)RPy%4LQTwE*kzbR$PM9yIXZHL2() z6t(ZZY-8U!p*blB4p|wm`1slVhc0j|^e6@IpwYGQvpS3ZGAgR@`((2lCZ1L7HRUsV z?;i;Ka>@4C4a)SZq4os}`UgJ^Ep`&$TQ7559Jf|!fGml=sLJ1k{ME=_lQlyfbibkT z@smR&Dkla!KvzdFuYx!xNo|=h_XJ@1??lTEb%l=;2$Dh^KtrcB<)F)qr`>k@XWeZF zP9%G$zgp5J!~h*&u*rTQW3gdH!G6Kydy5+&!z8r{AXde_+(&ac+{a2Ic;&&L|BMmY zF8qm;=cjHaukSXvC5u_%<psy)!ra9)Q&}^1<fHgX&ZMyzPPu8uspe^-{)Dm&cdqPZ z-mMoG8Pi&NA@QpG{u1l1iQgO>mI^JcK&<v=`*wdwWX~R2f!<$YuxB<zTIMYW-Zd`& z*!hlD6k1yL!llpS-j%DMKDS%v30j%2+XqWC^ru{ur+mqBKfv-UegeA_4;w=zZK}~_ zze!EsaT=FNPs>4Lg}CBodkuu@#Cn6Ptw!8tUorPsX?Kn~|3}xURS|%*EUm7~>|w(< zP_)8BqmOGk#!Svu{`cvAs<36fXucBHMF+N*BerRxvg47Hq#8cuDceYh0sT*Vs;@X6 zDwd{hf+(IKtt6M3(+Li|Pp2DZdefCX*+H+nA5f=csy>fQqRNY32*W~$iMkTMSLHm> zht(3$%z>UBv*G!QR_C<R)o!{A7ZJa~Xw>~ZiKrP6cBiLiLcM27`HCiCw@Z#!nNCG{ zZYv5FP2V57b>q;7so&?XDF#{ItV5E}s_J_<;zQkv+OR)h*q<=>;rG$rq^0Z((X9xB zwl6l1w+SuEl*%)qZB|;_%`pK#=plJNO$W1xREVzMl5MC|`;7`IKA$!Cf<wc9CmQIJ zl6*$m-@H=?3kRydguT~ImsF8PX)<QV5Y@m9Iyd|*kC-7oi`y1D$a>N$WXoyo#-l6Z zaF&jcot)0kl|ew7)!%eg@?fZVyCrTV)scIo^iHO}@-s3*<+E|FL-Dp2Q`E!3?Qp>x zlum<Mt<-XI6y8wR`gf>+t>!)Xm>t^u+<m;K)6=X=^Z`W^vZkG=47q8PLuBw{{7zEf z`X<$Oi#d_49e=fwUL6}J(6lr?#>)I;;?K^`3SP3GKQV&KZdbZ_$1h^J+LFmxiuSbP zk@+QF_u&p~6NqmjW6FNu*tb>=IQ+#LFi~fa&5u_<G)!Ndh7PjTXmsIHT%~+Dal?CT z&1|(UNEi_52SRy$`=3Bhwgag<xZPTRvGy;w=g^GC;}X7ElOngN&cE8T{U>&|m8^pQ zIEkrXe7zCfWA16ktKObA7^$kY?#I_o@%pMwgE|ieU>N2TWA0Sb5+mJ!C89C?YI|ok zY{h<QI0UJ)H)FXW@E-C2B<@{DY{CM>2USQ*0vpXoQI!`t_*pk&CHv&i)H4M2MFGg> zm;UcB{1>NsbjV2wmyz99>HvjRSICJ^p+XhL=t+%i+-T6f+prl7Pi!7+w4`-U;=u^! zFDa5T{za)On4A(e{D8_YWkyDl4Ws5nkdFKu*$}0pJRyo$=w~EkR0ow3jG{25k8tf0 zAcy`RQTa|oLnu{GK$nx|#pxr4z=5VR@D~yQJ}V6!b6KH`d`eR^jqXk9%@$p+TjlS$ z&fNoc#OCoTBS1}aIs!%EaRu3GKFxe<e!$+#{L}m)cbNF}La(Y~jW-vIm^m#11E`)W z<kwt*QlL-G$s_JAEufyjgOOvwqG<)a&1u7g3R)aQ2s@X8I$e_5ECmWM_=L~8xQ}aE zB^^&x?`0;Rj9`#w%@LjxFb#g@0azPzq6@?c^RP&D5c#M<)rDri<OOsQ>gMarW@fCS z-Dm{!OUHp6K#TTo3wm3DBn0k}=PC`VmsKZLFM>+#a8h9^R#Glj>Lua#8mw@XbCVit z{;9ADx=9g#PY$HLdj<KOtIIVf#XUN$W(;y>$Ti$JRcC)E_#*4gID7Ld5*N|1wg!2b z7|{O^;X-JA>dPl-Tbvb5^ijL_v~?<uGD#igjN8Nh-M|~d01)PGvm$M$M2v%TYQxoo zNwGSe`Iv&^3A|LiR<wIb1T)(fqKldTiYJr1w?EsZD~{sM<4()FnESSr;4H?yH|5>$ zvp<q{Pw@&C5nfsGaC$4vq5781*(HySl)Gg9#(xL|<0;(A@$~@+iJpKh-_Yrit*Mz$ z61vv)Fh?!g${waqZW<@%W4Rphn5~BrA-XPIMi+$1^`Zr;TOZM?0Y2eS7yeCl>bG~G zZF`JNDk;i8ag-QbaasV$A+q9I4*lFO<LNly_Ub1~UeA_Xr%Rl))s~#z5;+61)R%5b z5|nQ@*i9Rv_u3LZE=WA!UuXIdi1CC@N6phV9QIzUNHv1J2!!IA<;o}gA(hiY*@3gq z2E3w019e>yhpTeIfy+4+UWeI>lffhFUI_OfDkS!yz~*T3%z^!gP|*-SW3qdj3R-DN zq{6h~YN+SJE=|GlfkB@yTR1NnD@Po!+QJ*nqGCM*MSS6O?|q6WlVUkxk$-~{^qaVN z%^38HU+CNfF!i@lW2iwwcztVjR*%@kGQ38KX0}oq3(e6<Bfm9nBQA!g>j}hLbOS4j z7iN2n12GN6RcRiPb-!DReJipfz@kEIEEJ8a<1n8H*^v;$J>3j0JN{LlHDruqb0q4p zF<k~xH+@T<OBrVPrWp^8hKzVea1hPS*A5ou4R`a@qb~)~66m}=uzu0ehKMB|Mg3JK zznzwFYwK^LCD_owvU2r4wm`m`>4ewVC3pHd)Kbp<U;N_20V9`!`y052O1#{y^m%AQ zcD?f9ZbWHtdo_t`#gM<EF^AX|B1RAKsSg0XL+K652slDaF`i|&_K>$N{ib?a`x-Kx z2cjNO9=t?{x=C={P?Vgxf7oCZb-LV&ck!ohCY`PlnqA-3MA3-os96T|)E=K2K<47u zCR9GCP4+*D{GAs&x!M|h?f;&-^CMg+2hI7GeE_(Nn4|hW9YaW^unZnp{1rcic2Nf6 z$_V4qWH7ub-6mY`o1tMW+|p7{`KKLPD3y<#V3V`v{mw9KEsrTXeph+#wktcHUw+We zx@6wRyxQ@-h3Co(8~R2)O}f6qE%092PKAuYno1z&GSVDcRfaFZS19x~iT8_g9~+pq z)2Nh@k|M-0=hn5+Ta>Tdc8VGb`#z*6uP#~AySW7Zo6XfT8h?yef~vcrNpw`rOoIVi zKJFUizXLA9)SvEp+?P8$N*ejBPydl&UHBMvzFbwffa5U-Yly?}l>q0Ctn?RVeU`Am zXvkj!e><6yAq+(U|Hn+$DI%5vaqPi^9PhR?#6!u8@x4XKJ>ng!m6WcMz&G|O{nV&5 zopdTw)1^#}4f755bPXf-W9o=CST`Fu2X|y|_bJd`AGS8j3`~Vee$hdk)B_}Q{`|!q zKScG(GT=f30sjt3aj7VTp{ke-@!lj}8)mr-w%oyE)ug-2j+zvu2>8K>iUHe)SKY%x z*&QwF(Sez-X;JuZBd#d3>r*^KM2ZLL&gMka$lsX$oi&75r2WvqR#vF{J03sR8*Y;D zc|MUj!Qfdb0zZtmvNsR(WpQ^>I|48^tg8w!eWa*S*bA#`-|Q!<S3C*C-937>YD#fY zeL%j<T?!=!-n?TJiS3AkLEr37xbP}TaKh+K%~=DYzA#4_Hif32t~hrO=&bW%8f{&_ z5APD?0e!HFsq0O#<VE)Sq%R-Nz<f6=j@=}FlYvsM{4J6ys;MyQ_A1alC?94)BM2Kc z`VvJt1-dCIhRv5``b}vrg_4-%l3PWzDC15rqb|IVi68cq%v@<sPJ7Cqaoec$OUivx zM`RQYMX9OVS@h1wjuXP%FSX8KS{!BkDLxs2hQ_sCioPz3qM+&-{YlBX<J&S*{+ZtO z3iPk%co!GVse7t&)IjVEq1xvQhcb1TBYAKQ#r?)cTSO*Sv&mjuB+d3)vg2`X?g#z} zr*C6bPOvR{FlkMBeTOKG9+LuDxGbsF<`DwP+YyctGLFPo<8<#hwZN$yEC;d<o;X4@ zKr~K((7spb-nBzBB@I(ok4^1Rq*`0V0f{ig+V0iCOhv+kEkOHLkQ1vJ(M>*Ah$eZs zX!p3IOkLWSFfP!eQWB^edBLfE(ml-yEV1J>Ff*2g_45k~!npUxHfAo@U{AS;ZAI`> zOrUVW<dbHqbK0bbgB3hcNhMd+4Oth?*T9QbUUxeT>|&o|KD&I+y`sv!T`+s%C;Oc~ zwjhI8WrhiQO1ciq*<$-d5BsMXAT2@JD?TKO=XgP;h<;CY;3Q+KJ-dgpeHon7%xCU8 z6J_36km9%dy8m^{_cX3P$an0IA{^5+S2eq$Ur#z(MNf9+<Up7s=*#RVfAKgU=j)-K z73sp3RPKAW5k#pU4S?s$1ySXft5B72e+8-DKN7C^j)bcQm2t)7-|_&K+cJ~5UAs{s z$V6e8(|7{p>3)tzfMu2$rRwO!I@58f9Ov0zeVCfIxb3k#`T@b9_5?~`AWE+0<aAEF zVNr(8G+i$jw@X_jvImN=CSSG+)CGsw_eqt2u7Wm>2*~ZC_LsX8`f$<6bW%9X@wZt$ zHnxS7z|I**`W__GZw<3_a3An0VxHuOd8^41hYb&=!QNM3UyRWXE~%0O9~)`Ar{EF$ zq*2^P*OByEv)X#v4Y#)6o1D1f{C1}?hBnoe-oLIaI~DnQi7=z4EXPF$yP?s`J_Fwp z;E*~cZv-oPpL*7Y!?cbBazQZoa>kugM9ul6KY*2$6=oRkmg*{wGl{OtYNB11p`e}G z<MPW99BiNClvC$xnBfV;d+RvYkS~k^v}hxx5uLK)FRQ3mPkVZu$<B+aC@466zYLnM zPcO6X8iu1-W+}T@P)28xbr-=J-9{_p#0b-mQv^$xier4h14)0@L6tQ=Md%jdS|fHu zt_(<5{5j;~Iv{rTMl-L1U7A~0ww`EjHjJ{@qLpn=yQ1c|`14g4{`SPFQ-J)4B1gek zKwJU4yh!$cqaa}_?tgcjyIK-1*}@;~Im9X$2nNP11O=p&s3Sz|iU6ql0?(ar|F3(( zJ_{7qDk~+=l>D{Hge3J|@3DeVc#39w$o1&a^5_SXmP9jcQXcoCwUm+AQ)ezGEbh)L zXom%Hw)M7dI%G?ZH}0Ig<S3n)xhR#Aw)N1;C+J;$%N*ke6j<A~b>mb=gN)qTs|5E; z^{F1-4`gOK*<34p$S8Q6#Vdv^a-<viHFb22qYW8F_fR%?>X4uAu#Wl5JSyGtMd$@A z_J_MPymOS5eWc{Y7NTHfGoi}Fx3QrlB|(>_X_kCB3$%*z)u*|<|IGCq5xhcx)Yx6R z3Tg^3ZEfTNb_jKoH$p#yYbR6jRkV%WY1ki!rZa@|j_>Wbnp9^Pbx=*Lagq!3MRR8M zz^>4;9O5E#?Z3K#OGK<ID$vV7LbXBFq(wwhuC$S7T~~l;e8f3+GqKeJK^=MfrkD4Q zb57_=pdD2TMO)~tZ1FMGhbYBa`(oh24DZxgyLIoaiy@8DbutGL-Hs8_G^Kk#`gHQ= zma7OcYk4}67uh7KK)$IJ3@vRPJ7(%O3c9;<aWl|X-%9m+8!EMkm{zH7MOb3SJ8gbU zmsOAQVq%q$7zjgC2r^$pNa-jYk~+s7Zlsl?WsAKpLa<)-y<F)fww=Kro{e~)LzBiu zIN3H$w%iFaZcy-~ki(VHz(uXLt<I_GNxs2H7|s6r7n^%n0+F}p$M>lln0DZNR?6Tx zw!S+Y@<hjMD)%@D+Au}nWqlMY9qWs=&c7row#f{P4k@c8YJl*H8g(*pc~dh!OrIuQ z`&y_{tyoisTFMR-rONm<#}O3a_*5-Ad4)s1j;kmFhzH!WUF`b=aer;}&EIjX#MJh5 zbH(w$8|W)8xl^#7%w*89Rp!$QTk{gz>&qVaoR*K7>wD#zo6KeM7QSf`z);i~E0k>c z!ngxp9QBO*?s3rW9(=C8-9ZtF`<OS;cWF0xnJ?7s5CvNoRgvbyeW&%u1eI0R1`IJO zUA2Qs+TC5aT`7O|p4l9)TdxCFPLpCW>Ku1h(ShSI$DgQPkM<$R6#rd9l_23;`WA+b z{0i>%+NW-bAG78dhjafCqhyyGZkzBSNR(RFX;Q@1QZw((yIx}ZuxXb|=GEO##(IrY zKD$i#2yU~!YN!Bh{18}GrtCC&T`@-+F7`VnK>G|3*d6K&n8Vq=&guhZqF{QZ7x@J9 zPQ|aXE+g-`j9Ng!WV2r80gZIHKTpwAKzFaKuES_=wzR{p3HQb^)7>jyN%qmGoexNO z<I=}99@5muF{(;Jh<^1gK0Rc)WA;GdMswvu{^}w7=;!31mGLq$a!@@jps6;=AD)-N z7wz*E(0tfjT?33HrhmFsV1Kj_&hQHGExnL=DtqPEYOiKKM25*P--Fo7B3IrRQllt1 zG_plxTm;Uu2p1pJ9BT(B%`o57q_NMeb5P?WnXfPAj}cqS)Z*^%PWw4TZhT$8H;^_( z;D(*MWe{ILy9%zh-OXuHYtjLx%ye=p$E&dmE$9xGDI<=JukrLv!8#a`mz-q1(o{#m zL6F@bJzun~hFNkckWH9?hz?5pVL_i=#YK5fIeSbqE@VW~<ShVwrZG-azSkM%ey?1q zqZnN~U--ASH6hup(-W^Y-8D+=G^p=U^`yO}<gYwiK(+OUi0N6}gobAF)#2f!^Mi}O zHltp84sDBz{r7qqcCmk2mBJPwpt5t0WNwh=m+0MHC<=a+fLy{}9Vg0vQapP$X{1ju zE7(jx=dV5nmkY1kL<Y1f7|%nP0j5Fu050)IeLsgQ_b&VW+a;b{dbKir*ipIw6y2^6 zMVICShu7L}0S&ZUgE>#sacRW9+=A{WiQph{K1glu`$VM_8ow3?)r0U2h?{i+e$=qc zxCW(WMapILRZx@^4kU!M%|ABo5QVx5{eL)n3!u2ZFIzYv5Fi96M6d>eTL|80aM$4O z?$Eds2*D+|1P>A%8Yj3zaB1AFY24+znK%FM&CL7FtD0AJtKd>p_my+j*=Oy&){c_I z4jx-&M_b=3xiEQBwZ6yD3ExkwP4haPzznSF^gEsEdReaP`V4g7(3$BWEYH2l%|aCZ z@CK16IcL8x#0Z&H*MG}w2N8kkVmrJmt@9jyr)fTYuN?0o%EmQ6Lk?SAD79%fMK=?f za9l_WuEXN`%~%bL!>#Wm>h?RYnRWW=JhK3)O1T^582oDW%I$u}wQ(_M7_ggJl+6G) zdj$<fm47mOXJZ!b<@_7s9F!lZb~s!kd1?@(x8VOuyWH&c=TL*)KSkCWJ#U8XZf{CP zJ%Yqu)TbY{Hz|)HH#cx8+Gg1Ge1H=!2ri_Z9}Z)aOk<u+LbTb563q@O{}xIqx9RDQ zy`(W`x3%T<%3Ah4O}PZmu0#q9#}%zNh_O*w<5V-*`P+Q>Jw0u0Z#L(67BZq~ZrXg! zH`dHK+1mO!bn2i#RZLUHjC$$G2-)yfwNp3!>HLDLp4tMLZ}O^nQ%z9AzD%gS*D6(A z(qmEk$9FGX-GgqFM~A9MpqR<$sPl_B(NE^m%U~;fD6qvJ?6A>AdmCum!;SVCb+L9T z2Y;sxFYFGa0Au034JF~4FEoQ%I*Bv1K@Zz9SS%5yI!u7TY?*&{#q7njdW-duea*?V zHsa=OGJ8<*u-;qv^KzoD-0hH$rfg<UYbF{`%TSw*gNWY44=-a!$RG<t0*hb@)6l6Q zVIZnpC=rfM;`ahtQ(Nvo0)5Qx)GHb_J#EDY4Spn(jQSq3&xNF=`_|38YyM;%+J9(n z_O!}wWjBFEVBoCDpG0lD6EhGJ^nKy*@U9VNaP$<@t=?i7G9NoK0hZ^hQ{@UzoG$7e zJRP;&G!+epq>r!G9N210lhNPkyJ?3fNU_``@A@p<?~=rC%2nHnG1#Y-Mx<sag%b_I zpL^Dqr(#X#&UFKMY1i`V+q!35E7apbNOhShY<{c({!q_f_oVeOFZi!I0970JK}x;I z847ONL%Rai(Dguh76vgg&#BY$)>L=EcrB-Wl2b@@-;r(Kx+#rHd0VWFx5i>=k}pP? zW5PHfDowMp7f8iyx)3=-PY+Bi!vPkBTfXTuF~d34bN+f_>wr{d@%jzN2?yX5lB%Vf z_$?#aqF4Ku?6Sj;6mJfPDYGs&nziQ!5;yXDSS7>n0Nwj#U6aKz9?P5I)}{ND?4XvR zMF=sk-+ZPnjds#~gzL>%nWYW?;Wi*88dMN`+;eq$M!V>mF!8Tw7tmqRDMOU^O~_=? zNf~O|ykw(YBF*;u4%n`qY*|v@dZC{F*sts*C1E`+*G{tYyWy9Yao}~UZfI)5m_2s> zsQarEsE95RQ}O8PKeO8hve6rv<&?v1^1Zs^_gFu$myyHM=x$g~IkU}DycN)*h>CQV z)qY?LSQnTL>)Ay=1(&wAO9bgupQP1#jf4?wl%DTtr=Qu%Yb`)K-AN#iZ#nO%Jl2O} z_0rNB7XBTc|MKTbPpb}V%^_{u^)r_*2=?8E7Hc$bW-E<DFL{IQ$N(i8yZz;L|KsrZ zJ&7<w?RJ=CFQHpb6NGBevJiR(Zdh*9Nwc`k{v}b~BF_V7ET8g8p14@f%Bn=}oxe^4 za;tntBaA6frxJL=YW&LV%lH2hum1m~!A}DCKsX;$XaHxacnL{P1Xj%Ov(t<U&4o&~ zIb`%g)20VOxetb;M4qPBcdMNt(jwccJ(|Bn*-~E7r9+>Y_<0)Fm+GfK+%%Rl`_-(v z+J>ZO!XSrnG&J7S`u9Ae`}6s`fcf@Nd<J>dj7EW)F3-cavzZ$6@{qI2v);$>d40mf zr>Bnx8K?#XVr1QqQa`1YJe5FSNuJ_9&42OYC)&3&YLJ*GVmvmA;8OxK1ugwB5*q#2 zS40#ynlVerv3mG%_DfxwTbyo5GKY9b%}P~G)oj((Z5g&)_RH=J*jNgfM0~#%t$skD zLA#Qyj!R%lc$7mt^PgRH{n81MlEyD_v9U?%eDJEeySwljyNUj&xNX$4M6FuVQ~H?m zEwGVWV{+gE(p*LpWH7w}!(_du9B(7^;~lyQC1nc&BPx=qrj|DjIBh}qRtgpB7*a2k z4qLl?pFEkxJ!NvS<;3GP&ED&QwcAX>qP?>%aJX})QR7gz6x;?DvRRaFK!+J#RRk#K zdg{;wk{}30=QCP&7`^JX(zWyYjpyTG<gc#<w5k^zr9?b0uMLr_AfX|2&^oK!XR6wm z>_T^FmxTBcUq_j+%5p+#Lmfs)7Ld%eLDsy}ATnZ$m0&Zl;eshujZX1rDGv`V9hx63 z)CDi=dxbwdcdT0cWI5ebco;>e{bohpI?=JzYSLW;TxXxVfX9|%!S4!1?VO^F)jFyr z%jT{-v~5Ug$yi?sc?a2M8_Wg^%6dE$ys>*HUw8PV?A3rE2-rMCa<Lb4q1w9n+7Dj1 z&a0!AbIn-Un>MURoE}P8X&i5(Mo*R$%956Jw;tA@Gts<n_3wMx=|RK!1E0*UAFXGu zKj~<R8HTn8$I|lhQQp2sH<7ys`np1G=a|Fmgg`O!7PsEAKwmuCdHOQvXQ+`eh=g^( zKI!u_B_L|~Xg0K>M^Y2B{ljUZ?A$~rtujkx&9+Yhxr+qH15_^-bI6!g2AIj+Vos0M z{pim6)5+Y~x_yJ!H;;7$(HnZaS|_xe5jbq=C+vIf^-^Um)&Hh&k|)R(1rKzf-E@J^ zzxK4u@*%LvRtRmT2?1(%jvxWiw(sBq=5q-ro1~HnAoR_vMrveO58wPX4cU8Ihw96I z{gxqC%q=j<0spZ6{lUHDj+Pb1cHpbN8+<}4ageq?db!v6jtwG&RLro`JZlgzoIFDn z#ev<tXhp7i*h|7GthOQu&9hmC{CT*m=J3@`(tpFDr&fBWh)86Lkt?c;n=~dksC~nG zus=8I6EWNr2sKXm!<O2_Xg`P(D4)u==y(D!Gv4JoMa{ks!x_9uEdwdgWk1{3f99MC zEs`|epIy9scK{h~iexd=tFY}O?7L~yr%?l0`w?$FdFk|=>?n#zu=|>%CrhLiDu?1U zDpe{p{ebpI|GM=s2*Q7_TZqITI&?n>|M3m}-UaK+8b2ybYJive1O*Q$p<w=7TYgT| zdUO>tpD}Y!YP?kR?KJ~^wOQ+i{9&cdn|Xx(g|o*Xp<Ld*^Dq9B`qx9DORc`;4uuL~ zrf7OZa<h3{-`^NAh}MP+z~JNwzjW9OYf5nGpxdMAc&gi+lK#m5aDYsZYm`d40uE{q zKt!)xm2y~mkWoC=!c`K&4^YGCbL*U<;kdzGjGT$o6gmwA;_t1RikOZOC5Z!v_MFdk ze~CyR@L#vMR>4;c`@M|SJSt83!zx7c_Ms2Vxl6kFP?bU(DUUMG?jKOiAF?P7_haBs zNkK>tN+b(Gp;0IFLk{*&D7aoeH4mxn_MC_{8u!HSYt*HYn-?k|EB8^rm_3N1*r@&z z2jQ_BBbz?oS(3u=zDK8rf5gM<^K|B~J@rb1exV6Clu<^hnkX3k9MuxuqDtA$4SiNz z{xYDVIUPyUzSkk$DfxIybl3ik=Rw=8``ge)!e8_ISfI{6SVha>X(yV=Dw_7@YASU} zrYEl(A6`A-AIFLM-D-IoDvsv&$jf!l@YMt+nk!un{`5$hn=K$|1CZg?MS1T@h1QNr zatKbV!b_be5o}HV@zN!k!(#FyXsltbpvm|}R5A-gFUeO9ycal+ol|e3nyHZ)VlcZa zIb4r9&LL5-j!*j6vfi|#*eV5WyP5o6t`etQX|1QJFGofkUU88b%yve34zEz2Y+ABN z7b#!v)wY7&7kg(Ul#X*ELEWSe+<&lNEPSDwbUc6yY%zDjoYJP5khfU_c}52kn5kIg zNDxd7_~wTk7an`1FO7P#gr+CUOPxxxz#i$#zna0$nGYb8FdMEC1F<K*TsO<ouv+|? zPi|;p+F~g<kt>}^Db-tEEf3l2UU##&cyD)icd`_<on~fQ?zXf1q~gsSGY~t$66W4U zfj$CnaU06-E*$FX)>8ztLv_`h&`pB)L+Bjko`fcV&26??w^o&Bi)8G}ZC{c7SZR$g zk65(&jDidmB6O@*Z)JzSk}!zm=3UXW{_}fjj|AkP6kKjCTwyz8x4qTL-&BS^d|RBv zQ_!wc2ydkNjP2FZP)I(aet&TGfUGL%Mulb)O?<5mc7w08b_BFU*Q1*CB`a~-FXiNl zFvVb+-QJ^O;lE^vKHA*2_K6DgKd<{bM%Y*ISzD@Dh;!DO^<r_RnrwQGyaA=kO#5os zU@d$i-8wt0mtaOZqBZc6%kB49Ft;9Bizg%zux#9kE!>;5Ef!0|x$wPu;Ju+Va?@j^ zac$a4-H-th*$_1<BUc&Jn<E4~w2nDftItcQfcCg%V+i&buaR1yS7EnT6wi||pI-Ls zJGo^Kw=bUd83!EbBQ0Js1QV3v<N>#CUxUm1AlXYxZ3o*Y@+2_8Cob}U@pwzS_K?<{ z`jq-2I*I!WMF``K>eB6nKcAzY-rMP`GJ<(}E)k^nLjQ0Sg+B2`{jx<a8@6X;Y*=1o z!>N$YP0lJ!oSK|ntUSv6rGWbN)Puev#hif%V(FR51awJ^=CDeJA-n6!F?V4sOi#YB zs}fiGy%$yJGeI99#%#eoWB$!iH!&o3vK=7OSo-dg@OyFhVa(9LuJ!(*PnAO_m(zhu zI`8nx4M+Z6hFIW|*;rw!<kDJxAagH)zr4cB?yJqDWeYA6G-huUN=}Y_If-wY7t|-! zyyr1kB*GcIwH%t>@)P+oG|?r7A&yTS!wG!u(eAom>+c&{z=dfd{61lqlYae)f889` z8^K1N9zt58$&yL?<lJK;mR@-yQL<q>vngL`T@CW;4%~NxcbiH!Eca=uMEyH%XXZ@! z1F^}nZliEd)ajj4n_GF=w_Lcrjr4iCfMQ+E#$eJ6+xVa|h>@jG2m;fW=9}M$b0=t8 zvEDJJeEFg2?cb>oj%8V6$XlvWr(q?yIcK<P>n{3l5eMy{%a3HI$lp_pH0-W!3vUbY zxZLbJbQ3UNZ`@$6b-8HN0sRS2Z6{{3D5RRf#%T^la<m)6X%bBx<Qan0X7z?{9?{e8 zqKD0=kN|hX2kY=N9;@+s-U3-Z@UjEHzxB#!@p@m9OmbRN)9FkSWq8{?+Qn?D&(U8% zxh0aG)|ChF#BJ^&F`9(8EUKHO%5;#WN<KrqPNa@$W2s`*8P5E*%3&#y4uAHZ**uC^ ze!G?>7CA(TV{P}^*<5mqF(9nmZXioRu-fkG0K-R6c+tB-**K#uCg$hy4l75qU1a^L zt0T6}RB=k%TDq%dwMi`FBV1v<;8!ggZCmkWm79+sz;V}p#Qr>H8mt9sa$EK-%1!@+ zn^~%>0yvZvZ6BiwUy)dGTkCHp#VZcKBx6-udNinwy769@h?0ReKyE!rg+hWwbsH50 z{Q#T~$@w*()+;lS1$!9JSX}mLo5K}NVYgOei3hv~+8L>L#y8)eu?9I;X+_eUYhALQ z#CB883uJ+&`(r7adOf|K_Tu#7txmmFIa8cS#uk+fbm^yx!Mu1=(8cleHcNT?W!)xA zI<K1^y;|Ao`>+Vc_c$u6V4u_B>x>H?!?n)=E0~6zg(b~kkTJ=??YUoD|ELx6SHPfB z+IPO{)fo7yu?=7XivERG42f-Y9;X`+`*}oFx#yQPu<Z;J-6i|y1purvq<6G{HN%9L zK?!=TDA5Mxzl-6!GI)D_sHUOcbku4ocp9n&A{x4YW9Q<%WBt7p^>1N|QDy*wK~vbQ znXlhY-1DL4Mt38-IC|d$w#fxx*Ne0BgF-H|dnvkr(z*8nZ#qs{%ETO4>XxOb72d5k zQ>L7~5ok^I#1aKNlhiD?z|GC#dtvOAFb)JK5H_{fWiv>DFfuPBYQmS2bIV^XaW}0a zHEiqbB5AHCq!OUcDK>A{r=Z?M?T&2gL89$~u{G#FyDLgBY3tmJC-yqVaE<)3Lv=TP z=^yQ|tl!Y3+gxq4tOCDexov3nZ7EC;Y7GazFM<cFwG6s+^4?9S`+;a<vcW=gp@cm{ zKc0wlkme~K=>Iq*r;s}m(4J}ulgMZA<uAsSnWAbQ+%}w!J(p6P5K1=@StYinPa*e7 zWzbvjKD<(z<F>4y%l}cZ{8%e<!xFKNe4(m{LKQ)xfpA2}meI)DDS3&npM7i4A9F5V z{pQ5-^XHm71a#SSuIh3l2z$mo0r7A=<&u{yx`bRc@jY$b8iO$9{rsxI6spWKJeyQm zyLQsGG294wO5WMdAF1vW*@kY6DX!vt)`_g=G%>D^7Exz*mm*O2Czi_NpQg3%ZD;r= zX=ZWIWT1-puylUwR00(wBmCy$^owz1I-f@$aM*1<%*e>k^=NA?%+PBL-7*xPMt-1k z%4$x@2qU&~ZD_7q`8vCIEnl;G%a{g>1pej*Cu1MtkVRG}Gz}ok8BUbn)dNhv7h`QK zF_qIkHzQN7u}pV<P(@*yAiZ#tp3f-9Re+l~Q_xS3{&VAdy-%o^$St_Ixbj*<vlLGl zVMv-2bAj$nLA~%)jN_%4_WKydm6h-?FF!?4)Z37e8WOMh8hE<JQ_KZ>H^f|SNYKM) zK#@mQURKATNDB-cQkeTI7cqC<-c`H^EN5Ou)tRFrmX<Zq?2Ojii~ZuxdmBEkmAp(c z`PH!WPrab|mD3=Jy>tj~b;cKPjs36ktT4u<LP?{3n2c#hS3Nlk>lu~kQW!d95$O3q zn*pwqk%eS%k_Ry2rJTOUG5=)$YG=mp>$+XdVea=Rhv|%I!g&};&7sSo=~v>YlITU8 zk7j*4j!~&KZ9k)Jwdf0Nk#FZiO>g;5)dl$&W>kb976-z{nF=t!{KRlQeht9NJe<79 zc53+ooA^#!JTi6VYoj=ppI)(Q$({*%9urTP&rot*V)DBEw<?my<}hzru&izS2CB4d z+NmI`El3z|LxDNKrlR-HNLKnxFc9MWp4a~^K?9$6o00;QxT!BmCr9^B@1C3+;tB){ z9nr*0p_d9e2=C8%{UGM|l<h6kc}U#oU-x<A#E_PG?ka~?7dZ##`x8re(0E;}PFpt7 zzBHkzpnqO{*-m&m3DnJa_!^LTxfZ*{)GiM@u%vLAH>$fC@o`1Iz0FyID!woYT5Q#2 zspw@rB3vMInn#*TuwsyU)i*ygp0}i+QX(`hpoW7snt7VqTuCd>7wXpdaL?=`WHLT~ zDcjszu5lc|COotz=DeBM5ld|;G$B-Hor&rV#BjDEMV~<7(KL_zo}bw|`G@X(Z93CA z?^V0+<VZN&E?ffMe2l^A<EN>8VWO{pRp8|2H-!**yhSJ#9cwIDs7c}W<v2`C$K7PE zBe<`;de4%u_YchFyk|qBdz(?5Gn_F@;O1G-Wi7z|Yw3WgX|^q(A*&6Oh%)L@%l{i+ zsW_5XvzcxS7>D&&xsx!7ewEjPy@{Y~<5??SAE%lf7=)knm>pbe`d+{8Wq^s{yMKTZ z09*hxX?|g%;u@*)!wG1^zHe9}Qdy+$dkxrTX_hRU_{QDeV((C_B6}cOsPe?mB{l$g z>dS637aEHj7fWH~=}l&niGzM8Z$w$lXXBYwKhu%M(an9qI<Ew`&hr_m_;02gV{vXW zjqL5tgPtm%=oTB(dO72&98NZ*rk>t6ldcg&jo=Wdm8*5<2K5}i<bZvRICGg{7hFj_ zw|mO8wu&~DJM$!7Q~?!hhpN`PyP-Gv)f+s#GI|G45QbjnLW9X9hRB%}R1q(Bb~+qi zg17AR1@>@(tnBcgvIpev5KsFxwsnBT_>sbQIC2{;I0w2%eaTUB&Q66=1u6VegiOpG zinWU%x6yAg%h*HC%tIL*Sk-1D`%|7oDGIP>NxzGn5KH%3?B71hq6Kem67=O{n)UIh zn9Hu31VfAi;lajhjV`|OshpMugy)lxm}8CO<v<pth}*jgF{AQku)15v>}JDYWvCtJ zZh<T*gTsy3PtB56(jK6~Sdz=@!sd95^~`hMJdL;aG4Dn)-?)%8aNQyh7uvKa29MHq zNzPs$!a9`KLi@(+azKuXMVvsCFhM@AcI{-EL5}3ZTKUDZz`I7%MKAS9r3RdaC{>KV zmN$AuzFw|@CG+zP+gED`>~z6P(*UAc^rbQ?vR`^-d#S24l_(6<(G4NVrm{Y8)afs4 zvpEk8YQCUl@6!y(mi6q9GD=}S-@9Nw<rYrPO=PsvWp|&tjnORi-cJ!qw?!dQeQ2?q zC5ixqQR%Qbpv|95sPSYUaw$xnF>hJi>ZqG@uVXKHX*+EVk(-ZZ#!Ha-Y4Mu3KRuVD zLYB;0x~(X{nd?BQo8=cH5%?Lx5*zH3bwqO%6&02Eok4JNq#MexZA9sds_ycF=#oW$ zZ6pX48|WvJyP1O*x1_(PM<ryx`lnJXa<R!ZK^$`(%$0#`)dNw{JK6H4`~34q%X~^` z@&Td^yWi(>algi}G@Z*Yd&u21N`708&-O({dB7o-R(ubPKqOT_w>(8p^>TN9es?Bg zq*Y(|F2Fhr9VbLK1uVjHLnQ1n0bQ0U9BFX@Lk%bia+p=f^i?Qhx^L`TZ@L;nQqS7! zRQb&B8*H1LRF{e~Uao#Vz;d_>g^>ipaQR~DHke0SY!K^bNz?=Pmq{)(WAe>G3CZ_l z9HQ6fdkusXpOCeYb?Xl9Kf0dOyL;do`b7j<PZg52Au3)1vDinOv5qRY*E}<gLdaZw z_87cyFPVzo5BX*2bgm=*-`fnZ`40$jQoUd2<ZPgydmD+CUGNh$AC26!Ek7uBh6rvt z`f*;Hk7|P0%!en!St5uTqiG9Ag#!N-j`jRn*7gB4d&1AVJyqky&-0Y?Pdt~@TZA1m zur4w~UfdLCmEHOI9k_J_BUfQ;wb8pRIHqOr|F{;~GZd9tTH>n2{raS(A>K}9X0AtW zT|CiZsw#zVX2dxUTji7X!iL>)z~t!bLIbG%vh(q$F=eXcnk-wnds|1MHJbn%>Dupk zq`3y=-Lv}oqrMvEp+Y1kKK!|JrXFd%yu%6uOq_0II(mqrdaQRecKY&<?ya5GVBy>C z%vTYlLDt1>=CuY;>m^(I1V2S;d3W-qG89+{QiJ~bW$5!rtsPsaHB33vc8X7r|6tkb zh}`shD1DF2IztEP_usG`7HTqqGMlN!AjqBsv4C**sSJob#!KD`SQE(p+*myhsyDOb ziYrXg0&C$7J>~3WdS0tBwaeW>Z21AU1>743MI?koYVXnBF22LPXu|gG{C!#g{qxI9 z&|H-GlE+pssY#F-I_T-T#h1e777(>J0}Y+@*hBX^H%(Lc7R1<9Df0TUc%QG@Sc*>d z{q+!tndpsO@;`A<E2-oLvPR#9IPtfrWZ~d0_p5-((q=P@dI&ohES{6Y(rBb|X*AD{ z8%G^kC}Xr&R*9I0-&nQWRhoT4AWLaDE2Dd1WpPs}NuR~=TAKw3aVD&CQhlSp655O* zuzdVr{USL0eU}^So{28NOnO-ND_2V^M1CC+703@!s0-~E=M!brOrR|rt{%0hBn7|O z<BD+hXS@FJg%+*sOQC$$G=&ya`xjH=F}0P*TZgB`rQjdrFS@bE4;2gLnRaJr<TddA z?nB}7uT?T}`yL9wXK7Fi^PF=6n8i{}HiTmS>N@G8-5r4hpDA8Jo)96dM%P@H<o7$I ze3#vc-E13jp^9f3t@qQ`S~W(z%E|1M5-;PdqCby?0|eFrlBU;B`D*Os4pV$PlckXI zkj|}fx1~QwAYN=y?48o1S9)oe-w4MWX40a>@$E58T3E#!oup;8sze<FXkXZlksOTJ zH94d2n#uYpVQd~`+sXNU1xqI~mJyq=Sg1oqLb1|RJ-_)NrfY*3_3r9I9i|CiiF~~j zwN*I&0LFmTS&~DS)kH7gf<H$)htr_$3H(~<izUVTNP#TWIPV2?e%19hJX23>^=Xu9 zM?y)!+4s9y=%_e=RPYuobUexHJV!ISvzfD-6iJK9`p`W>I{F<?_o-81hg@7MPw zYDEVxF%GQ-V^|4#r{TiZ`hyji+OuCxk%=+TqKu4~2fPsFkS-}lYyON<5f9(wlSLIT zvSxGy$mA1Ey=Az*PvwZCQy}+%POd|_zr!N@<ZSmQavZvB(4u+3JAxVClO@>!A+LiK z=srrt7Y?p*EsrVL8E%!%mGj7V)l*}UPR@w@3^a$8E#3~y==+tNUhXc+IS8_~69zSr zl*ql)e)H`jH2Tv=^AQuZeYye5>E>U~BX6KCr8R;HPttZLs0S9AdtK8DacI+44u5bQ zFBQy6pnV~q7P_`)%A{$Sl3=11x_f$Q&D};Z<Zb%x2mT_mcb>|5Ecd0|Mi$sKJ+z5? z{FBK-kqk>=1WNhvWCxCl_y;2@6>(t|ZOKZ}MKX+6j5sVZA8e;uq5h)`EDBNEJ(d`F zj*&e+UBN>0aZ>x%H;Zn9^Z`29E#Qw;F|ui3J&Y;%*&CE6xlchWT2ZGx$hY23P}jVG zlIxi4Tw;lJJ$~Mj{m&%vy8215y8WCaN9HN-ySQhK@sh*ulYr5Qw)KX>Pg)0Gc`v>F z;R>TpsMxs>GA_&iIRA9!dChl}M|82u5yHNCk#5+?dBMvKvZFf(_=hNN{ZV!57XH7X ztY~SllXop^X*J9v`Y<EUFsKk0j_h3@=te^MLa#;<vsX8-LJv`*m)$52bCnt3A6CCl z&ro4&4bGyDWO{LOftx3_ZU0V^KaRe&E9QKYL2V|j_x4ZTYYAQo9~GKQ)QoI`z7Qk8 zAMQ0^%O#FEmCN_z!F|Tpy1yyV{59_^;^kL`u)kz~@C}L=)5YaM=!qN<fMZ^?ezSfe zz9#hh6tio{9knuuDfxm*yt}qSezD-#*ZdfgB{r8mTlV%7G9viOf+;d7x+%!=Z}@B7 z_P7F#)-0EwBEx|7qHa&5H@Hvx$w|NvsSvRKX~2TBG7w-t97QN$kp9aH;04@mb-%jn z!F`a>&iJtf-Q*chXrRw1`WDH=jH5{Nee?b>$D7fbjHU}mfkPK4<|ROiz<+r`<wqpa zuW$@XZ+@+Is*>?cIkfrBjc$s4TcEh&o{wlW_&8_j(8{deILnIp!IF8VrZ=6b%6H$; zQk!2nvjq2&c%z)TjvHc;+mxraTOaLnzqtzjZ(`zM<Rh4!hDLI*=|CxRRSrSb9wKGJ z+*JaDKI;37l_KrN!u3xEt4p>#g_5YbSE{C2-y^}!TGP>Fd9b`u(IU$)Ncs(zXi{E_ z=j27N($RU{;2A%wwnj6ub<yMsK8c8b<DUemIf4<&owH9BVjwVuzaX%wU<t4h?tUX7 zoQEMg8RqhUT(vV>baI3r1w!9_hEB&6^Q8i9gs^AxLkt*;2rLvKbKptE*Xhs-`3=td z^fxvo>|4_~-{JXP(l@!p;<ZHh6n4CG@Kfzxs+`Y<=MmH<h)XpMBWci(r>*Z+vWtCB zT&t%>F;_j%eO{S*-aO5fZ9BU^Mpy07F5AnGzpt0cs=d{A5t1>4-~*GrZevv+FNk#h zbJ5#%cz3D&vv&M2`DClqis~E;Yf@J)QoockC(+T?R}@M0!jOA6lLTzI_f;P*o}mZw z)In&VMW|r9RXr0V(fT*7OJ8N=n#<{kdqJ}Syj;QnDW?y++uN5LuhrIXd6(hl(EcUO zN^NucHq?nFlg&OGawmp_Cg=E&@?;e!`03WW=d5VN*LICOZNvg+(RV+)GV0PQy}0$# z1Vaj1t_$u8EGl_l;iA)Mel;LJx>Mo75t(hYI@hAPFHK=V7cHh<xmvmTMu#*H5+Dux z%v}E06N(V&ontABV=yi`NKmxu^5;DR@msol0y1PizRs|>!XC&+)-!eA7Yc%RlwRi~ z{B#H}^|t>`nSR76T6BB!=b>R*Ip>PMv6;+wfzg4qDyS)FT5sEy^iatmR`|EC@PXP! zVuv*7AsWnSABI~Uv{+Iu8%c9l6OB9IKghh7Bp~9s`Qcj7CxbP@dd5@sIo6T49=fRP z_n4m;u=CdfcSn?O!QM6Uf!6#BKgybzb0>pNfzorZKyux;^@Wo;87xy(RbKC(PAK>7 z-E^C0k>q=Dh+X&(xfXmY8S0F-BEv9t3u|sd3+zy=$6P^!DnTKq@I~8D?TygiwMJi1 zsT7v@PPVgP$P_qe^f<pA`qRpJE}wOwP`v*H)?e%X8+{@MKN0Q+@`Utd;msi1&`^!M zwdvLW`t4hy(<|mk+9&N7_xaM&dali@#E;W3nT+UXvOEA6L-@srAGz*wQC-*%E%%fm zb~$9U^^fKlp-)(i?A*m<jq!$dwN*+r{VZol-~ya@w2NE6y2#e&@;-VmvvOoTHS{(F zy>;))d3L=#s+R&lS5#x8>&jdn0=k_^iFmYnGCrm15P{|6u_T{Ij!loW=gQFrT}c<A z*$(NYrDe6yMJ>@4(XW@JmlD|kEE@R*Ek3mRpw{H(H?ZW$@)@r;U`2&&d7#f|o*ox# zgVOM9sgnO@L1$aV8?)|z4<h>^Y389{v|6<>tiHwF4!V}yxkYg8yU{r}FJRpkL?y5J zV3^Lelb&}(^?FypY6V{i`#7?ULe?WsW{s1?Ptgi6QJmW3?NBw*2-5f`rmwGF%rG>g zu2FvE^IPN7Zam=MzDL%<-~UGPzeoadtR7T5*yL>tdj04+Ki=A0^d#yT<cJ#BZv>BI z8!S5qdi2)pBQlqZmjtznww;jqWLECW@@{;nCeCLt#OK<Z;u~5iBJX*T6LFjG55vr@ zknci5{2`(K`~J807&eWxxQ9RvZNl<*t4FoC(@X}`I?1KEb5+Yc@SZ3$tSNm0QAhH< zZo)5S=<P(`n%=)L2LdG`j-?9hI-mX_ck<rh6^<g(+`jQ~kajX&f2JCe=ADoyQ@HUk z>z5$Lbd&Pn7$7z3Y9*nAu8LV7)mE-W-_$nu#^Gi#r9vp>h0|?rk`6TR7sg2M%xh+d zPCFj`C=3VUXS<v&#s@LaphFdDgxXGwGkyb{dPHxMJzRSTdW&$SfWQy!5>)dM%WvtM zV-qb3#hxe+fR-9<8*tP4>{q8tNZ=PMakg%Zc{M_W=Yc}CaA#d&+$3mYD)-k1&;wgL z1e?|I%8*pVkP^A$#0kShNumDD#SVuM`kL?WoaH|y=C2n&ZSA+RLl#Ut+;+dYoBoK* z{pE#$9!48$-osGM59Vq99>o2XHRR<Xg8U<_!5TVge-t4>xc++^vB3Togym2BTU*F{ zh>z;48*k!|i5@uCHk07mA1Of<p3_;=E8{>cF*G#U!pbHcm(SVpFFFNNR}PZ{pUr-K z-GefDxGMWCn+)#HIZ>x;UifTK4>darx8(|k9Zyr#J589AT(yv4{xuY|smXCy4Bap9 z52XXIuDn2xEg}*2@SWY9KebCT_R2^J{cXIIzB~T~)@Ar^hvVhibhdP}J#u(oT8tzT zeCZzd$w@<yc7omX`hs=gf;zqtqBSYyPA1{2O-Gju5`CA5q)A9w@5hm#%$Db13e7GL zjM&&ET|sgaqK{`NOjT!z*p4{cq&!Za^(k9wS@o}RqHl@c+%&c3z=t!>;|NC@2Rmv_ z1}5Jk^;-L7D|b81=W{u4aXUh#h`uHd2qZOQV%QCwaPUJ8>Ip06Ggc+{A2eu_>#Q*7 zyr-TWJ9LJ|*YF~bCoXs_3|at%fsZw&C0^fqoqDlsYcQH5^0WXm?$JE`NAg39Xw&rV z^`4hW9bYg!x?s2Vhx(-G589IQ0gRluL#(0?3H8)@T|7ZPQnW(pg362L_b7aYY1=E9 zS!E{<oL=|mT$}m3<u`+6GgN8`8~dp^HbiW%F!M6j=g`ZbbJgZ-a|t5O3O*Sw7;dqk z&ojFQhn5d}<`9Y)>!Mp-Ob?$$5xIs7_83oO%GSH(N8hB2y-s}n(d3^PnRLfk!8ld` z6AF{a04;TTMP5HaafCdv_vSV|EU^n<9H(~E28_Y7ecN@y@jWj@uF=o|R<WhL<M=jg z9`nAAWAYhUXyluR=Fw%*ON1auVcIex4=gkrxoqtH1=#)a2E$+#67E9Y$}mMMoW7g~ zcL-wsSM-b<e<?JmJlY)2et0c($Wx>W3ir9bfRW`HZ)YAZIweXlTw2wuu4}CWDcL?A zf&(x44~XQEk$ST~;u6s*v;YsZqvdRg+h+d*GyB0E8ZuGJyK>p}^jWA^%k!1Ro$j#Q zg!ls!AEwKThgUn!JOc9GbyIAlZP*R_PCSV)*;~EV$Nl7mOu_1*0}bVH)5Y^2+|zQw zga4R*RmXUGwz;aWQ6QUQWNc)dz{jaJlF7qhMQ+zUWh9Z>Mfse2dqjeU)os9RFh(G9 zl<Y{QjyfAQ->@!Wy1s#1v?NBD({i%-Tq>kAQ{?PRATs!zM!{FJ$=ze0-MdlV)^a?r zwfD&C0zwXY%j;VeYJs`GI>2QD7;6;W;JPO{ZECz7&F_6582`DYQ9&w`FDb;T2kchJ z0A6}M<R_-*;TrX>=UgscS79{=U0o82_N)v$GL3IPmeA<^*SLcfInZsR(^&I;9rreB zUU!8<(DUds9Et4priCEWeDmlLEm|WTvX~{pz6&z$p`h<jvhLVzy3H<=a3_$-JJth_ z(m3d{Ci7wTnxN)otI5E|F7r$Eyvu}`r#X7|^6@x{9G2str9ZHG=18D=1~)iS`Otte z1k(k4_jq^8VmV$~TNZxJ<}v=Jy&|8wp7$IFLHH`W`YI)HG=<R<49`bbzInJk<Lgr2 z2?n-pBF{bf#)_gp+CZgMNWrwAn#0M;3<5^?>aYuN?c(+Ua%;$<_&ey=aXVDV+npG1 zT}%lZorwci3o@Vy@^`>zdv0vx?vG(Ef5>j9K+CTXq|p?%(7XFfa-RbrUp&71gOy@} z#+sk`l3`>AR0E?w5!AeOgeN0OaO*$a{;jOaj7)imv+Xjj$cvuC$D17Gj6c(?DKfmw zD00T*-iHyj{v%8Rwl{vwGY7B&q&dD#a>+G2pv*GjBmq^|Q)&ZIO`tKP;{v;!09#~K zlv<fw_?cokHI|C@Lfk^{G^8xJ!sgGZ51)>#T#Gz?QvY{^&(F|m2%>~1akS2gP{G^k zBy{iY!)8Mv?c=%vCvD;>36whi`MGs*nIPt#;AXXNz1^y3sNdl&em%SOybzBw|K6%o z#EETe*EiGf+NSKevXr%(XT98B$uiYgGtGpf?2s}s>ZQz%A|jD@x$!VvuCHMH#<J4S z8Rho0jz4i5{X^k+5w@SYBG$vLuMQWz4u-8)o#T7X&lH#Kj(<v_J%kgsFv%pfZ959K zd+J1Ml|)Sm_&ndm7V&mHNv&#@W3^$Af+y+QI(0cvlN_=vPAP8G2`!bfsVrCvsLq(b z?6nh>G9v;1I9~0UkS5rJccM@hbewP9f0vQvj4op8k^Ck^_~kx#A(ciponD_|#>Y9m z1(Q5;vhJJhZyx;7k4pj_{#PpvkY9NlE#0w`)@XT59>W%5nMxz;gR0sg6$AIp{^n(N zy0BY*GKV`ozjdbQZ6bo`{Vhsq<VmT;-jB3yoNg6g-aqJ6tmNH}*KjLs0)%A|_J_3) zgWBjyu0q3VelLxcY>^vlE`#b3*&v<}T1u)i^!9W%aap6~!J$?f$jw|2i|L+Bc~=wj zYUY9jf6#j4w|&Bn9?TLdAJ0+a=<UooXT9)k&hRq_a=W=I%iklpeL*YMkAb$vj`_X! zV!RzZNN(nCzfXtQhKYKcvaXAh`pJs-U6c`)*^P;7bLeD>tFvj_xVMYl2j%6K!s#)i z^>}Nf_a`-B$KN{mtBp3_fk_bwKvBi1<g;U{uEoRXrw;N$I^VEuk1|6(tZzyMx=G^; zx6>uV(>zz6%^<#89~bTm#y>-SRGXQ4iKqF~->Jh-vh8-htP4nx($W;!Qc*?W?j=oH zJAy`iX_xD-Z<+|7d+GE0+(h^)q_QDgx96V1#DAa4rI}}qk<p2Xigt<JT)_%#%?n%R zb5E}%%Sfn?eG@0)Yx8`zH?rnv9yYzOCOhT%7@xKtS5mU>`p(Rj+YL*OKx8Cw0gIxg znT2*jhgNRGganpHe_koTkV62`OmykH>buo`>V9seI?3jQ(KcGq%4viV>Em<t%-omz zf?~y3nXMy87vOtNO{WiLTqYZ%)xf#_R}6v#GjujMqb~S*-arzL7+%-nN%~9eSMlVp zWu4_mA9NEXanQEn2Lw-ht8q@$5>jUMkrH91;ZVy^US|`gK(SqkKwOtsO544l-$V05 z1~UBB;p|-1;?MFii(9UrW1ru#TkWcV!r>YGUh?R!f-ztA=H?g0k4wMYrujsFbd|-N zh&Rv8A3j5DM*9@jaMw9@Bb|uuHqXmlT>8+M9*6K(oxq+o7K;!qQq@j^pa1g~zCIOg zg{z=qpG}txL&+xM29bVKiF*3d5qSlKK{Gc=JYEnM!*1E3;`}OJ2MW*fdGF^_Mc;p| zLb1-IO8ULy6$_?)k`9c|X+wXma6!7`JBZ6Ib0LmjyUw2k{pi_cd)uR0RNq)J8+oY7 zaB8<X$8iv=?@o8jj`Vd-Xx#;r$sTD=3}ZcnI9SNM4KK-{321tu2xqsWb;}~cUVZU3 zh}@<>fk!2W_e4Y^5;<Hrl%Ok)yLBa!+>o4J`s*v-A;I#iEmhl9D>NK=;opH5p%-w4 zdRLx{*GTyyfEl}DPA_Az9MI84eLP=g8%n>VV=`7b)1abF<?@Se$6X8+PgE~?6sYl# z@TmWUSZYy!;BgXlt6KKlXCjqPCk<<16#C(@b7Z(ko~GnFzOB|dX<R>J@C^I~0;IEH zv?Ke$;20lUZ04lf3q%szK!bqWVfxcrFBQW2)#gt$^x�^HI{H^FIlO1yVe9^#yA; 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Π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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/images/recent_cases.png b/x-pack/plugins/cases/images/recent_cases.png new file mode 100644 index 0000000000000000000000000000000000000000..528bf362739799307789612e3fd850abfb0598de GIT binary patch literal 50037 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%0AUs!3U%Ut5wBo^h%4Szq5U=lFZm+>MNs<okfQ(U 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts b/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts index 4cce307cc54e2..cb90568982282 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts @@ -11,7 +11,6 @@ import { useCallback, useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../../common/constants'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; import { AuthenticatedUser } from '../../../../../security/common/model'; import { convertToCamelCase } from '../../../containers/utils'; import { StartServices } from '../../../types'; @@ -53,7 +52,7 @@ export interface AuthenticatedElasticUser { export const useCurrentUser = (): AuthenticatedElasticUser | null => { const [user, setUser] = useState<AuthenticatedElasticUser | null>(null); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const { security } = useKibana().services; @@ -82,13 +81,14 @@ export const useCurrentUser = (): AuthenticatedElasticUser | null => { } } catch (error) { if (!didCancel) { - errorToToaster({ - title: i18n.translate('xpack.cases.getCurrentUser.Error', { - defaultMessage: 'Error getting user', - }), - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { + title: i18n.translate('xpack.cases.getCurrentUser.Error', { + defaultMessage: 'Error getting user', + }), + } + ); setUser(null); } } @@ -97,7 +97,7 @@ export const useCurrentUser = (): AuthenticatedElasticUser | null => { return () => { didCancel = true; }; - }, [dispatchToaster, security]); + }, [security, toasts]); useEffect(() => { fetchUser(); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx index 0f8e0173cf441..daeaa0492e305 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx @@ -14,7 +14,7 @@ import { TestProviders } from '../../common/mock'; import { casesStatus, useGetCasesMockState, collectionCase } from '../../containers/mock'; import * as i18n from './translations'; -import { CaseStatuses, CaseType } from '../../../common'; +import { CaseStatuses, CaseType, StatusAll } from '../../../common'; import { getEmptyTagValue } from '../empty_value'; import { useDeleteCases } from '../../containers/use_delete_cases'; import { useGetCases } from '../../containers/use_get_cases'; @@ -23,7 +23,6 @@ import { useUpdateCases } from '../../containers/use_bulk_update_case'; import { useGetActionLicense } from '../../containers/use_get_action_license'; import { getCasesColumns } from './columns'; import { AllCases } from '.'; -import { StatusAll } from '../status'; jest.mock('../../containers/use_bulk_update_case'); jest.mock('../../containers/use_delete_cases'); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.tsx b/x-pack/plugins/cases/public/components/all_cases/index.tsx index e06ed9da8dc0b..89df7edf5ede2 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.tsx @@ -22,7 +22,7 @@ import styled, { css } from 'styled-components'; import classnames from 'classnames'; import * as i18n from './translations'; -import { CaseStatuses, CaseType } from '../../../common'; +import { CaseStatuses, CaseType, CommentRequestAlertType, CommentType } from '../../../common'; import { getCasesColumns } from './columns'; import { Case, DeleteCase, FilterOptions, SortFieldCase, SubCase } from '../../containers/types'; import { useGetCases, UpdateCase } from '../../containers/use_get_cases'; @@ -44,6 +44,7 @@ import { getActions } from './actions'; import { CasesTableFilters } from './table_filters'; import { useUpdateCases } from '../../containers/use_bulk_update_case'; import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { usePostComment } from '../../containers/use_post_comment'; import { getActionLicenseError } from '../use_push_to_service/helpers'; import { CaseCallOut } from '../callout'; import { ConfigureCaseButton } from '../configure_cases/button'; @@ -112,9 +113,9 @@ const BasicTable = styled(EuiBasicTable)` BasicTable.displayName = 'BasicTable'; export interface AllCasesProps { + alertData?: Omit<CommentRequestAlertType, 'type'>; configureCasesHref: string; createCaseHref: string; - disabledCases?: CaseType[]; disabledStatuses?: CaseStatuses[]; getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; isModal?: boolean; @@ -123,13 +124,14 @@ export interface AllCasesProps { onCreateCaseNavClick?: (ev: React.MouseEvent) => void; onRowClick?: (theCase?: Case | SubCase) => void; userCanCrud: boolean; + updateCase?: (newCase: Case) => void; } export const AllCases = React.memo<AllCasesProps>( ({ + alertData, configureCasesHref, createCaseHref, - disabledCases = [], disabledStatuses, getCaseDetailsHref, isModal = false, @@ -138,6 +140,7 @@ export const AllCases = React.memo<AllCasesProps>( onCreateCaseNavClick, onRowClick, userCanCrud, + updateCase, }) => { const { actionLicense } = useGetActionLicense(); const { @@ -177,6 +180,10 @@ export const AllCases = React.memo<AllCasesProps>( isUpdated, updateBulkStatus, } = useUpdateCases(); + + // Post Comment to Case + const { postComment, isLoading: isCommentsUpdating } = usePostComment(); + const [deleteThisCase, setDeleteThisCase] = useState<DeleteCase>({ title: '', id: '', @@ -371,12 +378,12 @@ export const AllCases = React.memo<AllCasesProps>( onCaseDetailsNavClick, }), [ - userCanCrud, actions, filterOptions.status, - isModal, getCaseDetailsHref, + isModal, onCaseDetailsNavClick, + userCanCrud, ] ); @@ -422,7 +429,17 @@ export const AllCases = React.memo<AllCasesProps>( const tableRowProps = useCallback( (theCase: Case) => { - const onTableRowClick = memoize(() => { + const onTableRowClick = memoize(async () => { + if (alertData != null) { + await postComment({ + caseId: theCase.id, + data: { + type: CommentType.alert, + ...alertData, + }, + updateCase, + }); + } if (onRowClick) { onRowClick(theCase); } @@ -434,7 +451,7 @@ export const AllCases = React.memo<AllCasesProps>( ...(isModal && theCase.type !== CaseType.collection ? { onClick: onTableRowClick } : {}), }; }, - [isModal, onRowClick] + [isModal, alertData, onRowClick, postComment, updateCase] ); const enableBuckActions = userCanCrud && !isModal; @@ -503,7 +520,7 @@ export const AllCases = React.memo<AllCasesProps>( </EuiFlexGroup> </CaseHeaderPage> )} - {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( + {(isCasesLoading || isDeleting || isUpdating || isCommentsUpdating) && !isDataEmpty && ( <ProgressLoader size="xs" color="accent" className="essentialAnimation" /> )} <TableWrap data-test-subj="table-wrap" loading={!isModal ? isCasesLoading : undefined}> @@ -565,6 +582,7 @@ export const AllCases = React.memo<AllCasesProps>( itemId="id" items={data.cases} itemIdToExpandedRowMap={itemIdToExpandedRowMap} + loading={isCommentsUpdating} noItemsMessage={ <EuiEmptyPrompt title={<h3>{i18n.NO_CASES}</h3>} diff --git a/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx b/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx index a7c4cc68bfe24..1a9dd9c772294 100644 --- a/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/status_filter.test.tsx @@ -9,9 +9,8 @@ import React from 'react'; import { mount } from 'enzyme'; import { waitFor } from '@testing-library/react'; -import { CaseStatuses } from '../../../common'; +import { CaseStatuses, StatusAll } from '../../../common'; import { StatusFilter } from './status_filter'; -import { StatusAll } from '../status'; const stats = { [StatusAll]: 0, diff --git a/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx b/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx index 34186a201cc05..9fb00933f0307 100644 --- a/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/status_filter.tsx @@ -7,7 +7,8 @@ import React, { memo } from 'react'; import { EuiSuperSelect, EuiSuperSelectOption, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { Status, statuses, StatusAll, CaseStatusWithAllStatus } from '../status'; +import { Status, statuses } from '../status'; +import { CaseStatusWithAllStatus, StatusAll } from '../../../common'; interface Props { stats: Record<CaseStatusWithAllStatus, number | null>; diff --git a/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx b/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx index 726dbd680e3b8..9428a374a0314 100644 --- a/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/table_filters.tsx @@ -10,12 +10,11 @@ import { isEqual } from 'lodash/fp'; import styled from 'styled-components'; import { EuiFlexGroup, EuiFlexItem, EuiFieldSearch, EuiFilterGroup } from '@elastic/eui'; -import { CaseStatuses } from '../../../common'; +import { CaseStatuses, CaseStatusWithAllStatus, StatusAll } from '../../../common'; import { FilterOptions } from '../../containers/types'; import { useGetTags } from '../../containers/use_get_tags'; import { useGetReporters } from '../../containers/use_get_reporters'; import { FilterPopover } from '../filter_popover'; -import { CaseStatusWithAllStatus, StatusAll } from '../status'; import { StatusFilter } from './status_filter'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/bulk_actions/index.tsx b/x-pack/plugins/cases/public/components/bulk_actions/index.tsx index 7ab24b2e3ab8f..fae1c4909ffe2 100644 --- a/x-pack/plugins/cases/public/components/bulk_actions/index.tsx +++ b/x-pack/plugins/cases/public/components/bulk_actions/index.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; -import { CaseStatuses } from '../../../common'; -import { statuses, CaseStatusWithAllStatus } from '../status'; +import { CaseStatuses, CaseStatusWithAllStatus } from '../../../common'; +import { statuses } from '../status'; import * as i18n from './translations'; import { Case } from '../../containers/types'; diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index ec73b1fff75e6..dc1245bf2fb44 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -17,8 +17,7 @@ import { EuiHorizontalRule, } from '@elastic/eui'; -import { CaseStatuses, CaseAttributes, CaseType } from '../../../common'; -import { Case, CaseConnector } from '../../containers/types'; +import { CaseStatuses, CaseAttributes, CaseType, Case, CaseConnector } from '../../../common'; import { HeaderPage } from '../header_page'; import { EditableTitle } from '../header_page/editable_title'; import { TagList } from '../tag_list'; diff --git a/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx b/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx index 10955db69461c..0c44bcab70679 100644 --- a/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/case/alert_fields.tsx @@ -36,8 +36,6 @@ const CaseParamsFields: React.FunctionComponent<ActionParamsProps<CaseActionPara actionParams, editAction, index, - errors, - messageVariables, actionConnector, }) => { const { caseId = null, comment = defaultAlertComment } = actionParams.subActionParams ?? {}; diff --git a/x-pack/plugins/cases/public/components/connectors/index.ts b/x-pack/plugins/cases/public/components/connectors/index.ts index 7444c403a3b60..71ba161eb63c9 100644 --- a/x-pack/plugins/cases/public/components/connectors/index.ts +++ b/x-pack/plugins/cases/public/components/connectors/index.ts @@ -17,7 +17,7 @@ import { ResilientFieldsType, } from '../../../common'; -export { getActionType as getCaseConnectorUI } from './case'; +export { getActionType as getCaseConnectorUi } from './case'; export * from './config'; export * from './types'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx index 9270abed0881f..79ac42e034c6a 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx @@ -9,7 +9,7 @@ import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { useKibana } from '../../../common/lib/kibana'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { useGetIssues } from './use_get_issues'; import { useGetSingleIssue } from './use_get_single_issue'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx index 03000e8916617..a4958d91c88aa 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getFieldsByIssueType } from './api'; import { Fields } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx index 3c35d315a2bcd..447491d2a2fff 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getIssueTypes } from './api'; import { IssueTypes } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx index b44b0558f1536..e4b6f5e4dea01 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issues.tsx @@ -8,7 +8,7 @@ import { isEmpty, debounce } from 'lodash/fp'; import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getIssues } from './api'; import { Issues } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx index 6c70286426168..e26940a40d39f 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_single_issue.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getIssue } from './api'; import { Issue } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx index 34cbb0a69b0f4..530b56de8796d 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_incident_types.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getIncidentTypes } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx index 5b44c6b4a32b2..8753e3926ffe5 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getSeverity } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx index ed4577dd0114b..9f88da9f35eb5 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.test.tsx @@ -8,7 +8,7 @@ import { renderHook } from '@testing-library/react-hooks'; import { useKibana } from '../../../common/lib/kibana'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { choices } from '../mock'; import { useGetChoices, UseGetChoices, UseGetChoicesProps } from './use_get_choices'; import * as api from './api'; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx index a979f96d84ab2..4edf740a60011 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx @@ -7,7 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; +import { ActionConnector } from '../../../../common'; import { getChoices } from './api'; import { Choice } from './types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/cases/public/components/create/connector.tsx b/x-pack/plugins/cases/public/components/create/connector.tsx index 9b6063a7bf9b9..0b4cdca6dd6ff 100644 --- a/x-pack/plugins/cases/public/components/create/connector.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.tsx @@ -13,7 +13,7 @@ import { UseField, useFormData, FieldHook, useFormContext } from '../../common/s import { useConnectors } from '../../containers/configure/use_connectors'; import { ConnectorSelector } from '../connector_selector/form'; import { ConnectorFieldsForm } from '../connectors/fields_form'; -import { ActionConnector } from '../../containers/types'; +import { ActionConnector } from '../../../common'; import { getConnectorById } from '../configure_cases/utils'; import { FormProps } from './schema'; diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index 192effb6adb24..5fd3b9e19a140 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -15,6 +15,7 @@ import { CreateCaseForm } from './form'; import { FormContext } from './form_context'; import { SubmitCaseButton } from './submit_button'; import { Case } from '../../containers/types'; +import { CaseType } from '../../../common/api/cases'; export const CommonUseField = getUseField({ component: Field }); @@ -26,21 +27,36 @@ const Container = styled.div` export interface CreateCaseProps { afterCaseCreated?: (theCase: Case) => Promise<void>; + caseType?: CaseType; + hideConnectorServiceNowSir?: boolean; onCancel: () => void; onSuccess: (theCase: Case) => Promise<void>; + withSteps?: boolean; } -export const CreateCase = ({ afterCaseCreated, onCancel, onSuccess }: CreateCaseProps) => ( - <FormContext afterCaseCreated={afterCaseCreated} onSuccess={onSuccess}> - <CreateCaseForm /> +export const CreateCase = ({ + afterCaseCreated, + caseType, + hideConnectorServiceNowSir, + onCancel, + onSuccess, + withSteps, +}: CreateCaseProps) => ( + <FormContext + afterCaseCreated={afterCaseCreated} + caseType={caseType} + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + onSuccess={onSuccess} + > + <CreateCaseForm hideConnectorServiceNowSir={hideConnectorServiceNowSir} withSteps={withSteps} /> <Container> <EuiFlexGroup alignItems="center" justifyContent="flexEnd" gutterSize="xs" responsive={false}> <EuiFlexItem grow={false}> <EuiButtonEmpty data-test-subj="create-case-cancel" - size="s" - onClick={onCancel} iconType="cross" + onClick={onCancel} + size="s" > {i18n.CANCEL} </EuiButtonEmpty> diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/filters/index.tsx b/x-pack/plugins/cases/public/components/recent_cases/filters/index.tsx similarity index 93% rename from x-pack/plugins/security_solution/public/overview/components/recent_cases/filters/index.tsx rename to x-pack/plugins/cases/public/components/recent_cases/filters/index.tsx index 5b6c59e31e202..cc37a826e18b9 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/filters/index.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/filters/index.tsx @@ -27,7 +27,7 @@ const toggleButtonIcons: EuiButtonGroupOptionProps[] = [ }, ]; -export const Filters = React.memo<{ +export const RecentCasesFilters = React.memo<{ filterBy: FilterMode; setFilterBy: (filterBy: FilterMode) => void; showMyRecentlyReported: boolean; @@ -57,4 +57,4 @@ export const Filters = React.memo<{ ); }); -Filters.displayName = 'Filters'; +RecentCasesFilters.displayName = 'RecentCasesFilters'; diff --git a/x-pack/plugins/cases/public/components/recent_cases/icon_with_count.tsx b/x-pack/plugins/cases/public/components/recent_cases/icon_with_count.tsx new file mode 100644 index 0000000000000..f46eb631ca2d6 --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/icon_with_count.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText, EuiToolTip } from '@elastic/eui'; +import React from 'react'; +import styled from 'styled-components'; + +const Icon = styled(EuiIcon)` + margin-right: 8px; +`; + +const FlexGroup = styled(EuiFlexGroup)` + margin-right: 16px; +`; +const OuterContainer = styled.span` + width: fit-content; +`; +export const IconWithCount = React.memo<{ count: number; icon: string; tooltip: string }>( + ({ count, icon, tooltip }) => ( + <OuterContainer> + <EuiToolTip content={tooltip}> + <FlexGroup alignItems="center" gutterSize="none"> + <EuiFlexItem grow={false}> + <Icon color="subdued" size="s" type={icon} /> + </EuiFlexItem> + + <EuiFlexItem grow={false}> + <EuiText color="subdued" size="xs"> + {count} + </EuiText> + </EuiFlexItem> + </FlexGroup> + </EuiToolTip> + </OuterContainer> + ) +); + +IconWithCount.displayName = 'IconWithCount'; diff --git a/x-pack/plugins/cases/public/components/recent_cases/index.tsx b/x-pack/plugins/cases/public/components/recent_cases/index.tsx new file mode 100644 index 0000000000000..0339b44bc3864 --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/index.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiText, EuiTitle } from '@elastic/eui'; +import React, { useMemo, useState } from 'react'; + +import * as i18n from './translations'; +import { CaseDetailsHrefSchema, LinkAnchor } from '../links'; +import { RecentCasesFilters } from './filters'; +import { RecentCasesComp } from './recent_cases'; +import { FilterMode as RecentCasesFilterMode } from './types'; +import { useCurrentUser } from '../../common/lib/kibana'; + +export interface RecentCasesProps { + allCasesHref: string; + createCaseHref: string; + getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; + goToAllCases: (ev: React.MouseEvent) => void; + onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + maxCasesToShow: number; +} + +const RecentCases = ({ + allCasesHref, + createCaseHref, + getCaseDetailsHref, + goToAllCases, + onCaseDetailsNavClick, + maxCasesToShow, +}: RecentCasesProps) => { + const currentUser = useCurrentUser(); + const [recentCasesFilterBy, setRecentCasesFilterBy] = useState<RecentCasesFilterMode>( + 'recentlyCreated' + ); + + const recentCasesFilterOptions = useMemo( + () => + recentCasesFilterBy === 'myRecentlyReported' && currentUser != null + ? { + reporters: [ + { + email: currentUser.email, + full_name: currentUser.fullName, + username: currentUser.username, + }, + ], + } + : {}, + [currentUser, recentCasesFilterBy] + ); + return ( + <> + <> + <EuiFlexGroup alignItems="center" gutterSize="none" justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <EuiTitle size="xs"> + <h2>{i18n.RECENT_CASES}</h2> + </EuiTitle> + </EuiFlexItem> + + <EuiFlexItem grow={false}> + <RecentCasesFilters + filterBy={recentCasesFilterBy} + setFilterBy={setRecentCasesFilterBy} + showMyRecentlyReported={currentUser != null} + /> + </EuiFlexItem> + </EuiFlexGroup> + <EuiHorizontalRule margin="s" /> + </> + <EuiText color="subdued" size="s"> + <RecentCasesComp + createCaseHref={createCaseHref} + filterOptions={recentCasesFilterOptions} + getCaseDetailsHref={getCaseDetailsHref} + onCaseDetailsNavClick={onCaseDetailsNavClick} + maxCasesToShow={maxCasesToShow} + /> + <EuiHorizontalRule margin="s" /> + <EuiText size="xs"> + <LinkAnchor onClick={goToAllCases} href={allCasesHref}> + {' '} + {i18n.VIEW_ALL_CASES} + </LinkAnchor> + </EuiText> + </EuiText> + </> + ); +}; + +// eslint-disable-next-line import/no-default-export +export { RecentCases as default }; diff --git a/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx b/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx new file mode 100644 index 0000000000000..7e0788d66878b --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLoadingContent, EuiSpacer } from '@elastic/eui'; +import React from 'react'; + +const LoadingPlaceholdersComponent: React.FC<{ + lines: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; + placeholders: number; +}> = ({ lines, placeholders }) => ( + <> + {[...Array(placeholders).keys()].map((_, i) => ( + <React.Fragment key={i}> + <EuiLoadingContent lines={lines} /> + {i !== placeholders - 1 && <EuiSpacer size="l" />} + </React.Fragment> + ))} + </> +); + +LoadingPlaceholdersComponent.displayName = 'LoadingPlaceholdersComponent'; + +export const LoadingPlaceholders = React.memo(LoadingPlaceholdersComponent); diff --git a/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.test.tsx b/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.test.tsx new file mode 100644 index 0000000000000..0295632cc137a --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.test.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { TestProviders } from '../../../common/mock'; +import { NoCases } from '.'; + +describe('RecentCases', () => { + it('if no cases, a link to create cases will exist', () => { + const createCaseHref = '/create'; + const wrapper = mount( + <TestProviders> + <NoCases createCaseHref={createCaseHref} /> + </TestProviders> + ); + expect(wrapper.find(`[data-test-subj="no-cases-create-case"]`).first().prop('href')).toEqual( + createCaseHref + ); + }); +}); diff --git a/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx b/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx new file mode 100644 index 0000000000000..df0efcec4552c --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { EuiLink } from '@elastic/eui'; +import * as i18n from '../translations'; + +const NoCasesComponent = ({ createCaseHref }: { createCaseHref: string }) => ( + <> + <span>{i18n.NO_CASES}</span> + <EuiLink + data-test-subj="no-cases-create-case" + href={createCaseHref} + >{` ${i18n.START_A_NEW_CASE}`}</EuiLink> + {'!'} + </> +); + +NoCasesComponent.displayName = 'NoCasesComponent'; + +export const NoCases = React.memo(NoCasesComponent); diff --git a/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx b/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx new file mode 100644 index 0000000000000..60f313b79f330 --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText } from '@elastic/eui'; +import React, { useEffect, useMemo, useRef } from 'react'; +import { isEqual } from 'lodash/fp'; +import styled from 'styled-components'; + +import { IconWithCount } from './icon_with_count'; +import * as i18n from './translations'; +import { useGetCases } from '../../containers/use_get_cases'; +import { CaseDetailsHrefSchema, CaseDetailsLink } from '../links'; +import { LoadingPlaceholders } from './loading_placeholders'; +import { NoCases } from './no_cases'; +import { isSubCase } from '../all_cases/helpers'; +import { MarkdownRenderer } from '../markdown_editor'; +import { FilterOptions } from '../../containers/types'; + +const MarkdownContainer = styled.div` + max-height: 150px; + overflow-y: auto; + width: 300px; +`; + +export interface RecentCasesProps { + createCaseHref: string; + filterOptions: Partial<FilterOptions>; + getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; + onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + maxCasesToShow: number; +} +const usePrevious = (value: Partial<FilterOptions>) => { + const ref = useRef(); + useEffect(() => { + (ref.current as unknown) = value; + }); + return ref.current; +}; +export const RecentCasesComp = ({ + createCaseHref, + filterOptions, + getCaseDetailsHref, + onCaseDetailsNavClick, + maxCasesToShow, +}: RecentCasesProps) => { + const previousFilterOptions = usePrevious(filterOptions); + const { data, loading, setFilters } = useGetCases({ perPage: maxCasesToShow }); + + useEffect(() => { + if (previousFilterOptions !== undefined && !isEqual(previousFilterOptions, filterOptions)) { + setFilters(filterOptions); + } + }, [previousFilterOptions, filterOptions, setFilters]); + + const isLoadingCases = useMemo( + () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, + [loading] + ); + + return isLoadingCases ? ( + <LoadingPlaceholders lines={2} placeholders={3} /> + ) : !isLoadingCases && data.cases.length === 0 ? ( + <NoCases createCaseHref={createCaseHref} /> + ) : ( + <> + {data.cases.map((c, i) => ( + <EuiFlexGroup key={c.id} gutterSize="none" justifyContent="spaceBetween"> + <EuiFlexItem grow={false}> + <EuiText size="s"> + <CaseDetailsLink + detailName={isSubCase(c) ? c.caseParentId : c.id} + getCaseDetailsHref={getCaseDetailsHref} + onCaseDetailsNavClick={onCaseDetailsNavClick} + title={c.title} + subCaseId={isSubCase(c) ? c.id : undefined} + > + {c.title} + </CaseDetailsLink> + </EuiText> + + <IconWithCount count={c.totalComment} icon={'editorComment'} tooltip={i18n.COMMENTS} /> + {c.description && c.description.length && ( + <MarkdownContainer> + <EuiText color="subdued" size="xs"> + <MarkdownRenderer disableLinks={true}>{c.description}</MarkdownRenderer> + </EuiText> + </MarkdownContainer> + )} + {i !== data.cases.length - 1 && <EuiSpacer size="l" />} + </EuiFlexItem> + </EuiFlexGroup> + ))} + </> + ); +}; diff --git a/x-pack/plugins/cases/public/components/recent_cases/translations.ts b/x-pack/plugins/cases/public/components/recent_cases/translations.ts new file mode 100644 index 0000000000000..c8f6c349d8f72 --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/translations.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const COMMENTS = i18n.translate('xpack.cases.recentCases.commentsTooltip', { + defaultMessage: 'Comments', +}); + +export const MY_RECENTLY_REPORTED_CASES = i18n.translate( + 'xpack.cases.recentCases.myRecentlyReportedCasesButtonLabel', + { + defaultMessage: 'My recently reported cases', + } +); + +export const NO_CASES = i18n.translate('xpack.cases.recentCases.noCasesMessage', { + defaultMessage: 'No cases have been created yet. Put your detective hat on and', +}); + +export const RECENT_CASES = i18n.translate('xpack.cases.recentCases.recentCasesSidebarTitle', { + defaultMessage: 'Recent cases', +}); + +export const RECENTLY_CREATED_CASES = i18n.translate( + 'xpack.cases.recentCases.recentlyCreatedCasesButtonLabel', + { + defaultMessage: 'Recently created cases', + } +); + +export const START_A_NEW_CASE = i18n.translate('xpack.cases.recentCases.startNewCaseLink', { + defaultMessage: 'start a new case', +}); + +export const VIEW_ALL_CASES = i18n.translate('xpack.cases.recentCases.viewAllCasesLink', { + defaultMessage: 'View all cases', +}); + +export const CASES_FILTER_CONTROL = i18n.translate('xpack.cases.recentCases.controlLegend', { + defaultMessage: 'Cases filter', +}); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/types.ts b/x-pack/plugins/cases/public/components/recent_cases/types.ts similarity index 100% rename from x-pack/plugins/security_solution/public/overview/components/recent_cases/types.ts rename to x-pack/plugins/cases/public/components/recent_cases/types.ts diff --git a/x-pack/plugins/cases/public/components/status/config.ts b/x-pack/plugins/cases/public/components/status/config.ts index e85d429067724..0202507aa3721 100644 --- a/x-pack/plugins/cases/public/components/status/config.ts +++ b/x-pack/plugins/cases/public/components/status/config.ts @@ -4,9 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { CaseStatuses } from '../../../common'; +import { CaseStatuses, StatusAll } from '../../../common'; import * as i18n from './translations'; -import { AllCaseStatus, Statuses, StatusAll } from './types'; +import { AllCaseStatus, Statuses } from './types'; export const allCaseStatus: AllCaseStatus = { [StatusAll]: { color: 'hollow', label: i18n.ALL }, diff --git a/x-pack/plugins/cases/public/components/status/status.tsx b/x-pack/plugins/cases/public/components/status/status.tsx index de4c979daf4c1..03dca8642aed7 100644 --- a/x-pack/plugins/cases/public/components/status/status.tsx +++ b/x-pack/plugins/cases/public/components/status/status.tsx @@ -10,8 +10,8 @@ import { noop } from 'lodash/fp'; import { EuiBadge } from '@elastic/eui'; import { allCaseStatus, statuses } from './config'; -import { CaseStatusWithAllStatus, StatusAll } from './types'; import * as i18n from './translations'; +import { CaseStatusWithAllStatus, StatusAll } from '../../../common'; interface Props { type: CaseStatusWithAllStatus; diff --git a/x-pack/plugins/cases/public/components/status/types.ts b/x-pack/plugins/cases/public/components/status/types.ts index 674838067b0ac..f8115b8d692b3 100644 --- a/x-pack/plugins/cases/public/components/status/types.ts +++ b/x-pack/plugins/cases/public/components/status/types.ts @@ -6,12 +6,7 @@ */ import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { CaseStatuses } from '../../../common'; - -export const StatusAll = 'all' as const; -type StatusAllType = typeof StatusAll; - -export type CaseStatusWithAllStatus = CaseStatuses | StatusAllType; +import { CaseStatuses, StatusAllType } from '../../../common'; export type AllCaseStatus = Record<StatusAllType, { color: string; label: string }>; diff --git a/x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap b/x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap deleted file mode 100644 index 5e008e28073de..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap +++ /dev/null @@ -1,48 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Modal all errors rendering it renders the default all errors modal when isShowing is positive 1`] = ` -<EuiModal - onClose={[Function]} -> - <EuiModalHeader> - <EuiModalHeaderTitle> - Your visualization has error(s) - </EuiModalHeaderTitle> - </EuiModalHeader> - <EuiModalBody> - <EuiCallOut - color="danger" - iconType="alert" - size="s" - title="Test & Test" - /> - <EuiSpacer - size="s" - /> - <EuiAccordion - arrowDisplay="left" - buttonContent="Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt u ..." - data-test-subj="modal-all-errors-accordion" - id="accordion1" - initialIsOpen={true} - isLoading={false} - isLoadingMessage={false} - key="id-super-id-0" - paddingSize="none" - > - <MyEuiCodeBlock> - Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - </MyEuiCodeBlock> - </EuiAccordion> - </EuiModalBody> - <EuiModalFooter> - <EuiButton - data-test-subj="modal-all-errors-close" - fill={true} - onClick={[Function]} - > - Close - </EuiButton> - </EuiModalFooter> -</EuiModal> -`; diff --git a/x-pack/plugins/cases/public/components/toasters/errors.ts b/x-pack/plugins/cases/public/components/toasters/errors.ts deleted file mode 100644 index 0a672aeee8b7c..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/errors.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export class ToasterError extends Error { - public readonly messages: string[]; - - constructor(messages: string[]) { - super(messages[0]); - this.name = 'ToasterError'; - this.messages = messages; - } -} - -export const isToasterError = (error: unknown): error is ToasterError => - error instanceof ToasterError; diff --git a/x-pack/plugins/cases/public/components/toasters/index.test.tsx b/x-pack/plugins/cases/public/components/toasters/index.test.tsx deleted file mode 100644 index 1d78570e18a59..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/index.test.tsx +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { set } from '@elastic/safer-lodash-set/fp'; -import { cloneDeep } from 'lodash/fp'; -import { mount } from 'enzyme'; -import React, { useEffect } from 'react'; - -import { - AppToast, - useStateToaster, - ManageGlobalToaster, - GlobalToaster, - displayErrorToast, -} from '.'; - -jest.mock('uuid', () => { - return { - v1: jest.fn(() => '27261ae0-0bbb-11ea-b0ea-db767b07ea47'), - v4: jest.fn(() => '9e1f72a9-7c73-4b7f-a562-09940f7daf4a'), - }; -}); - -const mockToast: AppToast = { - color: 'danger', - id: 'id-super-id', - iconType: 'alert', - title: 'Test & Test', - toastLifeTimeMs: 100, - text: - 'Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', -}; - -describe('Toaster', () => { - describe('Manage Global Toaster Reducer', () => { - test('we can add a toast in the reducer', () => { - const AddToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - return ( - <> - <button - data-test-subj="add-toast" - type="button" - onClick={() => dispatch({ type: 'addToaster', toast: mockToast })} - /> - {toasts.map((toast) => ( - <span - data-test-subj={`add-toaster-${toast.id}`} - key={`add-toaster-${toast.id}`} - >{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <AddToaster /> - </ManageGlobalToaster> - ); - wrapper.find('[data-test-subj="add-toast"]').simulate('click'); - expect(wrapper.find('[data-test-subj="add-toaster-id-super-id"]').exists()).toBe(true); - }); - test('we can delete a toast in the reducer', () => { - const DeleteToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - useEffect(() => { - if (toasts.length === 0) { - dispatch({ type: 'addToaster', toast: mockToast }); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - return ( - <> - <button - data-test-subj="delete-toast" - type="button" - onClick={() => dispatch({ type: 'deleteToaster', id: mockToast.id })} - /> - {toasts.map((toast) => ( - <span - data-test-subj={`delete-toaster-${toast.id}`} - key={`delete-toaster-${toast.id}`} - >{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <DeleteToaster /> - </ManageGlobalToaster> - ); - - expect(wrapper.find('[data-test-subj="delete-toaster-id-super-id"]').exists()).toBe(true); - wrapper.find('[data-test-subj="delete-toast"]').simulate('click'); - expect(wrapper.find('[data-test-subj="delete-toaster-id-super-id"]').exists()).toBe(false); - }); - }); - - describe('Global Toaster', () => { - test('Render a basic toaster', () => { - const AddToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - return ( - <> - <button - data-test-subj="add-toast" - type="button" - onClick={() => dispatch({ type: 'addToaster', toast: mockToast })} - /> - {toasts.map((toast) => ( - <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <AddToaster /> - <GlobalToaster /> - </ManageGlobalToaster> - ); - wrapper.find('[data-test-subj="add-toast"]').simulate('click'); - - expect(wrapper.find('.euiGlobalToastList').exists()).toBe(true); - expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test'); - }); - - test('Render an error toaster', () => { - let mockErrorToast: AppToast = cloneDeep(mockToast); - mockErrorToast.title = 'Test & Test ERROR'; - mockErrorToast = set('errors', [mockErrorToast.text], mockErrorToast); - - const AddToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - return ( - <> - <button - data-test-subj="add-toast" - type="button" - onClick={() => dispatch({ type: 'addToaster', toast: mockErrorToast })} - /> - {toasts.map((toast) => ( - <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <AddToaster /> - <GlobalToaster /> - </ManageGlobalToaster> - ); - wrapper.find('[data-test-subj="add-toast"]').simulate('click'); - - expect(wrapper.find('.euiGlobalToastList').exists()).toBe(true); - expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test ERROR'); - expect(wrapper.find('button[data-test-subj="toaster-show-all-error-modal"]').exists()).toBe( - true - ); - }); - - test('Only show one toast at the time', () => { - const mockOneMoreToast: AppToast = cloneDeep(mockToast); - mockOneMoreToast.id = 'id-super-id-II'; - mockOneMoreToast.title = 'Test & Test II'; - - const AddToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - return ( - <> - <button - data-test-subj="add-toast" - type="button" - onClick={() => { - dispatch({ type: 'addToaster', toast: mockToast }); - dispatch({ type: 'addToaster', toast: mockOneMoreToast }); - }} - /> - <button - data-test-subj="delete-toast" - type="button" - onClick={() => { - dispatch({ type: 'deleteToaster', id: mockToast.id }); - }} - /> - {toasts.map((toast) => ( - <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <AddToaster /> - <GlobalToaster /> - </ManageGlobalToaster> - ); - wrapper.find('[data-test-subj="add-toast"]').simulate('click'); - - expect(wrapper.find('button[data-test-subj="toastCloseButton"]').length).toBe(1); - expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test'); - wrapper.find('button[data-test-subj="delete-toast"]').simulate('click'); - expect(wrapper.find('.euiToast').length).toBe(1); - expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test II'); - }); - - test('Do not show anymore toaster when modal error is open', () => { - let mockErrorToast: AppToast = cloneDeep(mockToast); - mockErrorToast.id = 'id-super-id-error'; - mockErrorToast = set('errors', [mockErrorToast.text], mockErrorToast); - - const AddToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - return ( - <> - <button - data-test-subj="add-toast" - type="button" - onClick={() => { - dispatch({ type: 'addToaster', toast: mockErrorToast }); - dispatch({ type: 'addToaster', toast: mockToast }); - }} - /> - {toasts.map((toast) => ( - <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <AddToaster /> - <GlobalToaster /> - </ManageGlobalToaster> - ); - wrapper.find('[data-test-subj="add-toast"]').simulate('click'); - wrapper.find('button[data-test-subj="toaster-show-all-error-modal"]').simulate('click'); - - expect(wrapper.find('.euiToast').length).toBe(0); - }); - - test('Show new toaster when modal error is closing', () => { - let mockErrorToast: AppToast = cloneDeep(mockToast); - mockErrorToast.title = 'Test & Test II'; - mockErrorToast.id = 'id-super-id-error'; - mockErrorToast = set('errors', [mockErrorToast.text], mockErrorToast); - - const AddToaster = () => { - const [{ toasts }, dispatch] = useStateToaster(); - return ( - <> - <button - data-test-subj="add-toast" - type="button" - onClick={() => { - dispatch({ type: 'addToaster', toast: mockErrorToast }); - dispatch({ type: 'addToaster', toast: mockToast }); - }} - /> - {toasts.map((toast) => ( - <span key={`add-toaster-${toast.id}`}>{`${toast.title} ${toast.text}`}</span> - ))} - </> - ); - }; - const wrapper = mount( - <ManageGlobalToaster> - <AddToaster /> - <GlobalToaster /> - </ManageGlobalToaster> - ); - wrapper.find('[data-test-subj="add-toast"]').simulate('click'); - expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test II'); - - wrapper.find('button[data-test-subj="toaster-show-all-error-modal"]').simulate('click'); - expect(wrapper.find('.euiToast').length).toBe(0); - - wrapper.find('button[data-test-subj="modal-all-errors-close"]').simulate('click'); - expect(wrapper.find('.euiToast').length).toBe(1); - expect(wrapper.find('.euiToastHeader__title').text()).toBe('Test & Test'); - }); - }); - - describe('displayErrorToast', () => { - test('dispatches toast with correct title and message', () => { - const mockErrorToast = { - toast: { - color: 'danger', - errors: ['message'], - iconType: 'alert', - id: '9e1f72a9-7c73-4b7f-a562-09940f7daf4a', - title: 'Title', - }, - type: 'addToaster', - }; - const dispatchToasterMock = jest.fn(); - displayErrorToast('Title', ['message'], dispatchToasterMock); - expect(dispatchToasterMock.mock.calls[0][0]).toEqual(mockErrorToast); - }); - }); -}); diff --git a/x-pack/plugins/cases/public/components/toasters/index.tsx b/x-pack/plugins/cases/public/components/toasters/index.tsx deleted file mode 100644 index ea17b03082751..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/index.tsx +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiGlobalToastList, EuiGlobalToastListToast as Toast } from '@elastic/eui'; -import { noop } from 'lodash/fp'; -import React, { createContext, Dispatch, useContext, useReducer, useState } from 'react'; -import styled from 'styled-components'; - -import { ModalAllErrors } from './modal_all_errors'; -import * as i18n from './translations'; - -export * from './utils'; -export * from './errors'; - -export interface AppToast extends Toast { - errors?: string[]; -} - -interface ToastState { - toasts: AppToast[]; -} - -const initialToasterState: ToastState = { - toasts: [], -}; - -export type ActionToaster = - | { type: 'addToaster'; toast: AppToast } - | { type: 'deleteToaster'; id: string } - | { type: 'toggleWaitToShowNextToast' }; - -export const StateToasterContext = createContext<[ToastState, Dispatch<ActionToaster>]>([ - initialToasterState, - () => noop, -]); - -export const useStateToaster = () => useContext(StateToasterContext); - -interface ManageGlobalToasterProps { - children: React.ReactNode; -} - -export const ManageGlobalToaster = ({ children }: ManageGlobalToasterProps) => { - const reducerToaster = (state: ToastState, action: ActionToaster) => { - switch (action.type) { - case 'addToaster': - return { ...state, toasts: [...state.toasts, action.toast] }; - case 'deleteToaster': - return { ...state, toasts: state.toasts.filter((msg) => msg.id !== action.id) }; - default: - return state; - } - }; - - return ( - <StateToasterContext.Provider value={useReducer(reducerToaster, initialToasterState)}> - {children} - </StateToasterContext.Provider> - ); -}; - -const GlobalToasterListContainer = styled.div` - position: absolute; - right: 0; - bottom: 0; -`; - -interface GlobalToasterProps { - toastLifeTimeMs?: number; -} - -export const GlobalToaster = ({ toastLifeTimeMs = 5000 }: GlobalToasterProps) => { - const [{ toasts }, dispatch] = useStateToaster(); - const [isShowing, setIsShowing] = useState(false); - const [toastInModal, setToastInModal] = useState<AppToast | null>(null); - - const toggle = (toast: AppToast) => { - if (isShowing) { - dispatch({ type: 'deleteToaster', id: toast.id }); - setToastInModal(null); - } else { - setToastInModal(toast); - } - setIsShowing(!isShowing); - }; - - return ( - <> - {toasts.length > 0 && !isShowing && ( - <GlobalToasterListContainer> - <EuiGlobalToastList - toasts={[formatToErrorToastIfNeeded(toasts[0], toggle)]} - dismissToast={({ id }) => { - dispatch({ type: 'deleteToaster', id }); - }} - toastLifeTimeMs={toastLifeTimeMs} - /> - </GlobalToasterListContainer> - )} - {toastInModal != null && ( - <ModalAllErrors isShowing={isShowing} toast={toastInModal} toggle={toggle} /> - )} - </> - ); -}; - -const formatToErrorToastIfNeeded = ( - toast: AppToast, - toggle: (toast: AppToast) => void -): AppToast => { - if (toast != null && toast.errors != null && toast.errors.length > 0) { - toast.text = ( - <ErrorToastContainer> - <EuiButton - data-test-subj="toaster-show-all-error-modal" - size="s" - color="danger" - onClick={() => toast != null && toggle(toast)} - > - {i18n.SEE_ALL_ERRORS} - </EuiButton> - </ErrorToastContainer> - ); - } - return toast; -}; - -const ErrorToastContainer = styled.div` - text-align: right; -`; - -ErrorToastContainer.displayName = 'ErrorToastContainer'; diff --git a/x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx b/x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx deleted file mode 100644 index 7ec0553591103..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/modal_all_errors.test.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { shallow } from 'enzyme'; - -import React from 'react'; - -import { ModalAllErrors } from './modal_all_errors'; -import { AppToast } from '.'; -import { cloneDeep } from 'lodash/fp'; - -const mockToast: AppToast = { - color: 'danger', - id: 'id-super-id', - iconType: 'alert', - title: 'Test & Test', - errors: [ - 'Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', - ], -}; - -describe('Modal all errors', () => { - const toggle = jest.fn(); - describe('rendering', () => { - test('it renders the default all errors modal when isShowing is positive', () => { - const wrapper = shallow( - <ModalAllErrors isShowing={true} toast={mockToast} toggle={toggle} /> - ); - expect(wrapper).toMatchSnapshot(); - }); - - test('it renders null when isShowing is negative', () => { - const wrapper = shallow( - <ModalAllErrors isShowing={false} toast={mockToast} toggle={toggle} /> - ); - expect(wrapper.html()).toEqual(null); - }); - - test('it renders multiple errors in modal', () => { - const mockToastWithTwoError = cloneDeep(mockToast); - mockToastWithTwoError.errors = [ - 'Error 1, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', - 'Error 2, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', - 'Error 3, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', - ]; - const wrapper = shallow( - <ModalAllErrors isShowing={true} toast={mockToastWithTwoError} toggle={toggle} /> - ); - expect(wrapper.find('[data-test-subj="modal-all-errors-accordion"]').length).toBe( - mockToastWithTwoError.errors.length - ); - }); - }); - - describe('events', () => { - test('Make sure that toggle function has been called when you click on the close button', () => { - const wrapper = shallow( - <ModalAllErrors isShowing={true} toast={mockToast} toggle={toggle} /> - ); - - wrapper.find('[data-test-subj="modal-all-errors-close"]').simulate('click'); - wrapper.update(); - expect(toggle).toHaveBeenCalledWith(mockToast); - }); - }); -}); diff --git a/x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx b/x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx deleted file mode 100644 index 0a78139f5fe3a..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/modal_all_errors.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiButton, - EuiModal, - EuiModalHeader, - EuiModalHeaderTitle, - EuiModalBody, - EuiCallOut, - EuiSpacer, - EuiCodeBlock, - EuiModalFooter, - EuiAccordion, -} from '@elastic/eui'; -import React, { useCallback } from 'react'; -import styled from 'styled-components'; - -import { AppToast } from '.'; -import * as i18n from './translations'; - -interface FullErrorProps { - isShowing: boolean; - toast: AppToast; - toggle: (toast: AppToast) => void; -} - -const ModalAllErrorsComponent: React.FC<FullErrorProps> = ({ isShowing, toast, toggle }) => { - const handleClose = useCallback(() => toggle(toast), [toggle, toast]); - - if (!isShowing || toast == null) return null; - - return ( - <EuiModal onClose={handleClose}> - <EuiModalHeader> - <EuiModalHeaderTitle>{i18n.TITLE_ERROR_MODAL}</EuiModalHeaderTitle> - </EuiModalHeader> - - <EuiModalBody> - <EuiCallOut title={toast.title} color="danger" size="s" iconType="alert" /> - <EuiSpacer size="s" /> - {toast.errors != null && - toast.errors.map((error, index) => ( - <EuiAccordion - key={`${toast.id}-${index}`} - id="accordion1" - initialIsOpen={index === 0 ? true : false} - buttonContent={error.length > 100 ? `${error.substring(0, 100)} ...` : error} - data-test-subj="modal-all-errors-accordion" - > - <MyEuiCodeBlock>{error}</MyEuiCodeBlock> - </EuiAccordion> - ))} - </EuiModalBody> - - <EuiModalFooter> - <EuiButton onClick={handleClose} fill data-test-subj="modal-all-errors-close"> - {i18n.CLOSE_ERROR_MODAL} - </EuiButton> - </EuiModalFooter> - </EuiModal> - ); -}; - -export const ModalAllErrors = React.memo(ModalAllErrorsComponent); - -const MyEuiCodeBlock = styled(EuiCodeBlock)` - margin-top: 4px; -`; - -MyEuiCodeBlock.displayName = 'MyEuiCodeBlock'; diff --git a/x-pack/plugins/cases/public/components/toasters/translations.ts b/x-pack/plugins/cases/public/components/toasters/translations.ts deleted file mode 100644 index cf7fac462a122..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/translations.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const SEE_ALL_ERRORS = i18n.translate('xpack.cases.modalAllErrors.seeAllErrors.button', { - defaultMessage: 'See the full error(s)', -}); - -export const TITLE_ERROR_MODAL = i18n.translate('xpack.cases.modalAllErrors.title', { - defaultMessage: 'Your visualization has error(s)', -}); - -export const CLOSE_ERROR_MODAL = i18n.translate('xpack.cases.modalAllErrors.close.button', { - defaultMessage: 'Close', -}); diff --git a/x-pack/plugins/cases/public/components/toasters/utils.test.ts b/x-pack/plugins/cases/public/components/toasters/utils.test.ts deleted file mode 100644 index 34871b2e68efa..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/utils.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { errorToToaster } from './utils'; -import { ToasterError } from './errors'; - -const ApiError = class extends Error { - public body: {} = {}; -}; - -describe('error_to_toaster', () => { - let dispatchToaster = jest.fn(); - - beforeEach(() => { - dispatchToaster = jest.fn(); - }); - - describe('#errorToToaster', () => { - test('dispatches an error toast given a ToasterError with multiple error messages', () => { - const error = new ToasterError(['some error 1', 'some error 2']); - errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); - expect(dispatchToaster.mock.calls[0]).toEqual([ - { - toast: { - color: 'danger', - errors: ['some error 1', 'some error 2'], - iconType: 'alert', - id: 'some-made-up-id', - title: 'some title', - }, - type: 'addToaster', - }, - ]); - }); - - test('dispatches an error toast given a ToasterError with a single error message', () => { - const error = new ToasterError(['some error 1']); - errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); - expect(dispatchToaster.mock.calls[0]).toEqual([ - { - toast: { - color: 'danger', - errors: ['some error 1'], - iconType: 'alert', - id: 'some-made-up-id', - title: 'some title', - }, - type: 'addToaster', - }, - ]); - }); - - test('dispatches an error toast given an ApiError with a message', () => { - const error = new ApiError('Internal Server Error'); - error.body = { message: 'something bad happened', status_code: 500 }; - - errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); - expect(dispatchToaster.mock.calls[0]).toEqual([ - { - toast: { - color: 'danger', - errors: ['something bad happened'], - iconType: 'alert', - id: 'some-made-up-id', - title: 'some title', - }, - type: 'addToaster', - }, - ]); - }); - - test('dispatches an error toast given an ApiError with no message', () => { - const error = new ApiError('Internal Server Error'); - - errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); - expect(dispatchToaster.mock.calls[0]).toEqual([ - { - toast: { - color: 'danger', - errors: ['Internal Server Error'], - iconType: 'alert', - id: 'some-made-up-id', - title: 'some title', - }, - type: 'addToaster', - }, - ]); - }); - - test('dispatches an error toast given a standard Error', () => { - const error = new Error('some error 1'); - errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); - expect(dispatchToaster.mock.calls[0]).toEqual([ - { - toast: { - color: 'danger', - errors: ['some error 1'], - iconType: 'alert', - id: 'some-made-up-id', - title: 'some title', - }, - type: 'addToaster', - }, - ]); - }); - - test('adds a generic Network Error given a non Error object such as a string', () => { - const error = 'terrible string'; - errorToToaster({ id: 'some-made-up-id', title: 'some title', error, dispatchToaster }); - expect(dispatchToaster.mock.calls[0]).toEqual([ - { - toast: { - color: 'danger', - errors: ['Network Error'], - iconType: 'alert', - id: 'some-made-up-id', - title: 'some title', - }, - type: 'addToaster', - }, - ]); - }); - }); -}); diff --git a/x-pack/plugins/cases/public/components/toasters/utils.ts b/x-pack/plugins/cases/public/components/toasters/utils.ts deleted file mode 100644 index 0575c40107668..0000000000000 --- a/x-pack/plugins/cases/public/components/toasters/utils.ts +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type React from 'react'; -import uuid from 'uuid'; -import { isError } from 'lodash/fp'; - -import { AppToast, ActionToaster } from './'; -import { isToasterError } from './errors'; -import { isAppError } from '../../common/errors'; - -/** - * Displays an error toast for the provided title and message - * - * @param errorTitle Title of error to display in toaster and modal - * @param errorMessages Message to display in error modal when clicked - * @param dispatchToaster provided by useStateToaster() - */ -export const displayErrorToast = ( - errorTitle: string, - errorMessages: string[], - dispatchToaster: React.Dispatch<ActionToaster>, - id: string = uuid.v4() -): void => { - const toast: AppToast = { - id, - title: errorTitle, - color: 'danger', - iconType: 'alert', - errors: errorMessages, - }; - dispatchToaster({ - type: 'addToaster', - toast, - }); -}; - -/** - * Displays a warning toast for the provided title and message - * - * @param title warning message to display in toaster and modal - * @param dispatchToaster provided by useStateToaster() - * @param id unique ID if necessary - */ -export const displayWarningToast = ( - title: string, - dispatchToaster: React.Dispatch<ActionToaster>, - id: string = uuid.v4() -): void => { - const toast: AppToast = { - id, - title, - color: 'warning', - iconType: 'help', - }; - dispatchToaster({ - type: 'addToaster', - toast, - }); -}; - -/** - * Displays a success toast for the provided title and message - * - * @param title success message to display in toaster and modal - * @param dispatchToaster provided by useStateToaster() - */ -export const displaySuccessToast = ( - title: string, - dispatchToaster: React.Dispatch<ActionToaster>, - id: string = uuid.v4() -): void => { - const toast: AppToast = { - id, - title, - color: 'success', - iconType: 'check', - }; - dispatchToaster({ - type: 'addToaster', - toast, - }); -}; - -export type ErrorToToasterArgs = Partial<AppToast> & { - error: unknown; - dispatchToaster: React.Dispatch<ActionToaster>; -}; - -/** - * Displays an error toast with messages parsed from the error - * - * @param title error message to display in toaster and modal - * @param error the error from which messages will be parsed - * @param dispatchToaster provided by useStateToaster() - */ -export const errorToToaster = ({ - id = uuid.v4(), - title, - error, - color = 'danger', - iconType = 'alert', - dispatchToaster, -}: ErrorToToasterArgs) => { - let toast: AppToast; - - if (isToasterError(error)) { - toast = { - id, - title, - color, - iconType, - errors: error.messages, - }; - } else if (isAppError(error)) { - toast = { - id, - title, - color, - iconType, - errors: [error.body.message], - }; - } else if (isError(error)) { - toast = { - id, - title, - color, - iconType, - errors: [error.message], - }; - } else { - toast = { - id, - title, - color, - iconType, - errors: ['Network Error'], - }; - } - - dispatchToaster({ - type: 'addToaster', - toast, - }); -}; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx index fc397b24e7046..245db15d079f9 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx @@ -17,11 +17,11 @@ import * as i18n from '../../common/translations'; import { CaseType } from '../../../common'; export interface CreateCaseModalProps { + caseType?: CaseType; + hideConnectorServiceNowSir?: boolean; isModalOpen: boolean; onCloseCaseModal: () => void; onSuccess: (theCase: Case) => Promise<void>; - caseType?: CaseType; - hideConnectorServiceNowSir?: boolean; } const Container = styled.div` @@ -32,11 +32,11 @@ const Container = styled.div` `; const CreateModalComponent: React.FC<CreateCaseModalProps> = ({ + caseType = CaseType.individual, + hideConnectorServiceNowSir, isModalOpen, onCloseCaseModal, onSuccess, - caseType = CaseType.individual, - hideConnectorServiceNowSir = false, }) => { return isModalOpen ? ( <EuiModal onClose={onCloseCaseModal} data-test-subj="all-cases-modal"> @@ -45,13 +45,13 @@ const CreateModalComponent: React.FC<CreateCaseModalProps> = ({ </EuiModalHeader> <EuiModalBody> <FormContext - hideConnectorServiceNowSir={hideConnectorServiceNowSir} caseType={caseType} + hideConnectorServiceNowSir={hideConnectorServiceNowSir} onSuccess={onSuccess} > <CreateCaseForm - withSteps={false} hideConnectorServiceNowSir={hideConnectorServiceNowSir} + withSteps={false} /> <Container> <SubmitCaseButton /> diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts index 5827083bfdbd2..75263d4d38978 100644 --- a/x-pack/plugins/cases/public/containers/api.ts +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -18,6 +18,7 @@ import { CaseUserActionsResponse, CommentRequest, CommentType, + StatusAll, SubCasePatchRequest, SubCaseResponse, SubCasesResponse, @@ -44,7 +45,6 @@ import { } from '../../common'; import { KibanaServices } from '../common/lib/kibana'; -import { StatusAll } from '../components/status'; import { ActionLicense, diff --git a/x-pack/plugins/cases/public/containers/configure/api.ts b/x-pack/plugins/cases/public/containers/configure/api.ts index 006370fcb5533..ca8b7e3a05734 100644 --- a/x-pack/plugins/cases/public/containers/configure/api.ts +++ b/x-pack/plugins/cases/public/containers/configure/api.ts @@ -7,20 +7,17 @@ import { isEmpty } from 'lodash/fp'; import { + ACTION_TYPES_URL, ActionConnector, ActionTypeConnector, + CASE_CONFIGURE_CONNECTORS_URL, + CASE_CONFIGURE_URL, CasesConfigurePatch, - CasesConfigureResponse, CasesConfigureRequest, + CasesConfigureResponse, } from '../../../common'; import { KibanaServices } from '../../common/lib/kibana'; -import { - CASE_CONFIGURE_CONNECTORS_URL, - CASE_CONFIGURE_URL, - ACTION_TYPES_URL, -} from '../../../common'; - import { ApiProps } from '../types'; import { convertToCamelCase, decodeCaseConfigureResponse } from '../utils'; import { CaseConfigure } from './types'; diff --git a/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx index 25017f7931db8..fad84617ee140 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_action_types.test.tsx @@ -11,6 +11,7 @@ import { actionTypesMock } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../../common/lib/kibana'); describe('useActionTypes', () => { beforeEach(() => { diff --git a/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx b/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx index 206952661e672..eaaadd65d29d1 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_action_types.tsx @@ -7,10 +7,10 @@ import { useState, useEffect, useCallback, useRef } from 'react'; -import { useStateToaster, errorToToaster } from '../../components/toasters'; import * as i18n from '../translations'; import { fetchActionTypes } from './api'; import { ActionTypeConnector } from './types'; +import { useToasts } from '../../common/lib/kibana'; export interface UseActionTypesResponse { loading: boolean; @@ -19,7 +19,7 @@ export interface UseActionTypesResponse { } export const useActionTypes = (): UseActionTypesResponse => { - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const [loading, setLoading] = useState(true); const [actionTypes, setActionTypes] = useState<ActionTypeConnector[]>([]); const isCancelledRef = useRef(false); @@ -43,14 +43,12 @@ export const useActionTypes = (): UseActionTypesResponse => { if (!isCancelledRef.current) { setLoading(false); setActionTypes([]); - errorToToaster({ + toasts.addError(error.body && error.body.message ? new Error(error.body.message) : error, { title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, }); } } - }, [dispatchToaster]); + }, [toasts]); useEffect(() => { if (queryFirstTime.current) { diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx index 4e4db4cb5e82e..968afcc6ecfb3 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.test.tsx @@ -16,13 +16,19 @@ import { mappings, caseConfigurationCamelCaseResponseMock } from './mock'; import * as api from './api'; import { ConnectorTypes } from '../../../common'; +const mockErrorToast = jest.fn(); +const mockSuccessToast = jest.fn(); jest.mock('./api'); -const mockErrorToToaster = jest.fn(); -jest.mock('../../components/toasters', () => { - const original = jest.requireActual('../../components/toasters'); +jest.mock('../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../common/lib/kibana'); return { - ...original, - errorToToaster: () => mockErrorToToaster(), + ...originalModule, + useToasts: () => { + return { + addError: mockErrorToast, + addSuccess: mockSuccessToast, + }; + }, }; }); const configuration: ConnectorConfiguration = { @@ -164,7 +170,7 @@ describe('useConfigure', () => { ); await waitForNextUpdate(); await waitForNextUpdate(); - expect(mockErrorToToaster).not.toHaveBeenCalled(); + expect(mockErrorToast).not.toHaveBeenCalled(); result.current.persistCaseConfigure(configuration); @@ -190,7 +196,7 @@ describe('useConfigure', () => { ); await waitForNextUpdate(); await waitForNextUpdate(); - expect(mockErrorToToaster).toHaveBeenCalled(); + expect(mockErrorToast).toHaveBeenCalled(); }); }); @@ -219,12 +225,12 @@ describe('useConfigure', () => { ); await waitForNextUpdate(); await waitForNextUpdate(); - expect(mockErrorToToaster).not.toHaveBeenCalled(); + expect(mockErrorToast).not.toHaveBeenCalled(); result.current.persistCaseConfigure(configuration); - expect(mockErrorToToaster).not.toHaveBeenCalled(); + expect(mockErrorToast).not.toHaveBeenCalled(); await waitForNextUpdate(); - expect(mockErrorToToaster).toHaveBeenCalled(); + expect(mockErrorToast).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx index 3d5e43b2772a9..c4b3db5956cd7 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_configure.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_configure.tsx @@ -8,10 +8,10 @@ import { useEffect, useCallback, useReducer, useRef } from 'react'; import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; -import { useStateToaster, errorToToaster, displaySuccessToast } from '../../components/toasters'; import * as i18n from './translations'; import { ClosureType, CaseConfigure, CaseConnector, CaseConnectorMapping } from './types'; import { ConnectorTypes } from '../../../common'; +import { useToasts } from '../../common/lib/kibana'; export type ConnectorConfiguration = { connector: CaseConnector } & { closureType: CaseConfigure['closureType']; @@ -145,7 +145,7 @@ export const initialState: State = { export const useCaseConfigure = (): ReturnUseCaseConfigure => { const [state, dispatch] = useReducer(configureCasesReducer, initialState); - + const toasts = useToasts(); const setCurrentConfiguration = useCallback((configuration: ConnectorConfiguration) => { dispatch({ currentConfiguration: configuration, @@ -202,7 +202,6 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { }); }, []); - const [, dispatchToaster] = useStateToaster(); const isCancelledRefetchRef = useRef(false); const abortCtrlRefetchRef = useRef(new AbortController()); @@ -239,9 +238,7 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { } } if (res.error != null) { - errorToToaster({ - dispatchToaster, - error: new Error(res.error), + toasts.addError(new Error(res.error), { title: i18n.ERROR_TITLE, }); } @@ -251,11 +248,10 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { } catch (error) { if (!isCancelledRefetchRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - dispatchToaster, - error: error.body && error.body.message ? new Error(error.body.message) : error, - title: i18n.ERROR_TITLE, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } setLoading(false); } @@ -286,7 +282,6 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { }, abortCtrlPersistRef.current.signal ); - if (!isCancelledPersistRef.current) { setConnector(res.connector); if (setClosureType) { @@ -303,23 +298,22 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { }); } if (res.error != null) { - errorToToaster({ - dispatchToaster, - error: new Error(res.error), + toasts.addError(new Error(res.error), { title: i18n.ERROR_TITLE, }); } - displaySuccessToast(i18n.SUCCESS_CONFIGURE, dispatchToaster); + toasts.addSuccess(i18n.SUCCESS_CONFIGURE); setPersistLoading(false); } } catch (error) { if (!isCancelledPersistRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { + title: i18n.ERROR_TITLE, + } + ); } setConnector(state.currentConfiguration.connector); setPersistLoading(false); @@ -327,14 +321,15 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { } }, [ - dispatchToaster, setClosureType, setConnector, setCurrentConfiguration, setMappings, setPersistLoading, setVersion, - state, + state.currentConfiguration.connector, + state.version, + toasts, ] ); diff --git a/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx b/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx index ed1dfcbc40c87..e3d2650fee025 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_connectors.test.tsx @@ -11,6 +11,7 @@ import { connectorsMock } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../../common/lib/kibana'); describe('useConnectors', () => { beforeEach(() => { diff --git a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx index b385a2676e044..7fbdd795a8436 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx @@ -7,10 +7,10 @@ import { useState, useEffect, useCallback, useRef } from 'react'; -import { useStateToaster, errorToToaster } from '../../components/toasters'; import * as i18n from '../translations'; import { fetchConnectors } from './api'; import { ActionConnector } from './types'; +import { useToasts } from '../../common/lib/kibana'; export interface UseConnectorsResponse { loading: boolean; @@ -19,7 +19,7 @@ export interface UseConnectorsResponse { } export const useConnectors = (): UseConnectorsResponse => { - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const [loading, setLoading] = useState(true); const [connectors, setConnectors] = useState<ActionConnector[]>([]); const isCancelledRef = useRef(false); @@ -41,11 +41,10 @@ export const useConnectors = (): UseConnectorsResponse => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } setLoading(false); diff --git a/x-pack/plugins/cases/public/containers/types.ts b/x-pack/plugins/cases/public/containers/types.ts index db6c6e678d188..62a5f9299498e 100644 --- a/x-pack/plugins/cases/public/containers/types.ts +++ b/x-pack/plugins/cases/public/containers/types.ts @@ -5,171 +5,4 @@ * 2.0. */ -import { - User, - UserActionField, - UserAction, - CaseConnector, - CommentRequest, - CaseStatuses, - CaseAttributes, - CasePatchRequest, - CaseType, - AssociationType, -} from '../../common'; -import { CaseStatusWithAllStatus } from '../components/status'; - -export { CaseConnector, ActionConnector, CaseStatuses } from '../../common'; - -export type Comment = CommentRequest & { - associationType: AssociationType; - id: string; - createdAt: string; - createdBy: ElasticUser; - pushedAt: string | null; - pushedBy: string | null; - updatedAt: string | null; - updatedBy: ElasticUser | null; - version: string; -}; -export interface CaseUserActions { - actionId: string; - actionField: UserActionField; - action: UserAction; - actionAt: string; - actionBy: ElasticUser; - caseId: string; - commentId: string | null; - newValue: string | null; - oldValue: string | null; -} - -export interface CaseExternalService { - pushedAt: string; - pushedBy: ElasticUser; - connectorId: string; - connectorName: string; - externalId: string; - externalTitle: string; - externalUrl: string; -} - -interface BasicCase { - id: string; - closedAt: string | null; - closedBy: ElasticUser | null; - comments: Comment[]; - createdAt: string; - createdBy: ElasticUser; - status: CaseStatuses; - title: string; - totalAlerts: number; - totalComment: number; - updatedAt: string | null; - updatedBy: ElasticUser | null; - version: string; -} - -export interface SubCase extends BasicCase { - associationType: AssociationType; - caseParentId: string; -} - -export interface Case extends BasicCase { - connector: CaseConnector; - description: string; - externalService: CaseExternalService | null; - subCases?: SubCase[] | null; - subCaseIds: string[]; - settings: CaseAttributes['settings']; - tags: string[]; - type: CaseType; -} - -export interface QueryParams { - page: number; - perPage: number; - sortField: SortFieldCase; - sortOrder: 'asc' | 'desc'; -} - -export interface FilterOptions { - search: string; - status: CaseStatusWithAllStatus; - tags: string[]; - reporters: User[]; - onlyCollectionType?: boolean; -} - -export interface CasesStatus { - countClosedCases: number | null; - countOpenCases: number | null; - countInProgressCases: number | null; -} - -export interface AllCases extends CasesStatus { - cases: Case[]; - page: number; - perPage: number; - total: number; -} - -export enum SortFieldCase { - createdAt = 'createdAt', - closedAt = 'closedAt', - updatedAt = 'updatedAt', -} - -export interface ElasticUser { - readonly email?: string | null; - readonly fullName?: string | null; - readonly username?: string | null; -} - -export interface FetchCasesProps extends ApiProps { - queryParams?: QueryParams; - filterOptions?: FilterOptions; -} - -export interface ApiProps { - signal: AbortSignal; -} - -export interface BulkUpdateStatus { - status: string; - id: string; - version: string; -} -export interface ActionLicense { - id: string; - name: string; - enabled: boolean; - enabledInConfig: boolean; - enabledInLicense: boolean; -} - -export interface DeleteCase { - id: string; - type: CaseType | null; - title?: string; -} - -export interface FieldMappings { - id: string; - title?: string; -} - -export type UpdateKey = keyof Pick< - CasePatchRequest, - 'connector' | 'description' | 'status' | 'tags' | 'title' | 'settings' ->; - -export interface UpdateByKey { - updateKey: UpdateKey; - updateValue: CasePatchRequest[UpdateKey]; - fetchCaseUserActions?: (caseId: string, caseConnectorId: string, subCaseId?: string) => void; - updateCase?: (newCase: Case) => void; - caseData: Case; - onSuccess?: () => void; - onError?: () => void; -} +export * from '../../common/ui'; diff --git a/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx b/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx index 5a2b4df20e222..67f202e6adbad 100644 --- a/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_bulk_update_case.test.tsx @@ -12,6 +12,7 @@ import { basicCase } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useUpdateCases', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx b/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx index e446c718125dc..ae2d09deafb04 100644 --- a/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx +++ b/x-pack/plugins/cases/public/containers/use_bulk_update_case.tsx @@ -7,10 +7,10 @@ import { useCallback, useReducer, useRef, useEffect } from 'react'; import { CaseStatuses } from '../../common'; -import { displaySuccessToast, errorToToaster, useStateToaster } from '../components/toasters'; import * as i18n from './translations'; import { patchCasesStatus } from './api'; import { BulkUpdateStatus, Case } from './types'; +import { useToasts } from '../common/lib/kibana'; interface UpdateState { isUpdated: boolean; @@ -82,7 +82,7 @@ export const useUpdateCases = (): UseUpdateCases => { isError: false, isUpdated: false, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -108,16 +108,15 @@ export const useUpdateCases = (): UseUpdateCases => { const message = action === 'status' ? getStatusToasterMessage(patchResponse[0].status, messageArgs) : ''; - displaySuccessToast(message, dispatchToaster); + toasts.addSuccess(message); } } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); } diff --git a/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx index 5edfc13afbf61..e86ed0c036974 100644 --- a/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_delete_cases.test.tsx @@ -12,6 +12,7 @@ import { useDeleteCases, UseDeleteCase } from './use_delete_cases'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useDeleteCases', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_delete_cases.tsx b/x-pack/plugins/cases/public/containers/use_delete_cases.tsx index 3204c93a6cbd3..81a44004b2441 100644 --- a/x-pack/plugins/cases/public/containers/use_delete_cases.tsx +++ b/x-pack/plugins/cases/public/containers/use_delete_cases.tsx @@ -6,10 +6,10 @@ */ import { useCallback, useReducer, useRef, useEffect } from 'react'; -import { displaySuccessToast, errorToToaster, useStateToaster } from '../components/toasters'; import * as i18n from './translations'; import { deleteCases, deleteSubCases } from './api'; import { DeleteCase } from './types'; +import { useToasts } from '../common/lib/kibana'; interface DeleteState { isDisplayConfirmDeleteModal: boolean; @@ -73,7 +73,7 @@ export const useDeleteCases = (): UseDeleteCase => { isError: false, isDeleted: false, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -94,19 +94,17 @@ export const useDeleteCases = (): UseDeleteCase => { if (!isCancelledRef.current) { dispatch({ type: 'FETCH_SUCCESS', payload: true }); - displaySuccessToast( - i18n.DELETED_CASES(cases.length, cases.length === 1 ? cases[0].title : ''), - dispatchToaster + toasts.addSuccess( + i18n.DELETED_CASES(cases.length, cases.length === 1 ? cases[0].title : '') ); } } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_DELETING, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_DELETING } + ); } dispatch({ type: 'FETCH_FAILURE' }); } diff --git a/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx b/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx index 4c6cbae0c8981..ae6a884514161 100644 --- a/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_action_license.test.tsx @@ -11,6 +11,7 @@ import { actionLicenses } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetActionLicense', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_action_license.tsx b/x-pack/plugins/cases/public/containers/use_get_action_license.tsx index 68fd2e2529b64..4f28d88c14b25 100644 --- a/x-pack/plugins/cases/public/containers/use_get_action_license.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_action_license.tsx @@ -7,7 +7,7 @@ import { useCallback, useEffect, useState, useRef } from 'react'; -import { errorToToaster, useStateToaster } from '../components/toasters'; +import { useToasts } from '../common/lib/kibana'; import { getActionLicense } from './api'; import * as i18n from './translations'; import { ActionLicense } from './types'; @@ -28,7 +28,7 @@ const MINIMUM_LICENSE_REQUIRED_CONNECTOR = '.jira'; export const useGetActionLicense = (): ActionLicenseState => { const [actionLicenseState, setActionLicensesState] = useState<ActionLicenseState>(initialData); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -54,11 +54,10 @@ export const useGetActionLicense = (): ActionLicenseState => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } setActionLicensesState({ diff --git a/x-pack/plugins/cases/public/containers/use_get_case.test.tsx b/x-pack/plugins/cases/public/containers/use_get_case.test.tsx index a3d64a17727e5..75d9ac74a8ccf 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case.test.tsx @@ -11,6 +11,7 @@ import { basicCase } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetCase', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_case.tsx b/x-pack/plugins/cases/public/containers/use_get_case.tsx index 11f78892fd91f..7b59f8e06b7af 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case.tsx @@ -9,7 +9,7 @@ import { useEffect, useReducer, useCallback, useRef } from 'react'; import { Case } from './types'; import * as i18n from './translations'; -import { errorToToaster, useStateToaster } from '../components/toasters'; +import { useToasts } from '../common/lib/kibana'; import { getCase, getSubCase } from './api'; interface CaseState { @@ -66,7 +66,7 @@ export const useGetCase = (caseId: string, subCaseId?: string): UseGetCase => { isError: false, data: null, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -91,11 +91,10 @@ export const useGetCase = (caseId: string, subCaseId?: string): UseGetCase => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); } diff --git a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx index 1c8096198007e..62b4cf92434cd 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.test.tsx @@ -23,6 +23,7 @@ import { import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetCaseUserActions', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx index ff1835cee7071..66aa93154b318 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx @@ -9,12 +9,17 @@ import { isEmpty, uniqBy } from 'lodash/fp'; import { useCallback, useEffect, useState, useRef } from 'react'; import deepEqual from 'fast-deep-equal'; -import { errorToToaster, useStateToaster } from '../components/toasters'; -import { CaseFullExternalService } from '../../common/api/cases'; +import { + CaseFullExternalService, + CaseConnector, + CaseExternalService, + CaseUserActions, + ElasticUser, +} from '../../common'; import { getCaseUserActions, getSubCaseUserActions } from './api'; import * as i18n from './translations'; -import { CaseConnector, CaseExternalService, CaseUserActions, ElasticUser } from './types'; import { convertToCamelCase, parseString } from './utils'; +import { useToasts } from '../common/lib/kibana'; export interface CaseService extends CaseExternalService { firstPushIndex: number; @@ -246,7 +251,7 @@ export const useGetCaseUserActions = ( ); const abortCtrlRef = useRef(new AbortController()); const isCancelledRef = useRef(false); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const fetchCaseUserActions = useCallback( async (thisCaseId: string, thisCaseConnectorId: string, thisSubCaseId?: string) => { @@ -288,11 +293,10 @@ export const useGetCaseUserActions = ( } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } setCaseUserActionsState({ diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx index 8b5993255552a..b07fec4984eb1 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.test.tsx @@ -19,6 +19,7 @@ import { allCases, basicCase } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetCases', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.tsx index e06a47954cdd4..93daa0f70e232 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.tsx @@ -7,11 +7,18 @@ import { useCallback, useEffect, useReducer, useRef } from 'react'; import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; -import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case, UpdateByKey } from './types'; -import { errorToToaster, useStateToaster } from '../components/toasters'; +import { + AllCases, + Case, + FilterOptions, + QueryParams, + SortFieldCase, + StatusAll, + UpdateByKey, +} from './types'; +import { useToasts } from '../common/lib/kibana'; import * as i18n from './translations'; import { getCases, patchCase } from './api'; -import { StatusAll } from '../components/status'; export interface UseGetCasesState { data: AllCases; @@ -131,18 +138,18 @@ export interface UseGetCases extends UseGetCasesState { } export const useGetCases = ( - initialQueryParams?: QueryParams, - initialFilterOptions?: FilterOptions + initialQueryParams: Partial<QueryParams> = {}, + initialFilterOptions: Partial<FilterOptions> = {} ): UseGetCases => { const [state, dispatch] = useReducer(dataFetchReducer, { data: initialData, - filterOptions: initialFilterOptions ?? DEFAULT_FILTER_OPTIONS, + filterOptions: { ...DEFAULT_FILTER_OPTIONS, ...initialFilterOptions }, isError: false, loading: [], - queryParams: initialQueryParams ?? DEFAULT_QUERY_PARAMS, + queryParams: { ...DEFAULT_QUERY_PARAMS, ...initialQueryParams }, selectedCases: [], }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const didCancelFetchCases = useRef(false); const didCancelUpdateCases = useRef(false); const abortCtrlFetchCases = useRef(new AbortController()); @@ -160,39 +167,40 @@ export const useGetCases = ( dispatch({ type: 'UPDATE_FILTER_OPTIONS', payload: newFilters }); }, []); - const fetchCases = useCallback(async (filterOptions: FilterOptions, queryParams: QueryParams) => { - try { - didCancelFetchCases.current = false; - abortCtrlFetchCases.current.abort(); - abortCtrlFetchCases.current = new AbortController(); - dispatch({ type: 'FETCH_INIT', payload: 'cases' }); - - const response = await getCases({ - filterOptions, - queryParams, - signal: abortCtrlFetchCases.current.signal, - }); - - if (!didCancelFetchCases.current) { - dispatch({ - type: 'FETCH_CASES_SUCCESS', - payload: response, + const fetchCases = useCallback( + async (filterOptions: FilterOptions, queryParams: QueryParams) => { + try { + didCancelFetchCases.current = false; + abortCtrlFetchCases.current.abort(); + abortCtrlFetchCases.current = new AbortController(); + dispatch({ type: 'FETCH_INIT', payload: 'cases' }); + + const response = await getCases({ + filterOptions, + queryParams, + signal: abortCtrlFetchCases.current.signal, }); - } - } catch (error) { - if (!didCancelFetchCases.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, + + if (!didCancelFetchCases.current) { + dispatch({ + type: 'FETCH_CASES_SUCCESS', + payload: response, }); } - dispatch({ type: 'FETCH_FAILURE', payload: 'cases' }); + } catch (error) { + if (!didCancelFetchCases.current) { + if (error.name !== 'AbortError') { + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); + } + dispatch({ type: 'FETCH_FAILURE', payload: 'cases' }); + } } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + }, + [toasts] + ); const dispatchUpdateCaseProperty = useCallback( async ({ updateKey, updateValue, caseId, refetchCasesStatus, version }: UpdateCase) => { @@ -218,7 +226,7 @@ export const useGetCases = ( } catch (error) { if (!didCancelUpdateCases.current) { if (error.name !== 'AbortError') { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + toasts.addError(error, { title: i18n.ERROR_TITLE }); } dispatch({ type: 'FETCH_FAILURE', payload: 'caseUpdate' }); } diff --git a/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx b/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx index 30714a2d8d938..f795d5cc60e71 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases_status.test.tsx @@ -11,6 +11,7 @@ import { casesStatus } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetCasesStatus', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx b/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx index 03eae135671a2..c3244bb38f151 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases_status.tsx @@ -7,10 +7,10 @@ import { useCallback, useEffect, useState, useRef } from 'react'; -import { errorToToaster, useStateToaster } from '../components/toasters'; import { getCasesStatus } from './api'; import * as i18n from './translations'; import { CasesStatus } from './types'; +import { useToasts } from '../common/lib/kibana'; interface CasesStatusState extends CasesStatus { isLoading: boolean; @@ -31,7 +31,7 @@ export interface UseGetCasesStatus extends CasesStatusState { export const useGetCasesStatus = (): UseGetCasesStatus => { const [casesStatusState, setCasesStatusState] = useState<CasesStatusState>(initialData); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -57,11 +57,10 @@ export const useGetCasesStatus = (): UseGetCasesStatus => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } setCasesStatusState({ countClosedCases: 0, diff --git a/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx b/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx index ff1c5a3eb4de7..8345ddf107872 100644 --- a/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_reporters.test.tsx @@ -11,6 +11,7 @@ import { reporters, respReporters } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetReporters', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_reporters.tsx b/x-pack/plugins/cases/public/containers/use_get_reporters.tsx index 01604d876fd61..a9d28de33cb41 100644 --- a/x-pack/plugins/cases/public/containers/use_get_reporters.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_reporters.tsx @@ -9,9 +9,9 @@ import { useCallback, useEffect, useState, useRef } from 'react'; import { isEmpty } from 'lodash/fp'; import { User } from '../../common'; -import { errorToToaster, useStateToaster } from '../components/toasters'; import { getReporters } from './api'; import * as i18n from './translations'; +import { useToasts } from '../common/lib/kibana'; interface ReportersState { reporters: string[]; @@ -34,7 +34,7 @@ export interface UseGetReporters extends ReportersState { export const useGetReporters = (): UseGetReporters => { const [reportersState, setReporterState] = useState<ReportersState>(initialData); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -64,11 +64,10 @@ export const useGetReporters = (): UseGetReporters => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } setReporterState({ @@ -79,8 +78,7 @@ export const useGetReporters = (): UseGetReporters => { }); } } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [reportersState]); + }, [reportersState, toasts]); useEffect(() => { fetchReporters(); diff --git a/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx b/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx index 8042e560df350..3fecfb51b958c 100644 --- a/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_tags.test.tsx @@ -11,6 +11,7 @@ import { tags } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useGetTags', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_get_tags.tsx b/x-pack/plugins/cases/public/containers/use_get_tags.tsx index 33b863fba5da3..4368b025baa38 100644 --- a/x-pack/plugins/cases/public/containers/use_get_tags.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_tags.tsx @@ -6,7 +6,7 @@ */ import { useEffect, useReducer, useRef, useCallback } from 'react'; -import { errorToToaster, useStateToaster } from '../components/toasters'; +import { useToasts } from '../common/lib/kibana'; import { getTags } from './api'; import * as i18n from './translations'; @@ -57,7 +57,7 @@ export const useGetTags = (): UseGetTags => { isError: false, tags: initialData, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -76,11 +76,10 @@ export const useGetTags = (): UseGetTags => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); } diff --git a/x-pack/plugins/cases/public/containers/use_post_case.test.tsx b/x-pack/plugins/cases/public/containers/use_post_case.test.tsx index 72ea368f10317..f7f7f1419c713 100644 --- a/x-pack/plugins/cases/public/containers/use_post_case.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_case.test.tsx @@ -12,6 +12,7 @@ import { ConnectorTypes } from '../../common'; import { basicCasePost } from './mock'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('usePostCase', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_post_case.tsx b/x-pack/plugins/cases/public/containers/use_post_case.tsx index 503ac8bf0209d..f3c92fc1ab336 100644 --- a/x-pack/plugins/cases/public/containers/use_post_case.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_case.tsx @@ -7,10 +7,10 @@ import { useReducer, useCallback, useRef, useEffect } from 'react'; import { CasePostRequest } from '../../common'; -import { errorToToaster, useStateToaster } from '../components/toasters'; import { postCase } from './api'; import * as i18n from './translations'; import { Case } from './types'; +import { useToasts } from '../common/lib/kibana'; interface NewCaseState { isLoading: boolean; isError: boolean; @@ -49,7 +49,7 @@ export const usePostCase = (): UsePostCase => { isLoading: false, isError: false, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -69,11 +69,10 @@ export const usePostCase = (): UsePostCase => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); } diff --git a/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx b/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx index 907827e396c70..5b927f55c9e91 100644 --- a/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_comment.test.tsx @@ -13,6 +13,7 @@ import { basicCaseId, basicSubCaseId } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('usePostComment', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_post_comment.tsx b/x-pack/plugins/cases/public/containers/use_post_comment.tsx index 65f9719d1ff58..15cf398a2fdb2 100644 --- a/x-pack/plugins/cases/public/containers/use_post_comment.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_comment.tsx @@ -7,11 +7,11 @@ import { useReducer, useCallback, useRef, useEffect } from 'react'; import { CommentRequest } from '../../common'; -import { errorToToaster, useStateToaster } from '../components/toasters'; import { postComment } from './api'; import * as i18n from './translations'; import { Case } from './types'; +import { useToasts } from '../common/lib/kibana'; interface NewCommentState { isLoading: boolean; @@ -56,7 +56,7 @@ export const usePostComment = (): UsePostComment => { isLoading: false, isError: false, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -79,17 +79,16 @@ export const usePostComment = (): UsePostComment => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); } } }, - [dispatchToaster] + [toasts] ); useEffect(() => { diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx index 3d43180d60aff..18e3c4be493b8 100644 --- a/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.test.tsx @@ -12,6 +12,7 @@ import * as api from './api'; import { CaseConnector, ConnectorTypes } from '../../common'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('usePostPushToService', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx index 636edd33b5e92..bee89e21b4283 100644 --- a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx @@ -7,11 +7,11 @@ import { useReducer, useCallback, useRef, useEffect } from 'react'; import { CaseConnector } from '../../common'; -import { errorToToaster, useStateToaster, displaySuccessToast } from '../components/toasters'; import { pushCase } from './api'; import * as i18n from './translations'; import { Case } from './types'; +import { useToasts } from '../common/lib/kibana'; interface PushToServiceState { isLoading: boolean; @@ -61,7 +61,7 @@ export const usePostPushToService = (): UsePostPushToService => { isLoading: false, isError: false, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const cancel = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -77,21 +77,17 @@ export const usePostPushToService = (): UsePostPushToService => { if (!cancel.current) { dispatch({ type: 'FETCH_SUCCESS' }); - displaySuccessToast( - i18n.SUCCESS_SEND_TO_EXTERNAL_SERVICE(connector.name), - dispatchToaster - ); + toasts.addSuccess(i18n.SUCCESS_SEND_TO_EXTERNAL_SERVICE(connector.name)); } return response; } catch (error) { if (!cancel.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); } diff --git a/x-pack/plugins/cases/public/containers/use_update_case.test.tsx b/x-pack/plugins/cases/public/containers/use_update_case.test.tsx index 65309d6d29e05..666e8df0c2413 100644 --- a/x-pack/plugins/cases/public/containers/use_update_case.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_update_case.test.tsx @@ -12,6 +12,7 @@ import * as api from './api'; import { UpdateKey } from './types'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useUpdateCase', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_update_case.tsx b/x-pack/plugins/cases/public/containers/use_update_case.tsx index 731e44bdd9da5..b6ea580cf542a 100644 --- a/x-pack/plugins/cases/public/containers/use_update_case.tsx +++ b/x-pack/plugins/cases/public/containers/use_update_case.tsx @@ -7,9 +7,9 @@ import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { errorToToaster, useStateToaster } from '../components/toasters'; +import { useToasts } from '../common/lib/kibana'; import { patchCase, patchSubCase } from './api'; -import { UpdateKey, UpdateByKey, CaseStatuses } from './types'; +import { UpdateKey, UpdateByKey, CaseStatuses } from '../../common'; import * as i18n from './translations'; import { createUpdateSuccessToaster } from './utils'; @@ -68,7 +68,7 @@ export const useUpdateCase = ({ isError: false, updateKey: null, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -111,10 +111,9 @@ export const useUpdateCase = ({ updateCase(response[0]); } dispatch({ type: 'FETCH_SUCCESS' }); - dispatchToaster({ - type: 'addToaster', - toast: createUpdateSuccessToaster(caseData, response[0], updateKey, updateValue), - }); + toasts.addSuccess( + createUpdateSuccessToaster(caseData, response[0], updateKey, updateValue) + ); if (onSuccess) { onSuccess(); @@ -123,11 +122,10 @@ export const useUpdateCase = ({ } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE' }); if (onError) { diff --git a/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx b/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx index 9ff266ad9c988..b936eb126f0d4 100644 --- a/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_update_comment.test.tsx @@ -11,6 +11,7 @@ import { basicCase, basicCaseCommentPatch, basicSubCaseId } from './mock'; import * as api from './api'; jest.mock('./api'); +jest.mock('../common/lib/kibana'); describe('useUpdateComment', () => { const abortCtrl = new AbortController(); diff --git a/x-pack/plugins/cases/public/containers/use_update_comment.tsx b/x-pack/plugins/cases/public/containers/use_update_comment.tsx index e83b91a574f8a..512b5b50a22b9 100644 --- a/x-pack/plugins/cases/public/containers/use_update_comment.tsx +++ b/x-pack/plugins/cases/public/containers/use_update_comment.tsx @@ -6,7 +6,7 @@ */ import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { errorToToaster, useStateToaster } from '../components/toasters'; +import { useToasts } from '../common/lib/kibana'; import { patchComment } from './api'; import * as i18n from './translations'; import { Case } from './types'; @@ -69,7 +69,7 @@ export const useUpdateComment = (): UseUpdateComment => { isLoadingIds: [], isError: false, }); - const [, dispatchToaster] = useStateToaster(); + const toasts = useToasts(); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -106,11 +106,10 @@ export const useUpdateComment = (): UseUpdateComment => { } catch (error) { if (!isCancelledRef.current) { if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); } dispatch({ type: 'FETCH_FAILURE', payload: commentId }); } diff --git a/x-pack/plugins/cases/public/containers/utils.test.ts b/x-pack/plugins/cases/public/containers/utils.test.ts index 6c1fb60298938..3ee6182cb053d 100644 --- a/x-pack/plugins/cases/public/containers/utils.test.ts +++ b/x-pack/plugins/cases/public/containers/utils.test.ts @@ -50,25 +50,18 @@ describe('utils', () => { describe('createUpdateSuccessToaster', () => { it('creates the correct toast when sync alerts is turned on and case has alerts', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - caseBeforeUpdate, - caseAfterUpdate, - 'settings', - { - syncAlerts: true, - } - ); + const toast = createUpdateSuccessToaster(caseBeforeUpdate, caseAfterUpdate, 'settings', { + syncAlerts: true, + }); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Alerts in "My case" have been synced', }); }); it('creates the correct toast when sync alerts is turned on and case does NOT have alerts', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( + const toast = createUpdateSuccessToaster( { ...caseBeforeUpdate, comments: [] }, caseAfterUpdate, 'settings', @@ -78,33 +71,24 @@ describe('utils', () => { ); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Updated "My case"', }); }); it('creates the correct toast when sync alerts is turned off and case has alerts', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - caseBeforeUpdate, - caseAfterUpdate, - 'settings', - { - syncAlerts: false, - } - ); + const toast = createUpdateSuccessToaster(caseBeforeUpdate, caseAfterUpdate, 'settings', { + syncAlerts: false, + }); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Updated "My case"', }); }); it('creates the correct toast when the status change, case has alerts, and sync alerts is on', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( + const toast = createUpdateSuccessToaster( caseBeforeUpdate, caseAfterUpdate, 'status', @@ -112,8 +96,6 @@ describe('utils', () => { ); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Updated "My case"', text: 'Alerts in this case have been also had their status updated', }); @@ -121,7 +103,7 @@ describe('utils', () => { it('creates the correct toast when the status change, case has alerts, and sync alerts is off', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( + const toast = createUpdateSuccessToaster( { ...caseBeforeUpdate, settings: { syncAlerts: false } }, caseAfterUpdate, 'status', @@ -129,15 +111,13 @@ describe('utils', () => { ); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Updated "My case"', }); }); it('creates the correct toast when the status change, case does NOT have alerts, and sync alerts is on', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( + const toast = createUpdateSuccessToaster( { ...caseBeforeUpdate, comments: [] }, caseAfterUpdate, 'status', @@ -145,15 +125,13 @@ describe('utils', () => { ); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Updated "My case"', }); }); it('creates the correct toast if not a status or a setting', () => { // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( + const toast = createUpdateSuccessToaster( caseBeforeUpdate, caseAfterUpdate, 'title', @@ -161,8 +139,6 @@ describe('utils', () => { ); expect(toast).toEqual({ - color: 'success', - iconType: 'check', title: 'Updated "My case"', }); }); diff --git a/x-pack/plugins/cases/public/containers/utils.ts b/x-pack/plugins/cases/public/containers/utils.ts index a7eeaff1c2637..5ef30aa800f90 100644 --- a/x-pack/plugins/cases/public/containers/utils.ts +++ b/x-pack/plugins/cases/public/containers/utils.ts @@ -5,13 +5,13 @@ * 2.0. */ -import uuid from 'uuid'; import { set } from '@elastic/safer-lodash-set'; import { camelCase, isArray, isObject } from 'lodash'; import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; import { pipe } from 'fp-ts/lib/pipeable'; +import { ToastInputFields } from 'kibana/public'; import { CasesFindResponse, CasesFindResponseRt, @@ -29,7 +29,6 @@ import { CommentType, CasePatchRequest, } from '../../common'; -import { AppToast, ToasterError } from '../components/toasters'; import { AllCases, Case, UpdateByKey } from './types'; import * as i18n from './translations'; @@ -115,20 +114,26 @@ export const valueToUpdateIsStatus = ( value: UpdateByKey['updateValue'] ): value is CasePatchRequest['status'] => key === 'status'; +export class ToasterError extends Error { + public readonly messages: string[]; + + constructor(messages: string[]) { + super(messages[0]); + this.name = 'ToasterError'; + this.messages = messages; + } +} export const createUpdateSuccessToaster = ( caseBeforeUpdate: Case, caseAfterUpdate: Case, key: UpdateByKey['updateKey'], value: UpdateByKey['updateValue'] -): AppToast => { +): ToastInputFields => { const caseHasAlerts = caseBeforeUpdate.comments.some( (comment) => comment.type === CommentType.alert ); - const toast: AppToast = { - id: uuid.v4(), - color: 'success', - iconType: 'check', + const toast: ToastInputFields = { title: i18n.UPDATED_CASE(caseAfterUpdate.title), }; diff --git a/x-pack/plugins/cases/public/methods/get_recent_cases.tsx b/x-pack/plugins/cases/public/methods/get_recent_cases.tsx new file mode 100644 index 0000000000000..13ebef7ee42ee --- /dev/null +++ b/x-pack/plugins/cases/public/methods/get_recent_cases.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLoadingSpinner } from '@elastic/eui'; +import React, { lazy, Suspense } from 'react'; +import { RecentCasesProps } from '../components/recent_cases'; + +export const getRecentCasesLazy = (props: RecentCasesProps) => { + const RecentCasesLazy = lazy(() => import('../components/recent_cases')); + return ( + <Suspense fallback={<EuiLoadingSpinner />}> + <RecentCasesLazy {...props} /> + </Suspense> + ); +}; diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index a6ea35d29216f..0b309231117f6 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -5,13 +5,16 @@ * 2.0. */ -import { CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; +import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; import { CasesUiStart, SetupPlugins, StartPlugins } from './types'; -import { getCreateCaseLazy } from './methods/get_create_case'; +import { KibanaServices } from './common/lib/kibana'; +import { getCaseConnectorUi } from './components/connectors'; import { getAllCasesLazy } from './methods/get_all_cases'; -import { getConfigureCasesLazy } from './methods/get_configure_cases'; import { getCaseViewLazy } from './methods/get_case_view'; -import { KibanaServices } from './common/lib/kibana'; +import { getConfigureCasesLazy } from './methods/get_configure_cases'; +import { getCreateCaseLazy } from './methods/get_create_case'; +import { getRecentCasesLazy } from './methods/get_recent_cases'; +import { ENABLE_CASE_CONNECTOR } from '../common'; /** * @public @@ -23,7 +26,11 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S constructor(initializerContext: PluginInitializerContext) { this.kibanaVersion = initializerContext.env.packageInfo.version; } - public setup() {} + public setup(core: CoreSetup, plugins: SetupPlugins) { + if (ENABLE_CASE_CONNECTOR) { + plugins.triggersActionsUi.actionTypeRegistry.register(getCaseConnectorUi()); + } + } public start(core: CoreStart, plugins: StartPlugins): CasesUiStart { KibanaServices.init({ ...core, ...plugins, kibanaVersion: this.kibanaVersion }); @@ -44,6 +51,14 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S getCaseView: (props) => { return getCaseViewLazy(props); }, + /** + * Get the configure case component + * @param props ConfigureCasesProps + * @return {ReactElement<ConfigureCasesProps>} + */ + getConfigureCases: (props) => { + return getConfigureCasesLazy(props); + }, /** * Get the create case form * @param props CreateCaseProps @@ -53,12 +68,12 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S return getCreateCaseLazy(props); }, /** - * Get the configure case component - * @param props ConfigureCasesProps - * @return {ReactElement<ConfigureCasesProps>} + * Get the recent cases component + * @param props RecentCasesProps + * @return {ReactElement<RecentCasesProps>} */ - getConfigureCases: (props) => { - return getConfigureCasesLazy(props); + getRecentCases: (props) => { + return getRecentCasesLazy(props); }, }; } diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index 5902c5cf7486b..e92d940a02cef 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -13,9 +13,10 @@ import { TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; import { AllCasesProps } from './components/all_cases'; -import { CreateCaseProps } from './components/create'; -import { ConfigureCasesProps } from './components/configure_cases'; import { CaseViewProps } from './components/case_view'; +import { ConfigureCasesProps } from './components/configure_cases'; +import { CreateCaseProps } from './components/create'; +import { RecentCasesProps } from './components/recent_cases'; export interface SetupPlugins { security: SecurityPluginSetup; @@ -40,6 +41,7 @@ export type StartServices = CoreStart & export interface CasesUiStart { getAllCases: (props: AllCasesProps) => ReactElement<AllCasesProps>; getCaseView: (props: CaseViewProps) => ReactElement<CaseViewProps>; - getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; getConfigureCases: (props: ConfigureCasesProps) => ReactElement<ConfigureCasesProps>; + getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; + getRecentCases: (props: RecentCasesProps) => ReactElement<RecentCasesProps>; } diff --git a/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts b/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts index 7d9593899bb2e..8f75e60260873 100644 --- a/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts +++ b/x-pack/plugins/cases/server/client/configure/get_mappings.test.ts @@ -7,7 +7,11 @@ import { ConnectorTypes } from '../../../common'; -import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__'; +import { + createMockSavedObjectsRepository, + mockCaseMappingsResilient, + mockCaseMappingsBad, +} from '../../routes/api/__fixtures__'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks'; import { actionsClientMock } from '../../../../actions/server/actions_client.mock'; import { mappings, mockGetFieldsResponse } from './mock'; @@ -26,7 +30,7 @@ describe('get_mappings', () => { describe('happy path', () => { test('it gets existing mappings', async () => { const savedObjectsClient = createMockSavedObjectsRepository({ - caseMappingsSavedObject: mockCaseMappings, + caseMappingsSavedObject: mockCaseMappingsResilient, }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient }); const res = await casesClient.client.getMappings({ @@ -35,7 +39,7 @@ describe('get_mappings', () => { connectorId: '123', }); - expect(res).toEqual(mappings[ConnectorTypes.jira]); + expect(res).toEqual(mappings[ConnectorTypes.resilient]); }); test('it creates new mappings', async () => { const savedObjectsClient = createMockSavedObjectsRepository({ @@ -48,6 +52,21 @@ describe('get_mappings', () => { connectorId: '123', }); + expect(res).toEqual(mappings[ConnectorTypes.jira]); + }); + }); + describe('unhappy path', () => { + test('it gets existing mappings, but attributes object is empty so it creates new mappings', async () => { + const savedObjectsClient = createMockSavedObjectsRepository({ + caseMappingsSavedObject: mockCaseMappingsBad, + }); + const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient }); + const res = await casesClient.client.getMappings({ + actionsClient: actionsMock, + connectorType: ConnectorTypes.jira, + connectorId: '123', + }); + expect(res).toEqual(mappings[ConnectorTypes.jira]); }); }); diff --git a/x-pack/plugins/cases/server/client/configure/get_mappings.ts b/x-pack/plugins/cases/server/client/configure/get_mappings.ts index 1f767ea682843..3560bf1dcd067 100644 --- a/x-pack/plugins/cases/server/client/configure/get_mappings.ts +++ b/x-pack/plugins/cases/server/client/configure/get_mappings.ts @@ -48,7 +48,11 @@ export const getMappings = async ({ }); let theMapping; // Create connector mappings if there are none - if (myConnectorMappings.total === 0) { + if ( + myConnectorMappings.total === 0 || + (myConnectorMappings.total > 0 && + !myConnectorMappings.saved_objects[0].attributes.hasOwnProperty('mappings')) + ) { const res = await casesClient.getFields({ actionsClient, connectorId, diff --git a/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts b/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts index c9d7ac4125141..0026ee9ce4827 100644 --- a/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts +++ b/x-pack/plugins/cases/server/routes/api/__fixtures__/mock_saved_objects.ts @@ -485,6 +485,26 @@ export const mockCaseMappings: Array<SavedObject<ConnectorMappings>> = [ }, ]; +export const mockCaseMappingsResilient: Array<SavedObject<ConnectorMappings>> = [ + { + type: CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, + id: 'mock-mappings-1', + attributes: { + mappings: mappings[ConnectorTypes.resilient], + }, + references: [], + }, +]; + +export const mockCaseMappingsBad: Array<SavedObject<Partial<ConnectorMappings>>> = [ + { + type: CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, + id: 'mock-mappings-bad', + attributes: {}, + references: [], + }, +]; + export const mockUserActions: Array<SavedObject<CaseUserActionAttributes>> = [ { type: CASE_USER_ACTION_SAVED_OBJECT, diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 986a1c03f3d34..0dade261b3872 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -209,10 +209,3 @@ export const showAllOthersBucket: string[] = [ 'destination.ip', 'user.name', ]; - -/* - Feature Flag for Cases RAC UI - DO NOT MERGE to master as true, dev only -*/ - -export const USE_RAC_CASES_UI = false; diff --git a/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts index 3f3209b52120e..7f0016e39ff88 100644 --- a/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts @@ -19,7 +19,8 @@ import { createTimeline } from '../../tasks/api_calls/timelines'; import { cleanKibana } from '../../tasks/common'; import { createCase } from '../../tasks/api_calls/cases'; -describe('attach timeline to case', () => { +// TODO: enable once attach timeline to cases is re-enabled +describe.skip('attach timeline to case', () => { context('without cases created', () => { beforeEach(() => { cleanKibana(); diff --git a/x-pack/plugins/security_solution/cypress/integration/cases/creation.spec.ts b/x-pack/plugins/security_solution/cypress/integration/cases/creation.spec.ts index f46feae946242..c568aaae664a0 100644 --- a/x-pack/plugins/security_solution/cypress/integration/cases/creation.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/cases/creation.spec.ts @@ -67,8 +67,8 @@ describe('Cases', () => { .as('mycase') ); }); - - it('Creates a new case with timeline and opens the timeline', function () { + // TODO: enable once attach timeline to cases is re-enabled + it.skip('Creates a new case with timeline and opens the timeline', function () { loginAndWaitForPageWithoutDateRange(CASES_URL); goToCreateNewCase(); fillCasesMandatoryfields(this.mycase); diff --git a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts index 2078744393d94..299beb7fe648c 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts @@ -73,6 +73,7 @@ export const addDescriptionToTimeline = (description: string) => { export const addNameToTimeline = (name: string) => { cy.get(TIMELINE_EDIT_MODAL_OPEN_BUTTON).first().click(); + // cy.log('HERE:', cy.get(TIMELINE_TITLE_INPUT)); cy.get(TIMELINE_TITLE_INPUT).type(`${name}{enter}`); cy.get(TIMELINE_TITLE_INPUT).should('have.attr', 'value', name); cy.get(TIMELINE_EDIT_MODAL_SAVE_BUTTON).click(); diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx deleted file mode 100644 index 6ffce4f2af454..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.test.tsx +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor, act } from '@testing-library/react'; -import { noop } from 'lodash/fp'; - -import { TestProviders } from '../../../common/mock'; -import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; - -import { CommentRequest, CommentType } from '../../../../../cases/common'; -import { useInsertTimeline } from '../use_insert_timeline'; -import { usePostComment } from '../../containers/use_post_comment'; -import { AddComment, AddCommentRefObject } from '.'; - -jest.mock('../../containers/use_post_comment'); -jest.mock('../use_insert_timeline'); - -const usePostCommentMock = usePostComment as jest.Mock; -const useInsertTimelineMock = useInsertTimeline as jest.Mock; -const onCommentSaving = jest.fn(); -const onCommentPosted = jest.fn(); -const postComment = jest.fn(); - -const addCommentProps = { - caseId: '1234', - disabled: false, - insertQuote: null, - onCommentSaving, - onCommentPosted, - showLoading: false, -}; - -const defaultPostComment = { - isLoading: false, - isError: false, - postComment, -}; - -const sampleData: CommentRequest = { - comment: 'what a cool comment', - type: CommentType.user, -}; - -describe('AddComment ', () => { - beforeEach(() => { - jest.resetAllMocks(); - usePostCommentMock.mockImplementation(() => defaultPostComment); - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); - }); - - it('should post comment on submit click', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <AddComment {...addCommentProps} /> - </Router> - </TestProviders> - ); - - await act(async () => { - wrapper - .find(`[data-test-subj="add-comment"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.comment } }); - }); - - expect(wrapper.find(`[data-test-subj="add-comment"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeFalsy(); - - await act(async () => { - wrapper.find(`[data-test-subj="submit-comment"]`).first().simulate('click'); - }); - - await waitFor(() => { - expect(onCommentSaving).toBeCalled(); - expect(postComment).toBeCalledWith({ - caseId: addCommentProps.caseId, - data: sampleData, - subCaseId: undefined, - updateCase: onCommentPosted, - }); - expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe(''); - }); - }); - - it('should render spinner and disable submit when loading', () => { - usePostCommentMock.mockImplementation(() => ({ ...defaultPostComment, isLoading: true })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <AddComment {...{ ...addCommentProps, showLoading: true }} /> - </Router> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeTruthy(); - expect( - wrapper.find(`[data-test-subj="submit-comment"]`).first().prop('isDisabled') - ).toBeTruthy(); - }); - - it('should disable submit button when disabled prop passed', () => { - usePostCommentMock.mockImplementation(() => ({ ...defaultPostComment, isLoading: true })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <AddComment {...{ ...addCommentProps, disabled: true }} /> - </Router> - </TestProviders> - ); - - expect( - wrapper.find(`[data-test-subj="submit-comment"]`).first().prop('isDisabled') - ).toBeTruthy(); - }); - - it('should insert a quote', async () => { - const sampleQuote = 'what a cool quote'; - const ref = React.createRef<AddCommentRefObject>(); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <AddComment {...{ ...addCommentProps }} ref={ref} /> - </Router> - </TestProviders> - ); - - await act(async () => { - wrapper - .find(`[data-test-subj="add-comment"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.comment } }); - }); - - await act(async () => { - ref.current!.addQuote(sampleQuote); - }); - - expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe( - `${sampleData.comment}\n\n${sampleQuote}` - ); - }); - - it('it should insert a timeline', async () => { - let attachTimeline = noop; - useInsertTimelineMock.mockImplementation((comment, onTimelineAttached) => { - attachTimeline = onTimelineAttached; - }); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <AddComment {...{ ...addCommentProps }} /> - </Router> - </TestProviders> - ); - - act(() => { - attachTimeline('[title](url)'); - }); - - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe('[title](url)'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx deleted file mode 100644 index ff5ef11fd923f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; -import React, { useCallback, forwardRef, useImperativeHandle } from 'react'; -import styled from 'styled-components'; - -import { CommentType } from '../../../../../cases/common'; -import { usePostComment } from '../../containers/use_post_comment'; -import { Case } from '../../containers/types'; -import { MarkdownEditorForm } from '../../../common/components/markdown_editor'; -import { Form, useForm, UseField, useFormData } from '../../../shared_imports'; - -import * as i18n from './translations'; -import { schema, AddCommentFormSchema } from './schema'; -import { useInsertTimeline } from '../use_insert_timeline'; - -const MySpinner = styled(EuiLoadingSpinner)` - position: absolute; - top: 50%; - left: 50%; -`; - -const initialCommentValue: AddCommentFormSchema = { - comment: '', -}; - -export interface AddCommentRefObject { - addQuote: (quote: string) => void; -} - -interface AddCommentProps { - caseId: string; - disabled?: boolean; - onCommentSaving?: () => void; - onCommentPosted: (newCase: Case) => void; - showLoading?: boolean; - subCaseId?: string; -} - -export const AddComment = React.memo( - forwardRef<AddCommentRefObject, AddCommentProps>( - ( - { caseId, disabled, onCommentPosted, onCommentSaving, showLoading = true, subCaseId }, - ref - ) => { - const { isLoading, postComment } = usePostComment(); - - const { form } = useForm<AddCommentFormSchema>({ - defaultValue: initialCommentValue, - options: { stripEmptyFields: false }, - schema, - }); - - const fieldName = 'comment'; - const { setFieldValue, reset, submit } = form; - const [{ comment }] = useFormData<{ comment: string }>({ form, watch: [fieldName] }); - - const addQuote = useCallback( - (quote) => { - setFieldValue(fieldName, `${comment}${comment.length > 0 ? '\n\n' : ''}${quote}`); - }, - [comment, setFieldValue] - ); - - useImperativeHandle(ref, () => ({ - addQuote, - })); - - const onTimelineAttached = useCallback( - (newValue: string) => setFieldValue(fieldName, newValue), - [setFieldValue] - ); - - useInsertTimeline(comment ?? '', onTimelineAttached); - - const onSubmit = useCallback(async () => { - const { isValid, data } = await submit(); - if (isValid) { - if (onCommentSaving != null) { - onCommentSaving(); - } - postComment({ - caseId, - data: { ...data, type: CommentType.user }, - updateCase: onCommentPosted, - subCaseId, - }); - reset(); - } - }, [caseId, onCommentPosted, onCommentSaving, postComment, reset, submit, subCaseId]); - - return ( - <span id="add-comment-permLink"> - {isLoading && showLoading && <MySpinner data-test-subj="loading-spinner" size="xl" />} - <Form form={form}> - <UseField - path={fieldName} - component={MarkdownEditorForm} - componentProps={{ - idAria: 'caseComment', - isDisabled: isLoading, - dataTestSubj: 'add-comment', - placeholder: i18n.ADD_COMMENT_HELP_TEXT, - bottomRightContent: ( - <EuiButton - data-test-subj="submit-comment" - iconType="plusInCircle" - isDisabled={isLoading || disabled} - isLoading={isLoading} - onClick={onSubmit} - size="s" - > - {i18n.ADD_COMMENT} - </EuiButton> - ), - }} - /> - </Form> - </span> - ); - } - ) -); - -AddComment.displayName = 'AddComment'; diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx deleted file mode 100644 index bf625fc065089..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/schema.tsx +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CommentRequestUserType } from '../../../../../cases/common'; -import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; -import * as i18n from './translations'; - -const { emptyField } = fieldValidators; - -export interface AddCommentFormSchema { - comment: CommentRequestUserType['comment']; -} - -export const schema: FormSchema<AddCommentFormSchema> = { - comment: { - type: FIELD_TYPES.TEXTAREA, - validations: [ - { - validator: emptyField(i18n.COMMENT_REQUIRED), - }, - ], - }, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx deleted file mode 100644 index 0353f48e6ee38..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/actions.tsx +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { Dispatch } from 'react'; -import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { Case, SubCase } from '../../containers/types'; -import { UpdateCase } from '../../containers/use_get_cases'; -import { statuses } from '../status'; -import * as i18n from './translations'; -import { isIndividual } from './helpers'; - -interface GetActions { - caseStatus: string; - dispatchUpdate: Dispatch<Omit<UpdateCase, 'refetchCasesStatus'>>; - deleteCaseOnClick: (deleteCase: Case) => void; -} - -export const getActions = ({ - caseStatus, - dispatchUpdate, - deleteCaseOnClick, -}: GetActions): Array<DefaultItemIconButtonAction<Case>> => { - const openCaseAction = { - available: (item: Case | SubCase) => item.status !== CaseStatuses.open, - enabled: (item: Case | SubCase) => isIndividual(item), - description: statuses[CaseStatuses.open].actions.single.title, - icon: statuses[CaseStatuses.open].icon, - name: statuses[CaseStatuses.open].actions.single.title, - onClick: (theCase: Case) => - dispatchUpdate({ - updateKey: 'status', - updateValue: CaseStatuses.open, - caseId: theCase.id, - version: theCase.version, - }), - type: 'icon' as const, - 'data-test-subj': 'action-open', - }; - - const makeInProgressAction = { - available: (item: Case) => item.status !== CaseStatuses['in-progress'], - enabled: (item: Case | SubCase) => isIndividual(item), - description: statuses[CaseStatuses['in-progress']].actions.single.title, - icon: statuses[CaseStatuses['in-progress']].icon, - name: statuses[CaseStatuses['in-progress']].actions.single.title, - onClick: (theCase: Case) => - dispatchUpdate({ - updateKey: 'status', - updateValue: CaseStatuses['in-progress'], - caseId: theCase.id, - version: theCase.version, - }), - type: 'icon' as const, - 'data-test-subj': 'action-in-progress', - }; - - const closeCaseAction = { - available: (item: Case | SubCase) => item.status !== CaseStatuses.closed, - enabled: (item: Case | SubCase) => isIndividual(item), - description: statuses[CaseStatuses.closed].actions.single.title, - icon: statuses[CaseStatuses.closed].icon, - name: statuses[CaseStatuses.closed].actions.single.title, - onClick: (theCase: Case) => - dispatchUpdate({ - updateKey: 'status', - updateValue: CaseStatuses.closed, - caseId: theCase.id, - version: theCase.version, - }), - type: 'icon' as const, - 'data-test-subj': 'action-close', - }; - - return [ - openCaseAction, - makeInProgressAction, - closeCaseAction, - { - description: i18n.DELETE_CASE, - icon: 'trash', - name: i18n.DELETE_CASE, - onClick: deleteCaseOnClick, - type: 'icon', - 'data-test-subj': 'action-delete', - }, - ]; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.test.tsx deleted file mode 100644 index ac877b9fae381..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.test.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import '../../../common/mock/match_media'; -import { ExternalServiceColumn } from './columns'; - -import { useGetCasesMockState } from '../../containers/mock'; - -describe('ExternalServiceColumn ', () => { - it('Not pushed render', () => { - const wrapper = mount( - <ExternalServiceColumn {...{ theCase: useGetCasesMockState.data.cases[0] }} /> - ); - expect( - wrapper.find(`[data-test-subj="case-table-column-external-notPushed"]`).last().exists() - ).toBeTruthy(); - }); - it('Up to date', () => { - const wrapper = mount( - <ExternalServiceColumn {...{ theCase: useGetCasesMockState.data.cases[1] }} /> - ); - expect( - wrapper.find(`[data-test-subj="case-table-column-external-upToDate"]`).last().exists() - ).toBeTruthy(); - }); - it('Needs update', () => { - const wrapper = mount( - <ExternalServiceColumn {...{ theCase: useGetCasesMockState.data.cases[2] }} /> - ); - expect( - wrapper.find(`[data-test-subj="case-table-column-external-requiresUpdate"]`).last().exists() - ).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx deleted file mode 100644 index 079943d8cbd3b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/columns.tsx +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback } from 'react'; -import { - EuiAvatar, - EuiBadgeGroup, - EuiBadge, - EuiLink, - EuiTableActionsColumnType, - EuiTableComputedColumnType, - EuiTableFieldDataColumnType, -} from '@elastic/eui'; -import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services'; -import styled from 'styled-components'; -import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; - -import { CaseStatuses, CaseType } from '../../../../../cases/common'; -import { getEmptyTagValue } from '../../../common/components/empty_value'; -import { Case, SubCase } from '../../containers/types'; -import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; -import { CaseDetailsLink } from '../../../common/components/links'; -import * as i18n from './translations'; -import { Status } from '../status'; -import { getSubCasesStatusCountsBadges, isSubCase } from './helpers'; -import { ALERTS } from '../../../app/home/translations'; - -export type CasesColumns = - | EuiTableFieldDataColumnType<Case> - | EuiTableComputedColumnType<Case> - | EuiTableActionsColumnType<Case>; - -const MediumShadeText = styled.p` - color: ${({ theme }) => theme.eui.euiColorMediumShade}; -`; - -const Spacer = styled.span` - margin-left: ${({ theme }) => theme.eui.paddingSizes.s}; -`; - -const TagWrapper = styled(EuiBadgeGroup)` - width: 100%; -`; - -const renderStringField = (field: string, dataTestSubj: string) => - field != null ? <span data-test-subj={dataTestSubj}>{field}</span> : getEmptyTagValue(); - -export const getCasesColumns = ( - actions: Array<DefaultItemIconButtonAction<Case>>, - filterStatus: string, - isModal: boolean -): CasesColumns[] => { - const columns = [ - { - name: i18n.NAME, - render: (theCase: Case | SubCase) => { - if (theCase.id != null && theCase.title != null) { - const caseDetailsLinkComponent = !isModal ? ( - <CaseDetailsLink - detailName={isSubCase(theCase) ? theCase.caseParentId : theCase.id} - title={theCase.title} - subCaseId={isSubCase(theCase) ? theCase.id : undefined} - > - {theCase.title} - </CaseDetailsLink> - ) : ( - <span>{theCase.title}</span> - ); - return theCase.status !== CaseStatuses.closed ? ( - caseDetailsLinkComponent - ) : ( - <> - {caseDetailsLinkComponent} - <Spacer> - <MediumShadeText>{i18n.CLOSED}</MediumShadeText> - </Spacer> - </> - ); - } - return getEmptyTagValue(); - }, - }, - { - field: 'createdBy', - name: i18n.REPORTER, - render: (createdBy: Case['createdBy']) => { - if (createdBy != null) { - return ( - <> - <EuiAvatar - className="userAction__circle" - name={createdBy.fullName ? createdBy.fullName : createdBy.username ?? i18n.UNKNOWN} - size="s" - /> - <Spacer data-test-subj="case-table-column-createdBy"> - {createdBy.fullName ? createdBy.fullName : createdBy.username ?? i18n.UNKNOWN} - </Spacer> - </> - ); - } - return getEmptyTagValue(); - }, - }, - { - field: 'tags', - name: i18n.TAGS, - render: (tags: Case['tags']) => { - if (tags != null && tags.length > 0) { - return ( - <TagWrapper> - {tags.map((tag: string, i: number) => ( - <EuiBadge - color="hollow" - key={`${tag}-${i}`} - data-test-subj={`case-table-column-tags-${i}`} - > - {tag} - </EuiBadge> - ))} - </TagWrapper> - ); - } - return getEmptyTagValue(); - }, - truncateText: true, - }, - { - align: RIGHT_ALIGNMENT, - field: 'totalAlerts', - name: ALERTS, - sortable: true, - render: (totalAlerts: Case['totalAlerts']) => - totalAlerts != null - ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) - : getEmptyTagValue(), - }, - { - align: RIGHT_ALIGNMENT, - field: 'totalComment', - name: i18n.COMMENTS, - sortable: true, - render: (totalComment: Case['totalComment']) => - totalComment != null - ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) - : getEmptyTagValue(), - }, - filterStatus === CaseStatuses.open - ? { - field: 'createdAt', - name: i18n.OPENED_ON, - sortable: true, - render: (createdAt: Case['createdAt']) => { - if (createdAt != null) { - return ( - <span data-test-subj={`case-table-column-createdAt`}> - <FormattedRelativePreferenceDate value={createdAt} /> - </span> - ); - } - return getEmptyTagValue(); - }, - } - : { - field: 'closedAt', - name: i18n.CLOSED_ON, - sortable: true, - render: (closedAt: Case['closedAt']) => { - if (closedAt != null) { - return ( - <span data-test-subj={`case-table-column-closedAt`}> - <FormattedRelativePreferenceDate value={closedAt} /> - </span> - ); - } - return getEmptyTagValue(); - }, - }, - { - name: i18n.EXTERNAL_INCIDENT, - render: (theCase: Case) => { - if (theCase.id != null) { - return <ExternalServiceColumn theCase={theCase} />; - } - return getEmptyTagValue(); - }, - }, - { - name: i18n.INCIDENT_MANAGEMENT_SYSTEM, - render: (theCase: Case) => { - if (theCase.externalService != null) { - return renderStringField( - `${theCase.externalService.connectorName}`, - `case-table-column-connector` - ); - } - return getEmptyTagValue(); - }, - }, - { - name: i18n.STATUS, - render: (theCase: Case) => { - if (theCase?.subCases == null || theCase.subCases.length === 0) { - if (theCase.status == null || theCase.type === CaseType.collection) { - return getEmptyTagValue(); - } - return <Status type={theCase.status} />; - } - - const badges = getSubCasesStatusCountsBadges(theCase.subCases); - return badges.map(({ color, count }, index) => ( - <EuiBadge key={index} color={color}> - {count} - </EuiBadge> - )); - }, - }, - { - name: i18n.ACTIONS, - actions, - }, - ]; - if (isModal) { - columns.pop(); // remove actions if in modal - } - return columns; -}; - -interface Props { - theCase: Case; -} - -export const ExternalServiceColumn: React.FC<Props> = ({ theCase }) => { - const handleRenderDataToPush = useCallback(() => { - const lastCaseUpdate = theCase.updatedAt != null ? new Date(theCase.updatedAt) : null; - const lastCasePush = - theCase.externalService?.pushedAt != null - ? new Date(theCase.externalService?.pushedAt) - : null; - const hasDataToPush = - lastCasePush === null || - (lastCasePush != null && - lastCaseUpdate != null && - lastCasePush.getTime() < lastCaseUpdate?.getTime()); - return ( - <p> - <EuiLink - data-test-subj={`case-table-column-external`} - href={theCase.externalService?.externalUrl} - target="_blank" - aria-label={i18n.SERVICENOW_LINK_ARIA} - > - {theCase.externalService?.externalTitle} - </EuiLink> - {hasDataToPush - ? renderStringField(i18n.REQUIRES_UPDATE, `case-table-column-external-requiresUpdate`) - : renderStringField(i18n.UP_TO_DATE, `case-table-column-external-upToDate`)} - </p> - ); - }, [theCase]); - if (theCase.externalService !== null) { - return handleRenderDataToPush(); - } - return renderStringField(i18n.NOT_PUSHED, `case-table-column-external-notPushed`); -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx deleted file mode 100644 index f40e159306e92..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/expanded_row.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiBasicTable as _EuiBasicTable } from '@elastic/eui'; -import styled from 'styled-components'; -import { Case, SubCase } from '../../containers/types'; -import { CasesColumns } from './columns'; -import { AssociationType } from '../../../../../cases/common'; - -type ExpandedRowMap = Record<string, Element> | {}; - -const EuiBasicTable: any = _EuiBasicTable; // eslint-disable-line @typescript-eslint/no-explicit-any -const BasicTable = styled(EuiBasicTable)` - thead { - display: none; - } - - tbody { - .euiTableCellContent { - padding: 8px !important; - } - .euiTableRowCell { - border: 0; - } - } -`; -BasicTable.displayName = 'BasicTable'; - -export const getExpandedRowMap = ({ - data, - columns, - isModal, - onSubCaseClick, -}: { - data: Case[] | null; - columns: CasesColumns[]; - isModal: boolean; - onSubCaseClick?: (theSubCase: SubCase) => void; -}): ExpandedRowMap => { - if (data == null) { - return {}; - } - - const rowProps = (theSubCase: SubCase) => { - return { - ...(isModal && onSubCaseClick ? { onClick: () => onSubCaseClick(theSubCase) } : {}), - className: 'subCase', - }; - }; - - return data.reduce((acc, curr) => { - if (curr.subCases != null) { - const subCases = curr.subCases.map((subCase, index) => ({ - ...subCase, - caseParentId: curr.id, - title: `${curr.title} ${index + 1}`, - associationType: AssociationType.subCase, - })); - return { - ...acc, - [curr.id]: ( - <BasicTable - columns={columns} - data-test-subj={`sub-cases-table-${curr.id}`} - itemId="id" - items={subCases} - rowProps={rowProps} - /> - ), - }; - } else { - return acc; - } - }, {}); -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts deleted file mode 100644 index 0d5eb2c9ba407..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/helpers.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { filter } from 'lodash/fp'; -import { AssociationType, CaseStatuses, CaseType } from '../../../../../cases/common'; -import { Case, SubCase } from '../../containers/types'; -import { statuses } from '../status'; - -export const isSelectedCasesIncludeCollections = (selectedCases: Case[]) => - selectedCases.length > 0 && - selectedCases.some((caseObj: Case) => caseObj.type === CaseType.collection); - -export const isSubCase = (theCase: Case | SubCase): theCase is SubCase => - (theCase as SubCase).caseParentId !== undefined && - (theCase as SubCase).associationType === AssociationType.subCase; - -export const isCollection = (theCase: Case | SubCase | null | undefined) => - theCase != null && (theCase as Case).type === CaseType.collection; - -export const isIndividual = (theCase: Case | SubCase | null | undefined) => - theCase != null && (theCase as Case).type === CaseType.individual; - -export const getSubCasesStatusCountsBadges = ( - subCases: SubCase[] -): Array<{ name: CaseStatuses; color: string; count: number }> => { - return [ - { - name: CaseStatuses.open, - color: statuses[CaseStatuses.open].color, - count: filter({ status: CaseStatuses.open }, subCases).length, - }, - { - name: CaseStatuses['in-progress'], - color: statuses[CaseStatuses['in-progress']].color, - count: filter({ status: CaseStatuses['in-progress'] }, subCases).length, - }, - { - name: CaseStatuses.closed, - color: statuses[CaseStatuses.closed].color, - count: filter({ status: CaseStatuses.closed }, subCases).length, - }, - ]; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx deleted file mode 100644 index c079bbc991601..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx +++ /dev/null @@ -1,912 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import moment from 'moment-timezone'; -import { waitFor } from '@testing-library/react'; -import '../../../common/mock/match_media'; -import { TestProviders } from '../../../common/mock'; -import { casesStatus, useGetCasesMockState, collectionCase } from '../../containers/mock'; -import * as i18n from './translations'; - -import { CaseStatuses, CaseType } from '../../../../../cases/common'; -import { useKibana } from '../../../common/lib/kibana'; -import { getEmptyTagValue } from '../../../common/components/empty_value'; -import { useDeleteCases } from '../../containers/use_delete_cases'; -import { useGetCases } from '../../containers/use_get_cases'; -import { useGetCasesStatus } from '../../containers/use_get_cases_status'; -import { useUpdateCases } from '../../containers/use_bulk_update_case'; -import { useGetActionLicense } from '../../containers/use_get_action_license'; -import { getCasesColumns } from './columns'; -import { AllCases } from '.'; -import { StatusAll } from '../status'; - -jest.mock('../../containers/use_bulk_update_case'); -jest.mock('../../containers/use_delete_cases'); -jest.mock('../../containers/use_get_cases'); -jest.mock('../../containers/use_get_cases_status'); -jest.mock('../../containers/use_get_action_license'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; -const useDeleteCasesMock = useDeleteCases as jest.Mock; -const useGetCasesMock = useGetCases as jest.Mock; -const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; -const useUpdateCasesMock = useUpdateCases as jest.Mock; -const useGetActionLicenseMock = useGetActionLicense as jest.Mock; - -jest.mock('../../../common/components/link_to'); - -jest.mock('../../../common/lib/kibana'); - -describe('AllCases', () => { - const dispatchResetIsDeleted = jest.fn(); - const dispatchResetIsUpdated = jest.fn(); - const dispatchUpdateCaseProperty = jest.fn(); - const handleOnDeleteConfirm = jest.fn(); - const handleToggleModal = jest.fn(); - const refetchCases = jest.fn(); - const setFilters = jest.fn(); - const setQueryParams = jest.fn(); - const setSelectedCases = jest.fn(); - const updateBulkStatus = jest.fn(); - const fetchCasesStatus = jest.fn(); - const onRowClick = jest.fn(); - const emptyTag = getEmptyTagValue().props.children; - - const defaultGetCases = { - ...useGetCasesMockState, - dispatchUpdateCaseProperty, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - }; - - const defaultDeleteCases = { - dispatchResetIsDeleted, - handleOnDeleteConfirm, - handleToggleModal, - isDeleted: false, - isDisplayConfirmDeleteModal: false, - isLoading: false, - }; - - const defaultCasesStatus = { - ...casesStatus, - fetchCasesStatus, - isError: false, - isLoading: false, - }; - - const defaultUpdateCases = { - isUpdated: false, - isLoading: false, - isError: false, - dispatchResetIsUpdated, - updateBulkStatus, - }; - - const defaultActionLicense = { - actionLicense: null, - isLoading: false, - isError: false, - }; - - let navigateToApp: jest.Mock; - - beforeEach(() => { - jest.clearAllMocks(); - navigateToApp = jest.fn(); - useKibanaMock().services.application.navigateToApp = navigateToApp; - useUpdateCasesMock.mockReturnValue(defaultUpdateCases); - useGetCasesMock.mockReturnValue(defaultGetCases); - useDeleteCasesMock.mockReturnValue(defaultDeleteCases); - useGetCasesStatusMock.mockReturnValue(defaultCasesStatus); - useGetActionLicenseMock.mockReturnValue(defaultActionLicense); - moment.tz.setDefault('UTC'); - }); - - it('should render AllCases', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - - await waitFor(() => { - expect(wrapper.find(`a[data-test-subj="case-details-link"]`).first().prop('href')).toEqual( - `/${useGetCasesMockState.data.cases[0].id}` - ); - expect(wrapper.find(`a[data-test-subj="case-details-link"]`).first().text()).toEqual( - useGetCasesMockState.data.cases[0].title - ); - expect( - wrapper.find(`span[data-test-subj="case-table-column-tags-0"]`).first().prop('title') - ).toEqual(useGetCasesMockState.data.cases[0].tags[0]); - expect(wrapper.find(`[data-test-subj="case-table-column-createdBy"]`).first().text()).toEqual( - useGetCasesMockState.data.cases[0].createdBy.fullName - ); - expect( - wrapper - .find(`[data-test-subj="case-table-column-createdAt"]`) - .first() - .childAt(0) - .prop('value') - ).toBe(useGetCasesMockState.data.cases[0].createdAt); - expect(wrapper.find(`[data-test-subj="case-table-case-count"]`).first().text()).toEqual( - 'Showing 10 cases' - ); - }); - }); - - it('should render the stats', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.closed }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - - await waitFor(() => { - expect(wrapper.find('[data-test-subj="openStatsHeader"]').exists()).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="openStatsHeader"] .euiDescriptionList__description') - .first() - .text() - ).toBe('20'); - - expect(wrapper.find('[data-test-subj="inProgressStatsHeader"]').exists()).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="inProgressStatsHeader"] .euiDescriptionList__description') - .first() - .text() - ).toBe('40'); - - expect(wrapper.find('[data-test-subj="closedStatsHeader"]').exists()).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="closedStatsHeader"] .euiDescriptionList__description') - .first() - .text() - ).toBe('130'); - }); - }); - - it('should render the loading spinner when loading stats', async () => { - useGetCasesStatusMock.mockReturnValue({ ...defaultCasesStatus, isLoading: true }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="openStatsHeader-loading-spinner"]').exists() - ).toBeTruthy(); - expect( - wrapper.find('[data-test-subj="inProgressStatsHeader-loading-spinner"]').exists() - ).toBeTruthy(); - expect( - wrapper.find('[data-test-subj="closedStatsHeader-loading-spinner"]').exists() - ).toBeTruthy(); - }); - }); - - it('should render empty fields', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, - data: { - ...defaultGetCases.data, - cases: [ - { - ...defaultGetCases.data.cases[0], - id: null, - createdAt: null, - createdBy: null, - status: null, - subCases: null, - tags: null, - title: null, - totalComment: null, - totalAlerts: null, - }, - ], - }, - }); - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - const checkIt = (columnName: string, key: number) => { - const column = wrapper.find('[data-test-subj="cases-table"] tbody .euiTableRowCell').at(key); - if (columnName === i18n.ACTIONS) { - return; - } - expect(column.find('.euiTableRowCell--hideForDesktop').text()).toEqual(columnName); - expect(column.find('span').text()).toEqual(emptyTag); - }; - await waitFor(() => { - getCasesColumns([], CaseStatuses.open, false).map( - (i, key) => i.name != null && checkIt(`${i.name}`, key) - ); - }); - }); - - it('should render correct actions for case (with type individual and filter status open)', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, - }); - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); - await waitFor(() => { - expect(wrapper.find('[data-test-subj="action-open"]').exists()).toBeFalsy(); - expect( - wrapper.find('[data-test-subj="action-in-progress"]').first().props().disabled - ).toBeFalsy(); - expect(wrapper.find('[data-test-subj="action-close"]').first().props().disabled).toBeFalsy(); - expect(wrapper.find('[data-test-subj="action-delete"]').first().props().disabled).toBeFalsy(); - }); - }); - - it('should enable correct actions for sub cases', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - data: { - ...defaultGetCases.data, - cases: [ - { - ...defaultGetCases.data.cases[0], - id: 'my-case-with-subcases', - createdAt: null, - createdBy: null, - status: null, - subCases: [ - { - id: 'sub-case-id', - }, - ], - tags: null, - title: null, - totalComment: null, - totalAlerts: null, - type: CaseType.collection, - }, - ], - }, - }); - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper - .find( - '[data-test-subj="sub-cases-table-my-case-with-subcases"] [data-test-subj="euiCollapsedItemActionsButton"]' - ) - .last() - .simulate('click'); - expect(wrapper.find('[data-test-subj="action-open"]').first().props().disabled).toEqual(true); - expect( - wrapper.find('[data-test-subj="action-in-progress"]').first().props().disabled - ).toEqual(true); - expect(wrapper.find('[data-test-subj="action-close"]').first().props().disabled).toEqual( - true - ); - expect(wrapper.find('[data-test-subj="action-delete"]').first().props().disabled).toEqual( - false - ); - }); - }); - - it('should not render case link or actions on modal=true', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={true} /> - </TestProviders> - ); - await waitFor(() => { - const checkIt = (columnName: string) => { - expect(columnName).not.toEqual(i18n.ACTIONS); - }; - getCasesColumns([], CaseStatuses.open, true).map( - (i, key) => i.name != null && checkIt(`${i.name}`) - ); - expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); - }); - }); - - it('should tableHeaderSortButton AllCases', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="tableHeaderSortButton"]').first().simulate('click'); - expect(setQueryParams).toBeCalledWith({ - page: 1, - perPage: 5, - sortField: 'createdAt', - sortOrder: 'asc', - }); - }); - }); - - it('closes case when row action icon clicked', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); - wrapper.find('[data-test-subj="action-close"]').first().simulate('click'); - const firstCase = useGetCasesMockState.data.cases[0]; - expect(dispatchUpdateCaseProperty).toBeCalledWith({ - caseId: firstCase.id, - updateKey: 'status', - updateValue: CaseStatuses.closed, - refetchCasesStatus: fetchCasesStatus, - version: firstCase.version, - }); - }); - }); - - it('opens case when row action icon clicked', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - data: { - ...defaultGetCases.data, - cases: [ - { - ...defaultGetCases.data.cases[0], - status: CaseStatuses.closed, - }, - ], - }, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.closed }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); - wrapper.find('[data-test-subj="action-open"]').first().simulate('click'); - const firstCase = useGetCasesMockState.data.cases[0]; - expect(dispatchUpdateCaseProperty).toBeCalledWith({ - caseId: firstCase.id, - updateKey: 'status', - updateValue: CaseStatuses.open, - refetchCasesStatus: fetchCasesStatus, - version: firstCase.version, - }); - }); - }); - - it('put case in progress when row action icon clicked', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); - wrapper.find('[data-test-subj="action-in-progress"]').first().simulate('click'); - const firstCase = useGetCasesMockState.data.cases[0]; - expect(dispatchUpdateCaseProperty).toBeCalledWith({ - caseId: firstCase.id, - updateKey: 'status', - updateValue: CaseStatuses['in-progress'], - refetchCasesStatus: fetchCasesStatus, - version: firstCase.version, - }); - }); - }); - - it('Bulk delete', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.closed }, - selectedCases: [...useGetCasesMockState.data.cases, collectionCase], - }); - - useDeleteCasesMock - .mockReturnValueOnce({ - ...defaultDeleteCases, - isDisplayConfirmDeleteModal: false, - }) - .mockReturnValue({ - ...defaultDeleteCases, - isDisplayConfirmDeleteModal: true, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); - wrapper.find('[data-test-subj="cases-bulk-delete-button"]').first().simulate('click'); - expect(handleToggleModal).toBeCalled(); - - wrapper - .find( - '[data-test-subj="confirm-delete-case-modal"] [data-test-subj="confirmModalConfirmButton"]' - ) - .last() - .simulate('click'); - expect(handleOnDeleteConfirm.mock.calls[0][0]).toStrictEqual([ - ...useGetCasesMockState.data.cases.map(({ id, type, title }) => ({ id, type, title })), - { - id: collectionCase.id, - title: collectionCase.title, - type: collectionCase.type, - }, - ]); - }); - }); - - it('Renders only bulk delete on status all', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: StatusAll }, - selectedCases: [...useGetCasesMockState.data.cases], - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); - expect(wrapper.find('[data-test-subj="cases-bulk-open-button"]').exists()).toEqual(false); - expect(wrapper.find('[data-test-subj="cases-bulk-in-progress-button"]').exists()).toEqual( - false - ); - expect(wrapper.find('[data-test-subj="cases-bulk-close-button"]').exists()).toEqual(false); - expect( - wrapper.find('[data-test-subj="cases-bulk-delete-button"]').first().props().disabled - ).toEqual(false); - }); - }); - - it('Renders correct bulk actoins for case collection when filter status is set to all - enable only bulk delete if any collection is selected', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, - selectedCases: [ - ...useGetCasesMockState.data.cases, - { - ...useGetCasesMockState.data.cases[0], - type: CaseType.collection, - }, - ], - }); - - useDeleteCasesMock - .mockReturnValueOnce({ - ...defaultDeleteCases, - isDisplayConfirmDeleteModal: false, - }) - .mockReturnValue({ - ...defaultDeleteCases, - isDisplayConfirmDeleteModal: true, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); - expect(wrapper.find('[data-test-subj="cases-bulk-open-button"]').exists()).toEqual(false); - expect( - wrapper.find('[data-test-subj="cases-bulk-in-progress-button"]').first().props().disabled - ).toEqual(true); - expect( - wrapper.find('[data-test-subj="cases-bulk-close-button"]').first().props().disabled - ).toEqual(true); - expect( - wrapper.find('[data-test-subj="cases-bulk-delete-button"]').first().props().disabled - ).toEqual(false); - }); - }); - - it('Bulk close status update', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, - selectedCases: useGetCasesMockState.data.cases, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); - wrapper.find('[data-test-subj="cases-bulk-close-button"]').first().simulate('click'); - expect(updateBulkStatus).toBeCalledWith(useGetCasesMockState.data.cases, CaseStatuses.closed); - }); - }); - - it('Bulk open status update', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - selectedCases: useGetCasesMockState.data.cases, - filterOptions: { - ...defaultGetCases.filterOptions, - status: CaseStatuses.closed, - }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); - wrapper.find('[data-test-subj="cases-bulk-open-button"]').first().simulate('click'); - expect(updateBulkStatus).toBeCalledWith(useGetCasesMockState.data.cases, CaseStatuses.open); - }); - }); - - it('Bulk in-progress status update', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, - selectedCases: useGetCasesMockState.data.cases, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); - wrapper.find('[data-test-subj="cases-bulk-in-progress-button"]').first().simulate('click'); - expect(updateBulkStatus).toBeCalledWith( - useGetCasesMockState.data.cases, - CaseStatuses['in-progress'] - ); - }); - }); - - it('isDeleted is true, refetch', async () => { - useDeleteCasesMock.mockReturnValue({ - ...defaultDeleteCases, - isDeleted: true, - }); - - mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - expect(refetchCases).toBeCalled(); - expect(fetchCasesStatus).toBeCalled(); - expect(dispatchResetIsDeleted).toBeCalled(); - }); - }); - - it('isUpdated is true, refetch', async () => { - useUpdateCasesMock.mockReturnValue({ - ...defaultUpdateCases, - isUpdated: true, - }); - - mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - await waitFor(() => { - expect(refetchCases).toBeCalled(); - expect(fetchCasesStatus).toBeCalled(); - expect(dispatchResetIsUpdated).toBeCalled(); - }); - }); - - it('should not render header when modal=true', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={true} /> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find('[data-test-subj="all-cases-header"]').exists()).toBe(false); - }); - }); - - it('should not render table utility bar when modal=true', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={true} /> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find('[data-test-subj="case-table-utility-bar-actions"]').exists()).toBe( - false - ); - }); - }); - - it('case table should not be selectable when modal=true', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={true} /> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find('[data-test-subj="cases-table"]').first().prop('isSelectable')).toBe( - false - ); - }); - }); - - it('should call onRowClick with no cases and modal=true', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - data: { - ...defaultGetCases.data, - total: 0, - cases: [], - }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={true} onRowClick={onRowClick} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); - expect(onRowClick).toHaveBeenCalled(); - }); - }); - - it('should call navigateToApp with no cases and modal=false', async () => { - useGetCasesMock.mockReturnValue({ - ...defaultGetCases, - data: { - ...defaultGetCases.data, - total: 0, - cases: [], - }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={false} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); - expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/create' }); - }); - }); - - it('should call onRowClick when clicking a case with modal=true', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={true} onRowClick={onRowClick} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); - expect(onRowClick).toHaveBeenCalledWith({ - closedAt: null, - closedBy: null, - comments: [], - connector: { fields: null, id: '123', name: 'My Connector', type: '.none' }, - createdAt: '2020-02-19T23:06:33.798Z', - createdBy: { - email: 'leslie.knope@elastic.co', - fullName: 'Leslie Knope', - username: 'lknope', - }, - description: 'Security banana Issue', - externalService: { - connectorId: '123', - connectorName: 'connector name', - externalId: 'external_id', - externalTitle: 'external title', - externalUrl: 'basicPush.com', - pushedAt: '2020-02-20T15:02:57.995Z', - pushedBy: { - email: 'leslie.knope@elastic.co', - fullName: 'Leslie Knope', - username: 'lknope', - }, - }, - id: '1', - status: 'open', - subCaseIds: [], - tags: ['coke', 'pepsi'], - title: 'Another horrible breach!!', - totalAlerts: 0, - totalComment: 0, - type: CaseType.individual, - updatedAt: '2020-02-20T15:02:57.995Z', - updatedBy: { - email: 'leslie.knope@elastic.co', - fullName: 'Leslie Knope', - username: 'lknope', - }, - version: 'WzQ3LDFd', - settings: { - syncAlerts: true, - }, - }); - }); - }); - - it('should NOT call onRowClick when clicking a case with modal=true', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={false} /> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); - expect(onRowClick).not.toHaveBeenCalled(); - }); - }); - - it('should change the status to closed', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={false} /> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-closed"]').simulate('click'); - expect(setQueryParams).toBeCalledWith({ - sortField: 'closedAt', - }); - }); - }); - - it('should change the status to in-progress', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={false} /> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').simulate('click'); - expect(setQueryParams).toBeCalledWith({ - sortField: 'updatedAt', - }); - }); - }); - - it('should change the status to open', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={false} /> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-open"]').simulate('click'); - expect(setQueryParams).toBeCalledWith({ - sortField: 'createdAt', - }); - }); - }); - - it('should show the correct count on stats', async () => { - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} isModal={false} /> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - expect(wrapper.find('button[data-test-subj="case-status-filter-open"]').text()).toBe( - 'Open (20)' - ); - expect(wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').text()).toBe( - 'In progress (40)' - ); - expect(wrapper.find('button[data-test-subj="case-status-filter-closed"]').text()).toBe( - 'Closed (130)' - ); - }); - }); - - it('should not allow the user to enter configuration page with basic license', async () => { - useGetActionLicenseMock.mockReturnValue({ - ...defaultActionLicense, - actionLicense: { - id: '.jira', - name: 'Jira', - minimumLicenseRequired: 'gold', - enabled: true, - enabledInConfig: true, - enabledInLicense: false, - }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="configure-case-button"]').first().prop('isDisabled') - ).toBeTruthy(); - }); - }); - - it('should allow the user to enter configuration page with gold license and above', async () => { - useGetActionLicenseMock.mockReturnValue({ - ...defaultActionLicense, - actionLicense: { - id: '.jira', - name: 'Jira', - minimumLicenseRequired: 'gold', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }, - }); - - const wrapper = mount( - <TestProviders> - <AllCases userCanCrud={true} /> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="configure-case-button"]').first().prop('isDisabled') - ).toBeFalsy(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 941793084fd37..6d2edfd8de2e3 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -5,297 +5,42 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { - EuiBasicTable as _EuiBasicTable, - EuiContextMenuPanel, - EuiEmptyPrompt, - EuiFlexGroup, - EuiFlexItem, - EuiLoadingContent, - EuiProgress, - EuiTableSortingType, -} from '@elastic/eui'; -import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; -import { isEmpty, memoize } from 'lodash/fp'; -import styled, { css } from 'styled-components'; -import classnames from 'classnames'; +import React, { useCallback } from 'react'; import { useHistory } from 'react-router-dom'; -import * as i18n from './translations'; -import { CaseStatuses, CaseType } from '../../../../../cases/common'; -import { getCasesColumns } from './columns'; -import { Case, DeleteCase, FilterOptions, SortFieldCase, SubCase } from '../../containers/types'; -import { useGetCases, UpdateCase } from '../../containers/use_get_cases'; -import { useGetCasesStatus } from '../../containers/use_get_cases_status'; -import { useDeleteCases } from '../../containers/use_delete_cases'; -import { EuiBasicTableOnChange } from '../../../detections/pages/detection_engine/rules/types'; -import { Panel } from '../../../common/components/panel'; -import { - UtilityBar, - UtilityBarAction, - UtilityBarGroup, - UtilityBarSection, - UtilityBarText, -} from '../../../common/components/utility_bar'; +import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../../cases/common'; import { getCaseDetailsUrl, getConfigureCasesUrl, getCreateCaseUrl, useFormatUrl, } from '../../../common/components/link_to'; -import { getBulkItems } from '../bulk_actions'; -import { CaseHeaderPage } from '../case_header_page'; -import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; -import { getActions } from './actions'; -import { CasesTableFilters } from './table_filters'; -import { useUpdateCases } from '../../containers/use_bulk_update_case'; -import { useGetActionLicense } from '../../containers/use_get_action_license'; -import { getActionLicenseError } from '../use_push_to_service/helpers'; -import { CaseCallOut } from '../callout'; -import { ConfigureCaseButton } from '../configure_cases/button'; -import { ERROR_PUSH_SERVICE_CALLOUT_TITLE } from '../use_push_to_service/translations'; -import { LinkButton } from '../../../common/components/links'; import { SecurityPageName } from '../../../app/types'; import { useKibana } from '../../../common/lib/kibana'; -import { APP_ID, USE_RAC_CASES_UI } from '../../../../common/constants'; -import { Stats } from '../status'; -import { SELECTABLE_MESSAGE_COLLECTIONS } from '../../translations'; -import { getExpandedRowMap } from './expanded_row'; -import { isSelectedCasesIncludeCollections } from './helpers'; +import { APP_ID } from '../../../../common/constants'; -interface AllCasesNavProps { +export interface AllCasesNavProps { detailName: string; search?: string; subCaseId?: string; } -const Div = styled.div` - margin-top: ${({ theme }) => theme.eui.paddingSizes.m}; -`; - -const FlexItemDivider = styled(EuiFlexItem)` - ${({ theme }) => css` - .euiFlexGroup--gutterMedium > &.euiFlexItem { - border-right: ${theme.eui.euiBorderThin}; - padding-right: ${theme.eui.euiSize}; - margin-right: ${theme.eui.euiSize}; - } - `} -`; - -const ProgressLoader = styled(EuiProgress)` - ${({ theme }) => css` - top: 2px; - border-radius: ${theme.eui.euiBorderRadius}; - z-index: ${theme.eui.euiZHeader}; - `} -`; - -const getSortField = (field: string): SortFieldCase => { - if (field === SortFieldCase.createdAt) { - return SortFieldCase.createdAt; - } else if (field === SortFieldCase.closedAt) { - return SortFieldCase.closedAt; - } - return SortFieldCase.createdAt; -}; - -const EuiBasicTable: any = _EuiBasicTable; // eslint-disable-line @typescript-eslint/no-explicit-any -const BasicTable = styled(EuiBasicTable)` - ${({ theme }) => ` - .euiTableRow-isExpandedRow.euiTableRow-isSelectable .euiTableCellContent { - padding: 8px 0 8px 32px; - } - - &.isModal .euiTableRow.isDisabled { - cursor: not-allowed; - background-color: ${theme.eui.euiTableHoverClickableColor}; - } - - &.isModal .euiTableRow.euiTableRow-isExpandedRow .euiTableRowCell, - &.isModal .euiTableRow.euiTableRow-isExpandedRow:hover { - background-color: transparent; - } - - &.isModal .euiTableRow.euiTableRow-isExpandedRow { - .subCase:hover { - background-color: ${theme.eui.euiTableHoverClickableColor}; - } - } - `} -`; -BasicTable.displayName = 'BasicTable'; - interface AllCasesProps { - onRowClick?: (theCase?: Case | SubCase) => void; + alertData?: Omit<CommentRequestAlertType, 'type'>; + disabledStatuses?: CaseStatuses[]; isModal?: boolean; + onRowClick?: (theCase?: Case | SubCase) => void; + updateCase?: (newCase: Case) => void; userCanCrud: boolean; - disabledStatuses?: CaseStatuses[]; - disabledCases?: CaseType[]; } export const AllCases = React.memo<AllCasesProps>( - ({ onRowClick, isModal = false, userCanCrud, disabledStatuses, disabledCases = [] }) => { - const { cases: casesUi } = useKibana().services; + ({ alertData, disabledStatuses, isModal = false, onRowClick, updateCase, userCanCrud }) => { + const { + cases: casesUi, + application: { navigateToApp }, + } = useKibana().services; const history = useHistory(); - const { navigateToApp } = useKibana().services.application; const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.case); - const { actionLicense } = useGetActionLicense(); - const { - countOpenCases, - countInProgressCases, - countClosedCases, - isLoading: isCasesStatusLoading, - fetchCasesStatus, - } = useGetCasesStatus(); - const { - data, - dispatchUpdateCaseProperty, - filterOptions, - loading, - queryParams, - selectedCases, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - } = useGetCases(); - - // Delete case - const { - dispatchResetIsDeleted, - handleOnDeleteConfirm, - handleToggleModal, - isLoading: isDeleting, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); - - // Update case - const { - dispatchResetIsUpdated, - isLoading: isUpdating, - isUpdated, - updateBulkStatus, - } = useUpdateCases(); - const [deleteThisCase, setDeleteThisCase] = useState<DeleteCase>({ - title: '', - id: '', - type: null, - }); - const [deleteBulk, setDeleteBulk] = useState<DeleteCase[]>([]); - const filterRefetch = useRef<() => void>(); - const setFilterRefetch = useCallback( - (refetchFilter: () => void) => { - filterRefetch.current = refetchFilter; - }, - [filterRefetch] - ); - const refreshCases = useCallback( - (dataRefresh = true) => { - if (dataRefresh) refetchCases(); - fetchCasesStatus(); - setSelectedCases([]); - setDeleteBulk([]); - if (filterRefetch.current != null) { - filterRefetch.current(); - } - }, - [filterRefetch, refetchCases, setSelectedCases, fetchCasesStatus] - ); - - useEffect(() => { - if (isDeleted) { - refreshCases(); - dispatchResetIsDeleted(); - } - if (isUpdated) { - refreshCases(); - dispatchResetIsUpdated(); - } - }, [isDeleted, isUpdated, refreshCases, dispatchResetIsDeleted, dispatchResetIsUpdated]); - const confirmDeleteModal = useMemo( - () => ( - <ConfirmDeleteCaseModal - caseTitle={deleteThisCase.title} - isModalVisible={isDisplayConfirmDeleteModal} - isPlural={deleteBulk.length > 0} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind( - null, - deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] - )} - /> - ), - [ - deleteBulk, - deleteThisCase, - isDisplayConfirmDeleteModal, - handleToggleModal, - handleOnDeleteConfirm, - ] - ); - - const toggleDeleteModal = useCallback( - (deleteCase: Case) => { - handleToggleModal(); - setDeleteThisCase({ id: deleteCase.id, title: deleteCase.title, type: deleteCase.type }); - }, - [handleToggleModal] - ); - - const toggleBulkDeleteModal = useCallback( - (cases: Case[]) => { - handleToggleModal(); - if (cases.length === 1) { - const singleCase = cases[0]; - if (singleCase) { - return setDeleteThisCase({ - id: singleCase.id, - title: singleCase.title, - type: singleCase.type, - }); - } - } - const convertToDeleteCases: DeleteCase[] = cases.map(({ id, title, type }) => ({ - id, - title, - type, - })); - setDeleteBulk(convertToDeleteCases); - }, - [setDeleteBulk, handleToggleModal] - ); - - const handleUpdateCaseStatus = useCallback( - (status: string) => { - updateBulkStatus(selectedCases, status); - }, - [selectedCases, updateBulkStatus] - ); - - const getBulkItemsPopoverContent = useCallback( - (closePopover: () => void) => ( - <EuiContextMenuPanel - data-test-subj="cases-bulk-actions" - items={getBulkItems({ - caseStatus: filterOptions.status, - closePopover, - deleteCasesAction: toggleBulkDeleteModal, - selectedCases, - updateCaseStatus: handleUpdateCaseStatus, - includeCollections: isSelectedCasesIncludeCollections(selectedCases), - })} - /> - ), - [selectedCases, filterOptions.status, toggleBulkDeleteModal, handleUpdateCaseStatus] - ); - const handleDispatchUpdate = useCallback( - (args: Omit<UpdateCase, 'refetchCasesStatus'>) => { - dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); - }, - [dispatchUpdateCaseProperty, fetchCasesStatus] - ); const goToCreateCase = useCallback( (ev) => { @@ -311,123 +56,6 @@ export const AllCases = React.memo<AllCasesProps>( [navigateToApp, isModal, onRowClick, urlSearch] ); - const actions = useMemo( - () => - getActions({ - caseStatus: filterOptions.status, - deleteCaseOnClick: toggleDeleteModal, - dispatchUpdate: handleDispatchUpdate, - }), - [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] - ); - - const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); - - const tableOnChangeCallback = useCallback( - ({ page, sort }: EuiBasicTableOnChange) => { - let newQueryParams = queryParams; - if (sort) { - newQueryParams = { - ...newQueryParams, - sortField: getSortField(sort.field), - sortOrder: sort.direction, - }; - } - if (page) { - newQueryParams = { - ...newQueryParams, - page: page.index + 1, - perPage: page.size, - }; - } - setQueryParams(newQueryParams); - refreshCases(false); - }, - [queryParams, refreshCases, setQueryParams] - ); - - const onFilterChangedCallback = useCallback( - (newFilterOptions: Partial<FilterOptions>) => { - if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.closed) { - setQueryParams({ sortField: SortFieldCase.closedAt }); - } else if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.open) { - setQueryParams({ sortField: SortFieldCase.createdAt }); - } else if ( - newFilterOptions.status && - newFilterOptions.status === CaseStatuses['in-progress'] - ) { - setQueryParams({ sortField: SortFieldCase.updatedAt }); - } - setFilters(newFilterOptions); - refreshCases(false); - }, - [refreshCases, setQueryParams, setFilters] - ); - - const memoizedGetCasesColumns = useMemo( - () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status, isModal), - [actions, filterOptions.status, userCanCrud, isModal] - ); - - const itemIdToExpandedRowMap = useMemo( - () => - getExpandedRowMap({ - columns: memoizedGetCasesColumns, - data: data.cases, - isModal, - onSubCaseClick: onRowClick, - }), - [data.cases, isModal, memoizedGetCasesColumns, onRowClick] - ); - - const memoizedPagination = useMemo( - () => ({ - pageIndex: queryParams.page - 1, - pageSize: queryParams.perPage, - totalItemCount: data.total, - pageSizeOptions: [5, 10, 15, 20, 25], - }), - [data, queryParams] - ); - - const sorting: EuiTableSortingType<Case> = { - sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, - }; - - const euiBasicTableSelectionProps = useMemo<EuiTableSelectionType<Case>>( - () => ({ - onSelectionChange: setSelectedCases, - selectableMessage: (selectable) => (!selectable ? SELECTABLE_MESSAGE_COLLECTIONS : ''), - }), - [setSelectedCases] - ); - const isCasesLoading = useMemo( - () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, - [loading] - ); - const isDataEmpty = useMemo(() => data.total === 0, [data]); - - const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); - - const tableRowProps = useCallback( - (theCase: Case) => { - const onTableRowClick = memoize(() => { - if (onRowClick) { - onRowClick(theCase); - } - }); - - return { - 'data-test-subj': `cases-table-row-${theCase.id}`, - className: classnames({ isDisabled: theCase.type === CaseType.collection }), - ...(isModal && theCase.type !== CaseType.collection ? { onClick: onTableRowClick } : {}), - }; - }, - [isModal, onRowClick] - ); - - const enableBuckActions = userCanCrud && !isModal; - const goToCaseConfigure = useCallback( (ev) => { ev.preventDefault(); @@ -436,184 +64,26 @@ export const AllCases = React.memo<AllCasesProps>( [history, urlSearch] ); - return USE_RAC_CASES_UI ? ( - casesUi.getAllCases({ - configureCasesHref: formatUrl(getConfigureCasesUrl()), - createCaseHref: formatUrl(getCreateCaseUrl()), - getCaseDetailsHref: ({ detailName, subCaseId }: AllCasesNavProps) => { - return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); - }, - onCaseDetailsNavClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), - }); - }, - onConfigureCasesNavClick: goToCaseConfigure, - disabledCases, - disabledStatuses, - isModal, - onCreateCaseNavClick: goToCreateCase, - onRowClick, - userCanCrud, - }) - ) : ( - <> - {!isEmpty(actionsErrors) && ( - <CaseCallOut title={ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={actionsErrors} /> - )} - {!isModal && ( - <CaseHeaderPage title={i18n.PAGE_TITLE}> - <EuiFlexGroup - alignItems="center" - gutterSize="m" - responsive={false} - wrap={true} - data-test-subj="all-cases-header" - > - <EuiFlexItem grow={false}> - <Stats - dataTestSubj="openStatsHeader" - caseCount={countOpenCases} - caseStatus={CaseStatuses.open} - isLoading={isCasesStatusLoading} - /> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <Stats - dataTestSubj="inProgressStatsHeader" - caseCount={countInProgressCases} - caseStatus={CaseStatuses['in-progress']} - isLoading={isCasesStatusLoading} - /> - </EuiFlexItem> - <FlexItemDivider grow={false}> - <Stats - dataTestSubj="closedStatsHeader" - caseCount={countClosedCases} - caseStatus={CaseStatuses.closed} - isLoading={isCasesStatusLoading} - /> - </FlexItemDivider> - <EuiFlexItem grow={false}> - <ConfigureCaseButton - label={i18n.CONFIGURE_CASES_BUTTON} - isDisabled={!isEmpty(actionsErrors) || !userCanCrud} - showToolTip={!isEmpty(actionsErrors)} - msgTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].description : <></>} - titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} - urlSearch={urlSearch} - /> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <LinkButton - isDisabled={!userCanCrud} - fill - onClick={goToCreateCase} - href={formatUrl(getCreateCaseUrl())} - iconType="plusInCircle" - data-test-subj="createNewCaseBtn" - > - {i18n.CREATE_TITLE} - </LinkButton> - </EuiFlexItem> - </EuiFlexGroup> - </CaseHeaderPage> - )} - {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( - <ProgressLoader size="xs" color="accent" className="essentialAnimation" /> - )} - <TableWrap data-test-subj="table-wrap" loading={!isModal ? isCasesLoading : undefined}> - <CasesTableFilters - countClosedCases={data.countClosedCases} - countOpenCases={data.countOpenCases} - countInProgressCases={data.countInProgressCases} - onFilterChanged={onFilterChangedCallback} - initial={{ - search: filterOptions.search, - reporters: filterOptions.reporters, - tags: filterOptions.tags, - status: filterOptions.status, - }} - setFilterRefetch={setFilterRefetch} - disabledStatuses={disabledStatuses} - /> - {isCasesLoading && isDataEmpty ? ( - <Div> - <EuiLoadingContent data-test-subj="initialLoadingPanelAllCases" lines={10} /> - </Div> - ) : ( - <Div> - <UtilityBar border> - <UtilityBarSection> - <UtilityBarGroup> - <UtilityBarText data-test-subj="case-table-case-count"> - {i18n.SHOWING_CASES(data.total ?? 0)} - </UtilityBarText> - </UtilityBarGroup> - {!isModal && ( - <UtilityBarGroup data-test-subj="case-table-utility-bar-actions"> - {enableBuckActions && ( - <UtilityBarText data-test-subj="case-table-selected-case-count"> - {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} - </UtilityBarText> - )} - {enableBuckActions && ( - <UtilityBarAction - data-test-subj="case-table-bulk-actions" - iconSide="right" - iconType="arrowDown" - popoverContent={getBulkItemsPopoverContent} - > - {i18n.BULK_ACTIONS} - </UtilityBarAction> - )} - <UtilityBarAction iconSide="left" iconType="refresh" onClick={refreshCases}> - {i18n.REFRESH} - </UtilityBarAction> - </UtilityBarGroup> - )} - </UtilityBarSection> - </UtilityBar> - <BasicTable - columns={memoizedGetCasesColumns} - data-test-subj="cases-table" - isSelectable={enableBuckActions} - itemId="id" - items={data.cases} - itemIdToExpandedRowMap={itemIdToExpandedRowMap} - noItemsMessage={ - <EuiEmptyPrompt - title={<h3>{i18n.NO_CASES}</h3>} - titleSize="xs" - body={i18n.NO_CASES_BODY} - actions={ - <LinkButton - isDisabled={!userCanCrud} - fill - size="s" - onClick={goToCreateCase} - href={formatUrl(getCreateCaseUrl())} - iconType="plusInCircle" - data-test-subj="cases-table-add-case" - > - {i18n.ADD_NEW_CASE} - </LinkButton> - } - /> - } - onChange={tableOnChangeCallback} - pagination={memoizedPagination} - rowProps={tableRowProps} - selection={enableBuckActions ? euiBasicTableSelectionProps : undefined} - sorting={sorting} - className={classnames({ isModal })} - /> - </Div> - )} - </TableWrap> - {confirmDeleteModal} - </> - ); + return casesUi.getAllCases({ + alertData, + configureCasesHref: formatUrl(getConfigureCasesUrl()), + createCaseHref: formatUrl(getCreateCaseUrl()), + disabledStatuses, + getCaseDetailsHref: ({ detailName, subCaseId }: AllCasesNavProps) => { + return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + }, + isModal, + onCaseDetailsNavClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), + }); + }, + onConfigureCasesNavClick: goToCaseConfigure, + onCreateCaseNavClick: goToCreateCase, + onRowClick, + updateCase, + userCanCrud, + }); } ); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx deleted file mode 100644 index f31eda12b3399..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.test.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor } from '@testing-library/react'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { StatusFilter } from './status_filter'; -import { StatusAll } from '../status'; - -const stats = { - [StatusAll]: 0, - [CaseStatuses.open]: 2, - [CaseStatuses['in-progress']]: 5, - [CaseStatuses.closed]: 7, -}; - -describe('StatusFilter', () => { - const onStatusChanged = jest.fn(); - const defaultProps = { - selectedStatus: CaseStatuses.open, - onStatusChanged, - stats, - }; - - it('should render', () => { - const wrapper = mount(<StatusFilter {...defaultProps} />); - - expect(wrapper.find('[data-test-subj="case-status-filter"]').exists()).toBeTruthy(); - }); - - it('should call onStatusChanged when changing status to open', async () => { - const wrapper = mount(<StatusFilter {...defaultProps} />); - - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-open"]').simulate('click'); - await waitFor(() => { - expect(onStatusChanged).toBeCalledWith('open'); - }); - }); - - it('should call onStatusChanged when changing status to in-progress', async () => { - const wrapper = mount(<StatusFilter {...defaultProps} />); - - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').simulate('click'); - await waitFor(() => { - expect(onStatusChanged).toBeCalledWith('in-progress'); - }); - }); - - it('should call onStatusChanged when changing status to closed', async () => { - const wrapper = mount(<StatusFilter {...defaultProps} />); - - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-closed"]').simulate('click'); - await waitFor(() => { - expect(onStatusChanged).toBeCalledWith('closed'); - }); - }); - - it('should disabled selected statuses', () => { - const wrapper = mount( - <StatusFilter {...defaultProps} disabledStatuses={[CaseStatuses.closed]} /> - ); - - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - - expect( - wrapper.find('button[data-test-subj="case-status-filter-open"]').prop('disabled') - ).toBeFalsy(); - - expect( - wrapper.find('button[data-test-subj="case-status-filter-in-progress"]').prop('disabled') - ).toBeFalsy(); - - expect( - wrapper.find('button[data-test-subj="case-status-filter-closed"]').prop('disabled') - ).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.tsx deleted file mode 100644 index 34186a201cc05..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/status_filter.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiSuperSelect, EuiSuperSelectOption, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { Status, statuses, StatusAll, CaseStatusWithAllStatus } from '../status'; - -interface Props { - stats: Record<CaseStatusWithAllStatus, number | null>; - selectedStatus: CaseStatusWithAllStatus; - onStatusChanged: (status: CaseStatusWithAllStatus) => void; - disabledStatuses?: CaseStatusWithAllStatus[]; -} - -const StatusFilterComponent: React.FC<Props> = ({ - stats, - selectedStatus, - onStatusChanged, - disabledStatuses = [], -}) => { - const caseStatuses = Object.keys(statuses) as CaseStatusWithAllStatus[]; - const options: Array<EuiSuperSelectOption<CaseStatusWithAllStatus>> = [ - StatusAll, - ...caseStatuses, - ].map((status) => ({ - value: status, - inputDisplay: ( - <EuiFlexGroup gutterSize="xs" alignItems={'center'}> - <EuiFlexItem grow={false}> - <Status type={status} /> - </EuiFlexItem> - {status !== StatusAll && <EuiFlexItem grow={false}>{` (${stats[status]})`}</EuiFlexItem>} - </EuiFlexGroup> - ), - disabled: disabledStatuses.includes(status), - 'data-test-subj': `case-status-filter-${status}`, - })); - - return ( - <EuiSuperSelect - options={options} - valueOfSelected={selectedStatus} - onChange={onStatusChanged} - data-test-subj="case-status-filter" - /> - ); -}; - -export const StatusFilter = memo(StatusFilterComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx deleted file mode 100644 index c4486365cd292..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.test.tsx +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { TestProviders } from '../../../common/mock'; -import { useGetTags } from '../../containers/use_get_tags'; -import { useGetReporters } from '../../containers/use_get_reporters'; -import { DEFAULT_FILTER_OPTIONS } from '../../containers/use_get_cases'; -import { CasesTableFilters } from './table_filters'; - -jest.mock('../../containers/use_get_reporters'); -jest.mock('../../containers/use_get_tags'); - -const onFilterChanged = jest.fn(); -const fetchReporters = jest.fn(); -const fetchTags = jest.fn(); -const setFilterRefetch = jest.fn(); - -const props = { - countClosedCases: 1234, - countOpenCases: 99, - countInProgressCases: 54, - onFilterChanged, - initial: DEFAULT_FILTER_OPTIONS, - setFilterRefetch, -}; - -describe('CasesTableFilters ', () => { - beforeEach(() => { - jest.resetAllMocks(); - (useGetTags as jest.Mock).mockReturnValue({ tags: ['coke', 'pepsi'], fetchTags }); - (useGetReporters as jest.Mock).mockReturnValue({ - reporters: ['casetester'], - respReporters: [{ username: 'casetester' }], - isLoading: true, - isError: false, - fetchReporters, - }); - }); - - it('should render the case status filter dropdown', () => { - const wrapper = mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="case-status-filter"]`).first().exists()).toBeTruthy(); - }); - - it('should call onFilterChange when selected tags change', () => { - const wrapper = mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - wrapper.find(`[data-test-subj="options-filter-popover-button-Tags"]`).last().simulate('click'); - wrapper.find(`[data-test-subj="options-filter-popover-item-0"]`).last().simulate('click'); - - expect(onFilterChanged).toBeCalledWith({ tags: ['coke'] }); - }); - - it('should call onFilterChange when selected reporters change', () => { - const wrapper = mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - wrapper - .find(`[data-test-subj="options-filter-popover-button-Reporter"]`) - .last() - .simulate('click'); - - wrapper.find(`[data-test-subj="options-filter-popover-item-0"]`).last().simulate('click'); - - expect(onFilterChanged).toBeCalledWith({ reporters: [{ username: 'casetester' }] }); - }); - - it('should call onFilterChange when search changes', () => { - const wrapper = mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - - wrapper - .find(`[data-test-subj="search-cases"]`) - .last() - .simulate('keyup', { key: 'Enter', target: { value: 'My search' } }); - expect(onFilterChanged).toBeCalledWith({ search: 'My search' }); - }); - - it('should call onFilterChange when changing status', () => { - const wrapper = mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - - wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); - wrapper.find('button[data-test-subj="case-status-filter-closed"]').simulate('click'); - expect(onFilterChanged).toBeCalledWith({ status: CaseStatuses.closed }); - }); - - it('should call on load setFilterRefetch', () => { - mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - expect(setFilterRefetch).toHaveBeenCalled(); - }); - - it('should remove tag from selected tags when tag no longer exists', () => { - const ourProps = { - ...props, - initial: { - ...DEFAULT_FILTER_OPTIONS, - tags: ['pepsi', 'rc'], - }, - }; - mount( - <TestProviders> - <CasesTableFilters {...ourProps} /> - </TestProviders> - ); - expect(onFilterChanged).toHaveBeenCalledWith({ tags: ['pepsi'] }); - }); - - it('should remove reporter from selected reporters when reporter no longer exists', () => { - const ourProps = { - ...props, - initial: { - ...DEFAULT_FILTER_OPTIONS, - reporters: [ - { username: 'casetester', full_name: null, email: null }, - { username: 'batman', full_name: null, email: null }, - ], - }, - }; - mount( - <TestProviders> - <CasesTableFilters {...ourProps} /> - </TestProviders> - ); - expect(onFilterChanged).toHaveBeenCalledWith({ reporters: [{ username: 'casetester' }] }); - }); - - it('StatusFilterWrapper should have a fixed width of 180px', () => { - const wrapper = mount( - <TestProviders> - <CasesTableFilters {...props} /> - </TestProviders> - ); - - expect(wrapper.find('[data-test-subj="status-filter-wrapper"]').first()).toHaveStyleRule( - 'flex-basis', - '180px', - { - modifier: '&&', - } - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx deleted file mode 100644 index 434ae46fcfb7a..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useEffect, useState, useMemo } from 'react'; -import { isEqual } from 'lodash/fp'; -import styled from 'styled-components'; -import { EuiFlexGroup, EuiFlexItem, EuiFieldSearch, EuiFilterGroup } from '@elastic/eui'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { FilterOptions } from '../../containers/types'; -import { useGetTags } from '../../containers/use_get_tags'; -import { useGetReporters } from '../../containers/use_get_reporters'; -import { FilterPopover } from '../filter_popover'; -import { CaseStatusWithAllStatus, StatusAll } from '../status'; -import { StatusFilter } from './status_filter'; - -import * as i18n from './translations'; -interface CasesTableFiltersProps { - countClosedCases: number | null; - countInProgressCases: number | null; - countOpenCases: number | null; - onFilterChanged: (filterOptions: Partial<FilterOptions>) => void; - initial: FilterOptions; - setFilterRefetch: (val: () => void) => void; - disabledStatuses?: CaseStatuses[]; -} - -// Fix the width of the status dropdown to prevent hiding long text items -const StatusFilterWrapper = styled(EuiFlexItem)` - && { - flex-basis: 180px; - } -`; - -/** - * Collection of filters for filtering data within the CasesTable. Contains search bar, - * and tag selection - * - * @param onFilterChanged change listener to be notified on filter changes - */ - -const defaultInitial = { - search: '', - reporters: [], - status: StatusAll, - tags: [], -}; - -const CasesTableFiltersComponent = ({ - countClosedCases, - countOpenCases, - countInProgressCases, - onFilterChanged, - initial = defaultInitial, - setFilterRefetch, - disabledStatuses, -}: CasesTableFiltersProps) => { - const [selectedReporters, setSelectedReporters] = useState( - initial.reporters.map((r) => r.full_name ?? r.username ?? '') - ); - const [search, setSearch] = useState(initial.search); - const [selectedTags, setSelectedTags] = useState(initial.tags); - const { tags, fetchTags } = useGetTags(); - const { reporters, respReporters, fetchReporters } = useGetReporters(); - - const refetch = useCallback(() => { - fetchTags(); - fetchReporters(); - }, [fetchReporters, fetchTags]); - - useEffect(() => { - if (setFilterRefetch != null) { - setFilterRefetch(refetch); - } - }, [refetch, setFilterRefetch]); - - useEffect(() => { - if (selectedReporters.length) { - const newReporters = selectedReporters.filter((r) => reporters.includes(r)); - handleSelectedReporters(newReporters); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [reporters]); - - useEffect(() => { - if (selectedTags.length) { - const newTags = selectedTags.filter((t) => tags.includes(t)); - handleSelectedTags(newTags); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [tags]); - - const handleSelectedReporters = useCallback( - (newReporters) => { - if (!isEqual(newReporters, selectedReporters)) { - setSelectedReporters(newReporters); - const reportersObj = respReporters.filter( - (r) => newReporters.includes(r.username) || newReporters.includes(r.full_name) - ); - onFilterChanged({ reporters: reportersObj }); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedReporters, respReporters] - ); - - const handleSelectedTags = useCallback( - (newTags) => { - if (!isEqual(newTags, selectedTags)) { - setSelectedTags(newTags); - onFilterChanged({ tags: newTags }); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedTags] - ); - - const handleOnSearch = useCallback( - (newSearch) => { - const trimSearch = newSearch.trim(); - if (!isEqual(trimSearch, search)) { - setSearch(trimSearch); - onFilterChanged({ search: trimSearch }); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [search] - ); - - const onStatusChanged = useCallback( - (status: CaseStatusWithAllStatus) => { - onFilterChanged({ status }); - }, - [onFilterChanged] - ); - - const stats = useMemo( - () => ({ - [StatusAll]: null, - [CaseStatuses.open]: countOpenCases ?? 0, - [CaseStatuses['in-progress']]: countInProgressCases ?? 0, - [CaseStatuses.closed]: countClosedCases ?? 0, - }), - [countClosedCases, countInProgressCases, countOpenCases] - ); - - return ( - <EuiFlexGroup gutterSize="s" justifyContent="flexEnd"> - <EuiFlexItem> - <EuiFlexGroup gutterSize="s"> - <EuiFlexItem> - <EuiFieldSearch - aria-label={i18n.SEARCH_CASES} - data-test-subj="search-cases" - fullWidth - incremental={false} - placeholder={i18n.SEARCH_PLACEHOLDER} - onSearch={handleOnSearch} - /> - </EuiFlexItem> - <StatusFilterWrapper grow={false} data-test-subj="status-filter-wrapper"> - <StatusFilter - selectedStatus={initial.status} - onStatusChanged={onStatusChanged} - stats={stats} - disabledStatuses={disabledStatuses} - /> - </StatusFilterWrapper> - </EuiFlexGroup> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiFilterGroup> - <FilterPopover - buttonLabel={i18n.REPORTER} - onSelectedOptionsChanged={handleSelectedReporters} - selectedOptions={selectedReporters} - options={reporters} - optionsEmptyLabel={i18n.NO_REPORTERS_AVAILABLE} - /> - <FilterPopover - buttonLabel={i18n.TAGS} - onSelectedOptionsChanged={handleSelectedTags} - selectedOptions={selectedTags} - options={tags} - optionsEmptyLabel={i18n.NO_TAGS_AVAILABLE} - /> - </EuiFilterGroup> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -CasesTableFiltersComponent.displayName = 'CasesTableFiltersComponent'; - -export const CasesTableFilters = React.memo(CasesTableFiltersComponent); - -CasesTableFilters.displayName = 'CasesTableFilters'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/translations.ts b/x-pack/plugins/security_solution/public/cases/components/all_cases/translations.ts deleted file mode 100644 index ad44959ecb1dc..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/translations.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../../translations'; - -export const NO_CASES = i18n.translate('xpack.securitySolution.cases.caseTable.noCases.title', { - defaultMessage: 'No Cases', -}); -export const NO_CASES_BODY = i18n.translate('xpack.securitySolution.cases.caseTable.noCases.body', { - defaultMessage: - 'There are no cases to display. Please create a new case or change your filter settings above.', -}); - -export const ADD_NEW_CASE = i18n.translate('xpack.securitySolution.cases.caseTable.addNewCase', { - defaultMessage: 'Add New Case', -}); - -export const SHOWING_SELECTED_CASES = (totalRules: number) => - i18n.translate('xpack.securitySolution.cases.caseTable.selectedCasesTitle', { - values: { totalRules }, - defaultMessage: 'Selected {totalRules} {totalRules, plural, =1 {case} other {cases}}', - }); - -export const SHOWING_CASES = (totalRules: number) => - i18n.translate('xpack.securitySolution.cases.caseTable.showingCasesTitle', { - values: { totalRules }, - defaultMessage: 'Showing {totalRules} {totalRules, plural, =1 {case} other {cases}}', - }); - -export const UNIT = (totalCount: number) => - i18n.translate('xpack.securitySolution.cases.caseTable.unit', { - values: { totalCount }, - defaultMessage: `{totalCount, plural, =1 {case} other {cases}}`, - }); - -export const SEARCH_CASES = i18n.translate( - 'xpack.securitySolution.cases.caseTable.searchAriaLabel', - { - defaultMessage: 'Search cases', - } -); - -export const BULK_ACTIONS = i18n.translate('xpack.securitySolution.cases.caseTable.bulkActions', { - defaultMessage: 'Bulk actions', -}); - -export const EXTERNAL_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.caseTable.snIncident', - { - defaultMessage: 'External Incident', - } -); - -export const INCIDENT_MANAGEMENT_SYSTEM = i18n.translate( - 'xpack.securitySolution.cases.caseTable.incidentSystem', - { - defaultMessage: 'Incident Management System', - } -); - -export const SEARCH_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.cases.caseTable.searchPlaceholder', - { - defaultMessage: 'e.g. case name', - } -); - -export const CLOSED = i18n.translate('xpack.securitySolution.cases.caseTable.closed', { - defaultMessage: 'Closed', -}); - -export const DELETE = i18n.translate('xpack.securitySolution.cases.caseTable.delete', { - defaultMessage: 'Delete', -}); - -export const REQUIRES_UPDATE = i18n.translate( - 'xpack.securitySolution.cases.caseTable.requiresUpdate', - { - defaultMessage: ' requires update', - } -); - -export const UP_TO_DATE = i18n.translate('xpack.securitySolution.cases.caseTable.upToDate', { - defaultMessage: ' is up to date', -}); -export const NOT_PUSHED = i18n.translate('xpack.securitySolution.cases.caseTable.notPushed', { - defaultMessage: 'Not pushed', -}); - -export const REFRESH = i18n.translate('xpack.securitySolution.cases.caseTable.refreshTitle', { - defaultMessage: 'Refresh', -}); - -export const SERVICENOW_LINK_ARIA = i18n.translate( - 'xpack.securitySolution.cases.caseTable.serviceNowLinkAria', - { - defaultMessage: 'click to view the incident on servicenow', - } -); - -export const STATUS = i18n.translate('xpack.securitySolution.cases.caseTable.status', { - defaultMessage: 'Status', -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx b/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx deleted file mode 100644 index e90ae2b036866..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/bulk_actions/index.tsx +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiContextMenuItem } from '@elastic/eui'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { statuses, CaseStatusWithAllStatus } from '../status'; -import * as i18n from './translations'; -import { Case } from '../../containers/types'; - -interface GetBulkItems { - caseStatus: CaseStatusWithAllStatus; - closePopover: () => void; - deleteCasesAction: (cases: Case[]) => void; - selectedCases: Case[]; - updateCaseStatus: (status: string) => void; - includeCollections: boolean; -} - -export const getBulkItems = ({ - caseStatus, - closePopover, - deleteCasesAction, - selectedCases, - updateCaseStatus, - includeCollections, -}: GetBulkItems) => { - let statusMenuItems: JSX.Element[] = []; - - const openMenuItem = ( - <EuiContextMenuItem - data-test-subj="cases-bulk-open-button" - disabled={selectedCases.length === 0 || includeCollections} - key="cases-bulk-open-button" - icon={statuses[CaseStatuses.open].icon} - onClick={() => { - closePopover(); - updateCaseStatus(CaseStatuses.open); - }} - > - {statuses[CaseStatuses.open].actions.bulk.title} - </EuiContextMenuItem> - ); - - const inProgressMenuItem = ( - <EuiContextMenuItem - data-test-subj="cases-bulk-in-progress-button" - disabled={selectedCases.length === 0 || includeCollections} - key="cases-bulk-in-progress-button" - icon={statuses[CaseStatuses['in-progress']].icon} - onClick={() => { - closePopover(); - updateCaseStatus(CaseStatuses['in-progress']); - }} - > - {statuses[CaseStatuses['in-progress']].actions.bulk.title} - </EuiContextMenuItem> - ); - - const closeMenuItem = ( - <EuiContextMenuItem - data-test-subj="cases-bulk-close-button" - disabled={selectedCases.length === 0 || includeCollections} - key="cases-bulk-close-button" - icon={statuses[CaseStatuses.closed].icon} - onClick={() => { - closePopover(); - updateCaseStatus(CaseStatuses.closed); - }} - > - {statuses[CaseStatuses.closed].actions.bulk.title} - </EuiContextMenuItem> - ); - - switch (caseStatus) { - case CaseStatuses.open: - statusMenuItems = [inProgressMenuItem, closeMenuItem]; - break; - - case CaseStatuses['in-progress']: - statusMenuItems = [openMenuItem, closeMenuItem]; - break; - - case CaseStatuses.closed: - statusMenuItems = [openMenuItem, inProgressMenuItem]; - break; - - default: - break; - } - - return [ - ...statusMenuItems, - <EuiContextMenuItem - data-test-subj="cases-bulk-delete-button" - key={i18n.BULK_ACTION_DELETE_SELECTED} - icon="trash" - disabled={selectedCases.length === 0} - onClick={() => { - closePopover(); - deleteCasesAction(selectedCases); - }} - > - {i18n.BULK_ACTION_DELETE_SELECTED} - </EuiContextMenuItem>, - ]; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/bulk_actions/translations.ts b/x-pack/plugins/security_solution/public/cases/components/bulk_actions/translations.ts deleted file mode 100644 index 1171495f4a202..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/bulk_actions/translations.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const BULK_ACTION_DELETE_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.deleteSelectedTitle', - { - defaultMessage: 'Delete selected', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.test.tsx deleted file mode 100644 index ba0c725f99460..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.test.tsx +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { useDeleteCases } from '../../containers/use_delete_cases'; -import { TestProviders } from '../../../common/mock'; -import { basicCase, basicPush } from '../../containers/mock'; -import { Actions } from './actions'; -import * as i18n from '../case_view/translations'; -jest.mock('../../containers/use_delete_cases'); -const useDeleteCasesMock = useDeleteCases as jest.Mock; - -jest.mock('react-router-dom', () => { - const original = jest.requireActual('react-router-dom'); - - return { - ...original, - useHistory: () => ({ - useHistory: jest.fn(), - }), - }; -}); - -describe('CaseView actions', () => { - const handleOnDeleteConfirm = jest.fn(); - const handleToggleModal = jest.fn(); - const dispatchResetIsDeleted = jest.fn(); - const defaultDeleteState = { - dispatchResetIsDeleted, - handleToggleModal, - handleOnDeleteConfirm, - isLoading: false, - isError: false, - isDeleted: false, - isDisplayConfirmDeleteModal: false, - }; - - beforeEach(() => { - jest.resetAllMocks(); - useDeleteCasesMock.mockImplementation(() => defaultDeleteState); - }); - - it('clicking trash toggles modal', () => { - const wrapper = mount( - <TestProviders> - <Actions caseData={basicCase} currentExternalIncident={null} /> - </TestProviders> - ); - - expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeFalsy(); - - wrapper.find('button[data-test-subj="property-actions-ellipses"]').first().simulate('click'); - wrapper.find('button[data-test-subj="property-actions-trash"]').simulate('click'); - expect(handleToggleModal).toHaveBeenCalled(); - }); - - it('toggle delete modal and confirm', () => { - useDeleteCasesMock.mockImplementation(() => ({ - ...defaultDeleteState, - isDisplayConfirmDeleteModal: true, - })); - const wrapper = mount( - <TestProviders> - <Actions caseData={basicCase} currentExternalIncident={null} /> - </TestProviders> - ); - - expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeTruthy(); - wrapper.find('button[data-test-subj="confirmModalConfirmButton"]').simulate('click'); - expect(handleOnDeleteConfirm.mock.calls[0][0]).toEqual([ - { id: basicCase.id, title: basicCase.title, type: 'individual' }, - ]); - }); - - it('displays active incident link', () => { - const wrapper = mount( - <TestProviders> - <Actions - caseData={basicCase} - currentExternalIncident={{ - ...basicPush, - firstPushIndex: 5, - lastPushIndex: 5, - commentsToUpdate: [], - hasDataToPush: false, - }} - /> - </TestProviders> - ); - - expect(wrapper.find('[data-test-subj="confirm-delete-case-modal"]').exists()).toBeFalsy(); - - wrapper.find('button[data-test-subj="property-actions-ellipses"]').first().simulate('click'); - expect( - wrapper.find('[data-test-subj="property-actions-popout"]').first().prop('aria-label') - ).toEqual(i18n.VIEW_INCIDENT(basicPush.externalTitle)); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.tsx deleted file mode 100644 index 74d2a40f1ceb9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/actions.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { isEmpty } from 'lodash/fp'; -import React, { useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; -import * as i18n from '../case_view/translations'; -import { useDeleteCases } from '../../containers/use_delete_cases'; -import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; -import { PropertyActions } from '../property_actions'; -import { Case } from '../../containers/types'; -import { CaseService } from '../../containers/use_get_case_user_actions'; - -interface CaseViewActions { - caseData: Case; - currentExternalIncident: CaseService | null; - disabled?: boolean; -} - -const ActionsComponent: React.FC<CaseViewActions> = ({ - caseData, - currentExternalIncident, - disabled = false, -}) => { - const history = useHistory(); - // Delete case - const { - handleToggleModal, - handleOnDeleteConfirm, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); - - const confirmDeleteModal = useMemo( - () => ( - <ConfirmDeleteCaseModal - caseTitle={caseData.title} - isModalVisible={isDisplayConfirmDeleteModal} - isPlural={false} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind(null, [ - { id: caseData.id, title: caseData.title, type: caseData.type }, - ])} - /> - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [isDisplayConfirmDeleteModal, caseData] - ); - const propertyActions = useMemo( - () => [ - { - disabled, - iconType: 'trash', - label: i18n.DELETE_CASE, - onClick: handleToggleModal, - }, - ...(currentExternalIncident != null && !isEmpty(currentExternalIncident?.externalUrl) - ? [ - { - iconType: 'popout', - label: i18n.VIEW_INCIDENT(currentExternalIncident?.externalTitle ?? ''), - onClick: () => window.open(currentExternalIncident?.externalUrl, '_blank'), - }, - ] - : []), - ], - [disabled, handleToggleModal, currentExternalIncident] - ); - - if (isDeleted) { - history.push('/'); - return null; - } - return ( - <> - <PropertyActions propertyActions={propertyActions} /> - {confirmDeleteModal} - </> - ); -}; - -export const Actions = React.memo(ActionsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts deleted file mode 100644 index 64d37de0a6ea9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CaseStatuses } from '../../../../../cases/common'; -import { basicCase } from '../../containers/mock'; -import { getStatusDate, getStatusTitle } from './helpers'; - -describe('helpers', () => { - const caseData = { - ...basicCase, - status: CaseStatuses.open, - createdAt: 'createAt', - updatedAt: 'updatedAt', - closedAt: 'closedAt', - }; - - describe('getStatusDate', () => { - it('it return the createdAt when the status is open', () => { - expect(getStatusDate(caseData)).toBe(caseData.createdAt); - }); - - it('it return the createdAt when the status is in-progress', () => { - expect(getStatusDate({ ...caseData, status: CaseStatuses['in-progress'] })).toBe( - caseData.updatedAt - ); - }); - - it('it return the createdAt when the status is closed', () => { - expect(getStatusDate({ ...caseData, status: CaseStatuses.closed })).toBe(caseData.closedAt); - }); - }); - - describe('getStatusTitle', () => { - it('it return the correct title for open status', () => { - expect(getStatusTitle(CaseStatuses.open)).toBe('Case opened'); - }); - - it('it return the correct title for in-progress status', () => { - expect(getStatusTitle(CaseStatuses['in-progress'])).toBe('Case in progress'); - }); - - it('it return the correct title for closed status', () => { - expect(getStatusTitle(CaseStatuses.closed)).toBe('Case closed'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts deleted file mode 100644 index 9dd666c72335b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/helpers.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CaseStatuses } from '../../../../../cases/common'; -import { Case } from '../../containers/types'; -import { statuses } from '../status'; - -export const getStatusDate = (theCase: Case): string | null => { - if (theCase.status === CaseStatuses.open) { - return theCase.createdAt; - } else if (theCase.status === CaseStatuses['in-progress']) { - return theCase.updatedAt; - } else if (theCase.status === CaseStatuses.closed) { - return theCase.closedAt; - } - - return null; -}; - -export const getStatusTitle = (status: CaseStatuses) => statuses[status].actionBar.title; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.test.tsx deleted file mode 100644 index b6158946aa82d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.test.tsx +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { basicCase } from '../../containers/mock'; -import { CaseActionBar } from '.'; -import { TestProviders } from '../../../common/mock'; - -describe('CaseActionBar', () => { - const onRefresh = jest.fn(); - const onUpdateField = jest.fn(); - const defaultProps = { - caseData: basicCase, - isLoading: false, - onRefresh, - onUpdateField, - currentExternalIncident: null, - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('it renders', () => { - const wrapper = mount( - <TestProviders> - <CaseActionBar {...defaultProps} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="case-view-status"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="case-refresh"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="case-view-actions"]`).exists()).toBeTruthy(); - }); - - it('it should show correct status', () => { - const wrapper = mount( - <TestProviders> - <CaseActionBar {...defaultProps} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toBe( - 'Open' - ); - }); - - it('it should show the correct date', () => { - const wrapper = mount( - <TestProviders> - <CaseActionBar {...defaultProps} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).prop('value')).toBe( - basicCase.createdAt - ); - }); - - it('it call onRefresh', () => { - const wrapper = mount( - <TestProviders> - <CaseActionBar {...defaultProps} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj="case-refresh"]`).first().simulate('click'); - expect(onRefresh).toHaveBeenCalled(); - }); - - it('it should call onUpdateField when changing status', () => { - const wrapper = mount( - <TestProviders> - <CaseActionBar {...defaultProps} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); - wrapper - .find(`[data-test-subj="case-view-status-dropdown-in-progress"] button`) - .simulate('click'); - - expect(onUpdateField).toHaveBeenCalledWith({ key: 'status', value: 'in-progress' }); - }); - - it('it should call onUpdateField when changing syncAlerts setting', () => { - const wrapper = mount( - <TestProviders> - <CaseActionBar {...defaultProps} /> - </TestProviders> - ); - - wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); - - expect(onUpdateField).toHaveBeenCalledWith({ - key: 'settings', - value: { - syncAlerts: false, - }, - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx deleted file mode 100644 index fd4e49400d464..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/index.tsx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useCallback } from 'react'; -import styled, { css } from 'styled-components'; -import { - EuiButtonEmpty, - EuiDescriptionList, - EuiDescriptionListDescription, - EuiDescriptionListTitle, - EuiFlexGroup, - EuiFlexItem, - EuiIconTip, -} from '@elastic/eui'; -import { CaseStatuses, CaseType } from '../../../../../cases/common'; -import * as i18n from '../case_view/translations'; -import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; -import { Actions } from './actions'; -import { Case } from '../../containers/types'; -import { CaseService } from '../../containers/use_get_case_user_actions'; -import { StatusContextMenu } from './status_context_menu'; -import { getStatusDate, getStatusTitle } from './helpers'; -import { SyncAlertsSwitch } from '../case_settings/sync_alerts_switch'; -import { OnUpdateFields } from '../case_view'; - -const MyDescriptionList = styled(EuiDescriptionList)` - ${({ theme }) => css` - & { - padding-right: ${theme.eui.euiSizeL}; - border-right: ${theme.eui.euiBorderThin}; - } - `} -`; - -interface CaseActionBarProps { - caseData: Case; - currentExternalIncident: CaseService | null; - disabled?: boolean; - isLoading: boolean; - onRefresh: () => void; - onUpdateField: (args: OnUpdateFields) => void; -} -const CaseActionBarComponent: React.FC<CaseActionBarProps> = ({ - caseData, - currentExternalIncident, - disabled = false, - isLoading, - onRefresh, - onUpdateField, -}) => { - const date = useMemo(() => getStatusDate(caseData), [caseData]); - const title = useMemo(() => getStatusTitle(caseData.status), [caseData.status]); - const onStatusChanged = useCallback( - (status: CaseStatuses) => - onUpdateField({ - key: 'status', - value: status, - }), - [onUpdateField] - ); - - const onSyncAlertsChanged = useCallback( - (syncAlerts: boolean) => - onUpdateField({ - key: 'settings', - value: { ...caseData.settings, syncAlerts }, - }), - [caseData.settings, onUpdateField] - ); - - return ( - <EuiFlexGroup gutterSize="l" justifyContent="flexEnd" data-test-subj="case-action-bar-wrapper"> - <EuiFlexItem grow={false}> - <MyDescriptionList compressed> - <EuiFlexGroup> - {caseData.type !== CaseType.collection && ( - <EuiFlexItem grow={false} data-test-subj="case-view-status"> - <EuiDescriptionListTitle>{i18n.STATUS}</EuiDescriptionListTitle> - <EuiDescriptionListDescription> - <StatusContextMenu - currentStatus={caseData.status} - onStatusChanged={onStatusChanged} - /> - </EuiDescriptionListDescription> - </EuiFlexItem> - )} - <EuiFlexItem> - <EuiDescriptionListTitle>{title}</EuiDescriptionListTitle> - <EuiDescriptionListDescription> - <FormattedRelativePreferenceDate - data-test-subj={'case-action-bar-status-date'} - value={date} - /> - </EuiDescriptionListDescription> - </EuiFlexItem> - </EuiFlexGroup> - </MyDescriptionList> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiDescriptionList compressed> - <EuiFlexGroup gutterSize="l" alignItems="center"> - <EuiFlexItem> - <EuiDescriptionListTitle> - <EuiFlexGroup component="span" alignItems="center" gutterSize="xs"> - <EuiFlexItem grow={false}> - <span>{i18n.SYNC_ALERTS}</span> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiIconTip content={i18n.SYNC_ALERTS_HELP} /> - </EuiFlexItem> - </EuiFlexGroup> - </EuiDescriptionListTitle> - <EuiDescriptionListDescription> - <SyncAlertsSwitch - disabled={disabled || isLoading} - isSynced={caseData.settings.syncAlerts} - onSwitchChange={onSyncAlertsChanged} - /> - </EuiDescriptionListDescription> - </EuiFlexItem> - <EuiFlexItem> - <EuiButtonEmpty data-test-subj="case-refresh" iconType="refresh" onClick={onRefresh}> - {i18n.CASE_REFRESH} - </EuiButtonEmpty> - </EuiFlexItem> - <EuiFlexItem grow={false} data-test-subj="case-view-actions"> - <Actions - caseData={caseData} - currentExternalIncident={currentExternalIncident} - disabled={disabled} - /> - </EuiFlexItem> - </EuiFlexGroup> - </EuiDescriptionList> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const CaseActionBar = React.memo(CaseActionBarComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx deleted file mode 100644 index 1f3b9c39017d9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.test.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { StatusContextMenu } from './status_context_menu'; - -describe('SyncAlertsSwitch', () => { - const onStatusChanged = jest.fn(); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('it renders', async () => { - const wrapper = mount( - <StatusContextMenu currentStatus={CaseStatuses.open} onStatusChanged={onStatusChanged} /> - ); - - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).exists()).toBeTruthy(); - }); - - it('it renders the current status correctly', async () => { - const wrapper = mount( - <StatusContextMenu currentStatus={CaseStatuses.closed} onStatusChanged={onStatusChanged} /> - ); - - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toBe( - 'Closed' - ); - }); - - it('it changes the status', async () => { - const wrapper = mount( - <StatusContextMenu currentStatus={CaseStatuses.open} onStatusChanged={onStatusChanged} /> - ); - - wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).simulate('click'); - wrapper - .find(`[data-test-subj="case-view-status-dropdown-in-progress"] button`) - .simulate('click'); - - expect(onStatusChanged).toHaveBeenCalledWith('in-progress'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx b/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx deleted file mode 100644 index 298d0d7695e8e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_action_bar/status_context_menu.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback, useMemo, useState } from 'react'; -import { memoize } from 'lodash/fp'; -import { EuiPopover, EuiContextMenuPanel, EuiContextMenuItem } from '@elastic/eui'; -import { caseStatuses, CaseStatuses } from '../../../../../cases/common'; -import { Status } from '../status'; - -interface Props { - currentStatus: CaseStatuses; - onStatusChanged: (status: CaseStatuses) => void; -} - -const StatusContextMenuComponent: React.FC<Props> = ({ currentStatus, onStatusChanged }) => { - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - const closePopover = useCallback(() => setIsPopoverOpen(false), []); - const openPopover = useCallback(() => setIsPopoverOpen(true), []); - const popOverButton = useMemo( - () => <Status type={currentStatus} withArrow onClick={openPopover} />, - [currentStatus, openPopover] - ); - - const onContextMenuItemClick = useMemo( - () => - memoize<(status: CaseStatuses) => () => void>((status) => () => { - closePopover(); - onStatusChanged(status); - }), - [closePopover, onStatusChanged] - ); - - const panelItems = caseStatuses.map((status: CaseStatuses) => ( - <EuiContextMenuItem - key={status} - icon={status === currentStatus ? 'check' : 'empty'} - onClick={onContextMenuItemClick(status)} - data-test-subj={`case-view-status-dropdown-${status}`} - > - <Status type={status} /> - </EuiContextMenuItem> - )); - - return ( - <> - <EuiPopover - id="caseStatusPopover" - button={popOverButton} - isOpen={isPopoverOpen} - closePopover={closePopover} - anchorPosition="downLeft" - data-test-subj="case-view-status-dropdown" - > - <EuiContextMenuPanel items={panelItems} /> - </EuiPopover> - </> - ); -}; - -export const StatusContextMenu = memo(StatusContextMenuComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.test.tsx deleted file mode 100644 index f1e4bea2e57ee..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor } from '@testing-library/react'; - -import { SyncAlertsSwitch } from './sync_alerts_switch'; - -describe('SyncAlertsSwitch', () => { - it('it renders', async () => { - const wrapper = mount(<SyncAlertsSwitch disabled={false} />); - - expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).exists()).toBeTruthy(); - }); - - it('it toggles the switch', async () => { - const wrapper = mount(<SyncAlertsSwitch disabled={false} />); - - wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); - - await waitFor(() => { - expect(wrapper.find('[data-test-subj="sync-alerts-switch"]').first().prop('checked')).toBe( - false - ); - }); - }); - - it('it disables the switch', async () => { - const wrapper = mount(<SyncAlertsSwitch disabled={true} />); - - expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).first().prop('disabled')).toBe( - true - ); - }); - - it('it start as off', async () => { - const wrapper = mount(<SyncAlertsSwitch disabled={false} isSynced={false} showLabel={true} />); - - expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).first().text()).toBe('Off'); - }); - - it('it shows the correct labels', async () => { - const wrapper = mount(<SyncAlertsSwitch disabled={false} showLabel={true} />); - - expect(wrapper.find('[data-test-subj="sync-alerts-switch"]').first().text()).toBe('On'); - wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); - - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="sync-alerts-switch"]`).first().text()).toBe('Off'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.tsx b/x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.tsx deleted file mode 100644 index a19640339acc6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_settings/sync_alerts_switch.tsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback, useState } from 'react'; -import { EuiSwitch } from '@elastic/eui'; - -import * as i18n from '../../translations'; - -interface Props { - disabled: boolean; - isSynced?: boolean; - showLabel?: boolean; - onSwitchChange?: (isSynced: boolean) => void; -} - -const SyncAlertsSwitchComponent: React.FC<Props> = ({ - disabled, - isSynced = true, - showLabel = false, - onSwitchChange, -}) => { - const [isOn, setIsOn] = useState(isSynced); - - const onChange = useCallback(() => { - if (onSwitchChange) { - onSwitchChange(!isOn); - } - - setIsOn(!isOn); - }, [isOn, onSwitchChange]); - - return ( - <EuiSwitch - label={isOn ? i18n.SYNC_ALERTS_SWITCH_LABEL_ON : i18n.SYNC_ALERTS_SWITCH_LABEL_OFF} - showLabel={showLabel} - checked={isOn} - onChange={onChange} - disabled={disabled} - data-test-subj="sync-alerts-switch" - /> - ); -}; - -SyncAlertsSwitchComponent.displayName = 'SyncAlertsSwitchComponent'; - -export const SyncAlertsSwitch = memo(SyncAlertsSwitchComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx deleted file mode 100644 index 4e783d6c3410f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/case_view_from_plugin.tsx +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback } from 'react'; -import { useDispatch } from 'react-redux'; -import { useHistory } from 'react-router-dom'; -import { SearchResponse } from 'elasticsearch'; -import { isEmpty } from 'lodash'; -import { Case } from '../../containers/types'; -import { - getCaseDetailsUrl, - getCaseDetailsUrlWithCommentId, - getCaseUrl, - getConfigureCasesUrl, - getRuleDetailsUrl, - useFormatUrl, -} from '../../../common/components/link_to'; -import { TimelineNonEcsData } from '../../../../common/search_strategy'; -import { TimelineId } from '../../../../common/types/timeline'; -import { SecurityPageName } from '../../../app/types'; -import { KibanaServices, useKibana } from '../../../common/lib/kibana'; -import { APP_ID, DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../common/constants'; -import { formatAlertToEcsSignal, useFetchAlertData } from '../user_action_tree/helpers'; -import { timelineActions } from '../../../timelines/store/timeline'; -import { useSourcererScope } from '../../../common/containers/sourcerer'; -import { SourcererScopeName } from '../../../common/store/sourcerer/model'; -import { DetailsPanel } from '../../../timelines/components/side_panel'; -import { SEND_ALERT_TO_TIMELINE } from '../user_action_tree/translations'; -import { InvestigateInTimelineAction } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_timeline_action'; -import { buildAlertsQuery } from './helpers'; -import { Ecs } from '../../../../common/ecs'; - -interface Props { - caseId: string; - subCaseId?: string; - userCanCrud: boolean; -} - -export interface OnUpdateFields { - key: keyof Case; - value: Case[keyof Case]; - onSuccess?: () => void; - onError?: () => void; -} - -export interface CaseProps extends Props { - fetchCase: () => void; - caseData: Case; - updateCase: (newCase: Case) => void; -} - -const TimelineDetailsPanel = () => { - const { browserFields, docValueFields } = useSourcererScope(SourcererScopeName.detections); - - return ( - <DetailsPanel - browserFields={browserFields} - docValueFields={docValueFields} - isFlyoutView - timelineId={TimelineId.casePage} - /> - ); -}; - -const InvestigateInTimelineActionComponent = (alertIds: string[]) => { - const EMPTY_ARRAY: TimelineNonEcsData[] = []; - const fetchEcsAlertsData = async (fetchAlertIds?: string[]): Promise<Ecs[]> => { - if (isEmpty(fetchAlertIds)) { - return []; - } - const alertResponse = await KibanaServices.get().http.fetch< - SearchResponse<{ '@timestamp': string; [key: string]: unknown }> - >(DETECTION_ENGINE_QUERY_SIGNALS_URL, { - method: 'POST', - body: JSON.stringify(buildAlertsQuery(fetchAlertIds ?? [])), - }); - return ( - alertResponse?.hits.hits.reduce<Ecs[]>( - (acc, { _id, _index, _source }) => [ - ...acc, - { - ...formatAlertToEcsSignal(_source as {}), - _id, - _index, - timestamp: _source['@timestamp'], - }, - ], - [] - ) ?? [] - ); - }; - - return ( - <InvestigateInTimelineAction - ariaLabel={SEND_ALERT_TO_TIMELINE} - alertIds={alertIds} - key="investigate-in-timeline" - ecsRowData={null} - fetchEcsAlertsData={fetchEcsAlertsData} - nonEcsRowData={EMPTY_ARRAY} - /> - ); -}; - -export const CaseViewFromPlugin = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { - const { - cases: casesUi, - application: { navigateToApp }, - } = useKibana().services; - const history = useHistory(); - const dispatch = useDispatch(); - const { formatUrl, search } = useFormatUrl(SecurityPageName.case); - const { formatUrl: detectionsFormatUrl, search: detectionsUrlSearch } = useFormatUrl( - SecurityPageName.detections - ); - - const allCasesLink = getCaseUrl(search); - const formattedAllCasesLink = formatUrl(allCasesLink); - const backToAllCasesOnClick = useCallback( - (ev) => { - ev.preventDefault(); - history.push(allCasesLink); - }, - [allCasesLink, history] - ); - const caseDetailsLink = formatUrl(getCaseDetailsUrl({ id: caseId }), { absolute: true }); - const getCaseDetailHrefWithCommentId = (commentId: string) => { - return formatUrl(getCaseDetailsUrlWithCommentId({ id: caseId, commentId, subCaseId }), { - absolute: true, - }); - }; - - const configureCasesHref = formatUrl(getConfigureCasesUrl()); - const onConfigureCasesNavClick = useCallback( - (ev) => { - ev.preventDefault(); - history.push(getConfigureCasesUrl(search)); - }, - [history, search] - ); - - const onDetectionsRuleDetailsClick = useCallback( - (ruleId: string | null | undefined) => { - navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { - path: getRuleDetailsUrl(ruleId ?? ''), - }); - }, - [navigateToApp] - ); - - const getDetectionsRuleDetailsHref = useCallback( - (ruleId) => { - return detectionsFormatUrl(getRuleDetailsUrl(ruleId ?? '', detectionsUrlSearch)); - }, - [detectionsFormatUrl, detectionsUrlSearch] - ); - - const showAlertDetails = useCallback( - (alertId: string, index: string) => { - dispatch( - timelineActions.toggleDetailPanel({ - panelView: 'eventDetail', - timelineId: TimelineId.casePage, - params: { - eventId: alertId, - indexName: index, - }, - }) - ); - }, - [dispatch] - ); - - const onComponentInitialized = useCallback(() => { - dispatch( - timelineActions.createTimeline({ - id: TimelineId.casePage, - columns: [], - indexNames: [], - expandedDetail: {}, - show: false, - }) - ); - }, [dispatch]); - - return casesUi.getCaseView({ - allCasesHref: formattedAllCasesLink, - backToAllCasesOnClick, - caseDetailsHref: caseDetailsLink, - caseId, - configureCasesHref, - getCaseDetailHrefWithCommentId, - getRuleDetailsHref: getDetectionsRuleDetailsHref, - onComponentInitialized, - onConfigureCasesNavClick, - onRuleDetailsClick: onDetectionsRuleDetailsClick, - renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, - renderTimelineDetailsPanel: TimelineDetailsPanel, - showAlertDetails, - subCaseId, - useFetchAlertData, - userCanCrud, - }); -}); - -CaseViewFromPlugin.displayName = 'CaseViewFromPlugin'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx index 657a19d40fdd9..5eb0a03fc5db7 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.test.tsx @@ -5,57 +5,9 @@ * 2.0. */ -import { AssociationType, CommentType } from '../../../../../cases/common'; -import { Comment } from '../../containers/types'; - -import { getManualAlertIdsWithNoRuleId, buildAlertsQuery } from './helpers'; - -const comments: Comment[] = [ - { - associationType: AssociationType.case, - type: CommentType.alert, - alertId: 'alert-id-1', - index: 'alert-index-1', - id: 'comment-id', - createdAt: '2020-02-19T23:06:33.798Z', - createdBy: { username: 'elastic' }, - rule: { - id: null, - name: null, - }, - pushedAt: null, - pushedBy: null, - updatedAt: null, - updatedBy: null, - version: 'WzQ3LDFc', - }, - { - associationType: AssociationType.case, - type: CommentType.alert, - alertId: 'alert-id-2', - index: 'alert-index-2', - id: 'comment-id', - createdAt: '2020-02-19T23:06:33.798Z', - createdBy: { username: 'elastic' }, - pushedAt: null, - pushedBy: null, - rule: { - id: 'rule-id-2', - name: 'rule-name-2', - }, - updatedAt: null, - updatedBy: null, - version: 'WzQ3LDFc', - }, -]; +import { buildAlertsQuery } from './helpers'; describe('Case view helpers', () => { - describe('getAlertIdsFromComments', () => { - it('it returns the alert id from the comments where rule is not defined', () => { - expect(getManualAlertIdsWithNoRuleId(comments)).toEqual(['alert-id-1']); - }); - }); - describe('buildAlertsQuery', () => { it('it builds the alerts query', () => { expect(buildAlertsQuery(['alert-id-1', 'alert-id-2'])).toEqual({ diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts index 741880d886c89..2f35f5d9cd137 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts @@ -5,21 +5,12 @@ * 2.0. */ -import { isEmpty } from 'lodash'; -import { CommentType } from '../../../../../cases/common'; -import { Comment } from '../../containers/types'; - -export const getManualAlertIdsWithNoRuleId = (comments: Comment[]): string[] => { - const dedupeAlerts = comments.reduce((alertIds, comment: Comment) => { - if (comment.type === CommentType.alert && isEmpty(comment.rule.id)) { - const ids = Array.isArray(comment.alertId) ? comment.alertId : [comment.alertId]; - ids.forEach((id) => alertIds.add(id)); - return alertIds; - } - return alertIds; - }, new Set<string>()); - return [...dedupeAlerts]; -}; +import { isObject, get, isString, isNumber } from 'lodash'; +import { useMemo } from 'react'; +import { Ecs } from '../../../../common/ecs'; +import { useSourcererScope } from '../../../common/containers/sourcerer'; +import { SourcererScopeName } from '../../../common/store/sourcerer/model'; +import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; // TODO we need to allow -> docValueFields: [{ field: "@timestamp" }], export const buildAlertsQuery = (alertIds: string[]) => { @@ -39,3 +30,102 @@ export const buildAlertsQuery = (alertIds: string[]) => { size: 10000, }; }; + +export const toStringArray = (value: unknown): string[] => { + if (Array.isArray(value)) { + return value.reduce<string[]>((acc, v) => { + if (v != null) { + switch (typeof v) { + case 'number': + case 'boolean': + return [...acc, v.toString()]; + case 'object': + try { + return [...acc, JSON.stringify(v)]; + } catch { + return [...acc, 'Invalid Object']; + } + case 'string': + return [...acc, v]; + default: + return [...acc, `${v}`]; + } + } + return acc; + }, []); + } else if (value == null) { + return []; + } else if (!Array.isArray(value) && typeof value === 'object') { + try { + return [JSON.stringify(value)]; + } catch { + return ['Invalid Object']; + } + } else { + return [`${value}`]; + } +}; + +export const formatAlertToEcsSignal = (alert: {}): Ecs => + Object.keys(alert).reduce<Ecs>((accumulator, key) => { + const item = get(alert, key); + if (item != null && isObject(item)) { + return { ...accumulator, [key]: formatAlertToEcsSignal(item) }; + } else if (Array.isArray(item) || isString(item) || isNumber(item)) { + return { ...accumulator, [key]: toStringArray(item) }; + } + return accumulator; + }, {} as Ecs); +interface Signal { + rule: { + id: string; + name: string; + to: string; + from: string; + }; +} + +interface SignalHit { + _id: string; + _index: string; + _source: { + '@timestamp': string; + signal: Signal; + }; +} + +export interface Alert { + _id: string; + _index: string; + '@timestamp': string; + signal: Signal; + [key: string]: unknown; +} +export const useFetchAlertData = (alertIds: string[]): [boolean, Record<string, Ecs>] => { + const { selectedPatterns } = useSourcererScope(SourcererScopeName.detections); + const alertsQuery = useMemo(() => buildAlertsQuery(alertIds), [alertIds]); + + const { loading: isLoadingAlerts, data: alertsData } = useQueryAlerts<SignalHit, unknown>( + alertsQuery, + selectedPatterns[0] + ); + + const alerts = useMemo( + () => + alertsData?.hits.hits.reduce<Record<string, Ecs>>( + (acc, { _id, _index, _source }) => ({ + ...acc, + [_id]: { + ...formatAlertToEcsSignal(_source), + _id, + _index, + timestamp: _source['@timestamp'], + }, + }), + {} + ) ?? {}, + [alertsData?.hits.hits] + ); + + return [isLoadingAlerts, alerts]; +}; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx deleted file mode 100644 index 75f91c8ef3035..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.test.tsx +++ /dev/null @@ -1,854 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import '../../../common/mock/match_media'; -import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { CaseComponent, CaseProps, CaseView } from '.'; -import { - basicCase, - basicCaseClosed, - caseUserActions, - alertComment, - getAlertUserAction, -} from '../../containers/mock'; -import { TestProviders } from '../../../common/mock'; -import { useUpdateCase } from '../../containers/use_update_case'; -import { useGetCase } from '../../containers/use_get_case'; -import { useGetCaseUserActions } from '../../containers/use_get_case_user_actions'; -import { act, waitFor } from '@testing-library/react'; - -import { useConnectors } from '../../containers/configure/use_connectors'; -import { connectorsMock } from '../../containers/configure/mock'; -import { usePostPushToService } from '../../containers/use_post_push_to_service'; -import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; -import { CaseType, ConnectorTypes } from '../../../../../cases/common'; - -const mockDispatch = jest.fn(); -jest.mock('react-redux', () => { - const original = jest.requireActual('react-redux'); - return { - ...original, - useDispatch: () => mockDispatch, - }; -}); - -jest.mock('../../containers/use_update_case'); -jest.mock('../../containers/use_get_case_user_actions'); -jest.mock('../../containers/use_get_case'); -jest.mock('../../containers/configure/use_connectors'); -jest.mock('../../containers/use_post_push_to_service'); -jest.mock('../../../detections/containers/detection_engine/alerts/use_query'); -jest.mock('../user_action_tree/user_action_timestamp'); - -const useUpdateCaseMock = useUpdateCase as jest.Mock; -const useGetCaseUserActionsMock = useGetCaseUserActions as jest.Mock; -const useConnectorsMock = useConnectors as jest.Mock; -const usePostPushToServiceMock = usePostPushToService as jest.Mock; -const useQueryAlertsMock = useQueryAlerts as jest.Mock; - -export const caseProps: CaseProps = { - caseId: basicCase.id, - userCanCrud: true, - caseData: { - ...basicCase, - comments: [...basicCase.comments, alertComment], - connector: { - id: 'resilient-2', - name: 'Resilient', - type: ConnectorTypes.resilient, - fields: null, - }, - }, - fetchCase: jest.fn(), - updateCase: jest.fn(), -}; - -export const caseClosedProps: CaseProps = { - ...caseProps, - caseData: basicCaseClosed, -}; - -const alertsHit = [ - { - _id: 'alert-id-1', - _index: 'alert-index-1', - _source: { - signal: { - rule: { - id: 'rule-id-1', - name: 'Awesome rule', - }, - }, - }, - }, - { - _id: 'alert-id-2', - _index: 'alert-index-2', - _source: { - signal: { - rule: { - id: 'rule-id-2', - name: 'Awesome rule 2', - }, - }, - }, - }, -]; - -describe('CaseView ', () => { - const updateCaseProperty = jest.fn(); - const fetchCaseUserActions = jest.fn(); - const fetchCase = jest.fn(); - const updateCase = jest.fn(); - const pushCaseToExternalService = jest.fn(); - - const data = caseProps.caseData; - const defaultGetCase = { - isLoading: false, - isError: false, - data, - updateCase, - fetchCase, - }; - - const defaultUpdateCaseState = { - isLoading: false, - isError: false, - updateKey: null, - updateCaseProperty, - }; - - const defaultUseGetCaseUserActions = { - caseUserActions: [...caseUserActions, getAlertUserAction()], - caseServices: {}, - fetchCaseUserActions, - firstIndexPushToService: -1, - hasDataToPush: false, - isLoading: false, - isError: false, - lastIndexPushToService: -1, - participants: [data.createdBy], - }; - - beforeEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); - useUpdateCaseMock.mockImplementation(() => defaultUpdateCaseState); - - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); - useGetCaseUserActionsMock.mockImplementation(() => defaultUseGetCaseUserActions); - usePostPushToServiceMock.mockImplementation(() => ({ - isLoading: false, - pushCaseToExternalService, - })); - useConnectorsMock.mockImplementation(() => ({ connectors: connectorsMock, loading: false })); - useQueryAlertsMock.mockImplementation(() => ({ - loading: false, - data: { hits: { hits: alertsHit } }, - })); - }); - - it('should render CaseComponent', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="case-view-title"]`).first().prop('title')).toEqual( - data.title - ); - - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toEqual( - 'Open' - ); - - expect( - wrapper - .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-coke"]`) - .first() - .text() - ).toEqual(data.tags[0]); - - expect( - wrapper - .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-pepsi"]`) - .first() - .text() - ).toEqual(data.tags[1]); - - expect(wrapper.find(`[data-test-subj="case-view-username"]`).first().text()).toEqual( - data.createdBy.username - ); - - expect( - wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).first().prop('value') - ).toEqual(data.createdAt); - - expect( - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="user-action-markdown"]`) - .first() - .text() - ).toBe(data.description); - - expect( - wrapper.find('button[data-test-subj="case-view-status-action-button"]').first().text() - ).toBe('Mark in progress'); - }); - }); - - it('should show closed indicators in header when case is closed', async () => { - useUpdateCaseMock.mockImplementation(() => ({ - ...defaultUpdateCaseState, - caseData: basicCaseClosed, - })); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseClosedProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).first().prop('value') - ).toEqual(basicCaseClosed.closedAt); - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toEqual( - 'Closed' - ); - }); - }); - - it('should update status', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('[data-test-subj="case-view-status-dropdown"] button').first().simulate('click'); - wrapper.update(); - wrapper - .find('button[data-test-subj="case-view-status-dropdown-closed"]') - .first() - .simulate('click'); - - wrapper.update(); - const updateObject = updateCaseProperty.mock.calls[0][0]; - expect(updateObject.updateKey).toEqual('status'); - expect(updateObject.updateValue).toEqual('closed'); - }); - }); - - it('should display EditableTitle isLoading', async () => { - useUpdateCaseMock.mockImplementation(() => ({ - ...defaultUpdateCaseState, - isLoading: true, - updateKey: 'title', - })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="editable-title-loading"]').first().exists() - ).toBeTruthy(); - expect( - wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists() - ).toBeFalsy(); - }); - }); - - it('should display description isLoading', async () => { - useUpdateCaseMock.mockImplementation(() => ({ - ...defaultUpdateCaseState, - isLoading: true, - updateKey: 'description', - })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect( - wrapper - .find( - '[data-test-subj="description-action"] [data-test-subj="user-action-title-loading"]' - ) - .first() - .exists() - ).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="description-action"] [data-test-subj="property-actions"]') - .first() - .exists() - ).toBeFalsy(); - }); - }); - - it('should display tags isLoading', async () => { - useUpdateCaseMock.mockImplementation(() => ({ - ...defaultUpdateCaseState, - isLoading: true, - updateKey: 'tags', - })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect( - wrapper - .find('[data-test-subj="case-view-tag-list"] [data-test-subj="tag-list-loading"]') - .first() - .exists() - ).toBeTruthy(); - - expect(wrapper.find('button[data-test-subj="tag-list-edit"]').first().exists()).toBeFalsy(); - }); - }); - - it('should update title', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - await waitFor(() => { - const newTitle = 'The new title'; - wrapper.find(`[data-test-subj="editable-title-edit-icon"]`).first().simulate('click'); - wrapper.update(); - wrapper - .find(`[data-test-subj="editable-title-input-field"]`) - .last() - .simulate('change', { target: { value: newTitle } }); - - wrapper.update(); - wrapper.find(`[data-test-subj="editable-title-submit-btn"]`).first().simulate('click'); - - wrapper.update(); - const updateObject = updateCaseProperty.mock.calls[0][0]; - expect(updateObject.updateKey).toEqual('title'); - expect(updateObject.updateValue).toEqual(newTitle); - }); - }); - - it('should push updates on button click', async () => { - useGetCaseUserActionsMock.mockImplementation(() => ({ - ...defaultUseGetCaseUserActions, - hasDataToPush: true, - })); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...{ ...caseProps, updateCase }} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="has-data-to-push-button"]').first().exists() - ).toBeTruthy(); - - wrapper.find('[data-test-subj="push-to-external-service"]').first().simulate('click'); - - wrapper.update(); - - expect(pushCaseToExternalService).toHaveBeenCalled(); - }); - }); - - it('should return null if error', async () => { - (useGetCase as jest.Mock).mockImplementation(() => ({ - ...defaultGetCase, - isError: true, - })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseView - {...{ - caseId: '1234', - userCanCrud: true, - }} - /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper).toEqual({}); - }); - }); - - it('should return spinner if loading', async () => { - (useGetCase as jest.Mock).mockImplementation(() => ({ - ...defaultGetCase, - isLoading: true, - })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseView - {...{ - caseId: '1234', - userCanCrud: true, - }} - /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find('[data-test-subj="case-view-loading"]').exists()).toBeTruthy(); - }); - }); - - it('should return case view when data is there', async () => { - (useGetCase as jest.Mock).mockImplementation(() => defaultGetCase); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseView - {...{ - caseId: '1234', - userCanCrud: true, - }} - /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find('[data-test-subj="case-view-title"]').exists()).toBeTruthy(); - }); - }); - - it('should refresh data on refresh', async () => { - (useGetCase as jest.Mock).mockImplementation(() => defaultGetCase); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseView - {...{ - caseId: '1234', - userCanCrud: true, - }} - /> - </Router> - </TestProviders> - ); - await waitFor(() => { - wrapper.find('[data-test-subj="case-refresh"]').first().simulate('click'); - expect(fetchCaseUserActions).toBeCalledWith('1234', 'resilient-2', undefined); - expect(fetchCase).toBeCalled(); - }); - }); - - it('should disable the push button when connector is invalid', async () => { - useGetCaseUserActionsMock.mockImplementation(() => ({ - ...defaultUseGetCaseUserActions, - hasDataToPush: true, - })); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent - {...{ - ...caseProps, - updateCase, - caseData: { ...caseProps.caseData, connectorId: 'not-exist' }, - }} - /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect( - wrapper.find('button[data-test-subj="push-to-external-service"]').first().prop('disabled') - ).toBeTruthy(); - }); - }); - - // TO DO fix when the useEffects in edit_connector are cleaned up - it.skip('should revert to the initial connector in case of failure', async () => { - updateCaseProperty.mockImplementation(({ onError }) => { - onError(); - }); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent - {...caseProps} - caseData={{ - ...caseProps.caseData, - connector: { - id: 'servicenow-1', - name: 'SN 1', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - }} - /> - </Router> - </TestProviders> - ); - const connectorName = wrapper - .find('[data-test-subj="settings-connector-card"] .euiTitle') - .first() - .text(); - - await waitFor(() => { - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - }); - - await waitFor(() => { - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); - }); - - await waitFor(() => { - wrapper.update(); - const updateObject = updateCaseProperty.mock.calls[0][0]; - expect(updateObject.updateKey).toEqual('connector'); - expect( - wrapper.find('[data-test-subj="settings-connector-card"] .euiTitle').first().text() - ).toBe(connectorName); - }); - }); - - it('should update connector', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent - {...caseProps} - caseData={{ - ...caseProps.caseData, - connector: { - id: 'servicenow-1', - name: 'SN 1', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - }} - /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - }); - - await waitFor(() => { - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - }); - - act(() => { - wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); - }); - - await waitFor(() => { - wrapper.update(); - }); - - const updateObject = updateCaseProperty.mock.calls[0][0]; - expect(updateObject.updateKey).toEqual('connector'); - expect(updateObject.updateValue).toEqual({ - id: 'resilient-2', - name: 'My Connector 2', - type: ConnectorTypes.resilient, - fields: { - incidentTypes: null, - severityCode: null, - }, - }); - }); - - it('it should create a new timeline on mount', async () => { - mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect(mockDispatch).toHaveBeenCalledWith({ - type: 'x-pack/security_solution/local/timeline/CREATE_TIMELINE', - payload: { - columns: [], - expandedDetail: {}, - id: 'timeline-case', - indexNames: [], - show: false, - }, - }); - }); - }); - - it('should show loading content when loading alerts', async () => { - useQueryAlertsMock.mockImplementation(() => ({ - loading: true, - data: { hits: { hits: [] } }, - })); - useGetCaseUserActionsMock.mockReturnValue({ - caseServices: {}, - caseUserActions: [], - hasDataToPush: false, - isError: false, - isLoading: true, - participants: [], - }); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="case-view-loading-content"]').first().exists() - ).toBeTruthy(); - expect(wrapper.find('[data-test-subj="user-actions"]').first().exists()).toBeFalsy(); - }); - }); - - it('should open the alert flyout', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper - .find('[data-test-subj="comment-action-show-alert-alert-action-id"] button') - .first() - .simulate('click'); - expect(mockDispatch).toHaveBeenCalledWith({ - type: 'x-pack/security_solution/local/timeline/TOGGLE_DETAIL_PANEL', - payload: { - panelView: 'eventDetail', - params: { eventId: 'alert-id-1', indexName: 'alert-index-1' }, - timelineId: 'timeline-case', - }, - }); - }); - }); - - it('should show the rule name', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper - .find( - '[data-test-subj="comment-create-action-alert-action-id"] .euiCommentEvent__headerEvent' - ) - .first() - .text() - ).toBe('added an alert from Awesome rule'); - }); - }); - - it('should update settings', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); - - wrapper.update(); - const updateObject = updateCaseProperty.mock.calls[0][0]; - expect(updateObject.updateKey).toEqual('settings'); - expect(updateObject.updateValue).toEqual({ syncAlerts: false }); - }); - }); - - it('should show the correct connector name on the push button', async () => { - useConnectorsMock.mockImplementation(() => ({ connectors: connectorsMock, loading: false })); - useGetCaseUserActionsMock.mockImplementation(() => ({ - ...defaultUseGetCaseUserActions, - hasDataToPush: true, - })); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...{ ...caseProps, connector: { ...caseProps, name: 'old-name' } }} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper - .find('[data-test-subj="has-data-to-push-button"]') - .first() - .text() - .includes('My Connector 2') - ).toBe(true); - }); - }); - - describe('Callouts', () => { - it('it shows the danger callout when a connector has been deleted', async () => { - useConnectorsMock.mockImplementation(() => ({ connectors: [], loading: false })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find('.euiCallOut--danger').first().exists()).toBeTruthy(); - }); - }); - - it('it does NOT shows the danger callout when connectors are loading', async () => { - useConnectorsMock.mockImplementation(() => ({ connectors: [], loading: true })); - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent {...caseProps} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find('.euiCallOut--danger').first().exists()).toBeFalsy(); - }); - }); - }); - - describe('Collections', () => { - it('it does not allow the user to update the status', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent - {...caseProps} - caseData={{ ...caseProps.caseData, type: CaseType.collection }} - /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect(wrapper.find('[data-test-subj="case-action-bar-wrapper"]').exists()).toBe(true); - expect(wrapper.find('button[data-test-subj="case-view-status"]').exists()).toBe(false); - expect(wrapper.find('[data-test-subj="user-actions"]').exists()).toBe(true); - expect( - wrapper.find('button[data-test-subj="case-view-status-action-button"]').exists() - ).toBe(false); - }); - }); - - it('it shows the push button when has data to push', async () => { - useGetCaseUserActionsMock.mockImplementation(() => ({ - ...defaultUseGetCaseUserActions, - hasDataToPush: true, - })); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent - {...caseProps} - caseData={{ ...caseProps.caseData, type: CaseType.collection }} - /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect(wrapper.find('[data-test-subj="has-data-to-push-button"]').exists()).toBe(true); - }); - }); - - it('it does not show the horizontal rule when does NOT has data to push', async () => { - useGetCaseUserActionsMock.mockImplementation(() => ({ - ...defaultUseGetCaseUserActions, - hasDataToPush: false, - })); - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <CaseComponent - {...caseProps} - caseData={{ ...caseProps.caseData, type: CaseType.collection }} - /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper.find('[data-test-subj="case-view-bottom-actions-horizontal-rule"]').exists() - ).toBe(false); - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index fd7b3433db56c..746aac46314c1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -5,51 +5,34 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; +import React, { useCallback } from 'react'; import { useDispatch } from 'react-redux'; -import styled from 'styled-components'; -import { isEmpty } from 'lodash/fp'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiLoadingContent, - EuiLoadingSpinner, - EuiHorizontalRule, -} from '@elastic/eui'; +import { useHistory } from 'react-router-dom'; +import { SearchResponse } from 'elasticsearch'; +import { isEmpty } from 'lodash'; -import { CaseStatuses, CaseAttributes, CaseType } from '../../../../../cases/common'; -import { Case, CaseConnector } from '../../containers/types'; -import { getCaseDetailsUrl, getCaseUrl, useFormatUrl } from '../../../common/components/link_to'; -import { gutterTimeline } from '../../../common/lib/helpers'; -import { HeaderPage } from '../../../common/components/header_page'; -import { EditableTitle } from '../../../common/components/header_page/editable_title'; -import { TagList } from '../tag_list'; -import { useGetCase } from '../../containers/use_get_case'; -import { UserActionTree } from '../user_action_tree'; -import { UserList } from '../user_list'; -import { useUpdateCase } from '../../containers/use_update_case'; -import { getTypedPayload } from '../../containers/utils'; -import { WhitePageWrapper, HeaderWrapper } from '../wrappers'; -import { CaseActionBar } from '../case_action_bar'; -import { SpyRoute } from '../../../common/utils/route/spy_routes'; -import { useGetCaseUserActions } from '../../containers/use_get_case_user_actions'; -import { usePushToService } from '../use_push_to_service'; -import { EditConnector } from '../edit_connector'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { SecurityPageName } from '../../../app/types'; import { - getConnectorById, - normalizeActionConnector, - getNoneConnector, -} from '../configure_cases/utils'; -import { DetailsPanel } from '../../../timelines/components/side_panel'; -import { useSourcererScope } from '../../../common/containers/sourcerer'; -import { SourcererScopeName } from '../../../common/store/sourcerer/model'; + getCaseDetailsUrl, + getCaseDetailsUrlWithCommentId, + getCaseUrl, + getConfigureCasesUrl, + getRuleDetailsUrl, + useFormatUrl, +} from '../../../common/components/link_to'; +import { Ecs } from '../../../../common/ecs'; +import { Case } from '../../../../../cases/common'; +import { TimelineNonEcsData } from '../../../../common/search_strategy'; import { TimelineId } from '../../../../common/types/timeline'; +import { SecurityPageName } from '../../../app/types'; +import { KibanaServices, useKibana } from '../../../common/lib/kibana'; +import { APP_ID, DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../common/constants'; import { timelineActions } from '../../../timelines/store/timeline'; -import { StatusActionButton } from '../status/button'; - -import * as i18n from './translations'; +import { useSourcererScope } from '../../../common/containers/sourcerer'; +import { SourcererScopeName } from '../../../common/store/sourcerer/model'; +import { DetailsPanel } from '../../../timelines/components/side_panel'; +import { InvestigateInTimelineAction } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_timeline_action'; +import { buildAlertsQuery, formatAlertToEcsSignal, useFetchAlertData } from './helpers'; +import { SEND_ALERT_TO_TIMELINE } from './translations'; interface Props { caseId: string; @@ -64,448 +47,164 @@ export interface OnUpdateFields { onError?: () => void; } -const MyWrapper = styled.div` - padding: ${({ theme }) => - `${theme.eui.paddingSizes.l} ${theme.eui.paddingSizes.l} ${gutterTimeline} ${theme.eui.paddingSizes.l}`}; -`; - -const MyEuiFlexGroup = styled(EuiFlexGroup)` - height: 100%; -`; - -const MyEuiHorizontalRule = styled(EuiHorizontalRule)` - margin-left: 48px; - &.euiHorizontalRule--full { - width: calc(100% - 48px); - } -`; - export interface CaseProps extends Props { fetchCase: () => void; caseData: Case; updateCase: (newCase: Case) => void; } -export const CaseComponent = React.memo<CaseProps>( - ({ caseId, caseData, fetchCase, subCaseId, updateCase, userCanCrud }) => { - const dispatch = useDispatch(); - const { formatUrl, search } = useFormatUrl(SecurityPageName.case); - const allCasesLink = getCaseUrl(search); - const caseDetailsLink = formatUrl(getCaseDetailsUrl({ id: caseId }), { absolute: true }); - const [initLoadingData, setInitLoadingData] = useState(true); - const init = useRef(true); - - const { - caseUserActions, - fetchCaseUserActions, - caseServices, - hasDataToPush, - isLoading: isLoadingUserActions, - participants, - } = useGetCaseUserActions(caseId, caseData.connector.id, subCaseId); +const TimelineDetailsPanel = () => { + const { browserFields, docValueFields } = useSourcererScope(SourcererScopeName.detections); - const { isLoading, updateKey, updateCaseProperty } = useUpdateCase({ - caseId, - subCaseId, + return ( + <DetailsPanel + browserFields={browserFields} + docValueFields={docValueFields} + isFlyoutView + timelineId={TimelineId.casePage} + /> + ); +}; + +const InvestigateInTimelineActionComponent = (alertIds: string[]) => { + const EMPTY_ARRAY: TimelineNonEcsData[] = []; + const fetchEcsAlertsData = async (fetchAlertIds?: string[]): Promise<Ecs[]> => { + if (isEmpty(fetchAlertIds)) { + return []; + } + const alertResponse = await KibanaServices.get().http.fetch< + SearchResponse<{ '@timestamp': string; [key: string]: unknown }> + >(DETECTION_ENGINE_QUERY_SIGNALS_URL, { + method: 'POST', + body: JSON.stringify(buildAlertsQuery(fetchAlertIds ?? [])), }); - - /** - * For the future developer: useSourcererScope is security solution dependent. - * You can use useSignalIndex as an alternative. - */ - const { browserFields, docValueFields } = useSourcererScope(SourcererScopeName.detections); - - // Update Fields - const onUpdateField = useCallback( - ({ key, value, onSuccess, onError }: OnUpdateFields) => { - const handleUpdateNewCase = (newCase: Case) => - updateCase({ ...newCase, comments: caseData.comments }); - switch (key) { - case 'title': - const titleUpdate = getTypedPayload<string>(value); - if (titleUpdate.length > 0) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'title', - updateValue: titleUpdate, - updateCase: handleUpdateNewCase, - caseData, - onSuccess, - onError, - }); - } - break; - case 'connector': - const connector = getTypedPayload<CaseConnector>(value); - if (connector != null) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'connector', - updateValue: connector, - updateCase: handleUpdateNewCase, - caseData, - onSuccess, - onError, - }); - } - break; - case 'description': - const descriptionUpdate = getTypedPayload<string>(value); - if (descriptionUpdate.length > 0) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'description', - updateValue: descriptionUpdate, - updateCase: handleUpdateNewCase, - caseData, - onSuccess, - onError, - }); - } - break; - case 'tags': - const tagsUpdate = getTypedPayload<string[]>(value); - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'tags', - updateValue: tagsUpdate, - updateCase: handleUpdateNewCase, - caseData, - onSuccess, - onError, - }); - break; - case 'status': - const statusUpdate = getTypedPayload<CaseStatuses>(value); - if (caseData.status !== value) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'status', - updateValue: statusUpdate, - updateCase: handleUpdateNewCase, - caseData, - onSuccess, - onError, - }); - } - break; - case 'settings': - const settingsUpdate = getTypedPayload<CaseAttributes['settings']>(value); - if (caseData.settings !== value) { - updateCaseProperty({ - fetchCaseUserActions, - updateKey: 'settings', - updateValue: settingsUpdate, - updateCase: handleUpdateNewCase, - caseData, - onSuccess, - onError, - }); - } - break; - default: - return null; - } - }, - [fetchCaseUserActions, updateCaseProperty, updateCase, caseData] - ); - - const handleUpdateCase = useCallback( - (newCase: Case) => { - updateCase(newCase); - fetchCaseUserActions(caseId, newCase.connector.id, subCaseId); - }, - [updateCase, fetchCaseUserActions, caseId, subCaseId] + return ( + alertResponse?.hits.hits.reduce<Ecs[]>( + (acc, { _id, _index, _source }) => [ + ...acc, + { + ...formatAlertToEcsSignal(_source as {}), + _id, + _index, + timestamp: _source['@timestamp'], + }, + ], + [] + ) ?? [] ); + }; - const { loading: isLoadingConnectors, connectors } = useConnectors(); - - const [connectorName, isValidConnector] = useMemo(() => { - const connector = connectors.find((c) => c.id === caseData.connector.id); - return [connector?.name ?? '', !!connector]; - }, [connectors, caseData.connector]); + return ( + <InvestigateInTimelineAction + ariaLabel={SEND_ALERT_TO_TIMELINE} + alertIds={alertIds} + key="investigate-in-timeline" + ecsRowData={null} + fetchEcsAlertsData={fetchEcsAlertsData} + nonEcsRowData={EMPTY_ARRAY} + /> + ); +}; - const currentExternalIncident = useMemo( - () => - caseServices != null && caseServices[caseData.connector.id] != null - ? caseServices[caseData.connector.id] - : null, - [caseServices, caseData.connector] - ); +export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { + const { + cases: casesUi, + application: { navigateToApp }, + } = useKibana().services; + const history = useHistory(); + const dispatch = useDispatch(); + const { formatUrl, search } = useFormatUrl(SecurityPageName.case); + const { formatUrl: detectionsFormatUrl, search: detectionsUrlSearch } = useFormatUrl( + SecurityPageName.detections + ); - const { pushButton, pushCallouts } = usePushToService({ - connector: { - ...caseData.connector, - name: isEmpty(connectorName) ? caseData.connector.name : connectorName, - }, - caseServices, - caseId: caseData.id, - caseStatus: caseData.status, - connectors, - updateCase: handleUpdateCase, - userCanCrud, - isValidConnector: isLoadingConnectors ? true : isValidConnector, + const allCasesLink = getCaseUrl(search); + const formattedAllCasesLink = formatUrl(allCasesLink); + const backToAllCasesOnClick = useCallback( + (ev) => { + ev.preventDefault(); + history.push(allCasesLink); + }, + [allCasesLink, history] + ); + const caseDetailsLink = formatUrl(getCaseDetailsUrl({ id: caseId }), { absolute: true }); + const getCaseDetailHrefWithCommentId = (commentId: string) => { + return formatUrl(getCaseDetailsUrlWithCommentId({ id: caseId, commentId, subCaseId }), { + absolute: true, }); + }; + + const configureCasesHref = formatUrl(getConfigureCasesUrl()); + const onConfigureCasesNavClick = useCallback( + (ev) => { + ev.preventDefault(); + history.push(getConfigureCasesUrl(search)); + }, + [history, search] + ); - const onSubmitConnector = useCallback( - (connectorId, connectorFields, onError, onSuccess) => { - const connector = getConnectorById(connectorId, connectors); - const connectorToUpdate = connector - ? normalizeActionConnector(connector) - : getNoneConnector(); - - onUpdateField({ - key: 'connector', - value: { ...connectorToUpdate, fields: connectorFields }, - onSuccess, - onError, - }); - }, - [onUpdateField, connectors] - ); - - const onSubmitTags = useCallback((newTags) => onUpdateField({ key: 'tags', value: newTags }), [ - onUpdateField, - ]); - - const onSubmitTitle = useCallback( - (newTitle) => onUpdateField({ key: 'title', value: newTitle }), - [onUpdateField] - ); - - const changeStatus = useCallback( - (status: CaseStatuses) => - onUpdateField({ - key: 'status', - value: status, - }), - [onUpdateField] - ); - - const handleRefresh = useCallback(() => { - fetchCaseUserActions(caseId, caseData.connector.id, subCaseId); - fetchCase(); - }, [caseData.connector.id, caseId, fetchCase, fetchCaseUserActions, subCaseId]); - - const spyState = useMemo(() => ({ caseTitle: caseData.title }), [caseData.title]); - - const emailContent = useMemo( - () => ({ - subject: i18n.EMAIL_SUBJECT(caseData.title), - body: i18n.EMAIL_BODY(caseDetailsLink), - }), - [caseDetailsLink, caseData.title] - ); - - useEffect(() => { - if (initLoadingData && !isLoadingUserActions) { - setInitLoadingData(false); - } - }, [initLoadingData, isLoadingUserActions]); - - const backOptions = useMemo( - () => ({ - href: allCasesLink, - text: i18n.BACK_TO_ALL, - dataTestSubj: 'backToCases', - pageId: SecurityPageName.case, - }), - [allCasesLink] - ); - - const showAlert = useCallback( - (alertId: string, index: string) => { - dispatch( - timelineActions.toggleDetailPanel({ - panelView: 'eventDetail', - timelineId: TimelineId.casePage, - params: { - eventId: alertId, - indexName: index, - }, - }) - ); - }, - [dispatch] - ); - - // useEffect used for component's initialization - useEffect(() => { - if (init.current) { - init.current = false; - // We need to create a timeline to show the details view - dispatch( - timelineActions.createTimeline({ - id: TimelineId.casePage, - columns: [], - indexNames: [], - expandedDetail: {}, - show: false, - }) - ); - } - }, [dispatch]); + const onDetectionsRuleDetailsClick = useCallback( + (ruleId: string | null | undefined) => { + navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { + path: getRuleDetailsUrl(ruleId ?? ''), + }); + }, + [navigateToApp] + ); - return ( - <> - <HeaderWrapper> - <HeaderPage - backOptions={backOptions} - data-test-subj="case-view-title" - hideSourcerer={true} - titleNode={ - <EditableTitle - disabled={!userCanCrud} - isLoading={isLoading && updateKey === 'title'} - title={caseData.title} - onSubmit={onSubmitTitle} - /> - } - title={caseData.title} - > - <CaseActionBar - currentExternalIncident={currentExternalIncident} - caseData={caseData} - disabled={!userCanCrud} - isLoading={isLoading && (updateKey === 'status' || updateKey === 'settings')} - onRefresh={handleRefresh} - onUpdateField={onUpdateField} - /> - </HeaderPage> - </HeaderWrapper> - <WhitePageWrapper> - <MyWrapper> - {!initLoadingData && pushCallouts != null && pushCallouts} - <EuiFlexGroup> - <EuiFlexItem grow={6}> - {initLoadingData && ( - <EuiLoadingContent lines={8} data-test-subj="case-view-loading-content" /> - )} - {!initLoadingData && ( - <> - <UserActionTree - caseServices={caseServices} - caseUserActions={caseUserActions} - connectors={connectors} - data={caseData} - fetchUserActions={fetchCaseUserActions.bind( - null, - caseId, - caseData.connector.id, - subCaseId - )} - isLoadingDescription={isLoading && updateKey === 'description'} - isLoadingUserActions={isLoadingUserActions} - onShowAlertDetails={showAlert} - onUpdateField={onUpdateField} - updateCase={updateCase} - userCanCrud={userCanCrud} - /> - {(caseData.type !== CaseType.collection || hasDataToPush) && ( - <> - <MyEuiHorizontalRule - margin="s" - data-test-subj="case-view-bottom-actions-horizontal-rule" - /> - <EuiFlexGroup alignItems="center" gutterSize="s" justifyContent="flexEnd"> - {caseData.type !== CaseType.collection && ( - <EuiFlexItem grow={false}> - <StatusActionButton - status={caseData.status} - onStatusChanged={changeStatus} - disabled={!userCanCrud} - isLoading={isLoading && updateKey === 'status'} - /> - </EuiFlexItem> - )} - {hasDataToPush && ( - <EuiFlexItem data-test-subj="has-data-to-push-button" grow={false}> - {pushButton} - </EuiFlexItem> - )} - </EuiFlexGroup> - </> - )} - </> - )} - </EuiFlexItem> - <EuiFlexItem grow={2}> - <UserList - data-test-subj="case-view-user-list-reporter" - email={emailContent} - headline={i18n.REPORTER} - users={[caseData.createdBy]} - /> - <UserList - data-test-subj="case-view-user-list-participants" - email={emailContent} - headline={i18n.PARTICIPANTS} - loading={isLoadingUserActions} - users={participants} - /> - <TagList - data-test-subj="case-view-tag-list" - disabled={!userCanCrud} - tags={caseData.tags} - onSubmit={onSubmitTags} - isLoading={isLoading && updateKey === 'tags'} - /> - <EditConnector - caseFields={caseData.connector.fields} - connectors={connectors} - disabled={!userCanCrud} - hideConnectorServiceNowSir={ - subCaseId != null || caseData.type === CaseType.collection - } - isLoading={isLoadingConnectors || (isLoading && updateKey === 'connector')} - onSubmit={onSubmitConnector} - selectedConnector={caseData.connector.id} - userActions={caseUserActions} - /> - </EuiFlexItem> - </EuiFlexGroup> - </MyWrapper> - </WhitePageWrapper> - <DetailsPanel - browserFields={browserFields} - docValueFields={docValueFields} - isFlyoutView - timelineId={TimelineId.casePage} - /> - <SpyRoute state={spyState} pageName={SecurityPageName.case} /> - </> - ); - } -); + const getDetectionsRuleDetailsHref = useCallback( + (ruleId) => { + return detectionsFormatUrl(getRuleDetailsUrl(ruleId ?? '', detectionsUrlSearch)); + }, + [detectionsFormatUrl, detectionsUrlSearch] + ); -export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { - const { data, isLoading, isError, fetchCase, updateCase } = useGetCase(caseId, subCaseId); + const showAlertDetails = useCallback( + (alertId: string, index: string) => { + dispatch( + timelineActions.toggleDetailPanel({ + panelView: 'eventDetail', + timelineId: TimelineId.casePage, + params: { + eventId: alertId, + indexName: index, + }, + }) + ); + }, + [dispatch] + ); - if (isError) { - return null; - } - if (isLoading) { - return ( - <MyEuiFlexGroup gutterSize="none" justifyContent="center" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiLoadingSpinner data-test-subj="case-view-loading" size="xl" /> - </EuiFlexItem> - </MyEuiFlexGroup> + const onComponentInitialized = useCallback(() => { + dispatch( + timelineActions.createTimeline({ + id: TimelineId.casePage, + columns: [], + indexNames: [], + expandedDetail: {}, + show: false, + }) ); - } - return ( - data && ( - <CaseComponent - caseId={caseId} - subCaseId={subCaseId} - fetchCase={fetchCase} - caseData={data} - updateCase={updateCase} - userCanCrud={userCanCrud} - /> - ) - ); + }, [dispatch]); + + return casesUi.getCaseView({ + allCasesHref: formattedAllCasesLink, + backToAllCasesOnClick, + caseDetailsHref: caseDetailsLink, + caseId, + configureCasesHref, + getCaseDetailHrefWithCommentId, + getRuleDetailsHref: getDetectionsRuleDetailsHref, + onComponentInitialized, + onConfigureCasesNavClick, + onRuleDetailsClick: onDetectionsRuleDetailsClick, + renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, + renderTimelineDetailsPanel: TimelineDetailsPanel, + showAlertDetails, + subCaseId, + useFetchAlertData, + userCanCrud, + }); }); -CaseComponent.displayName = 'CaseComponent'; CaseView.displayName = 'CaseView'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/translations.ts b/x-pack/plugins/security_solution/public/cases/components/case_view/translations.ts index f4403a43af697..d7b66bbac38df 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/translations.ts +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/translations.ts @@ -6,152 +6,9 @@ */ import { i18n } from '@kbn/i18n'; - -export * from '../../translations'; - -export const SHOWING_CASES = (actionDate: string, actionName: string, userName: string) => - i18n.translate('xpack.securitySolution.cases.caseView.actionHeadline', { - values: { - actionDate, - actionName, - userName, - }, - defaultMessage: '{userName} {actionName} on {actionDate}', - }); - -export const ADDED_FIELD = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.addedField', - { - defaultMessage: 'added', - } -); - -export const CHANGED_FIELD = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.changededField', - { - defaultMessage: 'changed', - } -); - -export const SELECTED_THIRD_PARTY = (thirdParty: string) => - i18n.translate('xpack.securitySolution.cases.caseView.actionLabel.selectedThirdParty', { - values: { - thirdParty, - }, - defaultMessage: 'selected { thirdParty } as incident management system', - }); - -export const REMOVED_THIRD_PARTY = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.removedThirdParty', - { - defaultMessage: 'removed external incident management system', - } -); - -export const EDITED_FIELD = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.editedField', - { - defaultMessage: 'edited', - } -); - -export const REMOVED_FIELD = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.removedField', - { - defaultMessage: 'removed', - } -); - -export const VIEW_INCIDENT = (incidentNumber: string) => - i18n.translate('xpack.securitySolution.cases.caseView.actionLabel.viewIncident', { - defaultMessage: 'View {incidentNumber}', - values: { - incidentNumber, - }, - }); - -export const PUSHED_NEW_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.pushedNewIncident', +export const SEND_ALERT_TO_TIMELINE = i18n.translate( + 'xpack.securitySolution.cases.caseView.sendAlertToTimelineTooltip', { - defaultMessage: 'pushed as new incident', + defaultMessage: 'Investigate in timeline', } ); - -export const UPDATE_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.updateIncident', - { - defaultMessage: 'updated incident', - } -); - -export const ADDED_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.addDescription', - { - defaultMessage: 'added description', - } -); - -export const EDIT_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.cases.caseView.edit.description', - { - defaultMessage: 'Edit description', - } -); - -export const QUOTE = i18n.translate('xpack.securitySolution.cases.caseView.edit.quote', { - defaultMessage: 'Quote', -}); - -export const EDIT_COMMENT = i18n.translate('xpack.securitySolution.cases.caseView.edit.comment', { - defaultMessage: 'Edit comment', -}); - -export const ON = i18n.translate('xpack.securitySolution.cases.caseView.actionLabel.on', { - defaultMessage: 'on', -}); - -export const ADDED_COMMENT = i18n.translate( - 'xpack.securitySolution.cases.caseView.actionLabel.addComment', - { - defaultMessage: 'added comment', - } -); - -export const STATUS = i18n.translate('xpack.securitySolution.cases.caseView.statusLabel', { - defaultMessage: 'Status', -}); - -export const CASE = i18n.translate('xpack.securitySolution.cases.caseView.case', { - defaultMessage: 'case', -}); - -export const COMMENT = i18n.translate('xpack.securitySolution.cases.caseView.comment', { - defaultMessage: 'comment', -}); - -export const CASE_REFRESH = i18n.translate('xpack.securitySolution.cases.caseView.caseRefresh', { - defaultMessage: 'Refresh case', -}); - -export const EMAIL_SUBJECT = (caseTitle: string) => - i18n.translate('xpack.securitySolution.cases.caseView.emailSubject', { - values: { caseTitle }, - defaultMessage: 'Security Case - {caseTitle}', - }); - -export const EMAIL_BODY = (caseUrl: string) => - i18n.translate('xpack.securitySolution.cases.caseView.emailBody', { - values: { caseUrl }, - defaultMessage: 'Case reference: {caseUrl}', - }); - -export const CHANGED_CONNECTOR_FIELD = i18n.translate( - 'xpack.securitySolution.cases.caseView.fieldChanged', - { - defaultMessage: `changed connector field`, - } -); - -export const SYNC_ALERTS = i18n.translate('xpack.securitySolution.cases.caseView.syncAlertsLabel', { - defaultMessage: `Sync alerts`, -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx deleted file mode 100644 index e18e0ef004ceb..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/__mock__/index.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ConnectorTypes } from '../../../../../../cases/common'; -import { ActionConnector } from '../../../containers/configure/types'; -import { UseConnectorsResponse } from '../../../containers/configure/use_connectors'; -import { ReturnUseCaseConfigure } from '../../../containers/configure/use_configure'; -import { UseActionTypesResponse } from '../../../containers/configure/use_action_types'; -import { connectorsMock, actionTypesMock } from '../../../containers/configure/mock'; -export { mappings } from '../../../containers/configure/mock'; -export const connectors: ActionConnector[] = connectorsMock; - -// x - pack / plugins / triggers_actions_ui; -export const searchURL = - '?timerange=(global:(linkTo:!(),timerange:(from:1585487656371,fromStr:now-24h,kind:relative,to:1585574056371,toStr:now)),timeline:(linkTo:!(),timerange:(from:1585227005527,kind:absolute,to:1585313405527)))'; - -export const useCaseConfigureResponse: ReturnUseCaseConfigure = { - closureType: 'close-by-user', - connector: { - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, - }, - closureType: 'close-by-user', - }, - firstLoad: false, - loading: false, - mappings: [], - persistCaseConfigure: jest.fn(), - persistLoading: false, - refetchCaseConfigure: jest.fn(), - setClosureType: jest.fn(), - setConnector: jest.fn(), - setCurrentConfiguration: jest.fn(), - setMappings: jest.fn(), - version: '', -}; - -export const useConnectorsResponse: UseConnectorsResponse = { - loading: false, - connectors, - refetchConnectors: jest.fn(), -}; - -export const useActionTypesResponse: UseActionTypesResponse = { - loading: false, - actionTypes: actionTypesMock, - refetchActionTypes: jest.fn(), -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx deleted file mode 100644 index 4b2d72cf86dd6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { ReactWrapper, mount } from 'enzyme'; -import { EuiText } from '@elastic/eui'; - -import '../../../common/mock/match_media'; -import { ConfigureCaseButton, ConfigureCaseButtonProps } from './button'; -import { TestProviders } from '../../../common/mock'; -import { searchURL } from './__mock__'; - -jest.mock('react-router-dom', () => { - const original = jest.requireActual('react-router-dom'); - - return { - ...original, - useHistory: () => ({ - useHistory: jest.fn(), - }), - }; -}); - -jest.mock('../../../common/components/link_to'); - -describe('Configuration button', () => { - let wrapper: ReactWrapper; - const props: ConfigureCaseButtonProps = { - isDisabled: false, - label: 'My label', - msgTooltip: <></>, - showToolTip: false, - titleTooltip: '', - urlSearch: searchURL, - }; - - beforeAll(() => { - wrapper = mount(<ConfigureCaseButton {...props} />, { wrappingComponent: TestProviders }); - }); - - test('it renders without the tooltip', () => { - expect(wrapper.find('[data-test-subj="configure-case-button"]').first().exists()).toBe(true); - - expect(wrapper.find('[data-test-subj="configure-case-tooltip"]').first().exists()).toBe(false); - }); - - test('it pass the correct props to the button', () => { - expect(wrapper.find('[data-test-subj="configure-case-button"]').first().props()).toMatchObject({ - href: `/configure`, - iconType: 'controlsHorizontal', - isDisabled: false, - 'aria-label': 'My label', - children: 'My label', - }); - }); - - test('it renders the tooltip', () => { - const msgTooltip = <EuiText>{'My message tooltip'}</EuiText>; - - const newWrapper = mount( - <ConfigureCaseButton - {...props} - showToolTip={true} - titleTooltip={'My tooltip title'} - msgTooltip={msgTooltip} - />, - { - wrappingComponent: TestProviders, - } - ); - - expect(newWrapper.find('[data-test-subj="configure-case-tooltip"]').first().exists()).toBe( - true - ); - - expect(wrapper.find('[data-test-subj="configure-case-button"]').first().exists()).toBe(true); - }); - - test('it shows the tooltip when hovering the button', () => { - // Use fake timers so we don't have to wait for the EuiToolTip timeout - jest.useFakeTimers(); - - const msgTooltip = 'My message tooltip'; - const titleTooltip = 'My title'; - - const newWrapper = mount( - <ConfigureCaseButton - {...props} - showToolTip={true} - titleTooltip={titleTooltip} - msgTooltip={<>{msgTooltip}</>} - />, - { - wrappingComponent: TestProviders, - } - ); - - newWrapper.find('[data-test-subj="configure-case-button"]').first().simulate('mouseOver'); - - // Run the timers so the EuiTooltip will be visible - jest.runAllTimers(); - - newWrapper.update(); - expect(newWrapper.find('.euiToolTipPopover').text()).toBe(`${titleTooltip}${msgTooltip}`); - - // Clearing all mocks will also reset fake timers. - jest.clearAllMocks(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.tsx deleted file mode 100644 index 2e116e16df52b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiToolTip } from '@elastic/eui'; -import React, { memo, useCallback, useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { getConfigureCasesUrl, useFormatUrl } from '../../../common/components/link_to'; -import { LinkButton } from '../../../common/components/links'; -import { SecurityPageName } from '../../../app/types'; - -export interface ConfigureCaseButtonProps { - label: string; - isDisabled: boolean; - msgTooltip: JSX.Element; - showToolTip: boolean; - titleTooltip: string; - urlSearch: string; -} - -const ConfigureCaseButtonComponent: React.FC<ConfigureCaseButtonProps> = ({ - isDisabled, - label, - msgTooltip, - showToolTip, - titleTooltip, - urlSearch, -}: ConfigureCaseButtonProps) => { - const history = useHistory(); - const { formatUrl } = useFormatUrl(SecurityPageName.case); - const goToCaseConfigure = useCallback( - (ev) => { - ev.preventDefault(); - history.push(getConfigureCasesUrl(urlSearch)); - }, - [history, urlSearch] - ); - - const configureCaseButton = useMemo( - () => ( - <LinkButton - onClick={goToCaseConfigure} - href={formatUrl(getConfigureCasesUrl())} - iconType="controlsHorizontal" - isDisabled={isDisabled} - aria-label={label} - data-test-subj="configure-case-button" - > - {label} - </LinkButton> - ), - [label, isDisabled, formatUrl, goToCaseConfigure] - ); - - return showToolTip ? ( - <EuiToolTip - position="top" - title={titleTooltip} - content={<p>{msgTooltip}</p>} - data-test-subj="configure-case-tooltip" - > - {configureCaseButton} - </EuiToolTip> - ) : ( - <>{configureCaseButton}</> - ); -}; - -export const ConfigureCaseButton = memo(ConfigureCaseButtonComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.test.tsx deleted file mode 100644 index a7d9805bc77b4..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.test.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; - -import { ClosureOptions, ClosureOptionsProps } from './closure_options'; -import { TestProviders } from '../../../common/mock'; -import { ClosureOptionsRadio } from './closure_options_radio'; - -describe('ClosureOptions', () => { - let wrapper: ReactWrapper; - const onChangeClosureType = jest.fn(); - const props: ClosureOptionsProps = { - disabled: false, - closureTypeSelected: 'close-by-user', - onChangeClosureType, - }; - - beforeAll(() => { - wrapper = mount(<ClosureOptions {...props} />, { wrappingComponent: TestProviders }); - }); - - test('it shows the closure options form group', () => { - expect( - wrapper.find('[data-test-subj="case-closure-options-form-group"]').first().exists() - ).toBe(true); - }); - - test('it shows the closure options form row', () => { - expect(wrapper.find('[data-test-subj="case-closure-options-form-row"]').first().exists()).toBe( - true - ); - }); - - test('it shows closure options', () => { - expect(wrapper.find('[data-test-subj="case-closure-options-radio"]').first().exists()).toBe( - true - ); - }); - - test('it pass the correct props to child', () => { - const closureOptionsRadioComponent = wrapper.find(ClosureOptionsRadio); - expect(closureOptionsRadioComponent.props().disabled).toEqual(false); - expect(closureOptionsRadioComponent.props().closureTypeSelected).toEqual('close-by-user'); - expect(closureOptionsRadioComponent.props().onChangeClosureType).toEqual(onChangeClosureType); - }); - - test('the closure type is changed successfully', () => { - wrapper.find('input[id="close-by-pushing"]').simulate('change'); - - expect(onChangeClosureType).toHaveBeenCalledWith('close-by-pushing'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.tsx deleted file mode 100644 index ba892116320ce..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options.tsx +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; - -import { ClosureType } from '../../containers/configure/types'; -import { ClosureOptionsRadio } from './closure_options_radio'; -import * as i18n from './translations'; - -export interface ClosureOptionsProps { - closureTypeSelected: ClosureType; - disabled: boolean; - onChangeClosureType: (newClosureType: ClosureType) => void; -} - -const ClosureOptionsComponent: React.FC<ClosureOptionsProps> = ({ - closureTypeSelected, - disabled, - onChangeClosureType, -}) => { - return ( - <EuiDescribedFormGroup - fullWidth - title={<h3>{i18n.CASE_CLOSURE_OPTIONS_TITLE}</h3>} - description={ - <> - <p>{i18n.CASE_CLOSURE_OPTIONS_DESC}</p> - <p>{i18n.CASE_COLSURE_OPTIONS_SUB_CASES}</p> - </> - } - data-test-subj="case-closure-options-form-group" - > - <EuiFormRow - fullWidth - label={i18n.CASE_CLOSURE_OPTIONS_LABEL} - data-test-subj="case-closure-options-form-row" - > - <ClosureOptionsRadio - closureTypeSelected={closureTypeSelected} - disabled={disabled} - onChangeClosureType={onChangeClosureType} - data-test-subj="case-closure-options-radio" - /> - </EuiFormRow> - </EuiDescribedFormGroup> - ); -}; - -export const ClosureOptions = React.memo(ClosureOptionsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.test.tsx deleted file mode 100644 index e26444590da46..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.test.tsx +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { ReactWrapper, mount } from 'enzyme'; - -import { ClosureOptionsRadio, ClosureOptionsRadioComponentProps } from './closure_options_radio'; -import { TestProviders } from '../../../common/mock'; - -describe('ClosureOptionsRadio', () => { - let wrapper: ReactWrapper; - const onChangeClosureType = jest.fn(); - const props: ClosureOptionsRadioComponentProps = { - disabled: false, - closureTypeSelected: 'close-by-user', - onChangeClosureType, - }; - - beforeAll(() => { - wrapper = mount(<ClosureOptionsRadio {...props} />, { wrappingComponent: TestProviders }); - }); - - test('it renders', () => { - expect(wrapper.find('[data-test-subj="closure-options-radio-group"]').first().exists()).toBe( - true - ); - }); - - test('it shows the correct number of radio buttons', () => { - expect(wrapper.find('input[name="closure_options"]')).toHaveLength(2); - }); - - test('it renders close by user radio button', () => { - expect(wrapper.find('input[id="close-by-user"]').exists()).toBeTruthy(); - }); - - test('it renders close by pushing radio button', () => { - expect(wrapper.find('input[id="close-by-pushing"]').exists()).toBeTruthy(); - }); - - test('it disables the close by user radio button', () => { - const newWrapper = mount(<ClosureOptionsRadio {...props} disabled={true} />, { - wrappingComponent: TestProviders, - }); - - expect(newWrapper.find('input[id="close-by-user"]').prop('disabled')).toEqual(true); - }); - - test('it disables correctly the close by pushing radio button', () => { - const newWrapper = mount(<ClosureOptionsRadio {...props} disabled={true} />, { - wrappingComponent: TestProviders, - }); - - expect(newWrapper.find('input[id="close-by-pushing"]').prop('disabled')).toEqual(true); - }); - - test('it selects the correct radio button', () => { - const newWrapper = mount( - <ClosureOptionsRadio {...props} closureTypeSelected={'close-by-pushing'} />, - { - wrappingComponent: TestProviders, - } - ); - expect(newWrapper.find('input[id="close-by-pushing"]').prop('checked')).toEqual(true); - }); - - test('it calls the onChangeClosureType function', () => { - wrapper.find('input[id="close-by-pushing"]').simulate('change'); - wrapper.update(); - expect(onChangeClosureType).toHaveBeenCalled(); - expect(onChangeClosureType).toHaveBeenCalledWith('close-by-pushing'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.tsx deleted file mode 100644 index cb6fa0953a796..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/closure_options_radio.tsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { ReactNode, useCallback } from 'react'; -import { EuiRadioGroup } from '@elastic/eui'; - -import { ClosureType } from '../../containers/configure/types'; -import * as i18n from './translations'; - -interface ClosureRadios { - id: ClosureType; - label: ReactNode; -} - -const radios: ClosureRadios[] = [ - { - id: 'close-by-user', - label: i18n.CASE_CLOSURE_OPTIONS_MANUAL, - }, - { - id: 'close-by-pushing', - label: i18n.CASE_CLOSURE_OPTIONS_NEW_INCIDENT, - }, -]; - -export interface ClosureOptionsRadioComponentProps { - closureTypeSelected: ClosureType; - disabled: boolean; - onChangeClosureType: (newClosureType: ClosureType) => void; -} - -const ClosureOptionsRadioComponent: React.FC<ClosureOptionsRadioComponentProps> = ({ - closureTypeSelected, - disabled, - onChangeClosureType, -}) => { - const onChangeLocal = useCallback( - (id: string) => { - onChangeClosureType(id as ClosureType); - }, - [onChangeClosureType] - ); - - return ( - <EuiRadioGroup - disabled={disabled} - options={radios} - idSelected={closureTypeSelected} - onChange={onChangeLocal} - name="closure_options" - data-test-subj="closure-options-radio-group" - /> - ); -}; - -export const ClosureOptionsRadio = React.memo(ClosureOptionsRadioComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx deleted file mode 100644 index 1c01bb3fdeb7b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.test.tsx +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; - -import { Connectors, Props } from './connectors'; -import { TestProviders } from '../../../common/mock'; -import { ConnectorsDropdown } from './connectors_dropdown'; -import { connectors } from './__mock__'; -import { ConnectorTypes } from '../../../../../cases/common'; - -describe('Connectors', () => { - let wrapper: ReactWrapper; - const onChangeConnector = jest.fn(); - const handleShowEditFlyout = jest.fn(); - - const props: Props = { - connectors, - disabled: false, - handleShowEditFlyout, - isLoading: false, - mappings: [], - onChangeConnector, - selectedConnector: { id: 'none', type: ConnectorTypes.none }, - updateConnectorDisabled: false, - }; - - beforeAll(() => { - wrapper = mount(<Connectors {...props} />, { wrappingComponent: TestProviders }); - }); - - test('it shows the connectors from group', () => { - expect(wrapper.find('[data-test-subj="case-connectors-form-group"]').first().exists()).toBe( - true - ); - }); - - test('it shows the connectors form row', () => { - expect(wrapper.find('[data-test-subj="case-connectors-form-row"]').first().exists()).toBe(true); - }); - - test('it shows the connectors dropdown', () => { - expect(wrapper.find('[data-test-subj="case-connectors-dropdown"]').first().exists()).toBe(true); - }); - - test('it pass the correct props to child', () => { - const connectorsDropdownProps = wrapper.find(ConnectorsDropdown).props(); - expect(connectorsDropdownProps).toMatchObject({ - disabled: false, - isLoading: false, - connectors, - selectedConnector: 'none', - onChange: props.onChangeConnector, - }); - }); - - test('the connector is changed successfully', () => { - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - - expect(onChangeConnector).toHaveBeenCalled(); - expect(onChangeConnector).toHaveBeenCalledWith('resilient-2'); - }); - - test('the connector is changed successfully to none', () => { - onChangeConnector.mockClear(); - const newWrapper = mount( - <Connectors - {...props} - selectedConnector={{ id: 'servicenow-1', type: ConnectorTypes.serviceNowITSM }} - />, - { - wrappingComponent: TestProviders, - } - ); - - newWrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - newWrapper.find('button[data-test-subj="dropdown-connector-no-connector"]').simulate('click'); - - expect(onChangeConnector).toHaveBeenCalled(); - expect(onChangeConnector).toHaveBeenCalledWith('none'); - }); - - test('it shows the add connector button', () => { - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - - expect( - wrapper.find('button[data-test-subj="dropdown-connector-add-connector"]').exists() - ).toBeTruthy(); - }); - - test('the text of the update button is shown correctly', () => { - const newWrapper = mount( - <Connectors - {...props} - selectedConnector={{ id: 'servicenow-1', type: ConnectorTypes.serviceNowITSM }} - />, - { - wrappingComponent: TestProviders, - } - ); - - expect( - newWrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .text() - ).toBe('Update My Connector'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx deleted file mode 100644 index c0a5e3c4c8f72..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { - EuiDescribedFormGroup, - EuiFormRow, - EuiFlexGroup, - EuiFlexItem, - EuiLink, -} from '@elastic/eui'; - -import styled from 'styled-components'; - -import { ConnectorsDropdown } from './connectors_dropdown'; -import * as i18n from './translations'; - -import { ActionConnector, CaseConnectorMapping } from '../../containers/configure/types'; -import { Mapping } from './mapping'; -import { ConnectorTypes } from '../../../../../cases/common'; - -const EuiFormRowExtended = styled(EuiFormRow)` - .euiFormRow__labelWrapper { - .euiFormRow__label { - width: 100%; - } - } -`; - -export interface Props { - connectors: ActionConnector[]; - disabled: boolean; - handleShowEditFlyout: () => void; - isLoading: boolean; - mappings: CaseConnectorMapping[]; - onChangeConnector: (id: string) => void; - selectedConnector: { id: string; type: string }; - updateConnectorDisabled: boolean; -} -const ConnectorsComponent: React.FC<Props> = ({ - connectors, - disabled, - handleShowEditFlyout, - isLoading, - mappings, - onChangeConnector, - selectedConnector, - updateConnectorDisabled, -}) => { - const connectorsName = useMemo( - () => connectors.find((c) => c.id === selectedConnector.id)?.name ?? 'none', - [connectors, selectedConnector.id] - ); - - const dropDownLabel = useMemo( - () => ( - <EuiFlexGroup justifyContent="spaceBetween"> - <EuiFlexItem grow={false}>{i18n.INCIDENT_MANAGEMENT_SYSTEM_LABEL}</EuiFlexItem> - <EuiFlexItem grow={false}> - {connectorsName !== 'none' && ( - <EuiLink - disabled={updateConnectorDisabled} - onClick={handleShowEditFlyout} - data-test-subj="case-configure-update-selected-connector-button" - > - {i18n.UPDATE_SELECTED_CONNECTOR(connectorsName)} - </EuiLink> - )} - </EuiFlexItem> - </EuiFlexGroup> - ), - [connectorsName, handleShowEditFlyout, updateConnectorDisabled] - ); - return ( - <> - <EuiDescribedFormGroup - fullWidth - title={<h3>{i18n.INCIDENT_MANAGEMENT_SYSTEM_TITLE}</h3>} - description={i18n.INCIDENT_MANAGEMENT_SYSTEM_DESC} - data-test-subj="case-connectors-form-group" - > - <EuiFormRowExtended - fullWidth - label={dropDownLabel} - data-test-subj="case-connectors-form-row" - > - <EuiFlexGroup direction="column"> - <EuiFlexItem grow={false}> - <ConnectorsDropdown - connectors={connectors} - disabled={disabled} - selectedConnector={selectedConnector.id} - isLoading={isLoading} - onChange={onChangeConnector} - data-test-subj="case-connectors-dropdown" - appendAddConnectorButton={true} - /> - </EuiFlexItem> - {selectedConnector.type !== ConnectorTypes.none ? ( - <EuiFlexItem grow={false}> - <Mapping - connectorActionTypeId={selectedConnector.type} - isLoading={isLoading} - mappings={mappings} - /> - </EuiFlexItem> - ) : null} - </EuiFlexGroup> - </EuiFormRowExtended> - </EuiDescribedFormGroup> - </> - ); -}; - -export const Connectors = React.memo(ConnectorsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.test.tsx deleted file mode 100644 index 1f1876756773d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.test.tsx +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { EuiSuperSelect } from '@elastic/eui'; - -import { ConnectorsDropdown, Props } from './connectors_dropdown'; -import { TestProviders } from '../../../common/mock'; -import { connectors } from './__mock__'; - -describe('ConnectorsDropdown', () => { - let wrapper: ReactWrapper; - const props: Props = { - disabled: false, - connectors, - isLoading: false, - onChange: jest.fn(), - selectedConnector: 'none', - }; - - beforeAll(() => { - wrapper = mount(<ConnectorsDropdown {...props} />, { wrappingComponent: TestProviders }); - }); - - test('it renders', () => { - expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().exists()).toBe(true); - }); - - test('it formats the connectors correctly', () => { - const selectProps = wrapper.find(EuiSuperSelect).props(); - - expect(selectProps.options).toMatchInlineSnapshot(` - Array [ - Object { - "data-test-subj": "dropdown-connector-no-connector", - "inputDisplay": <EuiFlexGroup - alignItems="center" - gutterSize="none" - > - <EuiFlexItem - grow={false} - > - <Styled(EuiIcon) - size="m" - type="minusInCircle" - /> - </EuiFlexItem> - <EuiFlexItem> - <span - data-test-subj="dropdown-connector-no-connector" - > - No connector selected - </span> - </EuiFlexItem> - </EuiFlexGroup>, - "value": "none", - }, - Object { - "data-test-subj": "dropdown-connector-servicenow-1", - "inputDisplay": <EuiFlexGroup - alignItems="center" - gutterSize="none" - > - <EuiFlexItem - grow={false} - > - <Styled(EuiIcon) - size="m" - type="test-file-stub" - /> - </EuiFlexItem> - <EuiFlexItem> - <span> - My Connector - </span> - </EuiFlexItem> - </EuiFlexGroup>, - "value": "servicenow-1", - }, - Object { - "data-test-subj": "dropdown-connector-resilient-2", - "inputDisplay": <EuiFlexGroup - alignItems="center" - gutterSize="none" - > - <EuiFlexItem - grow={false} - > - <Styled(EuiIcon) - size="m" - type="test-file-stub" - /> - </EuiFlexItem> - <EuiFlexItem> - <span> - My Connector 2 - </span> - </EuiFlexItem> - </EuiFlexGroup>, - "value": "resilient-2", - }, - Object { - "data-test-subj": "dropdown-connector-jira-1", - "inputDisplay": <EuiFlexGroup - alignItems="center" - gutterSize="none" - > - <EuiFlexItem - grow={false} - > - <Styled(EuiIcon) - size="m" - type="test-file-stub" - /> - </EuiFlexItem> - <EuiFlexItem> - <span> - Jira - </span> - </EuiFlexItem> - </EuiFlexGroup>, - "value": "jira-1", - }, - Object { - "data-test-subj": "dropdown-connector-servicenow-sir", - "inputDisplay": <EuiFlexGroup - alignItems="center" - gutterSize="none" - > - <EuiFlexItem - grow={false} - > - <Styled(EuiIcon) - size="m" - type="test-file-stub" - /> - </EuiFlexItem> - <EuiFlexItem> - <span> - My Connector SIR - </span> - </EuiFlexItem> - </EuiFlexGroup>, - "value": "servicenow-sir", - }, - ] - `); - }); - - test('it disables the dropdown', () => { - const newWrapper = mount(<ConnectorsDropdown {...props} disabled={true} />, { - wrappingComponent: TestProviders, - }); - - expect( - newWrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled') - ).toEqual(true); - }); - - test('it loading correctly', () => { - const newWrapper = mount(<ConnectorsDropdown {...props} isLoading={true} />, { - wrappingComponent: TestProviders, - }); - - expect( - newWrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') - ).toEqual(true); - }); - - test('it selects the correct connector', () => { - const newWrapper = mount(<ConnectorsDropdown {...props} selectedConnector={'servicenow-1'} />, { - wrappingComponent: TestProviders, - }); - - expect(newWrapper.find('button span:not([data-euiicon-type])').text()).toEqual('My Connector'); - }); - - test('if the props hideConnectorServiceNowSir is true, the connector should not be part of the list of options ', () => { - const newWrapper = mount( - <ConnectorsDropdown - {...props} - selectedConnector={'servicenow-1'} - hideConnectorServiceNowSir={true} - />, - { - wrappingComponent: TestProviders, - } - ); - const selectProps = newWrapper.find(EuiSuperSelect).props(); - const options = selectProps.options as Array<{ 'data-test-subj': string }>; - expect( - options.some((o) => o['data-test-subj'] === 'dropdown-connector-servicenow-1') - ).toBeTruthy(); - expect( - options.some((o) => o['data-test-subj'] === 'dropdown-connector-servicenow-sir') - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx deleted file mode 100644 index 27f7f4d50a0c9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSuperSelect } from '@elastic/eui'; -import styled from 'styled-components'; - -import { ConnectorTypes } from '../../../../../cases/common'; -import { ActionConnector } from '../../containers/configure/types'; -import { connectorsConfiguration } from '../connectors'; -import * as i18n from './translations'; - -export interface Props { - connectors: ActionConnector[]; - disabled: boolean; - isLoading: boolean; - onChange: (id: string) => void; - selectedConnector: string; - appendAddConnectorButton?: boolean; - hideConnectorServiceNowSir?: boolean; -} - -const ICON_SIZE = 'm'; - -const EuiIconExtended = styled(EuiIcon)` - margin-right: 13px; - margin-bottom: 0 !important; -`; - -const noConnectorOption = { - value: 'none', - inputDisplay: ( - <EuiFlexGroup gutterSize="none" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiIconExtended type="minusInCircle" size={ICON_SIZE} /> - </EuiFlexItem> - <EuiFlexItem> - <span data-test-subj={`dropdown-connector-no-connector`}>{i18n.NO_CONNECTOR}</span> - </EuiFlexItem> - </EuiFlexGroup> - ), - 'data-test-subj': 'dropdown-connector-no-connector', -}; - -const addNewConnector = { - value: 'add-connector', - inputDisplay: ( - <span className="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--xSmall euiButtonEmpty--flushLeft"> - {i18n.ADD_NEW_CONNECTOR} - </span> - ), - 'data-test-subj': 'dropdown-connector-add-connector', -}; - -const ConnectorsDropdownComponent: React.FC<Props> = ({ - connectors, - disabled, - isLoading, - onChange, - selectedConnector, - appendAddConnectorButton = false, - hideConnectorServiceNowSir = false, -}) => { - const connectorsAsOptions = useMemo(() => { - const connectorsFormatted = connectors.reduce( - (acc, connector) => { - if (hideConnectorServiceNowSir && connector.actionTypeId === ConnectorTypes.serviceNowSIR) { - return acc; - } - - return [ - ...acc, - { - value: connector.id, - inputDisplay: ( - <EuiFlexGroup gutterSize="none" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiIconExtended - type={connectorsConfiguration[connector.actionTypeId]?.logo ?? ''} - size={ICON_SIZE} - /> - </EuiFlexItem> - <EuiFlexItem> - <span>{connector.name}</span> - </EuiFlexItem> - </EuiFlexGroup> - ), - 'data-test-subj': `dropdown-connector-${connector.id}`, - }, - ]; - }, - [noConnectorOption] - ); - - if (appendAddConnectorButton) { - return [...connectorsFormatted, addNewConnector]; - } - - return connectorsFormatted; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [connectors]); - - return ( - <EuiSuperSelect - aria-label={i18n.INCIDENT_MANAGEMENT_SYSTEM_LABEL} - data-test-subj="dropdown-connectors" - disabled={disabled} - fullWidth - isLoading={isLoading} - onChange={onChange} - options={connectorsAsOptions} - valueOfSelected={selectedConnector} - /> - ); -}; - -export const ConnectorsDropdown = React.memo(ConnectorsDropdownComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.test.tsx deleted file mode 100644 index 35f5e1fe058dd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.test.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; - -import { FieldMapping, FieldMappingProps } from './field_mapping'; -import { mappings } from './__mock__'; -import { TestProviders } from '../../../common/mock'; -import { FieldMappingRowStatic } from './field_mapping_row_static'; - -describe('FieldMappingRow', () => { - let wrapper: ReactWrapper; - const props: FieldMappingProps = { - isLoading: false, - mappings, - connectorActionTypeId: '.servicenow', - }; - - beforeAll(() => { - wrapper = mount(<FieldMapping {...props} />, { wrappingComponent: TestProviders }); - }); - test('it renders', () => { - expect( - wrapper.find('[data-test-subj="case-configure-field-mappings-row-wrapper"]').first().exists() - ).toBe(true); - - expect(wrapper.find(FieldMappingRowStatic).length).toEqual(3); - }); - - test('it does not render without mappings', () => { - const newWrapper = mount(<FieldMapping {...props} mappings={[]} />, { - wrappingComponent: TestProviders, - }); - expect( - newWrapper - .find('[data-test-subj="case-configure-field-mappings-row-wrapper"]') - .first() - .exists() - ).toBe(false); - }); - - test('it pass the corrects props to mapping row', () => { - const rows = wrapper.find(FieldMappingRowStatic); - rows.forEach((row, index) => { - expect(row.prop('securitySolutionField')).toEqual(mappings[index].source); - expect(row.prop('selectedActionType')).toEqual(mappings[index].actionType); - expect(row.prop('selectedThirdParty')).toEqual(mappings[index].target); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx deleted file mode 100644 index 25d4f9f90e02b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; -import styled from 'styled-components'; - -import { FieldMappingRowStatic } from './field_mapping_row_static'; -import * as i18n from './translations'; - -import { CaseConnectorMapping } from '../../containers/configure/types'; -import { connectorsConfiguration } from '../connectors'; - -const FieldRowWrapper = styled.div` - margin: 10px 0; - font-size: 14px; -`; - -export interface FieldMappingProps { - connectorActionTypeId: string; - isLoading: boolean; - mappings: CaseConnectorMapping[]; -} - -const FieldMappingComponent: React.FC<FieldMappingProps> = ({ - connectorActionTypeId, - isLoading, - mappings, -}) => { - const selectedConnector = useMemo( - () => connectorsConfiguration[connectorActionTypeId] ?? { fields: {} }, - [connectorActionTypeId] - ); - return mappings.length ? ( - <EuiFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem> - {' '} - <EuiFlexGroup> - <EuiFlexItem> - <span className="euiFormLabel">{i18n.FIELD_MAPPING_FIRST_COL}</span> - </EuiFlexItem> - <EuiFlexItem> - <span className="euiFormLabel"> - {i18n.FIELD_MAPPING_SECOND_COL(selectedConnector.name)} - </span> - </EuiFlexItem> - <EuiFlexItem> - <span className="euiFormLabel">{i18n.FIELD_MAPPING_THIRD_COL}</span> - </EuiFlexItem> - </EuiFlexGroup> - </EuiFlexItem> - <EuiFlexItem> - <FieldRowWrapper data-test-subj="case-configure-field-mappings-row-wrapper"> - {mappings.map((item) => ( - <FieldMappingRowStatic - key={`${item.source}`} - securitySolutionField={item.source} - isLoading={isLoading} - selectedActionType={item.actionType} - selectedThirdParty={item.target ?? 'not_mapped'} - /> - ))} - </FieldRowWrapper> - </EuiFlexItem> - </EuiFlexGroup> - ) : null; -}; - -export const FieldMapping = React.memo(FieldMappingComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping_row_static.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping_row_static.tsx deleted file mode 100644 index a732f403ee646..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping_row_static.tsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { EuiCode, EuiFlexItem, EuiFlexGroup, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; - -import { capitalize } from 'lodash/fp'; -import { CaseField, ActionType, ThirdPartyField } from '../../containers/configure/types'; - -export interface RowProps { - isLoading: boolean; - securitySolutionField: CaseField; - selectedActionType: ActionType; - selectedThirdParty: ThirdPartyField; -} - -const FieldMappingRowComponent: React.FC<RowProps> = ({ - isLoading, - securitySolutionField, - selectedActionType, - selectedThirdParty, -}) => { - const selectedActionTypeCapitalized = useMemo(() => capitalize(selectedActionType), [ - selectedActionType, - ]); - return ( - <EuiFlexGroup data-test-subj="static-mappings" alignItems="center"> - <EuiFlexItem> - <EuiFlexGroup component="span" justifyContent="spaceBetween"> - <EuiFlexItem component="span" grow={false}> - <EuiCode data-test-subj="field-mapping-source">{securitySolutionField}</EuiCode> - </EuiFlexItem> - <EuiFlexItem component="span" grow={false}> - <EuiIcon type="sortRight" /> - </EuiFlexItem> - </EuiFlexGroup> - </EuiFlexItem> - <EuiFlexItem> - <EuiFlexGroup component="span" justifyContent="spaceBetween"> - <EuiFlexItem component="span" grow={false}> - {isLoading ? ( - <EuiLoadingSpinner size="m" /> - ) : ( - <EuiCode data-test-subj="field-mapping-target">{selectedThirdParty}</EuiCode> - )} - </EuiFlexItem> - </EuiFlexGroup> - </EuiFlexItem> - <EuiFlexItem> - {isLoading ? <EuiLoadingSpinner size="m" /> : selectedActionTypeCapitalized} - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const FieldMappingRowStatic = React.memo(FieldMappingRowComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx deleted file mode 100644 index e78cd4c509d5d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.test.tsx +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { ReactWrapper, mount } from 'enzyme'; - -import { ConfigureCases } from '.'; -import { TestProviders } from '../../../common/mock'; -import { Connectors } from './connectors'; -import { ClosureOptions } from './closure_options'; -import { - ActionConnector, - ConnectorAddFlyout, - ConnectorEditFlyout, - TriggersAndActionsUIPublicPluginStart, -} from '../../../../../triggers_actions_ui/public'; -import { actionTypeRegistryMock } from '../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; - -import { useKibana } from '../../../common/lib/kibana'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { useCaseConfigure } from '../../containers/configure/use_configure'; -import { useActionTypes } from '../../containers/configure/use_action_types'; -import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; - -import { - connectors, - searchURL, - useCaseConfigureResponse, - useConnectorsResponse, - useActionTypesResponse, -} from './__mock__'; -import { ConnectorTypes } from '../../../../../cases/common'; - -jest.mock('../../../common/lib/kibana'); -jest.mock('../../containers/configure/use_connectors'); -jest.mock('../../containers/configure/use_configure'); -jest.mock('../../containers/configure/use_action_types'); -jest.mock('../../../common/components/navigation/use_get_url_search'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; -const useConnectorsMock = useConnectors as jest.Mock; -const useCaseConfigureMock = useCaseConfigure as jest.Mock; -const useGetUrlSearchMock = useGetUrlSearch as jest.Mock; -const useActionTypesMock = useActionTypes as jest.Mock; - -describe('ConfigureCases', () => { - beforeEach(() => { - useKibanaMock().services.triggersActionsUi = ({ - actionTypeRegistry: actionTypeRegistryMock.create(), - getAddConnectorFlyout: jest.fn().mockImplementation(() => ( - <ConnectorAddFlyout - onClose={() => {}} - actionTypeRegistry={actionTypeRegistryMock.create()} - actionTypes={[ - { - id: '.servicenow', - name: 'servicenow', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - minimumLicenseRequired: 'gold', - }, - { - id: '.jira', - name: 'jira', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - minimumLicenseRequired: 'gold', - }, - { - id: '.resilient', - name: 'resilient', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - minimumLicenseRequired: 'gold', - }, - ]} - /> - )), - getEditConnectorFlyout: jest - .fn() - .mockImplementation(() => ( - <ConnectorEditFlyout - onClose={() => {}} - actionTypeRegistry={actionTypeRegistryMock.create()} - initialConnector={connectors[1] as ActionConnector} - /> - )), - } as unknown) as TriggersAndActionsUIPublicPluginStart; - - useActionTypesMock.mockImplementation(() => useActionTypesResponse); - }); - - describe('rendering', () => { - let wrapper: ReactWrapper; - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); - useConnectorsMock.mockImplementation(() => ({ ...useConnectorsResponse, connectors: [] })); - useGetUrlSearchMock.mockImplementation(() => searchURL); - - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it renders the Connectors', () => { - expect(wrapper.find('[data-test-subj="dropdown-connectors"]').exists()).toBeTruthy(); - }); - - test('it renders the ClosureType', () => { - expect(wrapper.find('[data-test-subj="closure-options-radio-group"]').exists()).toBeTruthy(); - }); - - test('it does NOT render the ConnectorAddFlyout', () => { - // Components from triggersActionsUi do not have a data-test-subj - expect(wrapper.find(ConnectorAddFlyout).exists()).toBeFalsy(); - }); - - test('it does NOT render the ConnectorEditFlyout', () => { - // Components from triggersActionsUi do not have a data-test-subj - expect(wrapper.find(ConnectorEditFlyout).exists()).toBeFalsy(); - }); - - test('it does NOT render the EuiCallOut', () => { - expect( - wrapper.find('[data-test-subj="configure-cases-warning-callout"]').exists() - ).toBeFalsy(); - }); - }); - - describe('Unhappy path', () => { - let wrapper: ReactWrapper; - - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - closureType: 'close-by-user', - connector: { - id: 'not-id', - name: 'unchanged', - type: ConnectorTypes.none, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'not-id', - name: 'unchanged', - type: ConnectorTypes.none, - fields: null, - }, - closureType: 'close-by-user', - }, - })); - useConnectorsMock.mockImplementation(() => ({ ...useConnectorsResponse, connectors: [] })); - useGetUrlSearchMock.mockImplementation(() => searchURL); - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it shows the warning callout when configuration is invalid', () => { - expect( - wrapper.find('[data-test-subj="configure-cases-warning-callout"]').exists() - ).toBeTruthy(); - }); - - test('it hides the update connector button when the connectorId is invalid', () => { - expect( - wrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .exists() - ).toBeFalsy(); - }); - }); - - describe('Happy path', () => { - let wrapper: ReactWrapper; - - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - mappings: [], - closureType: 'close-by-user', - connector: { - id: 'servicenow-1', - name: 'unchanged', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'servicenow-1', - name: 'unchanged', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - closureType: 'close-by-user', - }, - })); - useConnectorsMock.mockImplementation(() => useConnectorsResponse); - useGetUrlSearchMock.mockImplementation(() => searchURL); - - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it renders with correct props', () => { - // Connector - expect(wrapper.find(Connectors).prop('connectors')).toEqual(connectors); - expect(wrapper.find(Connectors).prop('disabled')).toBe(false); - expect(wrapper.find(Connectors).prop('isLoading')).toBe(false); - expect(wrapper.find(Connectors).prop('selectedConnector').id).toBe('servicenow-1'); - - // ClosureOptions - expect(wrapper.find(ClosureOptions).prop('disabled')).toBe(false); - expect(wrapper.find(ClosureOptions).prop('closureTypeSelected')).toBe('close-by-user'); - - // Flyouts - expect(wrapper.find(ConnectorAddFlyout).exists()).toBe(false); - expect(wrapper.find(ConnectorEditFlyout).exists()).toBe(false); - }); - - test('it disables correctly when the user cannot crud', () => { - const newWrapper = mount(<ConfigureCases userCanCrud={false} />, { - wrappingComponent: TestProviders, - }); - - expect(newWrapper.find('button[data-test-subj="dropdown-connectors"]').prop('disabled')).toBe( - true - ); - - expect( - newWrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .prop('disabled') - ).toBe(true); - - // Two closure options - expect( - newWrapper - .find('[data-test-subj="closure-options-radio-group"] input') - .first() - .prop('disabled') - ).toBe(true); - - expect( - newWrapper - .find('[data-test-subj="closure-options-radio-group"] input') - .at(1) - .prop('disabled') - ).toBe(true); - }); - }); - - describe('loading connectors', () => { - let wrapper: ReactWrapper; - - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - mapping: null, - closureType: 'close-by-user', - connector: { - id: 'resilient-2', - name: 'unchanged', - type: ConnectorTypes.resilient, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'servicenow-1', - name: 'unchanged', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - closureType: 'close-by-user', - }, - })); - - useConnectorsMock.mockImplementation(() => ({ - ...useConnectorsResponse, - loading: true, - })); - - useGetUrlSearchMock.mockImplementation(() => searchURL); - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it disables correctly Connector when loading connectors', () => { - expect( - wrapper.find('button[data-test-subj="dropdown-connectors"]').prop('disabled') - ).toBeTruthy(); - }); - - test('it pass the correct value to isLoading attribute on Connector', () => { - expect(wrapper.find(Connectors).prop('isLoading')).toBe(true); - }); - - test('it disables correctly ClosureOptions when loading connectors', () => { - expect(wrapper.find(ClosureOptions).prop('disabled')).toBe(true); - }); - - test('it hides the update connector button when loading the connectors', () => { - expect( - wrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .prop('disabled') - ).toBe(true); - }); - - test('it shows isLoading when loading action types', () => { - useConnectorsMock.mockImplementation(() => ({ - ...useConnectorsResponse, - loading: false, - })); - - useActionTypesMock.mockImplementation(() => ({ ...useActionTypesResponse, loading: true })); - - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - expect(wrapper.find(Connectors).prop('isLoading')).toBe(true); - }); - }); - - describe('saving configuration', () => { - let wrapper: ReactWrapper; - - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - connector: { - id: 'servicenow-1', - name: 'SN', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - persistLoading: true, - })); - - useConnectorsMock.mockImplementation(() => useConnectorsResponse); - useGetUrlSearchMock.mockImplementation(() => searchURL); - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it disables correctly Connector when saving configuration', () => { - expect(wrapper.find(Connectors).prop('disabled')).toBe(true); - }); - - test('it disables correctly ClosureOptions when saving configuration', () => { - expect( - wrapper - .find('[data-test-subj="closure-options-radio-group"] input') - .first() - .prop('disabled') - ).toBe(true); - - expect( - wrapper.find('[data-test-subj="closure-options-radio-group"] input').at(1).prop('disabled') - ).toBe(true); - }); - - test('it disables the update connector button when saving the configuration', () => { - expect( - wrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .prop('disabled') - ).toBe(true); - }); - }); - - describe('loading configuration', () => { - let wrapper: ReactWrapper; - - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - loading: true, - })); - useConnectorsMock.mockImplementation(() => ({ - ...useConnectorsResponse, - })); - useGetUrlSearchMock.mockImplementation(() => searchURL); - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it hides the update connector button when loading the configuration', () => { - expect( - wrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .exists() - ).toBeFalsy(); - }); - }); - - describe('connectors', () => { - let wrapper: ReactWrapper; - let persistCaseConfigure: jest.Mock; - - beforeEach(() => { - persistCaseConfigure = jest.fn(); - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - mapping: null, - closureType: 'close-by-user', - connector: { - id: 'resilient-2', - name: 'My connector', - type: ConnectorTypes.resilient, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'My connector', - name: 'My connector', - type: ConnectorTypes.jira, - fields: null, - }, - closureType: 'close-by-user', - }, - persistCaseConfigure, - })); - useConnectorsMock.mockImplementation(() => useConnectorsResponse); - useGetUrlSearchMock.mockImplementation(() => searchURL); - - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it submits the configuration correctly when changing connector', () => { - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - - expect(persistCaseConfigure).toHaveBeenCalled(); - expect(persistCaseConfigure).toHaveBeenCalledWith({ - connector: { - id: 'resilient-2', - name: 'My Connector 2', - type: ConnectorTypes.resilient, - fields: null, - }, - closureType: 'close-by-user', - }); - }); - - test('the text of the update button is changed successfully', () => { - useCaseConfigureMock - .mockImplementationOnce(() => ({ - ...useCaseConfigureResponse, - connector: { - id: 'servicenow-1', - name: 'My connector', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - })) - .mockImplementation(() => ({ - ...useCaseConfigureResponse, - connector: { - id: 'resilient-2', - name: 'My connector 2', - type: ConnectorTypes.resilient, - fields: null, - }, - })); - - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - - expect( - wrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .text() - ).toBe('Update My Connector 2'); - }); - }); -}); - -describe('closure options', () => { - let wrapper: ReactWrapper; - let persistCaseConfigure: jest.Mock; - - beforeEach(() => { - persistCaseConfigure = jest.fn(); - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - mapping: null, - closureType: 'close-by-user', - connector: { - id: 'servicenow-1', - name: 'My connector', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'My connector', - name: 'My connector', - type: ConnectorTypes.jira, - fields: null, - }, - closureType: 'close-by-user', - }, - persistCaseConfigure, - })); - useConnectorsMock.mockImplementation(() => useConnectorsResponse); - useGetUrlSearchMock.mockImplementation(() => searchURL); - - wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - }); - - test('it submits the configuration correctly when changing closure type', () => { - wrapper.find('input[id="close-by-pushing"]').simulate('change'); - wrapper.update(); - - expect(persistCaseConfigure).toHaveBeenCalled(); - expect(persistCaseConfigure).toHaveBeenCalledWith({ - connector: { - id: 'servicenow-1', - name: 'My connector', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - closureType: 'close-by-pushing', - }); - }); -}); - -describe('user interactions', () => { - beforeEach(() => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - mapping: null, - closureType: 'close-by-user', - connector: { - id: 'resilient-2', - name: 'unchanged', - type: ConnectorTypes.resilient, - fields: null, - }, - currentConfiguration: { - connector: { - id: 'resilient-2', - name: 'unchanged', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - closureType: 'close-by-user', - }, - })); - useConnectorsMock.mockImplementation(() => useConnectorsResponse); - useGetUrlSearchMock.mockImplementation(() => searchURL); - }); - - test('it show the add flyout when pressing the add connector button', () => { - const wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-add-connector"]').simulate('click'); - wrapper.update(); - - expect(wrapper.find(ConnectorAddFlyout).exists()).toBe(true); - expect(wrapper.find(ConnectorAddFlyout).prop('actionTypes')).toEqual([ - expect.objectContaining({ - id: '.servicenow', - }), - expect.objectContaining({ - id: '.jira', - }), - expect.objectContaining({ - id: '.resilient', - }), - ]); - }); - - test('it show the edit flyout when pressing the update connector button', () => { - const wrapper = mount(<ConfigureCases userCanCrud />, { wrappingComponent: TestProviders }); - wrapper - .find('button[data-test-subj="case-configure-update-selected-connector-button"]') - .simulate('click'); - wrapper.update(); - - expect(wrapper.find(ConnectorEditFlyout).exists()).toBe(true); - expect(wrapper.find(ConnectorEditFlyout).prop('initialConnector')).toEqual(connectors[1]); - expect( - wrapper.find('[data-test-subj="case-configure-action-bottom-bar"]').exists() - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx deleted file mode 100644 index e951498c6c3c9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import styled, { css } from 'styled-components'; - -import { EuiCallOut } from '@elastic/eui'; - -import { SUPPORTED_CONNECTORS } from '../../../../../cases/common'; -import { useKibana } from '../../../common/lib/kibana'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { useActionTypes } from '../../containers/configure/use_action_types'; -import { useCaseConfigure } from '../../containers/configure/use_configure'; - -import { ClosureType } from '../../containers/configure/types'; - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ActionConnectorTableItem } from '../../../../../triggers_actions_ui/public/types'; - -import { SectionWrapper } from '../wrappers'; -import { Connectors } from './connectors'; -import { ClosureOptions } from './closure_options'; -import { - getConnectorById, - getNoneConnector, - normalizeActionConnector, - normalizeCaseConnector, -} from './utils'; -import * as i18n from './translations'; - -const FormWrapper = styled.div` - ${({ theme }) => css` - & > * { - margin-top 40px; - } - - & > :first-child { - margin-top: 0; - } - - padding-top: ${theme.eui.paddingSizes.xl}; - padding-bottom: ${theme.eui.paddingSizes.xl}; - .euiFlyout { - z-index: ${theme.eui.euiZNavigation + 1}; - } - `} -`; - -interface ConfigureCasesComponentProps { - userCanCrud: boolean; -} - -const ConfigureCasesComponent: React.FC<ConfigureCasesComponentProps> = ({ userCanCrud }) => { - const { triggersActionsUi } = useKibana().services; - - const [connectorIsValid, setConnectorIsValid] = useState(true); - const [addFlyoutVisible, setAddFlyoutVisibility] = useState<boolean>(false); - const [editFlyoutVisible, setEditFlyoutVisibility] = useState<boolean>(false); - const [editedConnectorItem, setEditedConnectorItem] = useState<ActionConnectorTableItem | null>( - null - ); - - const { - connector, - closureType, - loading: loadingCaseConfigure, - mappings, - persistLoading, - persistCaseConfigure, - refetchCaseConfigure, - setConnector, - setClosureType, - } = useCaseConfigure(); - - const { loading: isLoadingConnectors, connectors, refetchConnectors } = useConnectors(); - const { loading: isLoadingActionTypes, actionTypes, refetchActionTypes } = useActionTypes(); - const supportedActionTypes = useMemo( - () => actionTypes.filter((actionType) => SUPPORTED_CONNECTORS.includes(actionType.id)), - [actionTypes] - ); - - const onConnectorUpdate = useCallback(async () => { - refetchConnectors(); - refetchActionTypes(); - refetchCaseConfigure(); - }, [refetchActionTypes, refetchCaseConfigure, refetchConnectors]); - - const isLoadingAny = - isLoadingConnectors || persistLoading || loadingCaseConfigure || isLoadingActionTypes; - const updateConnectorDisabled = isLoadingAny || !connectorIsValid || connector.id === 'none'; - const onClickUpdateConnector = useCallback(() => { - setEditFlyoutVisibility(true); - }, []); - - const onCloseAddFlyout = useCallback(() => setAddFlyoutVisibility(false), [ - setAddFlyoutVisibility, - ]); - - const onCloseEditFlyout = useCallback(() => setEditFlyoutVisibility(false), []); - - const onChangeConnector = useCallback( - (id: string) => { - if (id === 'add-connector') { - setAddFlyoutVisibility(true); - return; - } - - const actionConnector = getConnectorById(id, connectors); - const caseConnector = - actionConnector != null ? normalizeActionConnector(actionConnector) : getNoneConnector(); - - setConnector(caseConnector); - persistCaseConfigure({ - connector: caseConnector, - closureType, - }); - }, - [connectors, closureType, persistCaseConfigure, setConnector] - ); - - const onChangeClosureType = useCallback( - (type: ClosureType) => { - setClosureType(type); - persistCaseConfigure({ - connector, - closureType: type, - }); - }, - [connector, persistCaseConfigure, setClosureType] - ); - - useEffect(() => { - if ( - !isLoadingConnectors && - connector.id !== 'none' && - !connectors.some((c) => c.id === connector.id) - ) { - setConnectorIsValid(false); - } else if ( - !isLoadingConnectors && - (connector.id === 'none' || connectors.some((c) => c.id === connector.id)) - ) { - setConnectorIsValid(true); - } - }, [connectors, connector, isLoadingConnectors]); - - useEffect(() => { - if (!isLoadingConnectors && connector.id !== 'none') { - setEditedConnectorItem( - normalizeCaseConnector(connectors, connector) as ActionConnectorTableItem - ); - } - }, [connectors, connector, isLoadingConnectors]); - - const ConnectorAddFlyout = useMemo( - () => - triggersActionsUi.getAddConnectorFlyout({ - consumer: 'case', - onClose: onCloseAddFlyout, - actionTypes: supportedActionTypes, - reloadConnectors: onConnectorUpdate, - }), - // eslint-disable-next-line react-hooks/exhaustive-deps - [supportedActionTypes] - ); - - const ConnectorEditFlyout = useMemo( - () => - editedConnectorItem && editFlyoutVisible - ? triggersActionsUi.getEditConnectorFlyout({ - initialConnector: editedConnectorItem, - consumer: 'case', - onClose: onCloseEditFlyout, - reloadConnectors: onConnectorUpdate, - }) - : null, - // eslint-disable-next-line react-hooks/exhaustive-deps - [connector.id, editFlyoutVisible] - ); - - return ( - <FormWrapper> - {!connectorIsValid && ( - <SectionWrapper style={{ marginTop: 0 }}> - <EuiCallOut - title={i18n.WARNING_NO_CONNECTOR_TITLE} - color="warning" - iconType="help" - data-test-subj="configure-cases-warning-callout" - > - {i18n.WARNING_NO_CONNECTOR_MESSAGE} - </EuiCallOut> - </SectionWrapper> - )} - <SectionWrapper> - <ClosureOptions - closureTypeSelected={closureType} - disabled={persistLoading || isLoadingConnectors || !userCanCrud} - onChangeClosureType={onChangeClosureType} - /> - </SectionWrapper> - <SectionWrapper> - <Connectors - connectors={connectors ?? []} - disabled={persistLoading || isLoadingConnectors || !userCanCrud} - handleShowEditFlyout={onClickUpdateConnector} - isLoading={isLoadingAny} - mappings={mappings} - onChangeConnector={onChangeConnector} - selectedConnector={connector} - updateConnectorDisabled={updateConnectorDisabled || !userCanCrud} - /> - </SectionWrapper> - {addFlyoutVisible && ConnectorAddFlyout} - {ConnectorEditFlyout} - </FormWrapper> - ); -}; - -export const ConfigureCases = React.memo(ConfigureCasesComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.test.tsx deleted file mode 100644 index 115481c5e7302..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.test.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { TestProviders } from '../../../common/mock'; -import { Mapping, MappingProps } from './mapping'; -import { mappings } from './__mock__'; - -describe('Mapping', () => { - const props: MappingProps = { - connectorActionTypeId: '.servicenow', - isLoading: false, - mappings, - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - test('it shows mapping form group', () => { - const wrapper = mount(<Mapping {...props} />, { wrappingComponent: TestProviders }); - expect(wrapper.find('[data-test-subj="static-mappings"]').first().exists()).toBe(true); - }); - - test('correctly maps fields', () => { - const wrapper = mount(<Mapping {...props} />, { wrappingComponent: TestProviders }); - expect(wrapper.find('[data-test-subj="field-mapping-source"] code').first().text()).toBe( - 'title' - ); - expect(wrapper.find('[data-test-subj="field-mapping-target"] code').first().text()).toBe( - 'short_description' - ); - }); - test('displays connection warning when isLoading: false and mappings: []', () => { - const wrapper = mount(<Mapping {...{ ...props, mappings: [] }} />, { - wrappingComponent: TestProviders, - }); - expect(wrapper.find('[data-test-subj="field-mapping-desc"]').first().text()).toBe( - 'Field mappings require an established connection to ServiceNow ITSM. Please check your connection credentials.' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.tsx deleted file mode 100644 index 5ec6a33f48b6a..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/mapping.tsx +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; - -import { EuiFlexGroup, EuiFlexItem, EuiText, EuiTextColor } from '@elastic/eui'; - -import { TextColor } from '@elastic/eui/src/components/text/text_color'; -import * as i18n from './translations'; - -import { FieldMapping } from './field_mapping'; -import { CaseConnectorMapping } from '../../containers/configure/types'; -import { connectorsConfiguration } from '../connectors'; - -export interface MappingProps { - connectorActionTypeId: string; - isLoading: boolean; - mappings: CaseConnectorMapping[]; -} - -const MappingComponent: React.FC<MappingProps> = ({ - connectorActionTypeId, - isLoading, - mappings, -}) => { - const selectedConnector = useMemo(() => connectorsConfiguration[connectorActionTypeId], [ - connectorActionTypeId, - ]); - const fieldMappingDesc: { desc: string; color: TextColor } = useMemo( - () => - mappings.length > 0 || isLoading - ? { desc: i18n.FIELD_MAPPING_DESC(selectedConnector.name), color: 'subdued' } - : { desc: i18n.FIELD_MAPPING_DESC_ERR(selectedConnector.name), color: 'danger' }, - [isLoading, mappings.length, selectedConnector.name] - ); - return ( - <EuiFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem grow={false}> - <EuiText size="xs"> - <h4>{i18n.FIELD_MAPPING_TITLE(selectedConnector.name)}</h4> - <EuiTextColor data-test-subj="field-mapping-desc" color={fieldMappingDesc.color}> - {fieldMappingDesc.desc} - </EuiTextColor> - </EuiText> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <FieldMapping - connectorActionTypeId={connectorActionTypeId} - data-test-subj="case-mappings-field" - isLoading={isLoading} - mappings={mappings} - /> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const Mapping = React.memo(MappingComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/translations.ts b/x-pack/plugins/security_solution/public/cases/components/configure_cases/translations.ts deleted file mode 100644 index 697d5e1a7adfa..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/translations.ts +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../../translations'; - -export const INCIDENT_MANAGEMENT_SYSTEM_TITLE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.incidentManagementSystemTitle', - { - defaultMessage: 'Connect to external incident management system', - } -); - -export const INCIDENT_MANAGEMENT_SYSTEM_DESC = i18n.translate( - 'xpack.securitySolution.cases.configureCases.incidentManagementSystemDesc', - { - defaultMessage: - 'You may optionally connect Security cases to an external incident management system of your choosing. This will allow you to push case data as an incident in your chosen third-party system.', - } -); - -export const INCIDENT_MANAGEMENT_SYSTEM_LABEL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.incidentManagementSystemLabel', - { - defaultMessage: 'Incident management system', - } -); - -export const ADD_NEW_CONNECTOR = i18n.translate( - 'xpack.securitySolution.cases.configureCases.addNewConnector', - { - defaultMessage: 'Add new connector', - } -); - -export const CASE_CLOSURE_OPTIONS_TITLE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsTitle', - { - defaultMessage: 'Case Closures', - } -); - -export const CASE_CLOSURE_OPTIONS_DESC = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsDesc', - { - defaultMessage: - 'Define how you wish Security cases to be closed. Automated case closures require an established connection to an external incident management system.', - } -); - -export const CASE_COLSURE_OPTIONS_SUB_CASES = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsSubCases', - { - defaultMessage: 'Automated closures of sub-cases is not currently supported.', - } -); - -export const CASE_CLOSURE_OPTIONS_LABEL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsLabel', - { - defaultMessage: 'Case closure options', - } -); - -export const CASE_CLOSURE_OPTIONS_MANUAL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsManual', - { - defaultMessage: 'Manually close Security cases', - } -); - -export const CASE_CLOSURE_OPTIONS_NEW_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsNewIncident', - { - defaultMessage: - 'Automatically close Security cases when pushing new incident to external system', - } -); - -export const CASE_CLOSURE_OPTIONS_CLOSED_INCIDENT = i18n.translate( - 'xpack.securitySolution.cases.configureCases.caseClosureOptionsClosedIncident', - { - defaultMessage: 'Automatically close Security cases when incident is closed in external system', - } -); -export const FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingTitle', { - values: { thirdPartyName }, - defaultMessage: '{ thirdPartyName } field mappings', - }); -}; - -export const FIELD_MAPPING_DESC = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingDesc', { - values: { thirdPartyName }, - defaultMessage: - 'Map Security Case fields to { thirdPartyName } fields when pushing data to { thirdPartyName }. Field mappings require an established connection to { thirdPartyName }.', - }); -}; - -export const FIELD_MAPPING_DESC_ERR = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingDescErr', { - values: { thirdPartyName }, - defaultMessage: - 'Field mappings require an established connection to { thirdPartyName }. Please check your connection credentials.', - }); -}; -export const EDIT_FIELD_MAPPING_TITLE = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.editFieldMappingTitle', { - values: { thirdPartyName }, - defaultMessage: 'Edit { thirdPartyName } field mappings', - }); -}; - -export const FIELD_MAPPING_FIRST_COL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingFirstCol', - { - defaultMessage: 'Security case field', - } -); - -export const FIELD_MAPPING_SECOND_COL = (thirdPartyName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.fieldMappingSecondCol', { - values: { thirdPartyName }, - defaultMessage: '{ thirdPartyName } field', - }); -}; - -export const FIELD_MAPPING_THIRD_COL = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingThirdCol', - { - defaultMessage: 'On edit and update', - } -); - -export const FIELD_MAPPING_EDIT_NOTHING = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingEditNothing', - { - defaultMessage: 'Nothing', - } -); - -export const FIELD_MAPPING_EDIT_OVERWRITE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingEditOverwrite', - { - defaultMessage: 'Overwrite', - } -); - -export const FIELD_MAPPING_EDIT_APPEND = i18n.translate( - 'xpack.securitySolution.cases.configureCases.fieldMappingEditAppend', - { - defaultMessage: 'Append', - } -); - -export const CANCEL = i18n.translate('xpack.securitySolution.cases.configureCases.cancelButton', { - defaultMessage: 'Cancel', -}); - -export const SAVE = i18n.translate('xpack.securitySolution.cases.configureCases.saveButton', { - defaultMessage: 'Save', -}); - -export const SAVE_CLOSE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.saveAndCloseButton', - { - defaultMessage: 'Save & close', - } -); - -export const WARNING_NO_CONNECTOR_TITLE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.warningTitle', - { - defaultMessage: 'Warning', - } -); - -export const WARNING_NO_CONNECTOR_MESSAGE = i18n.translate( - 'xpack.securitySolution.cases.configureCases.warningMessage', - { - defaultMessage: - 'The selected connector has been deleted. Either select a different connector or create a new one.', - } -); - -export const MAPPING_FIELD_NOT_MAPPED = i18n.translate( - 'xpack.securitySolution.cases.configureCases.mappingFieldNotMapped', - { - defaultMessage: 'Not mapped', - } -); - -export const COMMENT = i18n.translate( - 'xpack.securitySolution.cases.configureCases.commentMapping', - { - defaultMessage: 'Comments', - } -); - -export const NO_FIELDS_ERROR = (connectorName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.noFieldsError', { - values: { connectorName }, - defaultMessage: - 'No { connectorName } fields found. Please check your { connectorName } connector settings or your { connectorName } instance settings to resolve.', - }); -}; - -export const BLANK_MAPPINGS = (connectorName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.blankMappings', { - values: { connectorName }, - defaultMessage: 'At least one field needs to be mapped to { connectorName }', - }); -}; - -export const REQUIRED_MAPPINGS = (connectorName: string, fields: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.requiredMappings', { - values: { connectorName, fields }, - defaultMessage: - 'At least one Case field needs to be mapped to the following required { connectorName } fields: { fields }', - }); -}; -export const UPDATE_FIELD_MAPPINGS = i18n.translate( - 'xpack.securitySolution.cases.configureCases.updateConnector', - { - defaultMessage: 'Update field mappings', - } -); - -export const UPDATE_SELECTED_CONNECTOR = (connectorName: string): string => { - return i18n.translate('xpack.securitySolution.cases.configureCases.updateSelectedConnector', { - values: { connectorName }, - defaultMessage: 'Update { connectorName }', - }); -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.test.tsx deleted file mode 100644 index 45bb7f1f5136d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.test.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { mappings } from './__mock__'; -import { setActionTypeToMapping, setThirdPartyToMapping } from './utils'; -import { CaseConnectorMapping } from '../../containers/configure/types'; - -describe('FieldMappingRow', () => { - test('it should change the action type', () => { - const newMapping = setActionTypeToMapping('title', 'nothing', mappings); - expect(newMapping[0].actionType).toBe('nothing'); - }); - - test('it should not change other fields', () => { - const [newTitle, description, comments] = setActionTypeToMapping('title', 'nothing', mappings); - expect(newTitle).not.toEqual(mappings[0]); - expect(description).toEqual(mappings[1]); - expect(comments).toEqual(mappings[2]); - }); - - test('it should return a new array when changing action type', () => { - const newMapping = setActionTypeToMapping('title', 'nothing', mappings); - expect(newMapping).not.toBe(mappings); - }); - - test('it should change the third party', () => { - const newMapping = setThirdPartyToMapping('title', 'description', mappings); - expect(newMapping[0].target).toBe('description'); - }); - - test('it should not change other fields when there is not a conflict', () => { - const tempMapping: CaseConnectorMapping[] = [ - { - source: 'title', - target: 'short_description', - actionType: 'overwrite', - }, - { - source: 'comments', - target: 'comments', - actionType: 'append', - }, - ]; - - const [newTitle, comments] = setThirdPartyToMapping('title', 'description', tempMapping); - - expect(newTitle).not.toEqual(mappings[0]); - expect(comments).toEqual(tempMapping[1]); - }); - - test('it should return a new array when changing third party', () => { - const newMapping = setThirdPartyToMapping('title', 'description', mappings); - expect(newMapping).not.toBe(mappings); - }); - - test('it should change the target of the conflicting third party field to not_mapped', () => { - const newMapping = setThirdPartyToMapping('title', 'description', mappings); - expect(newMapping[1].target).toBe('not_mapped'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts b/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts deleted file mode 100644 index dfb19250f5bd6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/utils.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ConnectorTypeFields, ConnectorTypes } from '../../../../../cases/common'; -import { - CaseField, - ActionType, - ThirdPartyField, - ActionConnector, - CaseConnector, - CaseConnectorMapping, -} from '../../containers/configure/types'; - -export const setActionTypeToMapping = ( - caseField: CaseField, - newActionType: ActionType, - mapping: CaseConnectorMapping[] -): CaseConnectorMapping[] => { - const findItemIndex = mapping.findIndex((item) => item.source === caseField); - - if (findItemIndex >= 0) { - return [ - ...mapping.slice(0, findItemIndex), - { ...mapping[findItemIndex], actionType: newActionType }, - ...mapping.slice(findItemIndex + 1), - ]; - } - - return [...mapping]; -}; - -export const setThirdPartyToMapping = ( - caseField: CaseField, - newThirdPartyField: ThirdPartyField, - mapping: CaseConnectorMapping[] -): CaseConnectorMapping[] => - mapping.map((item) => { - if (item.source !== caseField && item.target === newThirdPartyField) { - return { ...item, target: 'not_mapped' }; - } else if (item.source === caseField) { - return { ...item, target: newThirdPartyField }; - } - return item; - }); - -export const getNoneConnector = (): CaseConnector => ({ - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, -}); - -export const getConnectorById = ( - id: string, - connectors: ActionConnector[] -): ActionConnector | null => connectors.find((c) => c.id === id) ?? null; - -export const normalizeActionConnector = ( - actionConnector: ActionConnector, - fields: CaseConnector['fields'] = null -): CaseConnector => { - const caseConnectorFieldsType = { - type: actionConnector.actionTypeId, - fields, - } as ConnectorTypeFields; - return { - id: actionConnector.id, - name: actionConnector.name, - ...caseConnectorFieldsType, - }; -}; - -export const normalizeCaseConnector = ( - connectors: ActionConnector[], - caseConnector: CaseConnector -): ActionConnector | null => connectors.find((c) => c.id === caseConnector.id) ?? null; diff --git a/x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/index.tsx b/x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/index.tsx deleted file mode 100644 index 4d813c034dd1d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiConfirmModal } from '@elastic/eui'; -import * as i18n from './translations'; - -interface ConfirmDeleteCaseModalProps { - caseTitle?: string; - isModalVisible: boolean; - isPlural: boolean; - onCancel: () => void; - onConfirm: () => void; -} - -const ConfirmDeleteCaseModalComp: React.FC<ConfirmDeleteCaseModalProps> = ({ - caseTitle, - isModalVisible, - isPlural, - onCancel, - onConfirm, -}) => { - if (!isModalVisible) { - return null; - } - return ( - <EuiConfirmModal - buttonColor="danger" - cancelButtonText={i18n.CANCEL} - confirmButtonText={isPlural ? i18n.DELETE_CASES : i18n.DELETE_CASE} - data-test-subj="confirm-delete-case-modal" - defaultFocusedButton="confirm" - onCancel={onCancel} - onConfirm={onConfirm} - title={ - isPlural - ? i18n.DELETE_SELECTED_CASES - : caseTitle == null - ? i18n.DELETE_THIS_CASE - : i18n.DELETE_TITLE(caseTitle) - } - > - {isPlural ? i18n.CONFIRM_QUESTION_PLURAL : i18n.CONFIRM_QUESTION} - </EuiConfirmModal> - ); -}; - -export const ConfirmDeleteCaseModal = React.memo(ConfirmDeleteCaseModalComp); diff --git a/x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/translations.ts b/x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/translations.ts deleted file mode 100644 index 07bf6966e953c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/confirm_delete_case/translations.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -export * from '../../translations'; - -export const DELETE_TITLE = (caseTitle: string) => - i18n.translate('xpack.securitySolution.cases.confirmDeleteCase.deleteTitle', { - values: { caseTitle }, - defaultMessage: 'Delete "{caseTitle}"', - }); - -export const DELETE_THIS_CASE = (caseTitle: string) => - i18n.translate('xpack.securitySolution.cases.confirmDeleteCase.deleteThisCase', { - defaultMessage: 'Delete this case', - }); - -export const CONFIRM_QUESTION = i18n.translate( - 'xpack.securitySolution.cases.confirmDeleteCase.confirmQuestion', - { - defaultMessage: - 'By deleting this case, all related case data will be permanently removed and you will no longer be able to push data to an external incident management system. Are you sure you wish to proceed?', - } -); -export const DELETE_SELECTED_CASES = i18n.translate( - 'xpack.securitySolution.cases.confirmDeleteCase.selectedCases', - { - defaultMessage: 'Delete selected cases', - } -); - -export const CONFIRM_QUESTION_PLURAL = i18n.translate( - 'xpack.securitySolution.cases.confirmDeleteCase.confirmQuestionPlural', - { - defaultMessage: - 'By deleting these cases, all related case data will be permanently removed and you will no longer be able to push data to an external incident management system. Are you sure you wish to proceed?', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.test.tsx deleted file mode 100644 index 00e827b62a34e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.test.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { UseField, Form, useForm, FormHook } from '../../../shared_imports'; -import { ConnectorSelector } from './form'; -import { connectorsMock } from '../../containers/mock'; -import { getFormMock } from '../__mock__/form'; - -jest.mock( - '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' -); - -const useFormMock = useForm as jest.Mock; - -describe('ConnectorSelector', () => { - const formHookMock = getFormMock({ connectorId: connectorsMock[0].id }); - - beforeEach(() => { - jest.resetAllMocks(); - useFormMock.mockImplementation(() => ({ form: formHookMock })); - }); - - it('it should render', async () => { - const wrapper = mount( - <Form form={(formHookMock as unknown) as FormHook}> - <UseField - path="connectorId" - component={ConnectorSelector} - componentProps={{ - connectors: connectorsMock, - dataTestSubj: 'caseConnectors', - disabled: false, - idAria: 'caseConnectors', - isLoading: false, - }} - /> - </Form> - ); - - expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeTruthy(); - }); - - it('it should not render when is not in edit mode', async () => { - const wrapper = mount( - <Form form={(formHookMock as unknown) as FormHook}> - <UseField - path="connectorId" - component={ConnectorSelector} - componentProps={{ - connectors: connectorsMock, - dataTestSubj: 'caseConnectors', - disabled: false, - idAria: 'caseConnectors', - isLoading: false, - isEdit: false, - }} - /> - </Form> - ); - - expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx deleted file mode 100644 index f0e77648cee6c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback } from 'react'; -import { isEmpty } from 'lodash/fp'; -import { EuiFormRow } from '@elastic/eui'; - -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../shared_imports'; -import { ConnectorsDropdown } from '../configure_cases/connectors_dropdown'; -import { ActionConnector } from '../../../../../cases/common'; - -interface ConnectorSelectorProps { - connectors: ActionConnector[]; - dataTestSubj: string; - disabled: boolean; - field: FieldHook<string>; - idAria: string; - isEdit: boolean; - isLoading: boolean; - handleChange?: (newValue: string) => void; - hideConnectorServiceNowSir?: boolean; -} -export const ConnectorSelector = ({ - connectors, - dataTestSubj, - disabled = false, - field, - idAria, - isEdit = true, - isLoading = false, - handleChange, - hideConnectorServiceNowSir = false, -}: ConnectorSelectorProps) => { - const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); - const onChange = useCallback( - (val: string) => { - if (handleChange) { - handleChange(val); - } - field.setValue(val); - }, - [handleChange, field] - ); - - return isEdit ? ( - <EuiFormRow - data-test-subj={dataTestSubj} - describedByIds={idAria ? [idAria] : undefined} - error={errorMessage} - fullWidth - helpText={field.helpText} - isInvalid={isInvalid} - label={field.label} - labelAppend={field.labelAppend} - > - <ConnectorsDropdown - connectors={connectors} - disabled={disabled} - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - isLoading={isLoading} - onChange={onChange} - selectedConnector={isEmpty(field.value) ? 'none' : field.value} - /> - </EuiFormRow> - ) : null; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx deleted file mode 100644 index dded090eb3f98..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/card.tsx +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useMemo } from 'react'; -import { EuiCard, EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; -import styled from 'styled-components'; - -import { connectorsConfiguration } from '.'; -import { ConnectorTypes } from '../../../../../cases/common'; - -interface ConnectorCardProps { - connectorType: ConnectorTypes; - title: string; - listItems: Array<{ title: string; description: React.ReactNode }>; - isLoading: boolean; -} - -const StyledText = styled.span` - span { - display: block; - } -`; - -const ConnectorCardDisplay: React.FC<ConnectorCardProps> = ({ - connectorType, - title, - listItems, - isLoading, -}) => { - const description = useMemo( - () => ( - <StyledText> - {listItems.length > 0 && - listItems.map((item, i) => ( - <span data-test-subj="card-list-item" key={`${item.title}-${i}`}> - <strong>{`${item.title}: `}</strong> - {item.description} - </span> - ))} - </StyledText> - ), - [listItems] - ); - const icon = useMemo( - () => <EuiIcon size="xl" type={connectorsConfiguration[`${connectorType}`]?.logo ?? ''} />, - [connectorType] - ); - return ( - <> - {isLoading && <EuiLoadingSpinner data-test-subj="connector-card-loading" />} - {!isLoading && ( - <EuiCard - data-test-subj={`connector-card`} - description={description} - display="plain" - icon={icon} - layout="horizontal" - paddingSize="none" - title={title} - titleSize="xs" - /> - )} - </> - ); -}; - -export const ConnectorCard = memo(ConnectorCardDisplay); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx deleted file mode 100644 index b182c878d78e6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/alert_fields.tsx +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable @kbn/eslint/no-restricted-paths */ - -import React, { useCallback, useEffect, useState } from 'react'; -import styled from 'styled-components'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; - -import { ActionParamsProps } from '../../../../../../triggers_actions_ui/public/types'; -import { CommentType } from '../../../../../../cases/common'; - -import { CaseActionParams } from './types'; -import { ExistingCase } from './existing_case'; - -import * as i18n from './translations'; - -const Container = styled.div` - ${({ theme }) => ` - padding: ${theme.eui?.euiSizeS ?? '8px'} ${theme.eui?.euiSizeL ?? '24px'} ${ - theme.eui?.euiSizeL ?? '24px' - } ${theme.eui?.euiSizeL ?? '24px'}; - `} -`; - -const defaultAlertComment = { - type: CommentType.generatedAlert, - alerts: `[{{#context.alerts}}{"_id": "{{_id}}", "_index": "{{_index}}", "ruleId": "{{signal.rule.id}}", "ruleName": "{{signal.rule.name}}"}__SEPARATOR__{{/context.alerts}}]`, -}; - -const CaseParamsFields: React.FunctionComponent<ActionParamsProps<CaseActionParams>> = ({ - actionParams, - editAction, - index, - errors, - messageVariables, - actionConnector, -}) => { - const { caseId = null, comment = defaultAlertComment } = actionParams.subActionParams ?? {}; - - const [selectedCase, setSelectedCase] = useState<string | null>(null); - - const editSubActionProperty = useCallback( - (key: string, value: unknown) => { - const newProps = { ...actionParams.subActionParams, [key]: value }; - editAction('subActionParams', newProps, index); - }, - // edit action causes re-renders - // eslint-disable-next-line react-hooks/exhaustive-deps - [actionParams.subActionParams, index] - ); - - const onCaseChanged = useCallback( - (id: string) => { - setSelectedCase(id); - editSubActionProperty('caseId', id); - }, - [editSubActionProperty] - ); - - useEffect(() => { - if (!actionParams.subAction) { - editAction('subAction', 'addComment', index); - } - - if (!actionParams.subActionParams?.caseId) { - editSubActionProperty('caseId', caseId); - } - - if (!actionParams.subActionParams?.comment) { - editSubActionProperty('comment', comment); - } - - if (caseId != null) { - setSelectedCase((prevCaseId) => (prevCaseId !== caseId ? caseId : prevCaseId)); - } - - // editAction creates an infinity loop. - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ - actionConnector, - index, - actionParams.subActionParams?.caseId, - actionParams.subActionParams?.comment, - caseId, - comment, - actionParams.subAction, - ]); - - return ( - <Container> - <ExistingCase onCaseChanged={onCaseChanged} selectedCase={selectedCase} /> - <EuiSpacer size="m" /> - <EuiCallOut size="s" title={i18n.CASE_CONNECTOR_CALL_OUT_TITLE} iconType="iInCircle"> - <p>{i18n.CASE_CONNECTOR_CALL_OUT_MSG}</p> - </EuiCallOut> - </Container> - ); -}; - -// eslint-disable-next-line import/no-default-export -export { CaseParamsFields as default }; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/cases_dropdown.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/case/cases_dropdown.tsx deleted file mode 100644 index 3f3c7d4931192..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/cases_dropdown.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiFormRow, EuiSuperSelect, EuiSuperSelectOption } from '@elastic/eui'; -import React, { memo, useMemo, useCallback } from 'react'; -import { Case } from '../../../containers/types'; - -import * as i18n from './translations'; - -interface CaseDropdownProps { - isLoading: boolean; - cases: Case[]; - selectedCase?: string; - onCaseChanged: (id: string) => void; -} - -export const ADD_CASE_BUTTON_ID = 'add-case'; - -const addNewCase = { - value: ADD_CASE_BUTTON_ID, - inputDisplay: ( - <span className="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--xSmall euiButtonEmpty--flushLeft"> - {i18n.CASE_CONNECTOR_ADD_NEW_CASE} - </span> - ), - 'data-test-subj': 'dropdown-connector-add-connector', -}; - -const CasesDropdownComponent: React.FC<CaseDropdownProps> = ({ - isLoading, - cases, - selectedCase, - onCaseChanged, -}) => { - const caseOptions: Array<EuiSuperSelectOption<string>> = useMemo( - () => - cases.reduce<Array<EuiSuperSelectOption<string>>>( - (acc, theCase) => [ - ...acc, - { - value: theCase.id, - inputDisplay: <span>{theCase.title}</span>, - 'data-test-subj': `case-connector-cases-dropdown-${theCase.id}`, - }, - ], - [] - ), - [cases] - ); - - const options = useMemo(() => [...caseOptions, addNewCase], [caseOptions]); - const onChange = useCallback((id: string) => onCaseChanged(id), [onCaseChanged]); - - return ( - <EuiFormRow label={i18n.CASE_CONNECTOR_CASES_DROPDOWN_ROW_LABEL} fullWidth={true}> - <EuiSuperSelect - options={options} - data-test-subj="case-connector-cases-dropdown" - disabled={isLoading} - fullWidth - isLoading={isLoading} - valueOfSelected={selectedCase} - onChange={onChange} - /> - </EuiFormRow> - ); -}; - -export const CasesDropdown = memo(CasesDropdownComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx deleted file mode 100644 index c503a62ef515e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/existing_case.tsx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useMemo, useCallback } from 'react'; -import { CaseType } from '../../../../../../cases/common'; -import { - useGetCases, - DEFAULT_QUERY_PARAMS, - DEFAULT_FILTER_OPTIONS, -} from '../../../containers/use_get_cases'; -import { useCreateCaseModal } from '../../use_create_case_modal'; -import { CasesDropdown, ADD_CASE_BUTTON_ID } from './cases_dropdown'; - -interface ExistingCaseProps { - selectedCase: string | null; - onCaseChanged: (id: string) => void; -} - -const ExistingCaseComponent: React.FC<ExistingCaseProps> = ({ onCaseChanged, selectedCase }) => { - const { data: cases, loading: isLoadingCases, refetchCases } = useGetCases(DEFAULT_QUERY_PARAMS, { - ...DEFAULT_FILTER_OPTIONS, - onlyCollectionType: true, - }); - - const onCaseCreated = useCallback( - (newCase) => { - refetchCases(); - onCaseChanged(newCase.id); - }, - [onCaseChanged, refetchCases] - ); - - const { modal, openModal } = useCreateCaseModal({ - onCaseCreated, - caseType: CaseType.collection, - // FUTURE DEVELOPER - // We are making the assumption that this component is only used in rules creation - // that's why we want to hide ServiceNow SIR - hideConnectorServiceNowSir: true, - }); - - const onChange = useCallback( - (id: string) => { - if (id === ADD_CASE_BUTTON_ID) { - openModal(); - return; - } - - onCaseChanged(id); - }, - [onCaseChanged, openModal] - ); - - const isCasesLoading = useMemo( - () => isLoadingCases.includes('cases') || isLoadingCases.includes('caseUpdate'), - [isLoadingCases] - ); - - return ( - <> - <CasesDropdown - isLoading={isCasesLoading} - cases={cases.cases} - selectedCase={selectedCase ?? undefined} - onCaseChanged={onChange} - /> - {modal} - </> - ); -}; - -export const ExistingCase = memo(ExistingCaseComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/case/index.ts deleted file mode 100644 index 4f7a720ea6410..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ActionTypeModel } from '../../../../../../triggers_actions_ui/public/types'; -import { CaseActionParams } from './types'; -import * as i18n from './translations'; - -interface ValidationResult { - errors: { - caseId: string[]; - }; -} - -const validateParams = (actionParams: CaseActionParams) => { - const validationResult: ValidationResult = { errors: { caseId: [] } }; - - if (actionParams.subActionParams && !actionParams.subActionParams.caseId) { - validationResult.errors.caseId.push(i18n.CASE_CONNECTOR_CASE_REQUIRED); - } - - return validationResult; -}; - -export function getActionType(): ActionTypeModel { - return { - id: '.case', - iconClass: 'securityAnalyticsApp', - selectMessage: i18n.CASE_CONNECTOR_DESC, - actionTypeTitle: i18n.CASE_CONNECTOR_TITLE, - validateConnector: () => ({ config: { errors: {} }, secrets: { errors: {} } }), - validateParams, - actionConnectorFields: null, - actionParamsFields: lazy(() => import('./alert_fields')), - }; -} diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/translations.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/case/translations.ts deleted file mode 100644 index 1d15a3da496a6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/translations.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../../../translations'; - -export const CASE_CONNECTOR_DESC = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.selectMessageText', - { - defaultMessage: 'Create or update a case.', - } -); - -export const CASE_CONNECTOR_TITLE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.actionTypeTitle', - { - defaultMessage: 'Cases', - } -); - -export const CASE_CONNECTOR_COMMENT_LABEL = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.commentLabel', - { - defaultMessage: 'Comment', - } -); - -export const CASE_CONNECTOR_COMMENT_REQUIRED = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.commentRequired', - { - defaultMessage: 'Comment is required.', - } -); - -export const CASE_CONNECTOR_CASES_DROPDOWN_ROW_LABEL = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.casesDropdownRowLabel', - { - defaultMessage: 'Case allowing sub-cases', - } -); - -export const CASE_CONNECTOR_CASES_DROPDOWN_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.casesDropdownPlaceholder', - { - defaultMessage: 'Select case', - } -); - -export const CASE_CONNECTOR_CASES_OPTION_NEW_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.optionAddNewCase', - { - defaultMessage: 'Add to a new case', - } -); - -export const CASE_CONNECTOR_CASES_OPTION_EXISTING_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.optionAddToExistingCase', - { - defaultMessage: 'Add to existing case', - } -); - -export const CASE_CONNECTOR_CASE_REQUIRED = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.caseRequired', - { - defaultMessage: 'You must select a case.', - } -); - -export const CASE_CONNECTOR_CALL_OUT_TITLE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.callOutTitle', - { - defaultMessage: 'Generated alerts will be attached to sub-cases', - } -); - -export const CASE_CONNECTOR_CALL_OUT_MSG = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.callOutMsg', - { - defaultMessage: - 'A case can contain multiple sub-cases to allow grouping of generated alerts. Sub-cases will give more granular control over the status of these generated alerts and prevents having too many alerts attached to one case.', - } -); - -export const CASE_CONNECTOR_ADD_NEW_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.addNewCaseOption', - { - defaultMessage: 'Add new case', - } -); - -export const CREATE_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.createCaseLabel', - { - defaultMessage: 'Create case', - } -); - -export const CONNECTED_CASE = i18n.translate( - 'xpack.securitySolution.cases.components.connectors.cases.connectedCaseLabel', - { - defaultMessage: 'Connected case', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/case/types.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/case/types.ts deleted file mode 100644 index aec9e09ea198c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/case/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export interface CaseActionParams { - subAction: string; - subActionParams: { - caseId: string; - comment: { - alertId: string; - index: string; - type: 'alert'; - }; - }; -} diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/config.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/config.ts deleted file mode 100644 index 1d12d4b98a823..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/config.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - getResilientActionType, - getServiceNowITSMActionType, - getServiceNowSIRActionType, - getJiraActionType, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../triggers_actions_ui/public/common'; -import { ConnectorConfiguration } from './types'; - -const resilient = getResilientActionType(); -const serviceNowITSM = getServiceNowITSMActionType(); -const serviceNowSIR = getServiceNowSIRActionType(); -const jira = getJiraActionType(); - -export const connectorsConfiguration: Record<string, ConnectorConfiguration> = { - '.servicenow': { - name: serviceNowITSM.actionTypeTitle ?? '', - logo: serviceNowITSM.iconClass, - }, - '.servicenow-sir': { - name: serviceNowSIR.actionTypeTitle ?? '', - logo: serviceNowSIR.iconClass, - }, - '.jira': { - name: jira.actionTypeTitle ?? '', - logo: jira.iconClass, - }, - '.resilient': { - name: resilient.actionTypeTitle ?? '', - logo: resilient.iconClass, - }, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/connectors_registry.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/connectors_registry.ts deleted file mode 100644 index d6896a8ac8c80..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/connectors_registry.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -import { CaseConnector, CaseConnectorsRegistry } from './types'; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export const createCaseConnectorsRegistry = (): CaseConnectorsRegistry => { - const connectors: Map<string, CaseConnector<any>> = new Map(); - - const registry: CaseConnectorsRegistry = { - has: (id: string) => connectors.has(id), - register: <UIProps>(connector: CaseConnector<UIProps>) => { - if (connectors.has(connector.id)) { - throw new Error( - i18n.translate( - 'xpack.securitySolution.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage', - { - defaultMessage: 'Object type "{id}" is already registered.', - values: { - id: connector.id, - }, - } - ) - ); - } - - connectors.set(connector.id, connector); - }, - get: <UIProps>(id: string): CaseConnector<UIProps> => { - if (!connectors.has(id)) { - throw new Error( - i18n.translate( - 'xpack.securitySolution.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage', - { - defaultMessage: 'Object type "{id}" is not registered.', - values: { - id, - }, - } - ) - ); - } - return connectors.get(id)!; - }, - list: () => { - return Array.from(connectors).map(([id, connector]) => connector); - }, - }; - - return registry; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx deleted file mode 100644 index 035f1fa2b63ac..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/fields_form.tsx +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, Suspense } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; - -import { CaseActionConnector, ConnectorFieldsProps } from './types'; -import { getCaseConnectors } from '.'; -import { ConnectorTypeFields } from '../../../../../cases/common'; - -interface Props extends Omit<ConnectorFieldsProps<ConnectorTypeFields['fields']>, 'connector'> { - connector: CaseActionConnector | null; -} - -const ConnectorFieldsFormComponent: React.FC<Props> = ({ connector, isEdit, onChange, fields }) => { - const { caseConnectorsRegistry } = getCaseConnectors(); - - if (connector == null || connector.actionTypeId == null || connector.actionTypeId === '.none') { - return null; - } - - const { fieldsComponent: FieldsComponent } = caseConnectorsRegistry.get(connector.actionTypeId); - - return ( - <> - {FieldsComponent != null ? ( - <Suspense - fallback={ - <EuiFlexGroup justifyContent="center"> - <EuiFlexItem grow={false}> - <EuiLoadingSpinner size="m" /> - </EuiFlexItem> - </EuiFlexGroup> - } - > - <div data-test-subj={'connector-fields'}> - <FieldsComponent - isEdit={isEdit} - fields={fields} - connector={connector} - onChange={onChange} - /> - </div> - </Suspense> - ) : null} - </> - ); -}; - -export const ConnectorFieldsForm = memo(ConnectorFieldsFormComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts deleted file mode 100644 index 76f6ccb6a1adb..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CaseConnectorsRegistry } from './types'; -import { createCaseConnectorsRegistry } from './connectors_registry'; -import { getCaseConnector as getJiraCaseConnector } from './jira'; -import { getCaseConnector as getResilientCaseConnector } from './resilient'; -import { getServiceNowITSMCaseConnector, getServiceNowSIRCaseConnector } from './servicenow'; -import { - JiraFieldsType, - ServiceNowITSMFieldsType, - ServiceNowSIRFieldsType, - ResilientFieldsType, -} from '../../../../../cases/common'; - -export { getActionType as getCaseConnectorUI } from './case'; - -export * from './config'; -export * from './types'; - -interface GetCaseConnectorsReturn { - caseConnectorsRegistry: CaseConnectorsRegistry; -} - -class CaseConnectors { - private caseConnectorsRegistry: CaseConnectorsRegistry; - - constructor() { - this.caseConnectorsRegistry = createCaseConnectorsRegistry(); - this.init(); - } - - private init() { - this.caseConnectorsRegistry.register<JiraFieldsType>(getJiraCaseConnector()); - this.caseConnectorsRegistry.register<ResilientFieldsType>(getResilientCaseConnector()); - this.caseConnectorsRegistry.register<ServiceNowITSMFieldsType>( - getServiceNowITSMCaseConnector() - ); - this.caseConnectorsRegistry.register<ServiceNowSIRFieldsType>(getServiceNowSIRCaseConnector()); - } - - registry(): CaseConnectorsRegistry { - return this.caseConnectorsRegistry; - } -} - -const caseConnectors = new CaseConnectors(); - -export const getCaseConnectors = (): GetCaseConnectorsReturn => { - return { - caseConnectorsRegistry: caseConnectors.registry(), - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/__mocks__/api.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/__mocks__/api.ts deleted file mode 100644 index 3a7b51545dfca..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/__mocks__/api.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GetIssueTypesProps, GetFieldsByIssueTypeProps, GetIssueTypeProps } from '../api'; -import { IssueTypes, Fields, Issues, Issue } from '../types'; -import { issues } from '../../mock'; - -const issueTypes = [ - { - id: '10006', - name: 'Task', - }, - { - id: '10007', - name: 'Bug', - }, -]; - -const fieldsByIssueType = { - summary: { allowedValues: [], defaultValue: {} }, - priority: { - allowedValues: [ - { - name: 'Medium', - id: '3', - }, - ], - defaultValue: { name: 'Medium', id: '3' }, - }, -}; - -export const getIssue = async (props: GetIssueTypeProps): Promise<{ data: Issue }> => - Promise.resolve({ data: issues[0] }); -export const getIssues = async (props: GetIssueTypesProps): Promise<{ data: Issues }> => - Promise.resolve({ data: issues }); -export const getIssueTypes = async (props: GetIssueTypesProps): Promise<{ data: IssueTypes }> => - Promise.resolve({ data: issueTypes }); - -export const getFieldsByIssueType = async ( - props: GetFieldsByIssueTypeProps -): Promise<{ data: Fields }> => Promise.resolve({ data: fieldsByIssueType }); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.test.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.test.ts deleted file mode 100644 index 7190a44f3ab1f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.test.ts +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; -import { getIssueTypes, getFieldsByIssueType, getIssues, getIssue } from './api'; - -const issueTypesResponse = { - data: { - projects: [ - { - issuetypes: [ - { - id: '10006', - name: 'Task', - }, - { - id: '10007', - name: 'Bug', - }, - ], - }, - ], - }, -}; - -const fieldsResponse = { - data: { - projects: [ - { - issuetypes: [ - { - id: '10006', - name: 'Task', - fields: { - summary: { fieldId: 'summary' }, - priority: { - fieldId: 'priority', - allowedValues: [ - { - name: 'Highest', - id: '1', - }, - { - name: 'High', - id: '2', - }, - { - name: 'Medium', - id: '3', - }, - { - name: 'Low', - id: '4', - }, - { - name: 'Lowest', - id: '5', - }, - ], - defaultValue: { - name: 'Medium', - id: '3', - }, - }, - }, - }, - ], - }, - ], - }, -}; - -const issueResponse = { - id: '10267', - key: 'RJ-107', - fields: { summary: 'Test title' }, -}; - -const issuesResponse = [issueResponse]; - -describe('Jira API', () => { - const http = httpServiceMock.createStartContract(); - - beforeEach(() => jest.resetAllMocks()); - - describe('getIssueTypes', () => { - test('should call get issue types API', async () => { - const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(issueTypesResponse); - const res = await getIssueTypes({ http, signal: abortCtrl.signal, connectorId: 'test' }); - - expect(res).toEqual(issueTypesResponse); - expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { - body: '{"params":{"subAction":"issueTypes","subActionParams":{}}}', - signal: abortCtrl.signal, - }); - }); - }); - - describe('getFieldsByIssueType', () => { - test('should call get fields API', async () => { - const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(fieldsResponse); - const res = await getFieldsByIssueType({ - http, - signal: abortCtrl.signal, - connectorId: 'test', - id: '10006', - }); - - expect(res).toEqual(fieldsResponse); - expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { - body: '{"params":{"subAction":"fieldsByIssueType","subActionParams":{"id":"10006"}}}', - signal: abortCtrl.signal, - }); - }); - }); - - describe('getIssues', () => { - test('should call get fields API', async () => { - const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(issuesResponse); - const res = await getIssues({ - http, - signal: abortCtrl.signal, - connectorId: 'test', - title: 'test issue', - }); - - expect(res).toEqual(issuesResponse); - expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { - body: '{"params":{"subAction":"issues","subActionParams":{"title":"test issue"}}}', - signal: abortCtrl.signal, - }); - }); - }); - - describe('getIssue', () => { - test('should call get fields API', async () => { - const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(issuesResponse); - const res = await getIssue({ - http, - signal: abortCtrl.signal, - connectorId: 'test', - id: 'RJ-107', - }); - - expect(res).toEqual(issuesResponse); - expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { - body: '{"params":{"subAction":"issue","subActionParams":{"id":"RJ-107"}}}', - signal: abortCtrl.signal, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.ts deleted file mode 100644 index 4ebb06192e62d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/api.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../../actions/common'; -import { IssueTypes, Fields, Issues, Issue } from './types'; - -export const BASE_ACTION_API_PATH = '/api/actions'; - -export interface GetIssueTypesProps { - http: HttpSetup; - signal: AbortSignal; - connectorId: string; -} - -export async function getIssueTypes({ http, signal, connectorId }: GetIssueTypesProps) { - return http.post<ActionTypeExecutorResult<IssueTypes>>( - `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, - { - body: JSON.stringify({ - params: { subAction: 'issueTypes', subActionParams: {} }, - }), - signal, - } - ); -} - -export interface GetFieldsByIssueTypeProps { - http: HttpSetup; - signal: AbortSignal; - connectorId: string; - id: string; -} - -export async function getFieldsByIssueType({ - http, - signal, - connectorId, - id, -}: GetFieldsByIssueTypeProps): Promise<ActionTypeExecutorResult<Fields>> { - return http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { - body: JSON.stringify({ - params: { subAction: 'fieldsByIssueType', subActionParams: { id } }, - }), - signal, - }); -} - -export interface GetIssuesTypeProps { - http: HttpSetup; - signal: AbortSignal; - connectorId: string; - title: string; -} - -export async function getIssues({ - http, - signal, - connectorId, - title, -}: GetIssuesTypeProps): Promise<ActionTypeExecutorResult<Issues>> { - return http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { - body: JSON.stringify({ - params: { subAction: 'issues', subActionParams: { title } }, - }), - signal, - }); -} - -export interface GetIssueTypeProps { - http: HttpSetup; - signal: AbortSignal; - connectorId: string; - id: string; -} - -export async function getIssue({ - http, - signal, - connectorId, - id, -}: GetIssueTypeProps): Promise<ActionTypeExecutorResult<Issue>> { - return http.post(`${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, { - body: JSON.stringify({ - params: { subAction: 'issue', subActionParams: { id } }, - }), - signal, - }); -} diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.test.tsx deleted file mode 100644 index b151d41c4cdd8..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.test.tsx +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { omit } from 'lodash/fp'; - -import { connector, issues } from '../mock'; -import { useGetIssueTypes } from './use_get_issue_types'; -import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; -import Fields from './case_fields'; -import { waitFor } from '@testing-library/dom'; -import { useGetSingleIssue } from './use_get_single_issue'; -import { useGetIssues } from './use_get_issues'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./use_get_issue_types'); -jest.mock('./use_get_fields_by_issue_type'); -jest.mock('./use_get_single_issue'); -jest.mock('./use_get_issues'); - -const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; -const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; -const useGetSingleIssueMock = useGetSingleIssue as jest.Mock; -const useGetIssuesMock = useGetIssues as jest.Mock; - -describe('Jira Fields', () => { - const useGetIssueTypesResponse = { - isLoading: false, - issueTypes: [ - { - id: '10006', - name: 'Task', - }, - { - id: '10007', - name: 'Bug', - }, - ], - }; - - const useGetFieldsByIssueTypeResponse = { - isLoading: false, - fields: { - summary: { allowedValues: [], defaultValue: {} }, - labels: { allowedValues: [], defaultValue: {} }, - description: { allowedValues: [], defaultValue: {} }, - priority: { - allowedValues: [ - { - name: 'Medium', - id: '3', - }, - { - name: 'Low', - id: '2', - }, - ], - defaultValue: { name: 'Medium', id: '3' }, - }, - }, - }; - - const useGetSingleIssueResponse = { - isLoading: false, - issue: { title: 'Parent Task', key: 'parentId' }, - }; - - const fields = { - issueType: '10006', - priority: 'High', - parent: null, - }; - - const useGetIssuesResponse = { - isLoading: false, - issues, - }; - - const onChange = jest.fn(); - - beforeEach(() => { - useGetIssueTypesMock.mockReturnValue(useGetIssueTypesResponse); - useGetFieldsByIssueTypeMock.mockReturnValue(useGetFieldsByIssueTypeResponse); - useGetSingleIssueMock.mockReturnValue(useGetSingleIssueResponse); - jest.clearAllMocks(); - }); - - test('all params fields are rendered - isEdit: true', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - expect(wrapper.find('[data-test-subj="issueTypeSelect"]').first().prop('value')).toStrictEqual( - '10006' - ); - expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('value')).toStrictEqual( - 'High' - ); - expect(wrapper.find('[data-test-subj="search-parent-issues"]').first().exists()).toBeFalsy(); - }); - - test('all params fields are rendered - isEdit: false', () => { - const wrapper = mount( - <Fields - isEdit={false} - fields={{ ...fields, parent: 'Parent Task' }} - onChange={onChange} - connector={connector} - /> - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(0).text()).toEqual( - 'Issue type: Task' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(1).text()).toEqual( - 'Parent issue: Parent Task' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(2).text()).toEqual( - 'Priority: High' - ); - }); - - test('it sets parent correctly', async () => { - useGetFieldsByIssueTypeMock.mockReturnValue({ - ...useGetFieldsByIssueTypeResponse, - fields: { - ...useGetFieldsByIssueTypeResponse.fields, - parent: {}, - }, - }); - useGetIssuesMock.mockReturnValue(useGetIssuesResponse); - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - await waitFor(() => - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'parentId', value: 'parentId' }]) - ); - wrapper.update(); - expect(onChange).toHaveBeenCalledWith({ - issueType: '10006', - parent: 'parentId', - priority: 'High', - }); - }); - test('it searches parent correctly', async () => { - useGetFieldsByIssueTypeMock.mockReturnValue({ - ...useGetFieldsByIssueTypeResponse, - fields: { - ...useGetFieldsByIssueTypeResponse.fields, - parent: {}, - }, - }); - useGetSingleIssueMock.mockReturnValue({ useGetSingleIssueResponse, issue: null }); - useGetIssuesMock.mockReturnValue(useGetIssuesResponse); - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - await waitFor(() => - ((wrapper.find(EuiComboBox).props() as unknown) as { - onSearchChange: (a: string) => void; - }).onSearchChange('womanId') - ); - wrapper.update(); - expect(useGetIssuesMock.mock.calls[2][0].query).toEqual('womanId'); - }); - - test('it disabled the fields when loading issue types', () => { - useGetIssueTypesMock.mockReturnValue({ ...useGetIssueTypesResponse, isLoading: true }); - - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - expect( - wrapper.find('[data-test-subj="issueTypeSelect"]').first().prop('disabled') - ).toBeTruthy(); - expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('disabled')).toBeTruthy(); - }); - - test('it disabled the fields when loading fields', () => { - useGetFieldsByIssueTypeMock.mockReturnValue({ - ...useGetFieldsByIssueTypeResponse, - isLoading: true, - }); - - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - expect( - wrapper.find('[data-test-subj="issueTypeSelect"]').first().prop('disabled') - ).toBeTruthy(); - expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('disabled')).toBeTruthy(); - }); - - test('it hides the priority if not supported', () => { - const response = omit('fields.priority', useGetFieldsByIssueTypeResponse); - - useGetFieldsByIssueTypeMock.mockReturnValue(response); - - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - expect(wrapper.find('[data-test-subj="prioritySelect"]').first().exists()).toBeFalsy(); - }); - - test('it sets issue type correctly', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - wrapper - .find('select[data-test-subj="issueTypeSelect"]') - .first() - .simulate('change', { - target: { value: '10007' }, - }); - - expect(onChange).toHaveBeenCalledWith({ issueType: '10007', parent: null, priority: null }); - }); - - test('it sets issue type when it comes as null', () => { - const wrapper = mount( - <Fields fields={{ ...fields, issueType: null }} onChange={onChange} connector={connector} /> - ); - expect(wrapper.find('select[data-test-subj="issueTypeSelect"]').first().props().value).toEqual( - '10006' - ); - }); - - test('it sets issue type when it comes as unknown value', () => { - const wrapper = mount( - <Fields - fields={{ ...fields, issueType: '99999' }} - onChange={onChange} - connector={connector} - /> - ); - expect(wrapper.find('select[data-test-subj="issueTypeSelect"]').first().props().value).toEqual( - '10006' - ); - }); - - test('it sets priority correctly', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - wrapper - .find('select[data-test-subj="prioritySelect"]') - .first() - .simulate('change', { - target: { value: '2' }, - }); - - expect(onChange).toHaveBeenCalledWith({ issueType: '10006', parent: null, priority: '2' }); - }); - - test('it resets priority when changing issue type', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - wrapper - .find('select[data-test-subj="issueTypeSelect"]') - .first() - .simulate('change', { - target: { value: '10007' }, - }); - - expect(onChange).toBeCalledWith({ issueType: '10007', parent: null, priority: null }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx deleted file mode 100644 index 985537e799596..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/case_fields.tsx +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useMemo, useEffect, useRef } from 'react'; -import { map } from 'lodash/fp'; -import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import * as i18n from './translations'; - -import { ConnectorTypes, JiraFieldsType } from '../../../../../../cases/common'; -import { useKibana } from '../../../../common/lib/kibana'; -import { ConnectorFieldsProps } from '../types'; -import { useGetIssueTypes } from './use_get_issue_types'; -import { useGetFieldsByIssueType } from './use_get_fields_by_issue_type'; -import { SearchIssues } from './search_issues'; -import { ConnectorCard } from '../card'; - -const JiraFieldsComponent: React.FunctionComponent<ConnectorFieldsProps<JiraFieldsType>> = ({ - connector, - fields, - isEdit = true, - onChange, -}) => { - const init = useRef(true); - const { issueType = null, priority = null, parent = null } = fields ?? {}; - const { http, notifications } = useKibana().services; - - const handleIssueType = useCallback( - (issueTypeSelectOptions: Array<{ value: string; text: string }>) => { - if (issueType == null && issueTypeSelectOptions.length > 0) { - // if there is no issue type set in the edit view, set it to default - if (isEdit) { - onChange({ - issueType: issueTypeSelectOptions[0].value, - parent, - priority, - }); - } - } - }, - [isEdit, issueType, onChange, parent, priority] - ); - const { isLoading: isLoadingIssueTypes, issueTypes } = useGetIssueTypes({ - connector, - http, - toastNotifications: notifications.toasts, - handleIssueType, - }); - - const issueTypesSelectOptions = useMemo( - () => - issueTypes.map((type) => ({ - text: type.name ?? '', - value: type.id ?? '', - })), - [issueTypes] - ); - - const currentIssueType = useMemo(() => { - if (!issueType && issueTypesSelectOptions.length > 0) { - return issueTypesSelectOptions[0].value; - } else if ( - issueTypesSelectOptions.length > 0 && - !issueTypesSelectOptions.some(({ value }) => value === issueType) - ) { - return issueTypesSelectOptions[0].value; - } - return issueType; - }, [issueType, issueTypesSelectOptions]); - - const { isLoading: isLoadingFields, fields: fieldsByIssueType } = useGetFieldsByIssueType({ - connector, - http, - issueType: currentIssueType, - toastNotifications: notifications.toasts, - }); - - const hasPriority = useMemo(() => fieldsByIssueType.priority != null, [fieldsByIssueType]); - - const hasParent = useMemo(() => fieldsByIssueType.parent != null, [fieldsByIssueType]); - - const prioritiesSelectOptions = useMemo(() => { - const priorities = fieldsByIssueType.priority?.allowedValues ?? []; - return map( - (p) => ({ - text: p.name, - value: p.name, - }), - priorities - ); - }, [fieldsByIssueType]); - - const listItems = useMemo( - () => [ - ...(issueType != null && issueType.length > 0 - ? [ - { - title: i18n.ISSUE_TYPE, - description: issueTypes.find((issue) => issue.id === issueType)?.name ?? '', - }, - ] - : []), - ...(parent != null && parent.length > 0 - ? [ - { - title: i18n.PARENT_ISSUE, - description: parent, - }, - ] - : []), - ...(priority != null && priority.length > 0 - ? [ - { - title: i18n.PRIORITY, - description: priority, - }, - ] - : []), - ], - [issueType, issueTypes, parent, priority] - ); - - const onFieldChange = useCallback( - (key, value) => { - if (key === 'issueType') { - return onChange({ ...fields, issueType: value, priority: null, parent: null }); - } - return onChange({ - ...fields, - issueType: currentIssueType, - parent, - priority, - [key]: value, - }); - }, - [currentIssueType, fields, onChange, parent, priority] - ); - - // Set field at initialization - useEffect(() => { - if (init.current) { - init.current = false; - onChange({ issueType, priority, parent }); - } - }, [issueType, onChange, parent, priority]); - - return isEdit ? ( - <div data-test-subj={'connector-fields-jira'}> - <EuiFormRow fullWidth label={i18n.ISSUE_TYPE}> - <EuiSelect - data-test-subj="issueTypeSelect" - disabled={isLoadingIssueTypes || isLoadingFields} - fullWidth - isLoading={isLoadingIssueTypes} - onChange={(e) => onFieldChange('issueType', e.target.value)} - options={issueTypesSelectOptions} - value={currentIssueType ?? ''} - /> - </EuiFormRow> - <EuiSpacer size="m" /> - <> - {hasParent && ( - <> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.PARENT_ISSUE}> - <SearchIssues - actionConnector={connector} - onChange={(parentIssueKey) => onFieldChange('parent', parentIssueKey)} - selectedValue={parent} - /> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - <EuiSpacer size="m" /> - </> - )} - {hasPriority && ( - <> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.PRIORITY}> - <EuiSelect - data-test-subj="prioritySelect" - disabled={isLoadingIssueTypes || isLoadingFields} - fullWidth - hasNoInitialSelection - isLoading={isLoadingFields} - onChange={(e) => onFieldChange('priority', e.target.value)} - options={prioritiesSelectOptions} - value={priority ?? ''} - /> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - </> - )} - </> - </div> - ) : ( - <ConnectorCard - connectorType={ConnectorTypes.jira} - isLoading={isLoadingIssueTypes || isLoadingFields} - listItems={listItems} - title={connector.name} - /> - ); -}; - -// eslint-disable-next-line import/no-default-export -export { JiraFieldsComponent as default }; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts deleted file mode 100644 index 1069e489ada09..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; - -import { CaseConnector } from '../types'; -import { JiraFieldsType } from '../../../../../../cases/common'; -import * as i18n from './translations'; - -export * from './types'; - -export const getCaseConnector = (): CaseConnector<JiraFieldsType> => { - return { - id: '.jira', - fieldsComponent: lazy(() => import('./case_fields')), - }; -}; - -export const fieldLabels = { - issueType: i18n.ISSUE_TYPE, - priority: i18n.PRIORITY, - parent: i18n.PARENT_ISSUE, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/search_issues.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/search_issues.tsx deleted file mode 100644 index 3fdc17b7157d6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/search_issues.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { ActionConnector } from '../../../containers/types'; -import { useGetIssues } from './use_get_issues'; -import { useGetSingleIssue } from './use_get_single_issue'; -import * as i18n from './translations'; - -interface Props { - selectedValue: string | null; - actionConnector?: ActionConnector; - onChange: (parentIssueKey: string) => void; -} - -const SearchIssuesComponent: React.FC<Props> = ({ selectedValue, actionConnector, onChange }) => { - const [query, setQuery] = useState<string | null>(null); - const [selectedOptions, setSelectedOptions] = useState<Array<EuiComboBoxOptionOption<string>>>( - [] - ); - const [options, setOptions] = useState<Array<EuiComboBoxOptionOption<string>>>([]); - const { http, notifications } = useKibana().services; - - const { isLoading: isLoadingIssues, issues } = useGetIssues({ - http, - toastNotifications: notifications.toasts, - actionConnector, - query, - }); - - const { isLoading: isLoadingSingleIssue, issue: singleIssue } = useGetSingleIssue({ - http, - toastNotifications: notifications.toasts, - actionConnector, - id: selectedValue, - }); - - useEffect(() => setOptions(issues.map((issue) => ({ label: issue.title, value: issue.key }))), [ - issues, - ]); - - useEffect(() => { - if (isLoadingSingleIssue || singleIssue == null) { - return; - } - - const singleIssueAsOptions = [{ label: singleIssue.title, value: singleIssue.key }]; - setOptions(singleIssueAsOptions); - setSelectedOptions(singleIssueAsOptions); - }, [singleIssue, isLoadingSingleIssue]); - - const onSearchChange = useCallback((searchVal: string) => { - setQuery(searchVal); - }, []); - - const onChangeComboBox = useCallback( - (changedOptions) => { - setSelectedOptions(changedOptions); - onChange(changedOptions[0].value); - }, - [onChange] - ); - - const inputPlaceholder = useMemo( - (): string => - isLoadingIssues || isLoadingSingleIssue - ? i18n.SEARCH_ISSUES_LOADING - : i18n.SEARCH_ISSUES_PLACEHOLDER, - [isLoadingIssues, isLoadingSingleIssue] - ); - - return ( - <EuiComboBox - singleSelection - fullWidth - placeholder={inputPlaceholder} - data-test-subj={'search-parent-issues'} - aria-label={i18n.SEARCH_ISSUES_COMBO_BOX_ARIA_LABEL} - options={options} - isLoading={isLoadingIssues || isLoadingSingleIssue} - onSearchChange={onSearchChange} - selectedOptions={selectedOptions} - onChange={onChangeComboBox} - /> - ); -}; - -export const SearchIssues = memo(SearchIssuesComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/translations.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/translations.ts deleted file mode 100644 index a4948d61f952c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/translations.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const ISSUE_TYPES_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.unableToGetIssueTypesMessage', - { - defaultMessage: 'Unable to get issue types', - } -); - -export const FIELDS_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.unableToGetFieldsMessage', - { - defaultMessage: 'Unable to get connectors', - } -); - -export const ISSUES_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.unableToGetIssuesMessage', - { - defaultMessage: 'Unable to get issues', - } -); - -export const GET_ISSUE_API_ERROR = (id: string) => - i18n.translate('xpack.securitySolution.components.connectors.jira.unableToGetIssueMessage', { - defaultMessage: 'Unable to get issue with id {id}', - values: { id }, - }); - -export const SEARCH_ISSUES_COMBO_BOX_ARIA_LABEL = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxAriaLabel', - { - defaultMessage: 'Type to search', - } -); - -export const SEARCH_ISSUES_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxPlaceholder', - { - defaultMessage: 'Type to search', - } -); - -export const SEARCH_ISSUES_LOADING = i18n.translate( - 'xpack.securitySolution.components.connectors.jira.searchIssuesLoading', - { - defaultMessage: 'Loading...', - } -); - -export const PRIORITY = i18n.translate( - 'xpack.securitySolution.cases.connectors.jira.prioritySelectFieldLabel', - { - defaultMessage: 'Priority', - } -); - -export const ISSUE_TYPE = i18n.translate( - 'xpack.securitySolution.cases.connectors.jira.issueTypesSelectFieldLabel', - { - defaultMessage: 'Issue type', - } -); - -export const PARENT_ISSUE = i18n.translate( - 'xpack.securitySolution.cases.connectors.jira.parentIssueSearchLabel', - { - defaultMessage: 'Parent issue', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/types.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/types.ts deleted file mode 100644 index 76c08a852c679..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/types.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export type IssueTypes = Array<{ id: string; name: string }>; -export interface Fields { - [key: string]: { - allowedValues: Array<{ name: string; id: string }> | []; - defaultValue: { name: string; id: string } | {}; - }; -} - -export interface Issue { - id: string; - key: string; - title: string; -} - -export type Issues = Issue[]; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.test.tsx deleted file mode 100644 index 4ef5f14da2238..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.test.tsx +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { connector } from '../mock'; -import { useGetFieldsByIssueType, UseGetFieldsByIssueType } from './use_get_fields_by_issue_type'; -import * as api from './api'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./api'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('useGetFieldsByIssueType', () => { - const { http, notifications } = useKibanaMock().services; - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetFieldsByIssueType>(() => - useGetFieldsByIssueType({ http, toastNotifications: notifications.toasts, issueType: null }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ isLoading: true, fields: {} }); - }); - }); - - test('does not fetch when issueType is not provided', async () => { - const spyOnGetFieldsByIssueType = jest.spyOn(api, 'getFieldsByIssueType'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetFieldsByIssueType>(() => - useGetFieldsByIssueType({ - http, - toastNotifications: notifications.toasts, - connector, - issueType: null, - }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetFieldsByIssueType).not.toHaveBeenCalled(); - expect(result.current).toEqual({ isLoading: false, fields: {} }); - }); - }); - - test('fetch fields', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetFieldsByIssueType>(() => - useGetFieldsByIssueType({ - http, - toastNotifications: notifications.toasts, - connector, - issueType: 'Task', - }) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - fields: { - summary: { allowedValues: [], defaultValue: {} }, - priority: { - allowedValues: [ - { - name: 'Medium', - id: '3', - }, - ], - defaultValue: { name: 'Medium', id: '3' }, - }, - }, - }); - }); - }); - - test('unhappy path', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getFieldsByIssueType'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetFieldsByIssueType>(() => - useGetFieldsByIssueType({ - http, - toastNotifications: notifications.toasts, - connector, - issueType: null, - }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ isLoading: false, fields: {} }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.tsx deleted file mode 100644 index 03000e8916617..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_fields_by_issue_type.tsx +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getFieldsByIssueType } from './api'; -import { Fields } from './types'; -import * as i18n from './translations'; - -interface Props { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - issueType: string | null; - connector?: ActionConnector; -} - -export interface UseGetFieldsByIssueType { - fields: Fields; - isLoading: boolean; -} - -export const useGetFieldsByIssueType = ({ - http, - toastNotifications, - connector, - issueType, -}: Props): UseGetFieldsByIssueType => { - const [isLoading, setIsLoading] = useState(true); - const [fields, setFields] = useState<Fields>({}); - const didCancel = useRef(false); - const abortCtrl = useRef(new AbortController()); - - useEffect(() => { - const fetchData = async () => { - if (!connector || !issueType) { - setIsLoading(false); - return; - } - - try { - abortCtrl.current = new AbortController(); - setIsLoading(true); - - const res = await getFieldsByIssueType({ - http, - signal: abortCtrl.current.signal, - connectorId: connector.id, - id: issueType, - }); - - if (!didCancel.current) { - setIsLoading(false); - setFields(res.data ?? {}); - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.FIELDS_API_ERROR, - text: `${res.serviceMessage ?? res.message}`, - }); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.FIELDS_API_ERROR, - text: error.message, - }); - } - } - } - }; - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - }, [http, connector, issueType, toastNotifications]); - - return { - isLoading, - fields, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.test.tsx deleted file mode 100644 index ee32d93c655be..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.test.tsx +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { connector } from '../mock'; -import { useGetIssueTypes, UseGetIssueTypes } from './use_get_issue_types'; -import * as api from './api'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./api'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('useGetIssueTypes', () => { - const { http, notifications } = useKibanaMock().services; - const handleIssueType = jest.fn(); - - beforeEach(() => jest.clearAllMocks()); - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIssueTypes>(() => - useGetIssueTypes({ http, toastNotifications: notifications.toasts, handleIssueType }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ isLoading: true, issueTypes: [] }); - }); - }); - - test('fetch issue types', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIssueTypes>(() => - useGetIssueTypes({ - http, - toastNotifications: notifications.toasts, - connector, - handleIssueType, - }) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - issueTypes: [ - { - id: '10006', - name: 'Task', - }, - { - id: '10007', - name: 'Bug', - }, - ], - }); - }); - }); - - test('handleIssueType is called', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook<string, UseGetIssueTypes>(() => - useGetIssueTypes({ - http, - toastNotifications: notifications.toasts, - connector, - handleIssueType, - }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(handleIssueType).toHaveBeenCalledWith([ - { text: 'Task', value: '10006' }, - { text: 'Bug', value: '10007' }, - ]); - }); - }); - - test('unhappy path', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getIssueTypes'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIssueTypes>(() => - useGetIssueTypes({ - http, - toastNotifications: notifications.toasts, - connector, - handleIssueType, - }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ isLoading: false, issueTypes: [] }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.tsx deleted file mode 100644 index 3c35d315a2bcd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issue_types.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getIssueTypes } from './api'; -import { IssueTypes } from './types'; -import * as i18n from './translations'; - -interface Props { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - connector?: ActionConnector; - handleIssueType: (options: Array<{ value: string; text: string }>) => void; -} - -export interface UseGetIssueTypes { - issueTypes: IssueTypes; - isLoading: boolean; -} - -export const useGetIssueTypes = ({ - http, - connector, - toastNotifications, - handleIssueType, -}: Props): UseGetIssueTypes => { - const [isLoading, setIsLoading] = useState(true); - const [issueTypes, setIssueTypes] = useState<IssueTypes>([]); - const didCancel = useRef(false); - const abortCtrl = useRef(new AbortController()); - - useEffect(() => { - const fetchData = async () => { - if (!connector) { - setIsLoading(false); - return; - } - - try { - abortCtrl.current = new AbortController(); - setIsLoading(true); - - const res = await getIssueTypes({ - http, - signal: abortCtrl.current.signal, - connectorId: connector.id, - }); - - if (!didCancel.current) { - setIsLoading(false); - const asOptions = (res.data ?? []).map((type) => ({ - text: type.name ?? '', - value: type.id ?? '', - })); - setIssueTypes(res.data ?? []); - handleIssueType(asOptions); - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.ISSUE_TYPES_API_ERROR, - text: `${res.serviceMessage ?? res.message}`, - }); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.ISSUE_TYPES_API_ERROR, - text: error.message, - }); - } - } - } - }; - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - // handleIssueType unmounts the component at init causing the request to be aborted - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [http, connector, toastNotifications]); - - return { - issueTypes, - isLoading, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.test.tsx deleted file mode 100644 index ee1d4ffd3d8ae..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.test.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { connector as actionConnector, issues } from '../mock'; -import { useGetIssues, UseGetIssues } from './use_get_issues'; -import * as api from './api'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./api'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('useGetIssues', () => { - const { http, notifications } = useKibanaMock().services; - beforeEach(() => jest.clearAllMocks()); - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIssues>(() => - useGetIssues({ - http, - toastNotifications: notifications.toasts, - actionConnector, - query: null, - }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ isLoading: false, issues: [] }); - }); - }); - - test('fetch issues', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIssues>(() => - useGetIssues({ - http, - toastNotifications: notifications.toasts, - actionConnector, - query: 'Task', - }) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - issues, - }); - }); - }); - - test('unhappy path', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getIssues'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIssues>(() => - useGetIssues({ - http, - toastNotifications: notifications.toasts, - actionConnector, - query: 'oh no', - }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ isLoading: false, issues: [] }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.tsx deleted file mode 100644 index b44b0558f1536..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_issues.tsx +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { isEmpty, debounce } from 'lodash/fp'; -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getIssues } from './api'; -import { Issues } from './types'; -import * as i18n from './translations'; - -interface Props { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - actionConnector?: ActionConnector; - query: string | null; -} - -export interface UseGetIssues { - issues: Issues; - isLoading: boolean; -} - -export const useGetIssues = ({ - http, - actionConnector, - toastNotifications, - query, -}: Props): UseGetIssues => { - const [isLoading, setIsLoading] = useState(false); - const [issues, setIssues] = useState<Issues>([]); - const didCancel = useRef(false); - const abortCtrl = useRef(new AbortController()); - - useEffect(() => { - const fetchData = debounce(500, async () => { - if (!actionConnector || isEmpty(query)) { - setIsLoading(false); - return; - } - - try { - abortCtrl.current = new AbortController(); - setIsLoading(true); - - const res = await getIssues({ - http, - signal: abortCtrl.current.signal, - connectorId: actionConnector.id, - title: query ?? '', - }); - - if (!didCancel.current) { - setIsLoading(false); - setIssues(res.data ?? []); - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.ISSUES_API_ERROR, - text: `${res.serviceMessage ?? res.message}`, - }); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.ISSUES_API_ERROR, - text: error.message, - }); - } - } - } - }); - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - }, [http, actionConnector, toastNotifications, query]); - - return { - issues, - isLoading, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.test.tsx deleted file mode 100644 index ba9752ca71811..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.test.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { connector as actionConnector, issues } from '../mock'; -import { useGetSingleIssue, UseGetSingleIssue } from './use_get_single_issue'; -import * as api from './api'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./api'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('useGetSingleIssue', () => { - const { http, notifications } = useKibanaMock().services; - beforeEach(() => jest.clearAllMocks()); - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetSingleIssue>(() => - useGetSingleIssue({ - http, - toastNotifications: notifications.toasts, - actionConnector, - id: null, - }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ isLoading: false, issue: null }); - }); - }); - - test('fetch issues', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetSingleIssue>(() => - useGetSingleIssue({ - http, - toastNotifications: notifications.toasts, - actionConnector, - id: '123', - }) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - issue: issues[0], - }); - }); - }); - - test('unhappy path', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getIssue'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetSingleIssue>(() => - useGetSingleIssue({ - http, - toastNotifications: notifications.toasts, - actionConnector, - id: '123', - }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ isLoading: false, issue: null }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.tsx deleted file mode 100644 index 6c70286426168..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/jira/use_get_single_issue.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getIssue } from './api'; -import { Issue } from './types'; -import * as i18n from './translations'; - -interface Props { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - id: string | null; - actionConnector?: ActionConnector; -} - -export interface UseGetSingleIssue { - issue: Issue | null; - isLoading: boolean; -} - -export const useGetSingleIssue = ({ - http, - toastNotifications, - actionConnector, - id, -}: Props): UseGetSingleIssue => { - const [isLoading, setIsLoading] = useState(false); - const [issue, setIssue] = useState<Issue | null>(null); - const didCancel = useRef(false); - const abortCtrl = useRef(new AbortController()); - - useEffect(() => { - const fetchData = async () => { - if (!actionConnector || !id) { - setIsLoading(false); - return; - } - - abortCtrl.current = new AbortController(); - setIsLoading(true); - try { - const res = await getIssue({ - http, - signal: abortCtrl.current.signal, - connectorId: actionConnector.id, - id, - }); - - if (!didCancel.current) { - setIsLoading(false); - setIssue(res.data ?? null); - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.GET_ISSUE_API_ERROR(id), - text: `${res.serviceMessage ?? res.message}`, - }); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.GET_ISSUE_API_ERROR(id), - text: error.message, - }); - } - } - } - }; - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - }, [http, actionConnector, id, toastNotifications]); - - return { - isLoading, - issue, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/mock.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/mock.ts deleted file mode 100644 index f5429fa2396aa..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/mock.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export const connector = { - id: '123', - name: 'My connector', - actionTypeId: '.jira', - config: {}, - isPreconfigured: false, -}; - -export const issues = [ - { id: 'personId', title: 'Person Task', key: 'personKey' }, - { id: 'womanId', title: 'Woman Task', key: 'womanKey' }, - { id: 'manId', title: 'Man Task', key: 'manKey' }, - { id: 'cameraId', title: 'Camera Task', key: 'cameraKey' }, - { id: 'tvId', title: 'TV Task', key: 'tvKey' }, -]; - -export const choices = [ - { - dependent_value: '', - label: 'Priviledge Escalation', - value: 'Priviledge Escalation', - element: 'category', - }, - { - dependent_value: '', - label: 'Criminal activity/investigation', - value: 'Criminal activity/investigation', - element: 'category', - }, - { - dependent_value: '', - label: 'Denial of Service', - value: 'Denial of Service', - element: 'category', - }, - { - dependent_value: 'Denial of Service', - label: 'Inbound or outbound', - value: '12', - element: 'subcategory', - }, - { - dependent_value: 'Denial of Service', - label: 'Single or distributed (DoS or DDoS)', - value: '26', - element: 'subcategory', - }, - { - dependent_value: 'Denial of Service', - label: 'Inbound DDos', - value: 'inbound_ddos', - element: 'subcategory', - }, - { - dependent_value: '', - label: 'Software', - value: 'software', - element: 'category', - }, - { - dependent_value: 'software', - label: 'Operation System', - value: 'os', - element: 'subcategory', - }, - ...['severity', 'urgency', 'impact', 'priority'] - .map((element) => [ - { - dependent_value: '', - label: '1 - Critical', - value: '1', - element, - }, - { - dependent_value: '', - label: '2 - High', - value: '2', - element, - }, - { - dependent_value: '', - label: '3 - Moderate', - value: '3', - element, - }, - { - dependent_value: '', - label: '4 - Low', - value: '4', - element, - }, - ]) - .flat(), -]; - -export const severity = [ - { - id: 4, - name: 'Low', - }, - { - id: 5, - name: 'Medium', - }, - { - id: 6, - name: 'High', - }, -]; - -export const incidentTypes = [ - { id: 17, name: 'Communication error (fax; email)' }, - { id: 1001, name: 'Custom type' }, -]; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/__mocks__/api.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/__mocks__/api.ts deleted file mode 100644 index c27248288907d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/__mocks__/api.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { incidentTypes, severity } from '../../mock'; -import { Props } from '../api'; -import { ResilientIncidentTypes, ResilientSeverity } from '../types'; - -export const getIncidentTypes = async (props: Props): Promise<{ data: ResilientIncidentTypes }> => - Promise.resolve({ data: incidentTypes }); - -export const getSeverity = async (props: Props): Promise<{ data: ResilientSeverity }> => - Promise.resolve({ data: severity }); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/api.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/api.ts deleted file mode 100644 index 6d57f38fa961c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/api.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../../actions/common'; -import { ResilientIncidentTypes, ResilientSeverity } from './types'; - -export const BASE_ACTION_API_PATH = '/api/actions'; - -export interface Props { - http: HttpSetup; - signal: AbortSignal; - connectorId: string; -} - -export async function getIncidentTypes({ http, signal, connectorId }: Props) { - return http.post<ActionTypeExecutorResult<ResilientIncidentTypes>>( - `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, - { - body: JSON.stringify({ - params: { subAction: 'incidentTypes', subActionParams: {} }, - }), - signal, - } - ); -} - -export async function getSeverity({ http, signal, connectorId }: Props) { - return http.post<ActionTypeExecutorResult<ResilientSeverity>>( - `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, - { - body: JSON.stringify({ - params: { subAction: 'severity', subActionParams: {} }, - }), - signal, - } - ); -} diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.test.tsx deleted file mode 100644 index dd13083288020..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.test.tsx +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { waitFor } from '@testing-library/react'; - -import { connector } from '../mock'; -import { useGetIncidentTypes } from './use_get_incident_types'; -import { useGetSeverity } from './use_get_severity'; -import Fields from './case_fields'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./use_get_incident_types'); -jest.mock('./use_get_severity'); - -const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; -const useGetSeverityMock = useGetSeverity as jest.Mock; - -describe('ResilientParamsFields renders', () => { - const useGetIncidentTypesResponse = { - isLoading: false, - incidentTypes: [ - { - id: 19, - name: 'Malware', - }, - { - id: 21, - name: 'Denial of Service', - }, - ], - }; - - const useGetSeverityResponse = { - isLoading: false, - severity: [ - { - id: 4, - name: 'Low', - }, - { - id: 5, - name: 'Medium', - }, - { - id: 6, - name: 'High', - }, - ], - }; - - const fields = { - severityCode: '6', - incidentTypes: ['19'], - }; - - const onChange = jest.fn(); - - beforeEach(() => { - useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); - useGetSeverityMock.mockReturnValue(useGetSeverityResponse); - jest.clearAllMocks(); - }); - - test('all params fields are rendered', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - expect(wrapper.find('[data-test-subj="incidentTypeComboBox"]').first().prop('options')).toEqual( - [ - { label: 'Malware', value: '19' }, - { label: 'Denial of Service', value: '21' }, - ] - ); - - expect( - wrapper.find('[data-test-subj="incidentTypeComboBox"]').first().prop('selectedOptions') - ).toEqual([{ label: 'Malware', value: '19' }]); - - expect(wrapper.find('[data-test-subj="severitySelect"]').first().prop('value')).toStrictEqual( - '6' - ); - }); - - test('it disabled the fields when loading incident types', () => { - useGetIncidentTypesMock.mockReturnValue({ ...useGetIncidentTypesResponse, isLoading: true }); - - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - expect( - wrapper.find('[data-test-subj="incidentTypeComboBox"]').first().prop('isDisabled') - ).toBeTruthy(); - }); - - test('it disabled the fields when loading severity', () => { - useGetSeverityMock.mockReturnValue({ - ...useGetSeverityResponse, - isLoading: true, - }); - - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - expect(wrapper.find('[data-test-subj="severitySelect"]').first().prop('disabled')).toBeTruthy(); - }); - - test('it sets issue type correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - await waitFor(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ value: '19', label: 'Denial of Service' }]); - }); - - expect(onChange).toHaveBeenCalledWith({ incidentTypes: ['19'], severityCode: '6' }); - }); - - test('it sets severity correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - wrapper - .find('select[data-test-subj="severitySelect"]') - .first() - .simulate('change', { - target: { value: '4' }, - }); - - expect(onChange).toHaveBeenCalledWith({ incidentTypes: ['19'], severityCode: '4' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx deleted file mode 100644 index ae9b5a4dd6f49..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/case_fields.tsx +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useCallback, useEffect, useRef } from 'react'; -import { - EuiComboBox, - EuiComboBoxOptionOption, - EuiFormRow, - EuiSelect, - EuiSelectOption, - EuiSpacer, -} from '@elastic/eui'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { ConnectorFieldsProps } from '../types'; -import { useGetIncidentTypes } from './use_get_incident_types'; -import { useGetSeverity } from './use_get_severity'; - -import * as i18n from './translations'; -import { ConnectorTypes, ResilientFieldsType } from '../../../../../../cases/common'; -import { ConnectorCard } from '../card'; - -const ResilientFieldsComponent: React.FunctionComponent< - ConnectorFieldsProps<ResilientFieldsType> -> = ({ isEdit = true, fields, connector, onChange }) => { - const init = useRef(true); - const { incidentTypes = null, severityCode = null } = fields ?? {}; - - const { http, notifications } = useKibana().services; - - const { - isLoading: isLoadingIncidentTypes, - incidentTypes: allIncidentTypes, - } = useGetIncidentTypes({ - http, - toastNotifications: notifications.toasts, - connector, - }); - - const { isLoading: isLoadingSeverity, severity } = useGetSeverity({ - http, - toastNotifications: notifications.toasts, - connector, - }); - - const severitySelectOptions: EuiSelectOption[] = useMemo( - () => - severity.map((s) => ({ - value: s.id.toString(), - text: s.name, - })), - [severity] - ); - - const incidentTypesComboBoxOptions: Array<EuiComboBoxOptionOption<string>> = useMemo( - () => - allIncidentTypes - ? allIncidentTypes.map((type: { id: number; name: string }) => ({ - label: type.name, - value: type.id.toString(), - })) - : [], - [allIncidentTypes] - ); - const listItems = useMemo( - () => [ - ...(incidentTypes != null && incidentTypes.length > 0 - ? [ - { - title: i18n.INCIDENT_TYPES_LABEL, - description: allIncidentTypes - .filter((type) => incidentTypes.includes(type.id.toString())) - .map((type) => type.name) - .join(', '), - }, - ] - : []), - ...(severityCode != null && severityCode.length > 0 - ? [ - { - title: i18n.SEVERITY_LABEL, - description: - severity.find((severityObj) => severityObj.id.toString() === severityCode)?.name ?? - '', - }, - ] - : []), - ], - [incidentTypes, severityCode, allIncidentTypes, severity] - ); - - const onFieldChange = useCallback( - (key, value) => { - onChange({ - ...fields, - incidentTypes, - severityCode, - [key]: value, - }); - }, - [incidentTypes, severityCode, onChange, fields] - ); - - const selectedIncidentTypesComboBoxOptionsMemo = useMemo(() => { - const allIncidentTypesAsObject = allIncidentTypes.reduce( - (acc, type) => ({ ...acc, [type.id.toString()]: type.name }), - {} as Record<string, string> - ); - return incidentTypes - ? incidentTypes - .map((type) => ({ - label: allIncidentTypesAsObject[type.toString()], - value: type.toString(), - })) - .filter((type) => type.label != null) - : []; - }, [allIncidentTypes, incidentTypes]); - - const onIncidentChange = useCallback( - (selectedOptions: Array<{ label: string; value?: string }>) => { - onFieldChange( - 'incidentTypes', - selectedOptions.map((selectedOption) => selectedOption.value ?? selectedOption.label) - ); - }, - [onFieldChange] - ); - - const onIncidentBlur = useCallback(() => { - if (!incidentTypes) { - onFieldChange('incidentTypes', []); - } - }, [incidentTypes, onFieldChange]); - - // Set field at initialization - useEffect(() => { - if (init.current) { - init.current = false; - onChange({ incidentTypes, severityCode }); - } - }, [incidentTypes, onChange, severityCode]); - - return isEdit ? ( - <span data-test-subj={'connector-fields-resilient'}> - <EuiFormRow fullWidth label={i18n.INCIDENT_TYPES_LABEL}> - <EuiComboBox - data-test-subj="incidentTypeComboBox" - fullWidth - isClearable={true} - isDisabled={isLoadingIncidentTypes} - isLoading={isLoadingIncidentTypes} - onBlur={onIncidentBlur} - onChange={onIncidentChange} - options={incidentTypesComboBoxOptions} - placeholder={i18n.INCIDENT_TYPES_PLACEHOLDER} - selectedOptions={selectedIncidentTypesComboBoxOptionsMemo} - /> - </EuiFormRow> - <EuiSpacer size="m" /> - <EuiFormRow fullWidth label={i18n.SEVERITY_LABEL}> - <EuiSelect - data-test-subj="severitySelect" - disabled={isLoadingSeverity} - fullWidth - hasNoInitialSelection - isLoading={isLoadingSeverity} - onChange={(e) => onFieldChange('severityCode', e.target.value)} - options={severitySelectOptions} - value={severityCode ?? undefined} - /> - </EuiFormRow> - <EuiSpacer size="m" /> - </span> - ) : ( - <ConnectorCard - connectorType={ConnectorTypes.resilient} - isLoading={isLoadingIncidentTypes || isLoadingSeverity} - listItems={listItems} - title={connector.name} - /> - ); -}; - -// eslint-disable-next-line import/no-default-export -export { ResilientFieldsComponent as default }; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts deleted file mode 100644 index 21850cdfe4d92..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; - -import { CaseConnector } from '../types'; -import { ResilientFieldsType } from '../../../../../../cases/common'; -import * as i18n from './translations'; - -export * from './types'; - -export const getCaseConnector = (): CaseConnector<ResilientFieldsType> => { - return { - id: '.resilient', - fieldsComponent: lazy(() => import('./case_fields')), - }; -}; - -export const fieldLabels = { - incidentTypes: i18n.INCIDENT_TYPES_LABEL, - severityCode: i18n.SEVERITY_LABEL, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/translations.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/translations.ts deleted file mode 100644 index 4f8061f48aa68..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/translations.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const INCIDENT_TYPES_API_ERROR = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.unableToGetIncidentTypesMessage', - { - defaultMessage: 'Unable to get incident types', - } -); - -export const SEVERITY_API_ERROR = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.unableToGetSeverityMessage', - { - defaultMessage: 'Unable to get severity', - } -); - -export const INCIDENT_TYPES_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.incidentTypesPlaceholder', - { - defaultMessage: 'Choose types', - } -); - -export const INCIDENT_TYPES_LABEL = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.incidentTypesLabel', - { - defaultMessage: 'Incident Types', - } -); - -export const SEVERITY_LABEL = i18n.translate( - 'xpack.securitySolution.cases.connectors.resilient.severityLabel', - { - defaultMessage: 'Severity', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/types.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/types.ts deleted file mode 100644 index 06506d2c0d2f9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export type ResilientIncidentTypes = Array<{ id: number; name: string }>; -export type ResilientSeverity = ResilientIncidentTypes; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.test.tsx deleted file mode 100644 index 19ce6d653f9fd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.test.tsx +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { connector } from '../mock'; -import { useGetIncidentTypes, UseGetIncidentTypes } from './use_get_incident_types'; -import * as api from './api'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./api'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('useGetIncidentTypes', () => { - const { http, notifications } = useKibanaMock().services; - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIncidentTypes>(() => - useGetIncidentTypes({ http, toastNotifications: notifications.toasts }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ isLoading: true, incidentTypes: [] }); - }); - }); - - test('fetch incident types', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIncidentTypes>(() => - useGetIncidentTypes({ - http, - toastNotifications: notifications.toasts, - connector, - }) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - incidentTypes: [ - { id: 17, name: 'Communication error (fax; email)' }, - { id: 1001, name: 'Custom type' }, - ], - }); - }); - }); - - test('unhappy path', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getIncidentTypes'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetIncidentTypes>(() => - useGetIncidentTypes({ http, toastNotifications: notifications.toasts, connector }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ isLoading: false, incidentTypes: [] }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.tsx deleted file mode 100644 index 34cbb0a69b0f4..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_incident_types.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getIncidentTypes } from './api'; -import * as i18n from './translations'; - -type IncidentTypes = Array<{ id: number; name: string }>; - -interface Props { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - connector?: ActionConnector; -} - -export interface UseGetIncidentTypes { - incidentTypes: IncidentTypes; - isLoading: boolean; -} - -export const useGetIncidentTypes = ({ - http, - toastNotifications, - connector, -}: Props): UseGetIncidentTypes => { - const [isLoading, setIsLoading] = useState(true); - const [incidentTypes, setIncidentTypes] = useState<IncidentTypes>([]); - const didCancel = useRef(false); - const abortCtrl = useRef(new AbortController()); - - useEffect(() => { - const fetchData = async () => { - if (!connector) { - setIsLoading(false); - return; - } - - try { - abortCtrl.current = new AbortController(); - setIsLoading(true); - - const res = await getIncidentTypes({ - http, - signal: abortCtrl.current.signal, - connectorId: connector.id, - }); - - if (!didCancel.current) { - setIsLoading(false); - setIncidentTypes(res.data ?? []); - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.INCIDENT_TYPES_API_ERROR, - text: `${res.serviceMessage ?? res.message}`, - }); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.INCIDENT_TYPES_API_ERROR, - text: error.message, - }); - } - } - } - }; - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - }, [http, connector, toastNotifications]); - - return { - incidentTypes, - isLoading, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.test.tsx deleted file mode 100644 index 614ba3c236f06..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.test.tsx +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { connector } from '../mock'; -import { useGetSeverity, UseGetSeverity } from './use_get_severity'; -import * as api from './api'; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./api'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('useGetSeverity', () => { - const { http, notifications } = useKibanaMock().services; - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetSeverity>(() => - useGetSeverity({ http, toastNotifications: notifications.toasts }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ isLoading: true, severity: [] }); - }); - }); - - test('fetch severity', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetSeverity>(() => - useGetSeverity({ http, toastNotifications: notifications.toasts, connector }) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - severity: [ - { - id: 4, - name: 'Low', - }, - { - id: 5, - name: 'Medium', - }, - { - id: 6, - name: 'High', - }, - ], - }); - }); - }); - - test('unhappy path', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getSeverity'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetSeverity>(() => - useGetSeverity({ http, toastNotifications: notifications.toasts, connector }) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ isLoading: false, severity: [] }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.tsx deleted file mode 100644 index 5b44c6b4a32b2..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/resilient/use_get_severity.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getSeverity } from './api'; -import * as i18n from './translations'; - -type Severity = Array<{ id: number; name: string }>; - -interface Props { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - connector?: ActionConnector; -} - -export interface UseGetSeverity { - severity: Severity; - isLoading: boolean; -} - -export const useGetSeverity = ({ http, toastNotifications, connector }: Props): UseGetSeverity => { - const [isLoading, setIsLoading] = useState(true); - const [severity, setSeverity] = useState<Severity>([]); - const abortCtrl = useRef(new AbortController()); - const didCancel = useRef(false); - - useEffect(() => { - const fetchData = async () => { - if (!connector) { - setIsLoading(false); - return; - } - - try { - abortCtrl.current = new AbortController(); - setIsLoading(true); - - const res = await getSeverity({ - http, - signal: abortCtrl.current.signal, - connectorId: connector.id, - }); - - if (!didCancel.current) { - setIsLoading(false); - setSeverity(res.data ?? []); - - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.SEVERITY_API_ERROR, - text: `${res.serviceMessage ?? res.message}`, - }); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.SEVERITY_API_ERROR, - text: error.message, - }); - } - } - } - }; - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - }, [http, connector, toastNotifications]); - - return { - severity, - isLoading, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/__mocks__/api.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/__mocks__/api.ts deleted file mode 100644 index 215e3d6f92e6d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/__mocks__/api.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { choices } from '../../mock'; -import { GetChoicesProps } from '../api'; -import { Choice } from '../types'; - -export const choicesResponse = { - status: 'ok', - data: choices, -}; - -export const getChoices = async ( - props: GetChoicesProps -): Promise<{ status: string; data: Choice[] }> => Promise.resolve(choicesResponse); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.test.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.test.ts deleted file mode 100644 index 6a6bb7e947997..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; -import { getChoices } from './api'; -import { choices } from '../mock'; - -const choicesResponse = { - status: 'ok', - data: choices, -}; - -describe('ServiceNow API', () => { - const http = httpServiceMock.createStartContract(); - - beforeEach(() => jest.resetAllMocks()); - - describe('getChoices', () => { - test('should call get choices API', async () => { - const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(choicesResponse); - const res = await getChoices({ - http, - signal: abortCtrl.signal, - connectorId: 'test', - fields: ['priority'], - }); - - expect(res).toEqual(choicesResponse); - expect(http.post).toHaveBeenCalledWith('/api/actions/action/test/_execute', { - body: '{"params":{"subAction":"getChoices","subActionParams":{"fields":["priority"]}}}', - signal: abortCtrl.signal, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.ts deleted file mode 100644 index d91ad9f8762bd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/api.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../../actions/common'; -import { Choice } from './types'; - -export const BASE_ACTION_API_PATH = '/api/actions'; - -export interface GetChoicesProps { - http: HttpSetup; - signal: AbortSignal; - connectorId: string; - fields: string[]; -} - -export async function getChoices({ http, signal, connectorId, fields }: GetChoicesProps) { - return http.post<ActionTypeExecutorResult<Choice[]>>( - `${BASE_ACTION_API_PATH}/action/${connectorId}/_execute`, - { - body: JSON.stringify({ - params: { subAction: 'getChoices', subActionParams: { fields } }, - }), - signal, - } - ); -} diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/helpers.ts deleted file mode 100644 index 314d224491128..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/helpers.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiSelectOption } from '@elastic/eui'; -import { Choice } from './types'; - -export const choicesToEuiOptions = (choices: Choice[]): EuiSelectOption[] => - choices.map((choice) => ({ value: choice.value, text: choice.label })); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts deleted file mode 100644 index 02441b2b9f7aa..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; - -import { CaseConnector } from '../types'; -import { ServiceNowITSMFieldsType, ServiceNowSIRFieldsType } from '../../../../../../cases/common'; -import * as i18n from './translations'; - -export const getServiceNowITSMCaseConnector = (): CaseConnector<ServiceNowITSMFieldsType> => { - return { - id: '.servicenow', - fieldsComponent: lazy(() => import('./servicenow_itsm_case_fields')), - }; -}; - -export const getServiceNowSIRCaseConnector = (): CaseConnector<ServiceNowSIRFieldsType> => { - return { - id: '.servicenow-sir', - fieldsComponent: lazy(() => import('./servicenow_sir_case_fields')), - }; -}; - -export const serviceNowITSMFieldLabels = { - impact: i18n.IMPACT, - severity: i18n.SEVERITY, - urgency: i18n.URGENCY, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx deleted file mode 100644 index 6e2bdec360fdf..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { waitFor, act } from '@testing-library/react'; -import { EuiSelect } from '@elastic/eui'; -import { mount } from 'enzyme'; - -import { connector, choices as mockChoices } from '../mock'; -import { Choice } from './types'; -import Fields from './servicenow_itsm_case_fields'; - -let onChoicesSuccess = (c: Choice[]) => {}; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./use_get_choices', () => ({ - useGetChoices: (args: { onSuccess: () => void }) => { - onChoicesSuccess = args.onSuccess; - return { isLoading: false, choices: mockChoices }; - }, -})); - -describe('ServiceNowITSM Fields', () => { - const fields = { - severity: '1', - urgency: '2', - impact: '3', - category: 'software', - subcategory: 'os', - }; - const onChange = jest.fn(); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('all params fields are rendered - isEdit: true', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - expect(wrapper.find('[data-test-subj="severitySelect"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="urgencySelect"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="impactSelect"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="categorySelect"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="subcategorySelect"]').exists()).toBeTruthy(); - }); - - it('all params fields are rendered - isEdit: false', () => { - const wrapper = mount( - <Fields isEdit={false} fields={fields} onChange={onChange} connector={connector} /> - ); - act(() => { - onChoicesSuccess(mockChoices); - }); - - expect(wrapper.find('[data-test-subj="card-list-item"]').at(0).text()).toEqual( - 'Urgency: 2 - High' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(1).text()).toEqual( - 'Severity: 1 - Critical' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(2).text()).toEqual( - 'Impact: 3 - Moderate' - ); - }); - - test('it transforms the categories to options correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - act(() => { - onChoicesSuccess(mockChoices); - }); - - wrapper.update(); - expect(wrapper.find('[data-test-subj="categorySelect"]').first().prop('options')).toEqual([ - { value: 'Priviledge Escalation', text: 'Priviledge Escalation' }, - { - value: 'Criminal activity/investigation', - text: 'Criminal activity/investigation', - }, - { value: 'Denial of Service', text: 'Denial of Service' }, - { - value: 'software', - text: 'Software', - }, - ]); - }); - - test('it transforms the subcategories to options correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - act(() => { - onChoicesSuccess(mockChoices); - }); - - wrapper.update(); - expect(wrapper.find('[data-test-subj="subcategorySelect"]').first().prop('options')).toEqual([ - { - text: 'Operation System', - value: 'os', - }, - ]); - }); - - it('it transforms the options correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - act(() => { - onChoicesSuccess(mockChoices); - }); - - wrapper.update(); - const testers = ['severity', 'urgency', 'impact']; - testers.forEach((subj) => - expect(wrapper.find(`[data-test-subj="${subj}Select"]`).first().prop('options')).toEqual([ - { value: '1', text: '1 - Critical' }, - { value: '2', text: '2 - High' }, - { value: '3', text: '3 - Moderate' }, - { value: '4', text: '4 - Low' }, - ]) - ); - }); - - describe('onChange calls', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - expect(onChange).toHaveBeenCalledWith(fields); - - const testers = ['severity', 'urgency', 'impact', 'subcategory']; - testers.forEach((subj) => - test(`${subj.toUpperCase()}`, async () => { - await waitFor(() => { - const select = wrapper.find(EuiSelect).filter(`[data-test-subj="${subj}Select"]`)!; - select.prop('onChange')!({ - target: { - value: '9', - }, - } as React.ChangeEvent<HTMLSelectElement>); - }); - wrapper.update(); - expect(onChange).toHaveBeenCalledWith({ - ...fields, - [subj]: '9', - }); - }) - ); - - test('it should set subcategory to null when changing category', async () => { - await waitFor(() => { - const select = wrapper.find(EuiSelect).filter(`[data-test-subj="categorySelect"]`)!; - select.prop('onChange')!({ - target: { - value: 'network', - }, - } as React.ChangeEvent<HTMLSelectElement>); - }); - wrapper.update(); - expect(onChange).toHaveBeenCalledWith({ - ...fields, - subcategory: null, - category: 'network', - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx deleted file mode 100644 index f705c9005e480..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_itsm_case_fields.tsx +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; -import { EuiFormRow, EuiSelect, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import * as i18n from './translations'; - -import { ConnectorFieldsProps } from '../types'; -import { ConnectorTypes, ServiceNowITSMFieldsType } from '../../../../../../cases/common'; -import { useKibana } from '../../../../common/lib/kibana'; -import { ConnectorCard } from '../card'; -import { useGetChoices } from './use_get_choices'; -import { Fields, Choice } from './types'; -import { choicesToEuiOptions } from './helpers'; - -const useGetChoicesFields = ['urgency', 'severity', 'impact', 'category', 'subcategory']; -const defaultFields: Fields = { - urgency: [], - severity: [], - impact: [], - category: [], - subcategory: [], -}; - -const ServiceNowITSMFieldsComponent: React.FunctionComponent< - ConnectorFieldsProps<ServiceNowITSMFieldsType> -> = ({ isEdit = true, fields, connector, onChange }) => { - const init = useRef(true); - const { severity = null, urgency = null, impact = null, category = null, subcategory = null } = - fields ?? {}; - const { http, notifications } = useKibana().services; - const [choices, setChoices] = useState<Fields>(defaultFields); - - const categoryOptions = useMemo(() => choicesToEuiOptions(choices.category), [choices.category]); - const urgencyOptions = useMemo(() => choicesToEuiOptions(choices.urgency), [choices.urgency]); - const severityOptions = useMemo(() => choicesToEuiOptions(choices.severity), [choices.severity]); - const impactOptions = useMemo(() => choicesToEuiOptions(choices.impact), [choices.impact]); - - const subcategoryOptions = useMemo( - () => - choicesToEuiOptions( - choices.subcategory.filter((choice) => choice.dependent_value === category) - ), - [choices.subcategory, category] - ); - - const listItems = useMemo( - () => [ - ...(urgency != null && urgency.length > 0 - ? [ - { - title: i18n.URGENCY, - description: urgencyOptions.find((option) => `${option.value}` === urgency)?.text, - }, - ] - : []), - ...(severity != null && severity.length > 0 - ? [ - { - title: i18n.SEVERITY, - description: severityOptions.find((option) => `${option.value}` === severity)?.text, - }, - ] - : []), - ...(impact != null && impact.length > 0 - ? [ - { - title: i18n.IMPACT, - description: impactOptions.find((option) => `${option.value}` === impact)?.text, - }, - ] - : []), - ...(category != null && category.length > 0 - ? [ - { - title: i18n.CATEGORY, - description: categoryOptions.find((option) => `${option.value}` === category)?.text, - }, - ] - : []), - ...(subcategory != null && subcategory.length > 0 - ? [ - { - title: i18n.SUBCATEGORY, - description: subcategoryOptions.find((option) => `${option.value}` === subcategory) - ?.text, - }, - ] - : []), - ], - [ - category, - categoryOptions, - impact, - impactOptions, - severity, - severityOptions, - subcategory, - subcategoryOptions, - urgency, - urgencyOptions, - ] - ); - - const onChoicesSuccess = (values: Choice[]) => { - setChoices( - values.reduce( - (acc, value) => ({ - ...acc, - [value.element]: [...(acc[value.element] != null ? acc[value.element] : []), value], - }), - defaultFields - ) - ); - }; - - const { isLoading: isLoadingChoices } = useGetChoices({ - http, - toastNotifications: notifications.toasts, - connector, - fields: useGetChoicesFields, - onSuccess: onChoicesSuccess, - }); - - const onChangeCb = useCallback( - ( - key: keyof ServiceNowITSMFieldsType, - value: ServiceNowITSMFieldsType[keyof ServiceNowITSMFieldsType] - ) => { - onChange({ ...fields, [key]: value }); - }, - [fields, onChange] - ); - - // Set field at initialization - useEffect(() => { - if (init.current) { - init.current = false; - onChange({ urgency, severity, impact, category, subcategory }); - } - }, [category, impact, onChange, severity, subcategory, urgency]); - - return isEdit ? ( - <div data-test-subj={'connector-fields-sn-itsm'}> - <EuiFormRow fullWidth label={i18n.URGENCY}> - <EuiSelect - fullWidth - data-test-subj="urgencySelect" - options={urgencyOptions} - value={urgency ?? undefined} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChangeCb('urgency', e.target.value)} - /> - </EuiFormRow> - <EuiSpacer size="m" /> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.SEVERITY}> - <EuiSelect - fullWidth - data-test-subj="severitySelect" - options={severityOptions} - value={severity ?? undefined} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChangeCb('severity', e.target.value)} - /> - </EuiFormRow> - </EuiFlexItem> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.IMPACT}> - <EuiSelect - fullWidth - data-test-subj="impactSelect" - options={impactOptions} - value={impact ?? undefined} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChangeCb('impact', e.target.value)} - /> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.CATEGORY}> - <EuiSelect - fullWidth - data-test-subj="categorySelect" - options={categoryOptions} - value={category ?? undefined} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChange({ ...fields, category: e.target.value, subcategory: null })} - /> - </EuiFormRow> - </EuiFlexItem> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.SUBCATEGORY}> - <EuiSelect - fullWidth - data-test-subj="subcategorySelect" - options={subcategoryOptions} - // Needs an empty string instead of undefined to select the blank option when changing categories - value={subcategory ?? ''} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChangeCb('subcategory', e.target.value)} - /> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - </div> - ) : ( - <ConnectorCard - connectorType={ConnectorTypes.serviceNowITSM} - title={connector.name} - listItems={listItems} - isLoading={false} - /> - ); -}; - -// eslint-disable-next-line import/no-default-export -export { ServiceNowITSMFieldsComponent as default }; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx deleted file mode 100644 index 7cd32a0cbfbf3..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor, act } from '@testing-library/react'; -import { EuiSelect } from '@elastic/eui'; - -import { connector, choices as mockChoices } from '../mock'; -import { Choice } from './types'; -import Fields from './servicenow_sir_case_fields'; - -let onChoicesSuccess = (c: Choice[]) => {}; - -jest.mock('../../../../common/lib/kibana'); -jest.mock('./use_get_choices', () => ({ - useGetChoices: (args: { onSuccess: () => void }) => { - onChoicesSuccess = args.onSuccess; - return { isLoading: false, mockChoices }; - }, -})); - -describe('ServiceNowSIR Fields', () => { - const fields = { - destIp: true, - sourceIp: true, - malwareHash: true, - malwareUrl: true, - priority: '1', - category: 'Denial of Service', - subcategory: '26', - }; - const onChange = jest.fn(); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('all params fields are rendered - isEdit: true', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - expect(wrapper.find('[data-test-subj="destIpCheckbox"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="sourceIpCheckbox"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="malwareUrlCheckbox"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="malwareHashCheckbox"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="prioritySelect"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="categorySelect"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="subcategorySelect"]').exists()).toBeTruthy(); - }); - - test('all params fields are rendered - isEdit: false', () => { - const wrapper = mount( - <Fields isEdit={false} fields={fields} onChange={onChange} connector={connector} /> - ); - act(() => { - onChoicesSuccess(mockChoices); - }); - wrapper.update(); - - expect(wrapper.find('[data-test-subj="card-list-item"]').at(0).text()).toEqual( - 'Destination IP: Yes' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(1).text()).toEqual( - 'Source IP: Yes' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(2).text()).toEqual( - 'Malware URL: Yes' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(3).text()).toEqual( - 'Malware Hash: Yes' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(4).text()).toEqual( - 'Priority: 1 - Critical' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(5).text()).toEqual( - 'Category: Denial of Service' - ); - expect(wrapper.find('[data-test-subj="card-list-item"]').at(6).text()).toEqual( - 'Subcategory: Single or distributed (DoS or DDoS)' - ); - }); - - test('it transforms the categories to options correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - act(() => { - onChoicesSuccess(mockChoices); - }); - - wrapper.update(); - expect(wrapper.find('[data-test-subj="categorySelect"]').first().prop('options')).toEqual([ - { value: 'Priviledge Escalation', text: 'Priviledge Escalation' }, - { - value: 'Criminal activity/investigation', - text: 'Criminal activity/investigation', - }, - { value: 'Denial of Service', text: 'Denial of Service' }, - { - text: 'Software', - value: 'software', - }, - ]); - }); - - test('it transforms the subcategories to options correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - act(() => { - onChoicesSuccess(mockChoices); - }); - - wrapper.update(); - expect(wrapper.find('[data-test-subj="subcategorySelect"]').first().prop('options')).toEqual([ - { - text: 'Inbound or outbound', - value: '12', - }, - { - text: 'Single or distributed (DoS or DDoS)', - value: '26', - }, - { - text: 'Inbound DDos', - value: 'inbound_ddos', - }, - ]); - }); - - test('it transforms the priorities to options correctly', async () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - act(() => { - onChoicesSuccess(mockChoices); - }); - - wrapper.update(); - expect(wrapper.find('[data-test-subj="prioritySelect"]').first().prop('options')).toEqual([ - { - text: '1 - Critical', - value: '1', - }, - { - text: '2 - High', - value: '2', - }, - { - text: '3 - Moderate', - value: '3', - }, - { - text: '4 - Low', - value: '4', - }, - ]); - }); - - describe('onChange calls', () => { - const wrapper = mount(<Fields fields={fields} onChange={onChange} connector={connector} />); - - act(() => { - onChoicesSuccess(mockChoices); - }); - wrapper.update(); - - expect(onChange).toHaveBeenCalledWith(fields); - - const checkbox = ['destIp', 'sourceIp', 'malwareHash', 'malwareUrl']; - checkbox.forEach((subj) => - test(`${subj.toUpperCase()}`, async () => { - await waitFor(() => { - wrapper - .find(`[data-test-subj="${subj}Checkbox"] input`) - .first() - .simulate('change', { target: { checked: false } }); - expect(onChange).toHaveBeenCalledWith({ - ...fields, - [subj]: false, - }); - }); - }) - ); - - const testers = ['priority', 'subcategory']; - testers.forEach((subj) => - test(`${subj.toUpperCase()}`, async () => { - await waitFor(() => { - const select = wrapper.find(EuiSelect).filter(`[data-test-subj="${subj}Select"]`)!; - select.prop('onChange')!({ - target: { - value: '9', - }, - } as React.ChangeEvent<HTMLSelectElement>); - }); - wrapper.update(); - expect(onChange).toHaveBeenCalledWith({ - ...fields, - [subj]: '9', - }); - }) - ); - - test('it should set subcategory to null when changing category', async () => { - const select = wrapper.find(EuiSelect).filter(`[data-test-subj="categorySelect"]`)!; - select.prop('onChange')!({ - target: { - value: 'network', - }, - } as React.ChangeEvent<HTMLSelectElement>); - - wrapper.update(); - - await waitFor(() => { - expect(onChange).toHaveBeenCalledWith({ - ...fields, - subcategory: null, - category: 'network', - }); - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx deleted file mode 100644 index 2bac7e01a00b2..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/servicenow_sir_case_fields.tsx +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; -import { EuiFormRow, EuiSelect, EuiFlexGroup, EuiFlexItem, EuiCheckbox } from '@elastic/eui'; - -import { ConnectorTypes, ServiceNowSIRFieldsType } from '../../../../../../cases/common'; -import { useKibana } from '../../../../common/lib/kibana'; -import { ConnectorFieldsProps } from '../types'; -import { ConnectorCard } from '../card'; -import { useGetChoices } from './use_get_choices'; -import { Choice, Fields } from './types'; -import { choicesToEuiOptions } from './helpers'; - -import * as i18n from './translations'; - -const useGetChoicesFields = ['category', 'subcategory', 'priority']; -const defaultFields: Fields = { - category: [], - subcategory: [], - priority: [], -}; - -const ServiceNowSIRFieldsComponent: React.FunctionComponent< - ConnectorFieldsProps<ServiceNowSIRFieldsType> -> = ({ isEdit = true, fields, connector, onChange }) => { - const init = useRef(true); - const { - category = null, - destIp = true, - malwareHash = true, - malwareUrl = true, - priority = null, - sourceIp = true, - subcategory = null, - } = fields ?? {}; - - const { http, notifications } = useKibana().services; - - const [choices, setChoices] = useState<Fields>(defaultFields); - - const onChangeCb = useCallback( - ( - key: keyof ServiceNowSIRFieldsType, - value: ServiceNowSIRFieldsType[keyof ServiceNowSIRFieldsType] - ) => { - onChange({ ...fields, [key]: value }); - }, - [fields, onChange] - ); - - const onChoicesSuccess = (values: Choice[]) => { - setChoices( - values.reduce( - (acc, value) => ({ - ...acc, - [value.element]: [...(acc[value.element] != null ? acc[value.element] : []), value], - }), - defaultFields - ) - ); - }; - - const { isLoading: isLoadingChoices } = useGetChoices({ - http, - toastNotifications: notifications.toasts, - connector, - fields: useGetChoicesFields, - onSuccess: onChoicesSuccess, - }); - - const categoryOptions = useMemo(() => choicesToEuiOptions(choices.category), [choices.category]); - const priorityOptions = useMemo(() => choicesToEuiOptions(choices.priority), [choices.priority]); - - const subcategoryOptions = useMemo( - () => - choicesToEuiOptions( - choices.subcategory.filter((choice) => choice.dependent_value === category) - ), - [choices.subcategory, category] - ); - - const listItems = useMemo( - () => [ - ...(destIp != null && destIp - ? [ - { - title: i18n.DEST_IP, - description: i18n.ALERT_FIELD_ENABLED_TEXT, - }, - ] - : []), - ...(sourceIp != null && sourceIp - ? [ - { - title: i18n.SOURCE_IP, - description: i18n.ALERT_FIELD_ENABLED_TEXT, - }, - ] - : []), - ...(malwareUrl != null && malwareUrl - ? [ - { - title: i18n.MALWARE_URL, - description: i18n.ALERT_FIELD_ENABLED_TEXT, - }, - ] - : []), - ...(malwareHash != null && malwareHash - ? [ - { - title: i18n.MALWARE_HASH, - description: i18n.ALERT_FIELD_ENABLED_TEXT, - }, - ] - : []), - ...(priority != null && priority.length > 0 - ? [ - { - title: i18n.PRIORITY, - description: priorityOptions.find((option) => `${option.value}` === priority)?.text, - }, - ] - : []), - ...(category != null && category.length > 0 - ? [ - { - title: i18n.CATEGORY, - description: categoryOptions.find((option) => `${option.value}` === category)?.text, - }, - ] - : []), - ...(subcategory != null && subcategory.length > 0 - ? [ - { - title: i18n.SUBCATEGORY, - description: subcategoryOptions.find((option) => `${option.value}` === subcategory) - ?.text, - }, - ] - : []), - ], - [ - category, - categoryOptions, - destIp, - malwareHash, - malwareUrl, - priority, - priorityOptions, - sourceIp, - subcategory, - subcategoryOptions, - ] - ); - - // Set field at initialization - useEffect(() => { - if (init.current) { - init.current = false; - onChange({ category, destIp, malwareHash, malwareUrl, priority, sourceIp, subcategory }); - } - }, [category, destIp, malwareHash, malwareUrl, onChange, priority, sourceIp, subcategory]); - - return isEdit ? ( - <div data-test-subj={'connector-fields-sn-sir'}> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.ALERT_FIELDS_LABEL}> - <> - <EuiFlexGroup> - <EuiFlexItem> - <EuiCheckbox - id="destIpCheckbox" - data-test-subj="destIpCheckbox" - label={i18n.DEST_IP} - checked={destIp ?? false} - compressed - onChange={(e) => onChangeCb('destIp', e.target.checked)} - /> - </EuiFlexItem> - <EuiFlexItem> - <EuiCheckbox - id="sourceIpCheckbox" - data-test-subj="sourceIpCheckbox" - label={i18n.SOURCE_IP} - checked={sourceIp ?? false} - compressed - onChange={(e) => onChangeCb('sourceIp', e.target.checked)} - /> - </EuiFlexItem> - </EuiFlexGroup> - <EuiFlexGroup> - <EuiFlexItem> - <EuiCheckbox - id="malwareUrlCheckbox" - data-test-subj="malwareUrlCheckbox" - label={i18n.MALWARE_URL} - checked={malwareUrl ?? false} - compressed - onChange={(e) => onChangeCb('malwareUrl', e.target.checked)} - /> - </EuiFlexItem> - <EuiFlexItem> - <EuiCheckbox - id="malwareHashCheckbox" - data-test-subj="malwareHashCheckbox" - label={i18n.MALWARE_HASH} - checked={malwareHash ?? false} - compressed - onChange={(e) => onChangeCb('malwareHash', e.target.checked)} - /> - </EuiFlexItem> - </EuiFlexGroup> - </> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.PRIORITY}> - <EuiSelect - fullWidth - data-test-subj="prioritySelect" - hasNoInitialSelection - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - options={priorityOptions} - value={priority ?? undefined} - onChange={(e) => onChangeCb('priority', e.target.value)} - /> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - <EuiFlexGroup> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.CATEGORY}> - <EuiSelect - fullWidth - data-test-subj="categorySelect" - options={categoryOptions} - value={category ?? undefined} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChange({ ...fields, category: e.target.value, subcategory: null })} - /> - </EuiFormRow> - </EuiFlexItem> - <EuiFlexItem> - <EuiFormRow fullWidth label={i18n.SUBCATEGORY}> - <EuiSelect - fullWidth - data-test-subj="subcategorySelect" - options={subcategoryOptions} - // Needs an empty string instead of undefined to select the blank option when changing categories - value={subcategory ?? ''} - isLoading={isLoadingChoices} - disabled={isLoadingChoices} - hasNoInitialSelection - onChange={(e) => onChangeCb('subcategory', e.target.value)} - /> - </EuiFormRow> - </EuiFlexItem> - </EuiFlexGroup> - </div> - ) : ( - <ConnectorCard - connectorType={ConnectorTypes.serviceNowITSM} - title={connector.name} - listItems={listItems} - isLoading={false} - /> - ); -}; - -// eslint-disable-next-line import/no-default-export -export { ServiceNowSIRFieldsComponent as default }; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/translations.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/translations.ts deleted file mode 100644 index 77c263385df0a..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/translations.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const URGENCY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.urgencySelectFieldLabel', - { - defaultMessage: 'Urgency', - } -); - -export const SEVERITY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.severitySelectFieldLabel', - { - defaultMessage: 'Severity', - } -); - -export const IMPACT = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.impactSelectFieldLabel', - { - defaultMessage: 'Impact', - } -); - -export const CHOICES_API_ERROR = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.unableToGetChoicesMessage', - { - defaultMessage: 'Unable to get choices', - } -); - -export const MALWARE_URL = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.malwareURLTitle', - { - defaultMessage: 'Malware URL', - } -); - -export const MALWARE_HASH = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.malwareHashTitle', - { - defaultMessage: 'Malware Hash', - } -); - -export const CATEGORY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.categoryTitle', - { - defaultMessage: 'Category', - } -); - -export const SUBCATEGORY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.subcategoryTitle', - { - defaultMessage: 'Subcategory', - } -); - -export const SOURCE_IP = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.sourceIPTitle', - { - defaultMessage: 'Source IP', - } -); - -export const DEST_IP = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.destinationIPTitle', - { - defaultMessage: 'Destination IP', - } -); - -export const PRIORITY = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.prioritySelectFieldTitle', - { - defaultMessage: 'Priority', - } -); - -export const ALERT_FIELDS_LABEL = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.alertFieldsTitle', - { - defaultMessage: 'Select Observables to push', - } -); - -export const ALERT_FIELD_ENABLED_TEXT = i18n.translate( - 'xpack.securitySolution.components.connectors.serviceNow.alertFieldEnabledText', - { - defaultMessage: 'Yes', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/types.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/types.ts deleted file mode 100644 index fd1af62f7bb2a..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/types.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export interface Choice { - value: string; - label: string; - dependent_value: string; - element: string; -} - -export type Fields = Record<string, Choice[]>; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.test.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.test.tsx deleted file mode 100644 index 2492fbaaf5a83..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.test.tsx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook } from '@testing-library/react-hooks'; - -import { useKibana } from '../../../../common/lib/kibana'; -import { ActionConnector } from '../../../containers/types'; -import { choices } from '../mock'; -import { useGetChoices, UseGetChoices, UseGetChoicesProps } from './use_get_choices'; -import * as api from './api'; - -jest.mock('./api'); -jest.mock('../../../../common/lib/kibana'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; -const onSuccess = jest.fn(); -const fields = ['priority']; - -const connector = { - secrets: { - username: 'user', - password: 'pass', - }, - id: 'test', - actionTypeId: '.servicenow', - name: 'ServiceNow', - isPreconfigured: false, - config: { - apiUrl: 'https://dev94428.service-now.com/', - }, -} as ActionConnector; - -describe('useGetChoices', () => { - const { services } = useKibanaMock(); - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('init', async () => { - const { result, waitForNextUpdate } = renderHook<UseGetChoicesProps, UseGetChoices>(() => - useGetChoices({ - http: services.http, - connector, - toastNotifications: services.notifications.toasts, - fields, - onSuccess, - }) - ); - - await waitForNextUpdate(); - - expect(result.current).toEqual({ - isLoading: false, - choices, - }); - }); - - it('returns an empty array when connector is not presented', async () => { - const { result } = renderHook<UseGetChoicesProps, UseGetChoices>(() => - useGetChoices({ - http: services.http, - connector: undefined, - toastNotifications: services.notifications.toasts, - fields, - onSuccess, - }) - ); - - expect(result.current).toEqual({ - isLoading: false, - choices: [], - }); - }); - - it('it calls onSuccess', async () => { - const { waitForNextUpdate } = renderHook<UseGetChoicesProps, UseGetChoices>(() => - useGetChoices({ - http: services.http, - connector, - toastNotifications: services.notifications.toasts, - fields, - onSuccess, - }) - ); - - await waitForNextUpdate(); - - expect(onSuccess).toHaveBeenCalledWith(choices); - }); - - it('it displays an error when service fails', async () => { - const spyOnGetChoices = jest.spyOn(api, 'getChoices'); - spyOnGetChoices.mockResolvedValue( - Promise.resolve({ - actionId: 'test', - status: 'error', - serviceMessage: 'An error occurred', - }) - ); - - const { waitForNextUpdate } = renderHook<UseGetChoicesProps, UseGetChoices>(() => - useGetChoices({ - http: services.http, - connector, - toastNotifications: services.notifications.toasts, - fields, - onSuccess, - }) - ); - - await waitForNextUpdate(); - - expect(services.notifications.toasts.addDanger).toHaveBeenCalledWith({ - text: 'An error occurred', - title: 'Unable to get choices', - }); - }); - - it('it displays an error when http throws an error', async () => { - const spyOnGetChoices = jest.spyOn(api, 'getChoices'); - spyOnGetChoices.mockImplementation(() => { - throw new Error('An error occurred'); - }); - - renderHook<UseGetChoicesProps, UseGetChoices>(() => - useGetChoices({ - http: services.http, - connector, - toastNotifications: services.notifications.toasts, - fields, - onSuccess, - }) - ); - - expect(services.notifications.toasts.addDanger).toHaveBeenCalledWith({ - text: 'An error occurred', - title: 'Unable to get choices', - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.tsx b/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.tsx deleted file mode 100644 index a979f96d84ab2..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/servicenow/use_get_choices.tsx +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; -import { ActionConnector } from '../../../containers/types'; -import { getChoices } from './api'; -import { Choice } from './types'; -import * as i18n from './translations'; - -export interface UseGetChoicesProps { - http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; - connector?: ActionConnector; - fields: string[]; - onSuccess?: (choices: Choice[]) => void; -} - -export interface UseGetChoices { - choices: Choice[]; - isLoading: boolean; -} - -export const useGetChoices = ({ - http, - connector, - toastNotifications, - fields, - onSuccess, -}: UseGetChoicesProps): UseGetChoices => { - const [isLoading, setIsLoading] = useState(false); - const [choices, setChoices] = useState<Choice[]>([]); - const didCancel = useRef(false); - const abortCtrl = useRef(new AbortController()); - - useEffect(() => { - const fetchData = async () => { - if (!connector) { - setIsLoading(false); - return; - } - - try { - abortCtrl.current = new AbortController(); - setIsLoading(true); - - const res = await getChoices({ - http, - signal: abortCtrl.current.signal, - connectorId: connector.id, - fields, - }); - - if (!didCancel.current) { - setIsLoading(false); - setChoices(res.data ?? []); - if (res.status && res.status === 'error') { - toastNotifications.addDanger({ - title: i18n.CHOICES_API_ERROR, - text: `${res.serviceMessage ?? res.message}`, - }); - } else if (onSuccess) { - onSuccess(res.data ?? []); - } - } - } catch (error) { - if (!didCancel.current) { - setIsLoading(false); - if (error.name !== 'AbortError') { - toastNotifications.addDanger({ - title: i18n.CHOICES_API_ERROR, - text: error.message, - }); - } - } - } - }; - - didCancel.current = false; - abortCtrl.current.abort(); - fetchData(); - - return () => { - didCancel.current = true; - abortCtrl.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [http, connector, toastNotifications, fields]); - - return { - choices, - isLoading, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts b/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts deleted file mode 100644 index 86f0238dd450f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/connectors/types.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; - -import { - ActionType as ThirdPartySupportedActions, - CaseField, - ActionConnector, - ConnectorTypeFields, -} from '../../../../../cases/common'; - -export { ThirdPartyField as AllThirdPartyFields } from '../../../../../cases/common'; -export type CaseActionConnector = ActionConnector; - -export interface ThirdPartyField { - label: string; - validSourceFields: CaseField[]; - defaultSourceField: CaseField; - defaultActionType: ThirdPartySupportedActions; -} - -export interface ConnectorConfiguration { - name: string; - logo: string; -} - -export interface CaseConnector<UIProps = unknown> { - id: string; - fieldsComponent: React.LazyExoticComponent< - React.ComponentType<ConnectorFieldsProps<UIProps>> - > | null; -} - -export interface CaseConnectorsRegistry { - has: (id: string) => boolean; - register: <UIProps extends ConnectorTypeFields['fields']>( - connector: CaseConnector<UIProps> - ) => void; - get: <UIProps extends ConnectorTypeFields['fields']>(id: string) => CaseConnector<UIProps>; - list: () => CaseConnector[]; -} - -export interface ConnectorFieldsProps<TFields> { - isEdit?: boolean; - connector: CaseActionConnector; - fields: TFields; - onChange: (fields: TFields) => void; -} diff --git a/x-pack/plugins/security_solution/public/cases/components/create/connector.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/connector.test.tsx deleted file mode 100644 index 9c5a4a0784af1..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/connector.test.tsx +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { act, waitFor } from '@testing-library/react'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; - -import { useForm, Form, FormHook } from '../../../shared_imports'; -import { connectorsMock } from '../../containers/mock'; -import { Connector } from './connector'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; -import { useGetSeverity } from '../connectors/resilient/use_get_severity'; -import { useGetChoices } from '../connectors/servicenow/use_get_choices'; -import { incidentTypes, severity, choices } from '../connectors/mock'; -import { schema, FormProps } from './schema'; - -jest.mock('../../../common/lib/kibana', () => { - return { - useKibana: () => ({ - services: { - notifications: {}, - http: {}, - }, - }), - }; -}); -jest.mock('../../containers/configure/use_connectors'); -jest.mock('../connectors/resilient/use_get_incident_types'); -jest.mock('../connectors/resilient/use_get_severity'); -jest.mock('../connectors/servicenow/use_get_choices'); - -const useConnectorsMock = useConnectors as jest.Mock; -const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; -const useGetSeverityMock = useGetSeverity as jest.Mock; -const useGetChoicesMock = useGetChoices as jest.Mock; - -const useGetIncidentTypesResponse = { - isLoading: false, - incidentTypes, -}; - -const useGetSeverityResponse = { - isLoading: false, - severity, -}; - -const useGetChoicesResponse = { - isLoading: false, - choices, -}; - -describe('Connector', () => { - let globalForm: FormHook; - - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: { connectorId: connectorsMock[0].id, fields: null }, - schema: { - connectorId: schema.connectorId, - fields: schema.fields, - }, - }); - - globalForm = form; - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - useConnectorsMock.mockReturnValue({ loading: false, connectors: connectorsMock }); - useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); - useGetSeverityMock.mockReturnValue(useGetSeverityResponse); - useGetChoicesMock.mockReturnValue(useGetChoicesResponse); - }); - - it('it renders', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Connector isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="connector-fields"]`).exists()).toBeTruthy(); - - await waitFor(() => { - expect(wrapper.find(`button[data-test-subj="dropdown-connectors"]`).first().text()).toBe( - 'My Connector' - ); - }); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-sn-itsm"]`).exists()).toBeTruthy(); - }); - }); - - it('it is loading when fetching connectors', async () => { - useConnectorsMock.mockReturnValue({ loading: true, connectors: connectorsMock }); - const wrapper = mount( - <MockHookWrapperComponent> - <Connector isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect( - wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') - ).toEqual(true); - }); - - it('it is disabled when fetching connectors', async () => { - useConnectorsMock.mockReturnValue({ loading: true, connectors: connectorsMock }); - const wrapper = mount( - <MockHookWrapperComponent> - <Connector isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled')).toEqual( - true - ); - }); - - it('it is disabled and loading when passing loading as true', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Connector isLoading={true} /> - </MockHookWrapperComponent> - ); - - expect( - wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') - ).toEqual(true); - expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled')).toEqual( - true - ); - }); - - it(`it should change connector`, async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Connector isLoading={false} /> - </MockHookWrapperComponent> - ); - - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-resilient-2"]`).simulate('click'); - wrapper.update(); - }); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeTruthy(); - }); - - act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ value: '19', label: 'Denial of Service' }]); - }); - - act(() => { - wrapper - .find('select[data-test-subj="severitySelect"]') - .first() - .simulate('change', { - target: { value: '4' }, - }); - }); - - await waitFor(() => { - expect(globalForm.getFormData()).toEqual({ - connectorId: 'resilient-2', - fields: { incidentTypes: ['19'], severityCode: '4' }, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx b/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx deleted file mode 100644 index 516cc5a0d23a5..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/connector.tsx +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback } from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; - -import { ConnectorTypes } from '../../../../../cases/common'; -import { UseField, useFormData, FieldHook, useFormContext } from '../../../shared_imports'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { ConnectorSelector } from '../connector_selector/form'; -import { ConnectorFieldsForm } from '../connectors/fields_form'; -import { ActionConnector } from '../../containers/types'; -import { getConnectorById } from '../configure_cases/utils'; -import { FormProps } from './schema'; - -interface Props { - isLoading: boolean; - hideConnectorServiceNowSir?: boolean; -} - -interface ConnectorsFieldProps { - connectors: ActionConnector[]; - field: FieldHook<FormProps['fields']>; - isEdit: boolean; - hideConnectorServiceNowSir?: boolean; -} - -const ConnectorFields = ({ - connectors, - isEdit, - field, - hideConnectorServiceNowSir = false, -}: ConnectorsFieldProps) => { - const [{ connectorId }] = useFormData({ watch: ['connectorId'] }); - const { setValue } = field; - let connector = getConnectorById(connectorId, connectors) ?? null; - if ( - connector && - hideConnectorServiceNowSir && - connector.actionTypeId === ConnectorTypes.serviceNowSIR - ) { - connector = null; - } - return ( - <ConnectorFieldsForm - connector={connector} - fields={field.value} - isEdit={isEdit} - onChange={setValue} - /> - ); -}; - -const ConnectorComponent: React.FC<Props> = ({ hideConnectorServiceNowSir = false, isLoading }) => { - const { getFields } = useFormContext(); - const { loading: isLoadingConnectors, connectors } = useConnectors(); - const handleConnectorChange = useCallback( - (newConnector) => { - const { fields } = getFields(); - fields.setValue(null); - }, - [getFields] - ); - - return ( - <EuiFlexGroup> - <EuiFlexItem> - <UseField - path="connectorId" - component={ConnectorSelector} - componentProps={{ - connectors, - handleChange: handleConnectorChange, - hideConnectorServiceNowSir, - dataTestSubj: 'caseConnectors', - disabled: isLoading || isLoadingConnectors, - idAria: 'caseConnectors', - isLoading: isLoading || isLoadingConnectors, - }} - /> - </EuiFlexItem> - <EuiFlexItem> - <UseField - path="fields" - component={ConnectorFields} - componentProps={{ - connectors, - hideConnectorServiceNowSir, - isEdit: true, - }} - /> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -ConnectorComponent.displayName = 'ConnectorComponent'; - -export const Connector = memo(ConnectorComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/description.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/description.test.tsx deleted file mode 100644 index 7d7b5278bf8a7..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/description.test.tsx +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { act } from '@testing-library/react'; - -import { useForm, Form, FormHook } from '../../../shared_imports'; -import { Description } from './description'; -import { schema, FormProps } from './schema'; - -describe('Description', () => { - let globalForm: FormHook; - - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: { description: 'My description' }, - schema: { - description: schema.description, - }, - }); - - globalForm = form; - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('it renders', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Description isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseDescription"]`).exists()).toBeTruthy(); - }); - - it('it changes the description', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Description isLoading={false} /> - </MockHookWrapperComponent> - ); - - await act(async () => { - wrapper - .find(`[data-test-subj="caseDescription"] textarea`) - .first() - .simulate('change', { target: { value: 'My new description' } }); - }); - - expect(globalForm.getFormData()).toEqual({ description: 'My new description' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/description.tsx b/x-pack/plugins/security_solution/public/cases/components/create/description.tsx deleted file mode 100644 index 0191dfdb929e5..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/description.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; -import { UseField } from '../../../shared_imports'; - -interface Props { - isLoading: boolean; -} - -export const fieldName = 'description'; - -const DescriptionComponent: React.FC<Props> = ({ isLoading }) => ( - <UseField - path={fieldName} - component={MarkdownEditorForm} - componentProps={{ - dataTestSubj: 'caseDescription', - idAria: 'caseDescription', - isDisabled: isLoading, - }} - /> -); - -DescriptionComponent.displayName = 'DescriptionComponent'; - -export const Description = memo(DescriptionComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/flyout.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/flyout.test.tsx index d5883b7b88cd0..d413a2d5e0018 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/flyout.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/flyout.test.tsx @@ -5,57 +5,22 @@ * 2.0. */ -/* eslint-disable react/display-name */ -import React, { ReactNode } from 'react'; +import React from 'react'; import { mount } from 'enzyme'; import '../../../common/mock/match_media'; import { CreateCaseFlyout } from './flyout'; import { TestProviders } from '../../../common/mock'; -jest.mock('../create/form_context', () => { - return { - FormContext: ({ - children, - onSuccess, - }: { - children: ReactNode; - onSuccess: ({ id }: { id: string }) => Promise<void>; - }) => { - return ( - <> - <button - type="button" - data-test-subj="form-context-on-success" - onClick={async () => { - await onSuccess({ id: 'case-id' }); - }} - > - {'submit'} - </button> - {children} - </> - ); +jest.mock('../../../common/lib/kibana', () => ({ + useKibana: () => ({ + services: { + cases: { + getCreateCase: jest.fn(), + }, }, - }; -}); - -jest.mock('../create/form', () => { - return { - CreateCaseForm: () => { - return <>{'form'}</>; - }, - }; -}); - -jest.mock('../create/submit_button', () => { - return { - SubmitCaseButton: () => { - return <>{'Submit'}</>; - }, - }; -}); - + }), +})); const onCloseFlyout = jest.fn(); const onSuccess = jest.fn(); const defaultProps = { @@ -88,30 +53,4 @@ describe('CreateCaseFlyout', () => { wrapper.find('.euiFlyout__closeButton').first().simulate('click'); expect(onCloseFlyout).toBeCalled(); }); - - it('pass the correct props to FormContext component', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseFlyout {...defaultProps} /> - </TestProviders> - ); - - const props = wrapper.find('FormContext').props(); - expect(props).toEqual( - expect.objectContaining({ - onSuccess, - }) - ); - }); - - it('onSuccess called when creating a case', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseFlyout {...defaultProps} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj='form-context-on-success']`).first().simulate('click'); - expect(onSuccess).toHaveBeenCalledWith({ id: 'case-id' }); - }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/flyout.tsx b/x-pack/plugins/security_solution/public/cases/components/create/flyout.tsx index e7bb0b25f391f..fa231eadf0337 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/flyout.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/flyout.tsx @@ -9,25 +9,16 @@ import React, { memo } from 'react'; import styled from 'styled-components'; import { EuiFlyout, EuiFlyoutHeader, EuiTitle, EuiFlyoutBody } from '@elastic/eui'; -import { FormContext } from '../create/form_context'; -import { CreateCaseForm } from '../create/form'; -import { SubmitCaseButton } from '../create/submit_button'; -import { Case } from '../../containers/types'; import * as i18n from '../../translations'; +import { useKibana } from '../../../common/lib/kibana'; +import { Case } from '../../../../../cases/common'; export interface CreateCaseModalProps { + afterCaseCreated?: (theCase: Case) => Promise<void>; onCloseFlyout: () => void; onSuccess: (theCase: Case) => Promise<void>; - afterCaseCreated?: (theCase: Case) => Promise<void>; } -const Container = styled.div` - ${({ theme }) => ` - margin-top: ${theme.eui.euiSize}; - text-align: right; - `} -`; - const StyledFlyout = styled(EuiFlyout)` ${({ theme }) => ` z-index: ${theme.eui.euiZModal}; @@ -41,10 +32,11 @@ const FormWrapper = styled.div` `; const CreateCaseFlyoutComponent: React.FC<CreateCaseModalProps> = ({ - onSuccess, afterCaseCreated, onCloseFlyout, + onSuccess, }) => { + const { cases } = useKibana().services; return ( <StyledFlyout onClose={onCloseFlyout} data-test-subj="create-case-flyout"> <EuiFlyoutHeader hasBorder> @@ -54,12 +46,12 @@ const CreateCaseFlyoutComponent: React.FC<CreateCaseModalProps> = ({ </EuiFlyoutHeader> <EuiFlyoutBody> <FormWrapper> - <FormContext onSuccess={onSuccess} afterCaseCreated={afterCaseCreated}> - <CreateCaseForm withSteps={false} /> - <Container> - <SubmitCaseButton /> - </Container> - </FormContext> + {cases.getCreateCase({ + afterCaseCreated, + onCancel: onCloseFlyout, + onSuccess, + withSteps: false, + })} </FormWrapper> </EuiFlyoutBody> </StyledFlyout> diff --git a/x-pack/plugins/security_solution/public/cases/components/create/form.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/form.test.tsx deleted file mode 100644 index 029965444929b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/form.test.tsx +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { act, waitFor } from '@testing-library/react'; - -import { useForm, Form, FormHook } from '../../../shared_imports'; -import { useGetTags } from '../../containers/use_get_tags'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { connectorsMock } from '../../containers/mock'; -import { schema, FormProps } from './schema'; -import { CreateCaseForm } from './form'; - -jest.mock('../../containers/use_get_tags'); -jest.mock('../../containers/configure/use_connectors'); -const useGetTagsMock = useGetTags as jest.Mock; -const useConnectorsMock = useConnectors as jest.Mock; - -const initialCaseValue: FormProps = { - description: '', - tags: [], - title: '', - connectorId: 'none', - fields: null, - syncAlerts: true, -}; - -describe('CreateCaseForm', () => { - let globalForm: FormHook; - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: initialCaseValue, - options: { stripEmptyFields: false }, - schema, - }); - - globalForm = form; - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - useGetTagsMock.mockReturnValue({ tags: ['test'] }); - useConnectorsMock.mockReturnValue({ loading: false, connectors: connectorsMock }); - }); - - it('it renders with steps', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <CreateCaseForm /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="case-creation-form-steps"]`).exists()).toBeTruthy(); - }); - - it('it renders without steps', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <CreateCaseForm withSteps={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="case-creation-form-steps"]`).exists()).toBeFalsy(); - }); - - it('it renders all form fields', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <CreateCaseForm /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseTitle"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseTags"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseDescription"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseSyncAlerts"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseConnectors"]`).exists()).toBeTruthy(); - }); - - it('should render spinner when loading', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <CreateCaseForm /> - </MockHookWrapperComponent> - ); - - await act(async () => { - globalForm.setFieldValue('title', 'title'); - globalForm.setFieldValue('description', 'description'); - globalForm.submit(); - // For some weird reason this is needed to pass the test. - // It does not do anything useful - await wrapper.find(`[data-test-subj="caseTitle"]`); - await wrapper.update(); - await waitFor(() => { - expect( - wrapper.find(`[data-test-subj="create-case-loading-spinner"]`).exists() - ).toBeTruthy(); - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/form.tsx b/x-pack/plugins/security_solution/public/cases/components/create/form.tsx deleted file mode 100644 index 09518c6f6adc1..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/form.tsx +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { EuiLoadingSpinner, EuiSteps } from '@elastic/eui'; -import styled, { css } from 'styled-components'; - -import { useFormContext } from '../../../shared_imports'; - -import { Title } from './title'; -import { Description } from './description'; -import { Tags } from './tags'; -import { Connector } from './connector'; -import * as i18n from './translations'; -import { SyncAlertsToggle } from './sync_alerts_toggle'; - -interface ContainerProps { - big?: boolean; -} - -const Container = styled.div.attrs((props) => props)<ContainerProps>` - ${({ big, theme }) => css` - margin-top: ${big ? theme.eui?.euiSizeXL ?? '32px' : theme.eui?.euiSize ?? '16px'}; - `} -`; - -const MySpinner = styled(EuiLoadingSpinner)` - position: absolute; - top: 50%; - left: 50%; - z-index: 99; -`; - -interface Props { - hideConnectorServiceNowSir?: boolean; - withSteps?: boolean; -} - -export const CreateCaseForm: React.FC<Props> = React.memo( - ({ hideConnectorServiceNowSir = false, withSteps = true }) => { - const { isSubmitting } = useFormContext(); - - const firstStep = useMemo( - () => ({ - title: i18n.STEP_ONE_TITLE, - children: ( - <> - <Title isLoading={isSubmitting} /> - <Container> - <Tags isLoading={isSubmitting} /> - </Container> - <Container big> - <Description isLoading={isSubmitting} /> - </Container> - </> - ), - }), - [isSubmitting] - ); - - const secondStep = useMemo( - () => ({ - title: i18n.STEP_TWO_TITLE, - children: ( - <Container> - <SyncAlertsToggle isLoading={isSubmitting} /> - </Container> - ), - }), - [isSubmitting] - ); - - const thirdStep = useMemo( - () => ({ - title: i18n.STEP_THREE_TITLE, - children: ( - <Container> - <Connector - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - isLoading={isSubmitting} - /> - </Container> - ), - }), - [hideConnectorServiceNowSir, isSubmitting] - ); - - const allSteps = useMemo(() => [firstStep, secondStep, thirdStep], [ - firstStep, - secondStep, - thirdStep, - ]); - - return ( - <> - {isSubmitting && <MySpinner data-test-subj="create-case-loading-spinner" size="xl" />} - {withSteps ? ( - <EuiSteps - headingElement="h2" - steps={allSteps} - data-test-subj={'case-creation-form-steps'} - /> - ) : ( - <> - {firstStep.children} - {secondStep.children} - {thirdStep.children} - </> - )} - </> - ); - } -); - -CreateCaseForm.displayName = 'CreateCaseForm'; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx deleted file mode 100644 index 9d14acc96c192..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/form_context.test.tsx +++ /dev/null @@ -1,682 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { act, waitFor } from '@testing-library/react'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; - -import { ConnectorTypes } from '../../../../../cases/common'; -import { TestProviders } from '../../../common/mock'; -import { usePostCase } from '../../containers/use_post_case'; -import { useGetTags } from '../../containers/use_get_tags'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { useCaseConfigure } from '../../containers/configure/use_configure'; -import { connectorsMock } from '../../containers/configure/mock'; -import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; -import { useGetSeverity } from '../connectors/resilient/use_get_severity'; -import { useGetIssueTypes } from '../connectors/jira/use_get_issue_types'; -import { useGetChoices } from '../connectors/servicenow/use_get_choices'; -import { useGetFieldsByIssueType } from '../connectors/jira/use_get_fields_by_issue_type'; -import { useCaseConfigureResponse } from '../configure_cases/__mock__'; -import { - sampleConnectorData, - sampleData, - sampleTags, - useGetIncidentTypesResponse, - useGetSeverityResponse, - useGetIssueTypesResponse, - useGetFieldsByIssueTypeResponse, - useGetChoicesResponse, -} from './mock'; -import { FormContext } from './form_context'; -import { CreateCaseForm } from './form'; -import { SubmitCaseButton } from './submit_button'; -import { usePostPushToService } from '../../containers/use_post_push_to_service'; - -const sampleId = 'case-id'; - -jest.mock('../../containers/use_post_case'); -jest.mock('../../containers/use_post_push_to_service'); -jest.mock('../../containers/use_get_tags'); -jest.mock('../../containers/configure/use_connectors'); -jest.mock('../../containers/configure/use_configure'); -jest.mock('../connectors/resilient/use_get_incident_types'); -jest.mock('../connectors/resilient/use_get_severity'); -jest.mock('../connectors/jira/use_get_issue_types'); -jest.mock('../connectors/jira/use_get_fields_by_issue_type'); -jest.mock('../connectors/jira/use_get_single_issue'); -jest.mock('../connectors/jira/use_get_issues'); -jest.mock('../connectors/servicenow/use_get_choices'); - -const useConnectorsMock = useConnectors as jest.Mock; -const useCaseConfigureMock = useCaseConfigure as jest.Mock; -const usePostCaseMock = usePostCase as jest.Mock; -const usePostPushToServiceMock = usePostPushToService as jest.Mock; -const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; -const useGetSeverityMock = useGetSeverity as jest.Mock; -const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; -const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; -const useGetChoicesMock = useGetChoices as jest.Mock; -const postCase = jest.fn(); -const pushCaseToExternalService = jest.fn(); - -const defaultPostCase = { - isLoading: false, - isError: false, - postCase, -}; - -const defaultPostPushToService = { - isLoading: false, - isError: false, - pushCaseToExternalService, -}; - -const fillForm = (wrapper: ReactWrapper) => { - wrapper - .find(`[data-test-subj="caseTitle"] input`) - .first() - .simulate('change', { target: { value: sampleData.title } }); - - wrapper - .find(`[data-test-subj="caseDescription"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.description } }); - - act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange(sampleTags.map((tag) => ({ label: tag }))); - }); -}; - -describe('Create case', () => { - const fetchTags = jest.fn(); - const onFormSubmitSuccess = jest.fn(); - const afterCaseCreated = jest.fn(); - - beforeEach(() => { - jest.resetAllMocks(); - postCase.mockResolvedValue({ - id: sampleId, - ...sampleData, - }); - usePostCaseMock.mockImplementation(() => defaultPostCase); - usePostPushToServiceMock.mockImplementation(() => defaultPostPushToService); - useConnectorsMock.mockReturnValue(sampleConnectorData); - useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); - useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); - useGetSeverityMock.mockReturnValue(useGetSeverityResponse); - useGetIssueTypesMock.mockReturnValue(useGetIssueTypesResponse); - useGetFieldsByIssueTypeMock.mockReturnValue(useGetFieldsByIssueTypeResponse); - useGetChoicesMock.mockReturnValue(useGetChoicesResponse); - - (useGetTags as jest.Mock).mockImplementation(() => ({ - tags: sampleTags, - fetchTags, - })); - }); - - describe('Step 1 - Case Fields', () => { - it('it renders', async () => { - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="caseTitle"]`).first().exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseDescription"]`).first().exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseTags"]`).first().exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="caseConnectors"]`).first().exists()).toBeTruthy(); - expect( - wrapper.find(`[data-test-subj="case-creation-form-steps"]`).first().exists() - ).toBeTruthy(); - }); - - it('should post case on submit click', async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - await waitFor(() => expect(postCase).toBeCalledWith(sampleData)); - }); - - it('should toggle sync settings', async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - wrapper.find('[data-test-subj="caseSyncAlerts"] button').first().simulate('click'); - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - - await waitFor(() => - expect(postCase).toBeCalledWith({ ...sampleData, settings: { syncAlerts: false } }) - ); - }); - - it('it should select the default connector set in the configuration', async () => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - connector: { - id: 'servicenow-1', - name: 'SN', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - persistLoading: false, - })); - - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - await act(async () => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - }); - - await waitFor(() => - expect(postCase).toBeCalledWith({ - ...sampleData, - connector: { - fields: { - impact: null, - severity: null, - urgency: null, - category: null, - subcategory: null, - }, - id: 'servicenow-1', - name: 'My Connector', - type: '.servicenow', - }, - }) - ); - }); - - it('it should default to none if the default connector does not exist in connectors', async () => { - useCaseConfigureMock.mockImplementation(() => ({ - ...useCaseConfigureResponse, - connector: { - id: 'not-exist', - name: 'SN', - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - persistLoading: false, - })); - - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - await waitFor(() => { - expect(postCase).toBeCalledWith(sampleData); - expect(pushCaseToExternalService).not.toHaveBeenCalled(); - }); - }); - }); - - describe('Step 2 - Connector Fields', () => { - it(`it should submit and push to Jira connector`, async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-jira-1"]`).simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeTruthy(); - }); - - wrapper - .find('select[data-test-subj="issueTypeSelect"]') - .first() - .simulate('change', { - target: { value: '10007' }, - }); - - wrapper - .find('select[data-test-subj="prioritySelect"]') - .first() - .simulate('change', { - target: { value: '2' }, - }); - - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - - await waitFor(() => { - expect(postCase).toBeCalledWith({ - ...sampleData, - connector: { - id: 'jira-1', - name: 'Jira', - type: '.jira', - fields: { issueType: '10007', parent: null, priority: '2' }, - }, - }); - expect(pushCaseToExternalService).toHaveBeenCalledWith({ - caseId: sampleId, - connector: { - id: 'jira-1', - name: 'Jira', - type: '.jira', - fields: { issueType: '10007', parent: null, priority: '2' }, - }, - }); - expect(onFormSubmitSuccess).toHaveBeenCalledWith({ - id: sampleId, - ...sampleData, - }); - }); - }); - - it(`it should submit and push to resilient connector`, async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-resilient-2"]`).simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeTruthy(); - }); - - act(() => { - ((wrapper.find(EuiComboBox).at(1).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ value: '19', label: 'Denial of Service' }]); - }); - - wrapper - .find('select[data-test-subj="severitySelect"]') - .first() - .simulate('change', { - target: { value: '4' }, - }); - - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - - await waitFor(() => { - expect(postCase).toBeCalledWith({ - ...sampleData, - connector: { - id: 'resilient-2', - name: 'My Connector 2', - type: '.resilient', - fields: { incidentTypes: ['19'], severityCode: '4' }, - }, - }); - - expect(pushCaseToExternalService).toHaveBeenCalledWith({ - caseId: sampleId, - connector: { - id: 'resilient-2', - name: 'My Connector 2', - type: '.resilient', - fields: { incidentTypes: ['19'], severityCode: '4' }, - }, - }); - - expect(onFormSubmitSuccess).toHaveBeenCalledWith({ - id: sampleId, - ...sampleData, - }); - }); - }); - - it(`it should submit and push to servicenow itsm connector`, async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - expect(wrapper.find(`[data-test-subj="connector-fields-sn-itsm"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-servicenow-1"]`).simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-sn-itsm"]`).exists()).toBeTruthy(); - }); - - ['severitySelect', 'urgencySelect', 'impactSelect'].forEach((subj) => { - wrapper - .find(`select[data-test-subj="${subj}"]`) - .first() - .simulate('change', { - target: { value: '2' }, - }); - }); - - wrapper - .find('select[data-test-subj="categorySelect"]') - .first() - .simulate('change', { - target: { value: 'software' }, - }); - - wrapper - .find('select[data-test-subj="subcategorySelect"]') - .first() - .simulate('change', { - target: { value: 'os' }, - }); - - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - - await waitFor(() => { - expect(postCase).toBeCalledWith({ - ...sampleData, - connector: { - id: 'servicenow-1', - name: 'My Connector', - type: '.servicenow', - fields: { - impact: '2', - severity: '2', - urgency: '2', - category: 'software', - subcategory: 'os', - }, - }, - }); - - expect(pushCaseToExternalService).toHaveBeenCalledWith({ - caseId: sampleId, - connector: { - id: 'servicenow-1', - name: 'My Connector', - type: '.servicenow', - fields: { - impact: '2', - severity: '2', - urgency: '2', - category: 'software', - subcategory: 'os', - }, - }, - }); - - expect(onFormSubmitSuccess).toHaveBeenCalledWith({ - id: sampleId, - ...sampleData, - }); - }); - }); - - it(`it should submit and push to servicenow sir connector`, async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - expect(wrapper.find(`[data-test-subj="connector-fields-sn-sir"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-servicenow-sir"]`).simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-sn-sir"]`).exists()).toBeTruthy(); - }); - - wrapper - .find('[data-test-subj="destIpCheckbox"] input') - .first() - .simulate('change', { target: { checked: false } }); - - wrapper - .find('select[data-test-subj="prioritySelect"]') - .first() - .simulate('change', { - target: { value: '1' }, - }); - - wrapper - .find('select[data-test-subj="categorySelect"]') - .first() - .simulate('change', { - target: { value: 'Denial of Service' }, - }); - - wrapper - .find('select[data-test-subj="subcategorySelect"]') - .first() - .simulate('change', { - target: { value: '26' }, - }); - - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - - await waitFor(() => { - expect(postCase).toBeCalledWith({ - ...sampleData, - connector: { - id: 'servicenow-sir', - name: 'My Connector SIR', - type: '.servicenow-sir', - fields: { - destIp: false, - sourceIp: true, - malwareHash: true, - malwareUrl: true, - priority: '1', - category: 'Denial of Service', - subcategory: '26', - }, - }, - }); - - expect(pushCaseToExternalService).toHaveBeenCalledWith({ - caseId: sampleId, - connector: { - id: 'servicenow-sir', - name: 'My Connector SIR', - type: '.servicenow-sir', - fields: { - destIp: false, - sourceIp: true, - malwareHash: true, - malwareUrl: true, - priority: '1', - category: 'Denial of Service', - subcategory: '26', - }, - }, - }); - - expect(onFormSubmitSuccess).toHaveBeenCalledWith({ - id: sampleId, - ...sampleData, - }); - }); - }); - }); - - it(`it should call afterCaseCreated`, async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess} afterCaseCreated={afterCaseCreated}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-jira-1"]`).simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeTruthy(); - }); - - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - await waitFor(() => { - expect(afterCaseCreated).toHaveBeenCalledWith({ - id: sampleId, - ...sampleData, - }); - }); - }); - - it(`it should call callbacks in correct order`, async () => { - useConnectorsMock.mockReturnValue({ - ...sampleConnectorData, - connectors: connectorsMock, - }); - - const wrapper = mount( - <TestProviders> - <FormContext onSuccess={onFormSubmitSuccess} afterCaseCreated={afterCaseCreated}> - <CreateCaseForm /> - <SubmitCaseButton /> - </FormContext> - </TestProviders> - ); - - fillForm(wrapper); - expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-jira-1"]`).simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect(wrapper.find(`[data-test-subj="connector-fields-jira"]`).exists()).toBeTruthy(); - }); - - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - await waitFor(() => { - expect(postCase).toHaveBeenCalled(); - expect(afterCaseCreated).toHaveBeenCalled(); - expect(pushCaseToExternalService).toHaveBeenCalled(); - expect(onFormSubmitSuccess).toHaveBeenCalled(); - }); - - const postCaseOrder = postCase.mock.invocationCallOrder[0]; - const afterCaseOrder = afterCaseCreated.mock.invocationCallOrder[0]; - const pushCaseToExternalServiceOrder = pushCaseToExternalService.mock.invocationCallOrder[0]; - const onFormSubmitSuccessOrder = onFormSubmitSuccess.mock.invocationCallOrder[0]; - - expect( - postCaseOrder < afterCaseOrder && - postCaseOrder < pushCaseToExternalServiceOrder && - postCaseOrder < onFormSubmitSuccessOrder - ).toBe(true); - - expect( - afterCaseOrder < pushCaseToExternalServiceOrder && afterCaseOrder < onFormSubmitSuccessOrder - ).toBe(true); - - expect(pushCaseToExternalServiceOrder < onFormSubmitSuccessOrder).toBe(true); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx b/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx deleted file mode 100644 index 597726e7bb3f3..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/form_context.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useEffect, useMemo } from 'react'; -import { schema, FormProps } from './schema'; -import { Form, useForm } from '../../../shared_imports'; -import { - getConnectorById, - getNoneConnector, - normalizeActionConnector, -} from '../configure_cases/utils'; -import { usePostCase } from '../../containers/use_post_case'; -import { usePostPushToService } from '../../containers/use_post_push_to_service'; - -import { useConnectors } from '../../containers/configure/use_connectors'; -import { useCaseConfigure } from '../../containers/configure/use_configure'; -import { Case } from '../../containers/types'; -import { CaseType, ConnectorTypes } from '../../../../../cases/common'; - -const initialCaseValue: FormProps = { - description: '', - tags: [], - title: '', - connectorId: 'none', - fields: null, - syncAlerts: true, -}; - -interface Props { - afterCaseCreated?: (theCase: Case) => Promise<void>; - caseType?: CaseType; - hideConnectorServiceNowSir?: boolean; - onSuccess?: (theCase: Case) => Promise<void>; -} - -export const FormContext: React.FC<Props> = ({ - afterCaseCreated, - caseType = CaseType.individual, - children, - hideConnectorServiceNowSir, - onSuccess, -}) => { - const { connectors } = useConnectors(); - const { connector: configurationConnector } = useCaseConfigure(); - const { postCase } = usePostCase(); - const { pushCaseToExternalService } = usePostPushToService(); - - const connectorId = useMemo(() => { - if ( - hideConnectorServiceNowSir && - configurationConnector.type === ConnectorTypes.serviceNowSIR - ) { - return 'none'; - } - return connectors.some((connector) => connector.id === configurationConnector.id) - ? configurationConnector.id - : 'none'; - }, [ - configurationConnector.id, - configurationConnector.type, - connectors, - hideConnectorServiceNowSir, - ]); - - const submitCase = useCallback( - async ( - { connectorId: dataConnectorId, fields, syncAlerts, ...dataWithoutConnectorId }, - isValid - ) => { - if (isValid) { - const caseConnector = getConnectorById(dataConnectorId, connectors); - - const connectorToUpdate = caseConnector - ? normalizeActionConnector(caseConnector, fields) - : getNoneConnector(); - - const updatedCase = await postCase({ - ...dataWithoutConnectorId, - type: caseType, - connector: connectorToUpdate, - settings: { syncAlerts }, - }); - - if (afterCaseCreated && updatedCase) { - await afterCaseCreated(updatedCase); - } - - if (updatedCase?.id && dataConnectorId !== 'none') { - await pushCaseToExternalService({ - caseId: updatedCase.id, - connector: connectorToUpdate, - }); - } - - if (onSuccess && updatedCase) { - await onSuccess(updatedCase); - } - } - }, - [caseType, connectors, postCase, onSuccess, pushCaseToExternalService, afterCaseCreated] - ); - - const { form } = useForm<FormProps>({ - defaultValue: initialCaseValue, - options: { stripEmptyFields: false }, - schema, - onSubmit: submitCase, - }); - const { setFieldValue } = form; - // Set the selected connector to the configuration connector - useEffect(() => setFieldValue('connectorId', connectorId), [connectorId, setFieldValue]); - - return <Form form={form}>{children}</Form>; -}; - -FormContext.displayName = 'FormContext'; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx index 7172d227f492e..2d5faef8aa009 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx @@ -6,91 +6,39 @@ */ import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; +import { mount } from 'enzyme'; import { act, waitFor } from '@testing-library/react'; import { noop } from 'lodash/fp'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { TestProviders } from '../../../common/mock'; -import { useGetTags } from '../../containers/use_get_tags'; -import { useConnectors } from '../../containers/configure/use_connectors'; -import { useCaseConfigure } from '../../containers/configure/use_configure'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; -import { useGetSeverity } from '../connectors/resilient/use_get_severity'; -import { useGetIssueTypes } from '../connectors/jira/use_get_issue_types'; -import { useGetFieldsByIssueType } from '../connectors/jira/use_get_fields_by_issue_type'; -import { useCaseConfigureResponse } from '../configure_cases/__mock__'; import { useInsertTimeline } from '../use_insert_timeline'; -import { - sampleConnectorData, - sampleData, - sampleTags, - useGetIncidentTypesResponse, - useGetSeverityResponse, - useGetIssueTypesResponse, - useGetFieldsByIssueTypeResponse, -} from './mock'; import { Create } from '.'; +import { useKibana } from '../../../common/lib/kibana'; +import { Case } from '../../../../../cases/public/containers/types'; +import { basicCase } from '../../../../../cases/public/containers/mock'; -jest.mock('../../containers/api'); -jest.mock('../../containers/use_get_tags'); -jest.mock('../../containers/configure/use_connectors'); -jest.mock('../../containers/configure/use_configure'); -jest.mock('../connectors/resilient/use_get_incident_types'); -jest.mock('../connectors/resilient/use_get_severity'); -jest.mock('../connectors/jira/use_get_issue_types'); -jest.mock('../connectors/jira/use_get_fields_by_issue_type'); -jest.mock('../connectors/jira/use_get_single_issue'); -jest.mock('../connectors/jira/use_get_issues'); jest.mock('../use_insert_timeline'); +jest.mock('../../../common/lib/kibana'); -const useConnectorsMock = useConnectors as jest.Mock; -const useCaseConfigureMock = useCaseConfigure as jest.Mock; -const useGetTagsMock = useGetTags as jest.Mock; -const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; -const useGetSeverityMock = useGetSeverity as jest.Mock; -const useGetIssueTypesMock = useGetIssueTypes as jest.Mock; -const useGetFieldsByIssueTypeMock = useGetFieldsByIssueType as jest.Mock; const useInsertTimelineMock = useInsertTimeline as jest.Mock; -const fetchTags = jest.fn(); - -const fillForm = (wrapper: ReactWrapper) => { - wrapper - .find(`[data-test-subj="caseTitle"] input`) - .first() - .simulate('change', { target: { value: sampleData.title } }); - - wrapper - .find(`[data-test-subj="caseDescription"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.description } }); - - act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange(sampleTags.map((tag) => ({ label: tag }))); - }); -}; describe('Create case', () => { + const mockCreateCase = jest.fn(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); - useConnectorsMock.mockReturnValue(sampleConnectorData); - useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); - useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); - useGetSeverityMock.mockReturnValue(useGetSeverityResponse); - useGetIssueTypesMock.mockReturnValue(useGetIssueTypesResponse); - useGetFieldsByIssueTypeMock.mockReturnValue(useGetFieldsByIssueTypeResponse); - useGetTagsMock.mockImplementation(() => ({ - tags: sampleTags, - fetchTags, - })); + (useKibana as jest.Mock).mockReturnValue({ + services: { + cases: { + getCreateCase: mockCreateCase, + }, + }, + }); }); - it('it renders', async () => { - const wrapper = mount( + it('it renders', () => { + mount( <TestProviders> <Router history={mockHistory}> <Create /> @@ -98,12 +46,20 @@ describe('Create case', () => { </TestProviders> ); - expect(wrapper.find(`[data-test-subj="create-case-submit"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="create-case-cancel"]`).exists()).toBeTruthy(); + expect(mockCreateCase).toHaveBeenCalled(); }); it('should redirect to all cases on cancel click', async () => { - const wrapper = mount( + (useKibana as jest.Mock).mockReturnValue({ + services: { + cases: { + getCreateCase: ({ onCancel }: { onCancel: () => Promise<void> }) => { + onCancel(); + }, + }, + }, + }); + mount( <TestProviders> <Router history={mockHistory}> <Create /> @@ -111,12 +67,20 @@ describe('Create case', () => { </TestProviders> ); - wrapper.find(`[data-test-subj="create-case-cancel"]`).first().simulate('click'); await waitFor(() => expect(mockHistory.push).toHaveBeenCalledWith('/')); }); it('should redirect to new case when posting the case', async () => { - const wrapper = mount( + (useKibana as jest.Mock).mockReturnValue({ + services: { + cases: { + getCreateCase: ({ onSuccess }: { onSuccess: (theCase: Case) => Promise<void> }) => { + onSuccess(basicCase); + }, + }, + }, + }); + mount( <TestProviders> <Router history={mockHistory}> <Create /> @@ -124,13 +88,10 @@ describe('Create case', () => { </TestProviders> ); - fillForm(wrapper); - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - await waitFor(() => expect(mockHistory.push).toHaveBeenNthCalledWith(1, '/basic-case-id')); }); - it('it should insert a timeline', async () => { + it.skip('it should insert a timeline', async () => { let attachTimeline = noop; useInsertTimelineMock.mockImplementation((value, onTimelineAttached) => { attachTimeline = onTimelineAttached; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index 484a45248d8c0..f6f0a546f7593 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -6,39 +6,27 @@ */ import React, { useCallback } from 'react'; -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; -import styled from 'styled-components'; +import { EuiPanel } from '@elastic/eui'; import { useHistory } from 'react-router-dom'; -import { Field, getUseField, useFormContext } from '../../../shared_imports'; import { getCaseDetailsUrl } from '../../../common/components/link_to'; -import * as i18n from './translations'; -import { CreateCaseForm } from './form'; -import { FormContext } from './form_context'; -import { useInsertTimeline } from '../use_insert_timeline'; -import { fieldName as descriptionFieldName } from './description'; -import { SubmitCaseButton } from './submit_button'; -import { USE_RAC_CASES_UI } from '../../../../common/constants'; -import { useKibana } from '../../../common/lib/kibana'; - -export const CommonUseField = getUseField({ component: Field }); -const Container = styled.div` - ${({ theme }) => ` - margin-top: ${theme.eui.euiSize}; - `} -`; +// TO DO: Cases RAC UI, reimplement this shiz +// import { useInsertTimeline } from '../use_insert_timeline'; +// import { fieldName as descriptionFieldName } from './description'; +import { useKibana } from '../../../common/lib/kibana'; -const InsertTimeline = () => { - const { setFieldValue, getFormData } = useFormContext(); - const formData = getFormData(); - const onTimelineAttached = useCallback( - (newValue: string) => setFieldValue(descriptionFieldName, newValue), - [setFieldValue] - ); - useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); - return null; -}; +// TO DO: Cases RAC UI, reimplement this shiz +// const InsertTimeline = () => { +// const { setFieldValue, getFormData } = useFormContext(); +// const formData = getFormData(); +// const onTimelineAttached = useCallback( +// (newValue: string) => setFieldValue(descriptionFieldName, newValue), +// [setFieldValue] +// ); +// useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); +// return null; +// }; export const Create = React.memo(() => { const { cases } = useKibana().services; @@ -56,39 +44,10 @@ export const Create = React.memo(() => { return ( <EuiPanel> - {USE_RAC_CASES_UI ? ( - cases.getCreateCase({ - onCancel: handleSetIsCancel, - onSuccess, - }) - ) : ( - <FormContext onSuccess={onSuccess}> - <CreateCaseForm /> - <Container> - <EuiFlexGroup - alignItems="center" - justifyContent="flexEnd" - gutterSize="xs" - responsive={false} - > - <EuiFlexItem grow={false}> - <EuiButtonEmpty - data-test-subj="create-case-cancel" - size="s" - onClick={handleSetIsCancel} - iconType="cross" - > - {i18n.CANCEL} - </EuiButtonEmpty> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <SubmitCaseButton /> - </EuiFlexItem> - </EuiFlexGroup> - </Container> - <InsertTimeline /> - </FormContext> - )} + {cases.getCreateCase({ + onCancel: handleSetIsCancel, + onSuccess, + })} </EuiPanel> ); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/mock.ts b/x-pack/plugins/security_solution/public/cases/components/create/mock.ts deleted file mode 100644 index a983add030a1e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/mock.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CasePostRequest, CaseType, ConnectorTypes } from '../../../../../cases/common'; -import { choices } from '../connectors/mock'; - -export const sampleTags = ['coke', 'pepsi']; -export const sampleData: CasePostRequest = { - description: 'what a great description', - tags: sampleTags, - title: 'what a cool title', - type: CaseType.individual, - connector: { - fields: null, - id: 'none', - name: 'none', - type: ConnectorTypes.none, - }, - settings: { - syncAlerts: true, - }, -}; - -export const sampleConnectorData = { loading: false, connectors: [] }; - -export const useGetIncidentTypesResponse = { - isLoading: false, - incidentTypes: [ - { - id: 19, - name: 'Malware', - }, - { - id: 21, - name: 'Denial of Service', - }, - ], -}; - -export const useGetSeverityResponse = { - isLoading: false, - severity: [ - { - id: 4, - name: 'Low', - }, - { - id: 5, - name: 'Medium', - }, - { - id: 6, - name: 'High', - }, - ], -}; - -export const useGetIssueTypesResponse = { - isLoading: false, - issueTypes: [ - { - id: '10006', - name: 'Task', - }, - { - id: '10007', - name: 'Bug', - }, - ], -}; - -export const useGetFieldsByIssueTypeResponse = { - isLoading: false, - fields: { - summary: { allowedValues: [], defaultValue: {} }, - labels: { allowedValues: [], defaultValue: {} }, - description: { allowedValues: [], defaultValue: {} }, - priority: { - allowedValues: [ - { - name: 'Medium', - id: '3', - }, - { - name: 'Low', - id: '2', - }, - ], - defaultValue: { name: 'Medium', id: '3' }, - }, - }, -}; - -export const useGetChoicesResponse = { - isLoading: false, - choices, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.test.tsx deleted file mode 100644 index 4b6d5f90513ef..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { mount } from 'enzyme'; - -import { OptionalFieldLabel } from '.'; - -describe('OptionalFieldLabel', () => { - it('it renders correctly', async () => { - const wrapper = mount(OptionalFieldLabel); - expect(wrapper.find('[data-test-subj="form-optional-field-label"]').first().text()).toBe( - 'Optional' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.tsx deleted file mode 100644 index f67090a1cd41c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/optional_field_label/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiText } from '@elastic/eui'; -import React from 'react'; - -import * as i18n from '../../../translations'; - -export const OptionalFieldLabel = ( - <EuiText color="subdued" size="xs" data-test-subj="form-optional-field-label"> - {i18n.OPTIONAL} - </EuiText> -); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx b/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx deleted file mode 100644 index 38321cdbeab50..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/schema.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CasePostRequest, ConnectorTypeFields } from '../../../../../cases/common'; -import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; -import * as i18n from './translations'; - -import { OptionalFieldLabel } from './optional_field_label'; -const { emptyField } = fieldValidators; - -export const schemaTags = { - type: FIELD_TYPES.COMBO_BOX, - label: i18n.TAGS, - helpText: i18n.TAGS_HELP, - labelAppend: OptionalFieldLabel, -}; - -export type FormProps = Omit<CasePostRequest, 'connector' | 'settings'> & { - connectorId: string; - fields: ConnectorTypeFields['fields']; - syncAlerts: boolean; -}; - -export const schema: FormSchema<FormProps> = { - title: { - type: FIELD_TYPES.TEXT, - label: i18n.NAME, - validations: [ - { - validator: emptyField(i18n.TITLE_REQUIRED), - }, - ], - }, - description: { - label: i18n.DESCRIPTION, - validations: [ - { - validator: emptyField(i18n.DESCRIPTION_REQUIRED), - }, - ], - }, - tags: schemaTags, - connectorId: { - type: FIELD_TYPES.SUPER_SELECT, - label: i18n.CONNECTORS, - defaultValue: 'none', - }, - fields: {}, - syncAlerts: { - helpText: i18n.SYNC_ALERTS_HELP, - type: FIELD_TYPES.TOGGLE, - defaultValue: true, - }, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/create/submit_button.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/submit_button.test.tsx deleted file mode 100644 index ab98e75b6058e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/submit_button.test.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { act, waitFor } from '@testing-library/react'; - -import { useForm, Form } from '../../../shared_imports'; -import { SubmitCaseButton } from './submit_button'; -import { schema, FormProps } from './schema'; - -describe('SubmitCaseButton', () => { - const onSubmit = jest.fn(); - - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: { title: 'My title' }, - schema: { - title: schema.title, - }, - onSubmit, - }); - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('it renders', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SubmitCaseButton /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="create-case-submit"]`).exists()).toBeTruthy(); - }); - - it('it submits', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SubmitCaseButton /> - </MockHookWrapperComponent> - ); - - await act(async () => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - }); - - await waitFor(() => expect(onSubmit).toBeCalled()); - }); - - it('it disables when submitting', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SubmitCaseButton /> - </MockHookWrapperComponent> - ); - - await waitFor(() => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - expect( - wrapper.find(`[data-test-subj="create-case-submit"]`).first().prop('isDisabled') - ).toBeTruthy(); - }); - }); - - it('it is loading when submitting', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SubmitCaseButton /> - </MockHookWrapperComponent> - ); - - await waitFor(() => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - expect( - wrapper.find(`[data-test-subj="create-case-submit"]`).first().prop('isLoading') - ).toBeTruthy(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/submit_button.tsx b/x-pack/plugins/security_solution/public/cases/components/create/submit_button.tsx deleted file mode 100644 index de2b2d410e60e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/submit_button.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiButton } from '@elastic/eui'; - -import { useFormContext } from '../../../shared_imports'; -import * as i18n from './translations'; - -const SubmitCaseButtonComponent: React.FC = () => { - const { submit, isSubmitting } = useFormContext(); - - return ( - <EuiButton - data-test-subj="create-case-submit" - fill - iconType="plusInCircle" - isDisabled={isSubmitting} - isLoading={isSubmitting} - onClick={submit} - > - {i18n.CREATE_CASE} - </EuiButton> - ); -}; - -export const SubmitCaseButton = memo(SubmitCaseButtonComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.test.tsx deleted file mode 100644 index eadec1525ed90..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor } from '@testing-library/react'; - -import { useForm, Form, FormHook } from '../../../shared_imports'; -import { SyncAlertsToggle } from './sync_alerts_toggle'; -import { schema, FormProps } from './schema'; - -describe('SyncAlertsToggle', () => { - let globalForm: FormHook; - - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: { syncAlerts: true }, - schema: { - syncAlerts: schema.syncAlerts, - }, - }); - - globalForm = form; - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('it renders', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SyncAlertsToggle isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseSyncAlerts"]`).exists()).toBeTruthy(); - }); - - it('it toggles the switch', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SyncAlertsToggle isLoading={false} /> - </MockHookWrapperComponent> - ); - - wrapper.find('[data-test-subj="caseSyncAlerts"] button').first().simulate('click'); - - await waitFor(() => { - expect(globalForm.getFormData()).toEqual({ syncAlerts: false }); - }); - }); - - it('it shows the correct labels', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <SyncAlertsToggle isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseSyncAlerts"] .euiSwitch__label`).first().text()).toBe( - 'On' - ); - - wrapper.find('[data-test-subj="caseSyncAlerts"] button').first().simulate('click'); - - await waitFor(() => { - expect( - wrapper.find(`[data-test-subj="caseSyncAlerts"] .euiSwitch__label`).first().text() - ).toBe('Off'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.tsx b/x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.tsx deleted file mode 100644 index 2ab5b8f5375cd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/sync_alerts_toggle.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { Field, getUseField, useFormData } from '../../../shared_imports'; -import * as i18n from './translations'; - -const CommonUseField = getUseField({ component: Field }); - -interface Props { - isLoading: boolean; -} - -const SyncAlertsToggleComponent: React.FC<Props> = ({ isLoading }) => { - const [{ syncAlerts }] = useFormData({ watch: ['syncAlerts'] }); - return ( - <CommonUseField - path="syncAlerts" - componentProps={{ - idAria: 'caseSyncAlerts', - 'data-test-subj': 'caseSyncAlerts', - label: i18n.SYNC_ALERTS_LABEL, - euiFieldProps: { - disabled: isLoading, - label: syncAlerts ? i18n.SYNC_ALERTS_SWITCH_LABEL_ON : i18n.SYNC_ALERTS_SWITCH_LABEL_OFF, - }, - }} - /> - ); -}; - -SyncAlertsToggleComponent.displayName = 'SyncAlertsToggleComponent'; - -export const SyncAlertsToggle = memo(SyncAlertsToggleComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/tags.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/tags.test.tsx deleted file mode 100644 index c723d456afe73..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/tags.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { waitFor } from '@testing-library/react'; - -import { useForm, Form, FormHook } from '../../../shared_imports'; -import { useGetTags } from '../../containers/use_get_tags'; -import { Tags } from './tags'; -import { schema, FormProps } from './schema'; - -jest.mock('../../containers/use_get_tags'); -const useGetTagsMock = useGetTags as jest.Mock; - -describe('Tags', () => { - let globalForm: FormHook; - - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: { tags: [] }, - schema: { - tags: schema.tags, - }, - }); - - globalForm = form; - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - useGetTagsMock.mockReturnValue({ tags: ['test'] }); - }); - - it('it renders', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Tags isLoading={false} /> - </MockHookWrapperComponent> - ); - - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="caseTags"]`).exists()).toBeTruthy(); - }); - }); - - it('it disables the input when loading', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Tags isLoading={true} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(EuiComboBox).prop('disabled')).toBeTruthy(); - }); - - it('it changes the tags', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Tags isLoading={false} /> - </MockHookWrapperComponent> - ); - - await waitFor(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange(['test', 'case'].map((tag) => ({ label: tag }))); - }); - - expect(globalForm.getFormData()).toEqual({ tags: ['test', 'case'] }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/tags.tsx b/x-pack/plugins/security_solution/public/cases/components/create/tags.tsx deleted file mode 100644 index fd0372e2f8125..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/tags.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useMemo } from 'react'; - -import { Field, getUseField } from '../../../shared_imports'; -import { useGetTags } from '../../containers/use_get_tags'; - -const CommonUseField = getUseField({ component: Field }); - -interface Props { - isLoading: boolean; -} - -const TagsComponent: React.FC<Props> = ({ isLoading }) => { - const { tags: tagOptions, isLoading: isLoadingTags } = useGetTags(); - const options = useMemo( - () => - tagOptions.map((label) => ({ - label, - })), - [tagOptions] - ); - - return ( - <CommonUseField - path="tags" - componentProps={{ - idAria: 'caseTags', - 'data-test-subj': 'caseTags', - euiFieldProps: { - fullWidth: true, - placeholder: '', - disabled: isLoading || isLoadingTags, - options, - noSuggestions: false, - }, - }} - /> - ); -}; - -TagsComponent.displayName = 'TagsComponent'; - -export const Tags = memo(TagsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/title.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/title.test.tsx deleted file mode 100644 index 2ac14ccd1b254..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/title.test.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { act } from '@testing-library/react'; - -import { useForm, Form, FormHook } from '../../../shared_imports'; -import { Title } from './title'; -import { schema, FormProps } from './schema'; - -describe('Title', () => { - let globalForm: FormHook; - - const MockHookWrapperComponent: React.FC = ({ children }) => { - const { form } = useForm<FormProps>({ - defaultValue: { title: 'My title' }, - schema: { - title: schema.title, - }, - }); - - globalForm = form; - - return <Form form={form}>{children}</Form>; - }; - - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('it renders', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Title isLoading={false} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseTitle"]`).exists()).toBeTruthy(); - }); - - it('it disables the input when loading', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Title isLoading={true} /> - </MockHookWrapperComponent> - ); - - expect(wrapper.find(`[data-test-subj="caseTitle"] input`).prop('disabled')).toBeTruthy(); - }); - - it('it changes the title', async () => { - const wrapper = mount( - <MockHookWrapperComponent> - <Title isLoading={false} /> - </MockHookWrapperComponent> - ); - - await act(async () => { - wrapper - .find(`[data-test-subj="caseTitle"] input`) - .first() - .simulate('change', { target: { value: 'My new title' } }); - }); - - expect(globalForm.getFormData()).toEqual({ title: 'My new title' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/title.tsx b/x-pack/plugins/security_solution/public/cases/components/create/title.tsx deleted file mode 100644 index 95f705791e704..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/title.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { Field, getUseField } from '../../../shared_imports'; - -const CommonUseField = getUseField({ component: Field }); - -interface Props { - isLoading: boolean; -} - -const TitleComponent: React.FC<Props> = ({ isLoading }) => ( - <CommonUseField - path="title" - componentProps={{ - idAria: 'caseTitle', - 'data-test-subj': 'caseTitle', - euiFieldProps: { - fullWidth: true, - disabled: isLoading, - }, - }} - /> -); - -TitleComponent.displayName = 'TitleComponent'; - -export const Title = memo(TitleComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/translations.ts b/x-pack/plugins/security_solution/public/cases/components/create/translations.ts deleted file mode 100644 index d9373dade1b68..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/create/translations.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../../translations'; - -export const STEP_ONE_TITLE = i18n.translate( - 'xpack.securitySolution.components.create.stepOneTitle', - { - defaultMessage: 'Case fields', - } -); - -export const STEP_TWO_TITLE = i18n.translate( - 'xpack.securitySolution.components.create.stepTwoTitle', - { - defaultMessage: 'Case settings', - } -); - -export const STEP_THREE_TITLE = i18n.translate( - 'xpack.securitySolution.components.create.stepThreeTitle', - { - defaultMessage: 'External Connector Fields', - } -); - -export const SYNC_ALERTS_LABEL = i18n.translate( - 'xpack.securitySolution.components.create.syncAlertsLabel', - { - defaultMessage: 'Sync alert status with case status', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/edit_connector/helpers.ts deleted file mode 100644 index 36eb3f58c8aaf..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/helpers.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CaseUserActions } from '../../containers/types'; - -export const getConnectorFieldsFromUserActions = (id: string, userActions: CaseUserActions[]) => { - try { - for (const action of [...userActions].reverse()) { - if (action.actionField.length === 1 && action.actionField[0] === 'connector') { - if (action.oldValue && action.newValue) { - const oldValue = JSON.parse(action.oldValue); - const newValue = JSON.parse(action.newValue); - - if (newValue.id === id) { - return newValue.fields; - } - - if (oldValue.id === id) { - return oldValue.fields; - } - } - } - } - - return null; - } catch { - return null; - } -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.test.tsx deleted file mode 100644 index 113c5da5d0c0f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.test.tsx +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { EditConnector } from './index'; -import { getFormMock, useFormMock } from '../__mock__/form'; -import { TestProviders } from '../../../common/mock'; -import { connectorsMock } from '../../containers/configure/mock'; -import { waitFor } from '@testing-library/react'; -import { caseUserActions } from '../../containers/mock'; - -jest.mock( - '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' -); - -const onSubmit = jest.fn(); -const defaultProps = { - connectors: connectorsMock, - disabled: false, - isLoading: false, - onSubmit, - selectedConnector: 'none', - caseFields: null, - userActions: caseUserActions, -}; - -describe('EditConnector ', () => { - const sampleConnector = '123'; - const formHookMock = getFormMock({ connectorId: sampleConnector }); - beforeEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); - useFormMock.mockImplementation(() => ({ form: formHookMock })); - }); - - it('Renders no connector, and then edit', async () => { - const wrapper = mount( - <TestProviders> - <EditConnector {...defaultProps} /> - </TestProviders> - ); - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - - expect( - wrapper.find(`span[data-test-subj="dropdown-connector-no-connector"]`).last().exists() - ).toBeTruthy(); - - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - await waitFor(() => wrapper.update()); - - expect(wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().exists()).toBeTruthy(); - }); - - it('Edit external service on submit', async () => { - const wrapper = mount( - <TestProviders> - <EditConnector {...defaultProps} /> - </TestProviders> - ); - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - - expect(wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().exists()).toBeTruthy(); - - wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); - await waitFor(() => expect(onSubmit.mock.calls[0][0]).toBe(sampleConnector)); - }); - - it('Revert to initial external service on error', async () => { - onSubmit.mockImplementation((connector, onSuccess, onError) => { - onError(new Error('An error has occurred')); - }); - const wrapper = mount( - <TestProviders> - <EditConnector {...defaultProps} /> - </TestProviders> - ); - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - - expect(wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().exists()).toBeTruthy(); - - wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); - await waitFor(() => { - wrapper.update(); - expect(formHookMock.setFieldValue).toHaveBeenCalledWith('connectorId', 'none'); - }); - }); - - it('Resets selector on cancel', async () => { - const props = { - ...defaultProps, - }; - const wrapper = mount( - <TestProviders> - <EditConnector {...props} /> - </TestProviders> - ); - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - - wrapper.find(`[data-test-subj="edit-connectors-cancel"]`).last().simulate('click'); - await waitFor(() => { - wrapper.update(); - expect(formHookMock.setFieldValue).toBeCalledWith( - 'connectorId', - defaultProps.selectedConnector - ); - }); - }); - - it('Renders loading spinner', async () => { - const props = { ...defaultProps, isLoading: true }; - const wrapper = mount( - <TestProviders> - <EditConnector {...props} /> - </TestProviders> - ); - await waitFor(() => - expect(wrapper.find(`[data-test-subj="connector-loading"]`).last().exists()).toBeTruthy() - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx b/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx deleted file mode 100644 index 0ecb66d542334..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useReducer } from 'react'; -import deepEqual from 'fast-deep-equal'; -import { - EuiText, - EuiHorizontalRule, - EuiFlexGroup, - EuiFlexItem, - EuiButton, - EuiButtonEmpty, - EuiLoadingSpinner, - EuiButtonIcon, -} from '@elastic/eui'; -import styled from 'styled-components'; -import { noop } from 'lodash/fp'; - -import { Form, UseField, useForm } from '../../../shared_imports'; -import { ActionConnector, ConnectorTypeFields } from '../../../../../cases/common'; -import { ConnectorSelector } from '../connector_selector/form'; -import { ConnectorFieldsForm } from '../connectors/fields_form'; -import { getConnectorById } from '../configure_cases/utils'; -import { CaseUserActions } from '../../containers/types'; -import { schema } from './schema'; -import { getConnectorFieldsFromUserActions } from './helpers'; -import * as i18n from './translations'; - -interface EditConnectorProps { - caseFields: ConnectorTypeFields['fields']; - connectors: ActionConnector[]; - isLoading: boolean; - onSubmit: ( - connectorId: string, - connectorFields: ConnectorTypeFields['fields'], - onError: () => void, - onSuccess: () => void - ) => void; - selectedConnector: string; - userActions: CaseUserActions[]; - disabled?: boolean; - hideConnectorServiceNowSir?: boolean; -} - -const MyFlexGroup = styled(EuiFlexGroup)` - ${({ theme }) => ` - margin-top: ${theme.eui.euiSizeM}; - p { - font-size: ${theme.eui.euiSizeM}; - } - `} -`; -const DisappearingFlexItem = styled(EuiFlexItem)` - ${({ $isHidden }: { $isHidden: boolean }) => - $isHidden && - ` - margin: 0 !important; - `} -`; - -interface State { - currentConnector: ActionConnector | null; - fields: ConnectorTypeFields['fields']; - editConnector: boolean; -} - -type Action = - | { type: 'SET_CURRENT_CONNECTOR'; payload: State['currentConnector'] } - | { type: 'SET_FIELDS'; payload: State['fields'] } - | { type: 'SET_EDIT_CONNECTOR'; payload: State['editConnector'] }; -const editConnectorReducer = (state: State, action: Action) => { - switch (action.type) { - case 'SET_CURRENT_CONNECTOR': - return { - ...state, - currentConnector: action.payload, - }; - case 'SET_FIELDS': - return { - ...state, - fields: action.payload, - }; - case 'SET_EDIT_CONNECTOR': - return { - ...state, - editConnector: action.payload, - }; - default: - return state; - } -}; - -const initialState = { - currentConnector: null, - fields: null, - editConnector: false, -}; - -export const EditConnector = React.memo( - ({ - caseFields, - connectors, - disabled = false, - hideConnectorServiceNowSir = false, - isLoading, - onSubmit, - selectedConnector, - userActions, - }: EditConnectorProps) => { - const { form } = useForm({ - defaultValue: { connectorId: selectedConnector }, - options: { stripEmptyFields: false }, - schema, - }); - - const { setFieldValue, submit } = form; - - const [{ currentConnector, fields, editConnector }, dispatch] = useReducer( - editConnectorReducer, - { ...initialState, fields: caseFields } - ); - - const onChangeConnector = useCallback( - (newConnectorId) => { - // Init - if (currentConnector == null) { - dispatch({ - type: 'SET_CURRENT_CONNECTOR', - payload: getConnectorById(newConnectorId, connectors), - }); - } - // change connect on dropdown action - else if (currentConnector.id !== newConnectorId) { - dispatch({ - type: 'SET_CURRENT_CONNECTOR', - payload: getConnectorById(newConnectorId, connectors), - }); - dispatch({ - type: 'SET_FIELDS', - payload: getConnectorFieldsFromUserActions(newConnectorId, userActions ?? []), - }); - } else if (fields === null) { - dispatch({ - type: 'SET_FIELDS', - payload: getConnectorFieldsFromUserActions(newConnectorId, userActions ?? []), - }); - } - }, - [currentConnector, fields, userActions, connectors] - ); - - const onFieldsChange = useCallback( - (newFields) => { - if (!deepEqual(newFields, fields)) { - dispatch({ - type: 'SET_FIELDS', - payload: newFields, - }); - } - }, - [fields, dispatch] - ); - - const onError = useCallback(() => { - setFieldValue('connectorId', selectedConnector); - dispatch({ - type: 'SET_EDIT_CONNECTOR', - payload: false, - }); - }, [dispatch, setFieldValue, selectedConnector]); - - const onCancelConnector = useCallback(() => { - setFieldValue('connectorId', selectedConnector); - dispatch({ - type: 'SET_FIELDS', - payload: caseFields, - }); - dispatch({ - type: 'SET_EDIT_CONNECTOR', - payload: false, - }); - }, [dispatch, selectedConnector, setFieldValue, caseFields]); - - const onSubmitConnector = useCallback(async () => { - const { isValid, data: newData } = await submit(); - if (isValid && newData.connectorId) { - onSubmit(newData.connectorId, fields, onError, noop); - dispatch({ - type: 'SET_EDIT_CONNECTOR', - payload: false, - }); - } - }, [dispatch, submit, fields, onSubmit, onError]); - - const onEditClick = useCallback(() => { - dispatch({ - type: 'SET_EDIT_CONNECTOR', - payload: true, - }); - }, [dispatch]); - return ( - <EuiText> - <MyFlexGroup alignItems="center" gutterSize="xs" justifyContent="spaceBetween"> - <EuiFlexItem grow={false}> - <h4>{i18n.CONNECTORS}</h4> - </EuiFlexItem> - {isLoading && <EuiLoadingSpinner data-test-subj="connector-loading" />} - {!isLoading && !editConnector && ( - <EuiFlexItem data-test-subj="connector-edit" grow={false}> - <EuiButtonIcon - data-test-subj="connector-edit-button" - isDisabled={disabled} - aria-label={i18n.EDIT_CONNECTOR_ARIA} - iconType={'pencil'} - onClick={onEditClick} - /> - </EuiFlexItem> - )} - </MyFlexGroup> - <EuiHorizontalRule margin="xs" /> - <MyFlexGroup data-test-subj="edit-connectors" direction="column"> - <DisappearingFlexItem $isHidden={!editConnector}> - <Form form={form}> - <EuiFlexGroup gutterSize="none" direction="row"> - <EuiFlexItem> - <UseField - path="connectorId" - component={ConnectorSelector} - componentProps={{ - connectors, - dataTestSubj: 'caseConnectors', - defaultValue: selectedConnector, - disabled, - hideConnectorServiceNowSir, - idAria: 'caseConnectors', - isEdit: editConnector, - isLoading, - }} - onChange={onChangeConnector} - /> - </EuiFlexItem> - </EuiFlexGroup> - </Form> - </DisappearingFlexItem> - <EuiFlexItem data-test-subj="edit-connector-fields-form-flex-item"> - {(currentConnector == null || currentConnector?.id === 'none') && // Connector is none or not defined. - !(currentConnector === null && selectedConnector !== 'none') && // Connector has not been deleted. - !editConnector && ( - <EuiText size="s"> - <span>{i18n.NO_CONNECTOR}</span> - </EuiText> - )} - <ConnectorFieldsForm - connector={currentConnector} - fields={fields} - isEdit={editConnector} - onChange={onFieldsChange} - /> - </EuiFlexItem> - {editConnector && ( - <EuiFlexItem> - <EuiFlexGroup gutterSize="s" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiButton - color="secondary" - data-test-subj="edit-connectors-submit" - fill - iconType="save" - onClick={onSubmitConnector} - size="s" - > - {i18n.SAVE} - </EuiButton> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiButtonEmpty - data-test-subj="edit-connectors-cancel" - iconType="cross" - onClick={onCancelConnector} - size="s" - > - {i18n.CANCEL} - </EuiButtonEmpty> - </EuiFlexItem> - </EuiFlexGroup> - </EuiFlexItem> - )} - </MyFlexGroup> - </EuiText> - ); - } -); - -EditConnector.displayName = 'EditConnector'; diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/schema.tsx b/x-pack/plugins/security_solution/public/cases/components/edit_connector/schema.tsx deleted file mode 100644 index f757c2b6a86c4..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/schema.tsx +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormSchema, FIELD_TYPES } from '../../../shared_imports'; - -export interface FormProps { - connectorId: string; -} - -export const schema: FormSchema<FormProps> = { - connectorId: { - type: FIELD_TYPES.SUPER_SELECT, - }, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/translations.ts b/x-pack/plugins/security_solution/public/cases/components/edit_connector/translations.ts deleted file mode 100644 index 12fa0d1855062..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/translations.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../../translations'; - -export const EDIT_CONNECTOR_ARIA = i18n.translate( - 'xpack.securitySolution.cases.editConnector.editConnectorLinkAria', - { - defaultMessage: 'click to edit connector', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/filter_popover/index.tsx b/x-pack/plugins/security_solution/public/cases/components/filter_popover/index.tsx deleted file mode 100644 index 91cd7bfd57fa0..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/filter_popover/index.tsx +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { Dispatch, SetStateAction, useCallback, useState } from 'react'; -import { - EuiFilterButton, - EuiFilterSelectItem, - EuiFlexGroup, - EuiFlexItem, - EuiPanel, - EuiPopover, - EuiText, -} from '@elastic/eui'; -import styled from 'styled-components'; - -interface FilterPopoverProps { - buttonLabel: string; - onSelectedOptionsChanged: Dispatch<SetStateAction<string[]>>; - options: string[]; - optionsEmptyLabel: string; - selectedOptions: string[]; -} - -const ScrollableDiv = styled.div` - max-height: 250px; - overflow: auto; -`; - -const toggleSelectedGroup = (group: string, selectedGroups: string[]): string[] => { - const selectedGroupIndex = selectedGroups.indexOf(group); - if (selectedGroupIndex >= 0) { - return [ - ...selectedGroups.slice(0, selectedGroupIndex), - ...selectedGroups.slice(selectedGroupIndex + 1), - ]; - } - return [...selectedGroups, group]; -}; - -/** - * Popover for selecting a field to filter on - * - * @param buttonLabel label on dropdwon button - * @param onSelectedOptionsChanged change listener to be notified when option selection changes - * @param options to display for filtering - * @param optionsEmptyLabel shows when options empty - * @param selectedOptions manage state of selectedOptions - */ -export const FilterPopoverComponent = ({ - buttonLabel, - onSelectedOptionsChanged, - options, - optionsEmptyLabel, - selectedOptions, -}: FilterPopoverProps) => { - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - - const setIsPopoverOpenCb = useCallback(() => setIsPopoverOpen(!isPopoverOpen), [isPopoverOpen]); - const toggleSelectedGroupCb = useCallback( - (option) => onSelectedOptionsChanged(toggleSelectedGroup(option, selectedOptions)), - [selectedOptions, onSelectedOptionsChanged] - ); - - return ( - <EuiPopover - ownFocus - button={ - <EuiFilterButton - data-test-subj={`options-filter-popover-button-${buttonLabel}`} - iconType="arrowDown" - onClick={setIsPopoverOpenCb} - isSelected={isPopoverOpen} - numFilters={options.length} - hasActiveFilters={selectedOptions.length > 0} - numActiveFilters={selectedOptions.length} - aria-label={buttonLabel} - > - {buttonLabel} - </EuiFilterButton> - } - isOpen={isPopoverOpen} - closePopover={setIsPopoverOpenCb} - panelPaddingSize="none" - repositionOnScroll - > - <ScrollableDiv> - {options.map((option, index) => ( - <EuiFilterSelectItem - checked={selectedOptions.includes(option) ? 'on' : undefined} - data-test-subj={`options-filter-popover-item-${index}`} - key={`${index}-${option}`} - onClick={toggleSelectedGroupCb.bind(null, option)} - > - {option} - </EuiFilterSelectItem> - ))} - </ScrollableDiv> - {options.length === 0 && ( - <EuiFlexGroup gutterSize="m" justifyContent="spaceAround"> - <EuiFlexItem grow={true}> - <EuiPanel> - <EuiText>{optionsEmptyLabel}</EuiText> - </EuiPanel> - </EuiFlexItem> - </EuiFlexGroup> - )} - </EuiPopover> - ); -}; - -FilterPopoverComponent.displayName = 'FilterPopoverComponent'; - -export const FilterPopover = React.memo(FilterPopoverComponent); - -FilterPopover.displayName = 'FilterPopover'; diff --git a/x-pack/plugins/security_solution/public/cases/components/property_actions/index.tsx b/x-pack/plugins/security_solution/public/cases/components/property_actions/index.tsx deleted file mode 100644 index 170af5fd3b28c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/property_actions/index.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useState } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiPopover, EuiButtonIcon, EuiButtonEmpty } from '@elastic/eui'; - -import * as i18n from './translations'; - -export interface PropertyActionButtonProps { - disabled?: boolean; - onClick: () => void; - iconType: string; - label: string; -} - -const ComponentId = 'property-actions'; - -const PropertyActionButton = React.memo<PropertyActionButtonProps>( - ({ disabled = false, onClick, iconType, label }) => ( - <EuiButtonEmpty - data-test-subj={`${ComponentId}-${iconType}`} - aria-label={label} - color="text" - iconSide="left" - iconType={iconType} - isDisabled={disabled} - onClick={onClick} - > - {label} - </EuiButtonEmpty> - ) -); - -PropertyActionButton.displayName = 'PropertyActionButton'; - -export interface PropertyActionsProps { - propertyActions: PropertyActionButtonProps[]; -} - -export const PropertyActions = React.memo<PropertyActionsProps>(({ propertyActions }) => { - const [showActions, setShowActions] = useState(false); - - const onButtonClick = useCallback(() => { - setShowActions(!showActions); - }, [showActions]); - - const onClosePopover = useCallback((cb?: () => void) => { - setShowActions(false); - if (cb != null) { - cb(); - } - }, []); - - return ( - <EuiFlexGroup alignItems="flexStart" data-test-subj={ComponentId} gutterSize="none"> - <EuiFlexItem grow={false}> - <EuiPopover - anchorPosition="downRight" - ownFocus - button={ - <EuiButtonIcon - data-test-subj={`${ComponentId}-ellipses`} - aria-label={i18n.ACTIONS_ARIA} - iconType="boxesHorizontal" - onClick={onButtonClick} - /> - } - id="settingsPopover" - isOpen={showActions} - closePopover={onClosePopover} - repositionOnScroll - > - <EuiFlexGroup - alignItems="flexStart" - data-test-subj={`${ComponentId}-group`} - direction="column" - gutterSize="none" - > - {propertyActions.map((action, key) => ( - <EuiFlexItem grow={false} key={`${action.label}${key}`}> - <PropertyActionButton - disabled={action.disabled} - iconType={action.iconType} - label={action.label} - onClick={() => onClosePopover(action.onClick)} - /> - </EuiFlexItem> - ))} - </EuiFlexGroup> - </EuiPopover> - </EuiFlexItem> - </EuiFlexGroup> - ); -}); - -PropertyActions.displayName = 'PropertyActions'; diff --git a/x-pack/plugins/security_solution/public/cases/components/property_actions/translations.ts b/x-pack/plugins/security_solution/public/cases/components/property_actions/translations.ts deleted file mode 100644 index c5c11e0637d7b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/property_actions/translations.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const ACTIONS_ARIA = i18n.translate( - 'xpack.securitySolution.cases.caseView.editActionsLinkAria', - { - defaultMessage: 'click to see all actions', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx b/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx deleted file mode 100644 index 3c019369fa08b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/button.test.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { StatusActionButton } from './button'; - -describe('StatusActionButton', () => { - const onStatusChanged = jest.fn(); - const defaultProps = { - status: CaseStatuses.open, - disabled: false, - isLoading: false, - onStatusChanged, - }; - - it('it renders', async () => { - const wrapper = mount(<StatusActionButton {...defaultProps} />); - - expect(wrapper.find(`[data-test-subj="case-view-status-action-button"]`).exists()).toBeTruthy(); - }); - - describe('Button icons', () => { - it('it renders the correct button icon: status open', () => { - const wrapper = mount(<StatusActionButton {...defaultProps} />); - - expect( - wrapper.find(`[data-test-subj="case-view-status-action-button"]`).first().prop('iconType') - ).toBe('folderExclamation'); - }); - - it('it renders the correct button icon: status in-progress', () => { - const wrapper = mount( - <StatusActionButton {...defaultProps} status={CaseStatuses['in-progress']} /> - ); - - expect( - wrapper.find(`[data-test-subj="case-view-status-action-button"]`).first().prop('iconType') - ).toBe('folderCheck'); - }); - - it('it renders the correct button icon: status closed', () => { - const wrapper = mount(<StatusActionButton {...defaultProps} status={CaseStatuses.closed} />); - - expect( - wrapper.find(`[data-test-subj="case-view-status-action-button"]`).first().prop('iconType') - ).toBe('folderOpen'); - }); - }); - - describe('Status rotation', () => { - it('rotates correctly to in-progress when status is open', () => { - const wrapper = mount(<StatusActionButton {...defaultProps} />); - - wrapper - .find(`button[data-test-subj="case-view-status-action-button"]`) - .first() - .simulate('click'); - expect(onStatusChanged).toHaveBeenCalledWith('in-progress'); - }); - - it('rotates correctly to closed when status is in-progress', () => { - const wrapper = mount( - <StatusActionButton {...defaultProps} status={CaseStatuses['in-progress']} /> - ); - - wrapper - .find(`button[data-test-subj="case-view-status-action-button"]`) - .first() - .simulate('click'); - expect(onStatusChanged).toHaveBeenCalledWith('closed'); - }); - - it('rotates correctly to open when status is closed', () => { - const wrapper = mount(<StatusActionButton {...defaultProps} status={CaseStatuses.closed} />); - - wrapper - .find(`button[data-test-subj="case-view-status-action-button"]`) - .first() - .simulate('click'); - expect(onStatusChanged).toHaveBeenCalledWith('open'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/button.tsx b/x-pack/plugins/security_solution/public/cases/components/status/button.tsx deleted file mode 100644 index 6aa8f540e2e95..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/button.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback, useMemo } from 'react'; -import { EuiButton } from '@elastic/eui'; - -import { CaseStatuses, caseStatuses } from '../../../../../cases/common'; -import { statuses } from './config'; - -interface Props { - status: CaseStatuses; - disabled: boolean; - isLoading: boolean; - onStatusChanged: (status: CaseStatuses) => void; -} - -// Rotate over the statuses. open -> in-progress -> closes -> open... -const getNextItem = (item: number) => (item + 1) % caseStatuses.length; - -const StatusActionButtonComponent: React.FC<Props> = ({ - status, - onStatusChanged, - disabled, - isLoading, -}) => { - const indexOfCurrentStatus = useMemo( - () => caseStatuses.findIndex((caseStatus) => caseStatus === status), - [status] - ); - const nextStatusIndex = useMemo(() => getNextItem(indexOfCurrentStatus), [indexOfCurrentStatus]); - - const onClick = useCallback(() => { - onStatusChanged(caseStatuses[nextStatusIndex]); - }, [nextStatusIndex, onStatusChanged]); - - return ( - <EuiButton - data-test-subj="case-view-status-action-button" - iconType={statuses[caseStatuses[nextStatusIndex]].icon} - isDisabled={disabled} - isLoading={isLoading} - onClick={onClick} - > - {statuses[caseStatuses[nextStatusIndex]].button.label} - </EuiButton> - ); -}; -export const StatusActionButton = memo(StatusActionButtonComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/config.ts b/x-pack/plugins/security_solution/public/cases/components/status/config.ts deleted file mode 100644 index b7bc7dfa36110..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/config.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { CaseStatuses } from '../../../../../cases/common'; -import * as i18n from './translations'; -import { AllCaseStatus, Statuses, StatusAll } from './types'; - -export const allCaseStatus: AllCaseStatus = { - [StatusAll]: { color: 'hollow', label: i18n.ALL }, -}; - -export const statuses: Statuses = { - [CaseStatuses.open]: { - color: 'primary', - label: i18n.OPEN, - icon: 'folderOpen' as const, - actions: { - bulk: { - title: i18n.BULK_ACTION_OPEN_SELECTED, - }, - single: { - title: i18n.OPEN_CASE, - }, - }, - actionBar: { - title: i18n.CASE_OPENED, - }, - button: { - label: i18n.REOPEN_CASE, - }, - stats: { - title: i18n.OPEN_CASES, - }, - }, - [CaseStatuses['in-progress']]: { - color: 'warning', - label: i18n.IN_PROGRESS, - icon: 'folderExclamation' as const, - actions: { - bulk: { - title: i18n.BULK_ACTION_MARK_IN_PROGRESS, - }, - single: { - title: i18n.MARK_CASE_IN_PROGRESS, - }, - }, - actionBar: { - title: i18n.CASE_IN_PROGRESS, - }, - button: { - label: i18n.MARK_CASE_IN_PROGRESS, - }, - stats: { - title: i18n.IN_PROGRESS_CASES, - }, - }, - [CaseStatuses.closed]: { - color: 'default', - label: i18n.CLOSED, - icon: 'folderCheck' as const, - actions: { - bulk: { - title: i18n.BULK_ACTION_CLOSE_SELECTED, - }, - single: { - title: i18n.CLOSE_CASE, - }, - }, - actionBar: { - title: i18n.CASE_CLOSED, - }, - button: { - label: i18n.CLOSE_CASE, - }, - stats: { - title: i18n.CLOSED_CASES, - }, - }, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/status/index.ts b/x-pack/plugins/security_solution/public/cases/components/status/index.ts deleted file mode 100644 index 94d7cb6a31830..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export * from './status'; -export * from './config'; -export * from './stats'; -export * from './types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx b/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx deleted file mode 100644 index 0bf3297361446..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/stats.test.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { Stats } from './stats'; - -describe('Stats', () => { - const defaultProps = { - caseStatus: CaseStatuses.open, - caseCount: 2, - isLoading: false, - dataTestSubj: 'test-stats', - }; - it('it renders', async () => { - const wrapper = mount(<Stats {...defaultProps} />); - - expect(wrapper.find(`[data-test-subj="test-stats"]`).exists()).toBeTruthy(); - }); - - it('shows the count', async () => { - const wrapper = mount(<Stats {...defaultProps} />); - - expect( - wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__description`).first().text() - ).toBe('2'); - }); - - it('shows the loading spinner', async () => { - const wrapper = mount(<Stats {...defaultProps} isLoading={true} />); - - expect(wrapper.find(`[data-test-subj="test-stats-loading-spinner"]`).exists()).toBeTruthy(); - }); - - describe('Status title', () => { - it('shows the correct title for status open', async () => { - const wrapper = mount(<Stats {...defaultProps} />); - - expect( - wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__title`).first().text() - ).toBe('Open cases'); - }); - - it('shows the correct title for status in-progress', async () => { - const wrapper = mount(<Stats {...defaultProps} caseStatus={CaseStatuses['in-progress']} />); - - expect( - wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__title`).first().text() - ).toBe('In progress cases'); - }); - - it('shows the correct title for status closed', async () => { - const wrapper = mount(<Stats {...defaultProps} caseStatus={CaseStatuses.closed} />); - - expect( - wrapper.find(`[data-test-subj="test-stats"] .euiDescriptionList__title`).first().text() - ).toBe('Closed cases'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx b/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx deleted file mode 100644 index 93b8479a55d71..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/stats.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useMemo } from 'react'; -import { EuiDescriptionList, EuiLoadingSpinner } from '@elastic/eui'; -import { CaseStatuses } from '../../../../../cases/common'; -import { statuses } from './config'; - -export interface Props { - caseCount: number | null; - caseStatus: CaseStatuses; - isLoading: boolean; - dataTestSubj?: string; -} - -const StatsComponent: React.FC<Props> = ({ caseCount, caseStatus, isLoading, dataTestSubj }) => { - const statusStats = useMemo( - () => [ - { - title: statuses[caseStatus].stats.title, - description: isLoading ? ( - <EuiLoadingSpinner data-test-subj={`${dataTestSubj}-loading-spinner`} /> - ) : ( - caseCount ?? 'N/A' - ), - }, - ], - [caseCount, caseStatus, dataTestSubj, isLoading] - ); - return ( - <EuiDescriptionList data-test-subj={dataTestSubj} textStyle="reverse" listItems={statusStats} /> - ); -}; - -StatsComponent.displayName = 'StatsComponent'; -export const Stats = memo(StatsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx b/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx deleted file mode 100644 index 05c3b95e163e6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/status.test.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { Status } from './status'; - -describe('Stats', () => { - const onClick = jest.fn(); - - it('it renders', async () => { - const wrapper = mount(<Status type={CaseStatuses.open} withArrow={false} onClick={onClick} />); - - expect(wrapper.find(`[data-test-subj="status-badge-open"]`).exists()).toBeTruthy(); - expect( - wrapper.find(`[data-test-subj="status-badge-open"] .euiBadge__iconButton`).exists() - ).toBeFalsy(); - }); - - it('it renders with arrow', async () => { - const wrapper = mount(<Status type={CaseStatuses.open} withArrow={true} onClick={onClick} />); - - expect( - wrapper.find(`[data-test-subj="status-badge-open"] .euiBadge__iconButton`).exists() - ).toBeTruthy(); - }); - - it('it calls onClick when pressing the badge', async () => { - const wrapper = mount(<Status type={CaseStatuses.open} withArrow={true} onClick={onClick} />); - - wrapper.find(`[data-test-subj="status-badge-open"] .euiBadge__iconButton`).simulate('click'); - expect(onClick).toHaveBeenCalled(); - }); - - describe('Colors', () => { - it('shows the correct color when status is open', async () => { - const wrapper = mount( - <Status type={CaseStatuses.open} withArrow={false} onClick={onClick} /> - ); - - expect(wrapper.find(`[data-test-subj="status-badge-open"]`).first().prop('color')).toBe( - 'primary' - ); - }); - - it('shows the correct color when status is in-progress', async () => { - const wrapper = mount( - <Status type={CaseStatuses['in-progress']} withArrow={false} onClick={onClick} /> - ); - - expect( - wrapper.find(`[data-test-subj="status-badge-in-progress"]`).first().prop('color') - ).toBe('warning'); - }); - - it('shows the correct color when status is closed', async () => { - const wrapper = mount( - <Status type={CaseStatuses.closed} withArrow={false} onClick={onClick} /> - ); - - expect(wrapper.find(`[data-test-subj="status-badge-closed"]`).first().prop('color')).toBe( - 'default' - ); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/status.tsx b/x-pack/plugins/security_solution/public/cases/components/status/status.tsx deleted file mode 100644 index de4c979daf4c1..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/status.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useMemo } from 'react'; -import { noop } from 'lodash/fp'; -import { EuiBadge } from '@elastic/eui'; - -import { allCaseStatus, statuses } from './config'; -import { CaseStatusWithAllStatus, StatusAll } from './types'; -import * as i18n from './translations'; - -interface Props { - type: CaseStatusWithAllStatus; - withArrow?: boolean; - onClick?: () => void; -} - -const StatusComponent: React.FC<Props> = ({ type, withArrow = false, onClick = noop }) => { - const props = useMemo( - () => ({ - color: type === StatusAll ? allCaseStatus[StatusAll].color : statuses[type].color, - ...(withArrow ? { iconType: 'arrowDown', iconSide: 'right' as const } : {}), - }), - [withArrow, type] - ); - - return ( - <EuiBadge - {...props} - iconOnClick={onClick} - iconOnClickAriaLabel={i18n.STATUS_ICON_ARIA} - data-test-subj={`status-badge-${type}`} - > - {type === StatusAll ? allCaseStatus[StatusAll].label : statuses[type].label} - </EuiBadge> - ); -}; - -export const Status = memo(StatusComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/translations.ts b/x-pack/plugins/security_solution/public/cases/components/status/translations.ts deleted file mode 100644 index 6c26513785026..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/translations.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -export * from '../../translations'; - -export const ALL = i18n.translate('xpack.securitySolution.cases.status.all', { - defaultMessage: 'All', -}); - -export const OPEN = i18n.translate('xpack.securitySolution.cases.status.open', { - defaultMessage: 'Open', -}); - -export const IN_PROGRESS = i18n.translate('xpack.securitySolution.cases.status.inProgress', { - defaultMessage: 'In progress', -}); - -export const CLOSED = i18n.translate('xpack.securitySolution.cases.status.closed', { - defaultMessage: 'Closed', -}); - -export const STATUS_ICON_ARIA = i18n.translate('xpack.securitySolution.cases.status.iconAria', { - defaultMessage: 'Change status', -}); - -export const CASE_OPENED = i18n.translate('xpack.securitySolution.cases.caseView.caseOpened', { - defaultMessage: 'Case opened', -}); - -export const CASE_IN_PROGRESS = i18n.translate( - 'xpack.securitySolution.cases.caseView.caseInProgress', - { - defaultMessage: 'Case in progress', - } -); - -export const CASE_CLOSED = i18n.translate('xpack.securitySolution.cases.caseView.caseClosed', { - defaultMessage: 'Case closed', -}); - -export const BULK_ACTION_CLOSE_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.closeSelectedTitle', - { - defaultMessage: 'Close selected', - } -); - -export const BULK_ACTION_OPEN_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.openSelectedTitle', - { - defaultMessage: 'Open selected', - } -); - -export const BULK_ACTION_DELETE_SELECTED = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.deleteSelectedTitle', - { - defaultMessage: 'Delete selected', - } -); - -export const BULK_ACTION_MARK_IN_PROGRESS = i18n.translate( - 'xpack.securitySolution.cases.caseTable.bulkActions.markInProgressTitle', - { - defaultMessage: 'Mark in progress', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/status/types.ts b/x-pack/plugins/security_solution/public/cases/components/status/types.ts deleted file mode 100644 index bbe44bce55515..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/status/types.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiIconType } from '@elastic/eui/src/components/icon/icon'; -import { CaseStatuses } from '../../../../../cases/common'; - -export const StatusAll = 'all' as const; -type StatusAllType = typeof StatusAll; - -export type CaseStatusWithAllStatus = CaseStatuses | StatusAllType; - -export type AllCaseStatus = Record<StatusAllType, { color: string; label: string }>; - -export type Statuses = Record< - CaseStatuses, - { - color: string; - label: string; - icon: EuiIconType; - actions: { - bulk: { - title: string; - }; - single: { - title: string; - description?: string; - }; - }; - actionBar: { - title: string; - }; - button: { - label: string; - }; - stats: { - title: string; - }; - } ->; diff --git a/x-pack/plugins/security_solution/public/cases/components/tag_list/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/tag_list/index.test.tsx deleted file mode 100644 index eb9cef2d9d1ef..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/tag_list/index.test.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { TagList } from '.'; -import { getFormMock } from '../__mock__/form'; -import { TestProviders } from '../../../common/mock'; -import { waitFor } from '@testing-library/react'; -import { useForm } from '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; -import { useGetTags } from '../../containers/use_get_tags'; - -jest.mock( - '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' -); -jest.mock('../../containers/use_get_tags'); -jest.mock( - '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', - () => ({ - FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => - children({ tags: ['rad', 'dude'] }), - }) -); -jest.mock('@elastic/eui', () => { - const original = jest.requireActual('@elastic/eui'); - return { - ...original, - // eslint-disable-next-line react/display-name - EuiFieldText: () => <input />, - }; -}); -const onSubmit = jest.fn(); -const defaultProps = { - disabled: false, - isLoading: false, - onSubmit, - tags: [], -}; - -describe('TagList ', () => { - const sampleTags = ['coke', 'pepsi']; - const fetchTags = jest.fn(); - const formHookMock = getFormMock({ tags: sampleTags }); - beforeEach(() => { - jest.resetAllMocks(); - (useForm as jest.Mock).mockImplementation(() => ({ form: formHookMock })); - - (useGetTags as jest.Mock).mockImplementation(() => ({ - tags: sampleTags, - fetchTags, - })); - }); - - it('Renders no tags, and then edit', () => { - const wrapper = mount( - <TestProviders> - <TagList {...defaultProps} /> - </TestProviders> - ); - expect(wrapper.find(`[data-test-subj="no-tags"]`).last().exists()).toBeTruthy(); - wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); - expect(wrapper.find(`[data-test-subj="no-tags"]`).last().exists()).toBeFalsy(); - expect(wrapper.find(`[data-test-subj="edit-tags"]`).last().exists()).toBeTruthy(); - }); - - it('Edit tag on submit', async () => { - const wrapper = mount( - <TestProviders> - <TagList {...defaultProps} /> - </TestProviders> - ); - wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); - wrapper.find(`[data-test-subj="edit-tags-submit"]`).last().simulate('click'); - await waitFor(() => expect(onSubmit).toBeCalledWith(sampleTags)); - }); - - it('Tag options render with new tags added', () => { - const wrapper = mount( - <TestProviders> - <TagList {...defaultProps} /> - </TestProviders> - ); - wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); - expect( - wrapper.find(`[data-test-subj="caseTags"] [data-test-subj="input"]`).first().prop('options') - ).toEqual([{ label: 'coke' }, { label: 'pepsi' }, { label: 'rad' }, { label: 'dude' }]); - }); - - it('Cancels on cancel', () => { - const props = { - ...defaultProps, - tags: ['pepsi'], - }; - const wrapper = mount( - <TestProviders> - <TagList {...props} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj="tag-pepsi"]`).last().exists()).toBeTruthy(); - wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().simulate('click'); - - expect(wrapper.find(`[data-test-subj="tag-pepsi"]`).last().exists()).toBeFalsy(); - wrapper.find(`[data-test-subj="edit-tags-cancel"]`).last().simulate('click'); - wrapper.update(); - expect(wrapper.find(`[data-test-subj="tag-pepsi"]`).last().exists()).toBeTruthy(); - }); - - it('Renders disabled button', () => { - const props = { ...defaultProps, disabled: true }; - const wrapper = mount( - <TestProviders> - <TagList {...props} /> - </TestProviders> - ); - expect( - wrapper.find(`[data-test-subj="tag-list-edit-button"]`).last().prop('disabled') - ).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/tag_list/index.tsx b/x-pack/plugins/security_solution/public/cases/components/tag_list/index.tsx deleted file mode 100644 index 8e47437b37c0e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/tag_list/index.tsx +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback, useEffect, useState } from 'react'; -import { - EuiText, - EuiHorizontalRule, - EuiFlexGroup, - EuiFlexItem, - EuiButton, - EuiButtonEmpty, - EuiButtonIcon, - EuiLoadingSpinner, -} from '@elastic/eui'; -import styled, { css } from 'styled-components'; -import { isEqual } from 'lodash/fp'; -import * as i18n from './translations'; -import { Form, FormDataProvider, useForm, getUseField, Field } from '../../../shared_imports'; -import { schema } from './schema'; -import { useGetTags } from '../../containers/use_get_tags'; - -import { Tags } from './tags'; - -const CommonUseField = getUseField({ component: Field }); - -interface TagListProps { - disabled?: boolean; - isLoading: boolean; - onSubmit: (a: string[]) => void; - tags: string[]; -} - -const MyFlexGroup = styled(EuiFlexGroup)` - ${({ theme }) => css` - margin-top: ${theme.eui.euiSizeM}; - p { - font-size: ${theme.eui.euiSizeM}; - } - `} -`; - -export const TagList = React.memo( - ({ disabled = false, isLoading, onSubmit, tags }: TagListProps) => { - const initialState = { tags }; - const { form } = useForm({ - defaultValue: initialState, - options: { stripEmptyFields: false }, - schema, - }); - const { submit } = form; - const [isEditTags, setIsEditTags] = useState(false); - - const onSubmitTags = useCallback(async () => { - const { isValid, data: newData } = await submit(); - if (isValid && newData.tags) { - onSubmit(newData.tags); - setIsEditTags(false); - } - }, [onSubmit, submit]); - - const { tags: tagOptions } = useGetTags(); - const [options, setOptions] = useState( - tagOptions.map((label) => ({ - label, - })) - ); - - useEffect( - () => - setOptions( - tagOptions.map((label) => ({ - label, - })) - ), - [tagOptions] - ); - return ( - <EuiText> - <EuiFlexGroup alignItems="center" gutterSize="xs" justifyContent="spaceBetween"> - <EuiFlexItem grow={false}> - <h4>{i18n.TAGS}</h4> - </EuiFlexItem> - {isLoading && <EuiLoadingSpinner data-test-subj="tag-list-loading" />} - {!isLoading && ( - <EuiFlexItem data-test-subj="tag-list-edit" grow={false}> - <EuiButtonIcon - data-test-subj="tag-list-edit-button" - isDisabled={disabled} - aria-label={i18n.EDIT_TAGS_ARIA} - iconType={'pencil'} - onClick={setIsEditTags.bind(null, true)} - /> - </EuiFlexItem> - )} - </EuiFlexGroup> - <EuiHorizontalRule margin="xs" /> - <MyFlexGroup gutterSize="none" data-test-subj="case-tags"> - {tags.length === 0 && !isEditTags && <p data-test-subj="no-tags">{i18n.NO_TAGS}</p>} - {!isEditTags && <Tags tags={tags} color="hollow" />} - {isEditTags && ( - <EuiFlexGroup data-test-subj="edit-tags" direction="column"> - <EuiFlexItem> - <Form form={form}> - <CommonUseField - path="tags" - componentProps={{ - idAria: 'caseTags', - 'data-test-subj': 'caseTags', - euiFieldProps: { - fullWidth: true, - placeholder: '', - options, - noSuggestions: false, - }, - }} - /> - <FormDataProvider pathsToWatch="tags"> - {({ tags: anotherTags }) => { - const current: string[] = options.map((opt) => opt.label); - const newOptions = anotherTags.reduce((acc: string[], item: string) => { - if (!acc.includes(item)) { - return [...acc, item]; - } - return acc; - }, current); - if (!isEqual(current, newOptions)) { - setOptions( - newOptions.map((label: string) => ({ - label, - })) - ); - } - return null; - }} - </FormDataProvider> - </Form> - </EuiFlexItem> - <EuiFlexItem> - <EuiFlexGroup gutterSize="s" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiButton - color="secondary" - data-test-subj="edit-tags-submit" - fill - iconType="save" - onClick={onSubmitTags} - size="s" - > - {i18n.SAVE} - </EuiButton> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiButtonEmpty - data-test-subj="edit-tags-cancel" - iconType="cross" - onClick={setIsEditTags.bind(null, false)} - size="s" - > - {i18n.CANCEL} - </EuiButtonEmpty> - </EuiFlexItem> - </EuiFlexGroup> - </EuiFlexItem> - </EuiFlexGroup> - )} - </MyFlexGroup> - </EuiText> - ); - } -); - -TagList.displayName = 'TagList'; diff --git a/x-pack/plugins/security_solution/public/cases/components/tag_list/schema.tsx b/x-pack/plugins/security_solution/public/cases/components/tag_list/schema.tsx deleted file mode 100644 index 281198d51ea7d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/tag_list/schema.tsx +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormSchema } from '../../../shared_imports'; -import { schemaTags } from '../create/schema'; - -export const schema: FormSchema = { - tags: schemaTags, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/tag_list/tags.tsx b/x-pack/plugins/security_solution/public/cases/components/tag_list/tags.tsx deleted file mode 100644 index b38cf1745307e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/tag_list/tags.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiBadgeGroup, EuiBadge, EuiBadgeGroupProps } from '@elastic/eui'; - -interface TagsProps { - tags: string[]; - color?: string; - gutterSize?: EuiBadgeGroupProps['gutterSize']; -} - -const TagsComponent: React.FC<TagsProps> = ({ tags, color = 'default', gutterSize }) => { - return ( - <> - {tags.length > 0 && ( - <EuiBadgeGroup gutterSize={gutterSize}> - {tags.map((tag) => ( - <EuiBadge data-test-subj={`tag-${tag}`} color={color} key={tag}> - {tag} - </EuiBadge> - ))} - </EuiBadgeGroup> - )} - </> - ); -}; - -export const Tags = memo(TagsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/tag_list/translations.ts b/x-pack/plugins/security_solution/public/cases/components/tag_list/translations.ts deleted file mode 100644 index 4bddfbdbc1a85..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/tag_list/translations.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../../translations'; - -export const EDIT_TAGS_ARIA = i18n.translate( - 'xpack.securitySolution.cases.caseView.editTagsLinkAria', - { - defaultMessage: 'click to edit tags', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx index c99cabb50e3dc..46bf4354607a6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx @@ -5,19 +5,18 @@ * 2.0. */ -/* eslint-disable react/display-name */ -import React, { ReactNode } from 'react'; +import React from 'react'; import { mount } from 'enzyme'; import { EuiGlobalToastList } from '@elastic/eui'; import { useKibana, useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; import { useStateToaster } from '../../../common/components/toasters'; import { TestProviders } from '../../../common/mock'; -import { usePostComment } from '../../containers/use_post_comment'; -import { Case } from '../../containers/types'; import { AddToCaseAction } from './add_to_case_action'; +import { useAllCasesModal } from '../use_all_cases_modal'; +import { basicCase } from '../../../../../cases/public/containers/mock'; +import { Case } from '../../../../../cases/public/containers/types'; -jest.mock('../../containers/use_post_comment'); jest.mock('../../../common/lib/kibana'); jest.mock('../../../common/components/toasters', () => { @@ -28,85 +27,7 @@ jest.mock('../../../common/components/toasters', () => { }; }); -jest.mock('../all_cases', () => { - return { - AllCases: ({ onRowClick }: { onRowClick: (theCase: Partial<Case>) => void }) => { - return ( - <button - type="button" - data-test-subj="all-cases-modal-button" - onClick={() => - onRowClick({ - id: 'selected-case', - title: 'the selected case', - settings: { syncAlerts: true }, - }) - } - > - {'case-row'} - </button> - ); - }, - }; -}); - -jest.mock('../create/form_context', () => { - return { - FormContext: ({ - children, - onSuccess, - afterCaseCreated, - }: { - children: ReactNode; - onSuccess: (theCase: Partial<Case>) => Promise<void>; - afterCaseCreated: (theCase: Partial<Case>) => Promise<void>; - }) => { - return ( - <> - <button - type="button" - data-test-subj="form-context-on-success" - onClick={() => { - afterCaseCreated({ - id: 'new-case', - title: 'the new case', - settings: { syncAlerts: true }, - }); - onSuccess({ id: 'new-case', title: 'the new case', settings: { syncAlerts: true } }); - }} - > - {'submit'} - </button> - {children} - </> - ); - }, - }; -}); - -jest.mock('../create/form', () => { - return { - CreateCaseForm: () => { - return <>{'form'}</>; - }, - }; -}); - -jest.mock('../create/submit_button', () => { - return { - SubmitCaseButton: () => { - return <>{'Submit'}</>; - }, - }; -}); - -const usePostCommentMock = usePostComment as jest.Mock; -const postComment = jest.fn(); -const defaultPostComment = { - isLoading: false, - isError: false, - postComment, -}; +jest.mock('../use_all_cases_modal'); describe('AddToCaseAction', () => { const props = { @@ -119,13 +40,24 @@ describe('AddToCaseAction', () => { const mockDispatchToaster = jest.fn(); const mockNavigateToApp = jest.fn(); + const mockCreateCase = jest.fn(); + const mockUseCasesModal = useAllCasesModal as jest.Mock; + const mockAllCasesModal = jest.fn(); beforeEach(() => { jest.clearAllMocks(); - usePostCommentMock.mockImplementation(() => defaultPostComment); + mockUseCasesModal.mockReturnValue({ + modal: <></>, + openModal: mockAllCasesModal, + }); (useStateToaster as jest.Mock).mockReturnValue([jest.fn(), mockDispatchToaster]); (useKibana as jest.Mock).mockReturnValue({ - services: { application: { navigateToApp: mockNavigateToApp } }, + services: { + application: { navigateToApp: mockNavigateToApp }, + cases: { + getCreateCase: mockCreateCase, + }, + }, }); (useGetUserSavedObjectPermissions as jest.Mock).mockReturnValue({ crud: true, @@ -133,7 +65,7 @@ describe('AddToCaseAction', () => { }); }); - it('it renders', async () => { + it('it renders', () => { const wrapper = mount( <TestProviders> <AddToCaseAction {...props} /> @@ -143,7 +75,7 @@ describe('AddToCaseAction', () => { expect(wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).exists()).toBeTruthy(); }); - it('it opens the context menu', async () => { + it('it opens the context menu', () => { const wrapper = mount( <TestProviders> <AddToCaseAction {...props} /> @@ -155,7 +87,7 @@ describe('AddToCaseAction', () => { expect(wrapper.find(`[data-test-subj="add-existing-case-menu-item"]`).exists()).toBeTruthy(); }); - it('it opens the create case modal', async () => { + it('it opens the create case modal', () => { const wrapper = mount( <TestProviders> <AddToCaseAction {...props} /> @@ -164,35 +96,10 @@ describe('AddToCaseAction', () => { wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); wrapper.find(`[data-test-subj="add-new-case-item"]`).first().simulate('click'); - - expect(wrapper.find(`[data-test-subj="form-context-on-success"]`).exists()).toBeTruthy(); + expect(mockCreateCase).toHaveBeenCalled(); }); - it('it attach the alert to case on case creation', async () => { - const wrapper = mount( - <TestProviders> - <AddToCaseAction {...props} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="add-new-case-item"]`).first().simulate('click'); - - wrapper.find(`[data-test-subj="form-context-on-success"]`).first().simulate('click'); - - expect(postComment.mock.calls[0][0].caseId).toBe('new-case'); - expect(postComment.mock.calls[0][0].data).toEqual({ - alertId: 'test-id', - index: 'test-index', - rule: { - id: 'rule-id', - name: 'rule-name', - }, - type: 'alert', - }); - }); - - it('it opens the all cases modal', async () => { + it('it opens the all cases modal', () => { const wrapper = mount( <TestProviders> <AddToCaseAction {...props} /> @@ -202,34 +109,14 @@ describe('AddToCaseAction', () => { wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); wrapper.find(`[data-test-subj="add-existing-case-menu-item"]`).first().simulate('click'); - expect(wrapper.find(`[data-test-subj="all-cases-modal-button"]`).exists()).toBeTruthy(); - }); - - it('it attach the alert to case after selecting a case', async () => { - const wrapper = mount( - <TestProviders> - <AddToCaseAction {...props} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="add-existing-case-menu-item"]`).first().simulate('click'); - - wrapper.find(`[data-test-subj="all-cases-modal-button"]`).first().simulate('click'); - - expect(postComment.mock.calls[0][0].caseId).toBe('selected-case'); - expect(postComment.mock.calls[0][0].data).toEqual({ + expect(mockUseCasesModal.mock.calls[0][0].alertData).toEqual({ alertId: 'test-id', index: 'test-index', - rule: { - id: 'rule-id', - name: 'rule-name', - }, - type: 'alert', + rule: { id: 'rule-id', name: 'rule-name' }, }); }); - it('it set rule information as null when missing', async () => { + it('it set rule information as null when missing', () => { const wrapper = mount( <TestProviders> <AddToCaseAction @@ -245,61 +132,24 @@ describe('AddToCaseAction', () => { wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); wrapper.find(`[data-test-subj="add-new-case-item"]`).first().simulate('click'); - - wrapper.find(`[data-test-subj="form-context-on-success"]`).first().simulate('click'); - - expect(postComment.mock.calls[0][0].caseId).toBe('new-case'); - expect(postComment.mock.calls[0][0].data).toEqual({ + expect(mockUseCasesModal.mock.calls[0][0].alertData).toEqual({ alertId: 'test-id', index: 'test-index', - rule: { - id: 'rule-id', - name: null, - }, - type: 'alert', + rule: { id: 'rule-id', name: null }, }); }); - it('navigates to case view when attach to a new case', async () => { - const wrapper = mount( - <TestProviders> - <AddToCaseAction {...props} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="add-new-case-item"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="form-context-on-success"]`).first().simulate('click'); - - expect(mockDispatchToaster).toHaveBeenCalled(); - const toast = mockDispatchToaster.mock.calls[0][0].toast; - - const toastWrapper = mount( - <EuiGlobalToastList toasts={[toast]} toastLifeTimeMs={6000} dismissToast={() => {}} /> - ); - - toastWrapper - .find('[data-test-subj="toaster-content-case-view-link"]') - .first() - .simulate('click'); - - expect(mockNavigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/new-case' }); - }); - - it('navigates to case view when attach to an existing case', async () => { - usePostCommentMock.mockImplementation(() => { - return { - ...defaultPostComment, - postComment: jest.fn().mockImplementation(({ caseId, data, updateCase }) => { - updateCase({ - id: 'selected-case', - title: 'the selected case', - settings: { syncAlerts: true }, - }); - }), - }; + it('onSuccess triggers toaster that links to case view', () => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { navigateToApp: mockNavigateToApp }, + cases: { + getCreateCase: ({ onSuccess }: { onSuccess: (theCase: Case) => Promise<void> }) => { + onSuccess(basicCase); + }, + }, + }, }); - const wrapper = mount( <TestProviders> <AddToCaseAction {...props} /> @@ -307,8 +157,7 @@ describe('AddToCaseAction', () => { ); wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="add-existing-case-menu-item"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="all-cases-modal-button"]`).first().simulate('click'); + wrapper.find(`[data-test-subj="add-new-case-item"]`).first().simulate('click'); expect(mockDispatchToaster).toHaveBeenCalled(); const toast = mockDispatchToaster.mock.calls[0][0].toast; @@ -323,11 +172,11 @@ describe('AddToCaseAction', () => { .simulate('click'); expect(mockNavigateToApp).toHaveBeenCalledWith('securitySolution:case', { - path: '/selected-case', + path: '/basic-case-id', }); }); - it('disabled when event type is not supported', async () => { + it('disabled when event type is not supported', () => { const wrapper = mount( <TestProviders> <AddToCaseAction @@ -345,7 +194,7 @@ describe('AddToCaseAction', () => { ).toBeTruthy(); }); - it('disabled when user does not have crud permissions', async () => { + it('disabled when user does not have crud permissions', () => { (useGetUserSavedObjectPermissions as jest.Mock).mockReturnValue({ crud: false, read: true, diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx index ec5a3825ff652..4f2c5650df09f 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx @@ -16,21 +16,19 @@ import { EuiToolTip, } from '@elastic/eui'; -import { CommentType, CaseStatuses } from '../../../../../cases/common'; +import { Case, CaseStatuses } from '../../../../../cases/common'; +import { APP_ID } from '../../../../common/constants'; import { Ecs } from '../../../../common/ecs'; -import { ActionIconItem } from '../../../timelines/components/timeline/body/actions/action_icon_item'; -import { usePostComment } from '../../containers/use_post_comment'; -import { Case } from '../../containers/types'; +import { SecurityPageName } from '../../../app/types'; +import { getCaseDetailsUrl } from '../../../common/components/link_to'; import { useStateToaster } from '../../../common/components/toasters'; -import { APP_ID } from '../../../../common/constants'; +import { useControl } from '../../../common/hooks/use_control'; import { useGetUserSavedObjectPermissions, useKibana } from '../../../common/lib/kibana'; -import { getCaseDetailsUrl } from '../../../common/components/link_to'; -import { SecurityPageName } from '../../../app/types'; +import { ActionIconItem } from '../../../timelines/components/timeline/body/actions/action_icon_item'; +import { CreateCaseFlyout } from '../create/flyout'; import { useAllCasesModal } from '../use_all_cases_modal'; import { createUpdateSuccessToaster } from './helpers'; import * as i18n from './translations'; -import { useControl } from '../../../common/hooks/use_control'; -import { CreateCaseFlyout } from '../create/flyout'; interface AddToCaseActionProps { ariaLabel?: string; @@ -61,8 +59,6 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ : i18n.UNSUPPORTED_EVENTS_MSG : i18n.PERMISSIONS_MSG; - const { postComment } = usePostComment(); - const onViewCaseClick = useCallback( (id) => { navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { @@ -78,33 +74,15 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ closeControl: closeCaseFlyoutOpen, } = useControl(); - const attachAlertToCase = useCallback( - async (theCase: Case, updateCase?: (newCase: Case) => void) => { - closeCaseFlyoutOpen(); - await postComment({ - caseId: theCase.id, - data: { - type: CommentType.alert, - alertId: eventId, - index: eventIndex ?? '', - rule: { - id: rule?.id != null ? rule.id[0] : null, - name: rule?.name != null ? rule.name[0] : null, - }, - }, - updateCase, - }); - }, - [closeCaseFlyoutOpen, postComment, eventId, eventIndex, rule] - ); - const onCaseSuccess = useCallback( - async (theCase: Case) => - dispatchToaster({ + async (theCase: Case) => { + closeCaseFlyoutOpen(); + return dispatchToaster({ type: 'addToaster', toast: createUpdateSuccessToaster(theCase, onViewCaseClick), - }), - [dispatchToaster, onViewCaseClick] + }); + }, + [closeCaseFlyoutOpen, dispatchToaster, onViewCaseClick] ); const onCaseClicked = useCallback( @@ -116,17 +94,23 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ */ if (theCase == null) { openCaseFlyoutOpen(); - return; } - - attachAlertToCase(theCase, onCaseSuccess); }, - [attachAlertToCase, onCaseSuccess, openCaseFlyoutOpen] + [openCaseFlyoutOpen] ); const { modal: allCasesModal, openModal: openAllCaseModal } = useAllCasesModal({ + alertData: { + alertId: eventId, + index: eventIndex ?? '', + rule: { + id: rule?.id != null ? rule.id[0] : null, + name: rule?.name != null ? rule.name[0] : null, + }, + }, disabledStatuses: [CaseStatuses.closed], onRowClick: onCaseClicked, + updateCase: onCaseSuccess, }); const addNewCaseClick = useCallback(() => { @@ -195,11 +179,7 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ </EuiPopover> </ActionIconItem> {isCreateCaseFlyoutOpen && ( - <CreateCaseFlyout - onCloseFlyout={closeCaseFlyoutOpen} - afterCaseCreated={attachAlertToCase} - onSuccess={onCaseSuccess} - /> + <CreateCaseFlyout onCloseFlyout={closeCaseFlyoutOpen} onSuccess={onCaseSuccess} /> )} {allCasesModal} </> diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx index 9e358323ee073..9722447b96ad5 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx @@ -6,7 +6,7 @@ */ import { createUpdateSuccessToaster } from './helpers'; -import { Case } from '../../containers/types'; +import { Case } from '../../../../../cases/common'; const theCase = { id: 'case-id', diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx index 175d7f896648b..8682b6680830d 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx @@ -8,9 +8,9 @@ import React from 'react'; import uuid from 'uuid'; import { AppToast } from '../../../common/components/toasters'; -import { Case } from '../../containers/types'; import { ToasterContent } from './toaster_content'; import * as i18n from './translations'; +import { Case } from '../../../../../cases/common'; export const createUpdateSuccessToaster = ( theCase: Case, diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx index 57d4b585d573f..76c7cb7ef3a6a 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx @@ -39,6 +39,11 @@ jest.mock('../../../common/lib/kibana', () => { const onCloseCaseModal = jest.fn(); const onRowClick = jest.fn(); const defaultProps = { + alertData: { + alertId: '123', + index: '123', + rule: { id: '123', name: '123' }, + }, isModalOpen: true, onCloseCaseModal, onRowClick, @@ -89,9 +94,12 @@ describe('AllCasesModal', () => { const props = wrapper.find('AllCases').props(); expect(props).toEqual({ + alertData: defaultProps.alertData, userCanCrud: false, onRowClick, isModal: true, + disabledStatuses: undefined, + updateCase: undefined, }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx index 54a5dd1263961..ef03931837567 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx @@ -10,16 +10,17 @@ import styled from 'styled-components'; import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; -import { CaseStatuses } from '../../../../../cases/common'; -import { Case, SubCase } from '../../containers/types'; +import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../../cases/common'; import { AllCases } from '../all_cases'; import * as i18n from './translations'; export interface AllCasesModalProps { + alertData?: Omit<CommentRequestAlertType, 'type'>; + disabledStatuses?: CaseStatuses[]; isModalOpen: boolean; onCloseCaseModal: () => void; - onRowClick: (theCase?: Case | SubCase) => void; - disabledStatuses?: CaseStatuses[]; + onRowClick?: (theCase?: Case | SubCase) => void; + updateCase?: (newCase: Case) => void; } const Modal = styled(EuiModal)` @@ -30,10 +31,12 @@ const Modal = styled(EuiModal)` `; const AllCasesModalComponent: React.FC<AllCasesModalProps> = ({ + alertData, + disabledStatuses, isModalOpen, onCloseCaseModal, onRowClick, - disabledStatuses, + updateCase, }) => { const userPermissions = useGetUserSavedObjectPermissions(); const userCanCrud = userPermissions?.crud ?? false; @@ -45,10 +48,12 @@ const AllCasesModalComponent: React.FC<AllCasesModalProps> = ({ </EuiModalHeader> <EuiModalBody> <AllCases + alertData={alertData} + disabledStatuses={disabledStatuses} + isModal onRowClick={onRowClick} + updateCase={updateCase} userCanCrud={userCanCrud} - isModal - disabledStatuses={disabledStatuses} /> </EuiModalBody> </Modal> diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx index 57bb39a1ab50f..d1d2a1c8c9a7f 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx @@ -43,6 +43,14 @@ jest.mock('../../../common/hooks/use_selector'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; const onRowClick = jest.fn(); +const closeModal = jest.fn(); +const openModal = jest.fn(); +const defaultArgs = { + onRowClick, + closeModal, + openModal, + isModalOpen: true, +}; describe('useAllCasesModal', () => { let navigateToApp: jest.Mock; @@ -55,7 +63,7 @@ describe('useAllCasesModal', () => { it('init', async () => { const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal({ onRowClick }), + () => useAllCasesModal(defaultArgs), { wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, } @@ -66,7 +74,7 @@ describe('useAllCasesModal', () => { it('opens the modal', async () => { const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal({ onRowClick }), + () => useAllCasesModal(defaultArgs), { wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, } @@ -81,7 +89,7 @@ describe('useAllCasesModal', () => { it('closes the modal', async () => { const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal({ onRowClick }), + () => useAllCasesModal(defaultArgs), { wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, } @@ -97,7 +105,7 @@ describe('useAllCasesModal', () => { it('returns a memoized value', async () => { const { result, rerender } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal({ onRowClick }), + () => useAllCasesModal(defaultArgs), { wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, } @@ -112,7 +120,7 @@ describe('useAllCasesModal', () => { it('closes the modal when clicking a row', async () => { const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal({ onRowClick }), + () => useAllCasesModal(defaultArgs), { wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, } diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx index 23cc11ef2ef28..597abf5804b41 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx @@ -6,13 +6,14 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import { CaseStatuses } from '../../../../../cases/common'; -import { Case, SubCase } from '../../containers/types'; +import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../../cases/common'; import { AllCasesModal } from './all_cases_modal'; export interface UseAllCasesModalProps { - onRowClick: (theCase?: Case | SubCase) => void; + alertData?: Omit<CommentRequestAlertType, 'type'>; disabledStatuses?: CaseStatuses[]; + onRowClick: (theCase?: Case | SubCase) => void; + updateCase?: (newCase: Case) => void; } export interface UseAllCasesModalReturnedValues { @@ -23,8 +24,10 @@ export interface UseAllCasesModalReturnedValues { } export const useAllCasesModal = ({ - onRowClick, + alertData, disabledStatuses, + onRowClick, + updateCase, }: UseAllCasesModalProps): UseAllCasesModalReturnedValues => { const [isModalOpen, setIsModalOpen] = useState<boolean>(false); const closeModal = useCallback(() => setIsModalOpen(false), []); @@ -41,10 +44,12 @@ export const useAllCasesModal = ({ () => ({ modal: ( <AllCasesModal + alertData={alertData} + disabledStatuses={disabledStatuses} isModalOpen={isModalOpen} onCloseCaseModal={closeModal} onRowClick={onClick} - disabledStatuses={disabledStatuses} + updateCase={updateCase} /> ), isModalOpen, @@ -52,7 +57,16 @@ export const useAllCasesModal = ({ openModal, onRowClick, }), - [isModalOpen, closeModal, onClick, disabledStatuses, openModal, onRowClick] + [ + alertData, + closeModal, + disabledStatuses, + isModalOpen, + onClick, + onRowClick, + openModal, + updateCase, + ] ); return state; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.test.tsx deleted file mode 100644 index 08fca0cc6e009..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.test.tsx +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/display-name */ -import React, { ReactNode } from 'react'; -import { mount } from 'enzyme'; - -import '../../../common/mock/match_media'; -import { CreateCaseModal } from './create_case_modal'; -import { TestProviders } from '../../../common/mock'; - -jest.mock('../create/form_context', () => { - return { - FormContext: ({ - children, - onSuccess, - }: { - children: ReactNode; - onSuccess: ({ id }: { id: string }) => Promise<void>; - }) => { - return ( - <> - <button - type="button" - data-test-subj="form-context-on-success" - onClick={async () => { - await onSuccess({ id: 'case-id' }); - }} - > - {'submit'} - </button> - {children} - </> - ); - }, - }; -}); - -jest.mock('../create/form', () => { - return { - CreateCaseForm: () => { - return <>{'form'}</>; - }, - }; -}); - -jest.mock('../create/submit_button', () => { - return { - SubmitCaseButton: () => { - return <>{'Submit'}</>; - }, - }; -}); - -const onCloseCaseModal = jest.fn(); -const onSuccess = jest.fn(); -const defaultProps = { - isModalOpen: true, - onCloseCaseModal, - onSuccess, -}; - -describe('CreateCaseModal', () => { - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('renders', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseModal {...defaultProps} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); - }); - - it('it does not render the modal isModalOpen=false ', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseModal {...defaultProps} isModalOpen={false} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); - }); - - it('Closing modal calls onCloseCaseModal', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseModal {...defaultProps} /> - </TestProviders> - ); - - wrapper.find('.euiModal__closeIcon').first().simulate('click'); - expect(onCloseCaseModal).toBeCalled(); - }); - - it('pass the correct props to FormContext component', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseModal {...defaultProps} /> - </TestProviders> - ); - - const props = wrapper.find('FormContext').props(); - expect(props).toEqual( - expect.objectContaining({ - onSuccess, - }) - ); - }); - - it('onSuccess called when creating a case', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseModal {...defaultProps} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj='form-context-on-success']`).first().simulate('click'); - expect(onSuccess).toHaveBeenCalledWith({ id: 'case-id' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx deleted file mode 100644 index 627dc61c36b0c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/create_case_modal.tsx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import styled from 'styled-components'; -import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; - -import { FormContext } from '../create/form_context'; -import { CreateCaseForm } from '../create/form'; -import { SubmitCaseButton } from '../create/submit_button'; -import { Case } from '../../containers/types'; -import * as i18n from '../../translations'; -import { CaseType } from '../../../../../cases/common'; - -export interface CreateCaseModalProps { - isModalOpen: boolean; - onCloseCaseModal: () => void; - onSuccess: (theCase: Case) => Promise<void>; - caseType?: CaseType; - hideConnectorServiceNowSir?: boolean; -} - -const Container = styled.div` - ${({ theme }) => ` - margin-top: ${theme.eui.euiSize}; - text-align: right; - `} -`; - -const CreateModalComponent: React.FC<CreateCaseModalProps> = ({ - isModalOpen, - onCloseCaseModal, - onSuccess, - caseType = CaseType.individual, - hideConnectorServiceNowSir = false, -}) => { - return isModalOpen ? ( - <EuiModal onClose={onCloseCaseModal} data-test-subj="all-cases-modal"> - <EuiModalHeader> - <EuiModalHeaderTitle>{i18n.CREATE_TITLE}</EuiModalHeaderTitle> - </EuiModalHeader> - <EuiModalBody> - <FormContext - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - caseType={caseType} - onSuccess={onSuccess} - > - <CreateCaseForm - withSteps={false} - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - /> - <Container> - <SubmitCaseButton /> - </Container> - </FormContext> - </EuiModalBody> - </EuiModal> - ) : null; -}; - -export const CreateCaseModal = memo(CreateModalComponent); - -CreateCaseModal.displayName = 'CreateCaseModal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.test.tsx deleted file mode 100644 index 5174c03e56e0b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.test.tsx +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/display-name */ -import React, { ReactNode } from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import { useKibana } from '../../../common/lib/kibana'; -import '../../../common/mock/match_media'; -import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; -import { mockTimelineModel, TestProviders } from '../../../common/mock'; -import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; - -jest.mock('../../../common/lib/kibana'); -jest.mock('../create/form_context', () => { - return { - FormContext: ({ - children, - onSuccess, - }: { - children: ReactNode; - onSuccess: ({ id }: { id: string }) => Promise<void>; - }) => { - return ( - <> - <button - type="button" - data-test-subj="form-context-on-success" - onClick={async () => { - await onSuccess({ id: 'case-id' }); - }} - > - {'Form submit'} - </button> - {children} - </> - ); - }, - }; -}); - -jest.mock('../create/form', () => { - return { - CreateCaseForm: () => { - return <>{'form'}</>; - }, - }; -}); - -jest.mock('../create/submit_button', () => { - return { - SubmitCaseButton: () => { - return <>{'Submit'}</>; - }, - }; -}); - -jest.mock('../../../common/hooks/use_selector'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; -const onCaseCreated = jest.fn(); - -describe('useCreateCaseModal', () => { - let navigateToApp: jest.Mock; - - beforeEach(() => { - navigateToApp = jest.fn(); - useKibanaMock().services.application.navigateToApp = navigateToApp; - (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); - }); - - it('init', async () => { - const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( - () => useCreateCaseModal({ onCaseCreated }), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - expect(result.current.isModalOpen).toBe(false); - }); - - it('opens the modal', async () => { - const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( - () => useCreateCaseModal({ onCaseCreated }), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - act(() => { - result.current.openModal(); - }); - - expect(result.current.isModalOpen).toBe(true); - }); - - it('closes the modal', async () => { - const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( - () => useCreateCaseModal({ onCaseCreated }), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - act(() => { - result.current.openModal(); - result.current.closeModal(); - }); - - expect(result.current.isModalOpen).toBe(false); - }); - - it('returns a memoized value', async () => { - const { result, rerender } = renderHook< - UseCreateCaseModalProps, - UseCreateCaseModalReturnedValues - >(() => useCreateCaseModal({ onCaseCreated }), { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - }); - - const result1 = result.current; - act(() => rerender()); - const result2 = result.current; - - expect(Object.is(result1, result2)).toBe(true); - }); - - it('closes the modal when creating a case', async () => { - const { result } = renderHook<UseCreateCaseModalProps, UseCreateCaseModalReturnedValues>( - () => useCreateCaseModal({ onCaseCreated }), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - act(() => { - result.current.openModal(); - }); - - const modal = result.current.modal; - render(<TestProviders>{modal}</TestProviders>); - - act(() => { - userEvent.click(screen.getByText('Form submit')); - }); - - expect(result.current.isModalOpen).toBe(false); - expect(onCaseCreated).toHaveBeenCalledWith({ id: 'case-id' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx deleted file mode 100644 index e29ee3f8712da..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_create_case_modal/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useState, useCallback, useMemo } from 'react'; -import { CaseType } from '../../../../../cases/common'; -import { Case } from '../../containers/types'; -import { CreateCaseModal } from './create_case_modal'; - -export interface UseCreateCaseModalProps { - onCaseCreated: (theCase: Case) => void; - caseType?: CaseType; - hideConnectorServiceNowSir?: boolean; -} -export interface UseCreateCaseModalReturnedValues { - modal: JSX.Element; - isModalOpen: boolean; - closeModal: () => void; - openModal: () => void; -} - -export const useCreateCaseModal = ({ - caseType = CaseType.individual, - onCaseCreated, - hideConnectorServiceNowSir = false, -}: UseCreateCaseModalProps) => { - const [isModalOpen, setIsModalOpen] = useState<boolean>(false); - const closeModal = useCallback(() => setIsModalOpen(false), []); - const openModal = useCallback(() => setIsModalOpen(true), []); - const onSuccess = useCallback( - async (theCase) => { - onCaseCreated(theCase); - closeModal(); - }, - [onCaseCreated, closeModal] - ); - - const state = useMemo( - () => ({ - modal: ( - <CreateCaseModal - caseType={caseType} - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - isModalOpen={isModalOpen} - onCloseCaseModal={closeModal} - onSuccess={onSuccess} - /> - ), - isModalOpen, - closeModal, - openModal, - }), - [caseType, closeModal, hideConnectorServiceNowSir, isModalOpen, onSuccess, openModal] - ); - - return state; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/helpers.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/helpers.tsx deleted file mode 100644 index 30d2cb720c031..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/helpers.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiLink } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React from 'react'; - -import * as i18n from './translations'; -import { ActionLicense } from '../../containers/types'; -import { ErrorMessage } from '../callout/types'; - -export const getLicenseError = () => ({ - id: 'license-error', - title: i18n.PUSH_DISABLE_BY_LICENSE_TITLE, - description: ( - <FormattedMessage - defaultMessage="Opening cases in external systems is available when you have the {appropriateLicense}, are using a {cloud}, or are testing out a Free Trial." - id="xpack.securitySolution.cases.caseView.pushToServiceDisableByLicenseDescription" - values={{ - appropriateLicense: ( - <EuiLink href="https://www.elastic.co/subscriptions" target="_blank"> - {i18n.LINK_APPROPRIATE_LICENSE} - </EuiLink> - ), - cloud: ( - <EuiLink href="https://www.elastic.co/cloud/elasticsearch-service/signup" target="_blank"> - {i18n.LINK_CLOUD_DEPLOYMENT} - </EuiLink> - ), - }} - /> - ), -}); - -export const getKibanaConfigError = () => ({ - id: 'kibana-config-error', - title: i18n.PUSH_DISABLE_BY_KIBANA_CONFIG_TITLE, - description: ( - <FormattedMessage - defaultMessage="The kibana.yml file is configured to only allow specific connectors. To enable opening a case in external systems, add .[actionTypeId] (ex: .servicenow | .jira) to the xpack.actions.enabledActiontypes setting. For more information, see {link}." - id="xpack.securitySolution.cases.caseView.pushToServiceDisableByConfigDescription" - values={{ - link: ( - <EuiLink href="#" target="_blank"> - {'coming soon...'} - </EuiLink> - ), - }} - /> - ), -}); - -export const getActionLicenseError = (actionLicense: ActionLicense | null): ErrorMessage[] => { - let errors: ErrorMessage[] = []; - if (actionLicense != null && !actionLicense.enabledInLicense) { - errors = [...errors, getLicenseError()]; - } - if (actionLicense != null && !actionLicense.enabledInConfig) { - errors = [...errors, getKibanaConfigError()]; - } - return errors; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx deleted file mode 100644 index 928d0167bbe85..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.test.tsx +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/display-name */ -import React from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; - -import '../../../common/mock/match_media'; -import { usePushToService, ReturnUsePushToService, UsePushToService } from '.'; -import { TestProviders } from '../../../common/mock'; - -import { CaseStatuses, ConnectorTypes } from '../../../../../cases/common'; -import { usePostPushToService } from '../../containers/use_post_push_to_service'; -import { basicPush, actionLicenses } from '../../containers/mock'; -import { useGetActionLicense } from '../../containers/use_get_action_license'; -import { connectorsMock } from '../../containers/configure/mock'; - -jest.mock('react-router-dom', () => { - const original = jest.requireActual('react-router-dom'); - - return { - ...original, - useHistory: () => ({ - useHistory: jest.fn(), - }), - }; -}); - -jest.mock('../../../common/components/link_to'); -jest.mock('../../containers/use_get_action_license'); -jest.mock('../../containers/use_post_push_to_service'); -jest.mock('../../containers/configure/api'); - -describe('usePushToService', () => { - const caseId = '12345'; - const updateCase = jest.fn(); - const pushCaseToExternalService = jest.fn(); - const mockPostPush = { - isLoading: false, - pushCaseToExternalService, - }; - - const mockConnector = connectorsMock[0]; - const actionLicense = actionLicenses[0]; - const caseServices = { - '123': { - ...basicPush, - firstPushIndex: 0, - lastPushIndex: 0, - commentsToUpdate: [], - hasDataToPush: true, - }, - }; - - const defaultArgs = { - connector: { - id: mockConnector.id, - name: mockConnector.name, - type: ConnectorTypes.serviceNowITSM, - fields: null, - }, - caseId, - caseServices, - caseStatus: CaseStatuses.open, - connectors: connectorsMock, - updateCase, - userCanCrud: true, - isValidConnector: true, - }; - - beforeEach(() => { - jest.resetAllMocks(); - (usePostPushToService as jest.Mock).mockImplementation(() => mockPostPush); - (useGetActionLicense as jest.Mock).mockImplementation(() => ({ - isLoading: false, - actionLicense, - })); - }); - - it('push case button posts the push with correct args', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => usePushToService(defaultArgs), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - result.current.pushButton.props.children.props.onClick(); - expect(pushCaseToExternalService).toBeCalledWith({ - caseId, - connector: { - fields: null, - id: 'servicenow-1', - name: 'My Connector', - type: ConnectorTypes.serviceNowITSM, - }, - }); - expect(result.current.pushCallouts).toBeNull(); - }); - }); - - it('Displays message when user does not have premium license', async () => { - (useGetActionLicense as jest.Mock).mockImplementation(() => ({ - isLoading: false, - actionLicense: { - ...actionLicense, - enabledInLicense: false, - }, - })); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => usePushToService(defaultArgs), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('license-error'); - }); - }); - - it('Displays message when user does not have case enabled in config', async () => { - (useGetActionLicense as jest.Mock).mockImplementation(() => ({ - isLoading: false, - actionLicense: { - ...actionLicense, - enabledInConfig: false, - }, - })); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => usePushToService(defaultArgs), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('kibana-config-error'); - }); - }); - - it('Displays message when user does not have any connector configured', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => - usePushToService({ - ...defaultArgs, - connectors: [], - connector: { - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, - }, - }), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('connector-missing-error'); - }); - }); - - it('Displays message when user does have a connector but is configured to none', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => - usePushToService({ - ...defaultArgs, - connector: { - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, - }, - }), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('connector-not-selected-error'); - }); - }); - - it('Displays message when connector is deleted', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => - usePushToService({ - ...defaultArgs, - connector: { - id: 'not-exist', - name: 'not-exist', - type: ConnectorTypes.none, - fields: null, - }, - isValidConnector: false, - }), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('connector-deleted-error'); - }); - }); - - it('Displays message when connector is deleted with empty connectors', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => - usePushToService({ - ...defaultArgs, - connectors: [], - connector: { - id: 'not-exist', - name: 'not-exist', - type: ConnectorTypes.none, - fields: null, - }, - isValidConnector: false, - }), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('connector-deleted-error'); - }); - }); - - it('Displays message when case is closed', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<UsePushToService, ReturnUsePushToService>( - () => - usePushToService({ - ...defaultArgs, - caseStatus: CaseStatuses.closed, - }), - { - wrapper: ({ children }) => <TestProviders> {children}</TestProviders>, - } - ); - await waitForNextUpdate(); - const errorsMsg = result.current.pushCallouts?.props.messages; - expect(errorsMsg).toHaveLength(1); - expect(errorsMsg[0].id).toEqual('closed-case-push-error'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx deleted file mode 100644 index 42284cfa7da49..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiToolTip } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { useCallback, useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { Case } from '../../containers/types'; -import { useGetActionLicense } from '../../containers/use_get_action_license'; -import { usePostPushToService } from '../../containers/use_post_push_to_service'; -import { getConfigureCasesUrl, useFormatUrl } from '../../../common/components/link_to'; -import { CaseCallOut } from '../callout'; -import { getLicenseError, getKibanaConfigError } from './helpers'; -import * as i18n from './translations'; -import { CaseConnector, ActionConnector, CaseStatuses } from '../../../../../cases/common'; -import { CaseServices } from '../../containers/use_get_case_user_actions'; -import { LinkAnchor } from '../../../common/components/links'; -import { SecurityPageName } from '../../../app/types'; -import { ErrorMessage } from '../callout/types'; - -export interface UsePushToService { - caseId: string; - caseStatus: string; - connector: CaseConnector; - caseServices: CaseServices; - connectors: ActionConnector[]; - updateCase: (newCase: Case) => void; - userCanCrud: boolean; - isValidConnector: boolean; -} - -export interface ReturnUsePushToService { - pushButton: JSX.Element; - pushCallouts: JSX.Element | null; -} - -export const usePushToService = ({ - connector, - caseId, - caseServices, - caseStatus, - connectors, - updateCase, - userCanCrud, - isValidConnector, -}: UsePushToService): ReturnUsePushToService => { - const history = useHistory(); - const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.case); - const { isLoading, pushCaseToExternalService } = usePostPushToService(); - - const { isLoading: loadingLicense, actionLicense } = useGetActionLicense(); - - const handlePushToService = useCallback(async () => { - if (connector.id != null && connector.id !== 'none') { - const theCase = await pushCaseToExternalService({ - caseId, - connector, - }); - - if (theCase != null) { - updateCase(theCase); - } - } - }, [caseId, connector, pushCaseToExternalService, updateCase]); - - const goToConfigureCases = useCallback( - (ev) => { - ev.preventDefault(); - history.push(getConfigureCasesUrl(urlSearch)); - }, - [history, urlSearch] - ); - - const errorsMsg = useMemo(() => { - let errors: ErrorMessage[] = []; - if (actionLicense != null && !actionLicense.enabledInLicense) { - errors = [...errors, getLicenseError()]; - } - if (connectors.length === 0 && connector.id === 'none' && !loadingLicense) { - errors = [ - ...errors, - { - id: 'connector-missing-error', - title: i18n.PUSH_DISABLE_BY_NO_CONFIG_TITLE, - description: ( - <FormattedMessage - defaultMessage="To open and update cases in external systems, you must configure a {link}." - id="xpack.securitySolution.cases.caseView.pushToServiceDisableByNoConnectors" - values={{ - link: ( - <LinkAnchor - onClick={goToConfigureCases} - href={formatUrl(getConfigureCasesUrl())} - target="_blank" - > - {i18n.LINK_CONNECTOR_CONFIGURE} - </LinkAnchor> - ), - }} - /> - ), - }, - ]; - } else if (connector.id === 'none' && !loadingLicense) { - errors = [ - ...errors, - { - id: 'connector-not-selected-error', - title: i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE, - description: ( - <FormattedMessage - defaultMessage="To open and update cases in external systems, you must select an external incident management system for this case." - id="xpack.securitySolution.cases.caseView.pushToServiceDisableByNoCaseConfigDescription" - /> - ), - }, - ]; - } else if (!isValidConnector && !loadingLicense) { - errors = [ - ...errors, - { - id: 'connector-deleted-error', - title: i18n.PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE, - description: ( - <FormattedMessage - defaultMessage="The connector used to send updates to external service has been deleted. To update cases in external systems, select a different connector or create a new one." - id="xpack.securitySolution.cases.caseView.pushToServiceDisableByInvalidConnector" - /> - ), - errorType: 'danger', - }, - ]; - } - if (caseStatus === CaseStatuses.closed) { - errors = [ - ...errors, - { - id: 'closed-case-push-error', - title: i18n.PUSH_DISABLE_BECAUSE_CASE_CLOSED_TITLE, - description: ( - <FormattedMessage - defaultMessage="Closed cases cannot be sent to external systems. Reopen the case if you want to open or update it in an external system." - id="xpack.securitySolution.cases.caseView.pushToServiceDisableBecauseCaseClosedDescription" - /> - ), - }, - ]; - } - if (actionLicense != null && !actionLicense.enabledInConfig) { - errors = [...errors, getKibanaConfigError()]; - } - return errors; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [actionLicense, caseStatus, connectors.length, connector, loadingLicense, urlSearch]); - - const pushToServiceButton = useMemo(() => { - return ( - <EuiButton - data-test-subj="push-to-external-service" - fill - iconType="importAction" - onClick={handlePushToService} - disabled={ - isLoading || loadingLicense || errorsMsg.length > 0 || !userCanCrud || !isValidConnector - } - isLoading={isLoading} - > - {caseServices[connector.id] - ? i18n.UPDATE_THIRD(connector.name) - : i18n.PUSH_THIRD(connector.name)} - </EuiButton> - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ - connector, - connectors, - errorsMsg, - handlePushToService, - isLoading, - loadingLicense, - userCanCrud, - isValidConnector, - ]); - - const objToReturn = useMemo(() => { - return { - pushButton: - errorsMsg.length > 0 ? ( - <EuiToolTip - position="top" - title={errorsMsg[0].title} - content={<p>{errorsMsg[0].description}</p>} - > - {pushToServiceButton} - </EuiToolTip> - ) : ( - <>{pushToServiceButton}</> - ), - pushCallouts: - errorsMsg.length > 0 ? ( - <CaseCallOut title={i18n.ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={errorsMsg} /> - ) : null, - }; - }, [errorsMsg, pushToServiceButton]); - - return objToReturn; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/translations.ts b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/translations.ts deleted file mode 100644 index 28a7312328b78..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/translations.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const ERROR_PUSH_SERVICE_CALLOUT_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.errorsPushServiceCallOutTitle', - { - defaultMessage: 'To send cases to external systems, you need to:', - } -); -export const PUSH_THIRD = (thirdParty: string) => { - if (thirdParty === 'none') { - return i18n.translate('xpack.securitySolution.cases.caseView.pushThirdPartyIncident', { - defaultMessage: 'Push as external incident', - }); - } - - return i18n.translate('xpack.securitySolution.cases.caseView.pushNamedIncident', { - values: { thirdParty }, - defaultMessage: 'Push as { thirdParty } incident', - }); -}; - -export const UPDATE_THIRD = (thirdParty: string) => { - if (thirdParty === 'none') { - return i18n.translate('xpack.securitySolution.cases.caseView.updateThirdPartyIncident', { - defaultMessage: 'Update external incident', - }); - } - - return i18n.translate('xpack.securitySolution.cases.caseView.updateNamedIncident', { - values: { thirdParty }, - defaultMessage: 'Update { thirdParty } incident', - }); -}; - -export const PUSH_DISABLE_BY_NO_CONFIG_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.pushToServiceDisableByNoConfigTitle', - { - defaultMessage: 'Configure external connector', - } -); - -export const PUSH_DISABLE_BY_NO_CASE_CONFIG_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.pushToServiceDisableByNoCaseConfigTitle', - { - defaultMessage: 'Select external connector', - } -); - -export const PUSH_DISABLE_BECAUSE_CASE_CLOSED_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.pushToServiceDisableBecauseCaseClosedTitle', - { - defaultMessage: 'Reopen the case', - } -); - -export const PUSH_DISABLE_BY_KIBANA_CONFIG_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.pushToServiceDisableByConfigTitle', - { - defaultMessage: 'Enable external service in Kibana configuration file', - } -); - -export const PUSH_DISABLE_BY_LICENSE_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.pushToServiceDisableByLicenseTitle', - { - defaultMessage: 'Upgrade to an appropriate license', - } -); - -export const LINK_CLOUD_DEPLOYMENT = i18n.translate( - 'xpack.securitySolution.cases.caseView.cloudDeploymentLink', - { - defaultMessage: 'cloud deployment', - } -); - -export const LINK_APPROPRIATE_LICENSE = i18n.translate( - 'xpack.securitySolution.cases.caseView.appropiateLicense', - { - defaultMessage: 'appropriate license', - } -); - -export const LINK_CONNECTOR_CONFIGURE = i18n.translate( - 'xpack.securitySolution.cases.caseView.connectorConfigureLink', - { - defaultMessage: 'connector', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx deleted file mode 100644 index 84408557eb5ae..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.test.tsx +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { CaseStatuses } from '../../../../../cases/common'; -import { basicPush, getUserAction } from '../../containers/mock'; -import { getLabelTitle, getPushedServiceLabelTitle, getConnectorLabelTitle } from './helpers'; -import { connectorsMock } from '../../containers/configure/mock'; -import * as i18n from './translations'; - -describe('User action tree helpers', () => { - const connectors = connectorsMock; - it('label title generated for update tags', () => { - const action = getUserAction(['tags'], 'update'); - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'tags', - }); - - const wrapper = mount(<>{result}</>); - expect(wrapper.find(`[data-test-subj="ua-tags-label"]`).first().text()).toEqual( - ` ${i18n.TAGS.toLowerCase()}` - ); - - expect(wrapper.find(`[data-test-subj="tag-${action.newValue}"]`).first().text()).toEqual( - action.newValue - ); - }); - - it('label title generated for update title', () => { - const action = getUserAction(['title'], 'update'); - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'title', - }); - - expect(result).toEqual( - `${i18n.CHANGED_FIELD.toLowerCase()} ${i18n.CASE_NAME.toLowerCase()} ${i18n.TO} "${ - action.newValue - }"` - ); - }); - - it('label title generated for update description', () => { - const action = getUserAction(['description'], 'update'); - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'description', - }); - - expect(result).toEqual(`${i18n.EDITED_FIELD} ${i18n.DESCRIPTION.toLowerCase()}`); - }); - - it('label title generated for update status to open', () => { - const action = { ...getUserAction(['status'], 'update'), newValue: CaseStatuses.open }; - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'status', - }); - - const wrapper = mount(<>{result}</>); - expect(wrapper.find(`[data-test-subj="status-badge-open"]`).first().text()).toEqual('Open'); - }); - - it('label title generated for update status to in-progress', () => { - const action = { - ...getUserAction(['status'], 'update'), - newValue: CaseStatuses['in-progress'], - }; - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'status', - }); - - const wrapper = mount(<>{result}</>); - expect(wrapper.find(`[data-test-subj="status-badge-in-progress"]`).first().text()).toEqual( - 'In progress' - ); - }); - - it('label title generated for update status to closed', () => { - const action = { ...getUserAction(['status'], 'update'), newValue: CaseStatuses.closed }; - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'status', - }); - - const wrapper = mount(<>{result}</>); - expect(wrapper.find(`[data-test-subj="status-badge-closed"]`).first().text()).toEqual('Closed'); - }); - - it('label title is empty when status is not valid', () => { - const action = { ...getUserAction(['status'], 'update'), newValue: CaseStatuses.closed }; - const result: string | JSX.Element = getLabelTitle({ - action: { ...action, newValue: 'not-exist' }, - field: 'status', - }); - - expect(result).toEqual(''); - }); - - it('label title generated for update comment', () => { - const action = getUserAction(['comment'], 'update'); - const result: string | JSX.Element = getLabelTitle({ - action, - field: 'comment', - }); - - expect(result).toEqual(`${i18n.EDITED_FIELD} ${i18n.COMMENT.toLowerCase()}`); - }); - - it('label title generated for pushed incident', () => { - const action = getUserAction(['pushed'], 'push-to-service'); - const result: string | JSX.Element = getPushedServiceLabelTitle(action, true); - - const wrapper = mount(<>{result}</>); - expect(wrapper.find(`[data-test-subj="pushed-label"]`).first().text()).toEqual( - `${i18n.PUSHED_NEW_INCIDENT} ${basicPush.connectorName}` - ); - expect(wrapper.find(`[data-test-subj="pushed-value"]`).first().prop('href')).toEqual( - JSON.parse(action.newValue).external_url - ); - }); - - it('label title generated for needs update incident', () => { - const action = getUserAction(['pushed'], 'push-to-service'); - const result: string | JSX.Element = getPushedServiceLabelTitle(action, false); - - const wrapper = mount(<>{result}</>); - expect(wrapper.find(`[data-test-subj="pushed-label"]`).first().text()).toEqual( - `${i18n.UPDATE_INCIDENT} ${basicPush.connectorName}` - ); - expect(wrapper.find(`[data-test-subj="pushed-value"]`).first().prop('href')).toEqual( - JSON.parse(action.newValue).external_url - ); - }); - - it('label title generated for update connector - change connector', () => { - const action = { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: 'servicenow-1' }), - newValue: JSON.stringify({ id: 'resilient-2' }), - }; - const result: string | JSX.Element = getConnectorLabelTitle({ - action, - connectors, - }); - - expect(result).toEqual('selected My Connector 2 as incident management system'); - }); - - it('label title generated for update connector - change connector to none', () => { - const action = { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: 'servicenow-1' }), - newValue: JSON.stringify({ id: 'none' }), - }; - const result: string | JSX.Element = getConnectorLabelTitle({ - action, - connectors, - }); - - expect(result).toEqual('removed external incident management system'); - }); - - it('label title generated for update connector - field change', () => { - const action = { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: 'servicenow-1' }), - newValue: JSON.stringify({ id: 'servicenow-1' }), - }; - const result: string | JSX.Element = getConnectorLabelTitle({ - action, - connectors, - }); - - expect(result).toEqual('changed connector field'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx deleted file mode 100644 index a97e2e98cb9af..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/helpers.tsx +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, EuiCommentProps } from '@elastic/eui'; -import { isObject, get, isString, isNumber, isEmpty } from 'lodash'; -import React, { useMemo } from 'react'; - -import { SearchResponse } from 'elasticsearch'; -import { - CaseFullExternalService, - ActionConnector, - CaseStatuses, - CommentType, -} from '../../../../../cases/common'; -import { CaseUserActions } from '../../containers/types'; -import { CaseServices } from '../../containers/use_get_case_user_actions'; -import { parseString } from '../../containers/utils'; -import { Tags } from '../tag_list/tags'; -import { UserActionUsernameWithAvatar } from './user_action_username_with_avatar'; -import { UserActionTimestamp } from './user_action_timestamp'; -import { UserActionCopyLink } from './user_action_copy_link'; -import { UserActionMoveToReference } from './user_action_move_to_reference'; -import { Status, statuses } from '../status'; -import { UserActionShowAlert } from './user_action_show_alert'; -import * as i18n from './translations'; -import { AlertCommentEvent } from './user_action_alert_comment_event'; -import { InvestigateInTimelineAction } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_timeline_action'; -import { Ecs } from '../../../../common/ecs'; -import { TimelineNonEcsData } from '../../../../common/search_strategy'; -import { useSourcererScope } from '../../../common/containers/sourcerer'; -import { SourcererScopeName } from '../../../common/store/sourcerer/model'; -import { buildAlertsQuery } from '../case_view/helpers'; -import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; -import { KibanaServices } from '../../../common/lib/kibana'; -import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../common/constants'; - -interface LabelTitle { - action: CaseUserActions; - field: string; -} - -const getStatusTitle = (id: string, status: CaseStatuses) => { - return ( - <EuiFlexGroup - gutterSize="s" - alignItems={'center'} - data-test-subj={`${id}-user-action-status-title`} - > - <EuiFlexItem grow={false}>{i18n.MARKED_CASE_AS}</EuiFlexItem> - <EuiFlexItem grow={false}> - <Status type={status} /> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -const isStatusValid = (status: string): status is CaseStatuses => - Object.prototype.hasOwnProperty.call(statuses, status); - -export const getLabelTitle = ({ action, field }: LabelTitle) => { - if (field === 'tags') { - return getTagsLabelTitle(action); - } else if (field === 'title' && action.action === 'update') { - return `${i18n.CHANGED_FIELD.toLowerCase()} ${i18n.CASE_NAME.toLowerCase()} ${i18n.TO} "${ - action.newValue - }"`; - } else if (field === 'description' && action.action === 'update') { - return `${i18n.EDITED_FIELD} ${i18n.DESCRIPTION.toLowerCase()}`; - } else if (field === 'status' && action.action === 'update') { - const status = action.newValue ?? ''; - if (isStatusValid(status)) { - return getStatusTitle(action.actionId, status); - } - - return ''; - } else if (field === 'comment' && action.action === 'update') { - return `${i18n.EDITED_FIELD} ${i18n.COMMENT.toLowerCase()}`; - } - - return ''; -}; - -export const getConnectorLabelTitle = ({ - action, - connectors, -}: { - action: CaseUserActions; - connectors: ActionConnector[]; -}) => { - const oldValue = parseString(`${action.oldValue}`); - const newValue = parseString(`${action.newValue}`); - - if (oldValue === null || newValue === null) { - return ''; - } - - // Connector changed - if (oldValue.id !== newValue.id) { - const newConnector = connectors.find((c) => c.id === newValue.id); - return newValue.id != null && newValue.id !== 'none' && newConnector != null - ? i18n.SELECTED_THIRD_PARTY(newConnector.name) - : i18n.REMOVED_THIRD_PARTY; - } else { - // Field changed - return i18n.CHANGED_CONNECTOR_FIELD; - } -}; - -const getTagsLabelTitle = (action: CaseUserActions) => { - const tags = action.newValue != null ? action.newValue.split(',') : []; - - return ( - <EuiFlexGroup alignItems="baseline" gutterSize="xs" component="span"> - <EuiFlexItem data-test-subj="ua-tags-label" grow={false}> - {action.action === 'add' && i18n.ADDED_FIELD} - {action.action === 'delete' && i18n.REMOVED_FIELD} {i18n.TAGS.toLowerCase()} - </EuiFlexItem> - <EuiFlexItem grow={false}> - <Tags tags={tags} gutterSize="xs" /> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const getPushedServiceLabelTitle = (action: CaseUserActions, firstPush: boolean) => { - const pushedVal = JSON.parse(action.newValue ?? '') as CaseFullExternalService; - return ( - <EuiFlexGroup alignItems="baseline" gutterSize="xs" data-test-subj="pushed-service-label-title"> - <EuiFlexItem data-test-subj="pushed-label"> - {`${firstPush ? i18n.PUSHED_NEW_INCIDENT : i18n.UPDATE_INCIDENT} ${ - pushedVal?.connector_name - }`} - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiLink data-test-subj="pushed-value" href={pushedVal?.external_url} target="_blank"> - {pushedVal?.external_title} - </EuiLink> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const getPushInfo = ( - caseServices: CaseServices, - parsedValue: { connector_id: string; connector_name: string }, - index: number -) => - parsedValue != null - ? { - firstPush: caseServices[parsedValue.connector_id]?.firstPushIndex === index, - parsedConnectorId: parsedValue.connector_id, - parsedConnectorName: parsedValue.connector_name, - } - : { - firstPush: false, - parsedConnectorId: 'none', - parsedConnectorName: 'none', - }; - -const getUpdateActionIcon = (actionField: string): string => { - if (actionField === 'tags') { - return 'tag'; - } else if (actionField === 'status') { - return 'folderClosed'; - } - - return 'dot'; -}; - -export const getUpdateAction = ({ - action, - label, - handleOutlineComment, -}: { - action: CaseUserActions; - label: string | JSX.Element; - handleOutlineComment: (id: string) => void; -}): EuiCommentProps => ({ - username: ( - <UserActionUsernameWithAvatar - username={action.actionBy.username} - fullName={action.actionBy.fullName} - /> - ), - type: 'update', - event: label, - 'data-test-subj': `${action.actionField[0]}-${action.action}-action-${action.actionId}`, - timestamp: <UserActionTimestamp createdAt={action.actionAt} />, - timelineIcon: getUpdateActionIcon(action.actionField[0]), - actions: ( - <EuiFlexGroup> - <EuiFlexItem> - <UserActionCopyLink id={action.actionId} /> - </EuiFlexItem> - {action.action === 'update' && action.commentId != null && ( - <EuiFlexItem> - <UserActionMoveToReference id={action.commentId} outlineComment={handleOutlineComment} /> - </EuiFlexItem> - )} - </EuiFlexGroup> - ), -}); - -export const getAlertAttachment = ({ - action, - alertId, - index, - loadingAlertData, - ruleId, - ruleName, - onShowAlertDetails, -}: { - action: CaseUserActions; - onShowAlertDetails: (alertId: string, index: string) => void; - alertId: string; - index: string; - loadingAlertData: boolean; - ruleId?: string | null; - ruleName?: string | null; -}): EuiCommentProps => { - return { - username: ( - <UserActionUsernameWithAvatar - username={action.actionBy.username} - fullName={action.actionBy.fullName} - /> - ), - className: 'comment-alert', - type: 'update', - event: ( - <AlertCommentEvent - alertId={alertId} - loadingAlertData={loadingAlertData} - ruleId={ruleId} - ruleName={ruleName} - commentType={CommentType.alert} - /> - ), - 'data-test-subj': `${action.actionField[0]}-${action.action}-action-${action.actionId}`, - timestamp: <UserActionTimestamp createdAt={action.actionAt} />, - timelineIcon: 'bell', - actions: ( - <EuiFlexGroup> - <EuiFlexItem> - <UserActionCopyLink id={action.actionId} /> - </EuiFlexItem> - <EuiFlexItem> - <UserActionShowAlert - id={action.actionId} - alertId={alertId} - index={index} - onShowAlertDetails={onShowAlertDetails} - /> - </EuiFlexItem> - </EuiFlexGroup> - ), - }; -}; - -export const toStringArray = (value: unknown): string[] => { - if (Array.isArray(value)) { - return value.reduce<string[]>((acc, v) => { - if (v != null) { - switch (typeof v) { - case 'number': - case 'boolean': - return [...acc, v.toString()]; - case 'object': - try { - return [...acc, JSON.stringify(v)]; - } catch { - return [...acc, 'Invalid Object']; - } - case 'string': - return [...acc, v]; - default: - return [...acc, `${v}`]; - } - } - return acc; - }, []); - } else if (value == null) { - return []; - } else if (!Array.isArray(value) && typeof value === 'object') { - try { - return [JSON.stringify(value)]; - } catch { - return ['Invalid Object']; - } - } else { - return [`${value}`]; - } -}; - -export const formatAlertToEcsSignal = (alert: {}): Ecs => - Object.keys(alert).reduce<Ecs>((accumulator, key) => { - const item = get(alert, key); - if (item != null && isObject(item)) { - return { ...accumulator, [key]: formatAlertToEcsSignal(item) }; - } else if (Array.isArray(item) || isString(item) || isNumber(item)) { - return { ...accumulator, [key]: toStringArray(item) }; - } - return accumulator; - }, {} as Ecs); - -const EMPTY_ARRAY: TimelineNonEcsData[] = []; -export const getGeneratedAlertsAttachment = ({ - action, - alertIds, - ruleId, - ruleName, -}: { - action: CaseUserActions; - alertIds: string[]; - ruleId: string; - ruleName: string; -}): EuiCommentProps => { - const fetchEcsAlertsData = async (fetchAlertIds?: string[]): Promise<Ecs[]> => { - if (isEmpty(fetchAlertIds)) { - return []; - } - const alertResponse = await KibanaServices.get().http.fetch< - SearchResponse<{ '@timestamp': string; [key: string]: unknown }> - >(DETECTION_ENGINE_QUERY_SIGNALS_URL, { - method: 'POST', - body: JSON.stringify(buildAlertsQuery(fetchAlertIds ?? [])), - }); - return ( - alertResponse?.hits.hits.reduce<Ecs[]>( - (acc, { _id, _index, _source }) => [ - ...acc, - { - ...formatAlertToEcsSignal(_source as {}), - _id, - _index, - timestamp: _source['@timestamp'], - }, - ], - [] - ) ?? [] - ); - }; - return { - username: <EuiIcon type="logoSecurity" size="m" />, - className: 'comment-alert', - type: 'update', - event: ( - <AlertCommentEvent - alertId={alertIds[0]} - ruleId={ruleId} - ruleName={ruleName} - alertsCount={alertIds.length} - commentType={CommentType.generatedAlert} - /> - ), - 'data-test-subj': `${action.actionField[0]}-${action.action}-action-${action.actionId}`, - timestamp: <UserActionTimestamp createdAt={action.actionAt} />, - timelineIcon: 'bell', - actions: ( - <EuiFlexGroup> - <EuiFlexItem> - <UserActionCopyLink id={action.actionId} /> - </EuiFlexItem> - <EuiFlexItem> - <InvestigateInTimelineAction - ariaLabel={i18n.SEND_ALERT_TO_TIMELINE} - alertIds={alertIds} - key="investigate-in-timeline" - ecsRowData={null} - fetchEcsAlertsData={fetchEcsAlertsData} - nonEcsRowData={EMPTY_ARRAY} - /> - </EuiFlexItem> - </EuiFlexGroup> - ), - }; -}; - -interface Signal { - rule: { - id: string; - name: string; - to: string; - from: string; - }; -} - -interface SignalHit { - _id: string; - _index: string; - _source: { - '@timestamp': string; - signal: Signal; - }; -} - -export interface Alert { - _id: string; - _index: string; - '@timestamp': string; - signal: Signal; - [key: string]: unknown; -} - -export const useFetchAlertData = (alertIds: string[]): [boolean, Record<string, Ecs>] => { - const { selectedPatterns } = useSourcererScope(SourcererScopeName.detections); - const alertsQuery = useMemo(() => buildAlertsQuery(alertIds), [alertIds]); - - const { loading: isLoadingAlerts, data: alertsData } = useQueryAlerts<SignalHit, unknown>( - alertsQuery, - selectedPatterns[0] - ); - - const alerts = useMemo( - () => - alertsData?.hits.hits.reduce<Record<string, Ecs>>( - (acc, { _id, _index, _source }) => ({ - ...acc, - [_id]: { - ...formatAlertToEcsSignal(_source), - _id, - _index, - timestamp: _source['@timestamp'], - }, - }), - {} - ) ?? {}, - [alertsData?.hits.hits] - ); - - return [isLoadingAlerts, alerts]; -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.test.tsx deleted file mode 100644 index 056add32add82..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.test.tsx +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor } from '@testing-library/react'; - -import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { getFormMock, useFormMock, useFormDataMock } from '../__mock__/form'; -import { useUpdateComment } from '../../containers/use_update_comment'; -import { basicCase, basicPush, getUserAction } from '../../containers/mock'; -import { UserActionTree } from '.'; -import { TestProviders } from '../../../common/mock'; - -const fetchUserActions = jest.fn(); -const onUpdateField = jest.fn(); -const updateCase = jest.fn(); -const onShowAlertDetails = jest.fn(); - -const defaultProps = { - caseServices: {}, - caseUserActions: [], - connectors: [], - data: basicCase, - fetchUserActions, - isLoadingDescription: false, - isLoadingUserActions: false, - onUpdateField, - updateCase, - userCanCrud: true, - alerts: {}, - onShowAlertDetails, -}; -const useUpdateCommentMock = useUpdateComment as jest.Mock; -jest.mock('../../containers/use_update_comment'); -jest.mock('./user_action_timestamp'); - -const patchComment = jest.fn(); -describe('UserActionTree ', () => { - const sampleData = { - content: 'what a great comment update', - }; - beforeEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); - useUpdateCommentMock.mockImplementation(() => ({ - isLoadingIds: [], - patchComment, - })); - const formHookMock = getFormMock(sampleData); - useFormMock.mockImplementation(() => ({ form: formHookMock })); - useFormDataMock.mockImplementation(() => [{ content: sampleData.content, comment: '' }]); - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); - jest - .spyOn(routeData, 'useParams') - .mockReturnValue({ detailName: 'case-id', subCaseId: 'sub-case-id' }); - }); - - it('Loading spinner when user actions loading and displays fullName/username', () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...{ ...defaultProps, isLoadingUserActions: true }} /> - </Router> - </TestProviders> - ); - expect(wrapper.find(`[data-test-subj="user-actions-loading"]`).exists()).toBeTruthy(); - - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().prop('name')).toEqual( - defaultProps.data.createdBy.fullName - ); - - expect( - wrapper.find(`[data-test-subj="description-action"] figcaption strong`).first().text() - ).toEqual(defaultProps.data.createdBy.username); - }); - - it('Renders service now update line with top and bottom when push is required', async () => { - const ourActions = [ - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'update'), - ]; - - const props = { - ...defaultProps, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 0, - lastPushIndex: 0, - commentsToUpdate: [`${ourActions[ourActions.length - 1].commentId}`], - hasDataToPush: true, - }, - }, - caseUserActions: ourActions, - }; - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toBeTruthy(); - }); - }); - - it('Renders service now update line with top only when push is up to date', async () => { - const ourActions = [getUserAction(['pushed'], 'push-to-service')]; - const props = { - ...defaultProps, - caseUserActions: ourActions, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 0, - lastPushIndex: 0, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }; - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toBeFalsy(); - }); - }); - - it('Outlines comment when update move to link is clicked', async () => { - const ourActions = [getUserAction(['comment'], 'create'), getUserAction(['comment'], 'update')]; - const props = { - ...defaultProps, - caseUserActions: ourActions, - }; - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper - .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) - .first() - .hasClass('outlined') - ).toBeFalsy(); - - wrapper - .find( - `[data-test-subj="comment-update-action-${ourActions[1].actionId}"] [data-test-subj="move-to-link-${props.data.comments[0].id}"]` - ) - .first() - .simulate('click'); - - wrapper.update(); - expect( - wrapper - .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) - .first() - .hasClass('outlined') - ).toBeTruthy(); - }); - }); - - it('Switches to markdown when edit is clicked and back to panel when canceled', async () => { - const ourActions = [getUserAction(['comment'], 'create')]; - const props = { - ...defaultProps, - caseUserActions: ourActions, - }; - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - expect( - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(false); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-ellipses"]` - ) - .first() - .simulate('click'); - - wrapper.update(); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-pencil"]` - ) - .first() - .simulate('click'); - - expect( - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(true); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-cancel-markdown"]` - ) - .first() - .simulate('click'); - - expect( - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(false); - }); - }); - - it('calls update comment when comment markdown is saved', async () => { - const ourActions = [getUserAction(['comment'], 'create')]; - const props = { - ...defaultProps, - caseUserActions: ourActions, - }; - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-ellipses"]` - ) - .first() - .simulate('click'); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-pencil"]` - ) - .first() - .simulate('click'); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-save-markdown"]` - ) - .first() - .simulate('click'); - - await waitFor(() => { - wrapper.update(); - expect( - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(false); - expect(patchComment).toBeCalledWith({ - commentUpdate: sampleData.content, - caseId: 'case-id', - subCaseId: 'sub-case-id', - commentId: props.data.comments[0].id, - fetchUserActions, - updateCase, - version: props.data.comments[0].version, - }); - }); - }); - - it('calls update description when description markdown is saved', async () => { - const props = defaultProps; - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-ellipses"]`) - .first() - .simulate('click'); - - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-pencil"]`) - .first() - .simulate('click'); - - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="user-action-save-markdown"]`) - .first() - .simulate('click'); - await waitFor(() => { - wrapper.update(); - - expect( - wrapper - .find( - `[data-test-subj="description-action"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(false); - - expect(onUpdateField).toBeCalledWith({ key: 'description', value: sampleData.content }); - }); - }); - - it('quotes', async () => { - const commentData = { - comment: '', - }; - const setFieldValue = jest.fn(); - - const formHookMock = getFormMock(commentData); - useFormMock.mockImplementation(() => ({ form: { ...formHookMock, setFieldValue } })); - - const props = defaultProps; - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-ellipses"]`) - .first() - .simulate('click'); - - await waitFor(() => { - wrapper.update(); - - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-quote"]`) - .first() - .simulate('click'); - }); - - expect(setFieldValue).toBeCalledWith('comment', `> ${props.data.description} \n`); - }); - - it('Outlines comment when url param is provided', async () => { - const commentId = 'basic-comment-id'; - jest.spyOn(routeData, 'useParams').mockReturnValue({ commentId }); - - const ourActions = [getUserAction(['comment'], 'create')]; - const props = { - ...defaultProps, - caseUserActions: ourActions, - }; - - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionTree {...props} /> - </Router> - </TestProviders> - ); - - await waitFor(() => { - wrapper.update(); - expect( - wrapper - .find(`[data-test-subj="comment-create-action-${commentId}"]`) - .first() - .hasClass('outlined') - ).toBeTruthy(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx deleted file mode 100644 index d372d62ab16bb..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx +++ /dev/null @@ -1,551 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiFlexGroup, - EuiFlexItem, - EuiLoadingSpinner, - EuiCommentList, - EuiCommentProps, -} from '@elastic/eui'; -import classNames from 'classnames'; -import { isEmpty } from 'lodash'; -import React, { useCallback, useMemo, useRef, useState, useEffect } from 'react'; -import { useParams } from 'react-router-dom'; -import styled from 'styled-components'; -import { isRight } from 'fp-ts/Either'; - -import * as i18n from './translations'; - -import { Case, CaseUserActions } from '../../containers/types'; -import { useUpdateComment } from '../../containers/use_update_comment'; -import { useCurrentUser } from '../../../common/lib/kibana'; -import { AddComment, AddCommentRefObject } from '../add_comment'; -import { - ActionConnector, - AlertCommentRequestRt, - CommentType, - ContextTypeUserRt, -} from '../../../../../cases/common'; -import { CaseServices } from '../../containers/use_get_case_user_actions'; -import { parseString } from '../../containers/utils'; -import { OnUpdateFields } from '../case_view'; -import { - getConnectorLabelTitle, - getLabelTitle, - getPushedServiceLabelTitle, - getPushInfo, - getUpdateAction, - getAlertAttachment, - getGeneratedAlertsAttachment, - useFetchAlertData, -} from './helpers'; -import { UserActionAvatar } from './user_action_avatar'; -import { UserActionMarkdown } from './user_action_markdown'; -import { UserActionTimestamp } from './user_action_timestamp'; -import { UserActionUsername } from './user_action_username'; -import { UserActionContentToolbar } from './user_action_content_toolbar'; -import { getManualAlertIdsWithNoRuleId } from '../case_view/helpers'; - -export interface UserActionTreeProps { - caseServices: CaseServices; - caseUserActions: CaseUserActions[]; - connectors: ActionConnector[]; - data: Case; - fetchUserActions: () => void; - isLoadingDescription: boolean; - isLoadingUserActions: boolean; - onUpdateField: ({ key, value, onSuccess, onError }: OnUpdateFields) => void; - updateCase: (newCase: Case) => void; - userCanCrud: boolean; - onShowAlertDetails: (alertId: string, index: string) => void; -} - -const MyEuiFlexGroup = styled(EuiFlexGroup)` - margin-bottom: 8px; -`; - -const MyEuiCommentList = styled(EuiCommentList)` - ${({ theme }) => ` - & .userAction__comment.outlined .euiCommentEvent { - outline: solid 5px ${theme.eui.euiColorVis1_behindText}; - margin: 0.5em; - transition: 0.8s; - } - - & .euiComment.isEdit { - & .euiCommentEvent { - border: none; - box-shadow: none; - } - - & .euiCommentEvent__body { - padding: 0; - } - - & .euiCommentEvent__header { - display: none; - } - } - - & .comment-alert .euiCommentEvent { - background-color: ${theme.eui.euiColorLightestShade}; - border: ${theme.eui.euiFlyoutBorder}; - padding: 10px; - border-radius: ${theme.eui.paddingSizes.xs}; - } - - & .comment-alert .euiCommentEvent__headerData { - flex-grow: 1; - } - `} -`; - -const DESCRIPTION_ID = 'description'; -const NEW_ID = 'newComment'; - -export const UserActionTree = React.memo( - ({ - data: caseData, - caseServices, - caseUserActions, - connectors, - fetchUserActions, - isLoadingDescription, - isLoadingUserActions, - onUpdateField, - updateCase, - userCanCrud, - onShowAlertDetails, - }: UserActionTreeProps) => { - const { detailName: caseId, commentId, subCaseId } = useParams<{ - detailName: string; - commentId?: string; - subCaseId?: string; - }>(); - const handlerTimeoutId = useRef(0); - const addCommentRef = useRef<AddCommentRefObject>(null); - const [initLoading, setInitLoading] = useState(true); - const [selectedOutlineCommentId, setSelectedOutlineCommentId] = useState(''); - const { isLoadingIds, patchComment } = useUpdateComment(); - const currentUser = useCurrentUser(); - const [manageMarkdownEditIds, setManangeMardownEditIds] = useState<string[]>([]); - - const [loadingAlertData, manualAlertsData] = useFetchAlertData( - getManualAlertIdsWithNoRuleId(caseData.comments) - ); - - const handleManageMarkdownEditId = useCallback( - (id: string) => { - if (!manageMarkdownEditIds.includes(id)) { - setManangeMardownEditIds([...manageMarkdownEditIds, id]); - } else { - setManangeMardownEditIds(manageMarkdownEditIds.filter((myId) => id !== myId)); - } - }, - [manageMarkdownEditIds] - ); - - const handleSaveComment = useCallback( - ({ id, version }: { id: string; version: string }, content: string) => { - patchComment({ - caseId, - commentId: id, - commentUpdate: content, - fetchUserActions, - version, - updateCase, - subCaseId, - }); - }, - [caseId, fetchUserActions, patchComment, subCaseId, updateCase] - ); - - const handleOutlineComment = useCallback( - (id: string) => { - const moveToTarget = document.getElementById(`${id}-permLink`); - if (moveToTarget != null) { - const yOffset = -60; - const y = moveToTarget.getBoundingClientRect().top + window.pageYOffset + yOffset; - window.scrollTo({ - top: y, - behavior: 'smooth', - }); - if (id === 'add-comment') { - moveToTarget.getElementsByTagName('textarea')[0].focus(); - } - } - window.clearTimeout(handlerTimeoutId.current); - setSelectedOutlineCommentId(id); - handlerTimeoutId.current = window.setTimeout(() => { - setSelectedOutlineCommentId(''); - window.clearTimeout(handlerTimeoutId.current); - }, 2400); - }, - [handlerTimeoutId] - ); - - const handleManageQuote = useCallback( - (quote: string) => { - const addCarrots = quote.replace(new RegExp('\r?\n', 'g'), ' \n> '); - - if (addCommentRef && addCommentRef.current) { - addCommentRef.current.addQuote(`> ${addCarrots} \n`); - } - - handleOutlineComment('add-comment'); - }, - [handleOutlineComment] - ); - - const handleUpdate = useCallback( - (newCase: Case) => { - updateCase(newCase); - fetchUserActions(); - }, - [fetchUserActions, updateCase] - ); - - const MarkdownDescription = useMemo( - () => ( - <UserActionMarkdown - id={DESCRIPTION_ID} - content={caseData.description} - isEditable={manageMarkdownEditIds.includes(DESCRIPTION_ID)} - onSaveContent={(content: string) => { - onUpdateField({ key: DESCRIPTION_ID, value: content }); - }} - onChangeEditable={handleManageMarkdownEditId} - /> - ), - [caseData.description, handleManageMarkdownEditId, manageMarkdownEditIds, onUpdateField] - ); - - const MarkdownNewComment = useMemo( - () => ( - <AddComment - caseId={caseId} - disabled={!userCanCrud} - ref={addCommentRef} - onCommentPosted={handleUpdate} - onCommentSaving={handleManageMarkdownEditId.bind(null, NEW_ID)} - showLoading={false} - subCaseId={subCaseId} - /> - ), - [caseId, userCanCrud, handleUpdate, handleManageMarkdownEditId, subCaseId] - ); - - useEffect(() => { - if (initLoading && !isLoadingUserActions && isLoadingIds.length === 0) { - setInitLoading(false); - if (commentId != null) { - handleOutlineComment(commentId); - } - } - }, [commentId, initLoading, isLoadingUserActions, isLoadingIds, handleOutlineComment]); - - const descriptionCommentListObj: EuiCommentProps = useMemo( - () => ({ - username: ( - <UserActionUsername - username={caseData.createdBy.username} - fullName={caseData.createdBy.fullName} - /> - ), - event: i18n.ADDED_DESCRIPTION, - 'data-test-subj': 'description-action', - timestamp: <UserActionTimestamp createdAt={caseData.createdAt} />, - children: MarkdownDescription, - timelineIcon: ( - <UserActionAvatar - username={caseData.createdBy.username} - fullName={caseData.createdBy.fullName} - /> - ), - className: classNames({ - isEdit: manageMarkdownEditIds.includes(DESCRIPTION_ID), - }), - actions: ( - <UserActionContentToolbar - id={DESCRIPTION_ID} - editLabel={i18n.EDIT_DESCRIPTION} - quoteLabel={i18n.QUOTE} - disabled={!userCanCrud} - isLoading={isLoadingDescription} - onEdit={handleManageMarkdownEditId.bind(null, DESCRIPTION_ID)} - onQuote={handleManageQuote.bind(null, caseData.description)} - /> - ), - }), - [ - MarkdownDescription, - caseData, - handleManageMarkdownEditId, - handleManageQuote, - isLoadingDescription, - userCanCrud, - manageMarkdownEditIds, - ] - ); - - const userActions: EuiCommentProps[] = useMemo( - () => - caseUserActions.reduce<EuiCommentProps[]>( - // eslint-disable-next-line complexity - (comments, action, index) => { - // Comment creation - if (action.commentId != null && action.action === 'create') { - const comment = caseData.comments.find((c) => c.id === action.commentId); - if ( - comment != null && - isRight(ContextTypeUserRt.decode(comment)) && - comment.type === CommentType.user - ) { - return [ - ...comments, - { - username: ( - <UserActionUsername - username={comment.createdBy.username} - fullName={comment.createdBy.fullName} - /> - ), - 'data-test-subj': `comment-create-action-${comment.id}`, - timestamp: ( - <UserActionTimestamp - createdAt={comment.createdAt} - updatedAt={comment.updatedAt} - /> - ), - className: classNames('userAction__comment', { - outlined: comment.id === selectedOutlineCommentId, - isEdit: manageMarkdownEditIds.includes(comment.id), - }), - children: ( - <UserActionMarkdown - id={comment.id} - content={comment.comment} - isEditable={manageMarkdownEditIds.includes(comment.id)} - onChangeEditable={handleManageMarkdownEditId} - onSaveContent={handleSaveComment.bind(null, { - id: comment.id, - version: comment.version, - })} - /> - ), - timelineIcon: ( - <UserActionAvatar - username={comment.createdBy.username} - fullName={comment.createdBy.fullName} - /> - ), - actions: ( - <UserActionContentToolbar - id={comment.id} - editLabel={i18n.EDIT_COMMENT} - quoteLabel={i18n.QUOTE} - disabled={!userCanCrud} - isLoading={isLoadingIds.includes(comment.id)} - onEdit={handleManageMarkdownEditId.bind(null, comment.id)} - onQuote={handleManageQuote.bind(null, comment.comment)} - /> - ), - }, - ]; - } else if ( - comment != null && - isRight(AlertCommentRequestRt.decode(comment)) && - comment.type === CommentType.alert - ) { - // TODO: clean this up - const alertId = Array.isArray(comment.alertId) - ? comment.alertId.length > 0 - ? comment.alertId[0] - : '' - : comment.alertId; - - const alertIndex = Array.isArray(comment.index) - ? comment.index.length > 0 - ? comment.index[0] - : '' - : comment.index; - - if (isEmpty(alertId)) { - return comments; - } - - const ruleId = - comment?.rule?.id ?? manualAlertsData[alertId]?.signal?.rule?.id?.[0] ?? null; - const ruleName = - comment?.rule?.name ?? manualAlertsData[alertId]?.signal?.rule?.name?.[0] ?? null; - - return [ - ...comments, - getAlertAttachment({ - action, - alertId, - index: alertIndex, - loadingAlertData, - ruleId, - ruleName, - onShowAlertDetails, - }), - ]; - } else if (comment != null && comment.type === CommentType.generatedAlert) { - // TODO: clean this up - const alertIds = Array.isArray(comment.alertId) - ? comment.alertId - : [comment.alertId]; - - if (isEmpty(alertIds)) { - return comments; - } - - return [ - ...comments, - getGeneratedAlertsAttachment({ - action, - alertIds, - ruleId: comment.rule?.id ?? '', - ruleName: comment.rule?.name ?? i18n.UNKNOWN_RULE, - }), - ]; - } - } - - // Connectors - if (action.actionField.length === 1 && action.actionField[0] === 'connector') { - const label = getConnectorLabelTitle({ action, connectors }); - return [...comments, getUpdateAction({ action, label, handleOutlineComment })]; - } - - // Pushed information - if (action.actionField.length === 1 && action.actionField[0] === 'pushed') { - const parsedValue = parseString(`${action.newValue}`); - const { firstPush, parsedConnectorId, parsedConnectorName } = getPushInfo( - caseServices, - parsedValue, - index - ); - - const label = getPushedServiceLabelTitle(action, firstPush); - - const showTopFooter = - action.action === 'push-to-service' && - index === caseServices[parsedConnectorId]?.lastPushIndex; - - const showBottomFooter = - action.action === 'push-to-service' && - index === caseServices[parsedConnectorId]?.lastPushIndex && - caseServices[parsedConnectorId].hasDataToPush; - - let footers: EuiCommentProps[] = []; - - if (showTopFooter) { - footers = [ - ...footers, - { - username: '', - type: 'update', - event: i18n.ALREADY_PUSHED_TO_SERVICE(`${parsedConnectorName}`), - timelineIcon: 'sortUp', - 'data-test-subj': 'top-footer', - }, - ]; - } - - if (showBottomFooter) { - footers = [ - ...footers, - { - username: '', - type: 'update', - event: i18n.REQUIRED_UPDATE_TO_SERVICE(`${parsedConnectorName}`), - timelineIcon: 'sortDown', - 'data-test-subj': 'bottom-footer', - }, - ]; - } - - return [ - ...comments, - getUpdateAction({ action, label, handleOutlineComment }), - ...footers, - ]; - } - - // title, description, comment updates, tags - if ( - action.actionField.length === 1 && - ['title', 'description', 'comment', 'tags', 'status'].includes(action.actionField[0]) - ) { - const myField = action.actionField[0]; - const label: string | JSX.Element = getLabelTitle({ - action, - field: myField, - }); - - return [...comments, getUpdateAction({ action, label, handleOutlineComment })]; - } - - return comments; - }, - [descriptionCommentListObj] - ), - [ - caseData, - caseServices, - caseUserActions, - connectors, - handleOutlineComment, - descriptionCommentListObj, - handleManageMarkdownEditId, - handleManageQuote, - handleSaveComment, - isLoadingIds, - loadingAlertData, - manualAlertsData, - manageMarkdownEditIds, - selectedOutlineCommentId, - userCanCrud, - onShowAlertDetails, - ] - ); - - const bottomActions = [ - { - username: ( - <UserActionUsername username={currentUser?.username} fullName={currentUser?.fullName} /> - ), - 'data-test-subj': 'add-comment', - timelineIcon: ( - <UserActionAvatar username={currentUser?.username} fullName={currentUser?.fullName} /> - ), - className: 'isEdit', - children: MarkdownNewComment, - }, - ]; - - const comments = [...userActions, ...bottomActions]; - - return ( - <> - <MyEuiCommentList comments={comments} data-test-subj="user-actions" /> - {(isLoadingUserActions || isLoadingIds.includes(NEW_ID)) && ( - <MyEuiFlexGroup justifyContent="center" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiLoadingSpinner data-test-subj="user-actions-loading" size="l" /> - </EuiFlexItem> - </MyEuiFlexGroup> - )} - </> - ); - } -); - -UserActionTree.displayName = 'UserActionTree'; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/schema.ts b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/schema.ts deleted file mode 100644 index c96041219a3e7..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; -import * as i18n from '../../translations'; - -const { emptyField } = fieldValidators; -export interface Content { - content: string; -} -export const schema: FormSchema<Content> = { - content: { - type: FIELD_TYPES.TEXTAREA, - validations: [ - { - validator: emptyField(i18n.REQUIRED_FIELD), - }, - ], - }, -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/translations.ts b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/translations.ts deleted file mode 100644 index 8218712fb359f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/translations.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../case_view/translations'; - -export const ALREADY_PUSHED_TO_SERVICE = (externalService: string) => - i18n.translate('xpack.securitySolution.cases.caseView.alreadyPushedToExternalService', { - values: { externalService }, - defaultMessage: 'Already pushed to { externalService } incident', - }); - -export const REQUIRED_UPDATE_TO_SERVICE = (externalService: string) => - i18n.translate('xpack.securitySolution.cases.caseView.requiredUpdateToExternalService', { - values: { externalService }, - defaultMessage: 'Requires update to { externalService } incident', - }); - -export const COPY_REFERENCE_LINK = i18n.translate( - 'xpack.securitySolution.cases.caseView.copyCommentLinkAria', - { - defaultMessage: 'Copy reference link', - } -); - -export const MOVE_TO_ORIGINAL_COMMENT = i18n.translate( - 'xpack.securitySolution.cases.caseView.moveToCommentAria', - { - defaultMessage: 'Highlight the referenced comment', - } -); - -export const ALERT_COMMENT_LABEL_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.alertCommentLabelTitle', - { - defaultMessage: 'added an alert from', - } -); - -export const GENERATED_ALERT_COMMENT_LABEL_TITLE = i18n.translate( - 'xpack.securitySolution.cases.caseView.generatedAlertCommentLabelTitle', - { - defaultMessage: 'were added from', - } -); - -export const GENERATED_ALERT_COUNT_COMMENT_LABEL_TITLE = (totalCount: number) => - i18n.translate('xpack.securitySolution.cases.caseView.generatedAlertCountCommentLabelTitle', { - values: { totalCount }, - defaultMessage: `{totalCount} {totalCount, plural, =1 {alert} other {alerts}}`, - }); - -export const ALERT_RULE_DELETED_COMMENT_LABEL = i18n.translate( - 'xpack.securitySolution.cases.caseView.alertRuleDeletedLabelTitle', - { - defaultMessage: 'added an alert', - } -); - -export const SHOW_ALERT_TOOLTIP = i18n.translate( - 'xpack.securitySolution.cases.caseView.showAlertTooltip', - { - defaultMessage: 'Show alert details', - } -); - -export const SEND_ALERT_TO_TIMELINE = i18n.translate( - 'xpack.securitySolution.cases.caseView.sendAlertToTimelineTooltip', - { - defaultMessage: 'Investigate in timeline', - } -); - -export const UNKNOWN_RULE = i18n.translate( - 'xpack.securitySolution.cases.caseView.unknownRule.label', - { - defaultMessage: 'Unknown rule', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx deleted file mode 100644 index 25080d61a951b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { TestProviders } from '../../../common/mock'; -import { useKibana } from '../../../common/lib/kibana'; -import { AlertCommentEvent } from './user_action_alert_comment_event'; -import { CommentType } from '../../../../../cases/common'; - -const props = { - alertId: 'alert-id-1', - ruleId: 'rule-id-1', - ruleName: 'Awesome rule', - alertsCount: 1, - commentType: CommentType.alert, -}; - -jest.mock('../../../common/lib/kibana'); -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('UserActionAvatar ', () => { - let navigateToApp: jest.Mock; - - beforeEach(() => { - jest.clearAllMocks(); - navigateToApp = jest.fn(); - useKibanaMock().services.application.navigateToApp = navigateToApp; - }); - - it('it renders', async () => { - const wrapper = mount( - <TestProviders> - <AlertCommentEvent {...props} /> - </TestProviders> - ); - - expect( - wrapper.find(`[data-test-subj="alert-rule-link-alert-id-1"]`).first().exists() - ).toBeTruthy(); - expect(wrapper.text()).toBe('added an alert from Awesome rule'); - }); - - it('does NOT render the link when the rule is null', async () => { - const wrapper = mount( - <TestProviders> - <AlertCommentEvent {...props} ruleId={null} /> - </TestProviders> - ); - - expect( - wrapper.find(`[data-test-subj="alert-rule-link-alert-id-1"]`).first().exists() - ).toBeFalsy(); - - expect(wrapper.text()).toBe('added an alert from Unknown rule'); - }); - - it('navigate to app on link click', async () => { - const wrapper = mount( - <TestProviders> - <AlertCommentEvent {...props} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj="alert-rule-link-alert-id-1"]`).first().simulate('click'); - expect(navigateToApp).toHaveBeenCalledWith('securitySolution:detections', { - path: '/rules/id/rule-id-1', - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx deleted file mode 100644 index a1b6587cfeecb..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_alert_comment_event.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback } from 'react'; -import { isEmpty } from 'lodash'; -import { EuiText, EuiLoadingSpinner } from '@elastic/eui'; - -import { APP_ID } from '../../../../common/constants'; -import { useKibana } from '../../../common/lib/kibana'; -import { getRuleDetailsUrl, useFormatUrl } from '../../../common/components/link_to'; -import { SecurityPageName } from '../../../app/types'; - -import * as i18n from './translations'; -import { CommentType } from '../../../../../cases/common'; -import { LinkAnchor } from '../../../common/components/links'; - -interface Props { - alertId: string; - commentType: CommentType; - ruleId?: string | null; - ruleName?: string | null; - alertsCount?: number; - loadingAlertData?: boolean; -} - -const AlertCommentEventComponent: React.FC<Props> = ({ - alertId, - loadingAlertData = false, - ruleId, - ruleName, - alertsCount, - commentType, -}) => { - const { navigateToApp } = useKibana().services.application; - const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.detections); - - const onLinkClick = useCallback( - (ev: { preventDefault: () => void }) => { - ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { - path: getRuleDetailsUrl(ruleId ?? ''), - }); - }, - [ruleId, navigateToApp] - ); - - return commentType !== CommentType.generatedAlert ? ( - <> - {`${i18n.ALERT_COMMENT_LABEL_TITLE} `} - {loadingAlertData && <EuiLoadingSpinner size="m" />} - {!loadingAlertData && !isEmpty(ruleId) && ( - <LinkAnchor - onClick={onLinkClick} - href={formatUrl(getRuleDetailsUrl(ruleId ?? '', urlSearch))} - data-test-subj={`alert-rule-link-${alertId ?? 'deleted'}`} - > - {ruleName ?? i18n.UNKNOWN_RULE} - </LinkAnchor> - )} - {!loadingAlertData && isEmpty(ruleId) && i18n.UNKNOWN_RULE} - </> - ) : ( - <> - <b>{i18n.GENERATED_ALERT_COUNT_COMMENT_LABEL_TITLE(alertsCount ?? 0)}</b>{' '} - {i18n.GENERATED_ALERT_COMMENT_LABEL_TITLE}{' '} - {loadingAlertData && <EuiLoadingSpinner size="m" />} - {!loadingAlertData && ruleId !== '' && ( - <LinkAnchor - onClick={onLinkClick} - href={formatUrl(getRuleDetailsUrl(ruleId ?? '', urlSearch))} - data-test-subj={`alert-rule-link-${alertId ?? 'deleted'}`} - > - {ruleName} - </LinkAnchor> - )} - {!loadingAlertData && ruleId === '' && <EuiText>{ruleName}</EuiText>} - </> - ); -}; - -export const AlertCommentEvent = memo(AlertCommentEventComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.test.tsx deleted file mode 100644 index 1df780db3bdaa..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.test.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionAvatar } from './user_action_avatar'; - -const props = { - username: 'elastic', - fullName: 'Elastic', -}; - -describe('UserActionAvatar ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionAvatar {...props} />); - }); - - it('it renders', async () => { - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().text()).toBe('E'); - }); - - it('it shows the username if the fullName is undefined', async () => { - wrapper = mount(<UserActionAvatar username={'elastic'} />); - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().text()).toBe('e'); - }); - - it('shows unknown when the username AND the fullName are undefined', async () => { - wrapper = mount(<UserActionAvatar />); - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().text()).toBe('U'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.tsx deleted file mode 100644 index 80b048618bfc4..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_avatar.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiAvatar } from '@elastic/eui'; - -import * as i18n from './translations'; - -interface UserActionAvatarProps { - username?: string | null; - fullName?: string | null; -} - -const UserActionAvatarComponent = ({ username, fullName }: UserActionAvatarProps) => { - const avatarName = fullName && fullName.length > 0 ? fullName : username ?? i18n.UNKNOWN; - - return <EuiAvatar name={avatarName} data-test-subj={`user-action-avatar`} />; -}; - -export const UserActionAvatar = memo(UserActionAvatarComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.test.tsx deleted file mode 100644 index 051a5c7fe975c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.test.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionContentToolbar } from './user_action_content_toolbar'; - -jest.mock('react-router-dom', () => { - const originalModule = jest.requireActual('react-router-dom'); - - return { - ...originalModule, - useParams: jest.fn().mockReturnValue({ detailName: 'case-1' }), - }; -}); - -jest.mock('../../../common/components/navigation/use_get_url_search'); - -jest.mock('../../../common/lib/kibana', () => { - return { - useKibana: () => ({ - services: { - application: { - getUrlForApp: jest.fn(), - }, - }, - }), - }; -}); - -const props = { - id: '1', - editLabel: 'edit', - quoteLabel: 'quote', - disabled: false, - isLoading: false, - onEdit: jest.fn(), - onQuote: jest.fn(), -}; - -describe('UserActionContentToolbar ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionContentToolbar {...props} />); - }); - - it('it renders', async () => { - expect(wrapper.find(`[data-test-subj="copy-link-${props.id}"]`).first().exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="property-actions"]').first().exists()).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.tsx deleted file mode 100644 index fd679ced5dd6d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_content_toolbar.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; - -import { UserActionCopyLink } from './user_action_copy_link'; -import { UserActionPropertyActions } from './user_action_property_actions'; - -interface UserActionContentToolbarProps { - id: string; - editLabel: string; - quoteLabel: string; - disabled: boolean; - isLoading: boolean; - onEdit: (id: string) => void; - onQuote: (id: string) => void; -} - -const UserActionContentToolbarComponent = ({ - id, - editLabel, - quoteLabel, - disabled, - isLoading, - onEdit, - onQuote, -}: UserActionContentToolbarProps) => { - return ( - <EuiFlexGroup> - <EuiFlexItem> - <UserActionCopyLink id={id} /> - </EuiFlexItem> - <EuiFlexItem> - <UserActionPropertyActions - id={id} - editLabel={editLabel} - quoteLabel={quoteLabel} - disabled={disabled} - isLoading={isLoading} - onEdit={onEdit} - onQuote={onQuote} - /> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const UserActionContentToolbar = memo(UserActionContentToolbarComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.test.tsx deleted file mode 100644 index c1d4894854bd9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { useParams } from 'react-router-dom'; -import copy from 'copy-to-clipboard'; - -import { TestProviders } from '../../../common/mock'; -import { UserActionCopyLink } from './user_action_copy_link'; -import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; - -const searchURL = - '?timerange=(global:(linkTo:!(),timerange:(from:1585487656371,fromStr:now-24h,kind:relative,to:1585574056371,toStr:now)),timeline:(linkTo:!(),timerange:(from:1585227005527,kind:absolute,to:1585313405527)))'; - -jest.mock('react-router-dom', () => { - const originalModule = jest.requireActual('react-router-dom'); - - return { - ...originalModule, - useParams: jest.fn(), - }; -}); - -jest.mock('copy-to-clipboard', () => { - return jest.fn(); -}); - -jest.mock('../../../common/components/navigation/use_get_url_search'); - -const mockGetUrlForApp = jest.fn( - (appId: string, options?: { path?: string; absolute?: boolean }) => - `${appId}${options?.path ?? ''}` -); - -jest.mock('../../../common/lib/kibana', () => { - return { - useKibana: () => ({ - services: { - application: { - getUrlForApp: mockGetUrlForApp, - }, - }, - }), - }; -}); - -const props = { - id: 'comment-id', -}; - -describe('UserActionCopyLink ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - (useParams as jest.Mock).mockReturnValue({ detailName: 'case-1' }); - (useGetUrlSearch as jest.Mock).mockReturnValue(searchURL); - wrapper = mount(<UserActionCopyLink {...props} />, { wrappingComponent: TestProviders }); - }); - - it('it renders', async () => { - expect(wrapper.find(`[data-test-subj="copy-link-${props.id}"]`).first().exists()).toBeTruthy(); - }); - - it('calls copy clipboard correctly', async () => { - wrapper.find(`[data-test-subj="copy-link-${props.id}"]`).first().simulate('click'); - expect(copy).toHaveBeenCalledWith( - 'securitySolution:case/case-1/comment-id?timerange=(global:(linkTo:!(),timerange:(from:1585487656371,fromStr:now-24h,kind:relative,to:1585574056371,toStr:now)),timeline:(linkTo:!(),timerange:(from:1585227005527,kind:absolute,to:1585313405527)))' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.tsx deleted file mode 100644 index ff4e151197464..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_copy_link.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback } from 'react'; -import { EuiToolTip, EuiButtonIcon } from '@elastic/eui'; -import { useParams } from 'react-router-dom'; -import copy from 'copy-to-clipboard'; - -import { useFormatUrl, getCaseDetailsUrlWithCommentId } from '../../../common/components/link_to'; -import { SecurityPageName } from '../../../app/types'; -import * as i18n from './translations'; - -interface UserActionCopyLinkProps { - id: string; -} - -const UserActionCopyLinkComponent = ({ id: commentId }: UserActionCopyLinkProps) => { - const { detailName: caseId, subCaseId } = useParams<{ detailName: string; subCaseId?: string }>(); - const { formatUrl } = useFormatUrl(SecurityPageName.case); - - const handleAnchorLink = useCallback(() => { - copy( - formatUrl(getCaseDetailsUrlWithCommentId({ id: caseId, commentId, subCaseId }), { - absolute: true, - }) - ); - }, [caseId, commentId, formatUrl, subCaseId]); - - return ( - <EuiToolTip position="top" content={<p>{i18n.COPY_REFERENCE_LINK}</p>}> - <EuiButtonIcon - aria-label={i18n.COPY_REFERENCE_LINK} - data-test-subj={`copy-link-${commentId}`} - onClick={handleAnchorLink} - iconType="link" - id={`${commentId}-permLink`} - /> - </EuiToolTip> - ); -}; - -export const UserActionCopyLink = memo(UserActionCopyLinkComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx deleted file mode 100644 index 597566639a8d7..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { Router, mockHistory } from '../__mock__/router'; -import { UserActionMarkdown } from './user_action_markdown'; -import { TestProviders } from '../../../common/mock'; -import * as timelineHelpers from '../../../timelines/components/open_timeline/helpers'; -import { useApolloClient } from '../../../common/utils/apollo_context'; -const mockUseApolloClient = useApolloClient as jest.Mock; -jest.mock('../../../common/utils/apollo_context'); -const onChangeEditable = jest.fn(); -const onSaveContent = jest.fn(); - -const timelineId = '1e10f150-949b-11ea-b63c-2bc51864784c'; -const timelineMarkdown = `[timeline](http://localhost:5601/app/security/timelines?timeline=(id:'${timelineId}',isOpen:!t))`; -const defaultProps = { - content: `A link to a timeline ${timelineMarkdown}`, - id: 'markdown-id', - isEditable: false, - onChangeEditable, - onSaveContent, -}; - -describe('UserActionMarkdown ', () => { - const queryTimelineByIdSpy = jest.spyOn(timelineHelpers, 'queryTimelineById'); - beforeEach(() => { - mockUseApolloClient.mockClear(); - jest.resetAllMocks(); - }); - - it('Opens timeline when timeline link clicked - isEditable: false', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionMarkdown {...defaultProps} /> - </Router> - </TestProviders> - ); - - wrapper - .find(`[data-test-subj="markdown-timeline-link-${timelineId}"]`) - .first() - .simulate('click'); - - expect(queryTimelineByIdSpy).toBeCalledWith({ - apolloClient: mockUseApolloClient(), - graphEventId: '', - timelineId, - updateIsLoading: expect.any(Function), - updateTimeline: expect.any(Function), - }); - }); - - it('Opens timeline when timeline link clicked - isEditable: true ', async () => { - const wrapper = mount( - <TestProviders> - <Router history={mockHistory}> - <UserActionMarkdown {...{ ...defaultProps, isEditable: true }} /> - </Router> - </TestProviders> - ); - - // Preview button of Markdown editor - wrapper - .find( - `[data-test-subj="user-action-markdown-form"] .euiMarkdownEditorToolbar .euiButtonEmpty` - ) - .first() - .simulate('click'); - - wrapper - .find(`[data-test-subj="markdown-timeline-link-${timelineId}"]`) - .first() - .simulate('click'); - expect(queryTimelineByIdSpy).toBeCalledWith({ - apolloClient: mockUseApolloClient(), - graphEventId: '', - timelineId, - updateIsLoading: expect.any(Function), - updateTimeline: expect.any(Function), - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx deleted file mode 100644 index c5707b0293d0e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiFlexGroup, EuiFlexItem, EuiButtonEmpty, EuiButton } from '@elastic/eui'; -import React, { useCallback } from 'react'; -import styled from 'styled-components'; - -import * as i18n from '../case_view/translations'; -import { Form, useForm, UseField } from '../../../shared_imports'; -import { schema, Content } from './schema'; -import { MarkdownRenderer, MarkdownEditorForm } from '../../../common/components/markdown_editor'; - -const ContentWrapper = styled.div` - padding: ${({ theme }) => `${theme.eui.euiSizeM} ${theme.eui.euiSizeL}`}; -`; - -interface UserActionMarkdownProps { - content: string; - id: string; - isEditable: boolean; - onChangeEditable: (id: string) => void; - onSaveContent: (content: string) => void; -} -export const UserActionMarkdown = ({ - id, - content, - isEditable, - onChangeEditable, - onSaveContent, -}: UserActionMarkdownProps) => { - const initialState = { content }; - const { form } = useForm<Content>({ - defaultValue: initialState, - options: { stripEmptyFields: false }, - schema, - }); - - const fieldName = 'content'; - const { submit } = form; - - const handleCancelAction = useCallback(() => { - onChangeEditable(id); - }, [id, onChangeEditable]); - - const handleSaveAction = useCallback(async () => { - const { isValid, data } = await submit(); - if (isValid) { - onSaveContent(data.content); - } - onChangeEditable(id); - }, [id, onChangeEditable, onSaveContent, submit]); - - const renderButtons = useCallback( - ({ cancelAction, saveAction }) => ( - <EuiFlexGroup gutterSize="s" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiButtonEmpty - data-test-subj="user-action-cancel-markdown" - size="s" - onClick={cancelAction} - iconType="cross" - > - {i18n.CANCEL} - </EuiButtonEmpty> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiButton - data-test-subj="user-action-save-markdown" - color="secondary" - fill - iconType="save" - onClick={saveAction} - size="s" - > - {i18n.SAVE} - </EuiButton> - </EuiFlexItem> - </EuiFlexGroup> - ), - [] - ); - - return isEditable ? ( - <Form form={form} data-test-subj="user-action-markdown-form"> - <UseField - path={fieldName} - component={MarkdownEditorForm} - componentProps={{ - 'aria-label': 'Cases markdown editor', - value: content, - id, - bottomRightContent: renderButtons({ - cancelAction: handleCancelAction, - saveAction: handleSaveAction, - }), - }} - /> - </Form> - ) : ( - <ContentWrapper data-test-subj="user-action-markdown"> - <MarkdownRenderer>{content}</MarkdownRenderer> - </ContentWrapper> - ); -}; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.test.tsx deleted file mode 100644 index acd3814786a34..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.test.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionMoveToReference } from './user_action_move_to_reference'; - -const outlineComment = jest.fn(); -const props = { - id: 'move-to-ref-id', - outlineComment, -}; - -describe('UserActionMoveToReference ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionMoveToReference {...props} />); - }); - - it('it renders', async () => { - expect( - wrapper.find(`[data-test-subj="move-to-link-${props.id}"]`).first().exists() - ).toBeTruthy(); - }); - - it('calls outlineComment correctly', async () => { - wrapper.find(`[data-test-subj="move-to-link-${props.id}"]`).first().simulate('click'); - expect(outlineComment).toHaveBeenCalledWith(props.id); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.tsx deleted file mode 100644 index 42f6031ba1a6e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_move_to_reference.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback } from 'react'; -import { EuiToolTip, EuiButtonIcon } from '@elastic/eui'; - -import * as i18n from './translations'; - -interface UserActionMoveToReferenceProps { - id: string; - outlineComment: (id: string) => void; -} - -const UserActionMoveToReferenceComponent = ({ - id, - outlineComment, -}: UserActionMoveToReferenceProps) => { - const handleMoveToLink = useCallback(() => { - outlineComment(id); - }, [id, outlineComment]); - - return ( - <EuiToolTip position="top" content={<p>{i18n.MOVE_TO_ORIGINAL_COMMENT}</p>}> - <EuiButtonIcon - aria-label={i18n.MOVE_TO_ORIGINAL_COMMENT} - data-test-subj={`move-to-link-${id}`} - onClick={handleMoveToLink} - iconType="arrowUp" - /> - </EuiToolTip> - ); -}; - -export const UserActionMoveToReference = memo(UserActionMoveToReferenceComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.test.tsx deleted file mode 100644 index 0e8a30befd000..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.test.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionPropertyActions } from './user_action_property_actions'; - -const props = { - id: 'property-actions-id', - editLabel: 'edit', - quoteLabel: 'quote', - disabled: false, - isLoading: false, - onEdit: jest.fn(), - onQuote: jest.fn(), -}; - -describe('UserActionPropertyActions ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionPropertyActions {...props} />); - }); - - it('it renders', async () => { - expect( - wrapper.find('[data-test-subj="user-action-title-loading"]').first().exists() - ).toBeFalsy(); - - expect(wrapper.find('[data-test-subj="property-actions"]').first().exists()).toBeTruthy(); - }); - - it('it shows the edit and quote buttons', async () => { - wrapper.find('[data-test-subj="property-actions-ellipses"]').first().simulate('click'); - wrapper.find('[data-test-subj="property-actions-pencil"]').exists(); - wrapper.find('[data-test-subj="property-actions-quote"]').exists(); - }); - - it('it shows the spinner when loading', async () => { - wrapper = mount(<UserActionPropertyActions {...props} isLoading={true} />); - expect( - wrapper.find('[data-test-subj="user-action-title-loading"]').first().exists() - ).toBeTruthy(); - - expect(wrapper.find('[data-test-subj="property-actions"]').first().exists()).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.tsx deleted file mode 100644 index c0d2075a278bb..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_property_actions.tsx +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useMemo, useCallback } from 'react'; -import { EuiLoadingSpinner } from '@elastic/eui'; - -import { PropertyActions } from '../property_actions'; - -interface UserActionPropertyActionsProps { - id: string; - editLabel: string; - quoteLabel: string; - disabled: boolean; - isLoading: boolean; - onEdit: (id: string) => void; - onQuote: (id: string) => void; -} - -const UserActionPropertyActionsComponent = ({ - id, - editLabel, - quoteLabel, - disabled, - isLoading, - onEdit, - onQuote, -}: UserActionPropertyActionsProps) => { - const onEditClick = useCallback(() => onEdit(id), [id, onEdit]); - const onQuoteClick = useCallback(() => onQuote(id), [id, onQuote]); - - const propertyActions = useMemo(() => { - return [ - { - disabled, - iconType: 'pencil', - label: editLabel, - onClick: onEditClick, - }, - { - disabled, - iconType: 'quote', - label: quoteLabel, - onClick: onQuoteClick, - }, - ]; - }, [disabled, editLabel, quoteLabel, onEditClick, onQuoteClick]); - return ( - <> - {isLoading && <EuiLoadingSpinner data-test-subj="user-action-title-loading" />} - {!isLoading && <PropertyActions propertyActions={propertyActions} />} - </> - ); -}; - -export const UserActionPropertyActions = memo(UserActionPropertyActionsComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.test.tsx deleted file mode 100644 index 789a6eb68e0fc..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.test.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionShowAlert } from './user_action_show_alert'; -import { RuleEcs } from '../../../../common/ecs/rule'; - -const props = { - id: 'action-id', - alertId: 'alert-id', - index: 'alert-index', - alert: { - _id: 'alert-id', - _index: 'alert-index', - timestamp: '2021-01-07T13:58:31.487Z', - rule: { - id: ['rule-id'], - name: ['Awesome Rule'], - from: ['2021-01-07T13:58:31.487Z'], - to: ['2021-01-07T14:58:31.487Z'], - } as RuleEcs, - }, - onShowAlertDetails: jest.fn(), -}; - -describe('UserActionShowAlert ', () => { - let wrapper: ReactWrapper; - const onShowAlertDetails = jest.fn(); - - beforeAll(() => { - wrapper = mount(<UserActionShowAlert {...props} onShowAlertDetails={onShowAlertDetails} />); - }); - - it('it renders', async () => { - expect( - wrapper.find('[data-test-subj="comment-action-show-alert-action-id"]').first().exists() - ).toBeTruthy(); - }); - - it('it calls onClick', async () => { - wrapper.find('button[data-test-subj="comment-action-show-alert-action-id"]').simulate('click'); - expect(onShowAlertDetails).toHaveBeenCalledWith('alert-id', 'alert-index'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.tsx deleted file mode 100644 index 4f5ce00806417..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_show_alert.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo, useCallback } from 'react'; -import { EuiToolTip, EuiButtonIcon } from '@elastic/eui'; -import * as i18n from './translations'; - -interface UserActionShowAlertProps { - id: string; - alertId: string; - index: string; - onShowAlertDetails: (alertId: string, index: string) => void; -} - -const UserActionShowAlertComponent = ({ - id, - alertId, - index, - onShowAlertDetails, -}: UserActionShowAlertProps) => { - const onClick = useCallback(() => onShowAlertDetails(alertId, index), [ - alertId, - index, - onShowAlertDetails, - ]); - return ( - <EuiToolTip position="top" content={<p>{i18n.SHOW_ALERT_TOOLTIP}</p>}> - <EuiButtonIcon - aria-label={i18n.SHOW_ALERT_TOOLTIP} - data-test-subj={`comment-action-show-alert-${id}`} - onClick={onClick} - iconType="arrowRight" - id={`${id}-show-alert`} - /> - </EuiToolTip> - ); -}; - -export const UserActionShowAlert = memo(UserActionShowAlertComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.test.tsx deleted file mode 100644 index 6aa6710cb6ea1..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { TestProviders } from '../../../common/mock'; -import { UserActionTimestamp } from './user_action_timestamp'; - -jest.mock('@kbn/i18n/react', () => { - const originalModule = jest.requireActual('@kbn/i18n/react'); - const FormattedRelative = jest.fn(); - FormattedRelative.mockImplementationOnce(() => '2 days ago'); - FormattedRelative.mockImplementation(() => '20 hours ago'); - - return { - ...originalModule, - FormattedRelative, - }; -}); - -const props = { - createdAt: '2020-09-06T14:40:59.889Z', - updatedAt: '2020-09-07T14:40:59.889Z', -}; - -describe('UserActionTimestamp ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionTimestamp {...props} />, { wrappingComponent: TestProviders }); - }); - - it('it renders', async () => { - expect( - wrapper.find('[data-test-subj="user-action-title-creation-relative-time"]').first().exists() - ).toBeTruthy(); - expect( - wrapper.find('[data-test-subj="user-action-title-edited-relative-time"]').first().exists() - ).toBeTruthy(); - }); - - it('it shows only the created time when the updated time is missing', async () => { - const newWrapper = mount(<UserActionTimestamp createdAt="2020-09-06T14:40:59.889Z" />, { - wrappingComponent: TestProviders, - }); - - expect( - newWrapper - .find('[data-test-subj="user-action-title-creation-relative-time"]') - .first() - .exists() - ).toBeTruthy(); - expect( - newWrapper.find('[data-test-subj="user-action-title-edited-relative-time"]').first().exists() - ).toBeFalsy(); - }); - - it('it shows the timestamp correctly', async () => { - const createdText = wrapper - .find('[data-test-subj="user-action-title-creation-relative-time"]') - .first() - .text(); - - const updatedText = wrapper - .find('[data-test-subj="user-action-title-edited-relative-time"]') - .first() - .text(); - - expect(`${createdText} (${updatedText})`).toBe('2 days ago (20 hours ago)'); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.tsx deleted file mode 100644 index e51bc261ff800..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_timestamp.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiTextColor } from '@elastic/eui'; -import { FormattedRelative } from '@kbn/i18n/react'; - -import { LocalizedDateTooltip } from '../../../common/components/localized_date_tooltip'; -import * as i18n from './translations'; - -interface UserActionAvatarProps { - createdAt: string; - updatedAt?: string | null; -} - -const UserActionTimestampComponent = ({ createdAt, updatedAt }: UserActionAvatarProps) => { - return ( - <> - <LocalizedDateTooltip date={new Date(createdAt)}> - <FormattedRelative - data-test-subj="user-action-title-creation-relative-time" - value={createdAt} - /> - </LocalizedDateTooltip> - {updatedAt && ( - <EuiTextColor color="subdued"> - {/* be careful of the extra space at the beginning of the parenthesis */} - {' ('} - {i18n.EDITED_FIELD}{' '} - <LocalizedDateTooltip date={new Date(updatedAt)}> - <FormattedRelative - data-test-subj="user-action-title-edited-relative-time" - value={updatedAt} - /> - </LocalizedDateTooltip> - {')'} - </EuiTextColor> - )} - </> - ); -}; - -export const UserActionTimestamp = memo(UserActionTimestampComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.test.tsx deleted file mode 100644 index f664da71fc1f6..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.test.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionUsername } from './user_action_username'; - -const props = { - username: 'elastic', - fullName: 'Elastic', -}; - -describe('UserActionUsername ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionUsername {...props} />); - }); - - it('it renders', async () => { - expect( - wrapper.find('[data-test-subj="user-action-username-tooltip"]').first().exists() - ).toBeTruthy(); - }); - - it('it shows the username', async () => { - expect(wrapper.find('[data-test-subj="user-action-username-tooltip"]').text()).toBe('elastic'); - }); - - test('it shows the fullname when hovering the username', () => { - // Use fake timers so we don't have to wait for the EuiToolTip timeout - jest.useFakeTimers(); - - wrapper.find('[data-test-subj="user-action-username-tooltip"]').first().simulate('mouseOver'); - - // Run the timers so the EuiTooltip will be visible - jest.runAllTimers(); - - wrapper.update(); - expect(wrapper.find('.euiToolTipPopover').text()).toBe('Elastic'); - - // Clearing all mocks will also reset fake timers. - jest.clearAllMocks(); - }); - - test('it shows the username when hovering the username and the fullname is missing', () => { - // Use fake timers so we don't have to wait for the EuiToolTip timeout - jest.useFakeTimers(); - - const newWrapper = mount(<UserActionUsername username="elastic" />); - newWrapper - .find('[data-test-subj="user-action-username-tooltip"]') - .first() - .simulate('mouseOver'); - - // Run the timers so the EuiTooltip will be visible - jest.runAllTimers(); - - newWrapper.update(); - expect(newWrapper.find('.euiToolTipPopover').text()).toBe('elastic'); - - // Clearing all mocks will also reset fake timers. - jest.clearAllMocks(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.tsx deleted file mode 100644 index 78309eb56d620..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiToolTip } from '@elastic/eui'; -import { isEmpty } from 'lodash/fp'; - -import * as i18n from './translations'; - -interface UserActionUsernameProps { - username?: string | null; - fullName?: string | null; -} - -const UserActionUsernameComponent = ({ username, fullName }: UserActionUsernameProps) => { - const tooltipContent = (isEmpty(fullName) ? username : fullName) ?? i18n.UNKNOWN; - return ( - <EuiToolTip - position="top" - content={<p>{tooltipContent}</p>} - data-test-subj="user-action-username-tooltip" - > - <strong>{username ?? i18n.UNKNOWN.toLowerCase()}</strong> - </EuiToolTip> - ); -}; - -export const UserActionUsername = memo(UserActionUsernameComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.test.tsx deleted file mode 100644 index 3b6c956017120..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.test.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, ReactWrapper } from 'enzyme'; -import { UserActionUsernameWithAvatar } from './user_action_username_with_avatar'; - -const props = { - username: 'elastic', - fullName: 'Elastic', -}; - -describe('UserActionUsernameWithAvatar ', () => { - let wrapper: ReactWrapper; - - beforeAll(() => { - wrapper = mount(<UserActionUsernameWithAvatar {...props} />); - }); - - it('it renders', async () => { - expect( - wrapper.find('[data-test-subj="user-action-username-with-avatar"]').first().exists() - ).toBeTruthy(); - expect( - wrapper.find('[data-test-subj="user-action-username-avatar"]').first().exists() - ).toBeTruthy(); - }); - - it('it shows the avatar', async () => { - expect(wrapper.find('[data-test-subj="user-action-username-avatar"]').first().text()).toBe('E'); - }); - - it('it shows the avatar without fullName', async () => { - const newWrapper = mount(<UserActionUsernameWithAvatar username="elastic" />); - expect(newWrapper.find('[data-test-subj="user-action-username-avatar"]').first().text()).toBe( - 'e' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.tsx deleted file mode 100644 index c538403e8b63c..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_username_with_avatar.tsx +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { memo } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiAvatar } from '@elastic/eui'; -import { isEmpty } from 'lodash/fp'; - -import { UserActionUsername } from './user_action_username'; -import * as i18n from './translations'; - -interface UserActionUsernameWithAvatarProps { - username?: string | null; - fullName?: string | null; -} - -const UserActionUsernameWithAvatarComponent = ({ - username, - fullName, -}: UserActionUsernameWithAvatarProps) => { - return ( - <EuiFlexGroup - responsive={false} - alignItems="center" - gutterSize="s" - data-test-subj="user-action-username-with-avatar" - > - <EuiFlexItem grow={false}> - <EuiAvatar - size="s" - name={(isEmpty(fullName) ? username : fullName) ?? i18n.UNKNOWN} - data-test-subj="user-action-username-avatar" - /> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <UserActionUsername username={username} fullName={fullName} /> - </EuiFlexItem> - </EuiFlexGroup> - ); -}; - -export const UserActionUsernameWithAvatar = memo(UserActionUsernameWithAvatarComponent); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_list/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_list/index.test.tsx deleted file mode 100644 index 9c6509eeabc15..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_list/index.test.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { shallow } from 'enzyme'; -import { UserList } from '.'; -import * as i18n from '../case_view/translations'; - -describe('UserList ', () => { - const title = 'Case Title'; - const caseLink = 'http://reddit.com'; - const user = { username: 'username', fullName: 'Full Name', email: 'testemail@elastic.co' }; - const open = jest.fn(); - beforeAll(() => { - window.open = open; - }); - beforeEach(() => { - jest.resetAllMocks(); - }); - it('triggers mailto when email icon clicked', () => { - const wrapper = shallow( - <UserList - email={{ - subject: i18n.EMAIL_SUBJECT(title), - body: i18n.EMAIL_BODY(caseLink), - }} - headline={i18n.REPORTER} - users={[user]} - /> - ); - wrapper.find('[data-test-subj="user-list-email-button"]').simulate('click'); - expect(open).toBeCalledWith( - `mailto:${user.email}?subject=${i18n.EMAIL_SUBJECT(title)}&body=${i18n.EMAIL_BODY(caseLink)}`, - '_blank' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx deleted file mode 100644 index d4d5d56ccc0d5..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useCallback } from 'react'; -import { isEmpty } from 'lodash/fp'; - -import { - EuiButtonIcon, - EuiText, - EuiHorizontalRule, - EuiAvatar, - EuiFlexGroup, - EuiFlexItem, - EuiLoadingSpinner, - EuiToolTip, -} from '@elastic/eui'; - -import styled, { css } from 'styled-components'; - -import { ElasticUser } from '../../containers/types'; -import * as i18n from './translations'; - -interface UserListProps { - email: { - subject: string; - body: string; - }; - headline: string; - loading?: boolean; - users: ElasticUser[]; -} - -const MyAvatar = styled(EuiAvatar)` - top: -4px; -`; - -const MyFlexGroup = styled(EuiFlexGroup)` - ${({ theme }) => css` - margin-top: ${theme.eui.euiSizeM}; - `} -`; - -const renderUsers = ( - users: ElasticUser[], - handleSendEmail: (emailAddress: string | undefined | null) => void -) => - users.map(({ fullName, username, email }, key) => ( - <MyFlexGroup key={key} justifyContent="spaceBetween"> - <EuiFlexItem grow={false}> - <EuiFlexGroup gutterSize="xs"> - <EuiFlexItem> - <MyAvatar name={fullName ? fullName : username ?? ''} /> - </EuiFlexItem> - <EuiFlexItem> - <EuiToolTip position="top" content={<p>{fullName ? fullName : username ?? ''}</p>}> - <p> - <strong> - <small data-test-subj="case-view-username">{username}</small> - </strong> - </p> - </EuiToolTip> - </EuiFlexItem> - </EuiFlexGroup> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiButtonIcon - data-test-subj="user-list-email-button" - onClick={handleSendEmail.bind(null, email)} - iconType="email" - aria-label={i18n.SEND_EMAIL_ARIA(fullName ? fullName : username ?? '')} - isDisabled={isEmpty(email)} - /> - </EuiFlexItem> - </MyFlexGroup> - )); - -export const UserList = React.memo(({ email, headline, loading, users }: UserListProps) => { - const handleSendEmail = useCallback( - (emailAddress: string | undefined | null) => { - if (emailAddress && emailAddress != null) { - window.open(`mailto:${emailAddress}?subject=${email.subject}&body=${email.body}`, '_blank'); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [email.subject] - ); - return users.filter(({ username }) => username != null && username !== '').length > 0 ? ( - <EuiText> - <h4>{headline}</h4> - <EuiHorizontalRule margin="xs" /> - {loading && ( - <EuiFlexGroup> - <EuiFlexItem> - <EuiLoadingSpinner /> - </EuiFlexItem> - </EuiFlexGroup> - )} - {renderUsers( - users.filter(({ username }) => username != null && username !== ''), - handleSendEmail - )} - </EuiText> - ) : null; -}); - -UserList.displayName = 'UserList'; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_list/translations.ts b/x-pack/plugins/security_solution/public/cases/components/user_list/translations.ts deleted file mode 100644 index 81d2c7d50e5d7..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/user_list/translations.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const SEND_EMAIL_ARIA = (user: string) => - i18n.translate('xpack.securitySolution.cases.caseView.sendEmalLinkAria', { - values: { user }, - defaultMessage: 'click to send an email to {user}', - }); diff --git a/x-pack/plugins/security_solution/public/cases/components/wrappers/index.tsx b/x-pack/plugins/security_solution/public/cases/components/wrappers/index.tsx index 3b33e9304da83..477fb77d98ee8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/wrappers/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/wrappers/index.tsx @@ -19,8 +19,3 @@ export const SectionWrapper = styled.div` max-width: 1175px; width: 100%; `; - -export const HeaderWrapper = styled.div` - padding: ${({ theme }) => - `${theme.eui.paddingSizes.l} ${theme.eui.paddingSizes.l} 0 ${theme.eui.paddingSizes.l}`}; -`; diff --git a/x-pack/plugins/security_solution/public/cases/containers/__mocks__/api.ts b/x-pack/plugins/security_solution/public/cases/containers/__mocks__/api.ts deleted file mode 100644 index 11ae4fd6bf178..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/__mocks__/api.ts +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - ActionLicense, - AllCases, - BulkUpdateStatus, - Case, - CasesStatus, - CaseUserActions, - FetchCasesProps, - SortFieldCase, -} from '../types'; -import { - actionLicenses, - allCases, - basicCase, - basicCaseCommentPatch, - basicCasePost, - casesStatus, - caseUserActions, - pushedCase, - respReporters, - tags, -} from '../mock'; -import { - CasePatchRequest, - CasePostRequest, - CommentRequest, - User, - CaseStatuses, -} from '../../../../../cases/common/api'; - -export const getCase = async ( - caseId: string, - includeComments: boolean = true, - signal: AbortSignal -): Promise<Case> => { - return Promise.resolve(basicCase); -}; - -export const getCasesStatus = async (signal: AbortSignal): Promise<CasesStatus> => - Promise.resolve(casesStatus); - -export const getTags = async (signal: AbortSignal): Promise<string[]> => Promise.resolve(tags); - -export const getReporters = async (signal: AbortSignal): Promise<User[]> => - Promise.resolve(respReporters); - -export const getCaseUserActions = async ( - caseId: string, - signal: AbortSignal -): Promise<CaseUserActions[]> => Promise.resolve(caseUserActions); - -export const getCases = async ({ - filterOptions = { - search: '', - reporters: [], - status: CaseStatuses.open, - tags: [], - }, - queryParams = { - page: 1, - perPage: 5, - sortField: SortFieldCase.createdAt, - sortOrder: 'desc', - }, - signal, -}: FetchCasesProps): Promise<AllCases> => Promise.resolve(allCases); - -export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise<Case> => - Promise.resolve(basicCasePost); - -export const patchCase = async ( - caseId: string, - updatedCase: Pick<CasePatchRequest, 'description' | 'status' | 'tags' | 'title'>, - version: string, - signal: AbortSignal -): Promise<Case[]> => Promise.resolve([basicCase]); - -export const patchCasesStatus = async ( - cases: BulkUpdateStatus[], - signal: AbortSignal -): Promise<Case[]> => Promise.resolve(allCases.cases); - -export const postComment = async ( - newComment: CommentRequest, - caseId: string, - signal: AbortSignal -): Promise<Case> => Promise.resolve(basicCase); - -export const patchComment = async ( - caseId: string, - commentId: string, - commentUpdate: string, - version: string, - signal: AbortSignal -): Promise<Case> => Promise.resolve(basicCaseCommentPatch); - -export const deleteCases = async (caseIds: string[], signal: AbortSignal): Promise<boolean> => - Promise.resolve(true); - -export const pushCase = async ( - caseId: string, - connectorId: string, - signal: AbortSignal -): Promise<Case> => Promise.resolve(pushedCase); - -export const getActionLicense = async (signal: AbortSignal): Promise<ActionLicense[]> => - Promise.resolve(actionLicenses); diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx deleted file mode 100644 index 16e7c5287ce33..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx +++ /dev/null @@ -1,465 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { KibanaServices } from '../../common/lib/kibana'; - -import { ConnectorTypes, CommentType, CaseStatuses } from '../../../../cases/common/api'; -import { CASES_URL } from '../../../../cases/common'; - -import { - deleteCases, - getActionLicense, - getCase, - getCases, - getCasesStatus, - getCaseUserActions, - getReporters, - getTags, - patchCase, - patchCasesStatus, - patchComment, - postCase, - postComment, - pushCase, -} from './api'; - -import { - actionLicenses, - allCases, - basicCase, - allCasesSnake, - basicCaseSnake, - pushedCaseSnake, - casesStatus, - casesSnake, - cases, - caseUserActions, - pushedCase, - reporters, - respReporters, - tags, - caseUserActionsSnake, - casesStatusSnake, -} from './mock'; - -import { DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; - -const abortCtrl = new AbortController(); -const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../common/lib/kibana'); - -const fetchMock = jest.fn(); -mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); - -describe('Case Configuration API', () => { - describe('deleteCases', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(''); - }); - const data = ['1', '2']; - - test('check url, method, signal', async () => { - await deleteCases(data, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { - method: 'DELETE', - query: { ids: JSON.stringify(data) }, - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await deleteCases(data, abortCtrl.signal); - expect(resp).toEqual(''); - }); - }); - - describe('getActionLicense', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(actionLicenses); - }); - - test('check url, method, signal', async () => { - await getActionLicense(abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`/api/actions/list_action_types`, { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getActionLicense(abortCtrl.signal); - expect(resp).toEqual(actionLicenses); - }); - }); - - describe('getCase', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(basicCaseSnake); - }); - const data = basicCase.id; - - test('check url, method, signal', async () => { - await getCase(data, true, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}`, { - method: 'GET', - query: { includeComments: true }, - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getCase(data, true, abortCtrl.signal); - expect(resp).toEqual(basicCase); - }); - }); - - describe('getCases', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(allCasesSnake); - }); - test('check url, method, signal', async () => { - await getCases({ - filterOptions: DEFAULT_FILTER_OPTIONS, - queryParams: DEFAULT_QUERY_PARAMS, - signal: abortCtrl.signal, - }); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { - method: 'GET', - query: { - ...DEFAULT_QUERY_PARAMS, - reporters: [], - tags: [], - }, - signal: abortCtrl.signal, - }); - }); - - test('correctly applies filters', async () => { - await getCases({ - filterOptions: { - ...DEFAULT_FILTER_OPTIONS, - reporters: [...respReporters, { username: null, full_name: null, email: null }], - tags, - status: CaseStatuses.open, - search: 'hello', - }, - queryParams: DEFAULT_QUERY_PARAMS, - signal: abortCtrl.signal, - }); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { - method: 'GET', - query: { - ...DEFAULT_QUERY_PARAMS, - reporters, - tags: ['"coke"', '"pepsi"'], - search: 'hello', - status: CaseStatuses.open, - }, - signal: abortCtrl.signal, - }); - }); - - test('tags with weird chars get handled gracefully', async () => { - const weirdTags: string[] = ['(', '"double"']; - - await getCases({ - filterOptions: { - ...DEFAULT_FILTER_OPTIONS, - reporters: [...respReporters, { username: null, full_name: null, email: null }], - tags: weirdTags, - status: CaseStatuses.open, - search: 'hello', - }, - queryParams: DEFAULT_QUERY_PARAMS, - signal: abortCtrl.signal, - }); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { - method: 'GET', - query: { - ...DEFAULT_QUERY_PARAMS, - reporters, - tags: ['"("', '"\\"double\\""'], - search: 'hello', - status: CaseStatuses.open, - }, - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getCases({ - filterOptions: DEFAULT_FILTER_OPTIONS, - queryParams: DEFAULT_QUERY_PARAMS, - signal: abortCtrl.signal, - }); - expect(resp).toEqual({ ...allCases }); - }); - }); - - describe('getCasesStatus', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(casesStatusSnake); - }); - test('check url, method, signal', async () => { - await getCasesStatus(abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/status`, { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getCasesStatus(abortCtrl.signal); - expect(resp).toEqual(casesStatus); - }); - }); - - describe('getCaseUserActions', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(caseUserActionsSnake); - }); - - test('check url, method, signal', async () => { - await getCaseUserActions(basicCase.id, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}/user_actions`, { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getCaseUserActions(basicCase.id, abortCtrl.signal); - expect(resp).toEqual(caseUserActions); - }); - }); - - describe('getReporters', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(respReporters); - }); - - test('check url, method, signal', async () => { - await getReporters(abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/reporters`, { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getReporters(abortCtrl.signal); - expect(resp).toEqual(respReporters); - }); - }); - - describe('getTags', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(tags); - }); - - test('check url, method, signal', async () => { - await getTags(abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/tags`, { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getTags(abortCtrl.signal); - expect(resp).toEqual(tags); - }); - }); - - describe('patchCase', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue([basicCaseSnake]); - }); - const data = { description: 'updated description' }; - test('check url, method, signal', async () => { - await patchCase(basicCase.id, data, basicCase.version, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { - method: 'PATCH', - body: JSON.stringify({ - cases: [{ ...data, id: basicCase.id, version: basicCase.version }], - }), - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await patchCase( - basicCase.id, - { description: 'updated description' }, - basicCase.version, - abortCtrl.signal - ); - expect(resp).toEqual({ ...[basicCase] }); - }); - }); - - describe('patchCasesStatus', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(casesSnake); - }); - const data = [ - { - status: CaseStatuses.closed, - id: basicCase.id, - version: basicCase.version, - }, - ]; - - test('check url, method, signal', async () => { - await patchCasesStatus(data, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { - method: 'PATCH', - body: JSON.stringify({ cases: data }), - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await patchCasesStatus(data, abortCtrl.signal); - expect(resp).toEqual({ ...cases }); - }); - }); - - describe('patchComment', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(basicCaseSnake); - }); - - test('check url, method, signal', async () => { - await patchComment( - basicCase.id, - basicCase.comments[0].id, - 'updated comment', - basicCase.comments[0].version, - abortCtrl.signal - ); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}/comments`, { - method: 'PATCH', - body: JSON.stringify({ - comment: 'updated comment', - type: CommentType.user, - id: basicCase.comments[0].id, - version: basicCase.comments[0].version, - }), - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await patchComment( - basicCase.id, - basicCase.comments[0].id, - 'updated comment', - basicCase.comments[0].version, - abortCtrl.signal - ); - expect(resp).toEqual(basicCase); - }); - }); - - describe('postCase', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(basicCaseSnake); - }); - const data = { - description: 'description', - tags: ['tag'], - title: 'title', - connector: { - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, - }, - settings: { - syncAlerts: true, - }, - }; - - test('check url, method, signal', async () => { - await postCase(data, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}`, { - method: 'POST', - body: JSON.stringify(data), - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await postCase(data, abortCtrl.signal); - expect(resp).toEqual(basicCase); - }); - }); - - describe('postComment', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(basicCaseSnake); - }); - const data = { - comment: 'comment', - type: CommentType.user as const, - }; - - test('check url, method, signal', async () => { - await postComment(data, basicCase.id, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/${basicCase.id}/comments`, { - method: 'POST', - body: JSON.stringify(data), - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await postComment(data, basicCase.id, abortCtrl.signal); - expect(resp).toEqual(basicCase); - }); - }); - - describe('pushCase', () => { - const connectorId = 'connectorId'; - - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(pushedCaseSnake); - }); - - test('check url, method, signal', async () => { - await pushCase(basicCase.id, connectorId, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith( - `${CASES_URL}/${basicCase.id}/connector/${connectorId}/_push`, - { - method: 'POST', - body: JSON.stringify({}), - signal: abortCtrl.signal, - } - ); - }); - - test('happy path', async () => { - const resp = await pushCase(basicCase.id, connectorId, abortCtrl.signal); - expect(resp).toEqual(pushedCase); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.ts b/x-pack/plugins/security_solution/public/cases/containers/api.ts deleted file mode 100644 index ca7ab5eb9d7dd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/api.ts +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { assign, omit } from 'lodash'; - -import { - ACTION_TYPES_URL, - CASE_REPORTERS_URL, - CASE_STATUS_URL, - CASE_TAGS_URL, - CasePatchRequest, - CasePostRequest, - CaseResponse, - CASES_URL, - CasesFindResponse, - CasesResponse, - CasesStatusResponse, - CaseType, - CaseUserActionsResponse, - CommentRequest, - CommentType, - getCaseCommentsUrl, - getCaseDetailsUrl, - getCasePushUrl, - getCaseUserActionUrl, - getSubCaseDetailsUrl, - getSubCaseUserActionUrl, - SUB_CASE_DETAILS_URL, - SUB_CASES_PATCH_DEL_URL, - SubCasePatchRequest, - SubCaseResponse, - SubCasesResponse, - User, -} from '../../../../cases/common'; - -import { KibanaServices } from '../../common/lib/kibana'; -import { StatusAll } from '../components/status'; - -import { - ActionLicense, - AllCases, - BulkUpdateStatus, - Case, - CasesStatus, - FetchCasesProps, - SortFieldCase, - CaseUserActions, -} from './types'; - -import { - convertToCamelCase, - convertAllCasesToCamel, - convertArrayToCamelCase, - decodeCaseResponse, - decodeCasesResponse, - decodeCasesFindResponse, - decodeCasesStatusResponse, - decodeCaseUserActionsResponse, -} from './utils'; - -export const getCase = async ( - caseId: string, - includeComments: boolean = true, - signal: AbortSignal -): Promise<Case> => { - const response = await KibanaServices.get().http.fetch<CaseResponse>(getCaseDetailsUrl(caseId), { - method: 'GET', - query: { - includeComments, - }, - signal, - }); - return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); -}; - -export const getSubCase = async ( - caseId: string, - subCaseId: string, - includeComments: boolean = true, - signal: AbortSignal -): Promise<Case> => { - const [caseResponse, subCaseResponse] = await Promise.all([ - KibanaServices.get().http.fetch<CaseResponse>(getCaseDetailsUrl(caseId), { - method: 'GET', - query: { - includeComments: false, - }, - signal, - }), - KibanaServices.get().http.fetch<SubCaseResponse>(getSubCaseDetailsUrl(caseId, subCaseId), { - method: 'GET', - query: { - includeComments, - }, - signal, - }), - ]); - const response = assign<CaseResponse, SubCaseResponse>(caseResponse, subCaseResponse); - const subCaseIndex = response.subCaseIds?.findIndex((scId) => scId === response.id) ?? -1; - response.title = `${response.title}${subCaseIndex >= 0 ? ` ${subCaseIndex + 1}` : ''}`; - return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); -}; - -export const getCasesStatus = async (signal: AbortSignal): Promise<CasesStatus> => { - const response = await KibanaServices.get().http.fetch<CasesStatusResponse>(CASE_STATUS_URL, { - method: 'GET', - signal, - }); - return convertToCamelCase<CasesStatusResponse, CasesStatus>(decodeCasesStatusResponse(response)); -}; - -export const getTags = async (signal: AbortSignal): Promise<string[]> => { - const response = await KibanaServices.get().http.fetch<string[]>(CASE_TAGS_URL, { - method: 'GET', - signal, - }); - return response ?? []; -}; - -export const getReporters = async (signal: AbortSignal): Promise<User[]> => { - const response = await KibanaServices.get().http.fetch<User[]>(CASE_REPORTERS_URL, { - method: 'GET', - signal, - }); - return response ?? []; -}; - -export const getCaseUserActions = async ( - caseId: string, - signal: AbortSignal -): Promise<CaseUserActions[]> => { - const response = await KibanaServices.get().http.fetch<CaseUserActionsResponse>( - getCaseUserActionUrl(caseId), - { - method: 'GET', - signal, - } - ); - return convertArrayToCamelCase(decodeCaseUserActionsResponse(response)) as CaseUserActions[]; -}; - -export const getSubCaseUserActions = async ( - caseId: string, - subCaseId: string, - signal: AbortSignal -): Promise<CaseUserActions[]> => { - const response = await KibanaServices.get().http.fetch<CaseUserActionsResponse>( - getSubCaseUserActionUrl(caseId, subCaseId), - { - method: 'GET', - signal, - } - ); - return convertArrayToCamelCase(decodeCaseUserActionsResponse(response)) as CaseUserActions[]; -}; - -export const getCases = async ({ - filterOptions = { - onlyCollectionType: false, - search: '', - reporters: [], - status: StatusAll, - tags: [], - }, - queryParams = { - page: 1, - perPage: 20, - sortField: SortFieldCase.createdAt, - sortOrder: 'desc', - }, - signal, -}: FetchCasesProps): Promise<AllCases> => { - const query = { - reporters: filterOptions.reporters.map((r) => r.username ?? '').filter((r) => r !== ''), - tags: filterOptions.tags.map((t) => `"${t.replace(/"/g, '\\"')}"`), - status: filterOptions.status, - ...(filterOptions.search.length > 0 ? { search: filterOptions.search } : {}), - ...(filterOptions.onlyCollectionType ? { type: CaseType.collection } : {}), - ...queryParams, - }; - const response = await KibanaServices.get().http.fetch<CasesFindResponse>(`${CASES_URL}/_find`, { - method: 'GET', - query: query.status === StatusAll ? omit(query, ['status']) : query, - signal, - }); - return convertAllCasesToCamel(decodeCasesFindResponse(response)); -}; - -export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise<Case> => { - const response = await KibanaServices.get().http.fetch<CaseResponse>(CASES_URL, { - method: 'POST', - body: JSON.stringify(newCase), - signal, - }); - return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); -}; - -export const patchCase = async ( - caseId: string, - updatedCase: Pick< - CasePatchRequest, - 'description' | 'status' | 'tags' | 'title' | 'settings' | 'connector' - >, - version: string, - signal: AbortSignal -): Promise<Case[]> => { - const response = await KibanaServices.get().http.fetch<CasesResponse>(CASES_URL, { - method: 'PATCH', - body: JSON.stringify({ cases: [{ ...updatedCase, id: caseId, version }] }), - signal, - }); - return convertToCamelCase<CasesResponse, Case[]>(decodeCasesResponse(response)); -}; - -export const patchSubCase = async ( - caseId: string, - subCaseId: string, - updatedSubCase: Pick<SubCasePatchRequest, 'status'>, - version: string, - signal: AbortSignal -): Promise<Case[]> => { - const subCaseResponse = await KibanaServices.get().http.fetch<SubCasesResponse>( - SUB_CASE_DETAILS_URL, - { - method: 'PATCH', - body: JSON.stringify({ cases: [{ ...updatedSubCase, id: caseId, version }] }), - signal, - } - ); - const caseResponse = await KibanaServices.get().http.fetch<CaseResponse>( - getCaseDetailsUrl(caseId), - { - method: 'GET', - query: { - includeComments: false, - }, - signal, - } - ); - const response = subCaseResponse.map((subCaseResp) => assign(caseResponse, subCaseResp)); - return convertToCamelCase<CasesResponse, Case[]>(decodeCasesResponse(response)); -}; - -export const patchCasesStatus = async ( - cases: BulkUpdateStatus[], - signal: AbortSignal -): Promise<Case[]> => { - const response = await KibanaServices.get().http.fetch<CasesResponse>(CASES_URL, { - method: 'PATCH', - body: JSON.stringify({ cases }), - signal, - }); - return convertToCamelCase<CasesResponse, Case[]>(decodeCasesResponse(response)); -}; - -export const postComment = async ( - newComment: CommentRequest, - caseId: string, - signal: AbortSignal, - subCaseId?: string -): Promise<Case> => { - const response = await KibanaServices.get().http.fetch<CaseResponse>( - `${CASES_URL}/${caseId}/comments`, - { - method: 'POST', - body: JSON.stringify(newComment), - ...(subCaseId ? { query: { subCaseId } } : {}), - signal, - } - ); - return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); -}; - -export const patchComment = async ( - caseId: string, - commentId: string, - commentUpdate: string, - version: string, - signal: AbortSignal, - subCaseId?: string -): Promise<Case> => { - const response = await KibanaServices.get().http.fetch<CaseResponse>(getCaseCommentsUrl(caseId), { - method: 'PATCH', - body: JSON.stringify({ - comment: commentUpdate, - type: CommentType.user, - id: commentId, - version, - }), - ...(subCaseId ? { query: { subCaseId } } : {}), - signal, - }); - return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); -}; - -export const deleteCases = async (caseIds: string[], signal: AbortSignal): Promise<string> => { - const response = await KibanaServices.get().http.fetch<string>(CASES_URL, { - method: 'DELETE', - query: { ids: JSON.stringify(caseIds) }, - signal, - }); - return response; -}; - -export const deleteSubCases = async (caseIds: string[], signal: AbortSignal): Promise<string> => { - const response = await KibanaServices.get().http.fetch<string>(SUB_CASES_PATCH_DEL_URL, { - method: 'DELETE', - query: { ids: JSON.stringify(caseIds) }, - signal, - }); - return response; -}; - -export const pushCase = async ( - caseId: string, - connectorId: string, - signal: AbortSignal -): Promise<Case> => { - const response = await KibanaServices.get().http.fetch<CaseResponse>( - getCasePushUrl(caseId, connectorId), - { - method: 'POST', - body: JSON.stringify({}), - signal, - } - ); - - return convertToCamelCase<CaseResponse, Case>(decodeCaseResponse(response)); -}; - -export const getActionLicense = async (signal: AbortSignal): Promise<ActionLicense[]> => { - const response = await KibanaServices.get().http.fetch<ActionLicense[]>(ACTION_TYPES_URL, { - method: 'GET', - signal, - }); - return response; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/__mocks__/api.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/__mocks__/api.ts deleted file mode 100644 index d9cd81f143816..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/__mocks__/api.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - CasesConfigurePatch, - CasesConfigureRequest, - ActionConnector, - ActionTypeConnector, -} from '../../../../../../cases/common/api'; - -import { ApiProps } from '../../types'; -import { CaseConfigure } from '../types'; -import { connectorsMock, caseConfigurationCamelCaseResponseMock, actionTypesMock } from '../mock'; - -export const fetchConnectors = async ({ signal }: ApiProps): Promise<ActionConnector[]> => - Promise.resolve(connectorsMock); - -export const getCaseConfigure = async ({ signal }: ApiProps): Promise<CaseConfigure> => - Promise.resolve(caseConfigurationCamelCaseResponseMock); - -export const postCaseConfigure = async ( - caseConfiguration: CasesConfigureRequest, - signal: AbortSignal -): Promise<CaseConfigure> => Promise.resolve(caseConfigurationCamelCaseResponseMock); - -export const patchCaseConfigure = async ( - caseConfiguration: CasesConfigurePatch, - signal: AbortSignal -): Promise<CaseConfigure> => Promise.resolve(caseConfigurationCamelCaseResponseMock); - -export const fetchActionTypes = async ({ signal }: ApiProps): Promise<ActionTypeConnector[]> => - Promise.resolve(actionTypesMock); diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/api.test.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/api.test.ts deleted file mode 100644 index 0c7ae422be861..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/api.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { KibanaServices } from '../../../common/lib/kibana'; -import { - fetchConnectors, - getCaseConfigure, - postCaseConfigure, - patchCaseConfigure, - fetchActionTypes, -} from './api'; -import { - connectorsMock, - actionTypesMock, - caseConfigurationMock, - caseConfigurationResposeMock, - caseConfigurationCamelCaseResponseMock, -} from './mock'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; - -const abortCtrl = new AbortController(); -const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../../common/lib/kibana'); - -const fetchMock = jest.fn(); -mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); - -describe('Case Configuration API', () => { - describe('fetch connectors', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(connectorsMock); - }); - - test('check url, method, signal', async () => { - await fetchConnectors({ signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure/connectors/_find', { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await fetchConnectors({ signal: abortCtrl.signal }); - expect(resp).toEqual(connectorsMock); - }); - }); - - describe('fetch configuration', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(caseConfigurationResposeMock); - }); - - test('check url, method, signal', async () => { - await getCaseConfigure({ signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await getCaseConfigure({ signal: abortCtrl.signal }); - expect(resp).toEqual(caseConfigurationCamelCaseResponseMock); - }); - - test('return null on empty response', async () => { - fetchMock.mockResolvedValue({}); - const resp = await getCaseConfigure({ signal: abortCtrl.signal }); - expect(resp).toBe(null); - }); - }); - - describe('create configuration', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(caseConfigurationResposeMock); - }); - - test('check url, body, method, signal', async () => { - await postCaseConfigure(caseConfigurationMock, abortCtrl.signal); - expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { - body: - '{"connector":{"id":"123","name":"My connector","type":".jira","fields":null},"closure_type":"close-by-user"}', - method: 'POST', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await postCaseConfigure(caseConfigurationMock, abortCtrl.signal); - expect(resp).toEqual(caseConfigurationCamelCaseResponseMock); - }); - }); - - describe('update configuration', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(caseConfigurationResposeMock); - }); - - test('check url, body, method, signal', async () => { - await patchCaseConfigure( - { - connector: { id: '456', name: 'My Connector 2', type: ConnectorTypes.none, fields: null }, - version: 'WzHJ12', - }, - abortCtrl.signal - ); - expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { - body: - '{"connector":{"id":"456","name":"My Connector 2","type":".none","fields":null},"version":"WzHJ12"}', - method: 'PATCH', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await patchCaseConfigure( - { - connector: { id: '456', name: 'My Connector 2', type: ConnectorTypes.none, fields: null }, - version: 'WzHJ12', - }, - abortCtrl.signal - ); - expect(resp).toEqual(caseConfigurationCamelCaseResponseMock); - }); - }); - - describe('fetch actionTypes', () => { - beforeEach(() => { - fetchMock.mockClear(); - fetchMock.mockResolvedValue(actionTypesMock); - }); - - test('check url, method, signal', async () => { - await fetchActionTypes({ signal: abortCtrl.signal }); - expect(fetchMock).toHaveBeenCalledWith('/api/actions/list_action_types', { - method: 'GET', - signal: abortCtrl.signal, - }); - }); - - test('happy path', async () => { - const resp = await fetchActionTypes({ signal: abortCtrl.signal }); - expect(resp).toEqual(actionTypesMock); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts deleted file mode 100644 index c165c493c16d9..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/api.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { isEmpty } from 'lodash/fp'; -import { - ACTION_TYPES_URL, - ActionConnector, - ActionTypeConnector, - CASE_CONFIGURE_CONNECTORS_URL, - CASE_CONFIGURE_URL, - CasesConfigurePatch, - CasesConfigureRequest, - CasesConfigureResponse, -} from '../../../../../cases/common'; -import { KibanaServices } from '../../../common/lib/kibana'; -import { ApiProps } from '../types'; -import { convertToCamelCase, decodeCaseConfigureResponse } from '../utils'; -import { CaseConfigure } from './types'; - -export const fetchConnectors = async ({ signal }: ApiProps): Promise<ActionConnector[]> => { - const response = await KibanaServices.get().http.fetch(`${CASE_CONFIGURE_CONNECTORS_URL}/_find`, { - method: 'GET', - signal, - }); - - return response; -}; - -export const getCaseConfigure = async ({ signal }: ApiProps): Promise<CaseConfigure | null> => { - const response = await KibanaServices.get().http.fetch<CasesConfigureResponse>( - CASE_CONFIGURE_URL, - { - method: 'GET', - signal, - } - ); - - return !isEmpty(response) - ? convertToCamelCase<CasesConfigureResponse, CaseConfigure>( - decodeCaseConfigureResponse(response) - ) - : null; -}; - -export const getConnectorMappings = async ({ signal }: ApiProps): Promise<ActionConnector[]> => { - const response = await KibanaServices.get().http.fetch(`${CASE_CONFIGURE_CONNECTORS_URL}/_find`, { - method: 'GET', - signal, - }); - - return response; -}; - -export const postCaseConfigure = async ( - caseConfiguration: CasesConfigureRequest, - signal: AbortSignal -): Promise<CaseConfigure> => { - const response = await KibanaServices.get().http.fetch<CasesConfigureResponse>( - CASE_CONFIGURE_URL, - { - method: 'POST', - body: JSON.stringify(caseConfiguration), - signal, - } - ); - return convertToCamelCase<CasesConfigureResponse, CaseConfigure>( - decodeCaseConfigureResponse(response) - ); -}; - -export const patchCaseConfigure = async ( - caseConfiguration: CasesConfigurePatch, - signal: AbortSignal -): Promise<CaseConfigure> => { - const response = await KibanaServices.get().http.fetch<CasesConfigureResponse>( - CASE_CONFIGURE_URL, - { - method: 'PATCH', - body: JSON.stringify(caseConfiguration), - signal, - } - ); - return convertToCamelCase<CasesConfigureResponse, CaseConfigure>( - decodeCaseConfigureResponse(response) - ); -}; - -export const fetchActionTypes = async ({ signal }: ApiProps): Promise<ActionTypeConnector[]> => { - const response = await KibanaServices.get().http.fetch(ACTION_TYPES_URL, { - method: 'GET', - signal, - }); - - return response; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/mock.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/mock.ts deleted file mode 100644 index 4e71c9a990ece..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/mock.ts +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - ActionConnector, - ActionTypeConnector, - CasesConfigureResponse, - CasesConfigureRequest, - ConnectorTypes, -} from '../../../../../cases/common/api'; -import { CaseConfigure, CaseConnectorMapping } from './types'; - -export const mappings: CaseConnectorMapping[] = [ - { - source: 'title', - target: 'short_description', - actionType: 'overwrite', - }, - { - source: 'description', - target: 'description', - actionType: 'overwrite', - }, - { - source: 'comments', - target: 'comments', - actionType: 'append', - }, -]; - -export const connectorsMock: ActionConnector[] = [ - { - id: 'servicenow-1', - actionTypeId: '.servicenow', - name: 'My Connector', - config: { - apiUrl: 'https://instance1.service-now.com', - }, - isPreconfigured: false, - }, - { - id: 'resilient-2', - actionTypeId: '.resilient', - name: 'My Connector 2', - config: { - apiUrl: 'https://test/', - orgId: '201', - }, - isPreconfigured: false, - }, - { - id: 'jira-1', - actionTypeId: '.jira', - name: 'Jira', - config: { - apiUrl: 'https://instance.atlassian.ne', - }, - isPreconfigured: false, - }, - { - id: 'servicenow-sir', - actionTypeId: '.servicenow-sir', - name: 'My Connector SIR', - config: { - apiUrl: 'https://instance1.service-now.com', - }, - isPreconfigured: false, - }, -]; - -export const actionTypesMock: ActionTypeConnector[] = [ - { - id: '.email', - name: 'Email', - minimumLicenseRequired: 'gold', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }, - { - id: '.index', - name: 'Index', - minimumLicenseRequired: 'basic', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }, - { - id: '.servicenow', - name: 'ServiceNow', - minimumLicenseRequired: 'platinum', - enabled: false, - enabledInConfig: true, - enabledInLicense: true, - }, - { - id: '.jira', - name: 'Jira', - minimumLicenseRequired: 'gold', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }, - { - id: '.resilient', - name: 'IBM Resilient', - minimumLicenseRequired: 'platinum', - enabled: false, - enabledInConfig: true, - enabledInLicense: true, - }, -]; - -export const caseConfigurationResposeMock: CasesConfigureResponse = { - created_at: '2020-04-06T13:03:18.657Z', - created_by: { username: 'elastic', full_name: 'Elastic', email: 'elastic@elastic.co' }, - connector: { - id: '123', - name: 'My connector', - type: ConnectorTypes.jira, - fields: null, - }, - closure_type: 'close-by-pushing', - error: null, - mappings: [], - updated_at: '2020-04-06T14:03:18.657Z', - updated_by: { username: 'elastic', full_name: 'Elastic', email: 'elastic@elastic.co' }, - version: 'WzHJ12', -}; - -export const caseConfigurationMock: CasesConfigureRequest = { - connector: { - id: '123', - name: 'My connector', - type: ConnectorTypes.jira, - fields: null, - }, - closure_type: 'close-by-user', -}; - -export const caseConfigurationCamelCaseResponseMock: CaseConfigure = { - createdAt: '2020-04-06T13:03:18.657Z', - createdBy: { username: 'elastic', fullName: 'Elastic', email: 'elastic@elastic.co' }, - connector: { - id: '123', - name: 'My connector', - type: ConnectorTypes.jira, - fields: null, - }, - closureType: 'close-by-pushing', - error: null, - mappings: [], - updatedAt: '2020-04-06T14:03:18.657Z', - updatedBy: { username: 'elastic', fullName: 'Elastic', email: 'elastic@elastic.co' }, - version: 'WzHJ12', -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/translations.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/translations.ts deleted file mode 100644 index 455293b217679..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/translations.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../translations'; - -export const SUCCESS_CONFIGURE = i18n.translate( - 'xpack.securitySolution.cases.configure.successSaveToast', - { - defaultMessage: 'Saved external connection settings', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/types.ts b/x-pack/plugins/security_solution/public/cases/containers/configure/types.ts deleted file mode 100644 index aa86d1bfdb0b1..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/types.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ElasticUser } from '../types'; -import { - ActionConnector, - ActionTypeConnector, - ActionType, - CaseConnector, - CaseField, - CasesConfigure, - ClosureType, - ThirdPartyField, -} from '../../../../../cases/common/api'; - -export { - ActionConnector, - ActionTypeConnector, - ActionType, - CaseConnector, - CaseField, - ClosureType, - ThirdPartyField, -}; - -export interface CaseConnectorMapping { - actionType: ActionType; - source: CaseField; - target: string; -} - -export interface CaseConfigure { - closureType: ClosureType; - connector: CasesConfigure['connector']; - createdAt: string; - createdBy: ElasticUser; - error: string | null; - mappings: CaseConnectorMapping[]; - updatedAt: string; - updatedBy: ElasticUser; - version: string; -} diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.test.tsx deleted file mode 100644 index 25017f7931db8..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.test.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useActionTypes, UseActionTypesResponse } from './use_action_types'; -import { actionTypesMock } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useActionTypes', () => { - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => - useActionTypes() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - loading: true, - actionTypes: [], - refetchActionTypes: result.current.refetchActionTypes, - }); - }); - }); - - test('fetch action types', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => - useActionTypes() - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - loading: false, - actionTypes: actionTypesMock, - refetchActionTypes: result.current.refetchActionTypes, - }); - }); - }); - - test('refetch actionTypes', async () => { - const spyOnfetchActionTypes = jest.spyOn(api, 'fetchActionTypes'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => - useActionTypes() - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - result.current.refetchActionTypes(); - expect(spyOnfetchActionTypes).toHaveBeenCalledTimes(2); - }); - }); - - test('set isLoading to true when refetching actionTypes', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => - useActionTypes() - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - result.current.refetchActionTypes(); - - expect(result.current.loading).toBe(true); - }); - }); - - test('unhappy path', async () => { - const spyOnfetchActionTypes = jest.spyOn(api, 'fetchActionTypes'); - spyOnfetchActionTypes.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseActionTypesResponse>(() => - useActionTypes() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - loading: false, - actionTypes: [], - refetchActionTypes: result.current.refetchActionTypes, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.tsx deleted file mode 100644 index 3590fffdef5b2..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_action_types.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useCallback, useRef } from 'react'; - -import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; -import * as i18n from '../translations'; -import { fetchActionTypes } from './api'; -import { ActionTypeConnector } from './types'; - -export interface UseActionTypesResponse { - loading: boolean; - actionTypes: ActionTypeConnector[]; - refetchActionTypes: () => void; -} - -export const useActionTypes = (): UseActionTypesResponse => { - const [, dispatchToaster] = useStateToaster(); - const [loading, setLoading] = useState(true); - const [actionTypes, setActionTypes] = useState<ActionTypeConnector[]>([]); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - const queryFirstTime = useRef(true); - - const refetchActionTypes = useCallback(async () => { - try { - setLoading(true); - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - - const res = await fetchActionTypes({ signal: abortCtrlRef.current.signal }); - - if (!isCancelledRef.current) { - setLoading(false); - setActionTypes(res); - } - } catch (error) { - if (!isCancelledRef.current) { - setLoading(false); - setActionTypes([]); - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - } - }, [dispatchToaster]); - - useEffect(() => { - if (queryFirstTime.current) { - refetchActionTypes(); - queryFirstTime.current = false; - } - - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - queryFirstTime.current = true; - }; - }, [refetchActionTypes]); - - return { - loading, - actionTypes, - refetchActionTypes, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.test.tsx deleted file mode 100644 index 44a503cd089ef..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.test.tsx +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { - initialState, - useCaseConfigure, - ReturnUseCaseConfigure, - ConnectorConfiguration, -} from './use_configure'; -import { mappings, caseConfigurationCamelCaseResponseMock } from './mock'; -import * as api from './api'; -import { ConnectorTypes } from '../../../../../cases/common/api/connectors'; - -jest.mock('./api'); -const mockErrorToToaster = jest.fn(); -jest.mock('../../../common/components/toasters', () => { - const original = jest.requireActual('../../../common/components/toasters'); - return { - ...original, - errorToToaster: () => mockErrorToToaster(), - }; -}); -const configuration: ConnectorConfiguration = { - connector: { - id: '456', - name: 'My connector 2', - type: ConnectorTypes.none, - fields: null, - }, - closureType: 'close-by-pushing', -}; - -describe('useConfigure', () => { - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - ...initialState, - refetchCaseConfigure: result.current.refetchCaseConfigure, - persistCaseConfigure: result.current.persistCaseConfigure, - setCurrentConfiguration: result.current.setCurrentConfiguration, - setConnector: result.current.setConnector, - setClosureType: result.current.setClosureType, - setMappings: result.current.setMappings, - }); - }); - }); - - test('fetch case configuration', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - ...initialState, - closureType: caseConfigurationCamelCaseResponseMock.closureType, - connector: caseConfigurationCamelCaseResponseMock.connector, - currentConfiguration: { - closureType: caseConfigurationCamelCaseResponseMock.closureType, - connector: caseConfigurationCamelCaseResponseMock.connector, - }, - mappings: [], - firstLoad: true, - loading: false, - persistCaseConfigure: result.current.persistCaseConfigure, - refetchCaseConfigure: result.current.refetchCaseConfigure, - setClosureType: result.current.setClosureType, - setConnector: result.current.setConnector, - setCurrentConfiguration: result.current.setCurrentConfiguration, - setMappings: result.current.setMappings, - version: caseConfigurationCamelCaseResponseMock.version, - }); - }); - }); - - test('refetch case configuration', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.refetchCaseConfigure(); - expect(spyOnGetCaseConfigure).toHaveBeenCalledTimes(2); - }); - }); - - test('correctly sets mappings', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current.mappings).toEqual([]); - result.current.setMappings(mappings); - expect(result.current.mappings).toEqual(mappings); - }); - }); - - test('set isLoading to true when fetching case configuration', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.refetchCaseConfigure(); - - expect(result.current.loading).toBe(true); - }); - }); - - test('persist case configuration', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.persistCaseConfigure(configuration); - expect(result.current.persistLoading).toBeTruthy(); - }); - }); - - test('save case configuration - postCaseConfigure', async () => { - // When there is no version, a configuration is created. Otherwise is updated. - const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); - spyOnGetCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - version: '', - }) - ); - - const spyOnPostCaseConfigure = jest.spyOn(api, 'postCaseConfigure'); - spyOnPostCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - ...configuration, - }) - ); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(mockErrorToToaster).not.toHaveBeenCalled(); - - result.current.persistCaseConfigure(configuration); - - expect(result.current.connector.id).toEqual('123'); - await waitForNextUpdate(); - expect(result.current.connector.id).toEqual('456'); - }); - }); - - test('Displays error when present - getCaseConfigure', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); - spyOnGetCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - error: 'uh oh homeboy', - version: '', - }) - ); - - await act(async () => { - const { waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(mockErrorToToaster).toHaveBeenCalled(); - }); - }); - - test('Displays error when present - postCaseConfigure', async () => { - // When there is no version, a configuration is created. Otherwise is updated. - const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); - spyOnGetCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - version: '', - }) - ); - - const spyOnPostCaseConfigure = jest.spyOn(api, 'postCaseConfigure'); - spyOnPostCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - ...configuration, - error: 'uh oh homeboy', - }) - ); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(mockErrorToToaster).not.toHaveBeenCalled(); - - result.current.persistCaseConfigure(configuration); - expect(mockErrorToToaster).not.toHaveBeenCalled(); - await waitForNextUpdate(); - expect(mockErrorToToaster).toHaveBeenCalled(); - }); - }); - - test('save case configuration - patchCaseConfigure', async () => { - const spyOnPatchCaseConfigure = jest.spyOn(api, 'patchCaseConfigure'); - spyOnPatchCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - ...configuration, - }) - ); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - result.current.persistCaseConfigure(configuration); - - expect(result.current.connector.id).toEqual('123'); - await waitForNextUpdate(); - expect(result.current.connector.id).toEqual('456'); - }); - }); - - test('unhappy path - fetch case configuration', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); - spyOnGetCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - ...initialState, - loading: false, - persistCaseConfigure: result.current.persistCaseConfigure, - persistLoading: false, - refetchCaseConfigure: result.current.refetchCaseConfigure, - setClosureType: result.current.setClosureType, - setConnector: result.current.setConnector, - setCurrentConfiguration: result.current.setCurrentConfiguration, - setMappings: result.current.setMappings, - }); - }); - }); - - test('unhappy path - persist case configuration', async () => { - const spyOnGetCaseConfigure = jest.spyOn(api, 'getCaseConfigure'); - spyOnGetCaseConfigure.mockImplementation(() => - Promise.resolve({ - ...caseConfigurationCamelCaseResponseMock, - version: '', - }) - ); - const spyOnPostCaseConfigure = jest.spyOn(api, 'postCaseConfigure'); - spyOnPostCaseConfigure.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ReturnUseCaseConfigure>(() => - useCaseConfigure() - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - result.current.persistCaseConfigure(configuration); - - expect(result.current).toEqual({ - ...initialState, - closureType: caseConfigurationCamelCaseResponseMock.closureType, - connector: caseConfigurationCamelCaseResponseMock.connector, - currentConfiguration: { - closureType: caseConfigurationCamelCaseResponseMock.closureType, - connector: caseConfigurationCamelCaseResponseMock.connector, - }, - firstLoad: true, - loading: false, - mappings: [], - persistCaseConfigure: result.current.persistCaseConfigure, - refetchCaseConfigure: result.current.refetchCaseConfigure, - setClosureType: result.current.setClosureType, - setConnector: result.current.setConnector, - setCurrentConfiguration: result.current.setCurrentConfiguration, - setMappings: result.current.setMappings, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx deleted file mode 100644 index 2087753b26039..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useEffect, useCallback, useReducer, useRef } from 'react'; -import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; - -import { - useStateToaster, - errorToToaster, - displaySuccessToast, -} from '../../../common/components/toasters'; -import * as i18n from './translations'; -import { ClosureType, CaseConfigure, CaseConnector, CaseConnectorMapping } from './types'; -import { ConnectorTypes } from '../../../../../cases/common'; - -export type ConnectorConfiguration = { connector: CaseConnector } & { - closureType: CaseConfigure['closureType']; -}; - -export interface State extends ConnectorConfiguration { - currentConfiguration: ConnectorConfiguration; - firstLoad: boolean; - loading: boolean; - mappings: CaseConnectorMapping[]; - persistLoading: boolean; - version: string; -} -export type Action = - | { - type: 'setCurrentConfiguration'; - currentConfiguration: ConnectorConfiguration; - } - | { - type: 'setConnector'; - connector: CaseConnector; - } - | { - type: 'setLoading'; - payload: boolean; - } - | { - type: 'setFirstLoad'; - payload: boolean; - } - | { - type: 'setPersistLoading'; - payload: boolean; - } - | { - type: 'setVersion'; - payload: string; - } - | { - type: 'setClosureType'; - closureType: ClosureType; - } - | { - type: 'setMappings'; - mappings: CaseConnectorMapping[]; - }; - -export const configureCasesReducer = (state: State, action: Action) => { - switch (action.type) { - case 'setLoading': - return { - ...state, - loading: action.payload, - }; - case 'setFirstLoad': - return { - ...state, - firstLoad: action.payload, - }; - case 'setPersistLoading': - return { - ...state, - persistLoading: action.payload, - }; - case 'setVersion': - return { - ...state, - version: action.payload, - }; - case 'setCurrentConfiguration': { - return { - ...state, - currentConfiguration: { ...action.currentConfiguration }, - }; - } - case 'setConnector': { - return { - ...state, - connector: action.connector, - }; - } - case 'setClosureType': { - return { - ...state, - closureType: action.closureType, - }; - } - case 'setMappings': { - return { - ...state, - mappings: action.mappings, - }; - } - default: - return state; - } -}; - -export interface ReturnUseCaseConfigure extends State { - persistCaseConfigure: ({ connector, closureType }: ConnectorConfiguration) => unknown; - refetchCaseConfigure: () => void; - setClosureType: (closureType: ClosureType) => void; - setConnector: (connector: CaseConnector) => void; - setCurrentConfiguration: (configuration: ConnectorConfiguration) => void; - setMappings: (newMapping: CaseConnectorMapping[]) => void; -} - -export const initialState: State = { - closureType: 'close-by-user', - connector: { - fields: null, - id: 'none', - name: 'none', - type: ConnectorTypes.none, - }, - currentConfiguration: { - closureType: 'close-by-user', - connector: { - fields: null, - id: 'none', - name: 'none', - type: ConnectorTypes.none, - }, - }, - firstLoad: false, - loading: true, - mappings: [], - persistLoading: false, - version: '', -}; - -export const useCaseConfigure = (): ReturnUseCaseConfigure => { - const [state, dispatch] = useReducer(configureCasesReducer, initialState); - - const setCurrentConfiguration = useCallback((configuration: ConnectorConfiguration) => { - dispatch({ - currentConfiguration: configuration, - type: 'setCurrentConfiguration', - }); - }, []); - - const setConnector = useCallback((connector: CaseConnector) => { - dispatch({ - connector, - type: 'setConnector', - }); - }, []); - - const setClosureType = useCallback((closureType: ClosureType) => { - dispatch({ - closureType, - type: 'setClosureType', - }); - }, []); - - const setMappings = useCallback((mappings: CaseConnectorMapping[]) => { - dispatch({ - mappings, - type: 'setMappings', - }); - }, []); - - const setLoading = useCallback((isLoading: boolean) => { - dispatch({ - payload: isLoading, - type: 'setLoading', - }); - }, []); - - const setFirstLoad = useCallback((isFirstLoad: boolean) => { - dispatch({ - payload: isFirstLoad, - type: 'setFirstLoad', - }); - }, []); - - const setPersistLoading = useCallback((isPersistLoading: boolean) => { - dispatch({ - payload: isPersistLoading, - type: 'setPersistLoading', - }); - }, []); - - const setVersion = useCallback((version: string) => { - dispatch({ - payload: version, - type: 'setVersion', - }); - }, []); - - const [, dispatchToaster] = useStateToaster(); - const isCancelledRefetchRef = useRef(false); - const abortCtrlRefetchRef = useRef(new AbortController()); - - const isCancelledPersistRef = useRef(false); - const abortCtrlPersistRef = useRef(new AbortController()); - - const refetchCaseConfigure = useCallback(async () => { - try { - isCancelledRefetchRef.current = false; - abortCtrlRefetchRef.current.abort(); - abortCtrlRefetchRef.current = new AbortController(); - - setLoading(true); - const res = await getCaseConfigure({ signal: abortCtrlRefetchRef.current.signal }); - - if (!isCancelledRefetchRef.current) { - if (res != null) { - setConnector(res.connector); - if (setClosureType != null) { - setClosureType(res.closureType); - } - setVersion(res.version); - setMappings(res.mappings); - - if (!state.firstLoad) { - setFirstLoad(true); - if (setCurrentConfiguration != null) { - setCurrentConfiguration({ - closureType: res.closureType, - connector: { - ...res.connector, - }, - }); - } - } - if (res.error != null) { - errorToToaster({ - dispatchToaster, - error: new Error(res.error), - title: i18n.ERROR_TITLE, - }); - } - } - setLoading(false); - } - } catch (error) { - if (!isCancelledRefetchRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - dispatchToaster, - error: error.body && error.body.message ? new Error(error.body.message) : error, - title: i18n.ERROR_TITLE, - }); - } - setLoading(false); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.firstLoad]); - - const persistCaseConfigure = useCallback( - async ({ connector, closureType }: ConnectorConfiguration) => { - try { - isCancelledPersistRef.current = false; - abortCtrlPersistRef.current.abort(); - abortCtrlPersistRef.current = new AbortController(); - setPersistLoading(true); - - const connectorObj = { - connector, - closure_type: closureType, - }; - - const res = - state.version.length === 0 - ? await postCaseConfigure(connectorObj, abortCtrlPersistRef.current.signal) - : await patchCaseConfigure( - { - ...connectorObj, - version: state.version, - }, - abortCtrlPersistRef.current.signal - ); - - if (!isCancelledPersistRef.current) { - setConnector(res.connector); - if (setClosureType) { - setClosureType(res.closureType); - } - setVersion(res.version); - setMappings(res.mappings); - if (setCurrentConfiguration != null) { - setCurrentConfiguration({ - closureType: res.closureType, - connector: { - ...res.connector, - }, - }); - } - if (res.error != null) { - errorToToaster({ - dispatchToaster, - error: new Error(res.error), - title: i18n.ERROR_TITLE, - }); - } - displaySuccessToast(i18n.SUCCESS_CONFIGURE, dispatchToaster); - setPersistLoading(false); - } - } catch (error) { - if (!isCancelledPersistRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - setConnector(state.currentConfiguration.connector); - setPersistLoading(false); - } - } - }, - [ - dispatchToaster, - setClosureType, - setConnector, - setCurrentConfiguration, - setMappings, - setPersistLoading, - setVersion, - state, - ] - ); - - useEffect(() => { - refetchCaseConfigure(); - return () => { - isCancelledRefetchRef.current = true; - abortCtrlRefetchRef.current.abort(); - isCancelledPersistRef.current = true; - abortCtrlPersistRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return { - ...state, - refetchCaseConfigure, - persistCaseConfigure, - setCurrentConfiguration, - setConnector, - setClosureType, - setMappings, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.test.tsx deleted file mode 100644 index ed1dfcbc40c87..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.test.tsx +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useConnectors, UseConnectorsResponse } from './use_connectors'; -import { connectorsMock } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useConnectors', () => { - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => - useConnectors() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - loading: true, - connectors: [], - refetchConnectors: result.current.refetchConnectors, - }); - }); - }); - - test('fetch connectors', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => - useConnectors() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - loading: false, - connectors: connectorsMock, - refetchConnectors: result.current.refetchConnectors, - }); - }); - }); - - test('refetch connectors', async () => { - const spyOnfetchConnectors = jest.spyOn(api, 'fetchConnectors'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => - useConnectors() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.refetchConnectors(); - expect(spyOnfetchConnectors).toHaveBeenCalledTimes(2); - }); - }); - - test('set isLoading to true when refetching connectors', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => - useConnectors() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.refetchConnectors(); - - expect(result.current.loading).toBe(true); - }); - }); - - test('unhappy path', async () => { - const spyOnfetchConnectors = jest.spyOn(api, 'fetchConnectors'); - spyOnfetchConnectors.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseConnectorsResponse>(() => - useConnectors() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - loading: false, - connectors: [], - refetchConnectors: result.current.refetchConnectors, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx deleted file mode 100644 index 338d04f702c63..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState, useEffect, useCallback, useRef } from 'react'; - -import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; -import * as i18n from '../translations'; -import { fetchConnectors } from './api'; -import { ActionConnector } from './types'; - -export interface UseConnectorsResponse { - loading: boolean; - connectors: ActionConnector[]; - refetchConnectors: () => void; -} - -export const useConnectors = (): UseConnectorsResponse => { - const [, dispatchToaster] = useStateToaster(); - const [loading, setLoading] = useState(true); - const [connectors, setConnectors] = useState<ActionConnector[]>([]); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const refetchConnectors = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - - setLoading(true); - const res = await fetchConnectors({ signal: abortCtrlRef.current.signal }); - - if (!isCancelledRef.current) { - setLoading(false); - setConnectors(res); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - - setLoading(false); - setConnectors([]); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - refetchConnectors(); - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return { - loading, - connectors, - refetchConnectors, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/constants.ts b/x-pack/plugins/security_solution/public/cases/containers/constants.ts deleted file mode 100644 index be030f4d2f75b..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/constants.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export const DEFAULT_TABLE_ACTIVE_PAGE = 1; -export const DEFAULT_TABLE_LIMIT = 5; diff --git a/x-pack/plugins/security_solution/public/cases/containers/mock.ts b/x-pack/plugins/security_solution/public/cases/containers/mock.ts deleted file mode 100644 index 6e937fe7760cd..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/mock.ts +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ActionLicense, AllCases, Case, CasesStatus, CaseUserActions, Comment } from './types'; - -import { - CommentResponse, - CaseStatuses, - UserAction, - UserActionField, - CaseResponse, - CasesStatusResponse, - CaseUserActionsResponse, - CasesResponse, - CasesFindResponse, - CommentType, - AssociationType, - CaseType, -} from '../../../../cases/common/api'; -import { UseGetCasesState, DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; -import { ConnectorTypes } from '../../../../cases/common/api/connectors'; -export { connectorsMock } from './configure/mock'; - -export const basicCaseId = 'basic-case-id'; -export const basicSubCaseId = 'basic-sub-case-id'; -const basicCommentId = 'basic-comment-id'; -const basicCreatedAt = '2020-02-19T23:06:33.798Z'; -const basicUpdatedAt = '2020-02-20T15:02:57.995Z'; -const laterTime = '2020-02-28T15:02:57.995Z'; - -export const elasticUser = { - fullName: 'Leslie Knope', - username: 'lknope', - email: 'leslie.knope@elastic.co', -}; - -export const tags: string[] = ['coke', 'pepsi']; - -export const basicComment: Comment = { - associationType: AssociationType.case, - comment: 'Solve this fast!', - type: CommentType.user, - id: basicCommentId, - createdAt: basicCreatedAt, - createdBy: elasticUser, - pushedAt: null, - pushedBy: null, - updatedAt: null, - updatedBy: null, - version: 'WzQ3LDFc', -}; - -export const alertComment: Comment = { - alertId: 'alert-id-1', - associationType: AssociationType.case, - index: 'alert-index-1', - type: CommentType.alert, - id: 'alert-comment-id', - createdAt: basicCreatedAt, - createdBy: elasticUser, - pushedAt: null, - pushedBy: null, - rule: { - id: 'rule-id-1', - name: 'Awesome rule', - }, - updatedAt: null, - updatedBy: null, - version: 'WzQ3LDFc', -}; - -export const basicCase: Case = { - type: CaseType.individual, - closedAt: null, - closedBy: null, - id: basicCaseId, - comments: [basicComment], - createdAt: basicCreatedAt, - createdBy: elasticUser, - connector: { - id: '123', - name: 'My Connector', - type: ConnectorTypes.none, - fields: null, - }, - description: 'Security banana Issue', - externalService: null, - status: CaseStatuses.open, - tags, - title: 'Another horrible breach!!', - totalComment: 1, - totalAlerts: 0, - updatedAt: basicUpdatedAt, - updatedBy: elasticUser, - version: 'WzQ3LDFd', - settings: { - syncAlerts: true, - }, - subCaseIds: [], -}; - -export const collectionCase: Case = { - type: CaseType.collection, - closedAt: null, - closedBy: null, - id: 'collection-id', - comments: [basicComment], - createdAt: basicCreatedAt, - createdBy: elasticUser, - connector: { - id: '123', - name: 'My Connector', - type: ConnectorTypes.none, - fields: null, - }, - description: 'Security banana Issue', - externalService: null, - status: CaseStatuses.open, - tags, - title: 'Another horrible breach in a collection!!', - totalComment: 1, - totalAlerts: 0, - updatedAt: basicUpdatedAt, - updatedBy: elasticUser, - version: 'WzQ3LDFd', - settings: { - syncAlerts: true, - }, - subCases: [], - subCaseIds: [], -}; - -export const basicCasePost: Case = { - ...basicCase, - updatedAt: null, - updatedBy: null, -}; - -export const basicCommentPatch: Comment = { - ...basicComment, - updatedAt: basicUpdatedAt, - updatedBy: { - username: 'elastic', - }, -}; - -export const basicCaseCommentPatch = { - ...basicCase, - comments: [basicCommentPatch], -}; - -export const casesStatus: CasesStatus = { - countOpenCases: 20, - countInProgressCases: 40, - countClosedCases: 130, -}; - -export const basicPush = { - connectorId: '123', - connectorName: 'connector name', - externalId: 'external_id', - externalTitle: 'external title', - externalUrl: 'basicPush.com', - pushedAt: basicUpdatedAt, - pushedBy: elasticUser, -}; - -export const pushedCase: Case = { - ...basicCase, - externalService: basicPush, -}; - -const basicAction = { - actionAt: basicCreatedAt, - actionBy: elasticUser, - oldValue: null, - newValue: 'what a cool value', - caseId: basicCaseId, - commentId: null, -}; - -export const cases: Case[] = [ - basicCase, - { ...pushedCase, id: '1', totalComment: 0, comments: [] }, - { ...pushedCase, updatedAt: laterTime, id: '2', totalComment: 0, comments: [] }, - { ...basicCase, id: '3', totalComment: 0, comments: [] }, - { ...basicCase, id: '4', totalComment: 0, comments: [] }, -]; - -export const allCases: AllCases = { - cases, - page: 1, - perPage: 5, - total: 10, - ...casesStatus, -}; - -export const actionLicenses: ActionLicense[] = [ - { - id: '.servicenow', - name: 'ServiceNow', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }, - { - id: '.jira', - name: 'Jira', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }, -]; - -// Snake case for mock api responses -export const elasticUserSnake = { - full_name: 'Leslie Knope', - username: 'lknope', - email: 'leslie.knope@elastic.co', -}; - -export const basicCommentSnake: CommentResponse = { - associationType: AssociationType.case, - comment: 'Solve this fast!', - type: CommentType.user, - id: basicCommentId, - created_at: basicCreatedAt, - created_by: elasticUserSnake, - pushed_at: null, - pushed_by: null, - updated_at: null, - updated_by: null, - version: 'WzQ3LDFc', -}; - -export const basicCaseSnake: CaseResponse = { - ...basicCase, - status: CaseStatuses.open, - closed_at: null, - closed_by: null, - comments: [basicCommentSnake], - connector: { - id: '123', - name: 'My Connector', - type: ConnectorTypes.none, - fields: null, - }, - created_at: basicCreatedAt, - created_by: elasticUserSnake, - external_service: null, - updated_at: basicUpdatedAt, - updated_by: elasticUserSnake, -} as CaseResponse; - -export const casesStatusSnake: CasesStatusResponse = { - count_closed_cases: 130, - count_in_progress_cases: 40, - count_open_cases: 20, -}; - -export const pushSnake = { - connector_id: '123', - connector_name: 'connector name', - external_id: 'external_id', - external_title: 'external title', - external_url: 'basicPush.com', -}; - -export const basicPushSnake = { - ...pushSnake, - pushed_at: basicUpdatedAt, - pushed_by: elasticUserSnake, -}; - -export const pushedCaseSnake = { - ...basicCaseSnake, - external_service: basicPushSnake, -}; - -export const reporters: string[] = ['alexis', 'kim', 'maria', 'steph']; -export const respReporters = [ - { username: 'alexis', full_name: null, email: null }, - { username: 'kim', full_name: null, email: null }, - { username: 'maria', full_name: null, email: null }, - { username: 'steph', full_name: null, email: null }, -]; -export const casesSnake: CasesResponse = [ - basicCaseSnake, - { ...pushedCaseSnake, id: '1', totalComment: 0, comments: [] }, - { ...pushedCaseSnake, updated_at: laterTime, id: '2', totalComment: 0, comments: [] }, - { ...basicCaseSnake, id: '3', totalComment: 0, comments: [] }, - { ...basicCaseSnake, id: '4', totalComment: 0, comments: [] }, -]; - -export const allCasesSnake: CasesFindResponse = { - cases: casesSnake, - page: 1, - per_page: 5, - total: 10, - ...casesStatusSnake, -}; - -const basicActionSnake = { - action_at: basicCreatedAt, - action_by: elasticUserSnake, - old_value: null, - new_value: 'what a cool value', - case_id: basicCaseId, - comment_id: null, -}; -export const getUserActionSnake = (af: UserActionField, a: UserAction) => ({ - ...basicActionSnake, - action_id: `${af[0]}-${a}`, - action_field: af, - action: a, - comment_id: af[0] === 'comment' ? basicCommentId : null, - new_value: - a === 'push-to-service' && af[0] === 'pushed' - ? JSON.stringify(basicPushSnake) - : basicAction.newValue, -}); - -export const caseUserActionsSnake: CaseUserActionsResponse = [ - getUserActionSnake(['description'], 'create'), - getUserActionSnake(['comment'], 'create'), - getUserActionSnake(['description'], 'update'), -]; - -// user actions - -export const getUserAction = (af: UserActionField, a: UserAction) => ({ - ...basicAction, - actionId: `${af[0]}-${a}`, - actionField: af, - action: a, - commentId: af[0] === 'comment' ? basicCommentId : null, - newValue: - a === 'push-to-service' && af[0] === 'pushed' - ? JSON.stringify(basicPushSnake) - : basicAction.newValue, -}); - -export const getAlertUserAction = () => ({ - ...basicAction, - actionId: 'alert-action-id', - actionField: ['comment'], - action: 'create', - commentId: 'alert-comment-id', - newValue: '{"type":"alert","alertId":"alert-id-1","index":"index-id-1"}', -}); - -export const caseUserActions: CaseUserActions[] = [ - getUserAction(['description'], 'create'), - getUserAction(['comment'], 'create'), - getUserAction(['description'], 'update'), -]; - -// components tests -export const useGetCasesMockState: UseGetCasesState = { - data: allCases, - loading: [], - selectedCases: [], - isError: false, - queryParams: DEFAULT_QUERY_PARAMS, - filterOptions: DEFAULT_FILTER_OPTIONS, -}; - -export const basicCaseClosed: Case = { - ...basicCase, - closedAt: '2020-02-25T23:06:33.798Z', - closedBy: elasticUser, - status: CaseStatuses.closed, -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/translations.ts b/x-pack/plugins/security_solution/public/cases/containers/translations.ts deleted file mode 100644 index 4c7afc9224445..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/translations.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export * from '../translations'; - -export const ERROR_TITLE = i18n.translate('xpack.securitySolution.containers.cases.errorTitle', { - defaultMessage: 'Error fetching data', -}); - -export const ERROR_DELETING = i18n.translate( - 'xpack.securitySolution.containers.cases.errorDeletingTitle', - { - defaultMessage: 'Error deleting data', - } -); - -export const UPDATED_CASE = (caseTitle: string) => - i18n.translate('xpack.securitySolution.containers.cases.updatedCase', { - values: { caseTitle }, - defaultMessage: 'Updated "{caseTitle}"', - }); - -export const DELETED_CASES = (totalCases: number, caseTitle?: string) => - i18n.translate('xpack.securitySolution.containers.cases.deletedCases', { - values: { caseTitle, totalCases }, - defaultMessage: 'Deleted {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', - }); - -export const CLOSED_CASES = ({ - totalCases, - caseTitle, -}: { - totalCases: number; - caseTitle?: string; -}) => - i18n.translate('xpack.securitySolution.containers.cases.closedCases', { - values: { caseTitle, totalCases }, - defaultMessage: 'Closed {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', - }); - -export const REOPENED_CASES = ({ - totalCases, - caseTitle, -}: { - totalCases: number; - caseTitle?: string; -}) => - i18n.translate('xpack.securitySolution.containers.cases.reopenedCases', { - values: { caseTitle, totalCases }, - defaultMessage: 'Opened {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}}', - }); - -export const MARK_IN_PROGRESS_CASES = ({ - totalCases, - caseTitle, -}: { - totalCases: number; - caseTitle?: string; -}) => - i18n.translate('xpack.securitySolution.containers.cases.markInProgressCases', { - values: { caseTitle, totalCases }, - defaultMessage: - 'Marked {totalCases, plural, =1 {"{caseTitle}"} other {{totalCases} cases}} as in progress', - }); - -export const SUCCESS_SEND_TO_EXTERNAL_SERVICE = (serviceName: string) => - i18n.translate('xpack.securitySolution.containers.cases.pushToExternalService', { - values: { serviceName }, - defaultMessage: 'Successfully sent to { serviceName }', - }); - -export const ERROR_GET_FIELDS = i18n.translate( - 'xpack.securitySolution.cases.configure.errorGetFields', - { - defaultMessage: 'Error getting fields from service', - } -); - -export const SYNC_CASE = (caseTitle: string) => - i18n.translate('xpack.securitySolution.containers.cases.syncCase', { - values: { caseTitle }, - defaultMessage: 'Alerts in "{caseTitle}" have been synced', - }); - -export const STATUS_CHANGED_TOASTER_TEXT = i18n.translate( - 'xpack.securitySolution.cases.containers.statusChangeToasterText', - { - defaultMessage: 'Alerts in this case have been also had their status updated', - } -); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.test.tsx deleted file mode 100644 index d5562afec1d26..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.test.tsx +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { CaseStatuses } from '../../../../cases/common/api'; -import { useUpdateCases, UseUpdateCases } from './use_bulk_update_case'; -import { basicCase } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useUpdateCases', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => - useUpdateCases() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - isUpdated: false, - updateBulkStatus: result.current.updateBulkStatus, - dispatchResetIsUpdated: result.current.dispatchResetIsUpdated, - }); - }); - }); - - it('calls patchCase with correct arguments', async () => { - const spyOnPatchCases = jest.spyOn(api, 'patchCasesStatus'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => - useUpdateCases() - ); - await waitForNextUpdate(); - - result.current.updateBulkStatus([basicCase], CaseStatuses.closed); - await waitForNextUpdate(); - expect(spyOnPatchCases).toBeCalledWith( - [ - { - status: CaseStatuses.closed, - id: basicCase.id, - version: basicCase.version, - }, - ], - abortCtrl.signal - ); - }); - }); - - it('patch cases', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => - useUpdateCases() - ); - await waitForNextUpdate(); - result.current.updateBulkStatus([basicCase], CaseStatuses.closed); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isUpdated: true, - isLoading: false, - isError: false, - updateBulkStatus: result.current.updateBulkStatus, - dispatchResetIsUpdated: result.current.dispatchResetIsUpdated, - }); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => - useUpdateCases() - ); - await waitForNextUpdate(); - result.current.updateBulkStatus([basicCase], CaseStatuses.closed); - - expect(result.current.isLoading).toBe(true); - }); - }); - - it('dispatchResetIsUpdated resets is updated', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => - useUpdateCases() - ); - - await waitForNextUpdate(); - result.current.updateBulkStatus([basicCase], CaseStatuses.closed); - await waitForNextUpdate(); - expect(result.current.isUpdated).toBeTruthy(); - result.current.dispatchResetIsUpdated(); - expect(result.current.isUpdated).toBeFalsy(); - }); - }); - - it('unhappy path', async () => { - const spyOnPatchCases = jest.spyOn(api, 'patchCasesStatus'); - spyOnPatchCases.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCases>(() => - useUpdateCases() - ); - await waitForNextUpdate(); - result.current.updateBulkStatus([basicCase], CaseStatuses.closed); - - expect(result.current).toEqual({ - isUpdated: false, - isLoading: false, - isError: true, - updateBulkStatus: result.current.updateBulkStatus, - dispatchResetIsUpdated: result.current.dispatchResetIsUpdated, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx deleted file mode 100644 index ffb964982d302..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useReducer, useRef, useEffect } from 'react'; -import { CaseStatuses } from '../../../../cases/common'; -import { - displaySuccessToast, - errorToToaster, - useStateToaster, -} from '../../common/components/toasters'; -import * as i18n from './translations'; -import { patchCasesStatus } from './api'; -import { BulkUpdateStatus, Case } from './types'; - -interface UpdateState { - isUpdated: boolean; - isLoading: boolean; - isError: boolean; -} -type Action = - | { type: 'FETCH_INIT' } - | { type: 'FETCH_SUCCESS'; payload: boolean } - | { type: 'FETCH_FAILURE' } - | { type: 'RESET_IS_UPDATED' }; - -const dataFetchReducer = (state: UpdateState, action: Action): UpdateState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - isUpdated: action.payload, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - }; - case 'RESET_IS_UPDATED': - return { - ...state, - isUpdated: false, - }; - default: - return state; - } -}; -export interface UseUpdateCases extends UpdateState { - updateBulkStatus: (cases: Case[], status: string) => void; - dispatchResetIsUpdated: () => void; -} - -const getStatusToasterMessage = ( - status: CaseStatuses, - messageArgs: { - totalCases: number; - caseTitle?: string; - } -): string => { - if (status === CaseStatuses.open) { - return i18n.REOPENED_CASES(messageArgs); - } else if (status === CaseStatuses['in-progress']) { - return i18n.MARK_IN_PROGRESS_CASES(messageArgs); - } else if (status === CaseStatuses.closed) { - return i18n.CLOSED_CASES(messageArgs); - } - - return ''; -}; - -export const useUpdateCases = (): UseUpdateCases => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, - isUpdated: false, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const dispatchUpdateCases = useCallback(async (cases: BulkUpdateStatus[], action: string) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - - dispatch({ type: 'FETCH_INIT' }); - const patchResponse = await patchCasesStatus(cases, abortCtrlRef.current.signal); - - if (!isCancelledRef.current) { - const resultCount = Object.keys(patchResponse).length; - const firstTitle = patchResponse[0].title; - - dispatch({ type: 'FETCH_SUCCESS', payload: true }); - const messageArgs = { - totalCases: resultCount, - caseTitle: resultCount === 1 ? firstTitle : '', - }; - - const message = - action === 'status' ? getStatusToasterMessage(patchResponse[0].status, messageArgs) : ''; - - displaySuccessToast(message, dispatchToaster); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const dispatchResetIsUpdated = useCallback(() => { - dispatch({ type: 'RESET_IS_UPDATED' }); - }, []); - - const updateBulkStatus = useCallback( - (cases: Case[], status: string) => { - const updateCasesStatus: BulkUpdateStatus[] = cases.map((theCase) => ({ - status, - id: theCase.id, - version: theCase.version, - })); - dispatchUpdateCases(updateCasesStatus, 'status'); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ); - - useEffect(() => { - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - }, []); - - return { ...state, updateBulkStatus, dispatchResetIsUpdated }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.test.tsx deleted file mode 100644 index b4fa816412c68..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.test.tsx +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { CaseType } from '../../../../cases/common/api'; -import { useDeleteCases, UseDeleteCase } from './use_delete_cases'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useDeleteCases', () => { - const abortCtrl = new AbortController(); - const deleteObj = [ - { id: '1', type: CaseType.individual }, - { id: '2', type: CaseType.individual }, - { id: '3', type: CaseType.individual }, - ]; - const deleteArr = ['1', '2', '3']; - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => - useDeleteCases() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isDisplayConfirmDeleteModal: false, - isLoading: false, - isError: false, - isDeleted: false, - dispatchResetIsDeleted: result.current.dispatchResetIsDeleted, - handleOnDeleteConfirm: result.current.handleOnDeleteConfirm, - handleToggleModal: result.current.handleToggleModal, - }); - }); - }); - - it('calls deleteCases with correct arguments', async () => { - const spyOnDeleteCases = jest.spyOn(api, 'deleteCases'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => - useDeleteCases() - ); - await waitForNextUpdate(); - - result.current.handleOnDeleteConfirm(deleteObj); - await waitForNextUpdate(); - expect(spyOnDeleteCases).toBeCalledWith(deleteArr, abortCtrl.signal); - }); - }); - - it('deletes cases', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => - useDeleteCases() - ); - await waitForNextUpdate(); - result.current.handleToggleModal(); - result.current.handleOnDeleteConfirm(deleteObj); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isDisplayConfirmDeleteModal: false, - isLoading: false, - isError: false, - isDeleted: true, - dispatchResetIsDeleted: result.current.dispatchResetIsDeleted, - handleOnDeleteConfirm: result.current.handleOnDeleteConfirm, - handleToggleModal: result.current.handleToggleModal, - }); - }); - }); - - it('resets is deleting', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => - useDeleteCases() - ); - await waitForNextUpdate(); - result.current.handleToggleModal(); - result.current.handleOnDeleteConfirm(deleteObj); - await waitForNextUpdate(); - expect(result.current.isDeleted).toBeTruthy(); - result.current.handleToggleModal(); - result.current.dispatchResetIsDeleted(); - expect(result.current.isDeleted).toBeFalsy(); - }); - }); - - it('set isLoading to true when deleting cases', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => - useDeleteCases() - ); - await waitForNextUpdate(); - result.current.handleToggleModal(); - result.current.handleOnDeleteConfirm(deleteObj); - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnDeleteCases = jest.spyOn(api, 'deleteCases'); - spyOnDeleteCases.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseDeleteCase>(() => - useDeleteCases() - ); - await waitForNextUpdate(); - result.current.handleToggleModal(); - result.current.handleOnDeleteConfirm(deleteObj); - - expect(result.current).toEqual({ - isDisplayConfirmDeleteModal: false, - isLoading: false, - isError: true, - isDeleted: false, - dispatchResetIsDeleted: result.current.dispatchResetIsDeleted, - handleOnDeleteConfirm: result.current.handleOnDeleteConfirm, - handleToggleModal: result.current.handleToggleModal, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx deleted file mode 100644 index f3d59a2883f2a..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useReducer, useRef, useEffect } from 'react'; -import { - displaySuccessToast, - errorToToaster, - useStateToaster, -} from '../../common/components/toasters'; -import * as i18n from './translations'; -import { deleteCases, deleteSubCases } from './api'; -import { DeleteCase } from './types'; - -interface DeleteState { - isDisplayConfirmDeleteModal: boolean; - isDeleted: boolean; - isLoading: boolean; - isError: boolean; -} -type Action = - | { type: 'DISPLAY_MODAL'; payload: boolean } - | { type: 'FETCH_INIT' } - | { type: 'FETCH_SUCCESS'; payload: boolean } - | { type: 'FETCH_FAILURE' } - | { type: 'RESET_IS_DELETED' }; - -const dataFetchReducer = (state: DeleteState, action: Action): DeleteState => { - switch (action.type) { - case 'DISPLAY_MODAL': - return { - ...state, - isDisplayConfirmDeleteModal: action.payload, - }; - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - isDeleted: action.payload, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - }; - case 'RESET_IS_DELETED': - return { - ...state, - isDeleted: false, - }; - default: - return state; - } -}; - -export interface UseDeleteCase extends DeleteState { - dispatchResetIsDeleted: () => void; - handleOnDeleteConfirm: (cases: DeleteCase[]) => void; - handleToggleModal: () => void; -} - -export const useDeleteCases = (): UseDeleteCase => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isDisplayConfirmDeleteModal: false, - isLoading: false, - isError: false, - isDeleted: false, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const dispatchDeleteCases = useCallback(async (cases: DeleteCase[]) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT' }); - - const caseIds = cases.map((theCase) => theCase.id); - // We don't allow user batch delete sub cases on UI at the moment. - if (cases[0].type != null || cases.length > 1) { - await deleteCases(caseIds, abortCtrlRef.current.signal); - } else { - await deleteSubCases(caseIds, abortCtrlRef.current.signal); - } - - if (!isCancelledRef.current) { - dispatch({ type: 'FETCH_SUCCESS', payload: true }); - displaySuccessToast( - i18n.DELETED_CASES(cases.length, cases.length === 1 ? cases[0].title : ''), - dispatchToaster - ); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_DELETING, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const dispatchToggleDeleteModal = useCallback(() => { - dispatch({ type: 'DISPLAY_MODAL', payload: !state.isDisplayConfirmDeleteModal }); - }, [state.isDisplayConfirmDeleteModal]); - - const dispatchResetIsDeleted = useCallback(() => { - dispatch({ type: 'RESET_IS_DELETED' }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.isDisplayConfirmDeleteModal]); - - const handleOnDeleteConfirm = useCallback( - (cases: DeleteCase[]) => { - dispatchDeleteCases(cases); - dispatchToggleDeleteModal(); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [state.isDisplayConfirmDeleteModal] - ); - const handleToggleModal = useCallback(() => { - dispatchToggleDeleteModal(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.isDisplayConfirmDeleteModal]); - - useEffect(() => { - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - }, []); - - return { ...state, dispatchResetIsDeleted, handleOnDeleteConfirm, handleToggleModal }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.test.tsx deleted file mode 100644 index 4c6cbae0c8981..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.test.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { initialData, useGetActionLicense, ActionLicenseState } from './use_get_action_license'; -import { actionLicenses } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetActionLicense', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => - useGetActionLicense() - ); - await waitForNextUpdate(); - expect(result.current).toEqual(initialData); - }); - }); - - it('calls getActionLicense with correct arguments', async () => { - const spyOnGetActionLicense = jest.spyOn(api, 'getActionLicense'); - - await act(async () => { - const { waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => - useGetActionLicense() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetActionLicense).toBeCalledWith(abortCtrl.signal); - }); - }); - - it('gets action license', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => - useGetActionLicense() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - actionLicense: actionLicenses[1], - }); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => - useGetActionLicense() - ); - await waitForNextUpdate(); - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnGetActionLicense = jest.spyOn(api, 'getActionLicense'); - spyOnGetActionLicense.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, ActionLicenseState>(() => - useGetActionLicense() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - actionLicense: null, - isLoading: false, - isError: true, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx deleted file mode 100644 index 9b10247794c8d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useEffect, useState, useRef } from 'react'; - -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { getActionLicense } from './api'; -import * as i18n from './translations'; -import { ActionLicense } from './types'; - -export interface ActionLicenseState { - actionLicense: ActionLicense | null; - isLoading: boolean; - isError: boolean; -} - -export const initialData: ActionLicenseState = { - actionLicense: null, - isLoading: true, - isError: false, -}; - -const MINIMUM_LICENSE_REQUIRED_CONNECTOR = '.jira'; - -export const useGetActionLicense = (): ActionLicenseState => { - const [actionLicenseState, setActionLicensesState] = useState<ActionLicenseState>(initialData); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const fetchActionLicense = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - setActionLicensesState({ - ...initialData, - isLoading: true, - }); - - const response = await getActionLicense(abortCtrlRef.current.signal); - - if (!isCancelledRef.current) { - setActionLicensesState({ - actionLicense: response.find((l) => l.id === MINIMUM_LICENSE_REQUIRED_CONNECTOR) ?? null, - isLoading: false, - isError: false, - }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - - setActionLicensesState({ - actionLicense: null, - isLoading: false, - isError: true, - }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [actionLicenseState]); - - useEffect(() => { - fetchActionLicense(); - - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return { ...actionLicenseState }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case.test.tsx deleted file mode 100644 index a3d64a17727e5..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.test.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useGetCase, UseGetCase } from './use_get_case'; -import { basicCase } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetCase', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => - useGetCase(basicCase.id) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - data: null, - isLoading: false, - isError: false, - fetchCase: result.current.fetchCase, - updateCase: result.current.updateCase, - }); - }); - }); - - it('calls getCase with correct arguments', async () => { - const spyOnGetCase = jest.spyOn(api, 'getCase'); - await act(async () => { - const { waitForNextUpdate } = renderHook<string, UseGetCase>(() => useGetCase(basicCase.id)); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetCase).toBeCalledWith(basicCase.id, true, abortCtrl.signal); - }); - }); - - it('fetch case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => - useGetCase(basicCase.id) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - data: basicCase, - isLoading: false, - isError: false, - fetchCase: result.current.fetchCase, - updateCase: result.current.updateCase, - }); - }); - }); - - it('refetch case', async () => { - const spyOnGetCase = jest.spyOn(api, 'getCase'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => - useGetCase(basicCase.id) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.fetchCase(); - expect(spyOnGetCase).toHaveBeenCalledTimes(2); - }); - }); - - it('set isLoading to true when refetching case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => - useGetCase(basicCase.id) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.fetchCase(); - - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnGetCase = jest.spyOn(api, 'getCase'); - spyOnGetCase.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCase>(() => - useGetCase(basicCase.id) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - data: null, - isLoading: false, - isError: true, - fetchCase: result.current.fetchCase, - updateCase: result.current.updateCase, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx deleted file mode 100644 index 70e202b5d6bdf..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useEffect, useReducer, useCallback, useRef } from 'react'; - -import { Case } from './types'; -import * as i18n from './translations'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { getCase, getSubCase } from './api'; - -interface CaseState { - data: Case | null; - isLoading: boolean; - isError: boolean; -} - -type Action = - | { type: 'FETCH_INIT' } - | { type: 'FETCH_SUCCESS'; payload: Case } - | { type: 'FETCH_FAILURE' } - | { type: 'UPDATE_CASE'; payload: Case }; - -const dataFetchReducer = (state: CaseState, action: Action): CaseState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - data: action.payload, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - }; - case 'UPDATE_CASE': - return { - ...state, - data: action.payload, - }; - default: - return state; - } -}; - -export interface UseGetCase extends CaseState { - fetchCase: () => void; - updateCase: (newCase: Case) => void; -} - -export const useGetCase = (caseId: string, subCaseId?: string): UseGetCase => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, - data: null, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const updateCase = useCallback((newCase: Case) => { - dispatch({ type: 'UPDATE_CASE', payload: newCase }); - }, []); - - const callFetch = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT' }); - - const response = await (subCaseId - ? getSubCase(caseId, subCaseId, true, abortCtrlRef.current.signal) - : getCase(caseId, true, abortCtrlRef.current.signal)); - - if (!isCancelledRef.current) { - dispatch({ type: 'FETCH_SUCCESS', payload: response }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [caseId, subCaseId]); - - useEffect(() => { - callFetch(); - - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [caseId, subCaseId]); - return { ...state, fetchCase: callFetch, updateCase }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.test.tsx deleted file mode 100644 index 1c8096198007e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.test.tsx +++ /dev/null @@ -1,710 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { - getPushedInfo, - initialData, - useGetCaseUserActions, - UseGetCaseUserActions, -} from './use_get_case_user_actions'; -import { - basicCase, - basicPush, - basicPushSnake, - caseUserActions, - elasticUser, - getUserAction, -} from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetCaseUserActions', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => - useGetCaseUserActions(basicCase.id, basicCase.connector.id) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - ...initialData, - fetchCaseUserActions: result.current.fetchCaseUserActions, - }); - }); - }); - - it('calls getCaseUserActions with correct arguments', async () => { - const spyOnPostCase = jest.spyOn(api, 'getCaseUserActions'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => - useGetCaseUserActions(basicCase.id, basicCase.connector.id) - ); - await waitForNextUpdate(); - - result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); - await waitForNextUpdate(); - expect(spyOnPostCase).toBeCalledWith(basicCase.id, abortCtrl.signal); - }); - }); - - it('returns proper state on getCaseUserActions', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => - useGetCaseUserActions(basicCase.id, basicCase.connector.id) - ); - await waitForNextUpdate(); - result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); - await waitForNextUpdate(); - expect(result.current).toEqual({ - ...initialData, - caseUserActions: caseUserActions.slice(1), - fetchCaseUserActions: result.current.fetchCaseUserActions, - hasDataToPush: true, - isError: false, - isLoading: false, - participants: [elasticUser], - }); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => - useGetCaseUserActions(basicCase.id, basicCase.connector.id) - ); - await waitForNextUpdate(); - result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); - - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnPostCase = jest.spyOn(api, 'getCaseUserActions'); - spyOnPostCase.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCaseUserActions>(() => - useGetCaseUserActions(basicCase.id, basicCase.connector.id) - ); - await waitForNextUpdate(); - result.current.fetchCaseUserActions(basicCase.id, basicCase.connector.id); - - expect(result.current).toEqual({ - ...initialData, - isLoading: false, - isError: true, - fetchCaseUserActions: result.current.fetchCaseUserActions, - }); - }); - }); - - describe('getPushedInfo', () => { - it('Correctly marks first/last index - hasDataToPush: false', () => { - const userActions = [...caseUserActions, getUserAction(['pushed'], 'push-to-service')]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Correctly marks first/last index and comment id - hasDataToPush: true', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'create'), - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [userActions[userActions.length - 1].commentId], - hasDataToPush: true, - }, - }, - }); - }); - - it('Correctly marks first/last index and multiple comment ids, both needs push', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'create'), - { ...getUserAction(['comment'], 'create'), commentId: 'muahaha' }, - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [ - userActions[userActions.length - 2].commentId, - userActions[userActions.length - 1].commentId, - ], - hasDataToPush: true, - }, - }, - }); - }); - - it('Correctly marks first/last index and multiple comment ids, one needs push', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'create'), - getUserAction(['pushed'], 'push-to-service'), - { ...getUserAction(['comment'], 'create'), commentId: 'muahaha' }, - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 5, - commentsToUpdate: [userActions[userActions.length - 1].commentId], - hasDataToPush: true, - }, - }, - }); - }); - - it('Correctly marks first/last index and multiple comment ids, one needs push and one needs update', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'create'), - getUserAction(['pushed'], 'push-to-service'), - { ...getUserAction(['comment'], 'create'), commentId: 'muahaha' }, - getUserAction(['comment'], 'update'), - getUserAction(['comment'], 'update'), - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 5, - commentsToUpdate: [ - userActions[userActions.length - 3].commentId, - userActions[userActions.length - 1].commentId, - ], - hasDataToPush: true, - }, - }, - }); - }); - - it('Does not count connector update as a reason to push', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['connector'], 'update'), - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Correctly handles multiple push actions', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'create'), - getUserAction(['pushed'], 'push-to-service'), - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 5, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Correctly handles comment update with multiple push actions', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'create'), - getUserAction(['pushed'], 'push-to-service'), - getUserAction(['comment'], 'update'), - ]; - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 5, - commentsToUpdate: [userActions[userActions.length - 1].commentId], - hasDataToPush: true, - }, - }, - }); - }); - - it('Multiple connector tracking - hasDataToPush: true', () => { - const pushAction123 = getUserAction(['pushed'], 'push-to-service'); - const push456 = { - ...basicPushSnake, - connector_id: '456', - connector_name: 'other connector name', - external_id: 'other_external_id', - }; - - const pushAction456 = { - ...getUserAction(['pushed'], 'push-to-service'), - newValue: JSON.stringify(push456), - }; - - const userActions = [ - ...caseUserActions, - pushAction123, - getUserAction(['comment'], 'create'), - pushAction456, - ]; - - const result = getPushedInfo(userActions, '123'); - - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [userActions[userActions.length - 2].commentId], - hasDataToPush: true, - }, - '456': { - ...basicPush, - connectorId: '456', - connectorName: 'other connector name', - externalId: 'other_external_id', - firstPushIndex: 5, - lastPushIndex: 5, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Multiple connector tracking - hasDataToPush: false', () => { - const pushAction123 = getUserAction(['pushed'], 'push-to-service'); - const push456 = { - ...basicPushSnake, - connector_id: '456', - connector_name: 'other connector name', - external_id: 'other_external_id', - }; - - const pushAction456 = { - ...getUserAction(['pushed'], 'push-to-service'), - newValue: JSON.stringify(push456), - }; - - const userActions = [ - ...caseUserActions, - pushAction123, - getUserAction(['comment'], 'create'), - pushAction456, - ]; - - const result = getPushedInfo(userActions, '456'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [userActions[userActions.length - 2].commentId], - hasDataToPush: true, - }, - '456': { - ...basicPush, - connectorId: '456', - connectorName: 'other connector name', - externalId: 'other_external_id', - firstPushIndex: 5, - lastPushIndex: 5, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Change fields of current connector - hasDataToPush: true', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [], - hasDataToPush: true, - }, - }, - }); - }); - - it('Change current connector - hasDataToPush: true', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Change connector and back - hasDataToPush: true', () => { - const userActions = [ - ...caseUserActions, - getUserAction(['pushed'], 'push-to-service'), - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 3, - lastPushIndex: 3, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Change fields and connector after push - hasDataToPush: true', () => { - const userActions = [ - ...caseUserActions, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - getUserAction(['pushed'], 'push-to-service'), - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 4, - lastPushIndex: 4, - commentsToUpdate: [], - hasDataToPush: true, - }, - }, - }); - }); - - it('Change only connector after push - hasDataToPush: false', () => { - const userActions = [ - ...caseUserActions, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - getUserAction(['pushed'], 'push-to-service'), - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 4, - lastPushIndex: 4, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Change connectors and fields - multiple pushes', () => { - const pushAction123 = getUserAction(['pushed'], 'push-to-service'); - const push456 = { - ...basicPushSnake, - connector_id: '456', - connector_name: 'other connector name', - external_id: 'other_external_id', - }; - - const pushAction456 = { - ...getUserAction(['pushed'], 'push-to-service'), - newValue: JSON.stringify(push456), - }; - - const userActions = [ - ...caseUserActions, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - pushAction123, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - pushAction456, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), - }, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'Low' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: true, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 4, - lastPushIndex: 4, - commentsToUpdate: [], - hasDataToPush: true, - }, - '456': { - ...basicPush, - connectorId: '456', - connectorName: 'other connector name', - externalId: 'other_external_id', - firstPushIndex: 6, - lastPushIndex: 6, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('pushing other connectors does not count as an update', () => { - const pushAction123 = getUserAction(['pushed'], 'push-to-service'); - const push456 = { - ...basicPushSnake, - connector_id: '456', - connector_name: 'other connector name', - external_id: 'other_external_id', - }; - - const pushAction456 = { - ...getUserAction(['pushed'], 'push-to-service'), - newValue: JSON.stringify(push456), - }; - const userActions = [ - ...caseUserActions, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - pushAction123, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - pushAction456, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 4, - lastPushIndex: 4, - commentsToUpdate: [], - hasDataToPush: false, - }, - '456': { - ...basicPush, - connectorId: '456', - connectorName: 'other connector name', - externalId: 'other_external_id', - firstPushIndex: 6, - lastPushIndex: 6, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - - it('Changing other connectors fields does not count as an update', () => { - const userActions = [ - ...caseUserActions, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: null } }), - newValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - }, - getUserAction(['pushed'], 'push-to-service'), - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '123', fields: { issueType: '10006', priority: 'High' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - }, - { - ...getUserAction(['connector'], 'update'), - oldValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '6' } }), - newValue: JSON.stringify({ id: '456', fields: { issueTypes: ['10'], severity: '3' } }), - }, - ]; - - const result = getPushedInfo(userActions, '123'); - expect(result).toEqual({ - hasDataToPush: false, - caseServices: { - '123': { - ...basicPush, - firstPushIndex: 4, - lastPushIndex: 4, - commentsToUpdate: [], - hasDataToPush: false, - }, - }, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx deleted file mode 100644 index 3b28c20d9a4df..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { isEmpty, uniqBy } from 'lodash/fp'; -import { useCallback, useEffect, useState, useRef } from 'react'; -import deepEqual from 'fast-deep-equal'; - -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { CaseFullExternalService } from '../../../../cases/common/api/cases'; -import { getCaseUserActions, getSubCaseUserActions } from './api'; -import * as i18n from './translations'; -import { CaseConnector, CaseExternalService, CaseUserActions, ElasticUser } from './types'; -import { convertToCamelCase, parseString } from './utils'; - -export interface CaseService extends CaseExternalService { - firstPushIndex: number; - lastPushIndex: number; - commentsToUpdate: string[]; - hasDataToPush: boolean; -} - -export interface CaseServices { - [key: string]: CaseService; -} - -interface CaseUserActionsState { - caseServices: CaseServices; - caseUserActions: CaseUserActions[]; - hasDataToPush: boolean; - isError: boolean; - isLoading: boolean; - participants: ElasticUser[]; -} - -export const initialData: CaseUserActionsState = { - caseServices: {}, - caseUserActions: [], - hasDataToPush: false, - isError: false, - isLoading: true, - participants: [], -}; - -export interface UseGetCaseUserActions extends CaseUserActionsState { - fetchCaseUserActions: (caseId: string, caseConnectorId: string, subCaseId?: string) => void; -} - -const getExternalService = (value: string): CaseExternalService | null => - convertToCamelCase<CaseFullExternalService, CaseExternalService>(parseString(`${value}`)); - -const groupConnectorFields = ( - userActions: CaseUserActions[] -): Record<string, Array<CaseConnector['fields']>> => - userActions.reduce((acc, mua) => { - if (mua.actionField[0] !== 'connector') { - return acc; - } - - const oldValue = parseString(`${mua.oldValue}`); - const newValue = parseString(`${mua.newValue}`); - - if (oldValue == null || newValue == null) { - return acc; - } - - return { - ...acc, - [oldValue.id]: [ - ...(acc[oldValue.id] || []), - ...(oldValue.id === newValue.id ? [oldValue.fields, newValue.fields] : [oldValue.fields]), - ], - [newValue.id]: [ - ...(acc[newValue.id] || []), - ...(oldValue.id === newValue.id ? [oldValue.fields, newValue.fields] : [newValue.fields]), - ], - }; - }, {} as Record<string, Array<CaseConnector['fields']>>); - -const connectorHasChangedFields = ({ - connectorFieldsBeforePush, - connectorFieldsAfterPush, - connectorId, -}: { - connectorFieldsBeforePush: Record<string, Array<CaseConnector['fields']>> | null; - connectorFieldsAfterPush: Record<string, Array<CaseConnector['fields']>> | null; - connectorId: string; -}): boolean => { - if (connectorFieldsAfterPush == null || connectorFieldsAfterPush[connectorId] == null) { - return false; - } - - const fieldsAfterPush = connectorFieldsAfterPush[connectorId]; - - if (connectorFieldsBeforePush != null && connectorFieldsBeforePush[connectorId] != null) { - const fieldsBeforePush = connectorFieldsBeforePush[connectorId]; - return !deepEqual( - fieldsBeforePush[fieldsBeforePush.length - 1], - fieldsAfterPush[fieldsAfterPush.length - 1] - ); - } - - if (fieldsAfterPush.length >= 2) { - return !deepEqual( - fieldsAfterPush[fieldsAfterPush.length - 2], - fieldsAfterPush[fieldsAfterPush.length - 1] - ); - } - - return false; -}; - -interface CommentsAndIndex { - commentId: string; - commentIndex: number; -} - -export const getPushedInfo = ( - caseUserActions: CaseUserActions[], - caseConnectorId: string -): { - caseServices: CaseServices; - hasDataToPush: boolean; -} => { - const hasDataToPushForConnector = (connectorId: string): boolean => { - const caseUserActionsReversed = [...caseUserActions].reverse(); - const lastPushOfConnectorReversedIndex = caseUserActionsReversed.findIndex( - (mua) => - mua.action === 'push-to-service' && - getExternalService(`${mua.newValue}`)?.connectorId === connectorId - ); - - if (lastPushOfConnectorReversedIndex === -1) { - return true; - } - - const lastPushOfConnectorIndex = - caseUserActionsReversed.length - lastPushOfConnectorReversedIndex - 1; - - const actionsBeforePush = caseUserActions.slice(0, lastPushOfConnectorIndex); - const actionsAfterPush = caseUserActions.slice( - lastPushOfConnectorIndex + 1, - caseUserActionsReversed.length - ); - - const connectorFieldsBeforePush = groupConnectorFields(actionsBeforePush); - const connectorFieldsAfterPush = groupConnectorFields(actionsAfterPush); - - const connectorHasChanged = connectorHasChangedFields({ - connectorFieldsBeforePush, - connectorFieldsAfterPush, - connectorId, - }); - - return ( - actionsAfterPush.some( - (mua) => mua.actionField[0] !== 'connector' && mua.action !== 'push-to-service' - ) || connectorHasChanged - ); - }; - - const commentsAndIndex = caseUserActions.reduce<CommentsAndIndex[]>( - (bacc, mua, index) => - mua.actionField[0] === 'comment' && mua.commentId != null - ? [ - ...bacc, - { - commentId: mua.commentId, - commentIndex: index, - }, - ] - : bacc, - [] - ); - - let caseServices = caseUserActions.reduce<CaseServices>((acc, cua, i) => { - if (cua.action !== 'push-to-service') { - return acc; - } - - const externalService = getExternalService(`${cua.newValue}`); - if (externalService === null) { - return acc; - } - - return { - ...acc, - ...(acc[externalService.connectorId] != null - ? { - [externalService.connectorId]: { - ...acc[externalService.connectorId], - ...externalService, - lastPushIndex: i, - commentsToUpdate: [], - }, - } - : { - [externalService.connectorId]: { - ...externalService, - firstPushIndex: i, - lastPushIndex: i, - hasDataToPush: hasDataToPushForConnector(externalService.connectorId), - commentsToUpdate: [], - }, - }), - }; - }, {}); - - caseServices = Object.keys(caseServices).reduce<CaseServices>((acc, key) => { - return { - ...acc, - [key]: { - ...caseServices[key], - // if the comment happens after the lastUpdateToCaseIndex, it should be included in commentsToUpdate - commentsToUpdate: commentsAndIndex.reduce<string[]>( - (bacc, currentComment) => - currentComment.commentIndex > caseServices[key].lastPushIndex - ? bacc.indexOf(currentComment.commentId) > -1 - ? [...bacc.filter((e) => e !== currentComment.commentId), currentComment.commentId] - : [...bacc, currentComment.commentId] - : bacc, - [] - ), - }, - }; - }, {}); - - const hasDataToPush = - caseServices[caseConnectorId] != null ? caseServices[caseConnectorId].hasDataToPush : true; - return { - hasDataToPush, - caseServices, - }; -}; - -export const useGetCaseUserActions = ( - caseId: string, - caseConnectorId: string, - subCaseId?: string -): UseGetCaseUserActions => { - const [caseUserActionsState, setCaseUserActionsState] = useState<CaseUserActionsState>( - initialData - ); - const abortCtrlRef = useRef(new AbortController()); - const isCancelledRef = useRef(false); - const [, dispatchToaster] = useStateToaster(); - - const fetchCaseUserActions = useCallback( - async (thisCaseId: string, thisCaseConnectorId: string, thisSubCaseId?: string) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - setCaseUserActionsState({ - ...caseUserActionsState, - isLoading: true, - }); - - const response = await (thisSubCaseId - ? getSubCaseUserActions(thisCaseId, thisSubCaseId, abortCtrlRef.current.signal) - : getCaseUserActions(thisCaseId, abortCtrlRef.current.signal)); - - if (!isCancelledRef.current) { - // Attention Future developer - // We are removing the first item because it will always be the creation of the case - // and we do not want it to simplify our life - const participants = !isEmpty(response) - ? uniqBy('actionBy.username', response).map((cau) => cau.actionBy) - : []; - - const caseUserActions = !isEmpty(response) - ? thisSubCaseId - ? response - : response.slice(1) - : []; - - setCaseUserActionsState({ - caseUserActions, - ...getPushedInfo(caseUserActions, thisCaseConnectorId), - isLoading: false, - isError: false, - participants, - }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - - setCaseUserActionsState({ - caseServices: {}, - caseUserActions: [], - hasDataToPush: false, - isError: true, - isLoading: false, - participants: [], - }); - } - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [caseUserActionsState] - ); - - useEffect(() => { - if (!isEmpty(caseId)) { - fetchCaseUserActions(caseId, caseConnectorId, subCaseId); - } - - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [caseId, subCaseId]); - return { ...caseUserActionsState, fetchCaseUserActions }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.test.tsx deleted file mode 100644 index 3a62ae70b82de..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.test.tsx +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { CaseStatuses } from '../../../../cases/common/api'; -import { - DEFAULT_FILTER_OPTIONS, - DEFAULT_QUERY_PARAMS, - initialData, - useGetCases, - UseGetCases, -} from './use_get_cases'; -import { UpdateKey } from './types'; -import { allCases, basicCase } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetCases', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - expect(result.current).toEqual({ - data: initialData, - dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty, - filterOptions: DEFAULT_FILTER_OPTIONS, - isError: false, - loading: [], - queryParams: DEFAULT_QUERY_PARAMS, - refetchCases: result.current.refetchCases, - selectedCases: [], - setFilters: result.current.setFilters, - setQueryParams: result.current.setQueryParams, - setSelectedCases: result.current.setSelectedCases, - }); - }); - }); - - it('calls getCases with correct arguments', async () => { - const spyOnGetCases = jest.spyOn(api, 'getCases'); - await act(async () => { - const { waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetCases).toBeCalledWith({ - filterOptions: DEFAULT_FILTER_OPTIONS, - queryParams: DEFAULT_QUERY_PARAMS, - signal: abortCtrl.signal, - }); - }); - }); - - it('fetch cases', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - data: allCases, - dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty, - filterOptions: DEFAULT_FILTER_OPTIONS, - isError: false, - loading: [], - queryParams: DEFAULT_QUERY_PARAMS, - refetchCases: result.current.refetchCases, - selectedCases: [], - setFilters: result.current.setFilters, - setQueryParams: result.current.setQueryParams, - setSelectedCases: result.current.setSelectedCases, - }); - }); - }); - it('dispatch update case property', async () => { - const spyOnPatchCase = jest.spyOn(api, 'patchCase'); - await act(async () => { - const updateCase = { - updateKey: 'description' as UpdateKey, - updateValue: 'description update', - caseId: basicCase.id, - refetchCasesStatus: jest.fn(), - version: '99999', - }; - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.dispatchUpdateCaseProperty(updateCase); - expect(result.current.loading).toEqual(['caseUpdate']); - expect(spyOnPatchCase).toBeCalledWith( - basicCase.id, - { [updateCase.updateKey]: updateCase.updateValue }, - updateCase.version, - abortCtrl.signal - ); - }); - }); - - it('refetch cases', async () => { - const spyOnGetCases = jest.spyOn(api, 'getCases'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.refetchCases(); - expect(spyOnGetCases).toHaveBeenCalledTimes(2); - }); - }); - - it('set isLoading to true when refetching case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.refetchCases(); - - expect(result.current.loading).toEqual(['cases']); - }); - }); - - it('unhappy path', async () => { - const spyOnGetCases = jest.spyOn(api, 'getCases'); - spyOnGetCases.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - data: initialData, - dispatchUpdateCaseProperty: result.current.dispatchUpdateCaseProperty, - filterOptions: DEFAULT_FILTER_OPTIONS, - isError: true, - loading: [], - queryParams: DEFAULT_QUERY_PARAMS, - refetchCases: result.current.refetchCases, - selectedCases: [], - setFilters: result.current.setFilters, - setQueryParams: result.current.setQueryParams, - setSelectedCases: result.current.setSelectedCases, - }); - }); - }); - it('set filters', async () => { - await act(async () => { - const spyOnGetCases = jest.spyOn(api, 'getCases'); - const newFilters = { - search: 'new', - tags: ['new'], - status: CaseStatuses.closed, - }; - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.setFilters(newFilters); - await waitForNextUpdate(); - expect(spyOnGetCases.mock.calls[1][0]).toEqual({ - filterOptions: { ...DEFAULT_FILTER_OPTIONS, ...newFilters }, - queryParams: DEFAULT_QUERY_PARAMS, - signal: abortCtrl.signal, - }); - }); - }); - it('set query params', async () => { - await act(async () => { - const spyOnGetCases = jest.spyOn(api, 'getCases'); - const newQueryParams = { - page: 2, - }; - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.setQueryParams(newQueryParams); - await waitForNextUpdate(); - expect(spyOnGetCases.mock.calls[1][0]).toEqual({ - filterOptions: DEFAULT_FILTER_OPTIONS, - queryParams: { ...DEFAULT_QUERY_PARAMS, ...newQueryParams }, - signal: abortCtrl.signal, - }); - }); - }); - it('set selected cases', async () => { - await act(async () => { - const selectedCases = [basicCase]; - const { result, waitForNextUpdate } = renderHook<string, UseGetCases>(() => useGetCases()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.setSelectedCases(selectedCases); - expect(result.current.selectedCases).toEqual(selectedCases); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx deleted file mode 100644 index d27bb5ab1b462..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useEffect, useReducer, useRef } from 'react'; -import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; -import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case, UpdateByKey } from './types'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import * as i18n from './translations'; -import { getCases, patchCase } from './api'; -import { StatusAll } from '../components/status'; - -export interface UseGetCasesState { - data: AllCases; - filterOptions: FilterOptions; - isError: boolean; - loading: string[]; - queryParams: QueryParams; - selectedCases: Case[]; -} - -export interface UpdateCase extends Omit<UpdateByKey, 'caseData'> { - caseId: string; - version: string; - refetchCasesStatus: () => void; -} - -export type Action = - | { type: 'FETCH_INIT'; payload: string } - | { - type: 'FETCH_CASES_SUCCESS'; - payload: AllCases; - } - | { type: 'FETCH_FAILURE'; payload: string } - | { type: 'FETCH_UPDATE_CASE_SUCCESS' } - | { type: 'UPDATE_FILTER_OPTIONS'; payload: Partial<FilterOptions> } - | { type: 'UPDATE_QUERY_PARAMS'; payload: Partial<QueryParams> } - | { type: 'UPDATE_TABLE_SELECTIONS'; payload: Case[] }; - -const dataFetchReducer = (state: UseGetCasesState, action: Action): UseGetCasesState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isError: false, - loading: [...state.loading.filter((e) => e !== action.payload), action.payload], - }; - case 'FETCH_UPDATE_CASE_SUCCESS': - return { - ...state, - loading: state.loading.filter((e) => e !== 'caseUpdate'), - }; - case 'FETCH_CASES_SUCCESS': - return { - ...state, - data: action.payload, - isError: false, - loading: state.loading.filter((e) => e !== 'cases'), - }; - case 'FETCH_FAILURE': - return { - ...state, - isError: true, - loading: state.loading.filter((e) => e !== action.payload), - }; - case 'UPDATE_FILTER_OPTIONS': - return { - ...state, - filterOptions: { - ...state.filterOptions, - ...action.payload, - }, - }; - case 'UPDATE_QUERY_PARAMS': - return { - ...state, - queryParams: { - ...state.queryParams, - ...action.payload, - }, - }; - case 'UPDATE_TABLE_SELECTIONS': - return { - ...state, - selectedCases: action.payload, - }; - default: - return state; - } -}; - -export const DEFAULT_FILTER_OPTIONS: FilterOptions = { - search: '', - reporters: [], - status: StatusAll, - tags: [], - onlyCollectionType: false, -}; - -export const DEFAULT_QUERY_PARAMS: QueryParams = { - page: DEFAULT_TABLE_ACTIVE_PAGE, - perPage: DEFAULT_TABLE_LIMIT, - sortField: SortFieldCase.createdAt, - sortOrder: 'desc', -}; - -export const initialData: AllCases = { - cases: [], - countClosedCases: null, - countInProgressCases: null, - countOpenCases: null, - page: 0, - perPage: 0, - total: 0, -}; -export interface UseGetCases extends UseGetCasesState { - dispatchUpdateCaseProperty: ({ - updateKey, - updateValue, - caseId, - version, - refetchCasesStatus, - }: UpdateCase) => void; - refetchCases: () => void; - setFilters: (filters: Partial<FilterOptions>) => void; - setQueryParams: (queryParams: Partial<QueryParams>) => void; - setSelectedCases: (mySelectedCases: Case[]) => void; -} - -export const useGetCases = ( - initialQueryParams?: QueryParams, - initialFilterOptions?: FilterOptions -): UseGetCases => { - const [state, dispatch] = useReducer(dataFetchReducer, { - data: initialData, - filterOptions: initialFilterOptions ?? DEFAULT_FILTER_OPTIONS, - isError: false, - loading: [], - queryParams: initialQueryParams ?? DEFAULT_QUERY_PARAMS, - selectedCases: [], - }); - const [, dispatchToaster] = useStateToaster(); - const didCancelFetchCases = useRef(false); - const didCancelUpdateCases = useRef(false); - const abortCtrlFetchCases = useRef(new AbortController()); - const abortCtrlUpdateCases = useRef(new AbortController()); - - const setSelectedCases = useCallback((mySelectedCases: Case[]) => { - dispatch({ type: 'UPDATE_TABLE_SELECTIONS', payload: mySelectedCases }); - }, []); - - const setQueryParams = useCallback((newQueryParams: Partial<QueryParams>) => { - dispatch({ type: 'UPDATE_QUERY_PARAMS', payload: newQueryParams }); - }, []); - - const setFilters = useCallback((newFilters: Partial<FilterOptions>) => { - dispatch({ type: 'UPDATE_FILTER_OPTIONS', payload: newFilters }); - }, []); - - const fetchCases = useCallback(async (filterOptions: FilterOptions, queryParams: QueryParams) => { - try { - didCancelFetchCases.current = false; - abortCtrlFetchCases.current.abort(); - abortCtrlFetchCases.current = new AbortController(); - dispatch({ type: 'FETCH_INIT', payload: 'cases' }); - - const response = await getCases({ - filterOptions, - queryParams, - signal: abortCtrlFetchCases.current.signal, - }); - - if (!didCancelFetchCases.current) { - dispatch({ - type: 'FETCH_CASES_SUCCESS', - payload: response, - }); - } - } catch (error) { - if (!didCancelFetchCases.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE', payload: 'cases' }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const dispatchUpdateCaseProperty = useCallback( - async ({ updateKey, updateValue, caseId, refetchCasesStatus, version }: UpdateCase) => { - try { - didCancelUpdateCases.current = false; - abortCtrlUpdateCases.current.abort(); - abortCtrlUpdateCases.current = new AbortController(); - dispatch({ type: 'FETCH_INIT', payload: 'caseUpdate' }); - - await patchCase( - caseId, - { [updateKey]: updateValue }, - // saved object versions are typed as string | undefined, hope that's not true - version ?? '', - abortCtrlUpdateCases.current.signal - ); - - if (!didCancelUpdateCases.current) { - dispatch({ type: 'FETCH_UPDATE_CASE_SUCCESS' }); - fetchCases(state.filterOptions, state.queryParams); - refetchCasesStatus(); - } - } catch (error) { - if (!didCancelUpdateCases.current) { - if (error.name !== 'AbortError') { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); - } - dispatch({ type: 'FETCH_FAILURE', payload: 'caseUpdate' }); - } - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [state.filterOptions, state.queryParams] - ); - - const refetchCases = useCallback(() => { - fetchCases(state.filterOptions, state.queryParams); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.filterOptions, state.queryParams]); - - useEffect(() => { - fetchCases(state.filterOptions, state.queryParams); - return () => { - didCancelFetchCases.current = true; - didCancelUpdateCases.current = true; - abortCtrlFetchCases.current.abort(); - abortCtrlUpdateCases.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.queryParams, state.filterOptions]); - - return { - ...state, - dispatchUpdateCaseProperty, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.test.tsx deleted file mode 100644 index 30714a2d8d938..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.test.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useGetCasesStatus, UseGetCasesStatus } from './use_get_cases_status'; -import { casesStatus } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetCasesStatus', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => - useGetCasesStatus() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - countClosedCases: null, - countOpenCases: null, - countInProgressCases: null, - isLoading: true, - isError: false, - fetchCasesStatus: result.current.fetchCasesStatus, - }); - }); - }); - - it('calls getCasesStatus api', async () => { - const spyOnGetCasesStatus = jest.spyOn(api, 'getCasesStatus'); - await act(async () => { - const { waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => - useGetCasesStatus() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetCasesStatus).toBeCalledWith(abortCtrl.signal); - }); - }); - - it('fetch reporters', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => - useGetCasesStatus() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - countClosedCases: casesStatus.countClosedCases, - countOpenCases: casesStatus.countOpenCases, - countInProgressCases: casesStatus.countInProgressCases, - isLoading: false, - isError: false, - fetchCasesStatus: result.current.fetchCasesStatus, - }); - }); - }); - - it('unhappy path', async () => { - const spyOnGetCasesStatus = jest.spyOn(api, 'getCasesStatus'); - spyOnGetCasesStatus.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetCasesStatus>(() => - useGetCasesStatus() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - countClosedCases: 0, - countOpenCases: 0, - countInProgressCases: 0, - isLoading: false, - isError: true, - fetchCasesStatus: result.current.fetchCasesStatus, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx deleted file mode 100644 index 087f7ef455cba..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useEffect, useState, useRef } from 'react'; - -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { getCasesStatus } from './api'; -import * as i18n from './translations'; -import { CasesStatus } from './types'; - -interface CasesStatusState extends CasesStatus { - isLoading: boolean; - isError: boolean; -} - -const initialData: CasesStatusState = { - countClosedCases: null, - countInProgressCases: null, - countOpenCases: null, - isLoading: true, - isError: false, -}; - -export interface UseGetCasesStatus extends CasesStatusState { - fetchCasesStatus: () => void; -} - -export const useGetCasesStatus = (): UseGetCasesStatus => { - const [casesStatusState, setCasesStatusState] = useState<CasesStatusState>(initialData); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const fetchCasesStatus = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - setCasesStatusState({ - ...initialData, - isLoading: true, - }); - - const response = await getCasesStatus(abortCtrlRef.current.signal); - - if (!isCancelledRef.current) { - setCasesStatusState({ - ...response, - isLoading: false, - isError: false, - }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - setCasesStatusState({ - countClosedCases: 0, - countInProgressCases: 0, - countOpenCases: 0, - isLoading: false, - isError: true, - }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - fetchCasesStatus(); - - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return { - ...casesStatusState, - fetchCasesStatus, - }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.test.tsx deleted file mode 100644 index ff1c5a3eb4de7..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.test.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useGetReporters, UseGetReporters } from './use_get_reporters'; -import { reporters, respReporters } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetReporters', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => - useGetReporters() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - reporters: [], - respReporters: [], - isLoading: true, - isError: false, - fetchReporters: result.current.fetchReporters, - }); - }); - }); - - it('calls getReporters api', async () => { - const spyOnGetReporters = jest.spyOn(api, 'getReporters'); - await act(async () => { - const { waitForNextUpdate } = renderHook<string, UseGetReporters>(() => useGetReporters()); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetReporters).toBeCalledWith(abortCtrl.signal); - }); - }); - - it('fetch reporters', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => - useGetReporters() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - reporters, - respReporters, - isLoading: false, - isError: false, - fetchReporters: result.current.fetchReporters, - }); - }); - }); - - it('refetch reporters', async () => { - const spyOnGetReporters = jest.spyOn(api, 'getReporters'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => - useGetReporters() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.fetchReporters(); - expect(spyOnGetReporters).toHaveBeenCalledTimes(2); - }); - }); - - it('unhappy path', async () => { - const spyOnGetReporters = jest.spyOn(api, 'getReporters'); - spyOnGetReporters.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetReporters>(() => - useGetReporters() - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - reporters: [], - respReporters: [], - isLoading: false, - isError: true, - fetchReporters: result.current.fetchReporters, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx deleted file mode 100644 index 10c2d26d6b33d..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useEffect, useState, useRef } from 'react'; -import { isEmpty } from 'lodash/fp'; - -import { User } from '../../../../cases/common/api'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { getReporters } from './api'; -import * as i18n from './translations'; - -interface ReportersState { - reporters: string[]; - respReporters: User[]; - isLoading: boolean; - isError: boolean; -} - -const initialData: ReportersState = { - reporters: [], - respReporters: [], - isLoading: true, - isError: false, -}; - -export interface UseGetReporters extends ReportersState { - fetchReporters: () => void; -} - -export const useGetReporters = (): UseGetReporters => { - const [reportersState, setReporterState] = useState<ReportersState>(initialData); - - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const fetchReporters = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - setReporterState({ - ...reportersState, - isLoading: true, - }); - - const response = await getReporters(abortCtrlRef.current.signal); - const myReporters = response - .map((r) => (r.full_name == null || isEmpty(r.full_name) ? r.username ?? '' : r.full_name)) - .filter((u) => !isEmpty(u)); - - if (!isCancelledRef.current) { - setReporterState({ - reporters: myReporters, - respReporters: response, - isLoading: false, - isError: false, - }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - - setReporterState({ - reporters: [], - respReporters: [], - isLoading: false, - isError: true, - }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [reportersState]); - - useEffect(() => { - fetchReporters(); - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return { ...reportersState, fetchReporters }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.test.tsx deleted file mode 100644 index 8042e560df350..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.test.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useGetTags, UseGetTags } from './use_get_tags'; -import { tags } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useGetTags', () => { - const abortCtrl = new AbortController(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); - await waitForNextUpdate(); - expect(result.current).toEqual({ - tags: [], - isLoading: true, - isError: false, - fetchTags: result.current.fetchTags, - }); - }); - }); - - it('calls getTags api', async () => { - const spyOnGetTags = jest.spyOn(api, 'getTags'); - await act(async () => { - const { waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(spyOnGetTags).toBeCalledWith(abortCtrl.signal); - }); - }); - - it('fetch tags', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - tags, - isLoading: false, - isError: false, - fetchTags: result.current.fetchTags, - }); - }); - }); - - it('refetch tags', async () => { - const spyOnGetTags = jest.spyOn(api, 'getTags'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); - await waitForNextUpdate(); - await waitForNextUpdate(); - result.current.fetchTags(); - expect(spyOnGetTags).toHaveBeenCalledTimes(2); - }); - }); - - it('unhappy path', async () => { - const spyOnGetTags = jest.spyOn(api, 'getTags'); - spyOnGetTags.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseGetTags>(() => useGetTags()); - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toEqual({ - tags: [], - isLoading: false, - isError: true, - fetchTags: result.current.fetchTags, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx deleted file mode 100644 index 4a7a298e2cd86..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useEffect, useReducer, useRef, useCallback } from 'react'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { getTags } from './api'; -import * as i18n from './translations'; - -export interface TagsState { - tags: string[]; - isLoading: boolean; - isError: boolean; -} -type Action = - | { type: 'FETCH_INIT' } - | { type: 'FETCH_SUCCESS'; payload: string[] } - | { type: 'FETCH_FAILURE' }; - -export interface UseGetTags extends TagsState { - fetchTags: () => void; -} - -const dataFetchReducer = (state: TagsState, action: Action): TagsState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - tags: action.payload, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - }; - default: - return state; - } -}; -const initialData: string[] = []; - -export const useGetTags = (): UseGetTags => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: true, - isError: false, - tags: initialData, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const callFetch = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT' }); - - const response = await getTags(abortCtrlRef.current.signal); - - if (!isCancelledRef.current) { - dispatch({ type: 'FETCH_SUCCESS', payload: response }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - callFetch(); - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - return { ...state, fetchTags: callFetch }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_case.test.tsx deleted file mode 100644 index 3731af4d73db5..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.test.tsx +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { usePostCase, UsePostCase } from './use_post_case'; -import * as api from './api'; -import { ConnectorTypes } from '../../../../cases/common/api/connectors'; -import { basicCasePost } from './mock'; - -jest.mock('./api'); - -describe('usePostCase', () => { - const abortCtrl = new AbortController(); - const samplePost = { - description: 'description', - tags: ['tags'], - title: 'title', - connector: { - id: 'none', - name: 'none', - type: ConnectorTypes.none, - fields: null, - }, - settings: { - syncAlerts: true, - }, - }; - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - postCase: result.current.postCase, - }); - }); - }); - - it('calls postCase with correct arguments', async () => { - const spyOnPostCase = jest.spyOn(api, 'postCase'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); - await waitForNextUpdate(); - - result.current.postCase(samplePost); - await waitForNextUpdate(); - expect(spyOnPostCase).toBeCalledWith(samplePost, abortCtrl.signal); - }); - }); - - it('calls postCase with correct result', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); - await waitForNextUpdate(); - - const postData = await result.current.postCase(samplePost); - expect(postData).toEqual(basicCasePost); - }); - }); - - it('post case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); - await waitForNextUpdate(); - result.current.postCase(samplePost); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - postCase: result.current.postCase, - }); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); - await waitForNextUpdate(); - result.current.postCase(samplePost); - - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnPostCase = jest.spyOn(api, 'postCase'); - spyOnPostCase.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostCase>(() => usePostCase()); - await waitForNextUpdate(); - result.current.postCase(samplePost); - - expect(result.current).toEqual({ - isLoading: false, - isError: true, - postCase: result.current.postCase, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx deleted file mode 100644 index 35c2b66156456..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { CasePostRequest } from '../../../../cases/common/api'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { postCase } from './api'; -import * as i18n from './translations'; -import { Case } from './types'; -interface NewCaseState { - isLoading: boolean; - isError: boolean; -} -type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; - -const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - }; - default: - return state; - } -}; -export interface UsePostCase extends NewCaseState { - postCase: (data: CasePostRequest) => Promise<Case | undefined>; -} -export const usePostCase = (): UsePostCase => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const postMyCase = useCallback(async (data: CasePostRequest) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - - dispatch({ type: 'FETCH_INIT' }); - const response = await postCase(data, abortCtrlRef.current.signal); - - if (!isCancelledRef.current) { - dispatch({ type: 'FETCH_SUCCESS' }); - } - return response; - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - }, []); - return { ...state, postCase: postMyCase }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.test.tsx deleted file mode 100644 index 4d4ac5d071fa5..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.test.tsx +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; - -import { CommentType } from '../../../../cases/common/api'; -import { usePostComment, UsePostComment } from './use_post_comment'; -import { basicCaseId, basicSubCaseId } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('usePostComment', () => { - const abortCtrl = new AbortController(); - const samplePost = { - comment: 'a comment', - type: CommentType.user as const, - }; - const updateCaseCallback = jest.fn(); - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => - usePostComment() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - postComment: result.current.postComment, - }); - }); - }); - - it('calls postComment with correct arguments - case', async () => { - const spyOnPostCase = jest.spyOn(api, 'postComment'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => - usePostComment() - ); - await waitForNextUpdate(); - - result.current.postComment({ - caseId: basicCaseId, - data: samplePost, - updateCase: updateCaseCallback, - }); - await waitForNextUpdate(); - expect(spyOnPostCase).toBeCalledWith(samplePost, basicCaseId, abortCtrl.signal, undefined); - }); - }); - - it('calls postComment with correct arguments - sub case', async () => { - const spyOnPostCase = jest.spyOn(api, 'postComment'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => - usePostComment() - ); - await waitForNextUpdate(); - - result.current.postComment({ - caseId: basicCaseId, - data: samplePost, - updateCase: updateCaseCallback, - subCaseId: basicSubCaseId, - }); - await waitForNextUpdate(); - expect(spyOnPostCase).toBeCalledWith( - samplePost, - basicCaseId, - abortCtrl.signal, - basicSubCaseId - ); - }); - }); - - it('post case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => - usePostComment() - ); - await waitForNextUpdate(); - result.current.postComment({ - caseId: basicCaseId, - data: samplePost, - updateCase: updateCaseCallback, - }); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - postComment: result.current.postComment, - }); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => - usePostComment() - ); - await waitForNextUpdate(); - result.current.postComment({ - caseId: basicCaseId, - data: samplePost, - updateCase: updateCaseCallback, - }); - - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnPostCase = jest.spyOn(api, 'postComment'); - spyOnPostCase.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostComment>(() => - usePostComment() - ); - await waitForNextUpdate(); - result.current.postComment({ - caseId: basicCaseId, - data: samplePost, - updateCase: updateCaseCallback, - }); - - expect(result.current).toEqual({ - isLoading: false, - isError: true, - postComment: result.current.postComment, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx deleted file mode 100644 index 252059514da8e..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { CommentRequest } from '../../../../cases/common/api'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; - -import { postComment } from './api'; -import * as i18n from './translations'; -import { Case } from './types'; - -interface NewCommentState { - isLoading: boolean; - isError: boolean; -} -type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; - -const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentState => { - switch (action.type) { - case 'FETCH_INIT': - return { - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - isLoading: false, - isError: false, - }; - case 'FETCH_FAILURE': - return { - isLoading: false, - isError: true, - }; - default: - return state; - } -}; - -interface PostComment { - caseId: string; - data: CommentRequest; - updateCase?: (newCase: Case) => void; - subCaseId?: string; -} -export interface UsePostComment extends NewCommentState { - postComment: (args: PostComment) => Promise<void>; -} - -export const usePostComment = (): UsePostComment => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const postMyComment = useCallback( - async ({ caseId, data, updateCase, subCaseId }: PostComment) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT' }); - - const response = await postComment(data, caseId, abortCtrlRef.current.signal, subCaseId); - - if (!isCancelledRef.current) { - dispatch({ type: 'FETCH_SUCCESS' }); - if (updateCase) { - updateCase(response); - } - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - }, - [dispatchToaster] - ); - - useEffect(() => { - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - }, []); - - return { ...state, postComment: postMyComment }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.test.tsx deleted file mode 100644 index e008927019987..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { usePostPushToService, UsePostPushToService } from './use_post_push_to_service'; -import { pushedCase } from './mock'; -import * as api from './api'; -import { CaseConnector, ConnectorTypes } from '../../../../cases/common/api'; - -jest.mock('./api'); - -describe('usePostPushToService', () => { - const abortCtrl = new AbortController(); - const connector = { - id: '123', - name: 'connector name', - type: ConnectorTypes.jira, - fields: { issueType: 'Task', priority: 'Low', parent: null }, - } as CaseConnector; - const caseId = pushedCase.id; - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => - usePostPushToService() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - pushCaseToExternalService: result.current.pushCaseToExternalService, - }); - }); - }); - - it('calls pushCase with correct arguments', async () => { - const spyOnPushToService = jest.spyOn(api, 'pushCase'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => - usePostPushToService() - ); - await waitForNextUpdate(); - result.current.pushCaseToExternalService({ caseId, connector }); - await waitForNextUpdate(); - expect(spyOnPushToService).toBeCalledWith(caseId, connector.id, abortCtrl.signal); - }); - }); - - it('post push to service', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => - usePostPushToService() - ); - await waitForNextUpdate(); - result.current.pushCaseToExternalService({ caseId, connector }); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - pushCaseToExternalService: result.current.pushCaseToExternalService, - }); - }); - }); - - it('set isLoading to true when pushing case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => - usePostPushToService() - ); - await waitForNextUpdate(); - result.current.pushCaseToExternalService({ caseId, connector }); - expect(result.current.isLoading).toBe(true); - }); - }); - - it('unhappy path', async () => { - const spyOnPushToService = jest.spyOn(api, 'pushCase'); - spyOnPushToService.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UsePostPushToService>(() => - usePostPushToService() - ); - await waitForNextUpdate(); - result.current.pushCaseToExternalService({ caseId, connector }); - - expect(result.current).toEqual({ - isLoading: false, - isError: true, - pushCaseToExternalService: result.current.pushCaseToExternalService, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx deleted file mode 100644 index 9fd0fda5c9723..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { CaseConnector } from '../../../../cases/common/api'; -import { - errorToToaster, - useStateToaster, - displaySuccessToast, -} from '../../common/components/toasters'; - -import { pushCase } from './api'; -import * as i18n from './translations'; -import { Case } from './types'; - -interface PushToServiceState { - isLoading: boolean; - isError: boolean; -} -type Action = { type: 'FETCH_INIT' } | { type: 'FETCH_SUCCESS' } | { type: 'FETCH_FAILURE' }; - -const dataFetchReducer = (state: PushToServiceState, action: Action): PushToServiceState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - }; - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - }; - default: - return state; - } -}; - -interface PushToServiceRequest { - caseId: string; - connector: CaseConnector; -} - -export interface UsePostPushToService extends PushToServiceState { - pushCaseToExternalService: ({ - caseId, - connector, - }: PushToServiceRequest) => Promise<Case | undefined>; -} - -export const usePostPushToService = (): UsePostPushToService => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, - }); - const [, dispatchToaster] = useStateToaster(); - const cancel = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const pushCaseToExternalService = useCallback( - async ({ caseId, connector }: PushToServiceRequest) => { - try { - abortCtrlRef.current.abort(); - cancel.current = false; - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT' }); - - const response = await pushCase(caseId, connector.id, abortCtrlRef.current.signal); - - if (!cancel.current) { - dispatch({ type: 'FETCH_SUCCESS' }); - displaySuccessToast( - i18n.SUCCESS_SEND_TO_EXTERNAL_SERVICE(connector.name), - dispatchToaster - ); - } - - return response; - } catch (error) { - if (!cancel.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - } - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ); - - useEffect(() => { - return () => { - abortCtrlRef.current.abort(); - cancel.current = true; - }; - }, []); - - return { ...state, pushCaseToExternalService }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_case.test.tsx deleted file mode 100644 index 65309d6d29e05..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.test.tsx +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useUpdateCase, UseUpdateCase } from './use_update_case'; -import { basicCase, basicSubCaseId } from './mock'; -import * as api from './api'; -import { UpdateKey } from './types'; - -jest.mock('./api'); - -describe('useUpdateCase', () => { - const abortCtrl = new AbortController(); - const fetchCaseUserActions = jest.fn(); - const updateCase = jest.fn(); - const updateKey: UpdateKey = 'description'; - const onSuccess = jest.fn(); - const onError = jest.fn(); - - const sampleUpdate = { - fetchCaseUserActions, - updateKey, - updateValue: 'updated description', - updateCase, - caseData: basicCase, - onSuccess, - onError, - }; - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => - useUpdateCase({ caseId: basicCase.id }) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoading: false, - isError: false, - updateKey: null, - updateCaseProperty: result.current.updateCaseProperty, - }); - }); - }); - - it('calls patchCase with correct arguments', async () => { - const spyOnPatchCase = jest.spyOn(api, 'patchCase'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => - useUpdateCase({ caseId: basicCase.id }) - ); - await waitForNextUpdate(); - - result.current.updateCaseProperty(sampleUpdate); - await waitForNextUpdate(); - expect(spyOnPatchCase).toBeCalledWith( - basicCase.id, - { description: 'updated description' }, - basicCase.version, - abortCtrl.signal - ); - }); - }); - - it('patch case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => - useUpdateCase({ caseId: basicCase.id }) - ); - await waitForNextUpdate(); - result.current.updateCaseProperty(sampleUpdate); - await waitForNextUpdate(); - expect(result.current).toEqual({ - updateKey: null, - isLoading: false, - isError: false, - updateCaseProperty: result.current.updateCaseProperty, - }); - expect(fetchCaseUserActions).toBeCalledWith(basicCase.id, '123', undefined); - expect(updateCase).toBeCalledWith(basicCase); - expect(onSuccess).toHaveBeenCalled(); - }); - }); - - it('patch sub case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => - useUpdateCase({ caseId: basicCase.id, subCaseId: basicSubCaseId }) - ); - await waitForNextUpdate(); - result.current.updateCaseProperty(sampleUpdate); - await waitForNextUpdate(); - expect(result.current).toEqual({ - updateKey: null, - isLoading: false, - isError: false, - updateCaseProperty: result.current.updateCaseProperty, - }); - expect(fetchCaseUserActions).toBeCalledWith(basicCase.id, '123', basicSubCaseId); - expect(updateCase).toBeCalledWith(basicCase); - expect(onSuccess).toHaveBeenCalled(); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => - useUpdateCase({ caseId: basicCase.id }) - ); - await waitForNextUpdate(); - result.current.updateCaseProperty(sampleUpdate); - - expect(result.current.isLoading).toBe(true); - expect(result.current.updateKey).toBe(updateKey); - }); - }); - - it('unhappy path', async () => { - const spyOnPatchCase = jest.spyOn(api, 'patchCase'); - spyOnPatchCase.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateCase>(() => - useUpdateCase({ caseId: basicCase.id }) - ); - await waitForNextUpdate(); - result.current.updateCaseProperty(sampleUpdate); - - expect(result.current).toEqual({ - updateKey: null, - isLoading: false, - isError: true, - updateCaseProperty: result.current.updateCaseProperty, - }); - expect(onError).toHaveBeenCalled(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx deleted file mode 100644 index 9a79699d8f919..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useReducer, useCallback, useRef, useEffect } from 'react'; - -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { patchCase, patchSubCase } from './api'; -import { UpdateKey, UpdateByKey, CaseStatuses } from './types'; -import * as i18n from './translations'; -import { createUpdateSuccessToaster } from './utils'; - -interface NewCaseState { - isLoading: boolean; - isError: boolean; - updateKey: UpdateKey | null; -} - -type Action = - | { type: 'FETCH_INIT'; payload: UpdateKey } - | { type: 'FETCH_SUCCESS' } - | { type: 'FETCH_FAILURE' }; - -const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoading: true, - isError: false, - updateKey: action.payload, - }; - - case 'FETCH_SUCCESS': - return { - ...state, - isLoading: false, - isError: false, - updateKey: null, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoading: false, - isError: true, - updateKey: null, - }; - default: - return state; - } -}; - -export interface UseUpdateCase extends NewCaseState { - updateCaseProperty: (updates: UpdateByKey) => void; -} -export const useUpdateCase = ({ - caseId, - subCaseId, -}: { - caseId: string; - subCaseId?: string; -}): UseUpdateCase => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, - updateKey: null, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const dispatchUpdateCaseProperty = useCallback( - async ({ - fetchCaseUserActions, - updateKey, - updateValue, - updateCase, - caseData, - onSuccess, - onError, - }: UpdateByKey) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT', payload: updateKey }); - - const response = await (updateKey === 'status' && subCaseId - ? patchSubCase( - caseId, - subCaseId, - { status: updateValue as CaseStatuses }, - caseData.version, - abortCtrlRef.current.signal - ) - : patchCase( - caseId, - { [updateKey]: updateValue }, - caseData.version, - abortCtrlRef.current.signal - )); - - if (!isCancelledRef.current) { - if (fetchCaseUserActions != null) { - fetchCaseUserActions(caseId, response[0].connector.id, subCaseId); - } - if (updateCase != null) { - updateCase(response[0]); - } - dispatch({ type: 'FETCH_SUCCESS' }); - dispatchToaster({ - type: 'addToaster', - toast: createUpdateSuccessToaster(caseData, response[0], updateKey, updateValue), - }); - - if (onSuccess) { - onSuccess(); - } - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE' }); - if (onError) { - onError(); - } - } - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [caseId, subCaseId] - ); - - useEffect(() => { - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - }, []); - - return { ...state, updateCaseProperty: dispatchUpdateCaseProperty }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.test.tsx deleted file mode 100644 index 9ff266ad9c988..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.test.tsx +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { renderHook, act } from '@testing-library/react-hooks'; -import { useUpdateComment, UseUpdateComment } from './use_update_comment'; -import { basicCase, basicCaseCommentPatch, basicSubCaseId } from './mock'; -import * as api from './api'; - -jest.mock('./api'); - -describe('useUpdateComment', () => { - const abortCtrl = new AbortController(); - const fetchUserActions = jest.fn(); - const updateCase = jest.fn(); - const sampleUpdate = { - caseId: basicCase.id, - commentId: basicCase.comments[0].id, - commentUpdate: 'updated comment', - fetchUserActions, - updateCase, - version: basicCase.comments[0].version, - }; - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => - useUpdateComment() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoadingIds: [], - isError: false, - patchComment: result.current.patchComment, - }); - }); - }); - - it('calls patchComment with correct arguments - case', async () => { - const spyOnPatchComment = jest.spyOn(api, 'patchComment'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => - useUpdateComment() - ); - await waitForNextUpdate(); - - result.current.patchComment(sampleUpdate); - await waitForNextUpdate(); - expect(spyOnPatchComment).toBeCalledWith( - basicCase.id, - basicCase.comments[0].id, - 'updated comment', - basicCase.comments[0].version, - abortCtrl.signal, - undefined - ); - }); - }); - - it('calls patchComment with correct arguments - sub case', async () => { - const spyOnPatchComment = jest.spyOn(api, 'patchComment'); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => - useUpdateComment() - ); - await waitForNextUpdate(); - - result.current.patchComment({ ...sampleUpdate, subCaseId: basicSubCaseId }); - await waitForNextUpdate(); - expect(spyOnPatchComment).toBeCalledWith( - basicCase.id, - basicCase.comments[0].id, - 'updated comment', - basicCase.comments[0].version, - abortCtrl.signal, - basicSubCaseId - ); - }); - }); - - it('patch comment', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => - useUpdateComment() - ); - await waitForNextUpdate(); - result.current.patchComment(sampleUpdate); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isLoadingIds: [], - isError: false, - patchComment: result.current.patchComment, - }); - expect(fetchUserActions).toBeCalled(); - expect(updateCase).toBeCalledWith(basicCaseCommentPatch); - }); - }); - - it('set isLoading to true when posting case', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => - useUpdateComment() - ); - await waitForNextUpdate(); - result.current.patchComment(sampleUpdate); - - expect(result.current.isLoadingIds).toEqual([basicCase.comments[0].id]); - }); - }); - - it('unhappy path', async () => { - const spyOnPatchComment = jest.spyOn(api, 'patchComment'); - spyOnPatchComment.mockImplementation(() => { - throw new Error('Something went wrong'); - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook<string, UseUpdateComment>(() => - useUpdateComment() - ); - await waitForNextUpdate(); - result.current.patchComment(sampleUpdate); - - expect(result.current).toEqual({ - isLoadingIds: [], - isError: true, - patchComment: result.current.patchComment, - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx deleted file mode 100644 index 81bce248852fe..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { errorToToaster, useStateToaster } from '../../common/components/toasters'; -import { patchComment } from './api'; -import * as i18n from './translations'; -import { Case } from './types'; - -interface CommentUpdateState { - isLoadingIds: string[]; - isError: boolean; -} -interface CommentUpdate { - commentId: string; -} - -type Action = - | { type: 'FETCH_INIT'; payload: string } - | { type: 'FETCH_SUCCESS'; payload: CommentUpdate } - | { type: 'FETCH_FAILURE'; payload: string }; - -const dataFetchReducer = (state: CommentUpdateState, action: Action): CommentUpdateState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isLoadingIds: [...state.isLoadingIds, action.payload], - isError: false, - }; - - case 'FETCH_SUCCESS': - return { - ...state, - isLoadingIds: state.isLoadingIds.filter((id) => action.payload.commentId !== id), - isError: false, - }; - case 'FETCH_FAILURE': - return { - ...state, - isLoadingIds: state.isLoadingIds.filter((id) => action.payload !== id), - isError: true, - }; - default: - return state; - } -}; - -interface UpdateComment { - caseId: string; - commentId: string; - commentUpdate: string; - fetchUserActions: () => void; - subCaseId?: string; - updateCase: (newCase: Case) => void; - version: string; -} - -export interface UseUpdateComment extends CommentUpdateState { - patchComment: ({ caseId, commentId, commentUpdate, fetchUserActions }: UpdateComment) => void; -} - -export const useUpdateComment = (): UseUpdateComment => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isLoadingIds: [], - isError: false, - }); - const [, dispatchToaster] = useStateToaster(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - - const dispatchUpdateComment = useCallback( - async ({ - caseId, - commentId, - commentUpdate, - fetchUserActions, - subCaseId, - updateCase, - version, - }: UpdateComment) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT', payload: commentId }); - - const response = await patchComment( - caseId, - commentId, - commentUpdate, - version, - abortCtrlRef.current.signal, - subCaseId - ); - - if (!isCancelledRef.current) { - updateCase(response); - fetchUserActions(); - dispatch({ type: 'FETCH_SUCCESS', payload: { commentId } }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - errorToToaster({ - title: i18n.ERROR_TITLE, - error: error.body && error.body.message ? new Error(error.body.message) : error, - dispatchToaster, - }); - } - dispatch({ type: 'FETCH_FAILURE', payload: commentId }); - } - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ); - - useEffect(() => { - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - }, []); - - return { ...state, patchComment: dispatchUpdateComment }; -}; diff --git a/x-pack/plugins/security_solution/public/cases/containers/utils.test.ts b/x-pack/plugins/security_solution/public/cases/containers/utils.test.ts deleted file mode 100644 index 6c1fb60298938..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/utils.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - valueToUpdateIsSettings, - valueToUpdateIsStatus, - createUpdateSuccessToaster, -} from './utils'; - -import { Case } from './types'; - -const caseBeforeUpdate = { - comments: [ - { - type: 'alert', - }, - ], - settings: { - syncAlerts: true, - }, -} as Case; - -const caseAfterUpdate = { title: 'My case' } as Case; - -describe('utils', () => { - describe('valueToUpdateIsSettings', () => { - it('returns true if key is settings', () => { - expect(valueToUpdateIsSettings('settings', 'value')).toBe(true); - }); - - it('returns false if key is NOT settings', () => { - expect(valueToUpdateIsSettings('tags', 'value')).toBe(false); - }); - }); - - describe('valueToUpdateIsStatus', () => { - it('returns true if key is status', () => { - expect(valueToUpdateIsStatus('status', 'value')).toBe(true); - }); - - it('returns false if key is NOT status', () => { - expect(valueToUpdateIsStatus('tags', 'value')).toBe(false); - }); - }); - - describe('createUpdateSuccessToaster', () => { - it('creates the correct toast when sync alerts is turned on and case has alerts', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - caseBeforeUpdate, - caseAfterUpdate, - 'settings', - { - syncAlerts: true, - } - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Alerts in "My case" have been synced', - }); - }); - - it('creates the correct toast when sync alerts is turned on and case does NOT have alerts', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - { ...caseBeforeUpdate, comments: [] }, - caseAfterUpdate, - 'settings', - { - syncAlerts: true, - } - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Updated "My case"', - }); - }); - - it('creates the correct toast when sync alerts is turned off and case has alerts', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - caseBeforeUpdate, - caseAfterUpdate, - 'settings', - { - syncAlerts: false, - } - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Updated "My case"', - }); - }); - - it('creates the correct toast when the status change, case has alerts, and sync alerts is on', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - caseBeforeUpdate, - caseAfterUpdate, - 'status', - 'closed' - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Updated "My case"', - text: 'Alerts in this case have been also had their status updated', - }); - }); - - it('creates the correct toast when the status change, case has alerts, and sync alerts is off', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - { ...caseBeforeUpdate, settings: { syncAlerts: false } }, - caseAfterUpdate, - 'status', - 'closed' - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Updated "My case"', - }); - }); - - it('creates the correct toast when the status change, case does NOT have alerts, and sync alerts is on', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - { ...caseBeforeUpdate, comments: [] }, - caseAfterUpdate, - 'status', - 'closed' - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Updated "My case"', - }); - }); - - it('creates the correct toast if not a status or a setting', () => { - // We remove the id as is randomly generated - const { id, ...toast } = createUpdateSuccessToaster( - caseBeforeUpdate, - caseAfterUpdate, - 'title', - 'My new title' - ); - - expect(toast).toEqual({ - color: 'success', - iconType: 'check', - title: 'Updated "My case"', - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/containers/utils.ts b/x-pack/plugins/security_solution/public/cases/containers/utils.ts deleted file mode 100644 index e447476d02282..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/containers/utils.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import uuid from 'uuid'; -import { set } from '@elastic/safer-lodash-set'; -import { camelCase, isArray, isObject } from 'lodash'; -import { fold } from 'fp-ts/lib/Either'; -import { identity } from 'fp-ts/lib/function'; -import { pipe } from 'fp-ts/lib/pipeable'; - -import { - CaseConfigureResponseRt, - CasePatchRequest, - CaseResponse, - CaseResponseRt, - CasesConfigureResponse, - CasesFindResponse, - CasesFindResponseRt, - CasesResponse, - CasesResponseRt, - CasesStatusResponse, - CasesStatusResponseRt, - CaseUserActionsResponse, - CaseUserActionsResponseRt, - CommentType, - throwErrors, -} from '../../../../cases/common'; -import { AppToast, ToasterError } from '../../common/components/toasters'; -import { AllCases, Case, UpdateByKey } from './types'; -import * as i18n from './translations'; - -export const getTypedPayload = <T>(a: unknown): T => a as T; - -export const parseString = (params: string) => { - try { - return JSON.parse(params); - } catch { - return null; - } -}; - -export const convertArrayToCamelCase = (arrayOfSnakes: unknown[]): unknown[] => - arrayOfSnakes.reduce((acc: unknown[], value) => { - if (isArray(value)) { - return [...acc, convertArrayToCamelCase(value)]; - } else if (isObject(value)) { - return [...acc, convertToCamelCase(value)]; - } else { - return [...acc, value]; - } - }, []); - -export const convertToCamelCase = <T, U extends {}>(snakeCase: T): U => - Object.entries(snakeCase).reduce((acc, [key, value]) => { - if (isArray(value)) { - set(acc, camelCase(key), convertArrayToCamelCase(value)); - } else if (isObject(value)) { - set(acc, camelCase(key), convertToCamelCase(value)); - } else { - set(acc, camelCase(key), value); - } - return acc; - }, {} as U); - -export const convertAllCasesToCamel = (snakeCases: CasesFindResponse): AllCases => ({ - cases: snakeCases.cases.map((snakeCase) => convertToCamelCase<CaseResponse, Case>(snakeCase)), - countOpenCases: snakeCases.count_open_cases, - countInProgressCases: snakeCases.count_in_progress_cases, - countClosedCases: snakeCases.count_closed_cases, - page: snakeCases.page, - perPage: snakeCases.per_page, - total: snakeCases.total, -}); - -export const decodeCasesStatusResponse = (respCase?: CasesStatusResponse) => - pipe( - CasesStatusResponseRt.decode(respCase), - fold(throwErrors(createToasterPlainError), identity) - ); - -export const createToasterPlainError = (message: string) => new ToasterError([message]); - -export const decodeCaseResponse = (respCase?: CaseResponse) => - pipe(CaseResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); - -export const decodeCasesResponse = (respCase?: CasesResponse) => - pipe(CasesResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); - -export const decodeCasesFindResponse = (respCases?: CasesFindResponse) => - pipe(CasesFindResponseRt.decode(respCases), fold(throwErrors(createToasterPlainError), identity)); - -export const decodeCaseConfigureResponse = (respCase?: CasesConfigureResponse) => - pipe( - CaseConfigureResponseRt.decode(respCase), - fold(throwErrors(createToasterPlainError), identity) - ); - -export const decodeCaseUserActionsResponse = (respUserActions?: CaseUserActionsResponse) => - pipe( - CaseUserActionsResponseRt.decode(respUserActions), - fold(throwErrors(createToasterPlainError), identity) - ); - -export const valueToUpdateIsSettings = ( - key: UpdateByKey['updateKey'], - value: UpdateByKey['updateValue'] -): value is CasePatchRequest['settings'] => key === 'settings'; - -export const valueToUpdateIsStatus = ( - key: UpdateByKey['updateKey'], - value: UpdateByKey['updateValue'] -): value is CasePatchRequest['status'] => key === 'status'; - -export const createUpdateSuccessToaster = ( - caseBeforeUpdate: Case, - caseAfterUpdate: Case, - key: UpdateByKey['updateKey'], - value: UpdateByKey['updateValue'] -): AppToast => { - const caseHasAlerts = caseBeforeUpdate.comments.some( - (comment) => comment.type === CommentType.alert - ); - - const toast: AppToast = { - id: uuid.v4(), - color: 'success', - iconType: 'check', - title: i18n.UPDATED_CASE(caseAfterUpdate.title), - }; - - if (valueToUpdateIsSettings(key, value) && value?.syncAlerts && caseHasAlerts) { - return { - ...toast, - title: i18n.SYNC_CASE(caseAfterUpdate.title), - }; - } - - if (valueToUpdateIsStatus(key, value) && caseHasAlerts && caseBeforeUpdate.settings.syncAlerts) { - return { - ...toast, - text: i18n.STATUS_CHANGED_TOASTER_TEXT, - }; - } - - return toast; -}; diff --git a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx index 12aece8903dc1..edb84db89b878 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { useParams, useHistory } from 'react-router-dom'; -import { USE_RAC_CASES_UI } from '../../../common/constants'; import { SecurityPageName } from '../../app/types'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { WrapperPage } from '../../common/components/wrapper_page'; @@ -17,7 +16,6 @@ import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; import { getCaseUrl } from '../../common/components/link_to'; import { navTabs } from '../../app/home/home_navigations'; import { CaseView } from '../components/case_view'; -import { CaseViewFromPlugin } from '../components/case_view/case_view_from_plugin'; import { savedObjectReadOnlyErrorMessage, CaseCallOut } from '../components/callout'; export const CaseDetailsPage = React.memo(() => { @@ -43,19 +41,11 @@ export const CaseDetailsPage = React.memo(() => { messages={[{ ...savedObjectReadOnlyErrorMessage }]} /> )} - {USE_RAC_CASES_UI ? ( - <CaseViewFromPlugin - caseId={caseId} - subCaseId={subCaseId} - userCanCrud={userPermissions?.crud ?? false} - /> - ) : ( - <CaseView - caseId={caseId} - subCaseId={subCaseId} - userCanCrud={userPermissions?.crud ?? false} - /> - )} + <CaseView + caseId={caseId} + subCaseId={subCaseId} + userCanCrud={userPermissions?.crud ?? false} + /> </WrapperPage> <SpyRoute pageName={SecurityPageName.case} /> </> diff --git a/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx b/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx index 3cfba89916936..3e838f47e6dc2 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx @@ -17,10 +17,8 @@ import { useGetUserSavedObjectPermissions, useKibana } from '../../common/lib/ki import { SpyRoute } from '../../common/utils/route/spy_routes'; import { navTabs } from '../../app/home/home_navigations'; import { CaseHeaderPage } from '../components/case_header_page'; -import { ConfigureCases } from '../components/configure_cases'; import { WhitePageWrapper, SectionWrapper } from '../components/wrappers'; import * as i18n from './translations'; -import { USE_RAC_CASES_UI } from '../../../common/constants'; const ConfigureCasesPageComponent: React.FC = () => { const { cases } = useKibana().services; @@ -55,13 +53,9 @@ const ConfigureCasesPageComponent: React.FC = () => { </HeaderWrapper> </SectionWrapper> <WhitePageWrapper> - {USE_RAC_CASES_UI ? ( - cases.getConfigureCases({ - userCanCrud: userPermissions?.crud ?? false, - }) - ) : ( - <ConfigureCases userCanCrud={userPermissions?.crud ?? false} /> - )} + {cases.getConfigureCases({ + userCanCrud: userPermissions?.crud ?? false, + })} </WhitePageWrapper> </WrapperPage> <SpyRoute pageName={SecurityPageName.case} /> diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts index c2b8ed24202e1..8b9b71f43153d 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts @@ -10,10 +10,11 @@ import moment from 'moment-timezone'; import { useCallback, useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; +import { camelCase, isArray, isObject } from 'lodash'; +import { set } from '@elastic/safer-lodash-set'; import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../../common/constants'; import { errorToToaster, useStateToaster } from '../../components/toasters'; import { AuthenticatedUser } from '../../../../../security/common/model'; -import { convertToCamelCase } from '../../../cases/containers/utils'; import { StartServices } from '../../../types'; import { useUiSetting, useKibana } from './kibana_react'; @@ -50,6 +51,27 @@ export interface AuthenticatedElasticUser { authenticationProvider: string; } +export const convertArrayToCamelCase = (arrayOfSnakes: unknown[]): unknown[] => + arrayOfSnakes.reduce((acc: unknown[], value) => { + if (isArray(value)) { + return [...acc, convertArrayToCamelCase(value)]; + } else if (isObject(value)) { + return [...acc, convertToCamelCase(value)]; + } else { + return [...acc, value]; + } + }, []); +export const convertToCamelCase = <T, U extends {}>(snakeCase: T): U => + Object.entries(snakeCase).reduce((acc, [key, value]) => { + if (isArray(value)) { + set(acc, camelCase(key), convertArrayToCamelCase(value)); + } else if (isObject(value)) { + set(acc, camelCase(key), convertToCamelCase(value)); + } else { + set(acc, camelCase(key), value); + } + return acc; + }, {} as U); export const useCurrentUser = (): AuthenticatedElasticUser | null => { const [user, setUser] = useState<AuthenticatedElasticUser | null>(null); diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts index e504344f3d25f..1527ea7dccac5 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts @@ -92,6 +92,13 @@ export const createStartServicesMock = (): StartServices => { return ({ ...core, + cases: { + getAllCases: jest.fn(), + getCaseView: jest.fn(), + getConfigureCases: jest.fn(), + getCreateCase: jest.fn(), + getRecentCases: jest.fn(), + }, data: { ...data, query: { diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx index faf8e4f2ddafc..8b2bbdf417df5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx @@ -5,93 +5,51 @@ * 2.0. */ -import { EuiHorizontalRule, EuiText } from '@elastic/eui'; -import React, { useEffect, useMemo, useRef, useCallback } from 'react'; +import React, { useCallback } from 'react'; -import { FilterOptions, QueryParams } from '../../../cases/containers/types'; -import { DEFAULT_QUERY_PARAMS, useGetCases } from '../../../cases/containers/use_get_cases'; -import { LoadingPlaceholders } from '../loading_placeholders'; -import { NoCases } from './no_cases'; -import { RecentCases } from './recent_cases'; -import * as i18n from './translations'; +import { + getCaseDetailsUrl, + getCaseUrl, + getCreateCaseUrl, +} from '../../../common/components/link_to/redirect_to_case'; +import { useFormatUrl } from '../../../common/components/link_to'; import { useKibana } from '../../../common/lib/kibana'; import { APP_ID } from '../../../../common/constants'; import { SecurityPageName } from '../../../app/types'; -import { useFormatUrl } from '../../../common/components/link_to'; -import { LinkAnchor } from '../../../common/components/links'; - -const usePrevious = (value: FilterOptions) => { - const ref = useRef(); - useEffect(() => { - (ref.current as unknown) = value; - }); - return ref.current; -}; +import { AllCasesNavProps } from '../../../cases/components/all_cases'; const MAX_CASES_TO_SHOW = 3; - -const queryParams: QueryParams = { - ...DEFAULT_QUERY_PARAMS, - perPage: MAX_CASES_TO_SHOW, +const RecentCasesComponent = () => { + const { formatUrl } = useFormatUrl(SecurityPageName.case); + const { + cases: casesUi, + application: { navigateToApp }, + } = useKibana().services; + + const goToCases = useCallback( + (ev) => { + ev.preventDefault(); + navigateToApp(`${APP_ID}:${SecurityPageName.case}`); + }, + [navigateToApp] + ); + + return casesUi.getRecentCases({ + allCasesHref: formatUrl(getCaseUrl()), + createCaseHref: formatUrl(getCreateCaseUrl()), + getCaseDetailsHref: ({ detailName, subCaseId }: AllCasesNavProps) => { + return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + }, + goToAllCases: goToCases, + onCaseDetailsNavClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), + }); + }, + maxCasesToShow: MAX_CASES_TO_SHOW, + }); }; -const StatefulRecentCasesComponent = React.memo( - ({ filterOptions }: { filterOptions: FilterOptions }) => { - const { formatUrl } = useFormatUrl(SecurityPageName.case); - const { navigateToApp } = useKibana().services.application; - const previousFilterOptions = usePrevious(filterOptions); - const { data, loading, setFilters } = useGetCases(queryParams); - const isLoadingCases = useMemo( - () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, - [loading] - ); - - const goToCases = useCallback( - (ev) => { - ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.case}`); - }, - [navigateToApp] - ); - - const allCasesLink = useMemo( - () => ( - <LinkAnchor onClick={goToCases} href={formatUrl('')}> - {' '} - {i18n.VIEW_ALL_CASES} - </LinkAnchor> - ), - [goToCases, formatUrl] - ); - - useEffect(() => { - if (previousFilterOptions !== undefined && previousFilterOptions !== filterOptions) { - setFilters(filterOptions); - } - }, [previousFilterOptions, filterOptions, setFilters]); - - const content = useMemo( - () => - isLoadingCases ? ( - <LoadingPlaceholders lines={2} placeholders={3} /> - ) : !isLoadingCases && data.cases.length === 0 ? ( - <NoCases /> - ) : ( - <RecentCases cases={data.cases} /> - ), - [isLoadingCases, data] - ); - - return ( - <EuiText color="subdued" size="s"> - {content} - <EuiHorizontalRule margin="s" /> - <EuiText size="xs">{allCasesLink}</EuiText> - </EuiText> - ); - } -); - -StatefulRecentCasesComponent.displayName = 'StatefulRecentCasesComponent'; +RecentCasesComponent.displayName = 'RecentCasesComponent'; -export const StatefulRecentCases = React.memo(StatefulRecentCasesComponent); +export const RecentCases = React.memo(RecentCasesComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.test.tsx deleted file mode 100644 index ccb2d776f6e61..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.test.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount } from 'enzyme'; - -import { useKibana } from '../../../../common/lib/kibana'; -import '../../../../common/mock/match_media'; -import { TestProviders } from '../../../../common/mock'; -import { NoCases } from '.'; - -jest.mock('../../../../common/lib/kibana'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; - -describe('RecentCases', () => { - let navigateToApp: jest.Mock; - - beforeEach(() => { - navigateToApp = jest.fn(); - useKibanaMock().services.application.navigateToApp = navigateToApp; - }); - - it('if no cases, you should be able to create a case by clicking on the link "start a new case"', () => { - const wrapper = mount( - <TestProviders> - <NoCases /> - </TestProviders> - ); - wrapper.find(`[data-test-subj="no-cases-create-case"]`).first().simulate('click'); - expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { - path: - "/create?sourcerer=(default:!('apm-*-transaction*','auditbeat-*','endgame-*','filebeat-*','logs-*','packetbeat-*','winlogbeat-*'))&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now%2Fd,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now%2Fd)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now%2Fd,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now%2Fd)))", - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.tsx deleted file mode 100644 index 9d538dcf88a89..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/no_cases/index.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useCallback } from 'react'; - -import { APP_ID } from '../../../../../common/constants'; -import { getCreateCaseUrl } from '../../../../common/components/link_to/redirect_to_case'; -import { LinkAnchor } from '../../../../common/components/links'; -import { useFormatUrl } from '../../../../common/components/link_to'; -import * as i18n from '../translations'; -import { useKibana } from '../../../../common/lib/kibana'; -import { SecurityPageName } from '../../../../app/types'; - -const NoCasesComponent = () => { - const { formatUrl, search } = useFormatUrl(SecurityPageName.case); - const { navigateToApp } = useKibana().services.application; - - const goToCreateCase = useCallback( - (ev) => { - ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCreateCaseUrl(search), - }); - }, - [navigateToApp, search] - ); - const newCaseLink = useMemo( - () => ( - <LinkAnchor - data-test-subj="no-cases-create-case" - onClick={goToCreateCase} - href={formatUrl(getCreateCaseUrl())} - >{` ${i18n.START_A_NEW_CASE}`}</LinkAnchor> - ), - [formatUrl, goToCreateCase] - ); - - return ( - <> - <span>{i18n.NO_CASES}</span> - {newCaseLink} - {'!'} - </> - ); -}; - -NoCasesComponent.displayName = 'NoCasesComponent'; - -export const NoCases = React.memo(NoCasesComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/recent_cases.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/recent_cases.tsx deleted file mode 100644 index 7cc60878bcfe2..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/recent_cases.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText } from '@elastic/eui'; -import React from 'react'; -import styled from 'styled-components'; - -import { Case } from '../../../cases/containers/types'; -import { getCaseDetailsUrl } from '../../../common/components/link_to/redirect_to_case'; -import { MarkdownRenderer } from '../../../common/components/markdown_editor'; -import { useFormatUrl } from '../../../common/components/link_to'; -import { IconWithCount } from '../recent_timelines/counts'; -import { LinkAnchor } from '../../../common/components/links'; -import * as i18n from './translations'; -import { useKibana } from '../../../common/lib/kibana'; -import { APP_ID } from '../../../../common/constants'; -import { SecurityPageName } from '../../../app/types'; - -const MarkdownContainer = styled.div` - max-height: 150px; - overflow-y: auto; - width: 300px; -`; - -const RecentCasesComponent = ({ cases }: { cases: Case[] }) => { - const { formatUrl, search } = useFormatUrl(SecurityPageName.case); - const { navigateToApp } = useKibana().services.application; - - return ( - <> - {cases.map((c, i) => ( - <EuiFlexGroup key={c.id} gutterSize="none" justifyContent="spaceBetween"> - <EuiFlexItem grow={false}> - <EuiText size="s"> - <LinkAnchor - onClick={(ev: { preventDefault: () => void }) => { - ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCaseDetailsUrl({ id: c.id, search }), - }); - }} - href={formatUrl(getCaseDetailsUrl({ id: c.id }))} - > - {c.title} - </LinkAnchor> - </EuiText> - - <IconWithCount count={c.totalComment} icon={'editorComment'} tooltip={i18n.COMMENTS} /> - {c.description && c.description.length && ( - <MarkdownContainer> - <EuiText color="subdued" size="xs"> - <MarkdownRenderer disableLinks={true}>{c.description}</MarkdownRenderer> - </EuiText> - </MarkdownContainer> - )} - {i !== cases.length - 1 && <EuiSpacer size="l" />} - </EuiFlexItem> - </EuiFlexGroup> - ))} - </> - ); -}; - -RecentCasesComponent.displayName = 'RecentCasesComponent'; - -export const RecentCases = React.memo(RecentCasesComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/translations.ts b/x-pack/plugins/security_solution/public/overview/components/recent_cases/translations.ts deleted file mode 100644 index 37588c0c4bbed..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/translations.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const COMMENTS = i18n.translate('xpack.securitySolution.recentCases.commentsTooltip', { - defaultMessage: 'Comments', -}); - -export const MY_RECENTLY_REPORTED_CASES = i18n.translate( - 'xpack.securitySolution.overview.myRecentlyReportedCasesButtonLabel', - { - defaultMessage: 'My recently reported cases', - } -); - -export const NO_CASES = i18n.translate('xpack.securitySolution.recentCases.noCasesMessage', { - defaultMessage: 'No cases have been created yet. Put your detective hat on and', -}); - -export const RECENTLY_CREATED_CASES = i18n.translate( - 'xpack.securitySolution.overview.recentlyCreatedCasesButtonLabel', - { - defaultMessage: 'Recently created cases', - } -); - -export const START_A_NEW_CASE = i18n.translate( - 'xpack.securitySolution.recentCases.startNewCaseLink', - { - defaultMessage: 'start a new case', - } -); - -export const VIEW_ALL_CASES = i18n.translate( - 'xpack.securitySolution.recentCases.viewAllCasesLink', - { - defaultMessage: 'View all cases', - } -); - -export const CASES_FILTER_CONTROL = i18n.translate( - 'xpack.securitySolution.recentCases.controlLegend', - { - defaultMessage: 'Cases filter', - } -); diff --git a/x-pack/plugins/security_solution/public/overview/components/sidebar/index.tsx b/x-pack/plugins/security_solution/public/overview/components/sidebar/index.tsx index 7ae15ecb6f215..811078bd2e45f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/sidebar/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/sidebar/index.tsx @@ -8,7 +8,6 @@ import React, { useState } from 'react'; import { FilterMode as RecentTimelinesFilterMode } from '../recent_timelines/types'; -import { FilterMode as RecentCasesFilterMode } from '../recent_cases/types'; import { Sidebar } from './sidebar'; @@ -16,14 +15,9 @@ export const StatefulSidebar = React.memo(() => { const [recentTimelinesFilterBy, setRecentTimelinesFilterBy] = useState<RecentTimelinesFilterMode>( 'favorites' ); - const [recentCasesFilterBy, setRecentCasesFilterBy] = useState<RecentCasesFilterMode>( - 'recentlyCreated' - ); return ( <Sidebar - recentCasesFilterBy={recentCasesFilterBy} - setRecentCasesFilterBy={setRecentCasesFilterBy} recentTimelinesFilterBy={recentTimelinesFilterBy} setRecentTimelinesFilterBy={setRecentTimelinesFilterBy} /> diff --git a/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx b/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx index 9512a3e3c67c7..1e6b57a1b7ec0 100644 --- a/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx @@ -10,19 +10,15 @@ import React, { useMemo } from 'react'; import styled from 'styled-components'; import { ENABLE_NEWS_FEED_SETTING, NEWS_FEED_URL_SETTING } from '../../../../common/constants'; -import { Filters as RecentCasesFilters } from '../recent_cases/filters'; import { Filters as RecentTimelinesFilters } from '../recent_timelines/filters'; -import { StatefulRecentCases } from '../recent_cases'; import { StatefulRecentTimelines } from '../recent_timelines'; import { StatefulNewsFeed } from '../../../common/components/news_feed'; import { FilterMode as RecentTimelinesFilterMode } from '../recent_timelines/types'; -import { FilterMode as RecentCasesFilterMode } from '../recent_cases/types'; -import { DEFAULT_FILTER_OPTIONS } from '../../../cases/containers/use_get_cases'; import { SidebarHeader } from '../../../common/components/sidebar_header'; -import { useCurrentUser } from '../../../common/lib/kibana'; import { useApolloClient } from '../../../common/utils/apollo_context'; import * as i18n from '../../pages/translations'; +import { RecentCases } from '../recent_cases'; const SidebarFlexGroup = styled(EuiFlexGroup)` width: 305px; @@ -38,83 +34,44 @@ SidebarSpacerComponent.displayName = 'SidebarSpacerComponent'; const Spacer = React.memo(SidebarSpacerComponent); export const Sidebar = React.memo<{ - recentCasesFilterBy: RecentCasesFilterMode; recentTimelinesFilterBy: RecentTimelinesFilterMode; - setRecentCasesFilterBy: (filterBy: RecentCasesFilterMode) => void; setRecentTimelinesFilterBy: (filterBy: RecentTimelinesFilterMode) => void; -}>( - ({ - recentCasesFilterBy, - recentTimelinesFilterBy, - setRecentCasesFilterBy, - setRecentTimelinesFilterBy, - }) => { - const currentUser = useCurrentUser(); - const apolloClient = useApolloClient(); - const recentCasesFilters = useMemo( - () => ( - <RecentCasesFilters - filterBy={recentCasesFilterBy} - setFilterBy={setRecentCasesFilterBy} - showMyRecentlyReported={currentUser != null} - /> - ), - [currentUser, recentCasesFilterBy, setRecentCasesFilterBy] - ); - const recentCasesFilterOptions = useMemo( - () => - recentCasesFilterBy === 'myRecentlyReported' && currentUser != null - ? { - ...DEFAULT_FILTER_OPTIONS, - reporters: [ - { - email: currentUser.email, - full_name: currentUser.fullName, - username: currentUser.username, - }, - ], - } - : DEFAULT_FILTER_OPTIONS, - [currentUser, recentCasesFilterBy] - ); - const recentTimelinesFilters = useMemo( - () => ( - <RecentTimelinesFilters - filterBy={recentTimelinesFilterBy} - setFilterBy={setRecentTimelinesFilterBy} - /> - ), - [recentTimelinesFilterBy, setRecentTimelinesFilterBy] - ); +}>(({ recentTimelinesFilterBy, setRecentTimelinesFilterBy }) => { + const apolloClient = useApolloClient(); - return ( - <SidebarFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem grow={false}> - <SidebarHeader title={i18n.RECENT_CASES}>{recentCasesFilters}</SidebarHeader> - <StatefulRecentCases filterOptions={recentCasesFilterOptions} /> - </EuiFlexItem> + const recentTimelinesFilters = useMemo( + () => ( + <RecentTimelinesFilters + filterBy={recentTimelinesFilterBy} + setFilterBy={setRecentTimelinesFilterBy} + /> + ), + [recentTimelinesFilterBy, setRecentTimelinesFilterBy] + ); - <Spacer /> + return ( + <SidebarFlexGroup direction="column" gutterSize="none"> + <EuiFlexItem grow={false}> + <RecentCases /> + </EuiFlexItem> - <EuiFlexItem grow={false}> - <SidebarHeader title={i18n.RECENT_TIMELINES}>{recentTimelinesFilters}</SidebarHeader> - <StatefulRecentTimelines - apolloClient={apolloClient!} - filterBy={recentTimelinesFilterBy} - /> - </EuiFlexItem> + <Spacer /> - <Spacer /> + <EuiFlexItem grow={false}> + <SidebarHeader title={i18n.RECENT_TIMELINES}>{recentTimelinesFilters}</SidebarHeader> + <StatefulRecentTimelines apolloClient={apolloClient!} filterBy={recentTimelinesFilterBy} /> + </EuiFlexItem> - <EuiFlexItem grow={false}> - <StatefulNewsFeed - enableNewsFeedSetting={ENABLE_NEWS_FEED_SETTING} - newsFeedSetting={NEWS_FEED_URL_SETTING} - /> - </EuiFlexItem> - </SidebarFlexGroup> - ); - } -); + <Spacer /> + + <EuiFlexItem grow={false}> + <StatefulNewsFeed + enableNewsFeedSetting={ENABLE_NEWS_FEED_SETTING} + newsFeedSetting={NEWS_FEED_URL_SETTING} + /> + </EuiFlexItem> + </SidebarFlexGroup> + ); +}); Sidebar.displayName = 'Sidebar'; diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 136df89558d53..c8997604a81c7 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -63,7 +63,6 @@ import { IndexFieldsStrategyResponse, } from '../common/search_strategy/index_fields'; import { SecurityAppStore } from './common/store/store'; -import { getCaseConnectorUI } from './cases/components/connectors'; import { licenseService } from './common/hooks/use_license'; import { SecuritySolutionUiConfigType } from './common/types'; @@ -334,8 +333,6 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S }, }); - plugins.triggersActionsUi.actionTypeRegistry.register(getCaseConnectorUI()); - return { resolver: async () => { /** diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx index 5cba64299ee9d..67463b8d909e7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx @@ -10,6 +10,7 @@ import { EuiButton, EuiContextMenuPanel, EuiContextMenuItem, EuiPopover } from ' import React, { useCallback, useMemo, useState } from 'react'; import { useDispatch } from 'react-redux'; +import { Case, SubCase } from '../../../../../../cases/common'; import { APP_ID } from '../../../../../common/constants'; import { timelineSelectors } from '../../../../timelines/store/timeline'; import { useAllCasesModal } from '../../../../cases/components/use_all_cases_modal'; @@ -20,7 +21,6 @@ import { TimelineStatus, TimelineId, TimelineType } from '../../../../../common/ import { getCreateCaseUrl, getCaseDetailsUrl } from '../../../../common/components/link_to'; import { SecurityPageName } from '../../../../app/types'; import { timelineDefaults } from '../../../../timelines/store/timeline/defaults'; -import { Case, SubCase } from '../../../../cases/containers/types'; import * as i18n from '../../timeline/properties/translations'; interface Props { diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index 4443688fd249d..2fdffd87e0201 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -34,11 +34,11 @@ import { import { KibanaServices } from '../../common/lib/kibana'; import { ExportSelectedData } from '../../common/components/generic_downloader'; -import { createToasterPlainError } from '../../cases/containers/utils'; import { ImportDataProps, ImportDataResponse, } from '../../detections/containers/detection_engine/rules'; +import { ToasterError } from '../../common/components/toasters'; interface RequestPostTimeline { timeline: TimelineInput; @@ -51,7 +51,7 @@ interface RequestPatchTimeline<T = string> extends RequestPostTimeline { } type RequestPersistTimeline = RequestPostTimeline & Partial<RequestPatchTimeline<null | string>>; - +const createToasterPlainError = (message: string) => new ToasterError([message]); const decodeTimelineResponse = (respTimeline?: TimelineResponse) => pipe( TimelineResponseType.decode(respTimeline), diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 9602a324e5d51..993f9fe5dc77a 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -18088,198 +18088,56 @@ "xpack.securitySolution.cases.caseModal.title": "ケースを選択", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsMessage": "ケースを表示するには、Kibana スペースで保存されたオブジェクト管理機能の権限が必要です。詳細については、Kibana管理者に連絡してください。", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsTitle": "Kibana機能権限が必要です", - "xpack.securitySolution.cases.caseTable.addNewCase": "新規ケースの追加", - "xpack.securitySolution.cases.caseTable.bulkActions": "一斉アクション", - "xpack.securitySolution.cases.caseTable.bulkActions.closeSelectedTitle": "選択した項目を閉じる", - "xpack.securitySolution.cases.caseTable.bulkActions.deleteSelectedTitle": "選択した項目を削除", - "xpack.securitySolution.cases.caseTable.bulkActions.openSelectedTitle": "選択した項目を再開", "xpack.securitySolution.cases.caseTable.caseDetailsLinkAria": "クリックすると、タイトル{detailName}のケースを表示します", - "xpack.securitySolution.cases.caseTable.closed": "終了", "xpack.securitySolution.cases.caseTable.closedCases": "終了したケース", - "xpack.securitySolution.cases.caseTable.delete": "削除", - "xpack.securitySolution.cases.caseTable.incidentSystem": "インシデント管理システム", "xpack.securitySolution.cases.caseTable.inProgressCases": "進行中のケース", - "xpack.securitySolution.cases.caseTable.noCases.body": "表示するケースがありません。新しいケースを作成するか、または上記のフィルター設定を変更してください。", - "xpack.securitySolution.cases.caseTable.noCases.title": "ケースなし", - "xpack.securitySolution.cases.caseTable.notPushed": "プッシュされません", "xpack.securitySolution.cases.caseTable.openCases": "ケースを開く", - "xpack.securitySolution.cases.caseTable.refreshTitle": "更新", - "xpack.securitySolution.cases.caseTable.requiresUpdate": " 更新が必要", - "xpack.securitySolution.cases.caseTable.searchAriaLabel": "ケースの検索", - "xpack.securitySolution.cases.caseTable.searchPlaceholder": "例:ケース名", - "xpack.securitySolution.cases.caseTable.serviceNowLinkAria": "クリックすると、servicenowでインシデントを表示します", - "xpack.securitySolution.cases.caseTable.snIncident": "外部インシデント", - "xpack.securitySolution.cases.caseTable.status": "ステータス", - "xpack.securitySolution.cases.caseTable.upToDate": " は最新です", - "xpack.securitySolution.cases.caseView.actionHeadline": "{actionDate} の {userName} {actionName}", - "xpack.securitySolution.cases.caseView.actionLabel.addComment": "コメントを追加しました", - "xpack.securitySolution.cases.caseView.actionLabel.addDescription": "説明を追加しました", - "xpack.securitySolution.cases.caseView.actionLabel.addedField": "追加しました", - "xpack.securitySolution.cases.caseView.actionLabel.changededField": "変更しました", - "xpack.securitySolution.cases.caseView.actionLabel.editedField": "編集しました", - "xpack.securitySolution.cases.caseView.actionLabel.on": "日付", - "xpack.securitySolution.cases.caseView.actionLabel.pushedNewIncident": "新しいインシデントとしてプッシュしました", - "xpack.securitySolution.cases.caseView.actionLabel.removedField": "削除しました", - "xpack.securitySolution.cases.caseView.actionLabel.removedThirdParty": "外部のインシデント管理システムを削除しました", - "xpack.securitySolution.cases.caseView.actionLabel.selectedThirdParty": "インシデント管理システムとして{ thirdParty }を選択しました", - "xpack.securitySolution.cases.caseView.actionLabel.updateIncident": "インシデントを更新しました", - "xpack.securitySolution.cases.caseView.actionLabel.viewIncident": "{incidentNumber}を表示", - "xpack.securitySolution.cases.caseView.alertCommentLabelTitle": "アラートを追加しました", - "xpack.securitySolution.cases.caseView.alertRuleDeletedLabelTitle": "アラートを追加しました", - "xpack.securitySolution.cases.caseView.alreadyPushedToExternalService": "すでに{ externalService }インシデントにプッシュしました", - "xpack.securitySolution.cases.caseView.appropiateLicense": "適切なライセンス", "xpack.securitySolution.cases.caseView.backLabel": "ケースに戻る", "xpack.securitySolution.cases.caseView.breadcrumb": "作成", "xpack.securitySolution.cases.caseView.cancel": "キャンセル", - "xpack.securitySolution.cases.caseView.case": "ケース", - "xpack.securitySolution.cases.caseView.caseClosed": "ケースを閉じました", - "xpack.securitySolution.cases.caseView.caseInProgress": "進行中のケース", "xpack.securitySolution.cases.caseView.caseName": "ケース名", - "xpack.securitySolution.cases.caseView.caseOpened": "ケースを開きました", - "xpack.securitySolution.cases.caseView.caseRefresh": "ケースを更新", "xpack.securitySolution.cases.caseView.closeCase": "ケースを閉じる", "xpack.securitySolution.cases.caseView.closedOn": "終了日", - "xpack.securitySolution.cases.caseView.cloudDeploymentLink": "クラウド展開", - "xpack.securitySolution.cases.caseView.comment": "コメント", "xpack.securitySolution.cases.caseView.comment.addComment": "コメントを追加", "xpack.securitySolution.cases.caseView.comment.addCommentHelpText": "新しいコメントを追加...", "xpack.securitySolution.cases.caseView.commentFieldRequiredError": "コメントが必要です。", - "xpack.securitySolution.cases.caseView.connectorConfigureLink": "コネクター", "xpack.securitySolution.cases.caseView.connectors": "外部インシデント管理システム", - "xpack.securitySolution.cases.caseView.copyCommentLinkAria": "参照リンクをコピー", "xpack.securitySolution.cases.caseView.create": "新規ケースを作成", "xpack.securitySolution.cases.caseView.createCase": "ケースを作成", "xpack.securitySolution.cases.caseView.description": "説明", "xpack.securitySolution.cases.caseView.description.save": "保存", "xpack.securitySolution.cases.caseView.edit": "編集", - "xpack.securitySolution.cases.caseView.edit.comment": "コメントを編集", - "xpack.securitySolution.cases.caseView.edit.description": "説明を編集", - "xpack.securitySolution.cases.caseView.edit.quote": "お客様の声", - "xpack.securitySolution.cases.caseView.editActionsLinkAria": "クリックすると、すべてのアクションを表示します", "xpack.securitySolution.cases.caseView.editConnector": "外部インシデント管理システムを変更", - "xpack.securitySolution.cases.caseView.editTagsLinkAria": "クリックすると、タグを編集します", - "xpack.securitySolution.cases.caseView.emailBody": "ケースリファレンス:{caseUrl}", - "xpack.securitySolution.cases.caseView.emailSubject": "セキュリティケース - {caseTitle}", - "xpack.securitySolution.cases.caseView.errorsPushServiceCallOutTitle": "ケースを外部システムにプッシュするには、以下が必要です。", - "xpack.securitySolution.cases.caseView.fieldChanged": "変更されたコネクターフィールド", "xpack.securitySolution.cases.caseView.fieldRequiredError": "必須フィールド", - "xpack.securitySolution.cases.caseView.generatedAlertCommentLabelTitle": "から追加されました", "xpack.securitySolution.cases.caseView.goToDocumentationButton": "ドキュメンテーションを表示", "xpack.securitySolution.cases.caseView.markedCaseAs": "ケースを設定", "xpack.securitySolution.cases.caseView.markInProgress": "実行中に設定", - "xpack.securitySolution.cases.caseView.moveToCommentAria": "参照されたコメントをハイライト", "xpack.securitySolution.cases.caseView.name": "名前", "xpack.securitySolution.cases.caseView.noReportersAvailable": "利用可能なレポートがありません。", "xpack.securitySolution.cases.caseView.noTags": "現在、このケースにタグは割り当てられていません。", "xpack.securitySolution.cases.caseView.openedOn": "開始日", "xpack.securitySolution.cases.caseView.optional": "オプション", "xpack.securitySolution.cases.caseView.particpantsLabel": "参加者", - "xpack.securitySolution.cases.caseView.pushNamedIncident": "{ thirdParty }インシデントとしてプッシュ", - "xpack.securitySolution.cases.caseView.pushThirdPartyIncident": "外部インシデントとしてプッシュ", - "xpack.securitySolution.cases.caseView.pushToServiceDisableBecauseCaseClosedDescription": "終了したケースは外部システムに送信できません。外部システムでケースを開始または更新したい場合にはケースを再開します。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableBecauseCaseClosedTitle": "ケースを再開する", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByConfigDescription": "kibana.ymlファイルは、特定のコネクターのみを許可するように構成されています。外部システムでケースを開けるようにするには、xpack.actions.enabledActiontypes設定に.[actionTypeId] (例:.servicenow | .jira) を追加します。詳細は{link}をご覧ください。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByConfigTitle": "Kibanaの構成ファイルで外部サービスを有効にする", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByInvalidConnector": "外部サービスに更新を送信するために使用されるコネクターが削除されました。外部システムでケースを更新するには、別のコネクターを選択するか、新しいコネクターを作成してください。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByLicenseDescription": "{appropriateLicense}があるか、{cloud}を使用しているか、無償試用版をテストしているときには、外部システムでケースを開くことができます。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByLicenseTitle": "適切なライセンスにアップグレード", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoCaseConfigDescription": "外部システムでケースを開いて更新するには、このケースの外部インシデント管理システムを選択する必要があります。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoCaseConfigTitle": "外部コネクターを選択", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoConfigTitle": "外部コネクターを構成", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoConnectors": "外部システムでケースを開いて更新するには、{link}を設定する必要があります。", "xpack.securitySolution.cases.caseView.reopenCase": "ケースを再開", "xpack.securitySolution.cases.caseView.reporterLabel": "報告者", - "xpack.securitySolution.cases.caseView.requiredUpdateToExternalService": "{ externalService }インシデントの更新が必要です", "xpack.securitySolution.cases.caseView.sendAlertToTimelineTooltip": "タイムラインで調査", - "xpack.securitySolution.cases.caseView.sendEmalLinkAria": "クリックすると、{user}に電子メールを送信します", - "xpack.securitySolution.cases.caseView.showAlertTooltip": "アラートの詳細を表示", - "xpack.securitySolution.cases.caseView.statusLabel": "ステータス", - "xpack.securitySolution.cases.caseView.syncAlertsLabel": "アラートの同期", "xpack.securitySolution.cases.caseView.tags": "タグ", "xpack.securitySolution.cases.caseView.to": "に", "xpack.securitySolution.cases.caseView.unknown": "不明", - "xpack.securitySolution.cases.caseView.unknownRule.label": "不明なルール", - "xpack.securitySolution.cases.caseView.updateNamedIncident": "{ thirdParty }インシデントを更新", - "xpack.securitySolution.cases.caseView.updateThirdPartyIncident": "外部インシデントを更新", "xpack.securitySolution.cases.common.noConnector": "コネクターを選択していません", - "xpack.securitySolution.cases.components.connectors.cases.actionTypeTitle": "ケース", - "xpack.securitySolution.cases.components.connectors.cases.addNewCaseOption": "新規ケースの追加", - "xpack.securitySolution.cases.components.connectors.cases.caseRequired": "ケースの選択が必要です。", - "xpack.securitySolution.cases.components.connectors.cases.casesDropdownPlaceholder": "ケースを選択", - "xpack.securitySolution.cases.components.connectors.cases.casesDropdownRowLabel": "ケース", - "xpack.securitySolution.cases.components.connectors.cases.commentLabel": "コメント", - "xpack.securitySolution.cases.components.connectors.cases.commentRequired": "コメントが必要です。", - "xpack.securitySolution.cases.components.connectors.cases.connectedCaseLabel": "接続されたケース", - "xpack.securitySolution.cases.components.connectors.cases.createCaseLabel": "ケースを作成", - "xpack.securitySolution.cases.components.connectors.cases.optionAddNewCase": "新しいケースに追加", - "xpack.securitySolution.cases.components.connectors.cases.optionAddToExistingCase": "既存のケースに追加", - "xpack.securitySolution.cases.components.connectors.cases.selectMessageText": "ケースを作成または更新します。", - "xpack.securitySolution.cases.configure.errorGetFields": "サービスからのフィールドの取得中にエラーが発生しました", - "xpack.securitySolution.cases.configure.successSaveToast": "保存された外部接続設定", - "xpack.securitySolution.cases.configureCases.addNewConnector": "新しいコネクターを追加", - "xpack.securitySolution.cases.configureCases.blankMappings": "1 つ以上のフィールドを { connectorName } にマッピングする必要があります", - "xpack.securitySolution.cases.configureCases.cancelButton": "キャンセル", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsClosedIncident": "新しいインシデントが外部システムで閉じたときにセキュリティケースを自動的に閉じる", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsDesc": "セキュリティケースの終了のしかたを定義します。自動ケース終了のためには、外部のインシデント管理システムへの接続を確立する必要がいります。", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsLabel": "ケース終了オプション", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsManual": "セキュリティケースを手動で閉じる", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsNewIncident": "新しいインシデントを外部システムにプッシュするときにセキュリティケースを自動的に閉じる", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsTitle": "ケースのクローズ", - "xpack.securitySolution.cases.configureCases.commentMapping": "コメント", - "xpack.securitySolution.cases.configureCases.editFieldMappingTitle": "{ thirdPartyName } フィールドマッピングを編集", - "xpack.securitySolution.cases.configureCases.fieldMappingDesc": "データを { thirdPartyName } にプッシュするときに、セキュリティケースフィールドを { thirdPartyName } フィールドにマッピングします。フィールドマッピングでは、{ thirdPartyName } への接続を確立する必要があります。", - "xpack.securitySolution.cases.configureCases.fieldMappingDescErr": "フィールドマッピングでは、{ thirdPartyName } への接続を確立する必要があります。接続資格情報を確認してください。", - "xpack.securitySolution.cases.configureCases.fieldMappingEditAppend": "末尾に追加", - "xpack.securitySolution.cases.configureCases.fieldMappingEditNothing": "何もしない", - "xpack.securitySolution.cases.configureCases.fieldMappingEditOverwrite": "上書き", - "xpack.securitySolution.cases.configureCases.fieldMappingFirstCol": "セキュリティケースフィールド", - "xpack.securitySolution.cases.configureCases.fieldMappingSecondCol": "{ thirdPartyName } フィールド", - "xpack.securitySolution.cases.configureCases.fieldMappingThirdCol": "編集時と更新時", - "xpack.securitySolution.cases.configureCases.fieldMappingTitle": "{ thirdPartyName } フィールドマッピング", "xpack.securitySolution.cases.configureCases.headerTitle": "ケースを構成", - "xpack.securitySolution.cases.configureCases.incidentManagementSystemDesc": "オプションとして、セキュリティケースを選択した外部のインシデント管理システムに接続できます。そうすると、選択したサードパーティシステム内でケースデータをインシデントとしてプッシュできます。", - "xpack.securitySolution.cases.configureCases.incidentManagementSystemLabel": "インシデント管理システム", - "xpack.securitySolution.cases.configureCases.incidentManagementSystemTitle": "外部のインシデント管理システムに接続", - "xpack.securitySolution.cases.configureCases.mappingFieldNotMapped": "マップされません", - "xpack.securitySolution.cases.configureCases.noFieldsError": "{ connectorName } フィールドが見つかりません。解決する { connectorName } コネクター設定または { connectorName } インスタンス設定を確認してください。", - "xpack.securitySolution.cases.configureCases.requiredMappings": "1 つ以上のケースフィールドを次の { connectorName } フィールドにマッピングする必要があります:{ fields }", - "xpack.securitySolution.cases.configureCases.saveAndCloseButton": "保存して閉じる", - "xpack.securitySolution.cases.configureCases.saveButton": "保存", - "xpack.securitySolution.cases.configureCases.updateConnector": "フィールドマッピングを更新", - "xpack.securitySolution.cases.configureCases.updateSelectedConnector": "{ connectorName }を更新", - "xpack.securitySolution.cases.configureCases.warningMessage": "選択したコネクターが削除されました。別のコネクターを選択するか、新しいコネクターを作成してください。", - "xpack.securitySolution.cases.configureCases.warningTitle": "警告", "xpack.securitySolution.cases.configureCasesButton": "外部接続を編集", - "xpack.securitySolution.cases.confirmDeleteCase.confirmQuestion": "このケースを削除すると、関連するすべてのケースデータが完全に削除され、外部インシデント管理システムにデータをプッシュできなくなります。続行していいですか?", - "xpack.securitySolution.cases.confirmDeleteCase.confirmQuestionPlural": "これらのケースを削除すると、関連するすべてのケースデータが完全に削除され、外部インシデント管理システムにデータをプッシュできなくなります。続行していいですか?", "xpack.securitySolution.cases.confirmDeleteCase.deleteCase": "ケースを削除", "xpack.securitySolution.cases.confirmDeleteCase.deleteCases": "ケースを削除", - "xpack.securitySolution.cases.confirmDeleteCase.deleteThisCase": "このケースを削除", - "xpack.securitySolution.cases.confirmDeleteCase.deleteTitle": "「{caseTitle}」を削除", - "xpack.securitySolution.cases.confirmDeleteCase.selectedCases": "選択したケースを削除", - "xpack.securitySolution.cases.connectors.jira.issueTypesSelectFieldLabel": "問題タイプ", - "xpack.securitySolution.cases.connectors.jira.parentIssueSearchLabel": "親問題", - "xpack.securitySolution.cases.connectors.jira.prioritySelectFieldLabel": "優先度", - "xpack.securitySolution.cases.connectors.resilient.incidentTypesLabel": "インシデントタイプ", - "xpack.securitySolution.cases.connectors.resilient.incidentTypesPlaceholder": "タイプを選択", - "xpack.securitySolution.cases.connectors.resilient.severityLabel": "深刻度", - "xpack.securitySolution.cases.connectors.resilient.unableToGetIncidentTypesMessage": "インシデントタイプを取得できません", - "xpack.securitySolution.cases.connectors.resilient.unableToGetSeverityMessage": "深刻度を取得できません", - "xpack.securitySolution.cases.containers.statusChangeToasterText": "このケースのアラートはステータスが更新されました", "xpack.securitySolution.cases.createCase.descriptionFieldRequiredError": "説明が必要です。", "xpack.securitySolution.cases.createCase.fieldTagsHelpText": "このケースの1つ以上のカスタム識別タグを入力します。新しいタグを開始するには、各タグの後でEnterを押します。", "xpack.securitySolution.cases.createCase.titleFieldRequiredError": "タイトルが必要です。", "xpack.securitySolution.cases.dismissErrorsPushServiceCallOutTitle": "閉じる", - "xpack.securitySolution.cases.editConnector.editConnectorLinkAria": "クリックしてコネクターを編集", "xpack.securitySolution.cases.pageTitle": "ケース", "xpack.securitySolution.cases.readOnlySavedObjectDescription": "ケースを表示する権限のみが付与されています。ケースを開いて更新する必要がある場合は、Kibana管理者に連絡してください。", "xpack.securitySolution.cases.readOnlySavedObjectTitle": "新しいケースを開いたり、既存のケースを更新したりすることはできません", "xpack.securitySolution.cases.settings.syncAlertsSwitchLabelOff": "オフ", "xpack.securitySolution.cases.settings.syncAlertsSwitchLabelOn": "オン", - "xpack.securitySolution.cases.status.closed": "終了", - "xpack.securitySolution.cases.status.iconAria": "ステータスの変更", - "xpack.securitySolution.cases.status.inProgress": "進行中", - "xpack.securitySolution.cases.status.open": "開く", "xpack.securitySolution.cases.timeline.actions.addCase": "ケースに追加", "xpack.securitySolution.cases.timeline.actions.addExistingCase": "既存のケースに追加", "xpack.securitySolution.cases.timeline.actions.addNewCase": "新しいケースに追加", @@ -18288,8 +18146,6 @@ "xpack.securitySolution.cases.timeline.actions.caseCreatedSuccessToast": "アラートが「{title}」に追加されました", "xpack.securitySolution.cases.timeline.actions.caseCreatedSuccessToastText": "このケースのアラートはステータスがケースステータスと同期されました", "xpack.securitySolution.cases.timeline.actions.caseCreatedSuccessToastViewCaseLink": "ケースの表示", - "xpack.securitySolution.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage": "オブジェクトタイプ「{id}」は登録されていません。", - "xpack.securitySolution.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage": "オブジェクトタイプ「{id}」はすでに登録されています。", "xpack.securitySolution.certificate.fingerprint.clientCertLabel": "クライアント証明書", "xpack.securitySolution.certificate.fingerprint.serverCertLabel": "サーバー証明書", "xpack.securitySolution.chart.allOthersGroupingLabel": "その他すべて", @@ -18304,31 +18160,7 @@ "xpack.securitySolution.clipboard.to.the.clipboard": "クリップボードに", "xpack.securitySolution.common.alertAddedToCase": "ケースに追加", "xpack.securitySolution.common.alertLabel": "アラート", - "xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxAriaLabel": "入力して検索", - "xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxPlaceholder": "入力して検索", - "xpack.securitySolution.components.connectors.jira.searchIssuesLoading": "読み込み中...", - "xpack.securitySolution.components.connectors.jira.unableToGetFieldsMessage": "コネクターを取得できません", - "xpack.securitySolution.components.connectors.jira.unableToGetIssueMessage": "ID {id}の問題を取得できません", - "xpack.securitySolution.components.connectors.jira.unableToGetIssuesMessage": "問題を取得できません", - "xpack.securitySolution.components.connectors.jira.unableToGetIssueTypesMessage": "問題タイプを取得できません", - "xpack.securitySolution.components.connectors.serviceNow.alertFieldEnabledText": "はい", - "xpack.securitySolution.components.connectors.serviceNow.alertFieldsTitle": "アラートに関連付けられたフィールド", - "xpack.securitySolution.components.connectors.serviceNow.categoryTitle": "カテゴリー", - "xpack.securitySolution.components.connectors.serviceNow.destinationIPTitle": "デスティネーション IP", - "xpack.securitySolution.components.connectors.serviceNow.impactSelectFieldLabel": "インパクト", - "xpack.securitySolution.components.connectors.serviceNow.malwareHashTitle": "マルウェアハッシュ", - "xpack.securitySolution.components.connectors.serviceNow.malwareURLTitle": "マルウェアURL", - "xpack.securitySolution.components.connectors.serviceNow.prioritySelectFieldTitle": "優先度", - "xpack.securitySolution.components.connectors.serviceNow.severitySelectFieldLabel": "深刻度", - "xpack.securitySolution.components.connectors.serviceNow.sourceIPTitle": "ソース IP", - "xpack.securitySolution.components.connectors.serviceNow.subcategoryTitle": "サブカテゴリ", - "xpack.securitySolution.components.connectors.serviceNow.unableToGetChoicesMessage": "選択肢を取得できません", - "xpack.securitySolution.components.connectors.serviceNow.urgencySelectFieldLabel": "緊急", - "xpack.securitySolution.components.create.stepOneTitle": "ケースフィールド", - "xpack.securitySolution.components.create.stepThreeTitle": "外部コネクターフィールド", - "xpack.securitySolution.components.create.stepTwoTitle": "ケース設定", "xpack.securitySolution.components.create.syncAlertHelpText": "このオプションを有効にすると、このケースのアラートのステータスをケースステータスと同期します。", - "xpack.securitySolution.components.create.syncAlertsLabel": "アラートステータスをケースステータスと同期", "xpack.securitySolution.components.embeddables.embeddedMap.clientLayerLabel": "クライアントポイント", "xpack.securitySolution.components.embeddables.embeddedMap.destinationLayerLabel": "デスティネーションポイント", "xpack.securitySolution.components.embeddables.embeddedMap.embeddableHeaderHelp": "マップ構成ヘルプ", @@ -18400,14 +18232,6 @@ "xpack.securitySolution.containers.anomalies.errorFetchingAnomaliesData": "異常データをクエリできませんでした", "xpack.securitySolution.containers.anomalies.stackByJobId": "ジョブ", "xpack.securitySolution.containers.anomalies.title": "異常", - "xpack.securitySolution.containers.cases.closedCases": "{totalCases, plural, =1 {\"{caseTitle}\"} other {{totalCases}件のケース}}をクローズしました", - "xpack.securitySolution.containers.cases.deletedCases": "{totalCases, plural, =1 {\"{caseTitle}\"} other {{totalCases}件のケース}}を削除しました", - "xpack.securitySolution.containers.cases.errorDeletingTitle": "データの削除エラー", - "xpack.securitySolution.containers.cases.errorTitle": "データの取得中にエラーが発生", - "xpack.securitySolution.containers.cases.pushToExternalService": "{ serviceName }への送信が正常に完了しました", - "xpack.securitySolution.containers.cases.reopenedCases": "{totalCases, plural, =1 {\"{caseTitle}\"} other {{totalCases}件のケース}}を再オープンしました", - "xpack.securitySolution.containers.cases.syncCase": "\"{caseTitle}\"のアラートが同期されました", - "xpack.securitySolution.containers.cases.updatedCase": "\"{caseTitle}\"を更新しました", "xpack.securitySolution.containers.detectionEngine.addRuleFailDescription": "ルールを追加できませんでした", "xpack.securitySolution.containers.detectionEngine.alerts.createListsIndex.errorDescription": "リストインデックスを作成できませんでした", "xpack.securitySolution.containers.detectionEngine.alerts.errorFetchingAlertsDescription": "アラートをクエリできませんでした", @@ -20206,7 +20030,6 @@ "xpack.securitySolution.overview.hostStatGroupFilebeat": "Filebeat", "xpack.securitySolution.overview.hostStatGroupWinlogbeat": "Winlogbeat", "xpack.securitySolution.overview.hostsTitle": "ホストイベント", - "xpack.securitySolution.overview.myRecentlyReportedCasesButtonLabel": "最近レポートしたケース", "xpack.securitySolution.overview.networkAction": "ネットワークを表示", "xpack.securitySolution.overview.networkStatGroupAuditbeat": "Auditbeat", "xpack.securitySolution.overview.networkStatGroupFilebeat": "Filebeat", @@ -20219,7 +20042,6 @@ "xpack.securitySolution.overview.pageSubtitle": "Elastic Stackによるセキュリティ情報とイベント管理", "xpack.securitySolution.overview.pageTitle": "セキュリティ", "xpack.securitySolution.overview.recentCasesSidebarTitle": "最近のケース", - "xpack.securitySolution.overview.recentlyCreatedCasesButtonLabel": "最近作成したケース", "xpack.securitySolution.overview.recentTimelinesSidebarTitle": "最近のタイムライン", "xpack.securitySolution.overview.showTopTooltip": "上位の{fieldName}を表示", "xpack.securitySolution.overview.signalCountTitle": "検出アラート傾向", @@ -20253,11 +20075,6 @@ "xpack.securitySolution.policyStatusText.success": "成功", "xpack.securitySolution.policyStatusText.unsupported": "サポートされていない", "xpack.securitySolution.policyStatusText.warning": "警告", - "xpack.securitySolution.recentCases.commentsTooltip": "コメント", - "xpack.securitySolution.recentCases.controlLegend": "ケースフィルター", - "xpack.securitySolution.recentCases.noCasesMessage": "まだケースを作成していません。準備して", - "xpack.securitySolution.recentCases.startNewCaseLink": "新しいケースの開始", - "xpack.securitySolution.recentCases.viewAllCasesLink": "すべてのケースを表示", "xpack.securitySolution.recentTimelines.errorRetrievingUserDetailsMessage": "最近のタイムライン:ユーザー詳細の取得中にエラーが発生しました", "xpack.securitySolution.recentTimelines.favoritesButtonLabel": "お気に入り", "xpack.securitySolution.recentTimelines.filterControlLegend": "タイムラインフィルター", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 12a3c8925cfc6..800430689c851 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -18345,202 +18345,56 @@ "xpack.securitySolution.cases.caseModal.title": "选择案例", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsMessage": "要查看案例,必须对 Kibana 工作区中的已保存对象管理功能有权限。有关详细信息,请联系您的 Kibana 管理员。", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsTitle": "需要 Kibana 功能权限", - "xpack.securitySolution.cases.caseTable.addNewCase": "添加新案例", - "xpack.securitySolution.cases.caseTable.bulkActions": "批处理操作", - "xpack.securitySolution.cases.caseTable.bulkActions.closeSelectedTitle": "关闭所选", - "xpack.securitySolution.cases.caseTable.bulkActions.deleteSelectedTitle": "删除所选", - "xpack.securitySolution.cases.caseTable.bulkActions.openSelectedTitle": "重新打开所选", "xpack.securitySolution.cases.caseTable.caseDetailsLinkAria": "单击以访问标题为 {detailName} 的案例", - "xpack.securitySolution.cases.caseTable.closed": "已关闭", "xpack.securitySolution.cases.caseTable.closedCases": "已关闭案例", - "xpack.securitySolution.cases.caseTable.delete": "删除", - "xpack.securitySolution.cases.caseTable.incidentSystem": "事件管理系统", "xpack.securitySolution.cases.caseTable.inProgressCases": "进行中的案例", - "xpack.securitySolution.cases.caseTable.noCases.body": "没有可显示的案例。请创建新案例或在上面更改您的筛选设置。", - "xpack.securitySolution.cases.caseTable.noCases.title": "无案例", - "xpack.securitySolution.cases.caseTable.notPushed": "未推送", "xpack.securitySolution.cases.caseTable.openCases": "未结案例", - "xpack.securitySolution.cases.caseTable.refreshTitle": "刷新", - "xpack.securitySolution.cases.caseTable.requiresUpdate": " 需要更新", - "xpack.securitySolution.cases.caseTable.searchAriaLabel": "搜索案例", - "xpack.securitySolution.cases.caseTable.searchPlaceholder": "例如案例名", - "xpack.securitySolution.cases.caseTable.selectedCasesTitle": "已选择 {totalRules} 个{totalRules, plural, other {案例}}", - "xpack.securitySolution.cases.caseTable.serviceNowLinkAria": "单击可在 servicenow 上查看该事件", - "xpack.securitySolution.cases.caseTable.showingCasesTitle": "正在显示 {totalRules} 个{totalRules, plural, other {案例}}", - "xpack.securitySolution.cases.caseTable.snIncident": "外部事件", - "xpack.securitySolution.cases.caseTable.status": "状态", - "xpack.securitySolution.cases.caseTable.unit": "{totalCount, plural, other {案例}}", - "xpack.securitySolution.cases.caseTable.upToDate": " 是最新的", - "xpack.securitySolution.cases.caseView.actionHeadline": "{userName} 在 {actionDate}{actionName}", - "xpack.securitySolution.cases.caseView.actionLabel.addComment": "添加了注释", - "xpack.securitySolution.cases.caseView.actionLabel.addDescription": "添加了描述", - "xpack.securitySolution.cases.caseView.actionLabel.addedField": "添加了", - "xpack.securitySolution.cases.caseView.actionLabel.changededField": "更改了", - "xpack.securitySolution.cases.caseView.actionLabel.editedField": "编辑了", - "xpack.securitySolution.cases.caseView.actionLabel.on": "在", - "xpack.securitySolution.cases.caseView.actionLabel.pushedNewIncident": "已推送为新事件", - "xpack.securitySolution.cases.caseView.actionLabel.removedField": "移除了", - "xpack.securitySolution.cases.caseView.actionLabel.removedThirdParty": "已移除外部事件管理系统", - "xpack.securitySolution.cases.caseView.actionLabel.selectedThirdParty": "已选择 { thirdParty } 作为事件管理系统", - "xpack.securitySolution.cases.caseView.actionLabel.updateIncident": "更新了事件", - "xpack.securitySolution.cases.caseView.actionLabel.viewIncident": "查看 {incidentNumber}", - "xpack.securitySolution.cases.caseView.alertCommentLabelTitle": "添加了告警,从", - "xpack.securitySolution.cases.caseView.alertRuleDeletedLabelTitle": "添加了告警", - "xpack.securitySolution.cases.caseView.alreadyPushedToExternalService": "已推送到 { externalService } 事件", - "xpack.securitySolution.cases.caseView.appropiateLicense": "适当的许可证", "xpack.securitySolution.cases.caseView.backLabel": "返回到案例", "xpack.securitySolution.cases.caseView.breadcrumb": "创建", "xpack.securitySolution.cases.caseView.cancel": "取消", - "xpack.securitySolution.cases.caseView.case": "案例", - "xpack.securitySolution.cases.caseView.caseClosed": "案例已关闭", - "xpack.securitySolution.cases.caseView.caseInProgress": "案例进行中", "xpack.securitySolution.cases.caseView.caseName": "案例名称", - "xpack.securitySolution.cases.caseView.caseOpened": "案例已打开", - "xpack.securitySolution.cases.caseView.caseRefresh": "刷新案例", "xpack.securitySolution.cases.caseView.closeCase": "关闭案例", "xpack.securitySolution.cases.caseView.closedOn": "关闭日期", - "xpack.securitySolution.cases.caseView.cloudDeploymentLink": "云部署", - "xpack.securitySolution.cases.caseView.comment": "注释", "xpack.securitySolution.cases.caseView.comment.addComment": "添加注释", "xpack.securitySolution.cases.caseView.comment.addCommentHelpText": "添加新注释......", "xpack.securitySolution.cases.caseView.commentFieldRequiredError": "注释必填。", - "xpack.securitySolution.cases.caseView.connectorConfigureLink": "连接器", "xpack.securitySolution.cases.caseView.connectors": "外部事件管理系统", - "xpack.securitySolution.cases.caseView.copyCommentLinkAria": "复制引用链接", "xpack.securitySolution.cases.caseView.create": "创建新案例", "xpack.securitySolution.cases.caseView.createCase": "创建案例", "xpack.securitySolution.cases.caseView.description": "描述", "xpack.securitySolution.cases.caseView.description.save": "保存", "xpack.securitySolution.cases.caseView.edit": "编辑", - "xpack.securitySolution.cases.caseView.edit.comment": "编辑注释", - "xpack.securitySolution.cases.caseView.edit.description": "编辑描述", - "xpack.securitySolution.cases.caseView.edit.quote": "引述", - "xpack.securitySolution.cases.caseView.editActionsLinkAria": "单击可查看所有操作", "xpack.securitySolution.cases.caseView.editConnector": "更改外部事件管理系统", - "xpack.securitySolution.cases.caseView.editTagsLinkAria": "单击可编辑标签", - "xpack.securitySolution.cases.caseView.emailBody": "案例参考:{caseUrl}", - "xpack.securitySolution.cases.caseView.emailSubject": "Security 案例 - {caseTitle}", - "xpack.securitySolution.cases.caseView.errorsPushServiceCallOutTitle": "要将案例发送到外部系统,您需要:", - "xpack.securitySolution.cases.caseView.fieldChanged": "已更改连接器字段", "xpack.securitySolution.cases.caseView.fieldRequiredError": "必填字段", - "xpack.securitySolution.cases.caseView.generatedAlertCommentLabelTitle": "添加自", - "xpack.securitySolution.cases.caseView.generatedAlertCountCommentLabelTitle": "{totalCount} 个{totalCount, plural, other {告警}}", "xpack.securitySolution.cases.caseView.goToDocumentationButton": "查看文档", "xpack.securitySolution.cases.caseView.markedCaseAs": "将案例标记为", "xpack.securitySolution.cases.caseView.markInProgress": "标记为进行中", - "xpack.securitySolution.cases.caseView.moveToCommentAria": "高亮显示引用的注释", "xpack.securitySolution.cases.caseView.name": "名称", "xpack.securitySolution.cases.caseView.noReportersAvailable": "没有报告者。", "xpack.securitySolution.cases.caseView.noTags": "当前没有为此案例分配标签。", "xpack.securitySolution.cases.caseView.openedOn": "打开时间", "xpack.securitySolution.cases.caseView.optional": "可选", "xpack.securitySolution.cases.caseView.particpantsLabel": "参与者", - "xpack.securitySolution.cases.caseView.pushNamedIncident": "推送为 { thirdParty } 事件", - "xpack.securitySolution.cases.caseView.pushThirdPartyIncident": "推送为外部事件", - "xpack.securitySolution.cases.caseView.pushToServiceDisableBecauseCaseClosedDescription": "关闭的案例无法发送到外部系统。如果希望在外部系统中打开或更新案例,请重新打开案例。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableBecauseCaseClosedTitle": "重新打开案例", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByConfigDescription": "kibana.yml 文件已配置为仅允许特定连接器。要在外部系统中打开案例,请将 .[actionTypeId] (例如:.servicenow | .jira) 添加到 xpack.actions.enabledActiontypes 设置。有关更多信息,请参阅{link}。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByConfigTitle": "在 Kibana 配置文件中启用外部服务", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByInvalidConnector": "用于将更新发送到外部服务的连接器已删除。要在外部系统中更新案例,请选择不同的连接器或创建新的连接器。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByLicenseDescription": "有{appropriateLicense}、正使用{cloud}或正在免费试用时,可在外部系统中创建案例。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByLicenseTitle": "升级适当的许可", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoCaseConfigDescription": "要在外部系统中打开和更新案例,必须为此案例选择外部事件管理系统。", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoCaseConfigTitle": "选择外部连接器", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoConfigTitle": "配置外部连接器", - "xpack.securitySolution.cases.caseView.pushToServiceDisableByNoConnectors": "要在外部系统上打开和更新案例,必须配置{link}。", "xpack.securitySolution.cases.caseView.reopenCase": "重新打开案例", "xpack.securitySolution.cases.caseView.reporterLabel": "报告者", - "xpack.securitySolution.cases.caseView.requiredUpdateToExternalService": "需要更新 { externalService } 事件", "xpack.securitySolution.cases.caseView.sendAlertToTimelineTooltip": "在时间线中调查", - "xpack.securitySolution.cases.caseView.sendEmalLinkAria": "单击可向 {user} 发送电子邮件", - "xpack.securitySolution.cases.caseView.showAlertTooltip": "显示告警详情", - "xpack.securitySolution.cases.caseView.statusLabel": "状态", - "xpack.securitySolution.cases.caseView.syncAlertsLabel": "同步告警", "xpack.securitySolution.cases.caseView.tags": "标签", "xpack.securitySolution.cases.caseView.to": "到", "xpack.securitySolution.cases.caseView.unknown": "未知", - "xpack.securitySolution.cases.caseView.unknownRule.label": "未知规则", - "xpack.securitySolution.cases.caseView.updateNamedIncident": "更新 { thirdParty } 事件", - "xpack.securitySolution.cases.caseView.updateThirdPartyIncident": "更新外部事件", "xpack.securitySolution.cases.common.noConnector": "未选择任何连接器", - "xpack.securitySolution.cases.components.connectors.cases.actionTypeTitle": "案例", - "xpack.securitySolution.cases.components.connectors.cases.addNewCaseOption": "添加新案例", - "xpack.securitySolution.cases.components.connectors.cases.caseRequired": "必须选择策略。", - "xpack.securitySolution.cases.components.connectors.cases.casesDropdownPlaceholder": "选择案例", - "xpack.securitySolution.cases.components.connectors.cases.casesDropdownRowLabel": "案例", - "xpack.securitySolution.cases.components.connectors.cases.commentLabel": "注释", - "xpack.securitySolution.cases.components.connectors.cases.commentRequired": "“注释”必填。", - "xpack.securitySolution.cases.components.connectors.cases.connectedCaseLabel": "已连接案例", - "xpack.securitySolution.cases.components.connectors.cases.createCaseLabel": "创建案例", - "xpack.securitySolution.cases.components.connectors.cases.optionAddNewCase": "添加到新案例", - "xpack.securitySolution.cases.components.connectors.cases.optionAddToExistingCase": "添加到现有案例", - "xpack.securitySolution.cases.components.connectors.cases.selectMessageText": "创建或更新案例。", - "xpack.securitySolution.cases.configure.errorGetFields": "从服务中获取字段时出错", - "xpack.securitySolution.cases.configure.successSaveToast": "已保存外部连接设置", - "xpack.securitySolution.cases.configureCases.addNewConnector": "添加新连接器", - "xpack.securitySolution.cases.configureCases.blankMappings": "至少一个字段需映射到 { connectorName }", - "xpack.securitySolution.cases.configureCases.cancelButton": "取消", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsClosedIncident": "在外部系统中关闭事件时自动关闭 Security 案例", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsDesc": "定义关闭 Security 案例的方式。要自动关闭案例,需要与外部事件管理系统建立连接。", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsLabel": "案例关闭选项", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsManual": "手动关闭 Security 案例", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsNewIncident": "将新事件推送到外部系统时自动关闭 Security 案例", - "xpack.securitySolution.cases.configureCases.caseClosureOptionsTitle": "案例关闭", - "xpack.securitySolution.cases.configureCases.commentMapping": "注释", - "xpack.securitySolution.cases.configureCases.editFieldMappingTitle": "编辑 { thirdPartyName } 字段映射", - "xpack.securitySolution.cases.configureCases.fieldMappingDesc": "将数据推送到 { thirdPartyName } 时,将 Security 案例字段映射到 { thirdPartyName } 字段。字段映射需要与 { thirdPartyName } 建立连接。", - "xpack.securitySolution.cases.configureCases.fieldMappingDescErr": "字段映射需要与 { thirdPartyName } 建立连接。请检查您的连接凭据。", - "xpack.securitySolution.cases.configureCases.fieldMappingEditAppend": "追加", - "xpack.securitySolution.cases.configureCases.fieldMappingEditNothing": "无内容", - "xpack.securitySolution.cases.configureCases.fieldMappingEditOverwrite": "覆盖", - "xpack.securitySolution.cases.configureCases.fieldMappingFirstCol": "Security 案例字段", - "xpack.securitySolution.cases.configureCases.fieldMappingSecondCol": "{ thirdPartyName } 字段", - "xpack.securitySolution.cases.configureCases.fieldMappingThirdCol": "编辑和更新时", - "xpack.securitySolution.cases.configureCases.fieldMappingTitle": "{ thirdPartyName } 字段映射", "xpack.securitySolution.cases.configureCases.headerTitle": "配置案例", - "xpack.securitySolution.cases.configureCases.incidentManagementSystemDesc": "您可能会根据需要将 Security 案例连接到选择的外部事件管理系统。这将允许您将案例数据作为事件推送到所选第三方系统。", - "xpack.securitySolution.cases.configureCases.incidentManagementSystemLabel": "事件管理系统", - "xpack.securitySolution.cases.configureCases.incidentManagementSystemTitle": "连接到外部事件管理系统", - "xpack.securitySolution.cases.configureCases.mappingFieldNotMapped": "未映射", - "xpack.securitySolution.cases.configureCases.noFieldsError": "未找到任何 { connectorName } 字段。请检查您的 { connectorName } 连接器设置或 { connectorName } 实例设置以解决问题。", - "xpack.securitySolution.cases.configureCases.requiredMappings": "至少有一个案例字段需要映射到以下所需的 { connectorName } 字段:{ fields }", - "xpack.securitySolution.cases.configureCases.saveAndCloseButton": "保存并关闭", - "xpack.securitySolution.cases.configureCases.saveButton": "保存", - "xpack.securitySolution.cases.configureCases.updateConnector": "更新字段映射", - "xpack.securitySolution.cases.configureCases.updateSelectedConnector": "更新 { connectorName }", - "xpack.securitySolution.cases.configureCases.warningMessage": "选定的连接器已删除。选择不同的连接器或创建新的连接器。", - "xpack.securitySolution.cases.configureCases.warningTitle": "警告", "xpack.securitySolution.cases.configureCasesButton": "编辑外部连接", - "xpack.securitySolution.cases.confirmDeleteCase.confirmQuestion": "删除此案例即会永久移除所有相关案例数据,而且您将无法再将数据推送到外部事件管理系统。是否确定要继续?", - "xpack.securitySolution.cases.confirmDeleteCase.confirmQuestionPlural": "删除这些案例即会永久移除所有相关案例数据,而且您将无法再将数据推送到外部事件管理系统。是否确定要继续?", "xpack.securitySolution.cases.confirmDeleteCase.deleteCase": "删除案例", "xpack.securitySolution.cases.confirmDeleteCase.deleteCases": "删除案例", - "xpack.securitySolution.cases.confirmDeleteCase.deleteThisCase": "删除此案例", - "xpack.securitySolution.cases.confirmDeleteCase.deleteTitle": "删除“{caseTitle}”", - "xpack.securitySolution.cases.confirmDeleteCase.selectedCases": "删除选定案例", - "xpack.securitySolution.cases.connectors.jira.issueTypesSelectFieldLabel": "问题类型", - "xpack.securitySolution.cases.connectors.jira.parentIssueSearchLabel": "父问题", - "xpack.securitySolution.cases.connectors.jira.prioritySelectFieldLabel": "优先级", - "xpack.securitySolution.cases.connectors.resilient.incidentTypesLabel": "事件类型", - "xpack.securitySolution.cases.connectors.resilient.incidentTypesPlaceholder": "选择类型", - "xpack.securitySolution.cases.connectors.resilient.severityLabel": "严重性", - "xpack.securitySolution.cases.connectors.resilient.unableToGetIncidentTypesMessage": "无法获取事件类型", - "xpack.securitySolution.cases.connectors.resilient.unableToGetSeverityMessage": "无法获取严重性", - "xpack.securitySolution.cases.containers.statusChangeToasterText": "此案例中的告警也更新了状态", "xpack.securitySolution.cases.createCase.descriptionFieldRequiredError": "描述必填。", "xpack.securitySolution.cases.createCase.fieldTagsHelpText": "为此案例键入一个或多个定制识别标签。在每个标签后按 Enter 键可开始新的标签。", "xpack.securitySolution.cases.createCase.titleFieldRequiredError": "标题必填。", "xpack.securitySolution.cases.dismissErrorsPushServiceCallOutTitle": "关闭", - "xpack.securitySolution.cases.editConnector.editConnectorLinkAria": "单击以编辑连接器", "xpack.securitySolution.cases.pageTitle": "案例", "xpack.securitySolution.cases.readOnlySavedObjectDescription": "您仅有权查看案例。如果需要创建和更新案例,请联系您的 Kibana 管理员。", "xpack.securitySolution.cases.readOnlySavedObjectTitle": "您无法创建新案例或更新现有案例", "xpack.securitySolution.cases.settings.syncAlertsSwitchLabelOff": "关闭", "xpack.securitySolution.cases.settings.syncAlertsSwitchLabelOn": "开启", - "xpack.securitySolution.cases.status.closed": "已关闭", - "xpack.securitySolution.cases.status.iconAria": "更改状态", - "xpack.securitySolution.cases.status.inProgress": "进行中", - "xpack.securitySolution.cases.status.open": "未结", "xpack.securitySolution.cases.timeline.actions.addCase": "添加到案例", "xpack.securitySolution.cases.timeline.actions.addExistingCase": "添加到现有案例", "xpack.securitySolution.cases.timeline.actions.addNewCase": "添加到新案例", @@ -18549,8 +18403,6 @@ "xpack.securitySolution.cases.timeline.actions.caseCreatedSuccessToast": "告警已添加到“{title}”", "xpack.securitySolution.cases.timeline.actions.caseCreatedSuccessToastText": "此案例中的告警的状态已经与案例状态同步", "xpack.securitySolution.cases.timeline.actions.caseCreatedSuccessToastViewCaseLink": "查看案例", - "xpack.securitySolution.caseConnectorsRegistry.get.missingCaseConnectorErrorMessage": "对象类型“{id}”未注册。", - "xpack.securitySolution.caseConnectorsRegistry.register.duplicateCaseConnectorErrorMessage": "已注册对象类型“{id}”。", "xpack.securitySolution.certificate.fingerprint.clientCertLabel": "客户端证书", "xpack.securitySolution.certificate.fingerprint.serverCertLabel": "服务器证书", "xpack.securitySolution.chart.allOthersGroupingLabel": "所有其他", @@ -18565,31 +18417,7 @@ "xpack.securitySolution.clipboard.to.the.clipboard": "至剪贴板", "xpack.securitySolution.common.alertAddedToCase": "已添加到案例", "xpack.securitySolution.common.alertLabel": "告警", - "xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxAriaLabel": "键入内容进行搜索", - "xpack.securitySolution.components.connectors.jira.searchIssuesComboBoxPlaceholder": "键入内容进行搜索", - "xpack.securitySolution.components.connectors.jira.searchIssuesLoading": "正在加载……", - "xpack.securitySolution.components.connectors.jira.unableToGetFieldsMessage": "无法获取连接器", - "xpack.securitySolution.components.connectors.jira.unableToGetIssueMessage": "无法获取 ID 为 {id} 的问题", - "xpack.securitySolution.components.connectors.jira.unableToGetIssuesMessage": "无法获取问题", - "xpack.securitySolution.components.connectors.jira.unableToGetIssueTypesMessage": "无法获取问题类型", - "xpack.securitySolution.components.connectors.serviceNow.alertFieldEnabledText": "是", - "xpack.securitySolution.components.connectors.serviceNow.alertFieldsTitle": "与告警关联的字段", - "xpack.securitySolution.components.connectors.serviceNow.categoryTitle": "类别", - "xpack.securitySolution.components.connectors.serviceNow.destinationIPTitle": "目标 IP", - "xpack.securitySolution.components.connectors.serviceNow.impactSelectFieldLabel": "影响", - "xpack.securitySolution.components.connectors.serviceNow.malwareHashTitle": "恶意软件哈希", - "xpack.securitySolution.components.connectors.serviceNow.malwareURLTitle": "恶意软件 URL", - "xpack.securitySolution.components.connectors.serviceNow.prioritySelectFieldTitle": "优先级", - "xpack.securitySolution.components.connectors.serviceNow.severitySelectFieldLabel": "严重性", - "xpack.securitySolution.components.connectors.serviceNow.sourceIPTitle": "源 IP", - "xpack.securitySolution.components.connectors.serviceNow.subcategoryTitle": "子类别", - "xpack.securitySolution.components.connectors.serviceNow.unableToGetChoicesMessage": "无法获取选项", - "xpack.securitySolution.components.connectors.serviceNow.urgencySelectFieldLabel": "紧急性", - "xpack.securitySolution.components.create.stepOneTitle": "案例字段", - "xpack.securitySolution.components.create.stepThreeTitle": "外部连接器字段", - "xpack.securitySolution.components.create.stepTwoTitle": "案例设置", "xpack.securitySolution.components.create.syncAlertHelpText": "启用此选项将使本案例中的告警状态与案例状态同步。", - "xpack.securitySolution.components.create.syncAlertsLabel": "将告警状态与案例状态同步", "xpack.securitySolution.components.embeddables.embeddedMap.clientLayerLabel": "客户端点", "xpack.securitySolution.components.embeddables.embeddedMap.destinationLayerLabel": "目标点", "xpack.securitySolution.components.embeddables.embeddedMap.embeddableHeaderHelp": "地图配置帮助", @@ -18664,14 +18492,6 @@ "xpack.securitySolution.containers.anomalies.errorFetchingAnomaliesData": "无法查询异常数据", "xpack.securitySolution.containers.anomalies.stackByJobId": "作业", "xpack.securitySolution.containers.anomalies.title": "异常", - "xpack.securitySolution.containers.cases.closedCases": "已关闭{totalCases, plural, =1 {“{caseTitle}”} other { {totalCases} 个案例}}", - "xpack.securitySolution.containers.cases.deletedCases": "已删除{totalCases, plural, =1 {“{caseTitle}”} other { {totalCases} 个案例}}", - "xpack.securitySolution.containers.cases.errorDeletingTitle": "删除数据时出错", - "xpack.securitySolution.containers.cases.errorTitle": "提取数据时出错", - "xpack.securitySolution.containers.cases.pushToExternalService": "已成功发送到 { serviceName }", - "xpack.securitySolution.containers.cases.reopenedCases": "已重新打开{totalCases, plural, =1 {“{caseTitle}”} other { {totalCases} 个案例}}", - "xpack.securitySolution.containers.cases.syncCase": "“{caseTitle}”中的告警已同步", - "xpack.securitySolution.containers.cases.updatedCase": "已更新“{caseTitle}”", "xpack.securitySolution.containers.detectionEngine.addRuleFailDescription": "无法添加规则", "xpack.securitySolution.containers.detectionEngine.alerts.createListsIndex.errorDescription": "无法创建列表索引", "xpack.securitySolution.containers.detectionEngine.alerts.errorFetchingAlertsDescription": "无法查询告警", @@ -20528,7 +20348,6 @@ "xpack.securitySolution.overview.hostStatGroupFilebeat": "Filebeat", "xpack.securitySolution.overview.hostStatGroupWinlogbeat": "Winlogbeat", "xpack.securitySolution.overview.hostsTitle": "主机事件", - "xpack.securitySolution.overview.myRecentlyReportedCasesButtonLabel": "我最近报告的案例", "xpack.securitySolution.overview.networkAction": "查看网络", "xpack.securitySolution.overview.networkStatGroupAuditbeat": "Auditbeat", "xpack.securitySolution.overview.networkStatGroupFilebeat": "Filebeat", @@ -20543,7 +20362,6 @@ "xpack.securitySolution.overview.pageSubtitle": "Elastic Stack 的安全信息和事件管理功能", "xpack.securitySolution.overview.pageTitle": "安全", "xpack.securitySolution.overview.recentCasesSidebarTitle": "最近案例", - "xpack.securitySolution.overview.recentlyCreatedCasesButtonLabel": "最近创建的案例", "xpack.securitySolution.overview.recentTimelinesSidebarTitle": "最近的时间线", "xpack.securitySolution.overview.showTopTooltip": "显示排名靠前的{fieldName}", "xpack.securitySolution.overview.signalCountTitle": "检测告警趋势", @@ -20579,11 +20397,6 @@ "xpack.securitySolution.policyStatusText.success": "成功", "xpack.securitySolution.policyStatusText.unsupported": "不支持", "xpack.securitySolution.policyStatusText.warning": "警告", - "xpack.securitySolution.recentCases.commentsTooltip": "注释", - "xpack.securitySolution.recentCases.controlLegend": "案例筛选", - "xpack.securitySolution.recentCases.noCasesMessage": "尚未创建任何案例。以侦探的眼光", - "xpack.securitySolution.recentCases.startNewCaseLink": "建立新案例", - "xpack.securitySolution.recentCases.viewAllCasesLink": "查看所有案例", "xpack.securitySolution.recentTimelines.errorRetrievingUserDetailsMessage": "最近的时间线:检索用户详情时发生错误", "xpack.securitySolution.recentTimelines.favoritesButtonLabel": "收藏夹", "xpack.securitySolution.recentTimelines.filterControlLegend": "时间线筛选", From bc59d5329cbf7c3ed6826b40f7db3f0801dd8037 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Fri, 2 Apr 2021 07:43:54 -0600 Subject: [PATCH 36/52] rm bazel dir --- bazel/bin | 1 - bazel/kibana | 1 - bazel/out | 1 - bazel/testlogs | 1 - 4 files changed, 4 deletions(-) delete mode 120000 bazel/bin delete mode 120000 bazel/kibana delete mode 120000 bazel/out delete mode 120000 bazel/testlogs diff --git a/bazel/bin b/bazel/bin deleted file mode 120000 index 12f188c46c661..0000000000000 --- a/bazel/bin +++ /dev/null @@ -1 +0,0 @@ -/private/var/tmp/_bazel_stephmilovic/f2692a3f20a774c59f0da1de1e889609/execroot/kibana/bazel-out/darwin-fastbuild/bin \ No newline at end of file diff --git a/bazel/kibana b/bazel/kibana deleted file mode 120000 index 2a96ea5078aa9..0000000000000 --- a/bazel/kibana +++ /dev/null @@ -1 +0,0 @@ -/private/var/tmp/_bazel_stephmilovic/f2692a3f20a774c59f0da1de1e889609/execroot/kibana \ No newline at end of file diff --git a/bazel/out b/bazel/out deleted file mode 120000 index 49a6cd407a9e0..0000000000000 --- a/bazel/out +++ /dev/null @@ -1 +0,0 @@ -/private/var/tmp/_bazel_stephmilovic/f2692a3f20a774c59f0da1de1e889609/execroot/kibana/bazel-out \ No newline at end of file diff --git a/bazel/testlogs b/bazel/testlogs deleted file mode 120000 index 173307f9e2f08..0000000000000 --- a/bazel/testlogs +++ /dev/null @@ -1 +0,0 @@ -/private/var/tmp/_bazel_stephmilovic/f2692a3f20a774c59f0da1de1e889609/execroot/kibana/bazel-out/darwin-fastbuild/testlogs \ No newline at end of file From 39f4844fcd7aadb89d68ebe65197c94b2129aea7 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 7 Apr 2021 07:32:48 -0600 Subject: [PATCH 37/52] [Security Solution] Tsconfig for cases (#96249) --- tsconfig.json | 2 +- tsconfig.refs.json | 1 + .../components/markdown_editor/editor.tsx | 21 +++++++++++-- x-pack/plugins/cases/server/types.ts | 4 --- x-pack/plugins/cases/tsconfig.json | 30 +++++++++++++++++++ x-pack/test/tsconfig.json | 1 + 6 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 x-pack/plugins/cases/tsconfig.json diff --git a/tsconfig.json b/tsconfig.json index 40763ede1bbdd..618c609bf887d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,6 @@ "x-pack/mocks.ts", "x-pack/typings/**/*", "x-pack/tasks/**/*", - "x-pack/plugins/cases/**/*", "x-pack/plugins/lists/**/*", "x-pack/plugins/security_solution/**/*", ], @@ -84,6 +83,7 @@ { "path": "./x-pack/plugins/apm/tsconfig.json" }, { "path": "./x-pack/plugins/beats_management/tsconfig.json" }, { "path": "./x-pack/plugins/canvas/tsconfig.json" }, + { "path": "./x-pack/plugins/cases/tsconfig.json" }, { "path": "./x-pack/plugins/cloud/tsconfig.json" }, { "path": "./x-pack/plugins/console_extensions/tsconfig.json" }, { "path": "./x-pack/plugins/data_enhanced/tsconfig.json" }, diff --git a/tsconfig.refs.json b/tsconfig.refs.json index f13455a14b4df..b5e73e50f8b81 100644 --- a/tsconfig.refs.json +++ b/tsconfig.refs.json @@ -60,6 +60,7 @@ { "path": "./x-pack/plugins/apm/tsconfig.json" }, { "path": "./x-pack/plugins/beats_management/tsconfig.json" }, { "path": "./x-pack/plugins/canvas/tsconfig.json" }, + { "path": "./x-pack/plugins/cases/tsconfig.json" }, { "path": "./x-pack/plugins/cloud/tsconfig.json" }, { "path": "./x-pack/plugins/console_extensions/tsconfig.json" }, { "path": "./x-pack/plugins/dashboard_enhanced/tsconfig.json" }, diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx index a7d37fdda3085..1d17c7d8a25d1 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx @@ -5,8 +5,15 @@ * 2.0. */ -import React, { memo, useEffect, useState, useCallback } from 'react'; +import React, { memo, useEffect, useState, useCallback, FunctionComponent } from 'react'; +import { Plugin, PluggableList } from 'unified'; +// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 +// eslint-disable-next-line import/no-extraneous-dependencies +import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; +// eslint-disable-next-line import/no-extraneous-dependencies +import rehype2react from 'rehype-react'; import { + EuiLinkAnchorProps, EuiMarkdownEditor, getDefaultEuiMarkdownParsingPlugins, getDefaultEuiMarkdownProcessingPlugins, @@ -26,8 +33,18 @@ interface MarkdownEditorProps { export const { uiPlugins, parsingPlugins, processingPlugins } = { uiPlugins: getDefaultEuiMarkdownUiPlugins(), parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), - processingPlugins: getDefaultEuiMarkdownProcessingPlugins(), + processingPlugins: getDefaultEuiMarkdownProcessingPlugins() as [ + [Plugin, Remark2RehypeOptions], + [ + typeof rehype2react, + Parameters<typeof rehype2react>[0] & { + components: { a: FunctionComponent<EuiLinkAnchorProps> }; + } + ], + ...PluggableList + ], }; + const MarkdownEditorComponent: React.FC<MarkdownEditorProps> = ({ onChange, value, diff --git a/x-pack/plugins/cases/server/types.ts b/x-pack/plugins/cases/server/types.ts index 31d73ea999163..420890c6f80fe 100644 --- a/x-pack/plugins/cases/server/types.ts +++ b/x-pack/plugins/cases/server/types.ts @@ -6,7 +6,6 @@ */ import type { IRouter, RequestHandlerContext } from 'src/core/server'; -import type { AppRequestContext } from '../../security_solution/server'; import type { ActionsApiRequestHandlerContext } from '../../actions/server'; import { CasesClient } from './client'; @@ -20,9 +19,6 @@ export interface CaseRequestContext { export interface CasesRequestHandlerContext extends RequestHandlerContext { cases: CaseRequestContext; actions: ActionsApiRequestHandlerContext; - // TODO: Remove when triggers_ui do not import case's types. - // PR https://github.com/elastic/kibana/pull/84587. - securitySolution: AppRequestContext; } /** diff --git a/x-pack/plugins/cases/tsconfig.json b/x-pack/plugins/cases/tsconfig.json new file mode 100644 index 0000000000000..493fe6430efa7 --- /dev/null +++ b/x-pack/plugins/cases/tsconfig.json @@ -0,0 +1,30 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "outDir": "./target/types", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true + }, + "include": [ + "common/**/*", + "public/**/*", + "server/**/*", + "../../../typings/**/*" + ], + "references": [ + { "path": "../../../src/core/tsconfig.json" }, + + // optionalPlugins from ./kibana.json + { "path": "../security/tsconfig.json" }, + { "path": "../spaces/tsconfig.json" }, + + // Required from './kibana.json' + { "path": "../actions/tsconfig.json" }, + { "path": "../triggers_actions_ui/tsconfig.json"}, + { "path": "../../../src/plugins/es_ui_shared/tsconfig.json" }, + { "path": "../../../src/plugins/kibana_react/tsconfig.json" }, + { "path": "../../../src/plugins/kibana_utils/tsconfig.json" } + ] +} diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 8757b39a0b3ac..87f6ad20e6040 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -42,6 +42,7 @@ { "path": "../plugins/apm/tsconfig.json" }, { "path": "../plugins/banners/tsconfig.json" }, { "path": "../plugins/beats_management/tsconfig.json" }, + { "path": "../plugins/cases/tsconfig.json" }, { "path": "../plugins/cloud/tsconfig.json" }, { "path": "../plugins/console_extensions/tsconfig.json" }, { "path": "../plugins/dashboard_mode/tsconfig.json" }, From faee4132a2bd670319fcc3864606eee29ebf5565 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 7 Apr 2021 07:58:06 -0600 Subject: [PATCH 38/52] rm jsdom thirteen --- x-pack/plugins/cases/jest.config.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/x-pack/plugins/cases/jest.config.js b/x-pack/plugins/cases/jest.config.js index de3c3d08eb801..6368eb8895ad1 100644 --- a/x-pack/plugins/cases/jest.config.js +++ b/x-pack/plugins/cases/jest.config.js @@ -6,11 +6,7 @@ */ module.exports = { - testEnvironment: 'jest-environment-jsdom-thirteen', preset: '@kbn/test', rootDir: '../../..', roots: ['<rootDir>/x-pack/plugins/cases'], - - // TODO: migrate to "jest-environment-jsdom" https://github.com/elastic/kibana/issues/95201 - testEnvironment: 'jest-environment-jsdom-thirteen', }; From d2eaf3b3e06dac2a19224cb270af462789bd41eb Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Tue, 13 Apr 2021 10:25:03 -0400 Subject: [PATCH 39/52] [Security Solution][Cases] - Update navigation props (#96493) --- x-pack/plugins/cases/README.md | 41 +++---- .../public/components/all_cases/columns.tsx | 13 +-- .../components/all_cases/index.test.tsx | 38 +++--- .../public/components/all_cases/index.tsx | 44 +++---- .../components/case_view/index.test.tsx | 110 ++++++++++++------ .../public/components/case_view/index.tsx | 66 +++++------ .../configure_cases/button.test.tsx | 6 +- .../components/configure_cases/button.tsx | 16 +-- .../cases/public/components/links/index.tsx | 21 +++- .../public/components/recent_cases/index.tsx | 25 ++-- .../components/recent_cases/recent_cases.tsx | 17 ++- .../use_push_to_service/index.test.tsx | 6 +- .../components/use_push_to_service/index.tsx | 14 +-- .../components/user_action_tree/helpers.tsx | 4 +- .../components/user_action_tree/index.tsx | 2 +- .../user_action_alert_comment_event.tsx | 4 +- .../cases/components/all_cases/index.tsx | 30 +++-- .../cases/components/case_view/index.tsx | 22 ++-- .../components/recent_cases/index.tsx | 24 ++-- 19 files changed, 268 insertions(+), 235 deletions(-) diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index 9905c1d6ba40b..f0c023b0e0c54 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -41,43 +41,38 @@ cases: CasesUiStart; onSuccess, }) ``` + ##### Methods: ### `getAllCases` Arguments: |Property|Description| |---|---| -|configureCasesHref|`string;` route for configure cases page -|createCaseHref|`string;` route for create cases page +|caseDetailsNavigation|`CasesNavigation<CaseDetailsHrefSchema, 'configurable'>` route configuration to generate the case details url for the case details page +|configureCasesNavigation|`CasesNavigation` route configuration for configure cases page +|createCaseNavigation|`CasesNavigation` route configuration for create cases page |disabledStatuses?|`CaseStatuses[];` array of disabled statuses -|getCaseDetailsHref|`(caseDetails: CaseDetailsHrefSchema) => string;` callback to generate the case details url from the case id |isModal?|`boolean;` is All Cases table a modal -|onCaseDetailsNavClick|`(caseDetails: CaseDetailsHrefSchema) => void;` callback for case details nav click -|onConfigureCasesNavClick?|`(ev: React.MouseEvent) => void;` callback for configure case nav click -|onCreateCaseNavClick?|`(ev: React.MouseEvent) => void;` callback for create case nav click |onRowClick?|`(theCase?: Case ! SubCase) => void;` callback for row click, passing case in row |userCanCrud|`boolean;` user permissions to crud UI component: ![All Cases Component][all-cases-img] - + ### `getCaseView` -Arguments: +Arguments: |Property|Description| |---|---| -|allCasesHref|`string;` route for all cases page -|backToAllCasesOnClick|`(ev: MouseEvent) => void;` handler for back to all cases click -|caseDetailsHref|`string;` route for configure cases page +|caseDetailsNavigation|`CasesNavigation<CaseDetailsHrefSchema, 'configurable'>` route configuration to generate the case details url for the case details page |caseId|`string;` ID of the case -|configureCasesHref|`string;` route for configure cases page +|configureCasesNavigation|`CasesNavigation` route configuration for configure cases page +|createCaseNavigation|`CasesNavigation` route configuration for create cases page |getCaseDetailHrefWithCommentId|`(commentId: string) => string;` callback to generate the case details url with a comment id reference from the case id and comment id -|getRuleDetailsHref|`(ruleId: string, null, undefined) => string;` callback to generate the rule details url from the rule id |onComponentInitialized?|`() => void;` callback when component has initialized -|onConfigureCasesNavClick|`(ev: React.MouseEvent) => void;` callback for configure case nav click -|onRuleDetailsClick|`(ruleId: string, null, undefined) => void;` callback for rule details nav click |renderInvestigateInTimelineActionComponent?|: `(alertIds: string[]) => JSX.Element;` space to render `InvestigateInTimelineActionComponent` |renderTimelineDetailsPanel?|: `() => JSX.Element;` space to render `TimelineDetailsPanel` +|ruleDetailsNavigation|: `CasesNavigation<string | null | undefined, 'configurable'>` |showAlertDetails|: `(alertId: string, index: string) => void;` callback to show alert details |subCaseId?|: `string;` subcase id |useFetchAlertData|: `(alertIds: string[]) => [boolean, Record<string, Ecs>];` fetch alerts @@ -96,10 +91,10 @@ Arguments: |onSuccess|`(theCase: Case) => Promise<void>;` callback passing newly created case after pushCaseToExternalService is called UI component: - ![Create Component][create-img] + ![Create Component][create-img] ### `getConfigureCases` - Arguments: + Arguments: |Property|Description| |---|---| @@ -109,16 +104,14 @@ UI component: ![Configure Component][configure-img] ### `getRecentCases` -Arguments: +Arguments: |Property|Description| |---|---| -|allCasesHref|`string;` href of all cases page -|createCaseHref|`string;` -|getCaseDetailsHref|`(caseDetails: CaseDetailsHrefSchema) => string;` -|goToAllCases|`(ev: React.MouseEvent) => void;` callback for all cases link click -|onCaseDetailsNavClick|`(caseDetails: CaseDetailsHrefSchema) => void;` callback for case details nav click -|perPage|`number;` number of cases to show in widget +|allCasesNavigation|`CasesNavigation` route configuration for configure cases page +|caseDetailsNavigation|`CasesNavigation<CaseDetailsHrefSchema, 'configurable'>` route configuration to generate the case details url for the case details page +|createCaseNavigation|`CasesNavigation` +|maxCasesToShow|`number;` number of cases to show in widget UI component: ![Recent Cases Component][recent-cases-img] diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.tsx index dbdb2397c4bc7..2ed18b1ae8bf4 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns.tsx @@ -25,7 +25,7 @@ import { CaseStatuses, CaseType } from '../../../common'; import { getEmptyTagValue } from '../empty_value'; import { Case, SubCase } from '../../containers/types'; import { FormattedRelativePreferenceDate } from '../formatted_date'; -import { CaseDetailsHrefSchema, CaseDetailsLink } from '../links'; +import { CaseDetailsHrefSchema, CaseDetailsLink, CasesNavigation } from '../links'; import * as i18n from './translations'; import { Status } from '../status'; import { getSubCasesStatusCountsBadges, isSubCase } from './helpers'; @@ -53,17 +53,15 @@ const renderStringField = (field: string, dataTestSubj: string) => interface GetCasesColumn { actions: Array<DefaultItemIconButtonAction<Case>>; + caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; filterStatus: string; isModal: boolean; - getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; - onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; } export const getCasesColumns = ({ actions, + caseDetailsNavigation, filterStatus, isModal, - getCaseDetailsHref, - onCaseDetailsNavClick, }: GetCasesColumn): CasesColumns[] => { const columns = [ { @@ -72,11 +70,10 @@ export const getCasesColumns = ({ if (theCase.id != null && theCase.title != null) { const caseDetailsLinkComponent = !isModal ? ( <CaseDetailsLink + caseDetailsNavigation={caseDetailsNavigation} detailName={isSubCase(theCase) ? theCase.caseParentId : theCase.id} - getCaseDetailsHref={getCaseDetailsHref} - onCaseDetailsNavClick={onCaseDetailsNavClick} - title={theCase.title} subCaseId={isSubCase(theCase) ? theCase.id : undefined} + title={theCase.title} > {theCase.title} </CaseDetailsLink> diff --git a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx index b42d59daa07b1..f433974680d6c 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx @@ -40,12 +40,18 @@ jest.mock('../../common/lib/kibana'); describe('AllCases', () => { const defaultAllCasesProps = { - configureCasesHref: 'blah', - createCaseHref: 'bleh', - getCaseDetailsHref: jest.fn().mockReturnValue('testHref'), // string - onCaseDetailsNavClick: jest.fn(), - onConfigureCasesNavClick: jest.fn(), - onCreateCaseNavClick: jest.fn(), + configureCasesNavigation: { + href: 'blah', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: jest.fn().mockReturnValue('testHref'), // string + onClick: jest.fn(), + }, + createCaseNavigation: { + href: 'bleh', + onClick: jest.fn(), + }, }; const dispatchResetIsDeleted = jest.fn(); @@ -250,8 +256,10 @@ describe('AllCases', () => { actions: [], filterStatus: CaseStatuses.open, isModal: false, - getCaseDetailsHref: jest.fn(), - onCaseDetailsNavClick: jest.fn(), + caseDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, }).map((i, key) => i.name != null && checkIt(`${i.name}`, key)); }); }); @@ -344,8 +352,10 @@ describe('AllCases', () => { actions: [], filterStatus: CaseStatuses.open, isModal: true, - getCaseDetailsHref: jest.fn(), - onCaseDetailsNavClick: jest.fn(), + caseDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, }).map((i, key) => i.name != null && checkIt(`${i.name}`)); expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); }); @@ -727,8 +737,8 @@ describe('AllCases', () => { }); }); - it('should call onCreateCaseNavClick with no cases and modal=false', async () => { - const onCreateCaseNavClick = jest.fn(); + it('should call createCaseNavigation.onClick with no cases and modal=false', async () => { + const createCaseNavigation = { href: '', onClick: jest.fn() }; useGetCasesMock.mockReturnValue({ ...defaultGetCases, data: { @@ -742,7 +752,7 @@ describe('AllCases', () => { <TestProviders> <AllCases {...defaultAllCasesProps} - onCreateCaseNavClick={onCreateCaseNavClick} + createCaseNavigation={createCaseNavigation} userCanCrud={true} isModal={false} /> @@ -750,7 +760,7 @@ describe('AllCases', () => { ); wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); await waitFor(() => { - expect(onCreateCaseNavClick).toHaveBeenCalled(); + expect(createCaseNavigation.onClick).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.tsx b/x-pack/plugins/cases/public/components/all_cases/index.tsx index 89df7edf5ede2..36072f8fa7461 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.tsx @@ -49,7 +49,7 @@ import { getActionLicenseError } from '../use_push_to_service/helpers'; import { CaseCallOut } from '../callout'; import { ConfigureCaseButton } from '../configure_cases/button'; import { ERROR_PUSH_SERVICE_CALLOUT_TITLE } from '../use_push_to_service/translations'; -import { CaseDetailsHrefSchema, LinkButton } from '../links'; +import { CaseDetailsHrefSchema, CasesNavigation, LinkButton } from '../links'; import { Stats } from '../status'; import { SELECTABLE_MESSAGE_COLLECTIONS } from '../../common/translations'; import { getExpandedRowMap } from './expanded_row'; @@ -114,14 +114,11 @@ BasicTable.displayName = 'BasicTable'; export interface AllCasesProps { alertData?: Omit<CommentRequestAlertType, 'type'>; - configureCasesHref: string; - createCaseHref: string; + caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; + configureCasesNavigation: CasesNavigation; + createCaseNavigation: CasesNavigation; disabledStatuses?: CaseStatuses[]; - getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; isModal?: boolean; - onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; - onConfigureCasesNavClick?: (ev: React.MouseEvent) => void; - onCreateCaseNavClick?: (ev: React.MouseEvent) => void; onRowClick?: (theCase?: Case | SubCase) => void; userCanCrud: boolean; updateCase?: (newCase: Case) => void; @@ -130,14 +127,11 @@ export interface AllCasesProps { export const AllCases = React.memo<AllCasesProps>( ({ alertData, - configureCasesHref, - createCaseHref, + caseDetailsNavigation, + configureCasesNavigation, + createCaseNavigation, disabledStatuses, - getCaseDetailsHref, isModal = false, - onCaseDetailsNavClick, - onConfigureCasesNavClick, - onCreateCaseNavClick, onRowClick, userCanCrud, updateCase, @@ -303,6 +297,7 @@ export const AllCases = React.memo<AllCasesProps>( [dispatchUpdateCaseProperty, fetchCasesStatus] ); + const { onClick: onCreateCaseNavClick } = createCaseNavigation; const goToCreateCase = useCallback( (ev) => { ev.preventDefault(); @@ -360,7 +355,7 @@ export const AllCases = React.memo<AllCasesProps>( newFilterOptions.status && newFilterOptions.status === CaseStatuses['in-progress'] ) { - setQueryParams({ sortField: SortFieldCase.updatedAt }); + setQueryParams({ sortField: SortFieldCase.createdAt }); } setFilters(newFilterOptions); refreshCases(false); @@ -372,19 +367,11 @@ export const AllCases = React.memo<AllCasesProps>( () => getCasesColumns({ actions: userCanCrud ? actions : [], + caseDetailsNavigation, filterStatus: filterOptions.status, isModal, - getCaseDetailsHref, - onCaseDetailsNavClick, }), - [ - actions, - filterOptions.status, - getCaseDetailsHref, - isModal, - onCaseDetailsNavClick, - userCanCrud, - ] + [actions, caseDetailsNavigation, filterOptions.status, isModal, userCanCrud] ); const itemIdToExpandedRowMap = useMemo( @@ -496,8 +483,7 @@ export const AllCases = React.memo<AllCasesProps>( </FlexItemDivider> <EuiFlexItem grow={false}> <ConfigureCaseButton - configureCasesHref={configureCasesHref} - onConfigureCasesNavClick={onConfigureCasesNavClick} + configureCasesNavigation={configureCasesNavigation} label={i18n.CONFIGURE_CASES_BUTTON} isDisabled={!isEmpty(actionsErrors) || !userCanCrud} showToolTip={!isEmpty(actionsErrors)} @@ -509,8 +495,8 @@ export const AllCases = React.memo<AllCasesProps>( <LinkButton isDisabled={!userCanCrud} fill - onClick={onCreateCaseNavClick} - href={createCaseHref} + onClick={createCaseNavigation.onClick} + href={createCaseNavigation.href} iconType="plusInCircle" data-test-subj="createNewCaseBtn" > @@ -594,7 +580,7 @@ export const AllCases = React.memo<AllCasesProps>( fill size="s" onClick={goToCreateCase} - href={createCaseHref} + href={createCaseNavigation.href} iconType="plusInCircle" data-test-subj="cases-table-add-case" > diff --git a/x-pack/plugins/cases/public/components/case_view/index.test.tsx b/x-pack/plugins/cases/public/components/case_view/index.test.tsx index 533bd6bcc504a..08a8bcd2826df 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.test.tsx @@ -69,16 +69,24 @@ const alertsHit = [ ]; export const caseProps: CaseComponentProps = { - allCasesHref: 'all-cases-href', - backToAllCasesOnClick: jest.fn(), - caseDetailsHref: 'case-details-href', + allCasesNavigation: { + href: 'all-cases-href', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: 'case-details-href', + }, caseId: basicCase.id, - configureCasesHref: 'configure-cases-href', + configureCasesNavigation: { + href: 'configure-cases-href', + onClick: jest.fn(), + }, getCaseDetailHrefWithCommentId: jest.fn(), - getRuleDetailsHref: jest.fn(), onComponentInitialized: jest.fn(), - onConfigureCasesNavClick: jest.fn(), - onRuleDetailsClick: jest.fn(), + ruleDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, showAlertDetails: jest.fn(), useFetchAlertData: () => [ false, @@ -397,16 +405,24 @@ describe('CaseView ', () => { <Router history={mockHistory}> <CaseView {...{ - allCasesHref: 'all-cases-href', - backToAllCasesOnClick: jest.fn(), - caseDetailsHref: 'case-details-href', + allCasesNavigation: { + href: 'all-cases-href', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: 'case-details-href', + }, caseId: '1234', - configureCasesHref: 'configure-cases-href', + configureCasesNavigation: { + href: 'configure-cases-href', + onClick: jest.fn(), + }, getCaseDetailHrefWithCommentId: jest.fn(), - getRuleDetailsHref: jest.fn(), onComponentInitialized: jest.fn(), - onConfigureCasesNavClick: jest.fn(), - onRuleDetailsClick: jest.fn(), + ruleDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, showAlertDetails: jest.fn(), useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), userCanCrud: true, @@ -430,16 +446,24 @@ describe('CaseView ', () => { <Router history={mockHistory}> <CaseView {...{ - allCasesHref: 'all-cases-href', - backToAllCasesOnClick: jest.fn(), - caseDetailsHref: 'case-details-href', + allCasesNavigation: { + href: 'all-cases-href', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: 'case-details-href', + }, caseId: '1234', - configureCasesHref: 'configure-cases-href', + configureCasesNavigation: { + href: 'configure-cases-href', + onClick: jest.fn(), + }, getCaseDetailHrefWithCommentId: jest.fn(), - getRuleDetailsHref: jest.fn(), onComponentInitialized: jest.fn(), - onConfigureCasesNavClick: jest.fn(), - onRuleDetailsClick: jest.fn(), + ruleDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, showAlertDetails: jest.fn(), useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), userCanCrud: true, @@ -460,16 +484,24 @@ describe('CaseView ', () => { <Router history={mockHistory}> <CaseView {...{ - allCasesHref: 'all-cases-href', - backToAllCasesOnClick: jest.fn(), - caseDetailsHref: 'case-details-href', + allCasesNavigation: { + href: 'all-cases-href', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: 'case-details-href', + }, caseId: '1234', - configureCasesHref: 'configure-cases-href', + configureCasesNavigation: { + href: 'configure-cases-href', + onClick: jest.fn(), + }, getCaseDetailHrefWithCommentId: jest.fn(), - getRuleDetailsHref: jest.fn(), onComponentInitialized: jest.fn(), - onConfigureCasesNavClick: jest.fn(), - onRuleDetailsClick: jest.fn(), + ruleDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, showAlertDetails: jest.fn(), useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), userCanCrud: true, @@ -490,16 +522,24 @@ describe('CaseView ', () => { <Router history={mockHistory}> <CaseView {...{ - allCasesHref: 'all-cases-href', - backToAllCasesOnClick: jest.fn(), - caseDetailsHref: 'case-details-href', + allCasesNavigation: { + href: 'all-cases-href', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: 'case-details-href', + }, caseId: '1234', - configureCasesHref: 'configure-cases-href', + configureCasesNavigation: { + href: 'configure-cases-href', + onClick: jest.fn(), + }, getCaseDetailHrefWithCommentId: jest.fn(), - getRuleDetailsHref: jest.fn(), onComponentInitialized: jest.fn(), - onConfigureCasesNavClick: jest.fn(), - onRuleDetailsClick: jest.fn(), + ruleDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, showAlertDetails: jest.fn(), useFetchAlertData: jest.fn().mockReturnValue([false, alertsHit[0]]), userCanCrud: true, diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index dc1245bf2fb44..09ec273147420 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -40,24 +40,22 @@ import { import { StatusActionButton } from '../status/button'; import * as i18n from './translations'; import { Ecs } from '../../common/ecs_types'; +import { CasesNavigation } from '../links'; // TODO: All below imports depend on Timeline or SecuritySolution in some form or another // import { SpyRoute } from '../../../common/utils/route/spy_routes'; const gutterTimeline = '70px'; // seems to be a timeline reference from the original file export interface CaseViewProps { - allCasesHref: string; - backToAllCasesOnClick: (ev: MouseEvent) => void; - caseDetailsHref: string; + allCasesNavigation: CasesNavigation; + caseDetailsNavigation: CasesNavigation; caseId: string; - configureCasesHref: string; + configureCasesNavigation: CasesNavigation; getCaseDetailHrefWithCommentId: (commentId: string) => string; - getRuleDetailsHref: (ruleId: string | null | undefined) => string; onComponentInitialized?: () => void; - onConfigureCasesNavClick: (ev: React.MouseEvent) => void; - onRuleDetailsClick: (ruleId: string | null | undefined) => void; renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; renderTimelineDetailsPanel?: () => JSX.Element; + ruleDetailsNavigation: CasesNavigation<string | null | undefined, 'configurable'>; showAlertDetails: (alertId: string, index: string) => void; subCaseId?: string; useFetchAlertData: (alertIds: string[]) => [boolean, Record<string, Ecs>]; @@ -95,20 +93,17 @@ export interface CaseComponentProps extends CaseViewProps { export const CaseComponent = React.memo<CaseComponentProps>( ({ - allCasesHref, - backToAllCasesOnClick, + allCasesNavigation, caseData, - caseDetailsHref, + caseDetailsNavigation, caseId, - configureCasesHref, - fetchCase, + configureCasesNavigation, getCaseDetailHrefWithCommentId, - getRuleDetailsHref, + fetchCase, onComponentInitialized, - onConfigureCasesNavClick, - onRuleDetailsClick, renderInvestigateInTimelineActionComponent, renderTimelineDetailsPanel, + ruleDetailsNavigation, showAlertDetails, subCaseId, updateCase, @@ -251,7 +246,7 @@ export const CaseComponent = React.memo<CaseComponentProps>( ); const { pushButton, pushCallouts } = usePushToService({ - configureCasesHref, + configureCasesNavigation, connector: { ...caseData.connector, name: isEmpty(connectorName) ? caseData.connector.name : connectorName, @@ -260,7 +255,6 @@ export const CaseComponent = React.memo<CaseComponentProps>( caseId: caseData.id, caseStatus: caseData.status, connectors, - onConfigureCasesNavClick, updateCase: handleUpdateCase, userCanCrud, isValidConnector: isLoadingConnectors ? true : isValidConnector, @@ -312,9 +306,9 @@ export const CaseComponent = React.memo<CaseComponentProps>( const emailContent = useMemo( () => ({ subject: i18n.EMAIL_SUBJECT(caseData.title), - body: i18n.EMAIL_BODY(caseDetailsHref), + body: i18n.EMAIL_BODY(caseDetailsNavigation.href), }), - [caseDetailsHref, caseData.title] + [caseDetailsNavigation.href, caseData.title] ); useEffect(() => { @@ -325,12 +319,12 @@ export const CaseComponent = React.memo<CaseComponentProps>( const backOptions = useMemo( () => ({ - href: allCasesHref, + href: allCasesNavigation.href, text: i18n.BACK_TO_ALL, dataTestSubj: 'backToCases', - onClick: backToAllCasesOnClick, + onClick: allCasesNavigation.onClick, }), - [allCasesHref, backToAllCasesOnClick] + [allCasesNavigation] ); const onShowAlertDetails = useCallback( @@ -388,8 +382,8 @@ export const CaseComponent = React.memo<CaseComponentProps>( <> <UserActionTree getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} - getRuleDetailsHref={getRuleDetailsHref} - onRuleDetailsClick={onRuleDetailsClick} + getRuleDetailsHref={ruleDetailsNavigation.href} + onRuleDetailsClick={ruleDetailsNavigation.onClick} caseServices={caseServices} caseUserActions={caseUserActions} connectors={connectors} @@ -486,18 +480,15 @@ export const CaseComponent = React.memo<CaseComponentProps>( export const CaseView = React.memo( ({ - allCasesHref, - backToAllCasesOnClick, - caseDetailsHref, + allCasesNavigation, + caseDetailsNavigation, caseId, - configureCasesHref, + configureCasesNavigation, getCaseDetailHrefWithCommentId, - getRuleDetailsHref, onComponentInitialized, - onConfigureCasesNavClick, - onRuleDetailsClick, renderInvestigateInTimelineActionComponent, renderTimelineDetailsPanel, + ruleDetailsNavigation, showAlertDetails, subCaseId, useFetchAlertData, @@ -520,20 +511,17 @@ export const CaseView = React.memo( return ( data && ( <CaseComponent - allCasesHref={allCasesHref} - backToAllCasesOnClick={backToAllCasesOnClick} + allCasesNavigation={allCasesNavigation} caseData={data} - caseDetailsHref={caseDetailsHref} + caseDetailsNavigation={caseDetailsNavigation} caseId={caseId} - configureCasesHref={configureCasesHref} - fetchCase={fetchCase} + configureCasesNavigation={configureCasesNavigation} getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} - getRuleDetailsHref={getRuleDetailsHref} + fetchCase={fetchCase} onComponentInitialized={onComponentInitialized} - onConfigureCasesNavClick={onConfigureCasesNavClick} - onRuleDetailsClick={onRuleDetailsClick} renderInvestigateInTimelineActionComponent={renderInvestigateInTimelineActionComponent} renderTimelineDetailsPanel={renderTimelineDetailsPanel} + ruleDetailsNavigation={ruleDetailsNavigation} showAlertDetails={showAlertDetails} subCaseId={subCaseId} updateCase={updateCase} diff --git a/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx index 7ed6ece909a7a..a3f95e60dc2ae 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/button.test.tsx @@ -27,11 +27,13 @@ jest.mock('react-router-dom', () => { describe('Configuration button', () => { let wrapper: ReactWrapper; const props: ConfigureCaseButtonProps = { - configureCasesHref: 'testHref', + configureCasesNavigation: { + href: 'testHref', + onClick: jest.fn(), + }, isDisabled: false, label: 'My label', msgTooltip: <></>, - onConfigureCasesNavClick: jest.fn(), showToolTip: false, titleTooltip: '', }; diff --git a/x-pack/plugins/cases/public/components/configure_cases/button.tsx b/x-pack/plugins/cases/public/components/configure_cases/button.tsx index 0009400a7f389..1830380be3765 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/button.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/button.tsx @@ -7,32 +7,32 @@ import { EuiToolTip } from '@elastic/eui'; import React, { memo, useMemo } from 'react'; -import { LinkButton } from '../links'; +import { CasesNavigation, LinkButton } from '../links'; + +// TODO: Potentially move into links component? export interface ConfigureCaseButtonProps { - configureCasesHref: string; + configureCasesNavigation: CasesNavigation; isDisabled: boolean; label: string; msgTooltip: JSX.Element; - onConfigureCasesNavClick?: (ev: React.MouseEvent) => void; showToolTip: boolean; titleTooltip: string; } const ConfigureCaseButtonComponent: React.FC<ConfigureCaseButtonProps> = ({ - configureCasesHref, + configureCasesNavigation: { href, onClick }, isDisabled, label, msgTooltip, - onConfigureCasesNavClick, showToolTip, titleTooltip, }: ConfigureCaseButtonProps) => { const configureCaseButton = useMemo( () => ( <LinkButton - onClick={onConfigureCasesNavClick} - href={configureCasesHref} + onClick={onClick} + href={href} iconType="controlsHorizontal" isDisabled={isDisabled} aria-label={label} @@ -41,7 +41,7 @@ const ConfigureCaseButtonComponent: React.FC<ConfigureCaseButtonProps> = ({ {label} </LinkButton> ), - [label, isDisabled, onConfigureCasesNavClick, configureCasesHref] + [label, isDisabled, onClick, href] ); return showToolTip ? ( diff --git a/x-pack/plugins/cases/public/components/links/index.tsx b/x-pack/plugins/cases/public/components/links/index.tsx index d806a50e730c5..686e70478c1b7 100644 --- a/x-pack/plugins/cases/public/components/links/index.tsx +++ b/x-pack/plugins/cases/public/components/links/index.tsx @@ -16,6 +16,11 @@ import { import React, { useCallback } from 'react'; import * as i18n from './translations'; +export interface CasesNavigation<T = React.MouseEvent | MouseEvent, K = null> { + href: K extends 'configurable' ? (arg: T) => string : string; + onClick?: (arg: T) => void; +} + export const LinkButton: React.FC< PropsForButton<EuiButtonProps> | PropsForAnchor<EuiButtonProps> > = ({ children, ...props }) => <EuiButton {...props}>{children}</EuiButton>; @@ -33,23 +38,27 @@ export interface CaseDetailsHrefSchema { const CaseDetailsLinkComponent: React.FC<{ children?: React.ReactNode; detailName: string; - getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; - onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; subCaseId?: string; title?: string; -}> = ({ children, detailName, getCaseDetailsHref, onCaseDetailsNavClick, subCaseId, title }) => { +}> = ({ caseDetailsNavigation, children, detailName, subCaseId, title }) => { + const { href: getHref, onClick } = caseDetailsNavigation; const goToCaseDetails = useCallback( (ev) => { ev.preventDefault(); - onCaseDetailsNavClick({ detailName, subCaseId }); + if (onClick) { + onClick({ detailName, subCaseId }); + } }, - [detailName, onCaseDetailsNavClick, subCaseId] + [detailName, onClick, subCaseId] ); + const href = getHref({ detailName, subCaseId }); + return ( <LinkAnchor onClick={goToCaseDetails} - href={getCaseDetailsHref({ detailName, subCaseId })} + href={href} data-test-subj="case-details-link" aria-label={i18n.CASE_DETAILS_LINK_ARIA(title ?? detailName)} > diff --git a/x-pack/plugins/cases/public/components/recent_cases/index.tsx b/x-pack/plugins/cases/public/components/recent_cases/index.tsx index 0339b44bc3864..05aff25d0dbd8 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/index.tsx @@ -9,27 +9,23 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiText, EuiTitle } from import React, { useMemo, useState } from 'react'; import * as i18n from './translations'; -import { CaseDetailsHrefSchema, LinkAnchor } from '../links'; +import { CaseDetailsHrefSchema, CasesNavigation, LinkAnchor } from '../links'; import { RecentCasesFilters } from './filters'; import { RecentCasesComp } from './recent_cases'; import { FilterMode as RecentCasesFilterMode } from './types'; import { useCurrentUser } from '../../common/lib/kibana'; export interface RecentCasesProps { - allCasesHref: string; - createCaseHref: string; - getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; - goToAllCases: (ev: React.MouseEvent) => void; - onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + allCasesNavigation: CasesNavigation; + caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; + createCaseNavigation: CasesNavigation; maxCasesToShow: number; } const RecentCases = ({ - allCasesHref, - createCaseHref, - getCaseDetailsHref, - goToAllCases, - onCaseDetailsNavClick, + allCasesNavigation, + caseDetailsNavigation, + createCaseNavigation, maxCasesToShow, }: RecentCasesProps) => { const currentUser = useCurrentUser(); @@ -74,15 +70,14 @@ const RecentCases = ({ </> <EuiText color="subdued" size="s"> <RecentCasesComp - createCaseHref={createCaseHref} + caseDetailsNavigation={caseDetailsNavigation} + createCaseNavigation={createCaseNavigation} filterOptions={recentCasesFilterOptions} - getCaseDetailsHref={getCaseDetailsHref} - onCaseDetailsNavClick={onCaseDetailsNavClick} maxCasesToShow={maxCasesToShow} /> <EuiHorizontalRule margin="s" /> <EuiText size="xs"> - <LinkAnchor onClick={goToAllCases} href={allCasesHref}> + <LinkAnchor onClick={allCasesNavigation.onClick} href={allCasesNavigation.href}> {' '} {i18n.VIEW_ALL_CASES} </LinkAnchor> diff --git a/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx b/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx index 60f313b79f330..12935e75c064f 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx @@ -13,7 +13,7 @@ import styled from 'styled-components'; import { IconWithCount } from './icon_with_count'; import * as i18n from './translations'; import { useGetCases } from '../../containers/use_get_cases'; -import { CaseDetailsHrefSchema, CaseDetailsLink } from '../links'; +import { CaseDetailsHrefSchema, CaseDetailsLink, CasesNavigation } from '../links'; import { LoadingPlaceholders } from './loading_placeholders'; import { NoCases } from './no_cases'; import { isSubCase } from '../all_cases/helpers'; @@ -27,10 +27,9 @@ const MarkdownContainer = styled.div` `; export interface RecentCasesProps { - createCaseHref: string; filterOptions: Partial<FilterOptions>; - getCaseDetailsHref: (caseDetails: CaseDetailsHrefSchema) => string; - onCaseDetailsNavClick: (caseDetails: CaseDetailsHrefSchema) => void; + caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; + createCaseNavigation: CasesNavigation; maxCasesToShow: number; } const usePrevious = (value: Partial<FilterOptions>) => { @@ -41,10 +40,9 @@ const usePrevious = (value: Partial<FilterOptions>) => { return ref.current; }; export const RecentCasesComp = ({ - createCaseHref, + caseDetailsNavigation, + createCaseNavigation, filterOptions, - getCaseDetailsHref, - onCaseDetailsNavClick, maxCasesToShow, }: RecentCasesProps) => { const previousFilterOptions = usePrevious(filterOptions); @@ -64,7 +62,7 @@ export const RecentCasesComp = ({ return isLoadingCases ? ( <LoadingPlaceholders lines={2} placeholders={3} /> ) : !isLoadingCases && data.cases.length === 0 ? ( - <NoCases createCaseHref={createCaseHref} /> + <NoCases createCaseHref={createCaseNavigation.href} /> ) : ( <> {data.cases.map((c, i) => ( @@ -72,9 +70,8 @@ export const RecentCasesComp = ({ <EuiFlexItem grow={false}> <EuiText size="s"> <CaseDetailsLink + caseDetailsNavigation={caseDetailsNavigation} detailName={isSubCase(c) ? c.caseParentId : c.id} - getCaseDetailsHref={getCaseDetailsHref} - onCaseDetailsNavClick={onCaseDetailsNavClick} title={c.title} subCaseId={isSubCase(c) ? c.id : undefined} > diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx index a46a70b359419..d808234bcad36 100644 --- a/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_push_to_service/index.test.tsx @@ -64,10 +64,12 @@ describe('usePushToService', () => { caseId, caseServices, caseStatus: CaseStatuses.open, - configureCasesHref: 'href', + configureCasesNavigation: { + href: 'href', + onClick: jest.fn(), + }, connectors: connectorsMock, isValidConnector: true, - onConfigureCasesNavClick: jest.fn(), updateCase, userCanCrud: true, }; diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx index a50db393a116c..a4ce8e3d92522 100644 --- a/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/cases/public/components/use_push_to_service/index.tsx @@ -17,17 +17,16 @@ import { getLicenseError, getKibanaConfigError } from './helpers'; import * as i18n from './translations'; import { CaseConnector, ActionConnector, CaseStatuses } from '../../../common'; import { CaseServices } from '../../containers/use_get_case_user_actions'; -import { LinkAnchor } from '../links'; +import { CasesNavigation, LinkAnchor } from '../links'; import { ErrorMessage } from '../callout/types'; export interface UsePushToService { caseId: string; caseStatus: string; - configureCasesHref: string; + configureCasesNavigation: CasesNavigation; connector: CaseConnector; caseServices: CaseServices; connectors: ActionConnector[]; - onConfigureCasesNavClick: (ev: React.MouseEvent) => void; updateCase: (newCase: Case) => void; userCanCrud: boolean; isValidConnector: boolean; @@ -39,13 +38,12 @@ export interface ReturnUsePushToService { } export const usePushToService = ({ - configureCasesHref, + configureCasesNavigation: { onClick, href }, connector, caseId, caseServices, caseStatus, connectors, - onConfigureCasesNavClick, updateCase, userCanCrud, isValidConnector, @@ -84,11 +82,7 @@ export const usePushToService = ({ id="xpack.cases.caseView.pushToServiceDisableByNoConnectors" values={{ link: ( - <LinkAnchor - onClick={onConfigureCasesNavClick} - href={configureCasesHref} - target="_blank" - > + <LinkAnchor onClick={onClick} href={href} target="_blank"> {i18n.LINK_CONNECTOR_CONFIGURE} </LinkAnchor> ), diff --git a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx index ac5e66d51dc6c..3c22a5c220911 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx @@ -215,7 +215,7 @@ export const getAlertAttachment = ({ action: CaseUserActions; getCaseDetailHrefWithCommentId: (commentId: string) => string; getRuleDetailsHref: (ruleId: string | null | undefined) => string; - onRuleDetailsClick: (ruleId: string | null | undefined) => void; + onRuleDetailsClick?: (ruleId: string | null | undefined) => void; onShowAlertDetails: (alertId: string, index: string) => void; alertId: string; index: string; @@ -316,7 +316,7 @@ export const getGeneratedAlertsAttachment = ({ alertIds: string[]; getCaseDetailHrefWithCommentId: (commentId: string) => string; getRuleDetailsHref: (ruleId: string | null | undefined) => string; - onRuleDetailsClick: (ruleId: string | null | undefined) => void; + onRuleDetailsClick?: (ruleId: string | null | undefined) => void; renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; ruleId: string; ruleName: string; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx index 7a749d89c42b6..78111f662d4ed 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx @@ -60,7 +60,7 @@ export interface UserActionTreeProps { fetchUserActions: () => void; isLoadingDescription: boolean; isLoadingUserActions: boolean; - onRuleDetailsClick: (ruleId: string | null | undefined) => void; + onRuleDetailsClick?: (ruleId: string | null | undefined) => void; onUpdateField: ({ key, value, onSuccess, onError }: OnUpdateFields) => void; renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; updateCase: (newCase: Case) => void; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx index 8f090b52c469b..ee962f1407d74 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_alert_comment_event.tsx @@ -17,7 +17,7 @@ interface Props { alertId: string; commentType: CommentType; getRuleDetailsHref: (ruleId: string | null | undefined) => string; - onRuleDetailsClick: (ruleId: string | null | undefined) => void; + onRuleDetailsClick?: (ruleId: string | null | undefined) => void; ruleId?: string | null; ruleName?: string | null; alertsCount?: number; @@ -37,7 +37,7 @@ const AlertCommentEventComponent: React.FC<Props> = ({ const onLinkClick = useCallback( (ev: { preventDefault: () => void }) => { ev.preventDefault(); - onRuleDetailsClick(ruleId); + if (onRuleDetailsClick) onRuleDetailsClick(ruleId); }, [ruleId, onRuleDetailsClick] ); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 6d2edfd8de2e3..00209b7d29e98 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -66,20 +66,26 @@ export const AllCases = React.memo<AllCasesProps>( return casesUi.getAllCases({ alertData, - configureCasesHref: formatUrl(getConfigureCasesUrl()), - createCaseHref: formatUrl(getCreateCaseUrl()), - disabledStatuses, - getCaseDetailsHref: ({ detailName, subCaseId }: AllCasesNavProps) => { - return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + caseDetailsNavigation: { + href: ({ detailName, subCaseId }: AllCasesNavProps) => { + return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + }, + onClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), + }); + }, }, - isModal, - onCaseDetailsNavClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), - }); + configureCasesNavigation: { + href: formatUrl(getConfigureCasesUrl()), + onClick: goToCaseConfigure, }, - onConfigureCasesNavClick: goToCaseConfigure, - onCreateCaseNavClick: goToCreateCase, + createCaseNavigation: { + href: formatUrl(getCreateCaseUrl()), + onClick: goToCreateCase, + }, + disabledStatuses, + isModal, onRowClick, updateCase, userCanCrud, diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index 746aac46314c1..110420d55fd27 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -188,18 +188,26 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = }, [dispatch]); return casesUi.getCaseView({ - allCasesHref: formattedAllCasesLink, - backToAllCasesOnClick, - caseDetailsHref: caseDetailsLink, + allCasesNavigation: { + href: formattedAllCasesLink, + onClick: backToAllCasesOnClick, + }, + caseDetailsNavigation: { + href: caseDetailsLink, + }, caseId, - configureCasesHref, + configureCasesNavigation: { + href: configureCasesHref, + onClick: onConfigureCasesNavClick, + }, getCaseDetailHrefWithCommentId, - getRuleDetailsHref: getDetectionsRuleDetailsHref, onComponentInitialized, - onConfigureCasesNavClick, - onRuleDetailsClick: onDetectionsRuleDetailsClick, renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, renderTimelineDetailsPanel: TimelineDetailsPanel, + ruleDetailsNavigation: { + href: getDetectionsRuleDetailsHref, + onClick: onDetectionsRuleDetailsClick, + }, showAlertDetails, subCaseId, useFetchAlertData, diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx index 8b2bbdf417df5..6d01e2138bb95 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx @@ -35,16 +35,22 @@ const RecentCasesComponent = () => { ); return casesUi.getRecentCases({ - allCasesHref: formatUrl(getCaseUrl()), - createCaseHref: formatUrl(getCreateCaseUrl()), - getCaseDetailsHref: ({ detailName, subCaseId }: AllCasesNavProps) => { - return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + allCasesNavigation: { + href: formatUrl(getCaseUrl()), + onClick: goToCases, }, - goToAllCases: goToCases, - onCaseDetailsNavClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), - }); + caseDetailsNavigation: { + href: ({ detailName, subCaseId }: AllCasesNavProps) => { + return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); + }, + onClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), + }); + }, + }, + createCaseNavigation: { + href: formatUrl(getCreateCaseUrl()), }, maxCasesToShow: MAX_CASES_TO_SHOW, }); From 636524a2ed0ecef9f8023edd88c82dfd19614a4a Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Tue, 13 Apr 2021 14:11:01 -0400 Subject: [PATCH 40/52] [Security Solution][Cases] Re-enable timeline functionality (#96496) --- x-pack/plugins/cases/README.md | 24 +++++- .../public/components/__mock__/timeline.tsx | 33 +++++++++ .../components/add_comment/index.test.tsx | 61 ++++++++-------- .../public/components/add_comment/index.tsx | 14 +--- .../public/components/case_view/index.tsx | 57 ++++++++------- .../cases/public/components/create/index.tsx | 66 ++++++++++------- .../components/insert_timeline/index.test.tsx | 73 +++++++++++++++++++ .../components/insert_timeline/index.tsx | 24 ++++++ .../components/markdown_editor/editor.tsx | 51 ++++--------- .../components/markdown_editor/eui_form.tsx | 1 - .../components/markdown_editor/renderer.tsx | 5 +- .../components/markdown_editor/types.ts | 19 +++++ .../components/markdown_editor/use_plugins.ts | 40 ++++++++++ .../components/timeline_context/index.tsx | 65 +++++++++++++++++ .../timeline_context/use_timeline_context.ts | 13 ++++ .../components/user_action_tree/helpers.tsx | 1 - .../cases/components/case_view/index.tsx | 18 ++++- .../public/cases/components/create/index.tsx | 28 +++---- .../markdown_editor/plugins/index.ts | 30 ++++++-- 19 files changed, 461 insertions(+), 162 deletions(-) create mode 100644 x-pack/plugins/cases/public/components/__mock__/timeline.tsx create mode 100644 x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/insert_timeline/index.tsx create mode 100644 x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts create mode 100644 x-pack/plugins/cases/public/components/timeline_context/index.tsx create mode 100644 x-pack/plugins/cases/public/components/timeline_context/use_timeline_context.ts diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index f0c023b0e0c54..11aa79413fcc6 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -39,6 +39,16 @@ cases: CasesUiStart; cases.getCreateCase({ onCancel: handleSetIsCancel, onSuccess, + timelineIntegration?: { + plugins: { + parsingPlugin, + processingPluginRenderer, + uiPlugin, + }, + hooks: { + useInsertTimeline, + }, + }, }) ``` @@ -70,11 +80,16 @@ Arguments: |createCaseNavigation|`CasesNavigation` route configuration for create cases page |getCaseDetailHrefWithCommentId|`(commentId: string) => string;` callback to generate the case details url with a comment id reference from the case id and comment id |onComponentInitialized?|`() => void;` callback when component has initialized -|renderInvestigateInTimelineActionComponent?|: `(alertIds: string[]) => JSX.Element;` space to render `InvestigateInTimelineActionComponent` -|renderTimelineDetailsPanel?|: `() => JSX.Element;` space to render `TimelineDetailsPanel` |ruleDetailsNavigation|: `CasesNavigation<string | null | undefined, 'configurable'>` |showAlertDetails|: `(alertId: string, index: string) => void;` callback to show alert details |subCaseId?|: `string;` subcase id +|timelineIntegration?.editor_plugins|: Plugins needed for integrating timeline into markdown editor. +|timelineIntegration?.editor_plugins.parsingPlugin|: `Plugin;` +|timelineIntegration?.editor_plugins.processingPluginRenderer|: `React.FC<TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition }>` +|timelineIntegration?.editor_plugins.uiPlugin?|: `EuiMarkdownEditorUiPlugin` +|timelineIntegration?.hooks.useInsertTimeline|: `(value: string, onChange: (newValue: string) => void): UseInsertTimelineReturn` +|timelineIntegration?.ui?.renderInvestigateInTimelineActionComponent?|: `(alertIds: string[]) => JSX.Element;` space to render `InvestigateInTimelineActionComponent` +|timelineIntegration?.ui?renderTimelineDetailsPanel?|: `() => JSX.Element;` space to render `TimelineDetailsPanel` |useFetchAlertData|: `(alertIds: string[]) => [boolean, Record<string, Ecs>];` fetch alerts |userCanCrud|: `boolean;` user permissions to crud @@ -89,6 +104,11 @@ Arguments: |afterCaseCreated?|`(theCase: Case) => Promise<void>;` callback passing newly created case before pushCaseToExternalService is called |onCancel|`() => void;` callback when create case is canceled |onSuccess|`(theCase: Case) => Promise<void>;` callback passing newly created case after pushCaseToExternalService is called +|timelineIntegration?.editor_plugins|: Plugins needed for integrating timeline into markdown editor. +|timelineIntegration?.editor_plugins.parsingPlugin|: `Plugin;` +|timelineIntegration?.editor_plugins.processingPluginRenderer|: `React.FC<TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition }>` +|timelineIntegration?.editor_plugins.uiPlugin?|: `EuiMarkdownEditorUiPlugin` +|timelineIntegration?.hooks.useInsertTimeline|: `(value: string, onChange: (newValue: string) => void): UseInsertTimelineReturn` UI component: ![Create Component][create-img] diff --git a/x-pack/plugins/cases/public/components/__mock__/timeline.tsx b/x-pack/plugins/cases/public/components/__mock__/timeline.tsx new file mode 100644 index 0000000000000..0aeda0f08302d --- /dev/null +++ b/x-pack/plugins/cases/public/components/__mock__/timeline.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { useTimelineContext } from '../timeline_context/use_timeline_context'; +jest.mock('../timeline_context'); + +const mockTimelineComponent = (name: string) => <span data-test-subj={name}>{name}</span>; + +export const timelineIntegrationMock = { + editor_plugins: { + parsingPlugin: jest.fn(), + processingPluginRenderer: () => mockTimelineComponent('plugin-renderer'), + uiPlugin: { + name: 'mock-timeline', + button: { label: 'mock-timeline-button', iconType: 'mock-timeline-icon' }, + editor: () => mockTimelineComponent('plugin-timeline-editor'), + }, + }, + hooks: { + useInsertTimeline: jest.fn(), + }, + ui: { + renderInvestigateInTimelineActionComponent: () => + mockTimelineComponent('investigate-in-timeline'), + renderTimelineDetailsPanel: () => mockTimelineComponent('timeline-details-panel'), + }, +}; + +export const useTimelineContextMock = useTimelineContext as jest.Mock; diff --git a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx index 84883f6d000ac..3fdaf2937e0af 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx @@ -8,24 +8,20 @@ import React from 'react'; import { mount } from 'enzyme'; import { waitFor, act } from '@testing-library/react'; -// import { noop } from 'lodash/fp'; +import { noop } from 'lodash/fp'; import { TestProviders } from '../../common/mock'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; import { CommentRequest, CommentType } from '../../../common'; -// TODO: Timeline Integration -// import { useInsertTimeline } from '../use_insert_timeline'; import { usePostComment } from '../../containers/use_post_comment'; import { AddComment, AddCommentRefObject } from '.'; +import { CasesTimelineIntegrationProvider } from '../timeline_context'; +import { timelineIntegrationMock } from '../__mock__/timeline'; jest.mock('../../containers/use_post_comment'); -// TODO: Timeline Integration -// jest.mock('../use_insert_timeline'); const usePostCommentMock = usePostComment as jest.Mock; -// TODO: Timeline Integration -// const useInsertTimelineMock = useInsertTimeline as jest.Mock; const onCommentSaving = jest.fn(); const onCommentPosted = jest.fn(); const postComment = jest.fn(); @@ -150,27 +146,32 @@ describe('AddComment ', () => { ); }); - // TODO: Should re-enable the insert timeline action - // xit('it should insert a timeline', async () => { - // let attachTimeline = noop; - // useInsertTimelineMock.mockImplementation((comment, onTimelineAttached) => { - // attachTimeline = onTimelineAttached; - // }); - - // const wrapper = mount( - // <TestProviders> - // <Router history={mockHistory}> - // <AddComment {...{ ...addCommentProps }} /> - // </Router> - // </TestProviders> - // ); - - // act(() => { - // attachTimeline('[title](url)'); - // }); - - // await waitFor(() => { - // expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe('[title](url)'); - // }); - // }); + it('it should insert a timeline', async () => { + const useInsertTimelineMock = jest.fn(); + let attachTimeline = noop; + useInsertTimelineMock.mockImplementation((comment, onTimelineAttached) => { + attachTimeline = onTimelineAttached; + }); + + const mockTimelineIntegration = { ...timelineIntegrationMock }; + mockTimelineIntegration.hooks.useInsertTimeline = useInsertTimelineMock; + + const wrapper = mount( + <TestProviders> + <CasesTimelineIntegrationProvider timelineIntegration={mockTimelineIntegration}> + <Router history={mockHistory}> + <AddComment {...{ ...addCommentProps }} /> + </Router> + </CasesTimelineIntegrationProvider> + </TestProviders> + ); + + act(() => { + attachTimeline('[title](url)'); + }); + + await waitFor(() => { + expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe('[title](url)'); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/add_comment/index.tsx b/x-pack/plugins/cases/public/components/add_comment/index.tsx index 2895ebe1c2517..b4aadc85ad5a7 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.tsx @@ -17,10 +17,7 @@ import { Form, useForm, UseField, useFormData } from '../../common/shared_import import * as i18n from './translations'; import { schema, AddCommentFormSchema } from './schema'; - -// TODO: Handle use insert in timeline -// import { useInsertTimeline } from '../use_insert_timeline'; - +import { InsertTimeline } from '../insert_timeline'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; top: 50%; @@ -73,14 +70,6 @@ export const AddComment = React.memo( addQuote, })); - // TODO: Timeline integration - // const onTimelineAttached = useCallback( - // (newValue: string) => setFieldValue(fieldName, newValue), - // [setFieldValue] - // ); - - // useInsertTimeline(comment ?? '', onTimelineAttached); - const onSubmit = useCallback(async () => { const { isValid, data } = await submit(); if (isValid) { @@ -123,6 +112,7 @@ export const AddComment = React.memo( ), }} /> + <InsertTimeline fieldName="comment" /> </Form> </span> ); diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index 09ec273147420..1848915373a5f 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -40,21 +40,21 @@ import { import { StatusActionButton } from '../status/button'; import * as i18n from './translations'; import { Ecs } from '../../common/ecs_types'; +import { CasesTimelineIntegration, CasesTimelineIntegrationProvider } from '../timeline_context'; +import { useTimelineContext } from '../timeline_context/use_timeline_context'; import { CasesNavigation } from '../links'; // TODO: All below imports depend on Timeline or SecuritySolution in some form or another // import { SpyRoute } from '../../../common/utils/route/spy_routes'; const gutterTimeline = '70px'; // seems to be a timeline reference from the original file -export interface CaseViewProps { +export interface CaseViewComponentProps { allCasesNavigation: CasesNavigation; caseDetailsNavigation: CasesNavigation; caseId: string; configureCasesNavigation: CasesNavigation; getCaseDetailHrefWithCommentId: (commentId: string) => string; onComponentInitialized?: () => void; - renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; - renderTimelineDetailsPanel?: () => JSX.Element; ruleDetailsNavigation: CasesNavigation<string | null | undefined, 'configurable'>; showAlertDetails: (alertId: string, index: string) => void; subCaseId?: string; @@ -62,6 +62,9 @@ export interface CaseViewProps { userCanCrud: boolean; } +export interface CaseViewProps extends CaseViewComponentProps { + timelineIntegration?: CasesTimelineIntegration; +} export interface OnUpdateFields { key: keyof Case; value: Case[keyof Case]; @@ -85,7 +88,7 @@ const MyEuiHorizontalRule = styled(EuiHorizontalRule)` } `; -export interface CaseComponentProps extends CaseViewProps { +export interface CaseComponentProps extends CaseViewComponentProps { fetchCase: () => void; caseData: Case; updateCase: (newCase: Case) => void; @@ -101,8 +104,6 @@ export const CaseComponent = React.memo<CaseComponentProps>( getCaseDetailHrefWithCommentId, fetchCase, onComponentInitialized, - renderInvestigateInTimelineActionComponent, - renderTimelineDetailsPanel, ruleDetailsNavigation, showAlertDetails, subCaseId, @@ -112,6 +113,7 @@ export const CaseComponent = React.memo<CaseComponentProps>( }) => { const [initLoadingData, setInitLoadingData] = useState(true); const init = useRef(true); + const timelineUi = useTimelineContext()?.ui; const { caseUserActions, @@ -399,7 +401,7 @@ export const CaseComponent = React.memo<CaseComponentProps>( onShowAlertDetails={onShowAlertDetails} onUpdateField={onUpdateField} renderInvestigateInTimelineActionComponent={ - renderInvestigateInTimelineActionComponent + timelineUi?.renderInvestigateInTimelineActionComponent } updateCase={updateCase} useFetchAlertData={useFetchAlertData} @@ -470,7 +472,7 @@ export const CaseComponent = React.memo<CaseComponentProps>( </EuiFlexGroup> </MyWrapper> </WhitePageWrapper> - {renderTimelineDetailsPanel ? renderTimelineDetailsPanel() : null} + {timelineUi?.renderTimelineDetailsPanel ? timelineUi.renderTimelineDetailsPanel() : null} {/* TODO: Determine spyroute changes */} {/* <SpyRoute state={spyState} pageName={SecurityPageName.case} /> */} </> @@ -486,11 +488,10 @@ export const CaseView = React.memo( configureCasesNavigation, getCaseDetailHrefWithCommentId, onComponentInitialized, - renderInvestigateInTimelineActionComponent, - renderTimelineDetailsPanel, ruleDetailsNavigation, showAlertDetails, subCaseId, + timelineIntegration, useFetchAlertData, userCanCrud, }: CaseViewProps) => { @@ -510,24 +511,24 @@ export const CaseView = React.memo( return ( data && ( - <CaseComponent - allCasesNavigation={allCasesNavigation} - caseData={data} - caseDetailsNavigation={caseDetailsNavigation} - caseId={caseId} - configureCasesNavigation={configureCasesNavigation} - getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} - fetchCase={fetchCase} - onComponentInitialized={onComponentInitialized} - renderInvestigateInTimelineActionComponent={renderInvestigateInTimelineActionComponent} - renderTimelineDetailsPanel={renderTimelineDetailsPanel} - ruleDetailsNavigation={ruleDetailsNavigation} - showAlertDetails={showAlertDetails} - subCaseId={subCaseId} - updateCase={updateCase} - useFetchAlertData={useFetchAlertData} - userCanCrud={userCanCrud} - /> + <CasesTimelineIntegrationProvider timelineIntegration={timelineIntegration}> + <CaseComponent + allCasesNavigation={allCasesNavigation} + caseData={data} + caseDetailsNavigation={caseDetailsNavigation} + caseId={caseId} + configureCasesNavigation={configureCasesNavigation} + getCaseDetailHrefWithCommentId={getCaseDetailHrefWithCommentId} + fetchCase={fetchCase} + onComponentInitialized={onComponentInitialized} + ruleDetailsNavigation={ruleDetailsNavigation} + showAlertDetails={showAlertDetails} + subCaseId={subCaseId} + updateCase={updateCase} + useFetchAlertData={useFetchAlertData} + userCanCrud={userCanCrud} + /> + </CasesTimelineIntegrationProvider> ) ); } diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index 5fd3b9e19a140..5f4db25d72228 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -16,6 +16,9 @@ import { FormContext } from './form_context'; import { SubmitCaseButton } from './submit_button'; import { Case } from '../../containers/types'; import { CaseType } from '../../../common/api/cases'; +import { CasesTimelineIntegration, CasesTimelineIntegrationProvider } from '../timeline_context'; +import { fieldName as descriptionFieldName } from './description'; +import { InsertTimeline } from '../insert_timeline'; export const CommonUseField = getUseField({ component: Field }); @@ -31,6 +34,7 @@ export interface CreateCaseProps { hideConnectorServiceNowSir?: boolean; onCancel: () => void; onSuccess: (theCase: Case) => Promise<void>; + timelineIntegration?: CasesTimelineIntegration; withSteps?: boolean; } @@ -40,33 +44,45 @@ export const CreateCase = ({ hideConnectorServiceNowSir, onCancel, onSuccess, + timelineIntegration, withSteps, }: CreateCaseProps) => ( - <FormContext - afterCaseCreated={afterCaseCreated} - caseType={caseType} - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - onSuccess={onSuccess} - > - <CreateCaseForm hideConnectorServiceNowSir={hideConnectorServiceNowSir} withSteps={withSteps} /> - <Container> - <EuiFlexGroup alignItems="center" justifyContent="flexEnd" gutterSize="xs" responsive={false}> - <EuiFlexItem grow={false}> - <EuiButtonEmpty - data-test-subj="create-case-cancel" - iconType="cross" - onClick={onCancel} - size="s" - > - {i18n.CANCEL} - </EuiButtonEmpty> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <SubmitCaseButton /> - </EuiFlexItem> - </EuiFlexGroup> - </Container> - </FormContext> + <CasesTimelineIntegrationProvider timelineIntegration={timelineIntegration}> + <FormContext + afterCaseCreated={afterCaseCreated} + caseType={caseType} + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + onSuccess={onSuccess} + > + <CreateCaseForm + hideConnectorServiceNowSir={hideConnectorServiceNowSir} + withSteps={withSteps} + /> + <Container> + <EuiFlexGroup + alignItems="center" + justifyContent="flexEnd" + gutterSize="xs" + responsive={false} + > + <EuiFlexItem grow={false}> + <EuiButtonEmpty + data-test-subj="create-case-cancel" + iconType="cross" + onClick={onCancel} + size="s" + > + {i18n.CANCEL} + </EuiButtonEmpty> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <SubmitCaseButton /> + </EuiFlexItem> + </EuiFlexGroup> + </Container> + <InsertTimeline fieldName={descriptionFieldName} /> + </FormContext> + </CasesTimelineIntegrationProvider> ); // eslint-disable-next-line import/no-default-export diff --git a/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx b/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx new file mode 100644 index 0000000000000..84a19578c80de --- /dev/null +++ b/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { waitFor } from '@testing-library/react'; + +import { TestProviders } from '../../common/mock'; +import { Form, useForm, FormHook } from '../../common/shared_imports'; +import { CasesTimelineIntegrationProvider } from '../timeline_context'; +import { timelineIntegrationMock } from '../__mock__/timeline'; +import { getFormMock } from '../__mock__/form'; +import { InsertTimeline } from '.'; +import { useTimelineContext } from '../timeline_context/use_timeline_context'; + +jest.mock('../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'); +jest.mock('../timeline_context/use_timeline_context'); + +const useFormMock = useForm as jest.Mock; +const useTimelineContextMock = useTimelineContext as jest.Mock; + +describe('InsertTimeline ', () => { + const formHookMock = getFormMock({ comment: 'someValue' }); + const mockTimelineIntegration = { ...timelineIntegrationMock }; + const useInsertTimelineMock = jest.fn(); + let attachTimeline = jest.fn(); + beforeEach(() => { + jest.resetAllMocks(); + useFormMock.mockImplementation(() => ({ form: formHookMock })); + }); + + it('it should not call useInsertTimeline without timeline context', async () => { + mount( + <TestProviders> + <CasesTimelineIntegrationProvider> + <Form form={(formHookMock as unknown) as FormHook}> + <InsertTimeline fieldName="comment" /> + </Form> + </CasesTimelineIntegrationProvider> + </TestProviders> + ); + + await waitFor(() => { + expect(attachTimeline).not.toHaveBeenCalled(); + }); + }); + + it('should call useInsertTimeline with correct arguments', async () => { + useInsertTimelineMock.mockImplementation((comment, onTimelineAttached) => { + attachTimeline = onTimelineAttached; + }); + mockTimelineIntegration.hooks.useInsertTimeline = useInsertTimelineMock; + useTimelineContextMock.mockImplementation(() => ({ ...mockTimelineIntegration })); + + mount( + <TestProviders> + <CasesTimelineIntegrationProvider timelineIntegration={mockTimelineIntegration}> + <Form form={(formHookMock as unknown) as FormHook}> + <InsertTimeline fieldName="comment" /> + </Form> + </CasesTimelineIntegrationProvider> + </TestProviders> + ); + + await waitFor(() => { + expect(useInsertTimelineMock).toHaveBeenCalledWith('someValue', attachTimeline); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/insert_timeline/index.tsx b/x-pack/plugins/cases/public/components/insert_timeline/index.tsx new file mode 100644 index 0000000000000..473bf5485782f --- /dev/null +++ b/x-pack/plugins/cases/public/components/insert_timeline/index.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback } from 'react'; +import { useFormContext } from '../../common/shared_imports'; +import { useTimelineContext } from '../timeline_context/use_timeline_context'; + +type InsertFields = 'comment' | 'description'; + +export const InsertTimeline = ({ fieldName }: { fieldName: InsertFields }) => { + const { setFieldValue, getFormData } = useFormContext(); + const timelineHooks = useTimelineContext()?.hooks; + const formData = getFormData(); + const onTimelineAttached = useCallback((newValue: string) => setFieldValue(fieldName, newValue), [ + fieldName, + setFieldValue, + ]); + timelineHooks?.useInsertTimeline(formData[fieldName] ?? '', onTimelineAttached); + return null; +}; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx index 1d17c7d8a25d1..f80e66a8c3e9f 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx @@ -5,58 +5,37 @@ * 2.0. */ -import React, { memo, useEffect, useState, useCallback, FunctionComponent } from 'react'; -import { Plugin, PluggableList } from 'unified'; -// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 -// eslint-disable-next-line import/no-extraneous-dependencies -import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; -// eslint-disable-next-line import/no-extraneous-dependencies -import rehype2react from 'rehype-react'; -import { - EuiLinkAnchorProps, - EuiMarkdownEditor, - getDefaultEuiMarkdownParsingPlugins, - getDefaultEuiMarkdownProcessingPlugins, - getDefaultEuiMarkdownUiPlugins, -} from '@elastic/eui'; +import React, { memo, useEffect, useState, useCallback } from 'react'; +import { PluggableList } from 'unified'; +import { EuiMarkdownEditor } from '@elastic/eui'; +import { EuiMarkdownEditorUiPlugin } from '@elastic/eui'; +import { usePlugins } from './use_plugins'; interface MarkdownEditorProps { - onChange: (content: string) => void; - value: string; ariaLabel: string; - editorId?: string; dataTestSubj?: string; + editorId?: string; height?: number; + onChange: (content: string) => void; + parsingPlugins?: PluggableList; + processingPlugins?: PluggableList; + uiPlugins?: EuiMarkdownEditorUiPlugin[] | undefined; + value: string; } -// create plugin stuff here -export const { uiPlugins, parsingPlugins, processingPlugins } = { - uiPlugins: getDefaultEuiMarkdownUiPlugins(), - parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), - processingPlugins: getDefaultEuiMarkdownProcessingPlugins() as [ - [Plugin, Remark2RehypeOptions], - [ - typeof rehype2react, - Parameters<typeof rehype2react>[0] & { - components: { a: FunctionComponent<EuiLinkAnchorProps> }; - } - ], - ...PluggableList - ], -}; - const MarkdownEditorComponent: React.FC<MarkdownEditorProps> = ({ - onChange, - value, ariaLabel, - editorId, dataTestSubj, + editorId, height, + onChange, + value, }) => { const [markdownErrorMessages, setMarkdownErrorMessages] = useState([]); const onParse = useCallback((err, { messages }) => { setMarkdownErrorMessages(err ? [err] : messages); }, []); + const { parsingPlugins, processingPlugins, uiPlugins } = usePlugins(); useEffect( () => document.querySelector<HTMLElement>('textarea.euiMarkdownEditorTextArea')?.focus(), diff --git a/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx b/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx index 858e79ff65baf..5b0634302dfb6 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/eui_form.tsx @@ -9,7 +9,6 @@ import React from 'react'; import styled from 'styled-components'; import { EuiMarkdownEditorProps, EuiFormRow, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../common/shared_imports'; - import { MarkdownEditor } from './editor'; type MarkdownEditorFormProps = EuiMarkdownEditorProps & { diff --git a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx index c321c794c1e77..6a91dda97a892 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/renderer.tsx @@ -8,9 +8,8 @@ import React, { memo, useMemo } from 'react'; import { cloneDeep } from 'lodash/fp'; import { EuiMarkdownFormat, EuiLinkAnchorProps } from '@elastic/eui'; - -import { parsingPlugins, processingPlugins } from './'; import { MarkdownLink } from './markdown_link'; +import { usePlugins } from './use_plugins'; interface Props { children: string; @@ -18,11 +17,11 @@ interface Props { } const MarkdownRendererComponent: React.FC<Props> = ({ children, disableLinks }) => { + const { processingPlugins, parsingPlugins } = usePlugins(); const MarkdownLinkProcessingComponent: React.FC<EuiLinkAnchorProps> = useMemo( () => (props) => <MarkdownLink {...props} disableLinks={disableLinks} />, [disableLinks] ); - // Deep clone of the processing plugins to prevent affecting the markdown editor. const processingPluginList = cloneDeep(processingPlugins); // This line of code is TS-compatible and it will break if [1][1] change in the future. diff --git a/x-pack/plugins/cases/public/components/markdown_editor/types.ts b/x-pack/plugins/cases/public/components/markdown_editor/types.ts index 8a30a4a143f54..bb932f2fcfe22 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/types.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/types.ts @@ -5,7 +5,26 @@ * 2.0. */ +import { FunctionComponent } from 'react'; +import { Plugin, PluggableList } from 'unified'; +// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 +// eslint-disable-next-line import/no-extraneous-dependencies +import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; +// eslint-disable-next-line import/no-extraneous-dependencies +import rehype2react from 'rehype-react'; +import { EuiLinkAnchorProps } from '@elastic/eui'; export interface CursorPosition { start: number; end: number; } + +export type TemporaryProcessingPluginsType = [ + [Plugin, Remark2RehypeOptions], + [ + typeof rehype2react, + Parameters<typeof rehype2react>[0] & { + components: { a: FunctionComponent<EuiLinkAnchorProps>; timeline: unknown }; + } + ], + ...PluggableList +]; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts new file mode 100644 index 0000000000000..e98af8bca8bce --- /dev/null +++ b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + getDefaultEuiMarkdownParsingPlugins, + getDefaultEuiMarkdownProcessingPlugins, + getDefaultEuiMarkdownUiPlugins, +} from '@elastic/eui'; +import { useMemo } from 'react'; +import { useTimelineContext } from '../timeline_context/use_timeline_context'; +import { TemporaryProcessingPluginsType } from './types'; + +export const usePlugins = () => { + const timelinePlugins = useTimelineContext()?.editor_plugins; + + return useMemo(() => { + const uiPlugins = getDefaultEuiMarkdownUiPlugins(); + const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); + const processingPlugins = getDefaultEuiMarkdownProcessingPlugins() as TemporaryProcessingPluginsType; + + if (timelinePlugins) { + uiPlugins.push(timelinePlugins.uiPlugin); + + parsingPlugins.push(timelinePlugins.parsingPlugin); + + // This line of code is TS-compatible and it will break if [1][1] change in the future. + processingPlugins[1][1].components.timeline = timelinePlugins.processingPluginRenderer; + } + + return { + uiPlugins, + parsingPlugins, + processingPlugins, + }; + }, [timelinePlugins]); +}; diff --git a/x-pack/plugins/cases/public/components/timeline_context/index.tsx b/x-pack/plugins/cases/public/components/timeline_context/index.tsx new file mode 100644 index 0000000000000..727e4b64628d1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/timeline_context/index.tsx @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { EuiMarkdownEditorUiPlugin, EuiMarkdownAstNodePosition } from '@elastic/eui'; +import { Plugin } from 'unified'; +/** + * @description - manage the plugins, hooks, and ui components needed to enable timeline functionality within the cases plugin + * @TODO - To better encapsulate the timeline logic needed by cases, we are managing it in this top level context. + * This helps us avoid any prop drilling and makes it much easier later on to remove this logic when timeline becomes it's own plugin. + */ + +// TODO: copied from 'use_insert_timeline' in security_solution till timeline moved into it's own plugin. +interface UseInsertTimelineReturn { + handleOnTimelineChange: (title: string, id: string | null, graphEventId?: string) => void; +} + +interface TimelineProcessingPluginRendererProps { + id: string | null; + title: string; + graphEventId?: string; + type: 'timeline'; + [key: string]: string | null | undefined; +} + +export interface CasesTimelineIntegration { + editor_plugins: { + parsingPlugin: Plugin; + processingPluginRenderer: React.FC< + TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition } + >; + uiPlugin: EuiMarkdownEditorUiPlugin; + }; + hooks: { + useInsertTimeline: ( + value: string, + onChange: (newValue: string) => void + ) => UseInsertTimelineReturn; + }; + ui?: { + renderInvestigateInTimelineActionComponent?: (alertIds: string[]) => JSX.Element; + renderTimelineDetailsPanel?: () => JSX.Element; + }; +} + +// This context is available to all children of the stateful_event component where the provider is currently set +export const CasesTimelineIntegrationContext = React.createContext<CasesTimelineIntegration | null>( + null +); + +export const CasesTimelineIntegrationProvider: React.FC<{ + timelineIntegration?: CasesTimelineIntegration; +}> = ({ children, timelineIntegration }) => { + const [activeTimelineIntegration] = useState(timelineIntegration ?? null); + + return ( + <CasesTimelineIntegrationContext.Provider value={activeTimelineIntegration}> + {children} + </CasesTimelineIntegrationContext.Provider> + ); +}; diff --git a/x-pack/plugins/cases/public/components/timeline_context/use_timeline_context.ts b/x-pack/plugins/cases/public/components/timeline_context/use_timeline_context.ts new file mode 100644 index 0000000000000..d0f9417c20ab1 --- /dev/null +++ b/x-pack/plugins/cases/public/components/timeline_context/use_timeline_context.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useContext } from 'react'; +import { CasesTimelineIntegrationContext } from '.'; + +export const useTimelineContext = () => { + return useContext(CasesTimelineIntegrationContext); +}; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx index 3c22a5c220911..4de356940463c 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx @@ -8,7 +8,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, EuiCommentProps } from '@elastic/eui'; import React from 'react'; -// TODO: Timeline integration import { CaseFullExternalService, ActionConnector, diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index 110420d55fd27..b2fd8ee284751 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -33,6 +33,8 @@ import { DetailsPanel } from '../../../timelines/components/side_panel'; import { InvestigateInTimelineAction } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_timeline_action'; import { buildAlertsQuery, formatAlertToEcsSignal, useFetchAlertData } from './helpers'; import { SEND_ALERT_TO_TIMELINE } from './translations'; +import * as timelineMarkdownPlugin from '../../../common/components/markdown_editor/plugins/timeline'; +import { useInsertTimeline } from '../use_insert_timeline'; interface Props { caseId: string; @@ -202,14 +204,26 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = }, getCaseDetailHrefWithCommentId, onComponentInitialized, - renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, - renderTimelineDetailsPanel: TimelineDetailsPanel, ruleDetailsNavigation: { href: getDetectionsRuleDetailsHref, onClick: onDetectionsRuleDetailsClick, }, showAlertDetails, subCaseId, + timelineIntegration: { + editor_plugins: { + parsingPlugin: timelineMarkdownPlugin.parser, + processingPluginRenderer: timelineMarkdownPlugin.renderer, + uiPlugin: timelineMarkdownPlugin.plugin, + }, + hooks: { + useInsertTimeline, + }, + ui: { + renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, + renderTimelineDetailsPanel: TimelineDetailsPanel, + }, + }, useFetchAlertData, userCanCrud, }); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index f6f0a546f7593..4a1a64f5fcb41 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -10,23 +10,9 @@ import { EuiPanel } from '@elastic/eui'; import { useHistory } from 'react-router-dom'; import { getCaseDetailsUrl } from '../../../common/components/link_to'; - -// TO DO: Cases RAC UI, reimplement this shiz -// import { useInsertTimeline } from '../use_insert_timeline'; -// import { fieldName as descriptionFieldName } from './description'; import { useKibana } from '../../../common/lib/kibana'; - -// TO DO: Cases RAC UI, reimplement this shiz -// const InsertTimeline = () => { -// const { setFieldValue, getFormData } = useFormContext(); -// const formData = getFormData(); -// const onTimelineAttached = useCallback( -// (newValue: string) => setFieldValue(descriptionFieldName, newValue), -// [setFieldValue] -// ); -// useInsertTimeline(formData[descriptionFieldName] ?? '', onTimelineAttached); -// return null; -// }; +import * as timelineMarkdownPlugin from '../../../common/components/markdown_editor/plugins/timeline'; +import { useInsertTimeline } from '../use_insert_timeline'; export const Create = React.memo(() => { const { cases } = useKibana().services; @@ -47,6 +33,16 @@ export const Create = React.memo(() => { {cases.getCreateCase({ onCancel: handleSetIsCancel, onSuccess, + timelineIntegration: { + editor_plugins: { + parsingPlugin: timelineMarkdownPlugin.parser, + processingPluginRenderer: timelineMarkdownPlugin.renderer, + uiPlugin: timelineMarkdownPlugin.plugin, + }, + hooks: { + useInsertTimeline, + }, + }, })} </EuiPanel> ); diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts index bc0da84133e68..c744ace91f434 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts @@ -6,18 +6,36 @@ */ import { - EuiMarkdownEditorUiPlugin, + EuiLinkAnchorProps, getDefaultEuiMarkdownParsingPlugins, getDefaultEuiMarkdownProcessingPlugins, getDefaultEuiMarkdownUiPlugins, } from '@elastic/eui'; - +// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 +// eslint-disable-next-line import/no-extraneous-dependencies +import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; +import { FunctionComponent } from 'react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import rehype2react from 'rehype-react'; +import { Plugin, PluggableList } from 'unified'; import * as timelineMarkdownPlugin from './timeline'; -const uiPlugins: EuiMarkdownEditorUiPlugin[] = getDefaultEuiMarkdownUiPlugins(); + +export const { uiPlugins, parsingPlugins, processingPlugins } = { + uiPlugins: getDefaultEuiMarkdownUiPlugins(), + parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), + processingPlugins: getDefaultEuiMarkdownProcessingPlugins() as [ + [Plugin, Remark2RehypeOptions], + [ + typeof rehype2react, + Parameters<typeof rehype2react>[0] & { + components: { a: FunctionComponent<EuiLinkAnchorProps>; timeline: unknown }; + } + ], + ...PluggableList + ], +}; + uiPlugins.push(timelineMarkdownPlugin.plugin); -export { uiPlugins }; -export const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); -export const processingPlugins = getDefaultEuiMarkdownProcessingPlugins(); parsingPlugins.push(timelineMarkdownPlugin.parser); From 85244ef1d6c5747d0bd1d3eb9ea36f868866a9e8 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Wed, 14 Apr 2021 11:22:23 -0400 Subject: [PATCH 41/52] [Security Solution][Cases] Fix cases breadcrumbs (#97040) --- x-pack/plugins/cases/README.md | 35 +++---- .../public/components/case_view/index.tsx | 13 +-- .../cases/components/case_view/index.tsx | 98 +++++++++++-------- 3 files changed, 81 insertions(+), 65 deletions(-) diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index 11aa79413fcc6..814f70dec8864 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -80,18 +80,19 @@ Arguments: |createCaseNavigation|`CasesNavigation` route configuration for create cases page |getCaseDetailHrefWithCommentId|`(commentId: string) => string;` callback to generate the case details url with a comment id reference from the case id and comment id |onComponentInitialized?|`() => void;` callback when component has initialized -|ruleDetailsNavigation|: `CasesNavigation<string | null | undefined, 'configurable'>` -|showAlertDetails|: `(alertId: string, index: string) => void;` callback to show alert details -|subCaseId?|: `string;` subcase id -|timelineIntegration?.editor_plugins|: Plugins needed for integrating timeline into markdown editor. -|timelineIntegration?.editor_plugins.parsingPlugin|: `Plugin;` -|timelineIntegration?.editor_plugins.processingPluginRenderer|: `React.FC<TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition }>` -|timelineIntegration?.editor_plugins.uiPlugin?|: `EuiMarkdownEditorUiPlugin` -|timelineIntegration?.hooks.useInsertTimeline|: `(value: string, onChange: (newValue: string) => void): UseInsertTimelineReturn` -|timelineIntegration?.ui?.renderInvestigateInTimelineActionComponent?|: `(alertIds: string[]) => JSX.Element;` space to render `InvestigateInTimelineActionComponent` -|timelineIntegration?.ui?renderTimelineDetailsPanel?|: `() => JSX.Element;` space to render `TimelineDetailsPanel` -|useFetchAlertData|: `(alertIds: string[]) => [boolean, Record<string, Ecs>];` fetch alerts -|userCanCrud|: `boolean;` user permissions to crud +|onCaseDataSuccess?| `(data: Case) => void;` optional callback to handle case data in consuming application +|ruleDetailsNavigation| `CasesNavigation<string \| null \| undefined, 'configurable'>` +|showAlertDetails| `(alertId: string, index: string) => void;` callback to show alert details +|subCaseId?| `string;` subcase id +|timelineIntegration?.editor_plugins| Plugins needed for integrating timeline into markdown editor. +|timelineIntegration?.editor_plugins.parsingPlugin| `Plugin;` +|timelineIntegration?.editor_plugins.processingPluginRenderer| `React.FC<TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition }>` +|timelineIntegration?.editor_plugins.uiPlugin?| `EuiMarkdownEditorUiPlugin` +|timelineIntegration?.hooks.useInsertTimeline| `(value: string, onChange: (newValue: string) => void): UseInsertTimelineReturn` +|timelineIntegration?.ui?.renderInvestigateInTimelineActionComponent?| `(alertIds: string[]) => JSX.Element;` space to render `InvestigateInTimelineActionComponent` +|timelineIntegration?.ui?renderTimelineDetailsPanel?| `() => JSX.Element;` space to render `TimelineDetailsPanel` +|useFetchAlertData| `(alertIds: string[]) => [boolean, Record<string, Ecs>];` fetch alerts +|userCanCrud| `boolean;` user permissions to crud UI component: ![Case View Component][case-view-img] @@ -104,11 +105,11 @@ Arguments: |afterCaseCreated?|`(theCase: Case) => Promise<void>;` callback passing newly created case before pushCaseToExternalService is called |onCancel|`() => void;` callback when create case is canceled |onSuccess|`(theCase: Case) => Promise<void>;` callback passing newly created case after pushCaseToExternalService is called -|timelineIntegration?.editor_plugins|: Plugins needed for integrating timeline into markdown editor. -|timelineIntegration?.editor_plugins.parsingPlugin|: `Plugin;` -|timelineIntegration?.editor_plugins.processingPluginRenderer|: `React.FC<TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition }>` -|timelineIntegration?.editor_plugins.uiPlugin?|: `EuiMarkdownEditorUiPlugin` -|timelineIntegration?.hooks.useInsertTimeline|: `(value: string, onChange: (newValue: string) => void): UseInsertTimelineReturn` +|timelineIntegration?.editor_plugins| Plugins needed for integrating timeline into markdown editor. +|timelineIntegration?.editor_plugins.parsingPlugin| `Plugin;` +|timelineIntegration?.editor_plugins.processingPluginRenderer| `React.FC<TimelineProcessingPluginRendererProps & { position: EuiMarkdownAstNodePosition }>` +|timelineIntegration?.editor_plugins.uiPlugin?| `EuiMarkdownEditorUiPlugin` +|timelineIntegration?.hooks.useInsertTimeline| `(value: string, onChange: (newValue: string) => void): UseInsertTimelineReturn` UI component: ![Create Component][create-img] diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index 1848915373a5f..5ecd7656341c2 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -44,9 +44,6 @@ import { CasesTimelineIntegration, CasesTimelineIntegrationProvider } from '../t import { useTimelineContext } from '../timeline_context/use_timeline_context'; import { CasesNavigation } from '../links'; -// TODO: All below imports depend on Timeline or SecuritySolution in some form or another -// import { SpyRoute } from '../../../common/utils/route/spy_routes'; - const gutterTimeline = '70px'; // seems to be a timeline reference from the original file export interface CaseViewComponentProps { allCasesNavigation: CasesNavigation; @@ -63,6 +60,7 @@ export interface CaseViewComponentProps { } export interface CaseViewProps extends CaseViewComponentProps { + onCaseDataSuccess?: (data: Case) => void; timelineIntegration?: CasesTimelineIntegration; } export interface OnUpdateFields { @@ -302,9 +300,6 @@ export const CaseComponent = React.memo<CaseComponentProps>( fetchCase(); }, [caseData.connector.id, caseId, fetchCase, fetchCaseUserActions, subCaseId]); - // TODO: Handle spyRoute (pass as a prop or allow component to have children??) - // const spyState = useMemo(() => ({ caseTitle: caseData.title }), [caseData.title]); - const emailContent = useMemo( () => ({ subject: i18n.EMAIL_SUBJECT(caseData.title), @@ -473,8 +468,6 @@ export const CaseComponent = React.memo<CaseComponentProps>( </MyWrapper> </WhitePageWrapper> {timelineUi?.renderTimelineDetailsPanel ? timelineUi.renderTimelineDetailsPanel() : null} - {/* TODO: Determine spyroute changes */} - {/* <SpyRoute state={spyState} pageName={SecurityPageName.case} /> */} </> ); } @@ -487,6 +480,7 @@ export const CaseView = React.memo( caseId, configureCasesNavigation, getCaseDetailHrefWithCommentId, + onCaseDataSuccess, onComponentInitialized, ruleDetailsNavigation, showAlertDetails, @@ -508,6 +502,9 @@ export const CaseView = React.memo( </MyEuiFlexGroup> ); } + if (onCaseDataSuccess && data) { + onCaseDataSuccess(data); + } return ( data && ( diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index b2fd8ee284751..1e1d4019a66e9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; import { useDispatch } from 'react-redux'; import { useHistory } from 'react-router-dom'; import { SearchResponse } from 'elasticsearch'; @@ -33,8 +33,9 @@ import { DetailsPanel } from '../../../timelines/components/side_panel'; import { InvestigateInTimelineAction } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_timeline_action'; import { buildAlertsQuery, formatAlertToEcsSignal, useFetchAlertData } from './helpers'; import { SEND_ALERT_TO_TIMELINE } from './translations'; -import * as timelineMarkdownPlugin from '../../../common/components/markdown_editor/plugins/timeline'; import { useInsertTimeline } from '../use_insert_timeline'; +import { SpyRoute } from '../../../common/utils/route/spy_routes'; +import * as timelineMarkdownPlugin from '../../../common/components/markdown_editor/plugins/timeline'; interface Props { caseId: string; @@ -109,6 +110,17 @@ const InvestigateInTimelineActionComponent = (alertIds: string[]) => { }; export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { + const [caseTitle, setCaseTitle] = useState<string | null>(null); + + const onCaseDataSuccess = useCallback( + (data: Case) => { + if (!caseTitle || caseTitle !== data.title) { + setCaseTitle(data.title); + } + }, + [caseTitle] + ); + const { cases: casesUi, application: { navigateToApp }, @@ -189,44 +201,50 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = ); }, [dispatch]); - return casesUi.getCaseView({ - allCasesNavigation: { - href: formattedAllCasesLink, - onClick: backToAllCasesOnClick, - }, - caseDetailsNavigation: { - href: caseDetailsLink, - }, - caseId, - configureCasesNavigation: { - href: configureCasesHref, - onClick: onConfigureCasesNavClick, - }, - getCaseDetailHrefWithCommentId, - onComponentInitialized, - ruleDetailsNavigation: { - href: getDetectionsRuleDetailsHref, - onClick: onDetectionsRuleDetailsClick, - }, - showAlertDetails, - subCaseId, - timelineIntegration: { - editor_plugins: { - parsingPlugin: timelineMarkdownPlugin.parser, - processingPluginRenderer: timelineMarkdownPlugin.renderer, - uiPlugin: timelineMarkdownPlugin.plugin, - }, - hooks: { - useInsertTimeline, - }, - ui: { - renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, - renderTimelineDetailsPanel: TimelineDetailsPanel, - }, - }, - useFetchAlertData, - userCanCrud, - }); + return ( + <> + {casesUi.getCaseView({ + allCasesNavigation: { + href: formattedAllCasesLink, + onClick: backToAllCasesOnClick, + }, + caseDetailsNavigation: { + href: caseDetailsLink, + }, + caseId, + configureCasesNavigation: { + href: configureCasesHref, + onClick: onConfigureCasesNavClick, + }, + getCaseDetailHrefWithCommentId, + onCaseDataSuccess, + onComponentInitialized, + ruleDetailsNavigation: { + href: getDetectionsRuleDetailsHref, + onClick: onDetectionsRuleDetailsClick, + }, + showAlertDetails, + subCaseId, + timelineIntegration: { + editor_plugins: { + parsingPlugin: timelineMarkdownPlugin.parser, + processingPluginRenderer: timelineMarkdownPlugin.renderer, + uiPlugin: timelineMarkdownPlugin.plugin, + }, + hooks: { + useInsertTimeline, + }, + ui: { + renderInvestigateInTimelineActionComponent: InvestigateInTimelineActionComponent, + renderTimelineDetailsPanel: TimelineDetailsPanel, + }, + }, + useFetchAlertData, + userCanCrud, + })} + {caseTitle && <SpyRoute state={{ caseTitle }} pageName={SecurityPageName.case} />} + </> + ); }); CaseView.displayName = 'CaseView'; From fd7f81020ff6af9678f795632b9ff64855c4ae14 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 20 Apr 2021 13:43:42 -0600 Subject: [PATCH 42/52] fix bad push --- .../public/timelines/containers/api.ts | 389 ++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/api.ts diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts new file mode 100644 index 0000000000000..d1c798a27b6c4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -0,0 +1,389 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; +import { pipe } from 'fp-ts/lib/pipeable'; +// Prefer importing entire lodash library, e.g. import { get } from "lodash" +// eslint-disable-next-line no-restricted-imports +import isEmpty from 'lodash/isEmpty'; + +import { throwErrors } from '../../../../cases/common'; +import { + TimelineResponse, + TimelineResponseType, + TimelineStatus, + TimelineErrorResponseType, + TimelineErrorResponse, + ImportTimelineResultSchema, + importTimelineResultSchema, + ResponseFavoriteTimeline, + AllTimelinesResponse, + SingleTimelineResponse, + allTimelinesResponse, + responseFavoriteTimeline, + GetTimelinesArgs, + SingleTimelineResponseType, + TimelineType, +} from '../../../common/types/timeline'; +import { + TIMELINE_URL, + TIMELINE_DRAFT_URL, + TIMELINE_IMPORT_URL, + TIMELINE_EXPORT_URL, + TIMELINE_PREPACKAGED_URL, + TIMELINES_URL, + TIMELINE_FAVORITE_URL, +} from '../../../common/constants'; + +import { KibanaServices } from '../../common/lib/kibana'; +import { ExportSelectedData } from '../../common/components/generic_downloader'; +import { ToasterError } from '../../common/components/toasters'; +import { + ImportDataProps, + ImportDataResponse, +} from '../../detections/containers/detection_engine/rules'; +import { TimelineInput } from '../../../common/search_strategy'; + +interface RequestPostTimeline { + timeline: TimelineInput; + signal?: AbortSignal; +} + +interface RequestPatchTimeline<T = string> extends RequestPostTimeline { + timelineId: T; + version: T; +} + +type RequestPersistTimeline = RequestPostTimeline & Partial<RequestPatchTimeline<null | string>>; +const createToasterPlainError = (message: string) => new ToasterError([message]); +const decodeTimelineResponse = (respTimeline?: TimelineResponse | TimelineErrorResponse) => + pipe( + TimelineResponseType.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const decodeSingleTimelineResponse = (respTimeline?: SingleTimelineResponse) => + pipe( + SingleTimelineResponseType.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const decodeAllTimelinesResponse = (respTimeline: AllTimelinesResponse) => + pipe( + allTimelinesResponse.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const decodeTimelineErrorResponse = (respTimeline?: TimelineErrorResponse) => + pipe( + TimelineErrorResponseType.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const decodePrepackedTimelineResponse = (respTimeline?: ImportTimelineResultSchema) => + pipe( + importTimelineResultSchema.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const decodeResponseFavoriteTimeline = (respTimeline?: ResponseFavoriteTimeline) => + pipe( + responseFavoriteTimeline.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const postTimeline = async ({ + timeline, +}: RequestPostTimeline): Promise<TimelineResponse | TimelineErrorResponse> => { + let requestBody; + try { + requestBody = JSON.stringify({ timeline }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + + const response = await KibanaServices.get().http.post<TimelineResponse>(TIMELINE_URL, { + method: 'POST', + body: requestBody, + }); + + return decodeTimelineResponse(response); +}; + +const patchTimeline = async ({ + timelineId, + timeline, + version, +}: RequestPatchTimeline): Promise<TimelineResponse | TimelineErrorResponse> => { + let response = null; + let requestBody = null; + try { + requestBody = JSON.stringify({ timeline, timelineId, version }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + try { + response = await KibanaServices.get().http.patch<TimelineResponse>(TIMELINE_URL, { + method: 'PATCH', + body: requestBody, + }); + } catch (err) { + // For Future developer + // We are not rejecting our promise here because we had issue with our RXJS epic + // the issue we were not able to pass the right object to it so we did manage the error in the success + return Promise.resolve(decodeTimelineErrorResponse(err.body)); + } + return decodeTimelineResponse(response); +}; + +export const persistTimeline = async ({ + timelineId, + timeline, + version, +}: RequestPersistTimeline): Promise<TimelineResponse | TimelineErrorResponse> => { + try { + if (isEmpty(timelineId) && timeline.status === TimelineStatus.draft && timeline) { + const temp: TimelineResponse | TimelineErrorResponse = await cleanDraftTimeline({ + timelineType: timeline.timelineType!, + templateTimelineId: timeline.templateTimelineId ?? undefined, + templateTimelineVersion: timeline.templateTimelineVersion ?? undefined, + }); + + const draftTimeline = decodeTimelineResponse(temp); + const templateTimelineInfo = + timeline.timelineType! === TimelineType.template + ? { + templateTimelineId: + draftTimeline.data.persistTimeline.timeline.templateTimelineId ?? + timeline.templateTimelineId, + templateTimelineVersion: + draftTimeline.data.persistTimeline.timeline.templateTimelineVersion ?? + timeline.templateTimelineVersion, + } + : {}; + + return patchTimeline({ + timelineId: draftTimeline.data.persistTimeline.timeline.savedObjectId, + timeline: { + ...timeline, + ...templateTimelineInfo, + }, + version: draftTimeline.data.persistTimeline.timeline.version ?? '', + }); + } + + if (isEmpty(timelineId)) { + return postTimeline({ timeline }); + } + + return patchTimeline({ + timelineId: timelineId ?? '-1', + timeline, + version: version ?? '', + }); + } catch (err) { + if (err.status_code === 403 || err.body.status_code === 403) { + return Promise.resolve({ + data: { + persistTimeline: { + code: 403, + message: err.message || err.body.message, + timeline: { + ...timeline, + savedObjectId: '', + version: '', + }, + }, + }, + }); + } + return Promise.resolve(err); + } +}; + +export const importTimelines = async ({ + fileToImport, + signal, +}: ImportDataProps): Promise<ImportDataResponse> => { + const formData = new FormData(); + formData.append('file', fileToImport); + + return KibanaServices.get().http.fetch<ImportDataResponse>(`${TIMELINE_IMPORT_URL}`, { + method: 'POST', + headers: { 'Content-Type': undefined }, + body: formData, + signal, + }); +}; + +export const exportSelectedTimeline: ExportSelectedData = ({ + filename = `timelines_export.ndjson`, + ids = [], + signal, +}): Promise<Blob | TimelineErrorResponse> => { + let requestBody; + try { + requestBody = ids.length > 0 ? JSON.stringify({ ids }) : undefined; + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + return KibanaServices.get().http.fetch<Blob>(`${TIMELINE_EXPORT_URL}`, { + method: 'POST', + body: requestBody, + query: { + file_name: filename, + }, + signal, + }); +}; + +export const getDraftTimeline = async ({ + timelineType, +}: { + timelineType: TimelineType; +}): Promise<TimelineResponse> => { + const response = await KibanaServices.get().http.get<TimelineResponse>(TIMELINE_DRAFT_URL, { + query: { + timelineType, + }, + }); + + return decodeTimelineResponse(response); +}; + +export const cleanDraftTimeline = async ({ + timelineType, + templateTimelineId, + templateTimelineVersion, +}: { + timelineType: TimelineType; + templateTimelineId?: string; + templateTimelineVersion?: number; +}): Promise<TimelineResponse | TimelineErrorResponse> => { + let requestBody; + const templateTimelineInfo = + timelineType === TimelineType.template + ? { + templateTimelineId, + templateTimelineVersion, + } + : {}; + try { + requestBody = JSON.stringify({ + timelineType, + ...templateTimelineInfo, + }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.post<TimelineResponse>(TIMELINE_DRAFT_URL, { + body: requestBody, + }); + + return decodeTimelineResponse(response); +}; + +export const installPrepackedTimelines = async (): Promise<ImportTimelineResultSchema> => { + const response = await KibanaServices.get().http.post<ImportTimelineResultSchema>( + TIMELINE_PREPACKAGED_URL, + {} + ); + + return decodePrepackedTimelineResponse(response); +}; + +export const getTimeline = async (id: string) => { + const response = await KibanaServices.get().http.get<SingleTimelineResponse>(TIMELINE_URL, { + query: { + id, + }, + }); + + return decodeSingleTimelineResponse(response); +}; + +export const getTimelineTemplate = async (templateTimelineId: string) => { + const response = await KibanaServices.get().http.get<SingleTimelineResponse>(TIMELINE_URL, { + query: { + template_timeline_id: templateTimelineId, + }, + }); + + return decodeSingleTimelineResponse(response); +}; + +export const getAllTimelines = async (args: GetTimelinesArgs, abortSignal: AbortSignal) => { + const response = await KibanaServices.get().http.fetch<AllTimelinesResponse>(TIMELINES_URL, { + method: 'GET', + query: { + ...(args.onlyUserFavorite ? { only_user_favorite: args.onlyUserFavorite } : {}), + ...(args?.pageInfo?.pageSize ? { page_size: args.pageInfo.pageSize } : {}), + ...(args?.pageInfo?.pageIndex ? { page_index: args.pageInfo.pageIndex } : {}), + ...(args.search ? { search: args.search } : {}), + ...(args?.sort?.sortField ? { sort_field: args?.sort?.sortField } : {}), + ...(args?.sort?.sortOrder ? { sort_order: args?.sort?.sortOrder } : {}), + ...(args.status ? { status: args.status } : {}), + ...(args.timelineType ? { timeline_type: args.timelineType } : {}), + }, + signal: abortSignal, + }); + + return decodeAllTimelinesResponse(response); +}; + +export const persistFavorite = async ({ + timelineId, + templateTimelineId, + templateTimelineVersion, + timelineType, +}: { + timelineId?: string | null; + templateTimelineId?: string | null; + templateTimelineVersion?: number | null; + timelineType: TimelineType; +}) => { + let requestBody; + + try { + requestBody = JSON.stringify({ + timelineId, + templateTimelineId, + templateTimelineVersion, + timelineType, + }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + + const response = await KibanaServices.get().http.patch<ResponseFavoriteTimeline>( + TIMELINE_FAVORITE_URL, + { + method: 'PATCH', + body: requestBody, + } + ); + + return decodeResponseFavoriteTimeline(response); +}; + +export const deleteTimelinesByIds = async (savedObjectIds: string[]) => { + let requestBody; + + try { + requestBody = JSON.stringify({ + savedObjectIds, + }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.delete<boolean>(TIMELINE_URL, { + method: 'DELETE', + body: requestBody, + }); + return response; +}; From 89721fa3d2cc8ebebf0427da28fba63e6f171808 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Tue, 20 Apr 2021 15:10:57 -0600 Subject: [PATCH 43/52] fix type err --- x-pack/plugins/cases/common/ui/types.ts | 53 +++++++++++++++++ .../plugins/cases/public/common/ecs_types.ts | 58 ------------------- .../public/components/case_view/index.tsx | 2 +- .../user_action_tree/index.test.tsx | 2 +- .../components/user_action_tree/index.tsx | 2 +- .../cases/components/case_view/helpers.ts | 2 +- 6 files changed, 57 insertions(+), 62 deletions(-) delete mode 100644 x-pack/plugins/cases/public/common/ecs_types.ts diff --git a/x-pack/plugins/cases/common/ui/types.ts b/x-pack/plugins/cases/common/ui/types.ts index e6366e0492a09..43e3453500b17 100644 --- a/x-pack/plugins/cases/common/ui/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -174,3 +174,56 @@ export interface UpdateByKey { onSuccess?: () => void; onError?: () => void; } + +export interface RuleEcs { + id?: string[]; + rule_id?: string[]; + name?: string[]; + false_positives: string[]; + saved_id?: string[]; + timeline_id?: string[]; + timeline_title?: string[]; + max_signals?: number[]; + risk_score?: string[]; + output_index?: string[]; + description?: string[]; + from?: string[]; + immutable?: boolean[]; + index?: string[]; + interval?: string[]; + language?: string[]; + query?: string[]; + references?: string[]; + severity?: string[]; + tags?: string[]; + threat?: unknown; + threshold?: unknown; + type?: string[]; + size?: string[]; + to?: string[]; + enabled?: boolean[]; + filters?: unknown; + created_at?: string[]; + updated_at?: string[]; + created_by?: string[]; + updated_by?: string[]; + version?: string[]; + note?: string[]; + building_block_type?: string[]; +} + +export interface SignalEcs { + rule?: RuleEcs; + original_time?: string[]; + status?: string[]; + group?: { + id?: string[]; + }; + threshold_result?: unknown; +} + +export interface Ecs { + _id: string; + _index?: string; + signal?: SignalEcs; +} diff --git a/x-pack/plugins/cases/public/common/ecs_types.ts b/x-pack/plugins/cases/public/common/ecs_types.ts deleted file mode 100644 index a900e3ed219e1..0000000000000 --- a/x-pack/plugins/cases/public/common/ecs_types.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -export interface RuleEcs { - id?: string[]; - rule_id?: string[]; - name?: string[]; - false_positives: string[]; - saved_id?: string[]; - timeline_id?: string[]; - timeline_title?: string[]; - max_signals?: number[]; - risk_score?: string[]; - output_index?: string[]; - description?: string[]; - from?: string[]; - immutable?: boolean[]; - index?: string[]; - interval?: string[]; - language?: string[]; - query?: string[]; - references?: string[]; - severity?: string[]; - tags?: string[]; - threat?: unknown; - threshold?: unknown; - type?: string[]; - size?: string[]; - to?: string[]; - enabled?: boolean[]; - filters?: unknown; - created_at?: string[]; - updated_at?: string[]; - created_by?: string[]; - updated_by?: string[]; - version?: string[]; - note?: string[]; - building_block_type?: string[]; -} - -export interface SignalEcs { - rule?: RuleEcs; - original_time?: string[]; - status?: string[]; - group?: { - id?: string[]; - }; - threshold_result?: unknown; -} - -export interface Ecs { - _id: string; - _index?: string; - signal?: SignalEcs; -} diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index 5ecd7656341c2..557f736c513b9 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -39,7 +39,7 @@ import { } from '../configure_cases/utils'; import { StatusActionButton } from '../status/button'; import * as i18n from './translations'; -import { Ecs } from '../../common/ecs_types'; +import { Ecs } from '../../../common'; import { CasesTimelineIntegration, CasesTimelineIntegrationProvider } from '../timeline_context'; import { useTimelineContext } from '../timeline_context/use_timeline_context'; import { CasesNavigation } from '../links'; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx index 4cb03bd76f152..d905a97b1b4d2 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx @@ -15,7 +15,7 @@ import { useUpdateComment } from '../../containers/use_update_comment'; import { basicCase, basicPush, getUserAction } from '../../containers/mock'; import { UserActionTree } from '.'; import { TestProviders } from '../../common/mock'; -import { Ecs } from '../../common/ecs_types'; +import { Ecs } from '../../../common'; const fetchUserActions = jest.fn(); const onUpdateField = jest.fn(); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx index 78111f662d4ed..09b024fb2ca3d 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx @@ -49,7 +49,7 @@ import { UserActionTimestamp } from './user_action_timestamp'; import { UserActionUsername } from './user_action_username'; import { UserActionContentToolbar } from './user_action_content_toolbar'; import { getManualAlertIdsWithNoRuleId } from '../case_view/helpers'; -import { Ecs } from '../../common/ecs_types'; +import { Ecs } from '../../../common'; export interface UserActionTreeProps { getCaseDetailHrefWithCommentId: (commentId: string) => string; caseServices: CaseServices; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts index 2f35f5d9cd137..336cf20ffb3b8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/helpers.ts @@ -7,10 +7,10 @@ import { isObject, get, isString, isNumber } from 'lodash'; import { useMemo } from 'react'; -import { Ecs } from '../../../../common/ecs'; import { useSourcererScope } from '../../../common/containers/sourcerer'; import { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; +import { Ecs } from '../../../../../cases/common'; // TODO we need to allow -> docValueFields: [{ field: "@timestamp" }], export const buildAlertsQuery = (alertIds: string[]) => { From 54c97d4533bbdee682ecc261ffeba95102291574 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 21 Apr 2021 13:34:30 -0600 Subject: [PATCH 44/52] [Security Solution] [Cases] All Cases Refactor & getAllCasesSelectorModal introduced (#97149) --- x-pack/plugins/cases/README.md | 21 +- .../cases/images/all_cases_selector_modal.png | Bin 0 -> 387277 bytes .../cases/public/common/translations.ts | 3 + .../public/components/all_cases/actions.tsx | 2 - .../all_cases/all_cases_generic.tsx | 317 +++++++++ .../public/components/all_cases/columns.tsx | 141 +++- .../public/components/all_cases/count.tsx | 58 ++ .../components/all_cases/expanded_row.tsx | 4 +- .../public/components/all_cases/header.tsx | 66 ++ .../components/all_cases/index.test.tsx | 192 +++--- .../public/components/all_cases/index.tsx | 604 +----------------- .../components/all_cases/nav_buttons.tsx | 55 ++ .../all_cases/selector_modal/index.test.tsx | 83 +++ .../all_cases/selector_modal/index.tsx} | 56 +- .../public/components/all_cases/table.tsx | 148 +++++ .../components/all_cases/utility_bar.tsx | 173 +++++ .../components/case_action_bar/actions.tsx | 25 +- .../components/case_view/index.test.tsx | 5 + .../components/configure_cases/index.tsx | 18 +- .../cases/public/components/links/index.tsx | 4 +- .../create_case_modal.test.tsx | 72 +-- .../create_case_modal.tsx | 34 +- .../use_create_case_modal/index.test.tsx | 49 +- .../use_create_case_modal/index.tsx | 7 +- .../methods/get_all_cases_selector_modal.tsx | 19 + .../public/methods/index.ts} | 10 +- x-pack/plugins/cases/public/plugin.ts | 21 +- x-pack/plugins/cases/public/types.ts | 4 + .../cases/components/all_cases/index.tsx | 103 ++- .../cases/components/case_view/index.tsx | 5 + .../add_to_case_action.test.tsx | 63 +- .../timeline_actions/add_to_case_action.tsx | 62 +- .../all_cases_modal.test.tsx | 116 ---- .../use_all_cases_modal/index.test.tsx | 143 ----- .../components/use_all_cases_modal/index.tsx | 73 --- .../components/recent_cases/index.tsx | 5 + .../flyout/add_to_case_button/index.test.tsx | 61 +- .../flyout/add_to_case_button/index.tsx | 39 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 40 files changed, 1452 insertions(+), 1411 deletions(-) create mode 100644 x-pack/plugins/cases/images/all_cases_selector_modal.png create mode 100644 x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/count.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/header.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/nav_buttons.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/selector_modal/index.test.tsx rename x-pack/plugins/{security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx => cases/public/components/all_cases/selector_modal/index.tsx} (51%) create mode 100644 x-pack/plugins/cases/public/components/all_cases/table.tsx create mode 100644 x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx create mode 100644 x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx rename x-pack/plugins/{security_solution/public/cases/components/use_all_cases_modal/translations.ts => cases/public/methods/index.ts} (53%) delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index 814f70dec8864..61e1c83b63f51 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -54,20 +54,32 @@ cases: CasesUiStart; ##### Methods: ### `getAllCases` -Arguments: +Arguments: |Property|Description| |---|---| |caseDetailsNavigation|`CasesNavigation<CaseDetailsHrefSchema, 'configurable'>` route configuration to generate the case details url for the case details page |configureCasesNavigation|`CasesNavigation` route configuration for configure cases page |createCaseNavigation|`CasesNavigation` route configuration for create cases page +|userCanCrud|`boolean;` user permissions to crud + +UI component: +![All Cases Component][all-cases-img] + +### `getAllCasesSelectorModal` +Arguments: + +|Property|Description| +|---|---| +|alertData?|`Omit<CommentRequestAlertType, 'type'>;` alert data to post to case +|createCaseNavigation|`CasesNavigation` route configuration for create cases page |disabledStatuses?|`CaseStatuses[];` array of disabled statuses -|isModal?|`boolean;` is All Cases table a modal -|onRowClick?|`(theCase?: Case ! SubCase) => void;` callback for row click, passing case in row +|onRowClick|`(theCase?: Case ! SubCase) => void;` callback for row click, passing case in row +|updateCase?|`(theCase: Case ! SubCase) => void;` callback after case has been updated |userCanCrud|`boolean;` user permissions to crud UI component: - ![All Cases Component][all-cases-img] +![All Cases Selector Modal Component][all-cases-modal-img] ### `getCaseView` Arguments: @@ -248,6 +260,7 @@ For IBM Resilient connectors: [configure-img]: images/configure.png [create-img]: images/create.png [all-cases-img]: images/all_cases.png +[all-cases-modal-img]: images/all_cases_selector_modal.png [recent-cases-img]: images/recent_cases.png [case-view-img]: images/case_view.png diff --git a/x-pack/plugins/cases/images/all_cases_selector_modal.png b/x-pack/plugins/cases/images/all_cases_selector_modal.png new file mode 100644 index 0000000000000000000000000000000000000000..f24ad32509dd1fd2436ebe210eac7d3b65746395 GIT binary patch literal 387277 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≶?M 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%0D$&Je(PQ&rX6PW zP3Fh-CbAtZ>3kl4^T&@5oIpl$-27Bdi2N8W$NOd|)2{-(gO;Suc7=uqB_~o#mzke| z=%h0oA`uoUKGv$%T*2&qYb5{Ew!_`M!qDHeGJ~;!eoV&&`fhkRdG&%+d~=c4fbx}b zi%|_d2@mHBY$5bcBys(6+kvr5qZVr7b6Z|5?`7B=4L@3IUKYg>#ehHIQKR-c!z$Ri z3r0VIbQN+(2_HfAUO#EK{(<{}>UD>DR}$T|gI7{!o;OSy@A}qkYfdwA*slbJzs`d8 zQ(@F=T)nyi(96_^=QjIB3D~sZf(Two)mUC?NVViegIPisbNSisgl6bUbjYkDDZ_;y zdRs!X;)HyLgb@s4V#b@%HT#SmSmK3Yqf*215Wb%)IIc3$4Vx#`FT`tiS~f!Yc1FLj znoZJlG*GikCNV2cciY`$Yye7T*OfM2*gkOef|gJEuGG(vt$o93zSnL1I*UGe=qsH^ z*KUeHLy8zb6^@EZiRp8<k=n+E_OTmDV#_+GB?>@L>->JSCg{d`x;H`5>P@2i6z(5o z-5<r>6r?360w%3sGR1A7QEJblQSB@Vh1>la^vmT&^GRf2efS0aq9Byq&YYm7_8@V< zM%d87rkPz|W>c*OnJU>^R2K=E&PUC)BpM7^uU5lF1<}PqLbJn#boog9pWIN%q`z3j z^&yTf>{cM-_DSn}S>i;xHP&X|=NbY%m(ojFD6`+|lWCq4-kK)nbWQEho}PJQIy}aS z<Eqx<5XEoK^YTPGik;vc`q4_)`*`V~cjX)33{0p1@Q$H!q*(JsZEh5Ur>DfD`^ob( z<$KV#1t!mKr%uuwDnk?qIRI^rh30XfN2prvT)>^g=!RNPP7n$tuIAs|^V<Fy`09j- zXt$~BHGW~d`|fz~0k|TDNSz(doV6I8;;DK2JQv55dH+5W<`$TFd|NG;#BF{l;`6mP zzS9Q>qB*1SyWdCJx5VBTwY2sebruX1Xc{pI-dXi_2}KeMI4ga%@Alb~J=wWKpi`}r z2!?<5?AydE4|0r2q4NE5^<rZLH-^H26I`}s<{4g~Y!b&7ycyZf&QmjQQdBS2c*i=k z;v*LjUHEO5<nY@&Y~Euo)l&1v1<J*7gPG#uxTCb?){xTd&!L<M6|#*Vf6nd$GtP#$ z5Un0jGrY&V7Bo!Sw&qX5VA6!oW^a6K8G))T#%GCoGPKYA4~S_c5;{w%Q=_t_v|iLq z{)T%;{tfO8dFG0q+V`gEYmiYht$&en289L+iX?kn>ng$vD(z-Z+l$S2G@uEP@Y0|! zf!SkMVFFCHIdqQyIo*RC%uN9#GKzv^%Z*DXjbjC)yQ4QRR7>^iw`c2ZO7)KGLPKRP zch2|>J5Cc936x><Fg8rs%jJq4{AEyNLw>6`VQp|LUVSg&D+;wd9F9F+@=abjM%Wrd zlf9`?p*vAOMIr6@RV1I;&7sWAZqrWI70$6=y{hnq<4^}AJUBKMsB^tZXDKS67d2R6 z#<iT#;(q>>Mv*G-t4+>oS?AFzL%M*+oj?jP@o{^+Q;y*Rze29A6&zd_{SepQM6GnX zj(bF=H2&UTg5}?b@S?!U*;iuxux`$;$H413RGq-@uV6c|U)=K@A-AI_&__lYfF=B; z6ZUx=jXX&-Hi1f(Uo4I+2N}juaevkC=3)>J=(DCA@ym3Qmm(u)ikjnZ>^b#`V@~n( za~B4VfF|Z{V2~*uWXN`Oeb4S&fhSIRq4Wfz3qph(_7O-K)VBx50|(DZ0%%0^jQ|sW z=5{m+$&6%of)|t<V_B3V1@ZzF#AK0J`+wUJQs3T|vhvT{3GV7l0qbCuaI#F7MVA** zd7~6kY2AyJy|_wom(?E>=BRsC7osB}B!&e0i~6qTRPSiU(vEpTLPKADk1UYs^-W(l zX6AP|<1)K6#o=^~Y;9%GmPDgYwOQ#}fMbnzQ!U>RrR`ZNu^;&$mOMMRQXCxo6!BKF zSG6oc-ysc!vro_ddVPSDMz*G8SyMJ$oPc7GBJGbB)$dsL07ftfG7y^v5pC^Jo&_o( zQ4(jdu6hKBnr+7?b8T~eMVZH~XUJU#Kq944C4dXWY55oALa_m~Hc-6p_fG<v4ARYc z%2=OSg&`R?3G*@PyKGZ5xP~M)q}~MHuv~>aQbOjEy>`29p|WN{Yil5U^-B027yr*s zR7dq_&Xp^2weL!UK1&mZNzG-i;qh>Z-P4J8`N}9bcio~~Y`c86>)*@jl`>K@9O;w= zU*wae#@gg46(OG7Y{E|{@(BkK0L?q8FdrxDwbbfTGqaJse0Kuk1&F%(aDQXx1}@9> zM`!no*wTzZUWe0Kz_+{1b@0&HRv;#UR0HkBrR{?&dFwz85xu{^-|<a%msSW~wc!FD zTvt+W7mM7L51|`Bm;E*Qjdy^d=X3Qy;i?ZSI2ZVgn%C#U*>8CKaoK`5RJYIc`Ws3t zIvpP80L*fx`^&%VUhvqZAa2gWAkNr)8exMy&kaS+3359+^492(yLStemW9lMO9~+q z9xO=Ju7A%xD?bDS1pk*1m<!Q-!biYK5plb8l2)xWPfM6jL)=-9E=JR>wMx4jPP@t~ z>E#38tIXeO5>0Z;>(;lqN{zA8j{_ztq;X7WE;lExOjIj+FuW{VLj<zbW5eyQMu#2& zAbBjb$Ix7%7XCHW;H8xN*HMSt=?#*MLle-=uE7dL=#!(GLO_3dIsWCUg3DfwV6MR> zx(oPw3X<AV`X@I~FuX6Hqf@Jt&FWjo3HQL}`8-RfIczN*j9)NimkP>pu~KZdm41|4 z8o$o4gu*zj^~nai#Elb$+rCZU)+ZOBxRVi3I{<TH+j(<!n$B5n#*nzN<>kfmd;oE( z%Qpru(RwD199;_rN%k)h9E?hZA<x(RPtW(|Ye6z}Vpx>0Uu=B#<94R^rrB51$K}Tr zFYamcK@09HX~w7b3KlQ4KyL)51x(T&JnDl5Vm`a$)jqu2`&OQ?7<4hf@N)tIs1ZQJ zG5_VVO<PdM3RNJ8rfKrDJh7<b;K8>5j9bH%k|+EL7-QyhSyG9aadtS^6&v#H@(r#Q zI33e5EC##?x9%}z#fD*|ha4C@&B?Vn=615lT>Q;eXqms(87u198=zLI_&RiyPHR2x zh>d4A1$5SB!Wt^WMVGduVmVw0-1u~>@WNjiNX2nmF_TLt^_as+m0q7T?HLWEk`HSB zA>qPBD22`A)b$Kde3@7*W_@Q}d5Sa|-G8mNgcyw#@(eP&t~)4z(RTfmk<0A07xR8R z@t}{;=kBjPl~W9R<zq@(LlCtK>00}OY?}^CVJS)x%D<&X)S%jxEbg?;UFG@y`QzTb zSl0X3A3cMH+Z)beTY`0n?~To}vWhY)HB^-T26Rxp0E$;aSoV<m0BGca5PavNc5>rv zyU;A86AoO<0<tM|0(Hy*PR{4?Q^*$h=WG7mBM*RSC$!r%-cB(bXjaH=tzE{PlZN}L zFl=SNK2`g4B+o=#()5|*Ka>nQUsjq9L;?~cgB9meVy*p9rleX>!&|ft8NhW6(ixej zvU54zi9U0J^V>sJq_&D`)C62T$E#B_8m$~}lpxEQP4eZvWU1s)Bd(I0lBN>vh|%_I zurhK!JXs@YHk~LLyc(gID(G%*tRZC1*kUsm<r2X)rImZR_A?@Y-EH5fxUUY35gP)m z?h;fYNYhz%hwjt_3_Bk+O5!TU@G49}MAVIs!qfx20*+QC7*9&4((RkVP_|eMrCe{- zA?XWUJWFO%(*sVcL#@dwt5-KR$1&SFR-5^;jdBpt4Mz8WhSuM2{s{JvjQt;(4Mc^| z?Fj&~9ohJ3bTB=l-E@={x(_`K|L4#H)Fwj`SalE)@L30AmVNe~%C3m51pWIj$L<j> z+ud6Y-izrCUgwkR&p4w+IvXvib@a*ZM(Oh`HoBjtVv>F2e>}2?x8sYZqv3DXYQGU{ z3``^%GaJl)=r+NlE_0zC@5Ji3S*F6g-H|*Um-`1?di~2~lg%1~3@+gGva<`ai5R|G z`Z4DwsV6>_m8{<(%s=c1%0KI8S7tM1UCfE!lf))w3_XnnC;{>Zlr^+Nv@hay@WHr^ zBKYbj-9hFO-alq(|EN*FL!8L3BS3Y}fvM~k0jbzu`3<*UTcGgs&s|Szj}-^r8-U6W z-J>`1{)XNta0NE7B+s}YJB6JRIW}}3NN6emfiGuhkt*dzbL_UGqtf`uG<kGdIkCyq zCGEtS5A6RckncZ*rC$>e6*jzXr7n{m27Y$0+R<qgUJEzckeAcl74T`)sWZEcs&hTW z_F$t@s3Iyi8A>=@?$hhp`RPp`4*n5i)|gwRuF#VDOpx$;*DOFTiSs?fUGUFakgqT` z!r^fJZk5kQuT?JwhS4ZtgqXMku<!WbADbu?iQ)4Zi|5E^$?4ZR1IaRy3`-BAt!t~N zRy?ZXCr3ZRJc4Cg+UYWQXa-<bnhf~ZqYk0MIGy_}j_gVUC6x0GQ7+TPpDy-8|E-2< zI=Y_+0rx+EOgWK+G{OXpb>^<?z|)NU{WORF$EW$X#r?6VTjJx;$?e`Sweuxepr#WG zRdc|b!tb!~@M*|lgXfDLKO!k4H({vlHDVw0jzXQ|Xf(LSeimTxW4rWYdJ3iN{}kV# z+F`GOnOrKNv-rhiFd?t2ASS&g83qQlUcc}y$q3`$ZsViDJ!TgmZ~v)-2JL%=p$;|} z8=u2CsPexB?4(`||IdfazarT`L)w3RGcOLQJR4R2ajLx*#hS1~`%Ln#S*@#?1wPpH z5h+)mBdOwP36WoYYjN&{Ssyxe_{Of`mygnD5HC_UlKZ;E?(a0zKi4IHYR>#)2mEa{ zf?xN^AtjO)-M#<eW;~?Qh0yLJ;e18c|419}uV?%py&il4lBZ|GMRiM|4)*VJCG&qg zSN`k0{JXzsk=!@)0I}eApp5qN%%1{N#Xr8)raP?v4y^U(?f&-#`j4FZFMt2Ya35cc zL2cdlL~)L6zMH?9{Shz<{olATP-%4*#$y=ua<AgtuOGMEEN$&W8UFymfDk9{F>P&W zY9W8!8m>vA`5~xto7+_XhOe{sdTtPH6vjURk0904b8QGn?JpV8fB&niAEfS3g8%c@ zfrgTa`E^M|l49Y$`+ZAU_};B92f|@c8h!VFC_VnKF4+_f1M&v<@;_BN+CU}3`d{Db ze{`>c4FBcJmokRV&7j}c8-j0-KXq?{$jjzNSHII$1GtfjI)9oOcVY7Lzi5V_KL4^> z{`+6gQ6ZCtB8)$U)MqfAf>w*IpknxcOnLu*MWge=(3e1{XX!Nv0feA(tU$RB0p|a? z5CEEMEzO~m<7|9(<97MKW9{;PDAt1S4}#buhAhrausB8T7w6Ca;NpD${^J8g;{UbF z0b6L_JG%CbnXJ7bLm>tzq1=0|G7P*4C}DfWFb9=?oGLBNNpe7~%+{goO;Z*u#K@Bu z<v+NFpTUIIaQ`bmh1lv!Oa70w@qax$|J`321VNQ}lm}4Tzf-$@I9MTL9YiP?$YcLs z2th`~DV@mA{+BKWbc=s~$AB&LzjQ_ejs_JA4>IcI>KbBgupX3cv4(AO-2Dln@gF%s zprAzO|MxCuZM;-vwFH!JE!?-iZ;k&xud4rZA%R#9S7c~yr%{|O)kt3gH~#nLlXjyc zKC?05NI@!lo~F&K?)Rvgt=YN1ora6h`)Udv*+BYk#Py-_|NYVYy2%HI*?2TA(y&jl zBdlW@<BlO<)8O%4GEJBH5kh62d+p_fuCY`tFXdDHEe@+Q<!DZ}5J_LZIx(UM53!=c zy`46<ccQ+-?E}X@fkkj!Q~RM&RQ9e=LS_Rvoftl|kN&%q>)+>{juVg!`xX|09t$W^ zB_^w*lY@d+q0fTFz#PbqYEl|M`GEGclsxtIc;8|nld@K;7i$*lR~Hb*iu@T@o4-?4 z8HRQDU@pSwp2~JRMuF_cnh`r^dx9~<zy+X$#llEpw>yxKeG#B+t+Z^DL;jn^88F=b zkH-DK|Db=nC6FMCnwkD7+Zgc$Lj=%LWdki$)cb?c|Ns491W#jo#^GaTe}X^=Azw<X zAL;<mH`cT#WB2&irvj!F4v%8q*{$8(i9aI#6bi*p<n*ZO)1yNC0^b+qyPWowyA_+q zXYo>8I?)>z7<QcYH4<4n*@^a<J7vZNBgQkv8k^80Pt1NOzVQDjgz^%qgdYPHrqQLZ z<!oX3XSGujS$}wZUGkj=`<eS5$Jz8%4d&I|nDpM82M?i;u|^+3!QO=U5T(p{88bgg z#UTrPqD59Fo_i$JY}nwae$t6**<wG@@XCSSfh*Ceys<)Cr^jk1tzcs-&!pF^oZ(IL zOYKb<qK^+A{rSgB)hC>soGYVyw;|JZXAI6Lb%#FB>rW@{ulX8s;rkz0nvkpafBDzd z^Ml%G&#^vx4!9mvZHAH0d+(IE8SJX>+H)QmdziJf$1F{Xs11!Njm1qFYkl_AZXQPY z*MIl>-Fs%ZeCLf2>zg30Fd%wzT<!MR(@m7>uOG2R>?2XiofR_Kaji^H=4*v7p2f<N z`)`^V`N0O*!&l;IhMNAaQDM=W*gYd<pt)0IHjZVZer0HKdAX@-qqZX+`cfi>^Dp-d zc?5y1pDaAqYOOmG`J|^$7mn5@UTfQk2Na-?N&Nc$=`YXdnfSxcp0^$Rp}+R{S>hha zBA|{!iQ}S?1+H>+ybF2#kj*rDXUb;Hx^gI1>B<C`wH<GacQUS_p=NYi@d_0<duIm! z<^O}+Uz+6nu+W;XH}u_ZY4X>+!WsqohGSzD&;ZOJ5@ny9h1tdY$D{xMc>B(%rn;?b zMHEmG1Qn%5rHJ${(oqDZsfdV_fb<f2Z;_%{0Rid7LJ<%`O{fW=f^-C_p|{XG1PBS= z3Fsr1``+hy?|r{9{DFfpIA`y@_FQewb%=ZQhFvzKdFvxN&4%8)D;l75Ir#|DpfOyP zX7Kgx$Ll!#)5n*SQdn6TEfzpaZXCHdF6)V7!LMnOQe=`sf7yO8ar;jl-M#(wetG%! z!u=9i9sv}Eh9%bhF%pp_@r|Y3V05;?SmElI_T`nff-!h^B*-v|-}##f{W$%T5E7Kn zw3tJmxY;#1Ik};B3L5rvoj-n0{OMuY9y$4~vuBjXU0>6y0tb+mphJDGrJul)8P!f2 zG_?1vep>=_iPZ;%6s>IAs#tic87%ze%i`XyE1(vVF{!4urfq}p`MU-I0?CJjApSD= z?YDUpM0|<7Z!h8d?f}J1OO;U-IT$#5PvGqNcQ*eYo;^7=>j=}&t9`>tJm36X=Ub9* zAF^^<>0|>oD1+IM#HN!MjTmbjwMi9%t#*i7KNHXL&KL3acFruyTxC-_$*#h*+g^4q zEeQBn-p|+l@>Sw#T6{mvaQ^^y#HGLPQ9Zay7vEFVGvhSYLFj(?T%fuj7@h)yWr-l# zkfanJ0@BX@{O5?KLQ3IIw)41eOY%KO0bEuY9=`w|y7Vu{9yx^AsmQAR^^pI~Wd+HG zgt-24G@-<!Y29rfu}jG!TVfq51Lv6e9n=dDsnxUHb~mz3RvX+}SC^+>=H}i+NTA6t z-z^8`x@;6V7NIBVVfX?{2BRP=7KkbstY>AD;Y~sFkU~T8=Z6tjMozPM<man#g9fBD z4!sNDBJZuYoYZX~LkKs!lw5ltAI+7evf*^asQV1?y4B2`CuRIspTtd06T>100Kcp5 z3OVgI@QeI2;J**-U*FF*1G+{8dG)8eKt3~*Qcy~Yl;Z7rw|(1L)pAO-39fI)MB4s) zCSn=Fe<I_BfYCv6VCM>eor~Gtxw8NI&h>%}ft?E?-m4DaURiA4E9`&$UI9+Z)M7Y+ znF!K408U)k#);Vf3!KQy&)J5f|J%n@c6Z;|L%hSbfWsZyak!2D%;ADS4mBoPb(0<X zh-0u#!~LwgqYwZ`KHMQf)8H;YFCrpxkH8yLM0m)6HGL^fer&>aE8@0_6^Y`){TndL z?Acr?OOmSq{KFvXP5PW%T+StV&t;SLZzIgdfB1I40-J0&aN{=;Psqum4z-ydyey)0 zhv8|LF7tnQ=YEYte!-9~kYRRy&N?+nu2K@^TH@k-RmU^d$z?Va_{^Kxh-Fm}6W6Ct z!zM!kj|F|aZd_>;zpLI-{8m-8L!=W8%ghSTy-J%WKlpG)P@p2FSX8?hDK~kySTYsO zb)2@UM%yv9_H`?VTTo!+^2GwmskGO!jy*Hm(V;WrpQFQHcV!RBFE2a+ys$h!@U}?T z=c=l?j%GTyVXyL?-l#-Nif1@J`xxfx<WdunNtv6M`L<)`r5g8(≧IoQ>A9t(54M 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index 18fe6ee199e7c..834bd1292ccdd 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -254,3 +254,6 @@ export const SELECTABLE_MESSAGE_COLLECTIONS = i18n.translate( defaultMessage: 'Cases with sub-cases cannot be selected', } ); +export const SELECT_CASE_TITLE = i18n.translate('xpack.cases.common.allCases.caseModal.title', { + defaultMessage: 'Select case', +}); diff --git a/x-pack/plugins/cases/public/components/all_cases/actions.tsx b/x-pack/plugins/cases/public/components/all_cases/actions.tsx index adcdcb4e32ec0..8742b8fea23a4 100644 --- a/x-pack/plugins/cases/public/components/all_cases/actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/actions.tsx @@ -16,13 +16,11 @@ import * as i18n from './translations'; import { isIndividual } from './helpers'; interface GetActions { - caseStatus: string; dispatchUpdate: Dispatch<Omit<UpdateCase, 'refetchCasesStatus'>>; deleteCaseOnClick: (deleteCase: Case) => void; } export const getActions = ({ - caseStatus, dispatchUpdate, deleteCaseOnClick, }: GetActions): Array<DefaultItemIconButtonAction<Case>> => { diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx new file mode 100644 index 0000000000000..ca67bfb4697be --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx @@ -0,0 +1,317 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useMemo, useRef, useState } from 'react'; +import { EuiProgress } from '@elastic/eui'; +import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; +import { isEmpty, memoize } from 'lodash/fp'; +import styled, { css } from 'styled-components'; +import classnames from 'classnames'; + +import { + Case, + CaseStatuses, + CaseType, + CommentRequestAlertType, + CommentType, + FilterOptions, + SortFieldCase, + SubCase, +} from '../../../common'; +import { SELECTABLE_MESSAGE_COLLECTIONS } from '../../common/translations'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { useGetCases } from '../../containers/use_get_cases'; +import { usePostComment } from '../../containers/use_post_comment'; +import { CaseCallOut } from '../callout'; +import { CaseDetailsHrefSchema, CasesNavigation } from '../links'; +import { Panel } from '../panel'; +import { getActionLicenseError } from '../use_push_to_service/helpers'; +import { ERROR_PUSH_SERVICE_CALLOUT_TITLE } from '../use_push_to_service/translations'; +import { useCasesColumns } from './columns'; +import { getExpandedRowMap } from './expanded_row'; +import { CasesTableHeader } from './header'; +import { CasesTableFilters } from './table_filters'; +import { EuiBasicTableOnChange } from './types'; + +import { CasesTable } from './table'; +const ProgressLoader = styled(EuiProgress)` + ${({ $isShow }: { $isShow: boolean }) => + $isShow + ? css` + top: 2px; + border-radius: ${({ theme }) => theme.eui.euiBorderRadius}; + z-index: ${({ theme }) => theme.eui.euiZHeader}; + ` + : ` + display: none; + `} +`; + +const getSortField = (field: string): SortFieldCase => + field === SortFieldCase.closedAt ? SortFieldCase.closedAt : SortFieldCase.createdAt; + +interface AllCasesGenericProps { + alertData?: Omit<CommentRequestAlertType, 'type'>; + caseDetailsNavigation?: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; // if not passed, case name is not displayed as a link (Formerly dependant on isSelectorView) + configureCasesNavigation?: CasesNavigation; // if not passed, header with nav is not displayed (Formerly dependant on isSelectorView) + createCaseNavigation: CasesNavigation; + disabledStatuses?: CaseStatuses[]; + isSelectorView?: boolean; + onRowClick?: (theCase?: Case | SubCase) => void; + updateCase?: (newCase: Case) => void; + userCanCrud: boolean; +} + +export const AllCasesGeneric = React.memo<AllCasesGenericProps>( + ({ + alertData, + caseDetailsNavigation, + configureCasesNavigation, + createCaseNavigation, + disabledStatuses, + isSelectorView, + onRowClick, + updateCase, + userCanCrud, + }) => { + const { actionLicense } = useGetActionLicense(); + const { + data, + filterOptions, + loading, + queryParams, + selectedCases, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + } = useGetCases(); + // Post Comment to Case + const { postComment, isLoading: isCommentUpdating } = usePostComment(); + + const sorting = useMemo( + () => ({ + sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, + }), + [queryParams.sortField, queryParams.sortOrder] + ); + + const filterRefetch = useRef<() => void>(); + const setFilterRefetch = useCallback( + (refetchFilter: () => void) => { + filterRefetch.current = refetchFilter; + }, + [filterRefetch] + ); + const [refresh, doRefresh] = useState<number>(0); + const [isLoading, handleIsLoading] = useState<boolean>(false); + const refreshCases = useCallback( + (dataRefresh = true) => { + if (dataRefresh) refetchCases(); + doRefresh((prev) => prev + 1); + setSelectedCases([]); + if (filterRefetch.current != null) { + filterRefetch.current(); + } + }, + [filterRefetch, refetchCases, setSelectedCases] + ); + + const { onClick: onCreateCaseNavClick } = createCaseNavigation; + const goToCreateCase = useCallback( + (ev) => { + ev.preventDefault(); + if (isSelectorView && onRowClick != null) { + onRowClick(); + } else if (onCreateCaseNavClick) { + onCreateCaseNavClick(ev); + } + }, + [isSelectorView, onCreateCaseNavClick, onRowClick] + ); + const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); + + const tableOnChangeCallback = useCallback( + ({ page, sort }: EuiBasicTableOnChange) => { + let newQueryParams = queryParams; + if (sort) { + newQueryParams = { + ...newQueryParams, + sortField: getSortField(sort.field), + sortOrder: sort.direction, + }; + } + if (page) { + newQueryParams = { + ...newQueryParams, + page: page.index + 1, + perPage: page.size, + }; + } + setQueryParams(newQueryParams); + refreshCases(false); + }, + [queryParams, refreshCases, setQueryParams] + ); + + const onFilterChangedCallback = useCallback( + (newFilterOptions: Partial<FilterOptions>) => { + if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.closed) { + setQueryParams({ sortField: SortFieldCase.closedAt }); + } else if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.open) { + setQueryParams({ sortField: SortFieldCase.createdAt }); + } else if ( + newFilterOptions.status && + newFilterOptions.status === CaseStatuses['in-progress'] + ) { + setQueryParams({ sortField: SortFieldCase.createdAt }); + } + setFilters(newFilterOptions); + refreshCases(false); + }, + [refreshCases, setQueryParams, setFilters] + ); + + const showActions = userCanCrud && !isSelectorView; + + const columns = useCasesColumns({ + caseDetailsNavigation, + filterStatus: filterOptions.status, + refreshCases, + handleIsLoading, + showActions, + }); + + const itemIdToExpandedRowMap = useMemo( + () => + getExpandedRowMap({ + columns, + data: data.cases, + onSubCaseClick: onRowClick, + }), + [data.cases, columns, onRowClick] + ); + + const pagination = useMemo( + () => ({ + pageIndex: queryParams.page - 1, + pageSize: queryParams.perPage, + totalItemCount: data.total, + pageSizeOptions: [5, 10, 15, 20, 25], + }), + [data, queryParams] + ); + + const euiBasicTableSelectionProps = useMemo<EuiTableSelectionType<Case>>( + () => ({ + onSelectionChange: setSelectedCases, + selectableMessage: (selectable) => (!selectable ? SELECTABLE_MESSAGE_COLLECTIONS : ''), + initialSelected: selectedCases, + }), + [selectedCases, setSelectedCases] + ); + const isCasesLoading = useMemo(() => loading.indexOf('cases') > -1, [loading]); + const isDataEmpty = useMemo(() => data.total === 0, [data]); + + const TableWrap = useMemo(() => (isSelectorView ? 'span' : Panel), [isSelectorView]); + + const tableRowProps = useCallback( + (theCase: Case) => { + const onTableRowClick = memoize(async () => { + if (alertData != null) { + await postComment({ + caseId: theCase.id, + data: { + type: CommentType.alert, + ...alertData, + }, + updateCase, + }); + } + if (onRowClick) { + onRowClick(theCase); + } + }); + + return { + 'data-test-subj': `cases-table-row-${theCase.id}`, + className: classnames({ isDisabled: theCase.type === CaseType.collection }), + ...(isSelectorView && theCase.type !== CaseType.collection + ? { onClick: onTableRowClick } + : {}), + }; + }, + [isSelectorView, alertData, onRowClick, postComment, updateCase] + ); + + return ( + <> + {!isEmpty(actionsErrors) && ( + <CaseCallOut title={ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={actionsErrors} /> + )} + {configureCasesNavigation != null && ( + <CasesTableHeader + actionsErrors={actionsErrors} + createCaseNavigation={createCaseNavigation} + configureCasesNavigation={configureCasesNavigation} + refresh={refresh} + userCanCrud={userCanCrud} + /> + )} + <ProgressLoader + size="xs" + color="accent" + className="essentialAnimation" + $isShow={(isCasesLoading || isLoading || isCommentUpdating) && !isDataEmpty} + /> + <TableWrap + data-test-subj="table-wrap" + loading={!isSelectorView ? isCasesLoading : undefined} + > + <CasesTableFilters + countClosedCases={data.countClosedCases} + countOpenCases={data.countOpenCases} + countInProgressCases={data.countInProgressCases} + onFilterChanged={onFilterChangedCallback} + initial={{ + search: filterOptions.search, + reporters: filterOptions.reporters, + tags: filterOptions.tags, + status: filterOptions.status, + }} + setFilterRefetch={setFilterRefetch} + disabledStatuses={disabledStatuses} + /> + <CasesTable + columns={columns} + createCaseNavigation={createCaseNavigation} + data={data} + filterOptions={filterOptions} + goToCreateCase={goToCreateCase} + handleIsLoading={handleIsLoading} + isCasesLoading={isCasesLoading} + isCommentUpdating={isCommentUpdating} + isDataEmpty={isDataEmpty} + isSelectorView={isSelectorView} + itemIdToExpandedRowMap={itemIdToExpandedRowMap} + onChange={tableOnChangeCallback} + pagination={pagination} + refreshCases={refreshCases} + selectedCases={selectedCases} + selection={euiBasicTableSelectionProps} + showActions={showActions} + sorting={sorting} + tableRowProps={tableRowProps} + userCanCrud={userCanCrud} + /> + </TableWrap> + </> + ); + } +); + +AllCasesGeneric.displayName = 'AllCasesGeneric'; diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.tsx index 2ed18b1ae8bf4..c98d230564038 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiAvatar, EuiBadgeGroup, @@ -19,22 +19,24 @@ import { } from '@elastic/eui'; import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services'; import styled from 'styled-components'; -import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; -import { CaseStatuses, CaseType } from '../../../common'; +import { CaseStatuses, CaseType, DeleteCase, Case, SubCase } from '../../../common'; import { getEmptyTagValue } from '../empty_value'; -import { Case, SubCase } from '../../containers/types'; import { FormattedRelativePreferenceDate } from '../formatted_date'; import { CaseDetailsHrefSchema, CaseDetailsLink, CasesNavigation } from '../links'; import * as i18n from './translations'; import { Status } from '../status'; import { getSubCasesStatusCountsBadges, isSubCase } from './helpers'; import { ALERTS } from '../../common/translations'; +import { getActions } from './actions'; +import { UpdateCase, useGetCases } from '../../containers/use_get_cases'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; export type CasesColumns = - | EuiTableFieldDataColumnType<Case> + | EuiTableActionsColumnType<Case> | EuiTableComputedColumnType<Case> - | EuiTableActionsColumnType<Case>; + | EuiTableFieldDataColumnType<Case>; const MediumShadeText = styled.p` color: ${({ theme }) => theme.eui.euiColorMediumShade}; @@ -51,35 +53,95 @@ const TagWrapper = styled(EuiBadgeGroup)` const renderStringField = (field: string, dataTestSubj: string) => field != null ? <span data-test-subj={dataTestSubj}>{field}</span> : getEmptyTagValue(); -interface GetCasesColumn { - actions: Array<DefaultItemIconButtonAction<Case>>; - caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; +export interface GetCasesColumn { + caseDetailsNavigation?: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; filterStatus: string; - isModal: boolean; + handleIsLoading: (a: boolean) => void; + refreshCases?: (a?: boolean) => void; + showActions: boolean; } -export const getCasesColumns = ({ - actions, +export const useCasesColumns = ({ caseDetailsNavigation, filterStatus, - isModal, + handleIsLoading, + refreshCases, + showActions, }: GetCasesColumn): CasesColumns[] => { - const columns = [ + const { loading: isLoadingCases, dispatchUpdateCaseProperty } = useGetCases(); + // Delete case + const { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isDeleted, + isDisplayConfirmDeleteModal, + isLoading: isDeleting, + } = useDeleteCases(); + + const [deleteThisCase, setDeleteThisCase] = useState<DeleteCase>({ + id: '', + title: '', + type: null, + }); + + const toggleDeleteModal = useCallback( + (deleteCase: Case) => { + handleToggleModal(); + setDeleteThisCase({ id: deleteCase.id, title: deleteCase.title, type: deleteCase.type }); + }, + [handleToggleModal] + ); + + const handleDispatchUpdate = useCallback( + (args: Omit<UpdateCase, 'refetchCasesStatus'>) => { + dispatchUpdateCaseProperty({ + ...args, + refetchCasesStatus: () => { + if (refreshCases != null) refreshCases(); + }, + }); + }, + [dispatchUpdateCaseProperty, refreshCases] + ); + + const actions = useMemo( + () => + getActions({ + deleteCaseOnClick: toggleDeleteModal, + dispatchUpdate: handleDispatchUpdate, + }), + [toggleDeleteModal, handleDispatchUpdate] + ); + + useEffect(() => { + handleIsLoading(isDeleting || isLoadingCases.indexOf('caseUpdate') > -1); + }, [handleIsLoading, isDeleting, isLoadingCases]); + + useEffect(() => { + if (isDeleted) { + if (refreshCases != null) refreshCases(); + dispatchResetIsDeleted(); + } + }, [isDeleted, dispatchResetIsDeleted, refreshCases]); + + return [ { name: i18n.NAME, render: (theCase: Case | SubCase) => { if (theCase.id != null && theCase.title != null) { - const caseDetailsLinkComponent = !isModal ? ( - <CaseDetailsLink - caseDetailsNavigation={caseDetailsNavigation} - detailName={isSubCase(theCase) ? theCase.caseParentId : theCase.id} - subCaseId={isSubCase(theCase) ? theCase.id : undefined} - title={theCase.title} - > - {theCase.title} - </CaseDetailsLink> - ) : ( - <span>{theCase.title}</span> - ); + const caseDetailsLinkComponent = + caseDetailsNavigation != null ? ( + <CaseDetailsLink + caseDetailsNavigation={caseDetailsNavigation} + detailName={isSubCase(theCase) ? theCase.caseParentId : theCase.id} + subCaseId={isSubCase(theCase) ? theCase.id : undefined} + title={theCase.title} + > + {theCase.title} + </CaseDetailsLink> + ) : ( + <span>{theCase.title}</span> + ); return theCase.status !== CaseStatuses.closed ? ( caseDetailsLinkComponent ) : ( @@ -226,15 +288,26 @@ export const getCasesColumns = ({ )); }, }, - { - name: i18n.ACTIONS, - actions, - }, + ...(showActions + ? [ + { + name: ( + <> + {i18n.ACTIONS} + <ConfirmDeleteCaseModal + caseTitle={deleteThisCase.title} + isModalVisible={isDisplayConfirmDeleteModal} + isPlural={false} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind(null, [deleteThisCase])} + /> + </> + ), + actions, + }, + ] + : []), ]; - if (isModal) { - columns.pop(); // remove actions if in modal - } - return columns; }; interface Props { diff --git a/x-pack/plugins/cases/public/components/all_cases/count.tsx b/x-pack/plugins/cases/public/components/all_cases/count.tsx new file mode 100644 index 0000000000000..e42e52cfdc934 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/count.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent, useEffect } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { CaseStatuses } from '../../../common'; +import { Stats } from '../status'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; + +interface CountProps { + refresh?: number; +} +export const Count: FunctionComponent<CountProps> = ({ refresh }) => { + const { + countOpenCases, + countInProgressCases, + countClosedCases, + isLoading: isCasesStatusLoading, + fetchCasesStatus, + } = useGetCasesStatus(); + useEffect(() => { + if (refresh != null) { + fetchCasesStatus(); + } + }, [fetchCasesStatus, refresh]); + return ( + <EuiFlexGroup> + <EuiFlexItem grow={false}> + <Stats + dataTestSubj="openStatsHeader" + caseCount={countOpenCases} + caseStatus={CaseStatuses.open} + isLoading={isCasesStatusLoading} + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <Stats + dataTestSubj="inProgressStatsHeader" + caseCount={countInProgressCases} + caseStatus={CaseStatuses['in-progress']} + isLoading={isCasesStatusLoading} + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <Stats + dataTestSubj="closedStatsHeader" + caseCount={countClosedCases} + caseStatus={CaseStatuses.closed} + isLoading={isCasesStatusLoading} + /> + </EuiFlexItem> + </EuiFlexGroup> + ); +}; diff --git a/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx b/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx index 1bd9f53f9c4d1..59efcf868c9ee 100644 --- a/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/expanded_row.tsx @@ -34,12 +34,10 @@ BasicTable.displayName = 'BasicTable'; export const getExpandedRowMap = ({ data, columns, - isModal, onSubCaseClick, }: { data: Case[] | null; columns: CasesColumns[]; - isModal: boolean; onSubCaseClick?: (theSubCase: SubCase) => void; }): ExpandedRowMap => { if (data == null) { @@ -48,7 +46,7 @@ export const getExpandedRowMap = ({ const rowProps = (theSubCase: SubCase) => { return { - ...(isModal && onSubCaseClick ? { onClick: () => onSubCaseClick(theSubCase) } : {}), + ...(onSubCaseClick ? { onClick: () => onSubCaseClick(theSubCase) } : {}), className: 'subCase', }; }; diff --git a/x-pack/plugins/cases/public/components/all_cases/header.tsx b/x-pack/plugins/cases/public/components/all_cases/header.tsx new file mode 100644 index 0000000000000..a6737b987e2c4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/header.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import styled, { css } from 'styled-components'; +import { CaseHeaderPage } from '../case_header_page'; +import * as i18n from './translations'; +import { Count } from './count'; +import { CasesNavigation } from '../links'; +import { ErrorMessage } from '../callout/types'; +import { NavButtons } from './nav_buttons'; + +interface OwnProps { + actionsErrors: ErrorMessage[]; + configureCasesNavigation: CasesNavigation; + createCaseNavigation: CasesNavigation; + refresh: number; + userCanCrud: boolean; +} + +type Props = OwnProps; + +const FlexItemDivider = styled(EuiFlexItem)` + ${({ theme }) => css` + .euiFlexGroup--gutterMedium > &.euiFlexItem { + border-right: ${theme.eui.euiBorderThin}; + padding-right: ${theme.eui.euiSize}; + margin-right: ${theme.eui.euiSize}; + } + `} +`; + +export const CasesTableHeader: FunctionComponent<Props> = ({ + actionsErrors, + configureCasesNavigation, + createCaseNavigation, + refresh, + userCanCrud, +}) => ( + <CaseHeaderPage title={i18n.PAGE_TITLE}> + <EuiFlexGroup + alignItems="center" + gutterSize="m" + responsive={false} + wrap={true} + data-test-subj="all-cases-header" + > + <FlexItemDivider grow={false}> + <Count refresh={refresh} /> + </FlexItemDivider> + <EuiFlexItem grow={false}> + <NavButtons + actionsErrors={actionsErrors} + configureCasesNavigation={configureCasesNavigation} + createCaseNavigation={createCaseNavigation} + userCanCrud={userCanCrud} + /> + </EuiFlexItem> + </EuiFlexGroup> + </CaseHeaderPage> +); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx index f433974680d6c..2129162f56404 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx @@ -12,7 +12,6 @@ import { waitFor } from '@testing-library/react'; import '../../common/mock/match_media'; import { TestProviders } from '../../common/mock'; import { casesStatus, useGetCasesMockState, collectionCase } from '../../containers/mock'; -import * as i18n from './translations'; import { CaseStatuses, CaseType, StatusAll } from '../../../common'; import { getEmptyTagValue } from '../empty_value'; @@ -21,9 +20,10 @@ import { useGetCases } from '../../containers/use_get_cases'; import { useGetCasesStatus } from '../../containers/use_get_cases_status'; import { useUpdateCases } from '../../containers/use_bulk_update_case'; import { useGetActionLicense } from '../../containers/use_get_action_license'; -import { getCasesColumns } from './columns'; -import { AllCases } from '.'; - +import { AllCasesGeneric as AllCases } from './all_cases_generic'; +import { AllCasesProps } from '.'; +import { CasesColumns, GetCasesColumn, useCasesColumns } from './columns'; +import { renderHook } from '@testing-library/react-hooks'; jest.mock('../../containers/use_bulk_update_case'); jest.mock('../../containers/use_delete_cases'); jest.mock('../../containers/use_get_cases'); @@ -38,8 +38,8 @@ const useGetActionLicenseMock = useGetActionLicense as jest.Mock; jest.mock('../../common/lib/kibana'); -describe('AllCases', () => { - const defaultAllCasesProps = { +describe('AllCasesGeneric', () => { + const defaultAllCasesProps: AllCasesProps = { configureCasesNavigation: { href: 'blah', onClick: jest.fn(), @@ -52,6 +52,7 @@ describe('AllCases', () => { href: 'bleh', onClick: jest.fn(), }, + userCanCrud: true, }; const dispatchResetIsDeleted = jest.fn(); @@ -107,6 +108,16 @@ describe('AllCases', () => { isError: false, }; + const defaultColumnArgs = { + filterStatus: CaseStatuses.open, + showActions: true, + handleIsLoading: jest.fn(), + caseDetailsNavigation: { + href: jest.fn(), + onClick: jest.fn(), + }, + }; + beforeEach(() => { jest.clearAllMocks(); useUpdateCasesMock.mockReturnValue(defaultUpdateCases); @@ -125,7 +136,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -163,7 +174,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -199,7 +210,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -240,27 +251,23 @@ describe('AllCases', () => { }); const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); const checkIt = (columnName: string, key: number) => { const column = wrapper.find('[data-test-subj="cases-table"] tbody .euiTableRowCell').at(key); - if (columnName === i18n.ACTIONS) { - return; - } expect(column.find('.euiTableRowCell--hideForDesktop').text()).toEqual(columnName); expect(column.find('span').text()).toEqual(emptyTag); }; + + const { result } = renderHook<GetCasesColumn, CasesColumns[]>(() => + useCasesColumns(defaultColumnArgs) + ); + await waitFor(() => { - getCasesColumns({ - actions: [], - filterStatus: CaseStatuses.open, - isModal: false, - caseDetailsNavigation: { - href: jest.fn(), - onClick: jest.fn(), - }, - }).map((i, key) => i.name != null && checkIt(`${i.name}`, key)); + result.current.map( + (i, key) => i.name != null && !i.hasOwnProperty('actions') && checkIt(`${i.name}`, key) + ); }); }); @@ -271,7 +278,7 @@ describe('AllCases', () => { }); const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); @@ -313,7 +320,7 @@ describe('AllCases', () => { }); const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -338,25 +345,22 @@ describe('AllCases', () => { }); }); - it('should not render case link or actions on modal=true', async () => { + it('should not render case link when caseDetailsNavigation is not passed or actions on showActions=false', async () => { + const { caseDetailsNavigation, ...rest } = defaultAllCasesProps; const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + <AllCases {...rest} /> </TestProviders> ); - await waitFor(() => { - const checkIt = (columnName: string) => { - expect(columnName).not.toEqual(i18n.ACTIONS); - }; - getCasesColumns({ - actions: [], + const { result } = renderHook<GetCasesColumn, CasesColumns[]>(() => + useCasesColumns({ filterStatus: CaseStatuses.open, - isModal: true, - caseDetailsNavigation: { - href: jest.fn(), - onClick: jest.fn(), - }, - }).map((i, key) => i.name != null && checkIt(`${i.name}`)); + handleIsLoading: jest.fn(), + showActions: false, + }) + ); + await waitFor(() => { + result.current.map((i) => i.name != null && !i.hasOwnProperty('actions')); expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); }); }); @@ -364,7 +368,7 @@ describe('AllCases', () => { it('should tableHeaderSortButton AllCases', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="tableHeaderSortButton"]').first().simulate('click'); @@ -381,7 +385,7 @@ describe('AllCases', () => { it('closes case when row action icon clicked', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); @@ -389,13 +393,14 @@ describe('AllCases', () => { await waitFor(() => { const firstCase = useGetCasesMockState.data.cases[0]; - expect(dispatchUpdateCaseProperty).toBeCalledWith({ - caseId: firstCase.id, - updateKey: 'status', - updateValue: CaseStatuses.closed, - refetchCasesStatus: fetchCasesStatus, - version: firstCase.version, - }); + expect(dispatchUpdateCaseProperty.mock.calls[0][0]).toEqual( + expect.objectContaining({ + caseId: firstCase.id, + updateKey: 'status', + updateValue: CaseStatuses.closed, + version: firstCase.version, + }) + ); }); }); @@ -416,7 +421,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -425,20 +430,21 @@ describe('AllCases', () => { await waitFor(() => { const firstCase = useGetCasesMockState.data.cases[0]; - expect(dispatchUpdateCaseProperty).toBeCalledWith({ - caseId: firstCase.id, - updateKey: 'status', - updateValue: CaseStatuses.open, - refetchCasesStatus: fetchCasesStatus, - version: firstCase.version, - }); + expect(dispatchUpdateCaseProperty.mock.calls[0][0]).toEqual( + expect.objectContaining({ + caseId: firstCase.id, + updateKey: 'status', + updateValue: CaseStatuses.open, + version: firstCase.version, + }) + ); }); }); it('put case in progress when row action icon clicked', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -447,13 +453,14 @@ describe('AllCases', () => { await waitFor(() => { const firstCase = useGetCasesMockState.data.cases[0]; - expect(dispatchUpdateCaseProperty).toBeCalledWith({ - caseId: firstCase.id, - updateKey: 'status', - updateValue: CaseStatuses['in-progress'], - refetchCasesStatus: fetchCasesStatus, - version: firstCase.version, - }); + expect(dispatchUpdateCaseProperty.mock.calls[0][0]).toEqual( + expect.objectContaining({ + caseId: firstCase.id, + updateKey: 'status', + updateValue: CaseStatuses['in-progress'], + version: firstCase.version, + }) + ); }); }); @@ -476,7 +483,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -513,7 +520,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -531,7 +538,7 @@ describe('AllCases', () => { }); }); - it('Renders correct bulk actoins for case collection when filter status is set to all - enable only bulk delete if any collection is selected', async () => { + it('Renders correct bulk actions for case collection when filter status is set to all - enable only bulk delete if any collection is selected', async () => { useGetCasesMock.mockReturnValue({ ...defaultGetCases, filterOptions: { ...defaultGetCases.filterOptions, status: CaseStatuses.open }, @@ -556,7 +563,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -583,7 +590,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -606,7 +613,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -625,7 +632,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -646,7 +653,7 @@ describe('AllCases', () => { mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); await waitFor(() => { @@ -664,7 +671,7 @@ describe('AllCases', () => { mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); await waitFor(() => { @@ -674,10 +681,11 @@ describe('AllCases', () => { }); }); - it('should not render header when modal=true', async () => { + it('should not render header when configureCasesNavigation are not present', async () => { + const { configureCasesNavigation, ...restProps } = defaultAllCasesProps; const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + <AllCases {...restProps} isSelectorView={true} /> </TestProviders> ); await waitFor(() => { @@ -685,23 +693,24 @@ describe('AllCases', () => { }); }); - it('should not render table utility bar when modal=true', async () => { + it('should not render table utility bar when isSelectorView=true', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + <AllCases {...defaultAllCasesProps} isSelectorView={true} /> </TestProviders> ); await waitFor(() => { - expect(wrapper.find('[data-test-subj="case-table-utility-bar-actions"]').exists()).toBe( + expect(wrapper.find('[data-test-subj="case-table-selected-case-count"]').exists()).toBe( false ); + expect(wrapper.find('[data-test-subj="case-table-bulk-actions"]').exists()).toBe(false); }); }); - it('case table should not be selectable when modal=true', async () => { + it('case table should not be selectable when isSelectorView=true', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={true} /> + <AllCases {...defaultAllCasesProps} isSelectorView={true} /> </TestProviders> ); await waitFor(() => { @@ -711,7 +720,7 @@ describe('AllCases', () => { }); }); - it('should call onRowClick with no cases and modal=true', async () => { + it('should call onRowClick with no cases and isSelectorView=true', async () => { useGetCasesMock.mockReturnValue({ ...defaultGetCases, data: { @@ -726,7 +735,7 @@ describe('AllCases', () => { <AllCases {...defaultAllCasesProps} userCanCrud={true} - isModal={true} + isSelectorView={true} onRowClick={onRowClick} /> </TestProviders> @@ -737,7 +746,7 @@ describe('AllCases', () => { }); }); - it('should call createCaseNavigation.onClick with no cases and modal=false', async () => { + it('should call createCaseNavigation.onClick with no cases and isSelectorView=false', async () => { const createCaseNavigation = { href: '', onClick: jest.fn() }; useGetCasesMock.mockReturnValue({ ...defaultGetCases, @@ -753,8 +762,7 @@ describe('AllCases', () => { <AllCases {...defaultAllCasesProps} createCaseNavigation={createCaseNavigation} - userCanCrud={true} - isModal={false} + isSelectorView={false} /> </TestProviders> ); @@ -770,7 +778,7 @@ describe('AllCases', () => { <AllCases {...defaultAllCasesProps} userCanCrud={true} - isModal={true} + isSelectorView={true} onRowClick={onRowClick} /> </TestProviders> @@ -827,7 +835,7 @@ describe('AllCases', () => { it('should NOT call onRowClick when clicking a case with modal=true', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + <AllCases {...defaultAllCasesProps} isSelectorView={false} /> </TestProviders> ); wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); @@ -839,7 +847,7 @@ describe('AllCases', () => { it('should change the status to closed', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + <AllCases {...defaultAllCasesProps} isSelectorView={false} /> </TestProviders> ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -854,7 +862,7 @@ describe('AllCases', () => { it('should change the status to in-progress', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + <AllCases {...defaultAllCasesProps} isSelectorView={false} /> </TestProviders> ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -869,7 +877,7 @@ describe('AllCases', () => { it('should change the status to open', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + <AllCases {...defaultAllCasesProps} isSelectorView={false} /> </TestProviders> ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -884,7 +892,7 @@ describe('AllCases', () => { it('should show the correct count on stats', async () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} isModal={false} /> + <AllCases {...defaultAllCasesProps} isSelectorView={false} /> </TestProviders> ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -916,7 +924,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); @@ -942,7 +950,7 @@ describe('AllCases', () => { const wrapper = mount( <TestProviders> - <AllCases {...defaultAllCasesProps} userCanCrud={true} /> + <AllCases {...defaultAllCasesProps} /> </TestProviders> ); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.tsx b/x-pack/plugins/cases/public/components/all_cases/index.tsx index 36072f8fa7461..2c506cd2da411 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.tsx @@ -5,607 +5,19 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { - EuiBasicTable as _EuiBasicTable, - EuiContextMenuPanel, - EuiEmptyPrompt, - EuiFlexGroup, - EuiFlexItem, - EuiLoadingContent, - EuiProgress, - EuiTableSortingType, -} from '@elastic/eui'; -import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; -import { isEmpty, memoize } from 'lodash/fp'; -import styled, { css } from 'styled-components'; -import classnames from 'classnames'; - -import * as i18n from './translations'; -import { CaseStatuses, CaseType, CommentRequestAlertType, CommentType } from '../../../common'; -import { getCasesColumns } from './columns'; -import { Case, DeleteCase, FilterOptions, SortFieldCase, SubCase } from '../../containers/types'; -import { useGetCases, UpdateCase } from '../../containers/use_get_cases'; -import { useGetCasesStatus } from '../../containers/use_get_cases_status'; -import { useDeleteCases } from '../../containers/use_delete_cases'; -import { EuiBasicTableOnChange } from './types'; -import { Panel } from '../panel'; -import { - UtilityBar, - UtilityBarAction, - UtilityBarGroup, - UtilityBarSection, - UtilityBarText, -} from '../utility_bar'; -import { getBulkItems } from '../bulk_actions'; -import { CaseHeaderPage } from '../case_header_page'; -import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; -import { getActions } from './actions'; -import { CasesTableFilters } from './table_filters'; -import { useUpdateCases } from '../../containers/use_bulk_update_case'; -import { useGetActionLicense } from '../../containers/use_get_action_license'; -import { usePostComment } from '../../containers/use_post_comment'; -import { getActionLicenseError } from '../use_push_to_service/helpers'; -import { CaseCallOut } from '../callout'; -import { ConfigureCaseButton } from '../configure_cases/button'; -import { ERROR_PUSH_SERVICE_CALLOUT_TITLE } from '../use_push_to_service/translations'; -import { CaseDetailsHrefSchema, CasesNavigation, LinkButton } from '../links'; -import { Stats } from '../status'; -import { SELECTABLE_MESSAGE_COLLECTIONS } from '../../common/translations'; -import { getExpandedRowMap } from './expanded_row'; -import { isSelectedCasesIncludeCollections } from './helpers'; - -const Div = styled.div` - margin-top: ${({ theme }) => theme.eui.paddingSizes.m}; -`; - -const FlexItemDivider = styled(EuiFlexItem)` - ${({ theme }) => css` - .euiFlexGroup--gutterMedium > &.euiFlexItem { - border-right: ${theme.eui.euiBorderThin}; - padding-right: ${theme.eui.euiSize}; - margin-right: ${theme.eui.euiSize}; - } - `} -`; - -const ProgressLoader = styled(EuiProgress)` - ${({ theme }) => css` - top: 2px; - border-radius: ${theme.eui.euiBorderRadius}; - z-index: ${theme.eui.euiZHeader}; - `} -`; - -const getSortField = (field: string): SortFieldCase => { - if (field === SortFieldCase.createdAt) { - return SortFieldCase.createdAt; - } else if (field === SortFieldCase.closedAt) { - return SortFieldCase.closedAt; - } - return SortFieldCase.createdAt; -}; - -const EuiBasicTable: any = _EuiBasicTable; -const BasicTable = styled(EuiBasicTable)` - ${({ theme }) => ` - .euiTableRow-isExpandedRow.euiTableRow-isSelectable .euiTableCellContent { - padding: 8px 0 8px 32px; - } - - &.isModal .euiTableRow.isDisabled { - cursor: not-allowed; - background-color: ${theme.eui.euiTableHoverClickableColor}; - } - - &.isModal .euiTableRow.euiTableRow-isExpandedRow .euiTableRowCell, - &.isModal .euiTableRow.euiTableRow-isExpandedRow:hover { - background-color: transparent; - } - - &.isModal .euiTableRow.euiTableRow-isExpandedRow { - .subCase:hover { - background-color: ${theme.eui.euiTableHoverClickableColor}; - } - } - `} -`; -BasicTable.displayName = 'BasicTable'; - +import React from 'react'; +import { CaseDetailsHrefSchema, CasesNavigation } from '../links'; +import { AllCasesGeneric } from './all_cases_generic'; export interface AllCasesProps { - alertData?: Omit<CommentRequestAlertType, 'type'>; - caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; - configureCasesNavigation: CasesNavigation; + caseDetailsNavigation: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; // if not passed, case name is not displayed as a link (Formerly dependant on isSelector) + configureCasesNavigation: CasesNavigation; // if not passed, header with nav is not displayed (Formerly dependant on isSelector) createCaseNavigation: CasesNavigation; - disabledStatuses?: CaseStatuses[]; - isModal?: boolean; - onRowClick?: (theCase?: Case | SubCase) => void; userCanCrud: boolean; - updateCase?: (newCase: Case) => void; } -export const AllCases = React.memo<AllCasesProps>( - ({ - alertData, - caseDetailsNavigation, - configureCasesNavigation, - createCaseNavigation, - disabledStatuses, - isModal = false, - onRowClick, - userCanCrud, - updateCase, - }) => { - const { actionLicense } = useGetActionLicense(); - const { - countOpenCases, - countInProgressCases, - countClosedCases, - isLoading: isCasesStatusLoading, - fetchCasesStatus, - } = useGetCasesStatus(); - const { - data, - dispatchUpdateCaseProperty, - filterOptions, - loading, - queryParams, - selectedCases, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - } = useGetCases(); - - // Delete case - const { - dispatchResetIsDeleted, - handleOnDeleteConfirm, - handleToggleModal, - isLoading: isDeleting, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); - - // Update case - const { - dispatchResetIsUpdated, - isLoading: isUpdating, - isUpdated, - updateBulkStatus, - } = useUpdateCases(); - - // Post Comment to Case - const { postComment, isLoading: isCommentsUpdating } = usePostComment(); - - const [deleteThisCase, setDeleteThisCase] = useState<DeleteCase>({ - title: '', - id: '', - type: null, - }); - const [deleteBulk, setDeleteBulk] = useState<DeleteCase[]>([]); - const filterRefetch = useRef<() => void>(); - const setFilterRefetch = useCallback( - (refetchFilter: () => void) => { - filterRefetch.current = refetchFilter; - }, - [filterRefetch] - ); - const refreshCases = useCallback( - (dataRefresh = true) => { - if (dataRefresh) refetchCases(); - fetchCasesStatus(); - setSelectedCases([]); - setDeleteBulk([]); - if (filterRefetch.current != null) { - filterRefetch.current(); - } - }, - [filterRefetch, refetchCases, setSelectedCases, fetchCasesStatus] - ); - - useEffect(() => { - if (isDeleted) { - refreshCases(); - dispatchResetIsDeleted(); - } - if (isUpdated) { - refreshCases(); - dispatchResetIsUpdated(); - } - }, [isDeleted, isUpdated, refreshCases, dispatchResetIsDeleted, dispatchResetIsUpdated]); - const confirmDeleteModal = useMemo( - () => ( - <ConfirmDeleteCaseModal - caseTitle={deleteThisCase.title} - isModalVisible={isDisplayConfirmDeleteModal} - isPlural={deleteBulk.length > 0} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind( - null, - deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] - )} - /> - ), - [ - deleteBulk, - deleteThisCase, - isDisplayConfirmDeleteModal, - handleToggleModal, - handleOnDeleteConfirm, - ] - ); - - const toggleDeleteModal = useCallback( - (deleteCase: Case) => { - handleToggleModal(); - setDeleteThisCase({ id: deleteCase.id, title: deleteCase.title, type: deleteCase.type }); - }, - [handleToggleModal] - ); - - const toggleBulkDeleteModal = useCallback( - (cases: Case[]) => { - handleToggleModal(); - if (cases.length === 1) { - const singleCase = cases[0]; - if (singleCase) { - return setDeleteThisCase({ - id: singleCase.id, - title: singleCase.title, - type: singleCase.type, - }); - } - } - const convertToDeleteCases: DeleteCase[] = cases.map(({ id, title, type }) => ({ - id, - title, - type, - })); - setDeleteBulk(convertToDeleteCases); - }, - [setDeleteBulk, handleToggleModal] - ); - - const handleUpdateCaseStatus = useCallback( - (status: string) => { - updateBulkStatus(selectedCases, status); - }, - [selectedCases, updateBulkStatus] - ); - - const getBulkItemsPopoverContent = useCallback( - (closePopover: () => void) => ( - <EuiContextMenuPanel - data-test-subj="cases-bulk-actions" - items={getBulkItems({ - caseStatus: filterOptions.status, - closePopover, - deleteCasesAction: toggleBulkDeleteModal, - selectedCases, - updateCaseStatus: handleUpdateCaseStatus, - includeCollections: isSelectedCasesIncludeCollections(selectedCases), - })} - /> - ), - [selectedCases, filterOptions.status, toggleBulkDeleteModal, handleUpdateCaseStatus] - ); - const handleDispatchUpdate = useCallback( - (args: Omit<UpdateCase, 'refetchCasesStatus'>) => { - dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); - }, - [dispatchUpdateCaseProperty, fetchCasesStatus] - ); - - const { onClick: onCreateCaseNavClick } = createCaseNavigation; - const goToCreateCase = useCallback( - (ev) => { - ev.preventDefault(); - if (isModal && onRowClick != null) { - onRowClick(); - } else if (onCreateCaseNavClick) { - onCreateCaseNavClick(ev); - } - }, - [isModal, onCreateCaseNavClick, onRowClick] - ); - - const actions = useMemo( - () => - getActions({ - caseStatus: filterOptions.status, - deleteCaseOnClick: toggleDeleteModal, - dispatchUpdate: handleDispatchUpdate, - }), - [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] - ); - - const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); - - const tableOnChangeCallback = useCallback( - ({ page, sort }: EuiBasicTableOnChange) => { - let newQueryParams = queryParams; - if (sort) { - newQueryParams = { - ...newQueryParams, - sortField: getSortField(sort.field), - sortOrder: sort.direction, - }; - } - if (page) { - newQueryParams = { - ...newQueryParams, - page: page.index + 1, - perPage: page.size, - }; - } - setQueryParams(newQueryParams); - refreshCases(false); - }, - [queryParams, refreshCases, setQueryParams] - ); - - const onFilterChangedCallback = useCallback( - (newFilterOptions: Partial<FilterOptions>) => { - if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.closed) { - setQueryParams({ sortField: SortFieldCase.closedAt }); - } else if (newFilterOptions.status && newFilterOptions.status === CaseStatuses.open) { - setQueryParams({ sortField: SortFieldCase.createdAt }); - } else if ( - newFilterOptions.status && - newFilterOptions.status === CaseStatuses['in-progress'] - ) { - setQueryParams({ sortField: SortFieldCase.createdAt }); - } - setFilters(newFilterOptions); - refreshCases(false); - }, - [refreshCases, setQueryParams, setFilters] - ); - - const memoizedGetCasesColumns = useMemo( - () => - getCasesColumns({ - actions: userCanCrud ? actions : [], - caseDetailsNavigation, - filterStatus: filterOptions.status, - isModal, - }), - [actions, caseDetailsNavigation, filterOptions.status, isModal, userCanCrud] - ); - - const itemIdToExpandedRowMap = useMemo( - () => - getExpandedRowMap({ - columns: memoizedGetCasesColumns, - data: data.cases, - isModal, - onSubCaseClick: onRowClick, - }), - [data.cases, isModal, memoizedGetCasesColumns, onRowClick] - ); - - const memoizedPagination = useMemo( - () => ({ - pageIndex: queryParams.page - 1, - pageSize: queryParams.perPage, - totalItemCount: data.total, - pageSizeOptions: [5, 10, 15, 20, 25], - }), - [data, queryParams] - ); - - const sorting: EuiTableSortingType<Case> = { - sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, - }; - - const euiBasicTableSelectionProps = useMemo<EuiTableSelectionType<Case>>( - () => ({ - onSelectionChange: setSelectedCases, - selectableMessage: (selectable) => (!selectable ? SELECTABLE_MESSAGE_COLLECTIONS : ''), - }), - [setSelectedCases] - ); - const isCasesLoading = useMemo( - () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, - [loading] - ); - const isDataEmpty = useMemo(() => data.total === 0, [data]); - - const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); - - const tableRowProps = useCallback( - (theCase: Case) => { - const onTableRowClick = memoize(async () => { - if (alertData != null) { - await postComment({ - caseId: theCase.id, - data: { - type: CommentType.alert, - ...alertData, - }, - updateCase, - }); - } - if (onRowClick) { - onRowClick(theCase); - } - }); - - return { - 'data-test-subj': `cases-table-row-${theCase.id}`, - className: classnames({ isDisabled: theCase.type === CaseType.collection }), - ...(isModal && theCase.type !== CaseType.collection ? { onClick: onTableRowClick } : {}), - }; - }, - [isModal, alertData, onRowClick, postComment, updateCase] - ); - - const enableBuckActions = userCanCrud && !isModal; - - return ( - <> - {!isEmpty(actionsErrors) && ( - <CaseCallOut title={ERROR_PUSH_SERVICE_CALLOUT_TITLE} messages={actionsErrors} /> - )} - {!isModal && ( - <CaseHeaderPage title={i18n.PAGE_TITLE}> - <EuiFlexGroup - alignItems="center" - gutterSize="m" - responsive={false} - wrap={true} - data-test-subj="all-cases-header" - > - <EuiFlexItem grow={false}> - <Stats - dataTestSubj="openStatsHeader" - caseCount={countOpenCases} - caseStatus={CaseStatuses.open} - isLoading={isCasesStatusLoading} - /> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <Stats - dataTestSubj="inProgressStatsHeader" - caseCount={countInProgressCases} - caseStatus={CaseStatuses['in-progress']} - isLoading={isCasesStatusLoading} - /> - </EuiFlexItem> - <FlexItemDivider grow={false}> - <Stats - dataTestSubj="closedStatsHeader" - caseCount={countClosedCases} - caseStatus={CaseStatuses.closed} - isLoading={isCasesStatusLoading} - /> - </FlexItemDivider> - <EuiFlexItem grow={false}> - <ConfigureCaseButton - configureCasesNavigation={configureCasesNavigation} - label={i18n.CONFIGURE_CASES_BUTTON} - isDisabled={!isEmpty(actionsErrors) || !userCanCrud} - showToolTip={!isEmpty(actionsErrors)} - msgTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].description : <></>} - titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} - /> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <LinkButton - isDisabled={!userCanCrud} - fill - onClick={createCaseNavigation.onClick} - href={createCaseNavigation.href} - iconType="plusInCircle" - data-test-subj="createNewCaseBtn" - > - {i18n.CREATE_TITLE} - </LinkButton> - </EuiFlexItem> - </EuiFlexGroup> - </CaseHeaderPage> - )} - {(isCasesLoading || isDeleting || isUpdating || isCommentsUpdating) && !isDataEmpty && ( - <ProgressLoader size="xs" color="accent" className="essentialAnimation" /> - )} - <TableWrap data-test-subj="table-wrap" loading={!isModal ? isCasesLoading : undefined}> - <CasesTableFilters - countClosedCases={data.countClosedCases} - countOpenCases={data.countOpenCases} - countInProgressCases={data.countInProgressCases} - onFilterChanged={onFilterChangedCallback} - initial={{ - search: filterOptions.search, - reporters: filterOptions.reporters, - tags: filterOptions.tags, - status: filterOptions.status, - }} - setFilterRefetch={setFilterRefetch} - disabledStatuses={disabledStatuses} - /> - {isCasesLoading && isDataEmpty ? ( - <Div> - <EuiLoadingContent data-test-subj="initialLoadingPanelAllCases" lines={10} /> - </Div> - ) : ( - <Div> - <UtilityBar border> - <UtilityBarSection> - <UtilityBarGroup> - <UtilityBarText data-test-subj="case-table-case-count"> - {i18n.SHOWING_CASES(data.total ?? 0)} - </UtilityBarText> - </UtilityBarGroup> - {!isModal && ( - <UtilityBarGroup data-test-subj="case-table-utility-bar-actions"> - {enableBuckActions && ( - <UtilityBarText data-test-subj="case-table-selected-case-count"> - {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} - </UtilityBarText> - )} - {enableBuckActions && ( - <UtilityBarAction - data-test-subj="case-table-bulk-actions" - iconSide="right" - iconType="arrowDown" - popoverContent={getBulkItemsPopoverContent} - > - {i18n.BULK_ACTIONS} - </UtilityBarAction> - )} - <UtilityBarAction iconSide="left" iconType="refresh" onClick={refreshCases}> - {i18n.REFRESH} - </UtilityBarAction> - </UtilityBarGroup> - )} - </UtilityBarSection> - </UtilityBar> - <BasicTable - columns={memoizedGetCasesColumns} - data-test-subj="cases-table" - isSelectable={enableBuckActions} - itemId="id" - items={data.cases} - itemIdToExpandedRowMap={itemIdToExpandedRowMap} - loading={isCommentsUpdating} - noItemsMessage={ - <EuiEmptyPrompt - title={<h3>{i18n.NO_CASES}</h3>} - titleSize="xs" - body={i18n.NO_CASES_BODY} - actions={ - <LinkButton - isDisabled={!userCanCrud} - fill - size="s" - onClick={goToCreateCase} - href={createCaseNavigation.href} - iconType="plusInCircle" - data-test-subj="cases-table-add-case" - > - {i18n.ADD_NEW_CASE} - </LinkButton> - } - /> - } - onChange={tableOnChangeCallback} - pagination={memoizedPagination} - rowProps={tableRowProps} - selection={enableBuckActions ? euiBasicTableSelectionProps : undefined} - sorting={sorting} - className={classnames({ isModal })} - /> - </Div> - )} - </TableWrap> - {confirmDeleteModal} - </> - ); - } -); - -AllCases.displayName = 'AllCases'; +export const AllCases: React.FC<AllCasesProps> = (props) => { + return <AllCasesGeneric {...props} />; +}; // eslint-disable-next-line import/no-default-export export { AllCases as default }; diff --git a/x-pack/plugins/cases/public/components/all_cases/nav_buttons.tsx b/x-pack/plugins/cases/public/components/all_cases/nav_buttons.tsx new file mode 100644 index 0000000000000..e29551f43c2bd --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/nav_buttons.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { isEmpty } from 'lodash/fp'; +import { ConfigureCaseButton } from '../configure_cases/button'; +import * as i18n from './translations'; +import { CasesNavigation, LinkButton } from '../links'; +import { ErrorMessage } from '../callout/types'; + +interface OwnProps { + actionsErrors: ErrorMessage[]; + configureCasesNavigation: CasesNavigation; + createCaseNavigation: CasesNavigation; + userCanCrud: boolean; +} + +type Props = OwnProps; + +export const NavButtons: FunctionComponent<Props> = ({ + actionsErrors, + configureCasesNavigation, + createCaseNavigation, + userCanCrud, +}) => ( + <EuiFlexGroup> + <EuiFlexItem grow={false}> + <ConfigureCaseButton + configureCasesNavigation={configureCasesNavigation} + label={i18n.CONFIGURE_CASES_BUTTON} + isDisabled={!isEmpty(actionsErrors) || !userCanCrud} + showToolTip={!isEmpty(actionsErrors)} + msgTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].description : <></>} + titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} + /> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <LinkButton + isDisabled={!userCanCrud} + fill + onClick={createCaseNavigation.onClick} + href={createCaseNavigation.href} + iconType="plusInCircle" + data-test-subj="createNewCaseBtn" + > + {i18n.CREATE_TITLE} + </LinkButton> + </EuiFlexItem> + </EuiFlexGroup> +); diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/index.test.tsx new file mode 100644 index 0000000000000..aaec37335c699 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/index.test.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { AllCasesSelectorModal } from '.'; +import { TestProviders } from '../../../common/mock'; +import { AllCasesGeneric } from '../all_cases_generic'; + +jest.mock('../../../methods'); +jest.mock('../all_cases_generic'); +const onRowClick = jest.fn(); +const createCaseNavigation = { href: '', onClick: jest.fn() }; +const defaultProps = { + createCaseNavigation, + onRowClick, + userCanCrud: true, +}; +const updateCase = jest.fn(); + +describe('AllCasesSelectorModal', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('renders', () => { + const wrapper = mount( + <TestProviders> + <AllCasesSelectorModal {...defaultProps} /> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + }); + + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + <TestProviders> + <AllCasesSelectorModal {...defaultProps} /> + </TestProviders> + ); + + wrapper.find('.euiModal__closeIcon').first().simulate('click'); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); + }); + + it('pass the correct props to getAllCases method', () => { + const fullProps = { + ...defaultProps, + alertData: { + rule: { + id: 'rule-id', + name: 'rule', + }, + index: 'index-id', + alertId: 'alert-id', + }, + disabledStatuses: [], + updateCase, + }; + mount( + <TestProviders> + <AllCasesSelectorModal {...fullProps} /> + </TestProviders> + ); + // @ts-ignore idk what this mock style is but it works ¯\_(ツ)_/¯ + expect(AllCasesGeneric.type.mock.calls[0][0]).toEqual( + expect.objectContaining({ + alertData: fullProps.alertData, + createCaseNavigation, + disabledStatuses: fullProps.disabledStatuses, + isSelectorView: true, + userCanCrud: fullProps.userCanCrud, + updateCase, + }) + ); + }); +}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/index.tsx similarity index 51% rename from x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx rename to x-pack/plugins/cases/public/components/all_cases/selector_modal/index.tsx index ef03931837567..0a83ef13e8ee6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/index.tsx @@ -5,22 +5,21 @@ * 2.0. */ -import React, { memo } from 'react'; -import styled from 'styled-components'; +import React, { useState, useCallback } from 'react'; import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; +import styled from 'styled-components'; +import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../common'; +import { CasesNavigation } from '../../links'; +import * as i18n from '../../../common/translations'; +import { AllCasesGeneric } from '../all_cases_generic'; -import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; -import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../../cases/common'; -import { AllCases } from '../all_cases'; -import * as i18n from './translations'; - -export interface AllCasesModalProps { +export interface AllCasesSelectorModalProps { alertData?: Omit<CommentRequestAlertType, 'type'>; + createCaseNavigation: CasesNavigation; disabledStatuses?: CaseStatuses[]; - isModalOpen: boolean; - onCloseCaseModal: () => void; - onRowClick?: (theCase?: Case | SubCase) => void; + onRowClick: (theCase?: Case | SubCase) => void; updateCase?: (newCase: Case) => void; + userCanCrud: boolean; } const Modal = styled(EuiModal)` @@ -30,36 +29,41 @@ const Modal = styled(EuiModal)` `} `; -const AllCasesModalComponent: React.FC<AllCasesModalProps> = ({ +export const AllCasesSelectorModal: React.FC<AllCasesSelectorModalProps> = ({ alertData, + createCaseNavigation, disabledStatuses, - isModalOpen, - onCloseCaseModal, onRowClick, updateCase, + userCanCrud, }) => { - const userPermissions = useGetUserSavedObjectPermissions(); - const userCanCrud = userPermissions?.crud ?? false; - + const [isModalOpen, setIsModalOpen] = useState<boolean>(true); + const closeModal = useCallback(() => setIsModalOpen(false), []); + const onClick = useCallback( + (theCase?: Case | SubCase) => { + closeModal(); + onRowClick(theCase); + }, + [closeModal, onRowClick] + ); return isModalOpen ? ( - <Modal onClose={onCloseCaseModal} data-test-subj="all-cases-modal"> + <Modal onClose={closeModal} data-test-subj="all-cases-modal"> <EuiModalHeader> <EuiModalHeaderTitle>{i18n.SELECT_CASE_TITLE}</EuiModalHeaderTitle> </EuiModalHeader> <EuiModalBody> - <AllCases + <AllCasesGeneric alertData={alertData} + createCaseNavigation={createCaseNavigation} disabledStatuses={disabledStatuses} - isModal - onRowClick={onRowClick} - updateCase={updateCase} + isSelectorView={true} + onRowClick={onClick} userCanCrud={userCanCrud} + updateCase={updateCase} /> </EuiModalBody> </Modal> ) : null; }; - -export const AllCasesModal = memo(AllCasesModalComponent); - -AllCasesModal.displayName = 'AllCasesModal'; +// eslint-disable-next-line import/no-default-export +export { AllCasesSelectorModal as default }; diff --git a/x-pack/plugins/cases/public/components/all_cases/table.tsx b/x-pack/plugins/cases/public/components/all_cases/table.tsx new file mode 100644 index 0000000000000..4b786e320d50c --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/table.tsx @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent } from 'react'; +import { + EuiEmptyPrompt, + EuiLoadingContent, + EuiTableSelectionType, + EuiBasicTable as _EuiBasicTable, + EuiBasicTableProps, +} from '@elastic/eui'; +import classnames from 'classnames'; +import styled from 'styled-components'; + +import { CasesTableUtilityBar } from './utility_bar'; +import { CasesNavigation, LinkButton } from '../links'; +import { AllCases, Case, FilterOptions } from '../../../common'; +import * as i18n from './translations'; + +interface CasesTableProps { + columns: EuiBasicTableProps<Case>['columns']; // CasesColumns[]; + createCaseNavigation: CasesNavigation; + data: AllCases; + filterOptions: FilterOptions; + goToCreateCase: (e: React.MouseEvent) => void; + handleIsLoading: (a: boolean) => void; + isCasesLoading: boolean; + isCommentUpdating: boolean; + isDataEmpty: boolean; + isSelectorView?: boolean; + itemIdToExpandedRowMap: EuiBasicTableProps<Case>['itemIdToExpandedRowMap']; + onChange: EuiBasicTableProps<Case>['onChange']; + pagination: EuiBasicTableProps<Case>['pagination']; + refreshCases: (a?: boolean) => void; + selectedCases: Case[]; + selection: EuiTableSelectionType<Case>; + showActions: boolean; + sorting: EuiBasicTableProps<Case>['sorting']; + tableRowProps: EuiBasicTableProps<Case>['rowProps']; + userCanCrud: boolean; +} + +const EuiBasicTable: any = _EuiBasicTable; +const BasicTable = styled(EuiBasicTable)` + ${({ theme }) => ` + .euiTableRow-isExpandedRow.euiTableRow-isSelectable .euiTableCellContent { + padding: 8px 0 8px 32px; + } + + &.isSelectorView .euiTableRow.isDisabled { + cursor: not-allowed; + background-color: ${theme.eui.euiTableHoverClickableColor}; + } + + &.isSelectorView .euiTableRow.euiTableRow-isExpandedRow .euiTableRowCell, + &.isSelectorView .euiTableRow.euiTableRow-isExpandedRow:hover { + background-color: transparent; + } + + &.isSelectorView .euiTableRow.euiTableRow-isExpandedRow { + .subCase:hover { + background-color: ${theme.eui.euiTableHoverClickableColor}; + } + } + `} +`; + +const Div = styled.div` + margin-top: ${({ theme }) => theme.eui.paddingSizes.m}; +`; + +export const CasesTable: FunctionComponent<CasesTableProps> = ({ + columns, + createCaseNavigation, + data, + filterOptions, + goToCreateCase, + handleIsLoading, + isCasesLoading, + isCommentUpdating, + isDataEmpty, + isSelectorView, + itemIdToExpandedRowMap, + onChange, + pagination, + refreshCases, + selectedCases, + selection, + showActions, + sorting, + tableRowProps, + userCanCrud, +}) => + isCasesLoading && isDataEmpty ? ( + <Div> + <EuiLoadingContent data-test-subj="initialLoadingPanelAllCases" lines={10} /> + </Div> + ) : ( + <Div> + <CasesTableUtilityBar + data={data} + enableBulkActions={showActions} + filterOptions={filterOptions} + handleIsLoading={handleIsLoading} + selectedCases={selectedCases} + refreshCases={refreshCases} + /> + <BasicTable + columns={columns} + data-test-subj="cases-table" + isSelectable={showActions} + itemId="id" + items={data.cases} + itemIdToExpandedRowMap={itemIdToExpandedRowMap} + loading={isCommentUpdating} + noItemsMessage={ + <EuiEmptyPrompt + title={<h3>{i18n.NO_CASES}</h3>} + titleSize="xs" + body={i18n.NO_CASES_BODY} + actions={ + <LinkButton + isDisabled={!userCanCrud} + fill + size="s" + onClick={goToCreateCase} + href={createCaseNavigation.href} + iconType="plusInCircle" + data-test-subj="cases-table-add-case" + > + {i18n.ADD_NEW_CASE} + </LinkButton> + } + /> + } + onChange={onChange} + pagination={pagination} + rowProps={tableRowProps} + selection={showActions ? selection : undefined} + sorting={sorting} + className={classnames({ isSelectorView })} + /> + </Div> + ); diff --git a/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx b/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx new file mode 100644 index 0000000000000..d0981c38385e9 --- /dev/null +++ b/x-pack/plugins/cases/public/components/all_cases/utility_bar.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent, useCallback, useEffect, useState } from 'react'; +import { EuiContextMenuPanel } from '@elastic/eui'; +import { + UtilityBar, + UtilityBarAction, + UtilityBarGroup, + UtilityBarSection, + UtilityBarText, +} from '../utility_bar'; +import * as i18n from './translations'; +import { AllCases, Case, DeleteCase, FilterOptions } from '../../../common'; +import { getBulkItems } from '../bulk_actions'; +import { isSelectedCasesIncludeCollections } from './helpers'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; + +interface OwnProps { + data: AllCases; + enableBulkActions: boolean; + filterOptions: FilterOptions; + handleIsLoading: (a: boolean) => void; + refreshCases?: (a?: boolean) => void; + selectedCases: Case[]; +} + +type Props = OwnProps; + +export const CasesTableUtilityBar: FunctionComponent<Props> = ({ + data, + enableBulkActions = false, + filterOptions, + handleIsLoading, + refreshCases, + selectedCases, +}) => { + const [deleteBulk, setDeleteBulk] = useState<DeleteCase[]>([]); + const [deleteThisCase, setDeleteThisCase] = useState<DeleteCase>({ + title: '', + id: '', + type: null, + }); + // Delete case + const { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isLoading: isDeleting, + isDeleted, + isDisplayConfirmDeleteModal, + } = useDeleteCases(); + + // Update case + const { + dispatchResetIsUpdated, + isLoading: isUpdating, + isUpdated, + updateBulkStatus, + } = useUpdateCases(); + + useEffect(() => { + handleIsLoading(isDeleting); + }, [handleIsLoading, isDeleting]); + + useEffect(() => { + handleIsLoading(isUpdating); + }, [handleIsLoading, isUpdating]); + useEffect(() => { + if (isDeleted) { + if (refreshCases != null) refreshCases(); + dispatchResetIsDeleted(); + } + if (isUpdated) { + if (refreshCases != null) refreshCases(); + dispatchResetIsUpdated(); + } + }, [isDeleted, isUpdated, refreshCases, dispatchResetIsDeleted, dispatchResetIsUpdated]); + + const toggleBulkDeleteModal = useCallback( + (cases: Case[]) => { + handleToggleModal(); + if (cases.length === 1) { + const singleCase = cases[0]; + if (singleCase) { + return setDeleteThisCase({ + id: singleCase.id, + title: singleCase.title, + type: singleCase.type, + }); + } + } + const convertToDeleteCases: DeleteCase[] = cases.map(({ id, title, type }) => ({ + id, + title, + type, + })); + setDeleteBulk(convertToDeleteCases); + }, + [setDeleteBulk, handleToggleModal] + ); + + const handleUpdateCaseStatus = useCallback( + (status: string) => { + updateBulkStatus(selectedCases, status); + }, + [selectedCases, updateBulkStatus] + ); + const getBulkItemsPopoverContent = useCallback( + (closePopover: () => void) => ( + <EuiContextMenuPanel + data-test-subj="cases-bulk-actions" + items={getBulkItems({ + caseStatus: filterOptions.status, + closePopover, + deleteCasesAction: toggleBulkDeleteModal, + selectedCases, + updateCaseStatus: handleUpdateCaseStatus, + includeCollections: isSelectedCasesIncludeCollections(selectedCases), + })} + /> + ), + [selectedCases, filterOptions.status, toggleBulkDeleteModal, handleUpdateCaseStatus] + ); + return ( + <UtilityBar border> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText data-test-subj="case-table-case-count"> + {i18n.SHOWING_CASES(data.total ?? 0)} + </UtilityBarText> + </UtilityBarGroup> + <UtilityBarGroup data-test-subj="case-table-utility-bar-actions"> + {enableBulkActions && ( + <> + <UtilityBarText data-test-subj="case-table-selected-case-count"> + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} + </UtilityBarText> + + <UtilityBarAction + data-test-subj="case-table-bulk-actions" + iconSide="right" + iconType="arrowDown" + popoverContent={getBulkItemsPopoverContent} + > + {i18n.BULK_ACTIONS} + </UtilityBarAction> + </> + )} + <UtilityBarAction iconSide="left" iconType="refresh" onClick={refreshCases}> + {i18n.REFRESH} + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + <ConfirmDeleteCaseModal + caseTitle={deleteThisCase.title} + isModalVisible={isDisplayConfirmDeleteModal} + isPlural={deleteBulk.length > 0} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind( + null, + deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] + )} + /> + </UtilityBar> + ); +}; diff --git a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx index 74d2a40f1ceb9..b8d9d7f85a9ef 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx @@ -35,21 +35,6 @@ const ActionsComponent: React.FC<CaseViewActions> = ({ isDisplayConfirmDeleteModal, } = useDeleteCases(); - const confirmDeleteModal = useMemo( - () => ( - <ConfirmDeleteCaseModal - caseTitle={caseData.title} - isModalVisible={isDisplayConfirmDeleteModal} - isPlural={false} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind(null, [ - { id: caseData.id, title: caseData.title, type: caseData.type }, - ])} - /> - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [isDisplayConfirmDeleteModal, caseData] - ); const propertyActions = useMemo( () => [ { @@ -78,7 +63,15 @@ const ActionsComponent: React.FC<CaseViewActions> = ({ return ( <> <PropertyActions propertyActions={propertyActions} /> - {confirmDeleteModal} + <ConfirmDeleteCaseModal + caseTitle={caseData.title} + isModalVisible={isDisplayConfirmDeleteModal} + isPlural={false} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind(null, [ + { id: caseData.id, title: caseData.title, type: caseData.type }, + ])} + /> </> ); }; diff --git a/x-pack/plugins/cases/public/components/case_view/index.test.tsx b/x-pack/plugins/cases/public/components/case_view/index.test.tsx index 08a8bcd2826df..3a0a2485e1977 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.test.tsx @@ -75,6 +75,7 @@ export const caseProps: CaseComponentProps = { }, caseDetailsNavigation: { href: 'case-details-href', + onClick: jest.fn(), }, caseId: basicCase.id, configureCasesNavigation: { @@ -411,6 +412,7 @@ describe('CaseView ', () => { }, caseDetailsNavigation: { href: 'case-details-href', + onClick: jest.fn(), }, caseId: '1234', configureCasesNavigation: { @@ -452,6 +454,7 @@ describe('CaseView ', () => { }, caseDetailsNavigation: { href: 'case-details-href', + onClick: jest.fn(), }, caseId: '1234', configureCasesNavigation: { @@ -490,6 +493,7 @@ describe('CaseView ', () => { }, caseDetailsNavigation: { href: 'case-details-href', + onClick: jest.fn(), }, caseId: '1234', configureCasesNavigation: { @@ -528,6 +532,7 @@ describe('CaseView ', () => { }, caseDetailsNavigation: { href: 'case-details-href', + onClick: jest.fn(), }, caseId: '1234', configureCasesNavigation: { diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index 99c1caf332018..fdba148e5c61e 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -158,14 +158,16 @@ const ConfigureCasesComponent: React.FC<ConfigureCasesProps> = ({ userCanCrud }) const ConnectorAddFlyout = useMemo( () => - triggersActionsUi.getAddConnectorFlyout({ - consumer: 'case', - onClose: onCloseAddFlyout, - actionTypes: supportedActionTypes, - reloadConnectors: onConnectorUpdate, - }), + addFlyoutVisible + ? triggersActionsUi.getAddConnectorFlyout({ + consumer: 'case', + onClose: onCloseAddFlyout, + actionTypes: supportedActionTypes, + reloadConnectors: onConnectorUpdate, + }) + : null, // eslint-disable-next-line react-hooks/exhaustive-deps - [supportedActionTypes] + [addFlyoutVisible, supportedActionTypes] ); const ConnectorEditFlyout = useMemo( @@ -215,7 +217,7 @@ const ConfigureCasesComponent: React.FC<ConfigureCasesProps> = ({ userCanCrud }) updateConnectorDisabled={updateConnectorDisabled || !userCanCrud} /> </SectionWrapper> - {addFlyoutVisible && ConnectorAddFlyout} + {ConnectorAddFlyout} {ConnectorEditFlyout} </FormWrapper> ); diff --git a/x-pack/plugins/cases/public/components/links/index.tsx b/x-pack/plugins/cases/public/components/links/index.tsx index 686e70478c1b7..310d700aa2a25 100644 --- a/x-pack/plugins/cases/public/components/links/index.tsx +++ b/x-pack/plugins/cases/public/components/links/index.tsx @@ -18,7 +18,7 @@ import * as i18n from './translations'; export interface CasesNavigation<T = React.MouseEvent | MouseEvent, K = null> { href: K extends 'configurable' ? (arg: T) => string : string; - onClick?: (arg: T) => void; + onClick: (arg: T) => void; } export const LinkButton: React.FC< @@ -45,8 +45,8 @@ const CaseDetailsLinkComponent: React.FC<{ const { href: getHref, onClick } = caseDetailsNavigation; const goToCaseDetails = useCallback( (ev) => { - ev.preventDefault(); if (onClick) { + ev.preventDefault(); onClick({ detailName, subCaseId }); } }, diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx index fcdc2f8e58774..661a0eedfeae4 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.test.tsx @@ -5,55 +5,15 @@ * 2.0. */ -import React, { ReactNode } from 'react'; +import React from 'react'; import { mount } from 'enzyme'; import { CreateCaseModal } from './create_case_modal'; import { TestProviders } from '../../common/mock'; +import { getCreateCaseLazy as getCreateCase } from '../../methods'; -jest.mock('../create/form_context', () => { - return { - FormContext: ({ - children, - onSuccess, - }: { - children: ReactNode; - onSuccess: ({ id }: { id: string }) => Promise<void>; - }) => { - return ( - <> - <button - type="button" - data-test-subj="form-context-on-success" - onClick={async () => { - await onSuccess({ id: 'case-id' }); - }} - > - {'submit'} - </button> - {children} - </> - ); - }, - }; -}); - -jest.mock('../create/form', () => { - return { - CreateCaseForm: () => { - return <>{'form'}</>; - }, - }; -}); - -jest.mock('../create/submit_button', () => { - return { - SubmitCaseButton: () => { - return <>{'Submit'}</>; - }, - }; -}); - +jest.mock('../../methods'); +const getCreateCaseMock = getCreateCase as jest.Mock; const onCloseCaseModal = jest.fn(); const onSuccess = jest.fn(); const defaultProps = { @@ -65,6 +25,7 @@ const defaultProps = { describe('CreateCaseModal', () => { beforeEach(() => { jest.resetAllMocks(); + getCreateCaseMock.mockReturnValue(<></>); }); it('renders', () => { @@ -74,7 +35,7 @@ describe('CreateCaseModal', () => { </TestProviders> ); - expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj='create-case-modal']`).exists()).toBeTruthy(); }); it('it does not render the modal isModalOpen=false ', () => { @@ -84,7 +45,7 @@ describe('CreateCaseModal', () => { </TestProviders> ); - expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); + expect(wrapper.find(`[data-test-subj='create-case-modal']`).exists()).toBeFalsy(); }); it('Closing modal calls onCloseCaseModal', () => { @@ -98,29 +59,18 @@ describe('CreateCaseModal', () => { expect(onCloseCaseModal).toBeCalled(); }); - it('pass the correct props to FormContext component', () => { - const wrapper = mount( + it('pass the correct props to getCreateCase method', () => { + mount( <TestProviders> <CreateCaseModal {...defaultProps} /> </TestProviders> ); - const props = wrapper.find('FormContext').props(); - expect(props).toEqual( + expect(getCreateCaseMock.mock.calls[0][0]).toEqual( expect.objectContaining({ onSuccess, + onCancel: onCloseCaseModal, }) ); }); - - it('onSuccess called when creating a case', () => { - const wrapper = mount( - <TestProviders> - <CreateCaseModal {...defaultProps} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj='form-context-on-success']`).first().simulate('click'); - expect(onSuccess).toHaveBeenCalledWith({ id: 'case-id' }); - }); }); diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx index 245db15d079f9..e78b432b3a27c 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx @@ -6,15 +6,12 @@ */ import React, { memo } from 'react'; -import styled from 'styled-components'; import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; -import { FormContext } from '../create/form_context'; -import { CreateCaseForm } from '../create/form'; -import { SubmitCaseButton } from '../create/submit_button'; import { Case } from '../../containers/types'; import * as i18n from '../../common/translations'; import { CaseType } from '../../../common'; +import { getCreateCaseLazy as getCreateCase } from '../../methods'; export interface CreateCaseModalProps { caseType?: CaseType; @@ -24,13 +21,6 @@ export interface CreateCaseModalProps { onSuccess: (theCase: Case) => Promise<void>; } -const Container = styled.div` - ${({ theme }) => ` - margin-top: ${theme.eui.euiSize}; - text-align: right; - `} -`; - const CreateModalComponent: React.FC<CreateCaseModalProps> = ({ caseType = CaseType.individual, hideConnectorServiceNowSir, @@ -39,24 +29,18 @@ const CreateModalComponent: React.FC<CreateCaseModalProps> = ({ onSuccess, }) => { return isModalOpen ? ( - <EuiModal onClose={onCloseCaseModal} data-test-subj="all-cases-modal"> + <EuiModal onClose={onCloseCaseModal} data-test-subj="create-case-modal"> <EuiModalHeader> <EuiModalHeaderTitle>{i18n.CREATE_TITLE}</EuiModalHeaderTitle> </EuiModalHeader> <EuiModalBody> - <FormContext - caseType={caseType} - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - onSuccess={onSuccess} - > - <CreateCaseForm - hideConnectorServiceNowSir={hideConnectorServiceNowSir} - withSteps={false} - /> - <Container> - <SubmitCaseButton /> - </Container> - </FormContext> + {getCreateCase({ + caseType, + hideConnectorServiceNowSir, + onCancel: onCloseCaseModal, + onSuccess, + withSteps: false, + })} </EuiModalBody> </EuiModal> ) : null; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx index df9e6f0af60d9..b227dd4b898b2 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.test.tsx @@ -5,58 +5,15 @@ * 2.0. */ -import React, { ReactNode } from 'react'; +import React from 'react'; import { renderHook, act } from '@testing-library/react-hooks'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; +import { render } from '@testing-library/react'; import { useKibana } from '../../common/lib/kibana'; import { useCreateCaseModal, UseCreateCaseModalProps, UseCreateCaseModalReturnedValues } from '.'; import { TestProviders } from '../../common/mock'; jest.mock('../../common/lib/kibana'); -jest.mock('../create/form_context', () => { - return { - FormContext: ({ - children, - onSuccess, - }: { - children: ReactNode; - onSuccess: ({ id }: { id: string }) => Promise<void>; - }) => { - return ( - <> - <button - type="button" - data-test-subj="form-context-on-success" - onClick={async () => { - await onSuccess({ id: 'case-id' }); - }} - > - {'Form submit'} - </button> - {children} - </> - ); - }, - }; -}); - -jest.mock('../create/form', () => { - return { - CreateCaseForm: () => { - return <>{'form'}</>; - }, - }; -}); - -jest.mock('../create/submit_button', () => { - return { - SubmitCaseButton: () => { - return <>{'Submit'}</>; - }, - }; -}); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; const onCaseCreated = jest.fn(); @@ -142,7 +99,7 @@ describe('useCreateCaseModal', () => { render(<TestProviders>{modal}</TestProviders>); act(() => { - userEvent.click(screen.getByText('Form submit')); + result.current.modal.props.onSuccess({ id: 'case-id' }); }); expect(result.current.isModalOpen).toBe(false); diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx index 7da3f49be721d..7ad85773a7917 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx @@ -6,8 +6,7 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import { CaseType } from '../../../common'; -import { Case } from '../../containers/types'; +import { Case, CaseType } from '../../../common'; import { CreateCaseModal } from './create_case_modal'; export interface UseCreateCaseModalProps { @@ -38,7 +37,7 @@ export const useCreateCaseModal = ({ [onCaseCreated, closeModal] ); - const state = useMemo( + return useMemo( () => ({ modal: ( <CreateCaseModal @@ -55,6 +54,4 @@ export const useCreateCaseModal = ({ }), [caseType, closeModal, hideConnectorServiceNowSir, isModalOpen, onSuccess, openModal] ); - - return state; }; diff --git a/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx b/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx new file mode 100644 index 0000000000000..104822dbee49d --- /dev/null +++ b/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { lazy, Suspense } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import { AllCasesSelectorModalProps } from '../components/all_cases/selector_modal'; + +export const getAllCasesSelectorModalLazy = (props: AllCasesSelectorModalProps) => { + const AllCasesSelectorModalLazy = lazy(() => import('../components/all_cases/selector_modal')); + return ( + <Suspense fallback={<EuiLoadingSpinner />}> + <AllCasesSelectorModalLazy {...props} /> + </Suspense> + ); +}; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts b/x-pack/plugins/cases/public/methods/index.ts similarity index 53% rename from x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts rename to x-pack/plugins/cases/public/methods/index.ts index 36db3c631100f..1d91e7c4df6d2 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts +++ b/x-pack/plugins/cases/public/methods/index.ts @@ -5,7 +5,9 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; -export const SELECT_CASE_TITLE = i18n.translate('xpack.securitySolution.cases.caseModal.title', { - defaultMessage: 'Select case', -}); +export * from './get_all_cases'; +export * from './get_create_case'; +export * from './get_case_view'; +export * from './get_configure_cases'; +export * from './get_recent_cases'; +export * from './get_all_cases_selector_modal'; diff --git a/x-pack/plugins/cases/public/plugin.ts b/x-pack/plugins/cases/public/plugin.ts index 0b309231117f6..8c9105961c130 100644 --- a/x-pack/plugins/cases/public/plugin.ts +++ b/x-pack/plugins/cases/public/plugin.ts @@ -9,11 +9,14 @@ import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core import { CasesUiStart, SetupPlugins, StartPlugins } from './types'; import { KibanaServices } from './common/lib/kibana'; import { getCaseConnectorUi } from './components/connectors'; -import { getAllCasesLazy } from './methods/get_all_cases'; -import { getCaseViewLazy } from './methods/get_case_view'; -import { getConfigureCasesLazy } from './methods/get_configure_cases'; -import { getCreateCaseLazy } from './methods/get_create_case'; -import { getRecentCasesLazy } from './methods/get_recent_cases'; +import { + getAllCasesLazy, + getCaseViewLazy, + getConfigureCasesLazy, + getCreateCaseLazy, + getRecentCasesLazy, + getAllCasesSelectorModalLazy, +} from './methods'; import { ENABLE_CASE_CONNECTOR } from '../common'; /** @@ -75,6 +78,14 @@ export class CasesUiPlugin implements Plugin<void, CasesUiStart, SetupPlugins, S getRecentCases: (props) => { return getRecentCasesLazy(props); }, + /** + * use Modal hook for all cases selector + * @param props UseAllCasesSelectorModalProps + * @return UseAllCasesSelectorModalReturnedValues + */ + getAllCasesSelectorModal: (props) => { + return getAllCasesSelectorModalLazy(props); + }, }; } diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index e92d940a02cef..269d1773b3404 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -17,6 +17,7 @@ import { CaseViewProps } from './components/case_view'; import { ConfigureCasesProps } from './components/configure_cases'; import { CreateCaseProps } from './components/create'; import { RecentCasesProps } from './components/recent_cases'; +import { AllCasesSelectorModalProps } from './components/all_cases/selector_modal'; export interface SetupPlugins { security: SecurityPluginSetup; @@ -40,6 +41,9 @@ export type StartServices = CoreStart & export interface CasesUiStart { getAllCases: (props: AllCasesProps) => ReactElement<AllCasesProps>; + getAllCasesSelectorModal: ( + props: AllCasesSelectorModalProps + ) => ReactElement<AllCasesSelectorModalProps>; getCaseView: (props: CaseViewProps) => ReactElement<CaseViewProps>; getConfigureCases: (props: ConfigureCasesProps) => ReactElement<ConfigureCasesProps>; getCreateCase: (props: CreateCaseProps) => ReactElement<CreateCaseProps>; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 00209b7d29e98..60fa0e4aafd8e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -8,7 +8,6 @@ import React, { useCallback } from 'react'; import { useHistory } from 'react-router-dom'; -import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../../cases/common'; import { getCaseDetailsUrl, getConfigureCasesUrl, @@ -26,71 +25,55 @@ export interface AllCasesNavProps { } interface AllCasesProps { - alertData?: Omit<CommentRequestAlertType, 'type'>; - disabledStatuses?: CaseStatuses[]; - isModal?: boolean; - onRowClick?: (theCase?: Case | SubCase) => void; - updateCase?: (newCase: Case) => void; userCanCrud: boolean; } -export const AllCases = React.memo<AllCasesProps>( - ({ alertData, disabledStatuses, isModal = false, onRowClick, updateCase, userCanCrud }) => { - const { - cases: casesUi, - application: { navigateToApp }, - } = useKibana().services; - const history = useHistory(); - const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.case); +export const AllCases = React.memo<AllCasesProps>(({ userCanCrud }) => { + const { + cases: casesUi, + application: { navigateToApp }, + } = useKibana().services; + const history = useHistory(); + const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.case); - const goToCreateCase = useCallback( - (ev) => { - ev.preventDefault(); - if (isModal && onRowClick != null) { - onRowClick(); - } else { - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCreateCaseUrl(urlSearch), - }); - } - }, - [navigateToApp, isModal, onRowClick, urlSearch] - ); + const goToCreateCase = useCallback( + (ev) => { + ev.preventDefault(); + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCreateCaseUrl(urlSearch), + }); + }, + [navigateToApp, urlSearch] + ); - const goToCaseConfigure = useCallback( - (ev) => { - ev.preventDefault(); - history.push(getConfigureCasesUrl(urlSearch)); - }, - [history, urlSearch] - ); + const goToCaseConfigure = useCallback( + (ev) => { + ev.preventDefault(); + history.push(getConfigureCasesUrl(urlSearch)); + }, + [history, urlSearch] + ); - return casesUi.getAllCases({ - alertData, - caseDetailsNavigation: { - href: ({ detailName, subCaseId }: AllCasesNavProps) => { - return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); - }, - onClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), - }); - }, - }, - configureCasesNavigation: { - href: formatUrl(getConfigureCasesUrl()), - onClick: goToCaseConfigure, + return casesUi.getAllCases({ + caseDetailsNavigation: { + href: ({ detailName, subCaseId }: AllCasesNavProps) => { + return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); }, - createCaseNavigation: { - href: formatUrl(getCreateCaseUrl()), - onClick: goToCreateCase, + onClick: ({ detailName, subCaseId, search }: AllCasesNavProps) => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), + }); }, - disabledStatuses, - isModal, - onRowClick, - updateCase, - userCanCrud, - }); - } -); + }, + configureCasesNavigation: { + href: formatUrl(getConfigureCasesUrl()), + onClick: goToCaseConfigure, + }, + createCaseNavigation: { + href: formatUrl(getCreateCaseUrl()), + onClick: goToCreateCase, + }, + userCanCrud, + }); +}); AllCases.displayName = 'AllCases'; diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index 1e1d4019a66e9..b6557154a1302 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -210,6 +210,11 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = }, caseDetailsNavigation: { href: caseDetailsLink, + onClick: () => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCaseDetailsUrl({ id: caseId }), + }); + }, }, caseId, configureCasesNavigation: { diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx index 3001020acfb6e..09c94b643e8d9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx @@ -13,12 +13,20 @@ import { useKibana, useGetUserSavedObjectPermissions } from '../../../common/lib import { useStateToaster } from '../../../common/components/toasters'; import { TestProviders } from '../../../common/mock'; import { AddToCaseAction } from './add_to_case_action'; -import { useAllCasesModal } from '../use_all_cases_modal'; import { basicCase } from '../../../../../cases/public/containers/mock'; -import { Case } from '../../../../../cases/public/containers/types'; +import { Case } from '../../../../../cases/common'; jest.mock('../../../common/lib/kibana'); - +jest.mock('../../../common/components/link_to', () => { + const original = jest.requireActual('../../../common/components/link_to'); + return { + ...original, + useFormatUrl: jest.fn().mockReturnValue({ + formatUrl: jest.fn(), + search: '', + }), + }; +}); jest.mock('../../../common/components/toasters', () => { const actual = jest.requireActual('../../../common/components/toasters'); return { @@ -27,8 +35,7 @@ jest.mock('../../../common/components/toasters', () => { }; }); -jest.mock('../use_all_cases_modal'); - +const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; describe('AddToCaseAction', () => { const props = { ecsRowData: { @@ -41,24 +48,20 @@ describe('AddToCaseAction', () => { const mockDispatchToaster = jest.fn(); const mockNavigateToApp = jest.fn(); const mockCreateCase = jest.fn(); - const mockUseCasesModal = useAllCasesModal as jest.Mock; const mockAllCasesModal = jest.fn(); beforeEach(() => { jest.clearAllMocks(); - mockUseCasesModal.mockReturnValue({ - modal: <></>, - openModal: mockAllCasesModal, - }); + useKibanaMock().services.application.navigateToApp = mockNavigateToApp; + useKibanaMock().services.cases = { + getAllCases: jest.fn(), + getCaseView: jest.fn(), + getConfigureCases: jest.fn(), + getRecentCases: jest.fn(), + getCreateCase: mockCreateCase, + getAllCasesSelectorModal: mockAllCasesModal.mockImplementation(() => <>{'test'}</>), + }; (useStateToaster as jest.Mock).mockReturnValue([jest.fn(), mockDispatchToaster]); - (useKibana as jest.Mock).mockReturnValue({ - services: { - application: { navigateToApp: mockNavigateToApp }, - cases: { - getCreateCase: mockCreateCase, - }, - }, - }); (useGetUserSavedObjectPermissions as jest.Mock).mockReturnValue({ crud: true, read: true, @@ -109,7 +112,7 @@ describe('AddToCaseAction', () => { wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); wrapper.find(`[data-test-subj="add-existing-case-menu-item"]`).first().simulate('click'); - expect(mockUseCasesModal.mock.calls[0][0].alertData).toEqual({ + expect(mockAllCasesModal.mock.calls[0][0].alertData).toEqual({ alertId: 'test-id', index: 'test-index', rule: { id: 'rule-id', name: 'rule-name' }, @@ -131,8 +134,8 @@ describe('AddToCaseAction', () => { ); wrapper.find(`[data-test-subj="attach-alert-to-case-button"]`).first().simulate('click'); - wrapper.find(`[data-test-subj="add-new-case-item"]`).first().simulate('click'); - expect(mockUseCasesModal.mock.calls[0][0].alertData).toEqual({ + wrapper.find(`[data-test-subj="add-existing-case-menu-item"]`).first().simulate('click'); + expect(mockAllCasesModal.mock.calls[0][0].alertData).toEqual({ alertId: 'test-id', index: 'test-index', rule: { id: 'rule-id', name: null }, @@ -140,16 +143,14 @@ describe('AddToCaseAction', () => { }); it('onSuccess triggers toaster that links to case view', () => { - (useKibana as jest.Mock).mockReturnValue({ - services: { - application: { navigateToApp: mockNavigateToApp }, - cases: { - getCreateCase: ({ onSuccess }: { onSuccess: (theCase: Case) => Promise<void> }) => { - onSuccess(basicCase); - }, - }, - }, - }); + // @ts-ignore + useKibanaMock().services.cases.getCreateCase = ({ + onSuccess, + }: { + onSuccess: (theCase: Case) => Promise<void>; + }) => { + onSuccess(basicCase); + }; const wrapper = mount( <TestProviders> <AddToCaseAction {...props} /> diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx index e1e59c370c6b6..c4dc30dcf4966 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx @@ -20,13 +20,16 @@ import { Case, CaseStatuses } from '../../../../../cases/common'; import { APP_ID } from '../../../../common/constants'; import { Ecs } from '../../../../common/ecs'; import { SecurityPageName } from '../../../app/types'; -import { getCaseDetailsUrl } from '../../../common/components/link_to'; +import { + getCaseDetailsUrl, + getCreateCaseUrl, + useFormatUrl, +} from '../../../common/components/link_to'; import { useStateToaster } from '../../../common/components/toasters'; import { useControl } from '../../../common/hooks/use_control'; import { useGetUserSavedObjectPermissions, useKibana } from '../../../common/lib/kibana'; import { ActionIconItem } from '../../../timelines/components/timeline/body/actions/action_icon_item'; import { CreateCaseFlyout } from '../create/flyout'; -import { useAllCasesModal } from '../use_all_cases_modal'; import { createUpdateSuccessToaster } from './helpers'; import * as i18n from './translations'; @@ -43,7 +46,10 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ const eventIndex = ecsRowData._index; const rule = ecsRowData.signal?.rule; - const { navigateToApp } = useKibana().services.application; + const { + application: { navigateToApp }, + cases, + } = useKibana().services; const [, dispatchToaster] = useStateToaster(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); const openPopover = useCallback(() => setIsPopoverOpen(true), []); @@ -85,6 +91,18 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ [closeCaseFlyoutOpen, dispatchToaster, onViewCaseClick] ); + const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.case); + const goToCreateCase = useCallback( + (ev) => { + ev.preventDefault(); + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCreateCaseUrl(urlSearch), + }); + }, + [navigateToApp, urlSearch] + ); + const [isAllCaseModalOpen, openAllCaseModal] = useState(false); + const onCaseClicked = useCallback( (theCase) => { /** @@ -95,24 +113,10 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ if (theCase == null) { openCaseFlyoutOpen(); } + openAllCaseModal(false); }, [openCaseFlyoutOpen] ); - - const { modal: allCasesModal, openModal: openAllCaseModal } = useAllCasesModal({ - alertData: { - alertId: eventId, - index: eventIndex ?? '', - rule: { - id: rule?.id != null ? rule.id[0] : null, - name: rule?.name != null ? rule.name[0] : null, - }, - }, - disabledStatuses: [CaseStatuses.closed], - onRowClick: onCaseClicked, - updateCase: onCaseSuccess, - }); - const addNewCaseClick = useCallback(() => { closePopover(); openCaseFlyoutOpen(); @@ -120,7 +124,7 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ const addExistingCaseClick = useCallback(() => { closePopover(); - openAllCaseModal(); + openAllCaseModal(true); }, [openAllCaseModal, closePopover]); const items = useMemo( @@ -181,7 +185,25 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ {isCreateCaseFlyoutOpen && ( <CreateCaseFlyout onCloseFlyout={closeCaseFlyoutOpen} onSuccess={onCaseSuccess} /> )} - {allCasesModal} + {isAllCaseModalOpen && + cases.getAllCasesSelectorModal({ + alertData: { + alertId: eventId, + index: eventIndex ?? '', + rule: { + id: rule?.id != null ? rule.id[0] : null, + name: rule?.name != null ? rule.name[0] : null, + }, + }, + createCaseNavigation: { + href: formatUrl(getCreateCaseUrl()), + onClick: goToCreateCase, + }, + disabledStatuses: [CaseStatuses.closed], + onRowClick: onCaseClicked, + updateCase: onCaseSuccess, + userCanCrud: userPermissions?.crud ?? false, + })} </> ); }; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx deleted file mode 100644 index 76c7cb7ef3a6a..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/display-name */ -import { mount } from 'enzyme'; -import React from 'react'; -import '../../../common/mock/match_media'; -import { AllCasesModal } from './all_cases_modal'; -import { TestProviders } from '../../../common/mock'; - -jest.mock('../all_cases', () => { - return { - AllCases: ({ onRowClick }: { onRowClick: ({ id }: { id: string }) => void }) => { - return ( - <button - type="button" - data-test-subj="all-cases-row" - onClick={() => onRowClick({ id: 'case-id' })} - > - {'case-row'} - </button> - ); - }, - }; -}); - -jest.mock('../../../common/lib/kibana', () => { - const originalModule = jest.requireActual('../../../common/lib/kibana'); - return { - ...originalModule, - useGetUserSavedObjectPermissions: jest.fn(), - }; -}); - -const onCloseCaseModal = jest.fn(); -const onRowClick = jest.fn(); -const defaultProps = { - alertData: { - alertId: '123', - index: '123', - rule: { id: '123', name: '123' }, - }, - isModalOpen: true, - onCloseCaseModal, - onRowClick, -}; - -describe('AllCasesModal', () => { - beforeEach(() => { - jest.resetAllMocks(); - }); - - it('renders', () => { - const wrapper = mount( - <TestProviders> - <AllCasesModal {...defaultProps} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); - }); - - it('it does not render the modal isModalOpen=false ', () => { - const wrapper = mount( - <TestProviders> - <AllCasesModal {...defaultProps} isModalOpen={false} /> - </TestProviders> - ); - - expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); - }); - - it('Closing modal calls onCloseCaseModal', () => { - const wrapper = mount( - <TestProviders> - <AllCasesModal {...defaultProps} /> - </TestProviders> - ); - - wrapper.find('.euiModal__closeIcon').first().simulate('click'); - expect(onCloseCaseModal).toBeCalled(); - }); - - it('pass the correct props to AllCases component', () => { - const wrapper = mount( - <TestProviders> - <AllCasesModal {...defaultProps} /> - </TestProviders> - ); - - const props = wrapper.find('AllCases').props(); - expect(props).toEqual({ - alertData: defaultProps.alertData, - userCanCrud: false, - onRowClick, - isModal: true, - disabledStatuses: undefined, - updateCase: undefined, - }); - }); - - it('onRowClick called when row is clicked', () => { - const wrapper = mount( - <TestProviders> - <AllCasesModal {...defaultProps} /> - </TestProviders> - ); - - wrapper.find(`[data-test-subj='all-cases-row']`).first().simulate('click'); - expect(onRowClick).toHaveBeenCalledWith({ id: 'case-id' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx deleted file mode 100644 index d1d2a1c8c9a7f..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/display-name */ -import React from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import { useKibana } from '../../../common/lib/kibana'; -import '../../../common/mock/match_media'; -import { useAllCasesModal, UseAllCasesModalProps, UseAllCasesModalReturnedValues } from '.'; -import { mockTimelineModel, TestProviders } from '../../../common/mock'; -import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; - -const mockDispatch = jest.fn(); -jest.mock('react-redux', () => { - const original = jest.requireActual('react-redux'); - return { - ...original, - useDispatch: () => mockDispatch, - }; -}); - -jest.mock('../../../common/lib/kibana'); -jest.mock('../all_cases', () => { - return { - AllCases: ({ onRowClick }: { onRowClick: ({ id }: { id: string }) => void }) => { - return ( - <button type="button" onClick={() => onRowClick({ id: 'case-id' })}> - {'case-row'} - </button> - ); - }, - }; -}); - -jest.mock('../../../common/hooks/use_selector'); - -const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; -const onRowClick = jest.fn(); -const closeModal = jest.fn(); -const openModal = jest.fn(); -const defaultArgs = { - onRowClick, - closeModal, - openModal, - isModalOpen: true, -}; - -describe('useAllCasesModal', () => { - let navigateToApp: jest.Mock; - - beforeEach(() => { - navigateToApp = jest.fn(); - useKibanaMock().services.application.navigateToApp = navigateToApp; - (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); - }); - - it('init', async () => { - const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal(defaultArgs), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - expect(result.current.isModalOpen).toBe(false); - }); - - it('opens the modal', async () => { - const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal(defaultArgs), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - act(() => { - result.current.openModal(); - }); - - expect(result.current.isModalOpen).toBe(true); - }); - - it('closes the modal', async () => { - const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal(defaultArgs), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - act(() => { - result.current.openModal(); - result.current.closeModal(); - }); - - expect(result.current.isModalOpen).toBe(false); - }); - - it('returns a memoized value', async () => { - const { result, rerender } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal(defaultArgs), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - const result1 = result.current; - act(() => rerender()); - const result2 = result.current; - - expect(Object.is(result1, result2)).toBe(true); - }); - - it('closes the modal when clicking a row', async () => { - const { result } = renderHook<UseAllCasesModalProps, UseAllCasesModalReturnedValues>( - () => useAllCasesModal(defaultArgs), - { - wrapper: ({ children }) => <TestProviders>{children}</TestProviders>, - } - ); - - act(() => { - result.current.openModal(); - }); - - const modal = result.current.modal; - render(<TestProviders>{modal}</TestProviders>); - - act(() => { - userEvent.click(screen.getByText('case-row')); - }); - - expect(result.current.isModalOpen).toBe(false); - expect(onRowClick).toHaveBeenCalledWith({ id: 'case-id' }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx deleted file mode 100644 index 597abf5804b41..0000000000000 --- a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useState, useCallback, useMemo } from 'react'; -import { Case, CaseStatuses, CommentRequestAlertType, SubCase } from '../../../../../cases/common'; -import { AllCasesModal } from './all_cases_modal'; - -export interface UseAllCasesModalProps { - alertData?: Omit<CommentRequestAlertType, 'type'>; - disabledStatuses?: CaseStatuses[]; - onRowClick: (theCase?: Case | SubCase) => void; - updateCase?: (newCase: Case) => void; -} - -export interface UseAllCasesModalReturnedValues { - modal: JSX.Element; - isModalOpen: boolean; - closeModal: () => void; - openModal: () => void; -} - -export const useAllCasesModal = ({ - alertData, - disabledStatuses, - onRowClick, - updateCase, -}: UseAllCasesModalProps): UseAllCasesModalReturnedValues => { - const [isModalOpen, setIsModalOpen] = useState<boolean>(false); - const closeModal = useCallback(() => setIsModalOpen(false), []); - const openModal = useCallback(() => setIsModalOpen(true), []); - const onClick = useCallback( - (theCase?: Case | SubCase) => { - closeModal(); - onRowClick(theCase); - }, - [closeModal, onRowClick] - ); - - const state = useMemo( - () => ({ - modal: ( - <AllCasesModal - alertData={alertData} - disabledStatuses={disabledStatuses} - isModalOpen={isModalOpen} - onCloseCaseModal={closeModal} - onRowClick={onClick} - updateCase={updateCase} - /> - ), - isModalOpen, - closeModal, - openModal, - onRowClick, - }), - [ - alertData, - closeModal, - disabledStatuses, - isModalOpen, - onClick, - onRowClick, - openModal, - updateCase, - ] - ); - - return state; -}; diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx index 6d01e2138bb95..bcf9953d70d83 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx @@ -51,6 +51,11 @@ const RecentCasesComponent = () => { }, createCaseNavigation: { href: formatUrl(getCreateCaseUrl()), + onClick: () => { + navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: getCreateCaseUrl(), + }); + }, }, maxCasesToShow: MAX_CASES_TO_SHOW, }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx index b959e80e2cc98..bc9876b207284 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx @@ -11,9 +11,18 @@ import { mount } from 'enzyme'; import { useKibana } from '../../../../common/lib/kibana'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import { mockTimelineModel, TestProviders } from '../../../../common/mock'; -import { useAllCasesModal } from '../../../../cases/components/use_all_cases_modal'; import { AddToCaseButton } from '.'; +jest.mock('../../../../common/components/link_to', () => { + const original = jest.requireActual('../../../../common/components/link_to'); + return { + ...original, + useFormatUrl: jest.fn().mockReturnValue({ + formatUrl: jest.fn(), + search: '', + }), + }; +}); const mockDispatch = jest.fn(); jest.mock('react-redux', () => { const original = jest.requireActual('react-redux'); @@ -25,57 +34,51 @@ jest.mock('react-redux', () => { jest.mock('../../../../common/lib/kibana'); jest.mock('../../../../common/hooks/use_selector'); -jest.mock('../../../../cases/components/use_all_cases_modal'); const useKibanaMock = useKibana as jest.Mocked<typeof useKibana>; -const useAllCasesModalMock = useAllCasesModal as jest.Mock; -describe('EventColumnView', () => { +describe('AddToCaseButton', () => { const navigateToApp = jest.fn(); beforeEach(() => { useKibanaMock().services.application.navigateToApp = navigateToApp; - (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); }); it('navigates to the correct path without id', async () => { - useAllCasesModalMock.mockImplementation(({ onRowClick }) => { - onRowClick(); - - return { - modal: <>{'test'}</>, - openModal: jest.fn(), - isModalOpen: true, - closeModal: jest.fn(), - }; - }); - - mount( + const here = jest.fn(); + useKibanaMock().services.cases.getAllCasesSelectorModal = here.mockImplementation( + ({ onRowClick }) => { + onRowClick(); + return <></>; + } + ); + (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); + const wrapper = mount( <TestProviders> <AddToCaseButton timelineId={'timeline-1'} /> </TestProviders> ); + wrapper.find(`[data-test-subj="attach-timeline-case-button"]`).first().simulate('click'); + wrapper.find(`[data-test-subj="attach-timeline-existing-case"]`).first().simulate('click'); expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/create' }); }); it('navigates to the correct path with id', async () => { - useAllCasesModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'case-id' }); - - return { - modal: <>{'test'}</>, - openModal: jest.fn(), - isModalOpen: true, - closeModal: jest.fn(), - }; - }); - - mount( + useKibanaMock().services.cases.getAllCasesSelectorModal = jest + .fn() + .mockImplementation(({ onRowClick }) => { + onRowClick({ id: 'case-id' }); + return <></>; + }); + (useDeepEqualSelector as jest.Mock).mockReturnValue(mockTimelineModel); + const wrapper = mount( <TestProviders> <AddToCaseButton timelineId={'timeline-1'} /> </TestProviders> ); + wrapper.find(`[data-test-subj="attach-timeline-case-button"]`).first().simulate('click'); + wrapper.find(`[data-test-subj="attach-timeline-existing-case"]`).first().simulate('click'); expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/case-id' }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx index 67463b8d909e7..7fa2ec07b0ea2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx @@ -13,12 +13,15 @@ import { useDispatch } from 'react-redux'; import { Case, SubCase } from '../../../../../../cases/common'; import { APP_ID } from '../../../../../common/constants'; import { timelineSelectors } from '../../../../timelines/store/timeline'; -import { useAllCasesModal } from '../../../../cases/components/use_all_cases_modal'; import { setInsertTimeline, showTimeline } from '../../../store/timeline/actions'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; -import { useKibana } from '../../../../common/lib/kibana'; +import { useGetUserSavedObjectPermissions, useKibana } from '../../../../common/lib/kibana'; import { TimelineStatus, TimelineId, TimelineType } from '../../../../../common/types/timeline'; -import { getCreateCaseUrl, getCaseDetailsUrl } from '../../../../common/components/link_to'; +import { + getCreateCaseUrl, + getCaseDetailsUrl, + useFormatUrl, +} from '../../../../common/components/link_to'; import { SecurityPageName } from '../../../../app/types'; import { timelineDefaults } from '../../../../timelines/store/timeline/defaults'; import * as i18n from '../../timeline/properties/translations'; @@ -29,7 +32,10 @@ interface Props { const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { const getTimeline = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []); - const { navigateToApp } = useKibana().services.application; + const { + cases, + application: { navigateToApp }, + } = useKibana().services; const dispatch = useDispatch(); const { graphEventId, @@ -44,13 +50,14 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { ) ); const [isPopoverOpen, setPopover] = useState(false); + const [isCaseModalOpen, openCaseModal] = useState(false); const onRowClick = useCallback( async (theCase?: Case | SubCase) => { + openCaseModal(false); await navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { path: theCase != null ? getCaseDetailsUrl({ id: theCase.id }) : getCreateCaseUrl(), }); - dispatch( setInsertTimeline({ graphEventId, @@ -63,7 +70,15 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { [dispatch, graphEventId, navigateToApp, savedObjectId, timelineId, timelineTitle] ); - const { modal: allCasesModal, openModal: openCaseModal } = useAllCasesModal({ onRowClick }); + const { formatUrl } = useFormatUrl(SecurityPageName.case); + const userPermissions = useGetUserSavedObjectPermissions(); + const goToCreateCase = useCallback( + (ev) => { + ev.preventDefault(); + onRowClick(); + }, + [onRowClick] + ); const handleButtonClick = useCallback(() => { setPopover((currentIsOpen) => !currentIsOpen); @@ -100,7 +115,7 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { const handleExistingCaseClick = useCallback(() => { handlePopoverClose(); - openCaseModal(); + openCaseModal(true); }, [openCaseModal, handlePopoverClose]); const closePopover = useCallback(() => { @@ -156,7 +171,15 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { > <EuiContextMenuPanel items={items} /> </EuiPopover> - {allCasesModal} + {isCaseModalOpen && + cases.getAllCasesSelectorModal({ + createCaseNavigation: { + href: formatUrl(getCreateCaseUrl()), + onClick: goToCreateCase, + }, + onRowClick, + userCanCrud: userPermissions?.crud ?? false, + })} </> ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3f43c2d3a5c75..a55fc76f8e9fd 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -17824,7 +17824,6 @@ "xpack.securitySolution.cases.allCases.actions": "アクション", "xpack.securitySolution.cases.allCases.comments": "コメント", "xpack.securitySolution.cases.allCases.noTagsAvailable": "利用可能なタグがありません", - "xpack.securitySolution.cases.caseModal.title": "ケースを選択", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsMessage": "ケースを表示するには、Kibana スペースで保存されたオブジェクト管理機能の権限が必要です。詳細については、Kibana管理者に連絡してください。", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsTitle": "Kibana機能権限が必要です", "xpack.securitySolution.cases.caseTable.caseDetailsLinkAria": "クリックすると、タイトル{detailName}のケースを表示します", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 52faae2b79700..5e5f408076255 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -18078,7 +18078,6 @@ "xpack.securitySolution.cases.allCases.actions": "操作", "xpack.securitySolution.cases.allCases.comments": "注释", "xpack.securitySolution.cases.allCases.noTagsAvailable": "没有可用标签", - "xpack.securitySolution.cases.caseModal.title": "选择案例", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsMessage": "要查看案例,必须对 Kibana 工作区中的已保存对象管理功能有权限。有关详细信息,请联系您的 Kibana 管理员。", "xpack.securitySolution.cases.caseSavedObjectNoPermissionsTitle": "需要 Kibana 功能权限", "xpack.securitySolution.cases.caseTable.caseDetailsLinkAria": "单击以访问标题为 {detailName} 的案例", From 4d9bf4632dc7fc7a09d429f51f4c9fc6179489d3 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Thu, 22 Apr 2021 07:53:15 -0600 Subject: [PATCH 45/52] readme changes --- x-pack/plugins/cases/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index 61e1c83b63f51..14afe89829a68 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -74,8 +74,8 @@ Arguments: |alertData?|`Omit<CommentRequestAlertType, 'type'>;` alert data to post to case |createCaseNavigation|`CasesNavigation` route configuration for create cases page |disabledStatuses?|`CaseStatuses[];` array of disabled statuses -|onRowClick|`(theCase?: Case ! SubCase) => void;` callback for row click, passing case in row -|updateCase?|`(theCase: Case ! SubCase) => void;` callback after case has been updated +|onRowClick|<code>(theCase?: Case | SubCase) => void;</code> callback for row click, passing case in row +|updateCase?|<code>(theCase: Case | SubCase) => void;</code> callback after case has been updated |userCanCrud|`boolean;` user permissions to crud UI component: @@ -93,7 +93,7 @@ Arguments: |getCaseDetailHrefWithCommentId|`(commentId: string) => string;` callback to generate the case details url with a comment id reference from the case id and comment id |onComponentInitialized?|`() => void;` callback when component has initialized |onCaseDataSuccess?| `(data: Case) => void;` optional callback to handle case data in consuming application -|ruleDetailsNavigation| `CasesNavigation<string \| null \| undefined, 'configurable'>` +|ruleDetailsNavigation| <code>CasesNavigation<string | null | undefined, 'configurable'></code> |showAlertDetails| `(alertId: string, index: string) => void;` callback to show alert details |subCaseId?| `string;` subcase id |timelineIntegration?.editor_plugins| Plugins needed for integrating timeline into markdown editor. @@ -143,7 +143,7 @@ Arguments: |---|---| |allCasesNavigation|`CasesNavigation` route configuration for configure cases page |caseDetailsNavigation|`CasesNavigation<CaseDetailsHrefSchema, 'configurable'>` route configuration to generate the case details url for the case details page -|createCaseNavigation|`CasesNavigation` +|createCaseNavigation|`CasesNavigation` route configuration for create case page |maxCasesToShow|`number;` number of cases to show in widget UI component: From 4b85082fefc14f9351bebe14201f443f67c9ec6f Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Mon, 26 Apr 2021 08:36:48 -0600 Subject: [PATCH 46/52] pr changes 1 --- .../public/common/mock/kibana_react.mock.ts | 23 ------------------- .../public/common/mock/test_providers.tsx | 5 +++- .../components/markdown_editor/types.ts | 19 --------------- .../components/markdown_editor/use_plugins.ts | 2 +- .../markdown_editor/plugins/index.ts | 19 +-------------- 5 files changed, 6 insertions(+), 62 deletions(-) delete mode 100644 x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts diff --git a/x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts b/x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts deleted file mode 100644 index 274462aec575d..0000000000000 --- a/x-pack/plugins/cases/public/common/mock/kibana_react.mock.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CoreStart } from 'kibana/public'; -import { coreMock } from '../../../../../../src/core/public/mocks'; -import React from 'react'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public/context'; - -export const createStartServicesMock = (): CoreStart => { - const core = coreMock.createStart(); - return (core as unknown) as CoreStart; -}; -export const createKibanaContextProviderMock = () => { - const services = coreMock.createStart(); - - return ({ children }: { children: React.ReactNode }) => - React.createElement(KibanaContextProvider, { services }, children); -}; diff --git a/x-pack/plugins/cases/public/common/mock/test_providers.tsx b/x-pack/plugins/cases/public/common/mock/test_providers.tsx index 4e40f3b3cb745..94ee5dd4f2743 100644 --- a/x-pack/plugins/cases/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/cases/public/common/mock/test_providers.tsx @@ -10,7 +10,10 @@ import { I18nProvider } from '@kbn/i18n/react'; import React from 'react'; import { BehaviorSubject } from 'rxjs'; import { ThemeProvider } from 'styled-components'; -import { createKibanaContextProviderMock, createStartServicesMock } from './kibana_react.mock'; +import { + createKibanaContextProviderMock, + createStartServicesMock, +} from '../lib/kibana/kibana_react.mock'; import { FieldHook } from '../shared_imports'; interface Props { diff --git a/x-pack/plugins/cases/public/components/markdown_editor/types.ts b/x-pack/plugins/cases/public/components/markdown_editor/types.ts index bb932f2fcfe22..8a30a4a143f54 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/types.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/types.ts @@ -5,26 +5,7 @@ * 2.0. */ -import { FunctionComponent } from 'react'; -import { Plugin, PluggableList } from 'unified'; -// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 -// eslint-disable-next-line import/no-extraneous-dependencies -import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; -// eslint-disable-next-line import/no-extraneous-dependencies -import rehype2react from 'rehype-react'; -import { EuiLinkAnchorProps } from '@elastic/eui'; export interface CursorPosition { start: number; end: number; } - -export type TemporaryProcessingPluginsType = [ - [Plugin, Remark2RehypeOptions], - [ - typeof rehype2react, - Parameters<typeof rehype2react>[0] & { - components: { a: FunctionComponent<EuiLinkAnchorProps>; timeline: unknown }; - } - ], - ...PluggableList -]; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts index e98af8bca8bce..39ca920fb1c04 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts @@ -20,7 +20,7 @@ export const usePlugins = () => { return useMemo(() => { const uiPlugins = getDefaultEuiMarkdownUiPlugins(); const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); - const processingPlugins = getDefaultEuiMarkdownProcessingPlugins() as TemporaryProcessingPluginsType; + const processingPlugins = getDefaultEuiMarkdownProcessingPlugins(); if (timelinePlugins) { uiPlugins.push(timelinePlugins.uiPlugin); diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts index c744ace91f434..9cb47c8d95122 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts @@ -6,33 +6,16 @@ */ import { - EuiLinkAnchorProps, getDefaultEuiMarkdownParsingPlugins, getDefaultEuiMarkdownProcessingPlugins, getDefaultEuiMarkdownUiPlugins, } from '@elastic/eui'; -// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 -// eslint-disable-next-line import/no-extraneous-dependencies -import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; -import { FunctionComponent } from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies -import rehype2react from 'rehype-react'; -import { Plugin, PluggableList } from 'unified'; import * as timelineMarkdownPlugin from './timeline'; export const { uiPlugins, parsingPlugins, processingPlugins } = { uiPlugins: getDefaultEuiMarkdownUiPlugins(), parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), - processingPlugins: getDefaultEuiMarkdownProcessingPlugins() as [ - [Plugin, Remark2RehypeOptions], - [ - typeof rehype2react, - Parameters<typeof rehype2react>[0] & { - components: { a: FunctionComponent<EuiLinkAnchorProps>; timeline: unknown }; - } - ], - ...PluggableList - ], + processingPlugins: getDefaultEuiMarkdownProcessingPlugins(), }; uiPlugins.push(timelineMarkdownPlugin.plugin); From 870610c5a5fab59b0b7727303e8bad4e4770342d Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Mon, 26 Apr 2021 08:42:41 -0600 Subject: [PATCH 47/52] ok undo --- .../components/markdown_editor/types.ts | 19 +++++++++++++++++++ .../components/markdown_editor/use_plugins.ts | 2 +- .../markdown_editor/plugins/index.ts | 19 ++++++++++++++++++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/cases/public/components/markdown_editor/types.ts b/x-pack/plugins/cases/public/components/markdown_editor/types.ts index 8a30a4a143f54..bb932f2fcfe22 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/types.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/types.ts @@ -5,7 +5,26 @@ * 2.0. */ +import { FunctionComponent } from 'react'; +import { Plugin, PluggableList } from 'unified'; +// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 +// eslint-disable-next-line import/no-extraneous-dependencies +import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; +// eslint-disable-next-line import/no-extraneous-dependencies +import rehype2react from 'rehype-react'; +import { EuiLinkAnchorProps } from '@elastic/eui'; export interface CursorPosition { start: number; end: number; } + +export type TemporaryProcessingPluginsType = [ + [Plugin, Remark2RehypeOptions], + [ + typeof rehype2react, + Parameters<typeof rehype2react>[0] & { + components: { a: FunctionComponent<EuiLinkAnchorProps>; timeline: unknown }; + } + ], + ...PluggableList +]; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts index 39ca920fb1c04..e98af8bca8bce 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts @@ -20,7 +20,7 @@ export const usePlugins = () => { return useMemo(() => { const uiPlugins = getDefaultEuiMarkdownUiPlugins(); const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); - const processingPlugins = getDefaultEuiMarkdownProcessingPlugins(); + const processingPlugins = getDefaultEuiMarkdownProcessingPlugins() as TemporaryProcessingPluginsType; if (timelinePlugins) { uiPlugins.push(timelinePlugins.uiPlugin); diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts index 9cb47c8d95122..c744ace91f434 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts @@ -6,16 +6,33 @@ */ import { + EuiLinkAnchorProps, getDefaultEuiMarkdownParsingPlugins, getDefaultEuiMarkdownProcessingPlugins, getDefaultEuiMarkdownUiPlugins, } from '@elastic/eui'; +// Remove after this issue is resolved: https://github.com/elastic/eui/issues/4688 +// eslint-disable-next-line import/no-extraneous-dependencies +import { Options as Remark2RehypeOptions } from 'mdast-util-to-hast'; +import { FunctionComponent } from 'react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import rehype2react from 'rehype-react'; +import { Plugin, PluggableList } from 'unified'; import * as timelineMarkdownPlugin from './timeline'; export const { uiPlugins, parsingPlugins, processingPlugins } = { uiPlugins: getDefaultEuiMarkdownUiPlugins(), parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), - processingPlugins: getDefaultEuiMarkdownProcessingPlugins(), + processingPlugins: getDefaultEuiMarkdownProcessingPlugins() as [ + [Plugin, Remark2RehypeOptions], + [ + typeof rehype2react, + Parameters<typeof rehype2react>[0] & { + components: { a: FunctionComponent<EuiLinkAnchorProps>; timeline: unknown }; + } + ], + ...PluggableList + ], }; uiPlugins.push(timelineMarkdownPlugin.plugin); From cc21d3aceaf0b2df6afb3a7b2061270ccd1acaeb Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Mon, 26 Apr 2021 10:04:03 -0600 Subject: [PATCH 48/52] [Security Solution] [Cases] Polishing up the jest tests in cases ui plugin (#98189) --- .../components/add_comment/index.test.tsx | 27 ++-- .../components/case_view/index.test.tsx | 135 ++++++++--------- .../components/create/connector.test.tsx | 9 +- .../components/create/form_context.test.tsx | 6 +- .../components/create/submit_button.test.tsx | 26 ++-- .../components/recent_cases/index.test.tsx | 81 ++++++++++ .../recent_cases/loading_placeholders.tsx | 2 +- .../user_action_tree/helpers.test.tsx | 41 ++++- .../components/user_action_tree/helpers.tsx | 2 +- .../user_action_tree/index.test.tsx | 140 +++++++----------- .../user_action_markdown.test.tsx | 73 +++++++++ .../user_action_tree/user_action_markdown.tsx | 3 +- .../user_action_property_actions.test.tsx | 23 ++- .../components/user_list/index.test.tsx | 6 +- 14 files changed, 359 insertions(+), 215 deletions(-) create mode 100644 x-pack/plugins/cases/public/components/recent_cases/index.test.tsx create mode 100644 x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.test.tsx diff --git a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx index 3fdaf2937e0af..d35a3dc6a7462 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx @@ -48,7 +48,7 @@ const sampleData: CommentRequest = { describe('AddComment ', () => { beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); usePostCommentMock.mockImplementation(() => defaultPostComment); jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); }); @@ -62,20 +62,15 @@ describe('AddComment ', () => { </TestProviders> ); - await act(async () => { - wrapper - .find(`[data-test-subj="add-comment"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.comment } }); - }); + wrapper + .find(`[data-test-subj="add-comment"] textarea`) + .first() + .simulate('change', { target: { value: sampleData.comment } }); expect(wrapper.find(`[data-test-subj="add-comment"]`).exists()).toBeTruthy(); expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeFalsy(); - await act(async () => { - wrapper.find(`[data-test-subj="submit-comment"]`).first().simulate('click'); - }); - + wrapper.find(`[data-test-subj="submit-comment"]`).first().simulate('click'); await waitFor(() => { expect(onCommentSaving).toBeCalled(); expect(postComment).toBeCalledWith({ @@ -130,12 +125,10 @@ describe('AddComment ', () => { </TestProviders> ); - await act(async () => { - wrapper - .find(`[data-test-subj="add-comment"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.comment } }); - }); + wrapper + .find(`[data-test-subj="add-comment"] textarea`) + .first() + .simulate('change', { target: { value: sampleData.comment } }); await act(async () => { ref.current!.addQuote(sampleQuote); diff --git a/x-pack/plugins/cases/public/components/case_view/index.test.tsx b/x-pack/plugins/cases/public/components/case_view/index.test.tsx index 3a0a2485e1977..d13e3978ce618 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import '../../common/mock/match_media'; -import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; +import { Router, mockHistory } from '../__mock__/router'; import { CaseComponent, CaseComponentProps, CaseView } from '.'; import { basicCase, @@ -152,10 +152,8 @@ describe('CaseView ', () => { }; beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); useUpdateCaseMock.mockImplementation(() => defaultUpdateCaseState); - - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); useGetCaseUserActionsMock.mockImplementation(() => defaultUseGetCaseUserActions); usePostPushToServiceMock.mockImplementation(() => ({ isLoading: false, @@ -177,44 +175,44 @@ describe('CaseView ', () => { expect(wrapper.find(`[data-test-subj="case-view-title"]`).first().prop('title')).toEqual( data.title ); + }); - expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toEqual( - 'Open' - ); + expect(wrapper.find(`[data-test-subj="case-view-status-dropdown"]`).first().text()).toEqual( + 'Open' + ); - expect( - wrapper - .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-coke"]`) - .first() - .text() - ).toEqual(data.tags[0]); + expect( + wrapper + .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-coke"]`) + .first() + .text() + ).toEqual(data.tags[0]); - expect( - wrapper - .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-pepsi"]`) - .first() - .text() - ).toEqual(data.tags[1]); + expect( + wrapper + .find(`[data-test-subj="case-view-tag-list"] [data-test-subj="tag-pepsi"]`) + .first() + .text() + ).toEqual(data.tags[1]); - expect(wrapper.find(`[data-test-subj="case-view-username"]`).first().text()).toEqual( - data.createdBy.username - ); + expect(wrapper.find(`[data-test-subj="case-view-username"]`).first().text()).toEqual( + data.createdBy.username + ); - expect( - wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).first().prop('value') - ).toEqual(data.createdAt); + expect( + wrapper.find(`[data-test-subj="case-action-bar-status-date"]`).first().prop('value') + ).toEqual(data.createdAt); - expect( - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="user-action-markdown"]`) - .first() - .text() - ).toBe(data.description); + expect( + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="user-action-markdown"]`) + .first() + .text() + ).toBe(data.description); - expect( - wrapper.find('button[data-test-subj="case-view-status-action-button"]').first().text() - ).toBe('Mark in progress'); - }); + expect( + wrapper.find('button[data-test-subj="case-view-status-action-button"]').first().text() + ).toBe('Mark in progress'); }); it('should show closed indicators in header when case is closed', async () => { @@ -350,20 +348,17 @@ describe('CaseView ', () => { </Router> </TestProviders> ); - await waitFor(() => { - const newTitle = 'The new title'; - wrapper.find(`[data-test-subj="editable-title-edit-icon"]`).first().simulate('click'); - wrapper.update(); - wrapper - .find(`[data-test-subj="editable-title-input-field"]`) - .last() - .simulate('change', { target: { value: newTitle } }); + const newTitle = 'The new title'; + wrapper.find(`[data-test-subj="editable-title-edit-icon"]`).first().simulate('click'); + wrapper + .find(`[data-test-subj="editable-title-input-field"]`) + .last() + .simulate('change', { target: { value: newTitle } }); - wrapper.update(); - wrapper.find(`[data-test-subj="editable-title-submit-btn"]`).first().simulate('click'); + wrapper.find(`[data-test-subj="editable-title-submit-btn"]`).first().simulate('click'); - wrapper.update(); - const updateObject = updateCaseProperty.mock.calls[0][0]; + const updateObject = updateCaseProperty.mock.calls[0][0]; + await waitFor(() => { expect(updateObject.updateKey).toEqual('title'); expect(updateObject.updateValue).toEqual(newTitle); }); @@ -387,11 +382,10 @@ describe('CaseView ', () => { expect( wrapper.find('[data-test-subj="has-data-to-push-button"]').first().exists() ).toBeTruthy(); + }); + wrapper.find('[data-test-subj="push-to-external-service"]').first().simulate('click'); - wrapper.find('[data-test-subj="push-to-external-service"]').first().simulate('click'); - - wrapper.update(); - + await waitFor(() => { expect(pushCaseToExternalService).toHaveBeenCalled(); }); }); @@ -553,8 +547,8 @@ describe('CaseView ', () => { </Router> </TestProviders> ); + wrapper.find('[data-test-subj="case-refresh"]').first().simulate('click'); await waitFor(() => { - wrapper.find('[data-test-subj="case-refresh"]').first().simulate('click'); expect(fetchCaseUserActions).toBeCalledWith('1234', 'resilient-2', undefined); expect(fetchCase).toBeCalled(); }); @@ -615,18 +609,13 @@ describe('CaseView ', () => { .first() .text(); - await waitFor(() => { - wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); - }); - - await waitFor(() => { - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - wrapper.update(); - wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); - }); + wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); + await waitFor(() => wrapper.update()); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + await waitFor(() => wrapper.update()); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + await waitFor(() => wrapper.update()); + wrapper.find(`[data-test-subj="edit-connectors-submit"]`).last().simulate('click'); await waitFor(() => { wrapper.update(); @@ -637,7 +626,6 @@ describe('CaseView ', () => { ).toBe(connectorName); }); }); - it('should update connector', async () => { const wrapper = mount( <TestProviders> @@ -661,14 +649,12 @@ describe('CaseView ', () => { wrapper.find('[data-test-subj="connector-edit"] button').simulate('click'); wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - await waitFor(() => { - wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); - }); + wrapper.find('button[data-test-subj="dropdown-connector-resilient-2"]').simulate('click'); + await waitFor(() => wrapper.update()); wrapper.find(`button[data-test-subj="edit-connectors-submit"]`).first().simulate('click'); await waitFor(() => { - wrapper.update(); const updateObject = updateCaseProperty.mock.calls[0][0]; expect(updateCaseProperty).toHaveBeenCalledTimes(1); expect(updateObject.updateKey).toEqual('connector'); @@ -736,11 +722,11 @@ describe('CaseView ', () => { </TestProviders> ); + wrapper + .find('[data-test-subj="comment-action-show-alert-alert-action-id"] button') + .first() + .simulate('click'); await waitFor(() => { - wrapper - .find('[data-test-subj="comment-action-show-alert-alert-action-id"] button') - .first() - .simulate('click'); expect(showAlertDetails).toHaveBeenCalledWith('alert-id-1', 'alert-index-1'); }); }); @@ -775,9 +761,8 @@ describe('CaseView ', () => { </TestProviders> ); + wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); await waitFor(() => { - wrapper.find('button[data-test-subj="sync-alerts-switch"]').first().simulate('click'); - wrapper.update(); const updateObject = updateCaseProperty.mock.calls[0][0]; expect(updateObject.updateKey).toEqual('settings'); diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx index db9e5ffac1533..b0e24f52ec388 100644 --- a/x-pack/plugins/cases/public/components/create/connector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -150,12 +150,9 @@ describe('Connector', () => { </MockHookWrapperComponent> ); - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeFalsy(); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find(`button[data-test-subj="dropdown-connector-resilient-2"]`).simulate('click'); - wrapper.update(); - }); + expect(wrapper.find(`[data-test-subj="connector-fields-resilient"]`).exists()).toBeFalsy(); + wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); + wrapper.find(`button[data-test-subj="dropdown-connector-resilient-2"]`).simulate('click'); await waitFor(() => { wrapper.update(); diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 207ff6207e09d..5e588bba235b1 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -100,8 +100,7 @@ describe('Create case', () => { const onFormSubmitSuccess = jest.fn(); const afterCaseCreated = jest.fn(); - beforeEach(() => { - jest.resetAllMocks(); + beforeAll(() => { postCase.mockResolvedValue({ id: sampleId, ...sampleData, @@ -121,6 +120,9 @@ describe('Create case', () => { fetchTags, })); }); + beforeEach(() => { + jest.clearAllMocks(); + }); describe('Step 1 - Case Fields', () => { it('it renders', async () => { diff --git a/x-pack/plugins/cases/public/components/create/submit_button.test.tsx b/x-pack/plugins/cases/public/components/create/submit_button.test.tsx index dd67c8170dc3f..62279500616ee 100644 --- a/x-pack/plugins/cases/public/components/create/submit_button.test.tsx +++ b/x-pack/plugins/cases/public/components/create/submit_button.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { act, waitFor } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import { useForm, Form } from '../../common/shared_imports'; import { SubmitCaseButton } from './submit_button'; @@ -29,7 +29,7 @@ describe('SubmitCaseButton', () => { }; beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); }); it('it renders', async () => { @@ -48,11 +48,7 @@ describe('SubmitCaseButton', () => { <SubmitCaseButton /> </MockHookWrapperComponent> ); - - await act(async () => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); - }); - + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); await waitFor(() => expect(onSubmit).toBeCalled()); }); @@ -63,12 +59,12 @@ describe('SubmitCaseButton', () => { </MockHookWrapperComponent> ); - await waitFor(() => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + await waitFor(() => expect( wrapper.find(`[data-test-subj="create-case-submit"]`).first().prop('isDisabled') - ).toBeTruthy(); - }); + ).toBeTruthy() + ); }); it('it is loading when submitting', async () => { @@ -78,11 +74,11 @@ describe('SubmitCaseButton', () => { </MockHookWrapperComponent> ); - await waitFor(() => { - wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + await waitFor(() => expect( wrapper.find(`[data-test-subj="create-case-submit"]`).first().prop('isLoading') - ).toBeTruthy(); - }); + ).toBeTruthy() + ); }); }); diff --git a/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx b/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx new file mode 100644 index 0000000000000..933ea51bffac4 --- /dev/null +++ b/x-pack/plugins/cases/public/components/recent_cases/index.test.tsx @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { configure, render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import RecentCases from '.'; +import { TestProviders } from '../../common/mock'; +import { useGetCases } from '../../containers/use_get_cases'; +import { useGetCasesMockState } from '../../containers/mock'; +jest.mock('../../containers/use_get_cases'); +configure({ testIdAttribute: 'data-test-subj' }); +const defaultProps = { + allCasesNavigation: { + href: 'all-cases-href', + onClick: jest.fn(), + }, + caseDetailsNavigation: { + href: () => 'case-details-href', + onClick: jest.fn(), + }, + createCaseNavigation: { + href: 'create-details-href', + onClick: jest.fn(), + }, + maxCasesToShow: 10, +}; +const setFilters = jest.fn(); +const mockData = { + ...useGetCasesMockState, + setFilters, +}; +const useGetCasesMock = useGetCases as jest.Mock; +describe('RecentCases', () => { + beforeEach(() => { + jest.clearAllMocks(); + useGetCasesMock.mockImplementation(() => mockData); + }); + it('is good at loading', () => { + useGetCasesMock.mockImplementation(() => ({ + ...mockData, + loading: 'cases', + })); + const { getAllByTestId } = render( + <TestProviders> + <RecentCases {...defaultProps} /> + </TestProviders> + ); + expect(getAllByTestId('loadingPlaceholders')).toHaveLength(3); + }); + it('is good at rendering cases', () => { + const { getAllByTestId } = render( + <TestProviders> + <RecentCases {...defaultProps} /> + </TestProviders> + ); + expect(getAllByTestId('case-details-link')).toHaveLength(5); + }); + it('is good at rendering max cases', () => { + render( + <TestProviders> + <RecentCases {...{ ...defaultProps, maxCasesToShow: 2 }} /> + </TestProviders> + ); + expect(useGetCasesMock).toBeCalledWith({ perPage: 2 }); + }); + it('updates filters', () => { + const { getByTestId } = render( + <TestProviders> + <RecentCases {...defaultProps} /> + </TestProviders> + ); + const yo = getByTestId('myRecentlyReported'); + userEvent.click(yo); + expect(setFilters).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx b/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx index 7e0788d66878b..6e839e00a511d 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/loading_placeholders.tsx @@ -15,7 +15,7 @@ const LoadingPlaceholdersComponent: React.FC<{ <> {[...Array(placeholders).keys()].map((_, i) => ( <React.Fragment key={i}> - <EuiLoadingContent lines={lines} /> + <EuiLoadingContent lines={lines} data-test-subj={'loadingPlaceholders'} /> {i !== placeholders - 1 && <EuiSpacer size="l" />} </React.Fragment> ))} diff --git a/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx index a4693e67ad2f3..b49a010cff38f 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/helpers.test.tsx @@ -10,7 +10,12 @@ import { mount } from 'enzyme'; import { CaseStatuses } from '../../../common'; import { basicPush, getUserAction } from '../../containers/mock'; -import { getLabelTitle, getPushedServiceLabelTitle, getConnectorLabelTitle } from './helpers'; +import { + getLabelTitle, + getPushedServiceLabelTitle, + getConnectorLabelTitle, + toStringArray, +} from './helpers'; import { connectorsMock } from '../../containers/configure/mock'; import * as i18n from './translations'; @@ -182,4 +187,38 @@ describe('User action tree helpers', () => { expect(result).toEqual('changed connector field'); }); + + describe('toStringArray', () => { + const circularReference = { otherData: 123, circularReference: undefined }; + // @ts-ignore testing catch on circular reference + circularReference.circularReference = circularReference; + it('handles all data types in an array', () => { + const value = [1, true, { a: 1 }, circularReference, 'yeah', 100n, null]; + const res = toStringArray(value); + expect(res).toEqual(['1', 'true', '{"a":1}', 'Invalid Object', 'yeah', '100']); + }); + it('handles null', () => { + const value = null; + const res = toStringArray(value); + expect(res).toEqual([]); + }); + + it('handles object', () => { + const value = { a: true }; + const res = toStringArray(value); + expect(res).toEqual([JSON.stringify(value)]); + }); + + it('handles Invalid Object', () => { + const value = circularReference; + const res = toStringArray(value); + expect(res).toEqual(['Invalid Object']); + }); + + it('handles unexpected value', () => { + const value = 100n; + const res = toStringArray(value); + expect(res).toEqual(['100']); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx index 4de356940463c..024fa4d494908 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/helpers.tsx @@ -290,7 +290,7 @@ export const toStringArray = (value: unknown): string[] => { }, []); } else if (value == null) { return []; - } else if (!Array.isArray(value) && typeof value === 'object') { + } else if (typeof value === 'object') { try { return [JSON.stringify(value)]; } catch { diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx index d905a97b1b4d2..b30726bf23b25 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx @@ -49,14 +49,13 @@ jest.mock('../../containers/use_update_comment'); jest.mock('./user_action_timestamp'); const patchComment = jest.fn(); -// FLAKY: https://github.com/elastic/kibana/issues/96362 -describe.skip('UserActionTree ', () => { + +describe(`UserActionTree`, () => { const sampleData = { content: 'what a great comment update', }; beforeEach(() => { jest.clearAllMocks(); - jest.resetAllMocks(); useUpdateCommentMock.mockImplementation(() => ({ isLoadingIds: [], patchComment, @@ -78,7 +77,7 @@ describe.skip('UserActionTree ', () => { </Router> </TestProviders> ); - expect(wrapper.find(`[data-test-subj="user-actions-loading"]`).exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="user-actions-loading"]`).exists()).toEqual(true); expect(wrapper.find(`[data-test-subj="user-action-avatar"]`).first().prop('name')).toEqual( defaultProps.data.createdBy.fullName @@ -115,10 +114,8 @@ describe.skip('UserActionTree ', () => { </Router> </TestProviders> ); - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toBeTruthy(); - }); + expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toEqual(true); + expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toEqual(true); }); it('Renders service now update line with top only when push is up to date', async () => { @@ -144,12 +141,9 @@ describe.skip('UserActionTree ', () => { </Router> </TestProviders> ); - await waitFor(() => { - expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toBeFalsy(); - }); + expect(wrapper.find(`[data-test-subj="top-footer"]`).exists()).toEqual(true); + expect(wrapper.find(`[data-test-subj="bottom-footer"]`).exists()).toEqual(false); }); - it('Outlines comment when update move to link is clicked', async () => { const ourActions = [getUserAction(['comment'], 'create'), getUserAction(['comment'], 'update')]; const props = { @@ -164,32 +158,29 @@ describe.skip('UserActionTree ', () => { </Router> </TestProviders> ); - - await waitFor(() => { - expect( - wrapper - .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) - .first() - .hasClass('outlined') - ).toBeFalsy(); - + expect( wrapper - .find( - `[data-test-subj="comment-update-action-${ourActions[1].actionId}"] [data-test-subj="move-to-link-${props.data.comments[0].id}"]` - ) + .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) .first() - .simulate('click'); + .hasClass('outlined') + ).toEqual(false); - wrapper.update(); + wrapper + .find( + `[data-test-subj="comment-update-action-${ourActions[1].actionId}"] [data-test-subj="move-to-link-${props.data.comments[0].id}"]` + ) + .first() + .simulate('click'); + + await waitFor(() => { expect( wrapper .find(`[data-test-subj="comment-create-action-${props.data.comments[0].id}"]`) .first() .hasClass('outlined') - ).toBeTruthy(); + ).toEqual(true); }); }); - it('Switches to markdown when edit is clicked and back to panel when canceled', async () => { const ourActions = [getUserAction(['comment'], 'create')]; const props = { @@ -205,46 +196,27 @@ describe.skip('UserActionTree ', () => { </TestProviders> ); - await waitFor(() => { - expect( - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(false); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-ellipses"]` - ) - .first() - .simulate('click'); - - wrapper.update(); - - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-pencil"]` - ) - .first() - .simulate('click'); - - expect( - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-markdown-form"]` - ) - .exists() - ).toEqual(true); + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-ellipses"]` + ) + .first() + .simulate('click'); + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="property-actions-pencil"]` + ) + .first() + .simulate('click'); - wrapper - .find( - `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-cancel-markdown"]` - ) - .first() - .simulate('click'); + wrapper + .find( + `[data-test-subj="comment-create-action-${props.data.comments[0].id}"] [data-test-subj="user-action-cancel-markdown"]` + ) + .first() + .simulate('click'); + await waitFor(() => { expect( wrapper .find( @@ -313,11 +285,10 @@ describe.skip('UserActionTree ', () => { }); it('calls update description when description markdown is saved', async () => { - const props = defaultProps; const wrapper = mount( <TestProviders> <Router history={mockHistory}> - <UserActionTree {...props} /> + <UserActionTree {...defaultProps} /> </Router> </TestProviders> ); @@ -336,9 +307,9 @@ describe.skip('UserActionTree ', () => { .find(`[data-test-subj="description-action"] [data-test-subj="user-action-save-markdown"]`) .first() .simulate('click'); + await waitFor(() => { wrapper.update(); - expect( wrapper .find( @@ -346,7 +317,6 @@ describe.skip('UserActionTree ', () => { ) .exists() ).toEqual(false); - expect(onUpdateField).toBeCalledWith({ key: 'description', value: sampleData.content }); }); }); @@ -374,16 +344,13 @@ describe.skip('UserActionTree ', () => { .first() .simulate('click'); + wrapper + .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-quote"]`) + .first() + .simulate('click'); await waitFor(() => { - wrapper.update(); - - wrapper - .find(`[data-test-subj="description-action"] [data-test-subj="property-actions-quote"]`) - .first() - .simulate('click'); + expect(setFieldValue).toBeCalledWith('comment', `> ${props.data.description} \n`); }); - - expect(setFieldValue).toBeCalledWith('comment', `> ${props.data.description} \n`); }); it('Outlines comment when url param is provided', async () => { @@ -404,14 +371,11 @@ describe.skip('UserActionTree ', () => { </TestProviders> ); - await waitFor(() => { - wrapper.update(); - expect( - wrapper - .find(`[data-test-subj="comment-create-action-${commentId}"]`) - .first() - .hasClass('outlined') - ).toBeTruthy(); - }); + expect( + wrapper + .find(`[data-test-subj="comment-create-action-${commentId}"]`) + .first() + .hasClass('outlined') + ).toEqual(true); }); }); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.test.tsx new file mode 100644 index 0000000000000..6fff3c8f9abe2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.test.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mount } from 'enzyme'; +import { Router, mockHistory } from '../__mock__/router'; +import { UserActionMarkdown } from './user_action_markdown'; +import { TestProviders } from '../../common/mock'; +import { waitFor } from '@testing-library/react'; +const onChangeEditable = jest.fn(); +const onSaveContent = jest.fn(); + +const hyperlink = `[hyperlink](http://elastic.co)`; +const defaultProps = { + content: `A link to a timeline ${hyperlink}`, + id: 'markdown-id', + isEditable: true, + onChangeEditable, + onSaveContent, +}; + +describe('UserActionMarkdown ', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('Renders markdown correctly when not in edit mode', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionMarkdown {...{ ...defaultProps, isEditable: false }} /> + </Router> + </TestProviders> + ); + + expect(wrapper.find(`[data-test-subj="markdown-link"]`).first().text()).toContain('hyperlink'); + }); + + it('Save button click calls onSaveContent and onChangeEditable', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionMarkdown {...defaultProps} /> + </Router> + </TestProviders> + ); + wrapper.find(`[data-test-subj="user-action-save-markdown"]`).first().simulate('click'); + + await waitFor(() => { + expect(onSaveContent).toHaveBeenCalledWith(defaultProps.content); + expect(onChangeEditable).toHaveBeenCalledWith(defaultProps.id); + }); + }); + it('Cancel button click calls only onChangeEditable', async () => { + const wrapper = mount( + <TestProviders> + <Router history={mockHistory}> + <UserActionMarkdown {...defaultProps} /> + </Router> + </TestProviders> + ); + wrapper.find(`[data-test-subj="user-action-cancel-markdown"]`).first().simulate('click'); + + await waitFor(() => { + expect(onSaveContent).not.toHaveBeenCalled(); + expect(onChangeEditable).toHaveBeenCalledWith(defaultProps.id); + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx index 7018f5019fb8b..19cc804786af1 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_markdown.tsx @@ -12,9 +12,8 @@ import styled from 'styled-components'; import * as i18n from '../case_view/translations'; import { Form, useForm, UseField } from '../../common/shared_imports'; import { schema, Content } from './schema'; -import { MarkdownRenderer, MarkdownEditorForm } from '../../components/markdown_editor'; +import { MarkdownRenderer, MarkdownEditorForm } from '../markdown_editor'; -// TODO: Need to migrate user_action_markdown.test.tsx still. const ContentWrapper = styled.div` padding: ${({ theme }) => `${theme.eui.euiSizeM} ${theme.eui.euiSizeL}`}; `; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx index 0e8a30befd000..57958d3d8e5af 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_property_actions.test.tsx @@ -8,15 +8,16 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { UserActionPropertyActions } from './user_action_property_actions'; - +const onEdit = jest.fn(); +const onQuote = jest.fn(); const props = { id: 'property-actions-id', editLabel: 'edit', quoteLabel: 'quote', disabled: false, isLoading: false, - onEdit: jest.fn(), - onQuote: jest.fn(), + onEdit, + onQuote, }; describe('UserActionPropertyActions ', () => { @@ -26,6 +27,10 @@ describe('UserActionPropertyActions ', () => { wrapper = mount(<UserActionPropertyActions {...props} />); }); + beforeEach(() => { + jest.clearAllMocks(); + }); + it('it renders', async () => { expect( wrapper.find('[data-test-subj="user-action-title-loading"]').first().exists() @@ -40,6 +45,18 @@ describe('UserActionPropertyActions ', () => { wrapper.find('[data-test-subj="property-actions-quote"]').exists(); }); + it('quote click calls onQuote', async () => { + wrapper.find('[data-test-subj="property-actions-ellipses"]').first().simulate('click'); + wrapper.find('[data-test-subj="property-actions-quote"]').first().simulate('click'); + expect(onQuote).toHaveBeenCalledWith(props.id); + }); + + it('pencil click calls onEdit', async () => { + wrapper.find('[data-test-subj="property-actions-ellipses"]').first().simulate('click'); + wrapper.find('[data-test-subj="property-actions-pencil"]').first().simulate('click'); + expect(onEdit).toHaveBeenCalledWith(props.id); + }); + it('it shows the spinner when loading', async () => { wrapper = mount(<UserActionPropertyActions {...props} isLoading={true} />); expect( diff --git a/x-pack/plugins/cases/public/components/user_list/index.test.tsx b/x-pack/plugins/cases/public/components/user_list/index.test.tsx index 9c6509eeabc15..70f9e7d2fbdfc 100644 --- a/x-pack/plugins/cases/public/components/user_list/index.test.tsx +++ b/x-pack/plugins/cases/public/components/user_list/index.test.tsx @@ -15,11 +15,9 @@ describe('UserList ', () => { const caseLink = 'http://reddit.com'; const user = { username: 'username', fullName: 'Full Name', email: 'testemail@elastic.co' }; const open = jest.fn(); - beforeAll(() => { - window.open = open; - }); beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); + window.open = open; }); it('triggers mailto when email icon clicked', () => { const wrapper = shallow( From b5d39323b0eef0f4f45f385477374bca9926a680 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Mon, 26 Apr 2021 13:35:23 -0600 Subject: [PATCH 49/52] fix double api calls --- .../all_cases/all_cases_generic.tsx | 6 +++- .../public/components/all_cases/columns.tsx | 7 ++-- .../components/all_cases/index.test.tsx | 10 ++++-- .../components/create/connector.test.tsx | 33 ++++++++----------- .../public/components/create/connector.tsx | 22 +++++++------ .../cases/public/components/create/form.tsx | 16 +++++++-- .../components/create/form_context.test.tsx | 27 ++++++++------- .../public/components/create/form_context.tsx | 14 ++++++-- .../containers/configure/use_connectors.tsx | 32 +++++++++++------- .../cases/public/containers/use_get_cases.tsx | 5 +-- .../cases/public/methods/get_all_cases.tsx | 14 ++++---- .../methods/get_all_cases_selector_modal.tsx | 14 ++++---- .../cases/public/methods/get_case_view.tsx | 14 ++++---- .../public/methods/get_configure_cases.tsx | 14 ++++---- .../cases/public/methods/get_create_case.tsx | 14 ++++---- .../cases/public/methods/get_recent_cases.tsx | 14 ++++---- 16 files changed, 143 insertions(+), 113 deletions(-) diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx index ca67bfb4697be..83f38aab21aa4 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx @@ -81,6 +81,7 @@ export const AllCasesGeneric = React.memo<AllCasesGenericProps>( const { actionLicense } = useGetActionLicense(); const { data, + dispatchUpdateCaseProperty, filterOptions, loading, queryParams, @@ -90,6 +91,7 @@ export const AllCasesGeneric = React.memo<AllCasesGenericProps>( setQueryParams, setSelectedCases, } = useGetCases(); + // Post Comment to Case const { postComment, isLoading: isCommentUpdating } = usePostComment(); @@ -180,9 +182,11 @@ export const AllCasesGeneric = React.memo<AllCasesGenericProps>( const columns = useCasesColumns({ caseDetailsNavigation, + dispatchUpdateCaseProperty, filterStatus: filterOptions.status, - refreshCases, handleIsLoading, + isLoadingCases: loading, + refreshCases, showActions, }); diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.tsx index c98d230564038..cf5da3928446e 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns.tsx @@ -29,7 +29,7 @@ import { Status } from '../status'; import { getSubCasesStatusCountsBadges, isSubCase } from './helpers'; import { ALERTS } from '../../common/translations'; import { getActions } from './actions'; -import { UpdateCase, useGetCases } from '../../containers/use_get_cases'; +import { UpdateCase } from '../../containers/use_get_cases'; import { useDeleteCases } from '../../containers/use_delete_cases'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; @@ -55,19 +55,22 @@ const renderStringField = (field: string, dataTestSubj: string) => export interface GetCasesColumn { caseDetailsNavigation?: CasesNavigation<CaseDetailsHrefSchema, 'configurable'>; + dispatchUpdateCaseProperty: (u: UpdateCase) => void; filterStatus: string; handleIsLoading: (a: boolean) => void; + isLoadingCases: string[]; refreshCases?: (a?: boolean) => void; showActions: boolean; } export const useCasesColumns = ({ caseDetailsNavigation, + dispatchUpdateCaseProperty, filterStatus, handleIsLoading, + isLoadingCases, refreshCases, showActions, }: GetCasesColumn): CasesColumns[] => { - const { loading: isLoadingCases, dispatchUpdateCaseProperty } = useGetCases(); // Delete case const { dispatchResetIsDeleted, diff --git a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx index 2129162f56404..82db4a63115e4 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx @@ -109,13 +109,15 @@ describe('AllCasesGeneric', () => { }; const defaultColumnArgs = { - filterStatus: CaseStatuses.open, - showActions: true, - handleIsLoading: jest.fn(), caseDetailsNavigation: { href: jest.fn(), onClick: jest.fn(), }, + dispatchUpdateCaseProperty: jest.fn, + filterStatus: CaseStatuses.open, + handleIsLoading: jest.fn(), + isLoadingCases: [], + showActions: true, }; beforeEach(() => { @@ -354,6 +356,8 @@ describe('AllCasesGeneric', () => { ); const { result } = renderHook<GetCasesColumn, CasesColumns[]>(() => useCasesColumns({ + dispatchUpdateCaseProperty: jest.fn, + isLoadingCases: [], filterStatus: CaseStatuses.open, handleIsLoading: jest.fn(), showActions: false, diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx index db9e5ffac1533..6b0a38e62ce20 100644 --- a/x-pack/plugins/cases/public/components/create/connector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -13,7 +13,6 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { useForm, Form, FormHook } from '../../common/shared_imports'; import { connectorsMock } from '../../containers/mock'; import { Connector } from './connector'; -import { useConnectors } from '../../containers/configure/use_connectors'; import { useGetIncidentTypes } from '../connectors/resilient/use_get_incident_types'; import { useGetSeverity } from '../connectors/resilient/use_get_severity'; import { useGetChoices } from '../connectors/servicenow/use_get_choices'; @@ -30,12 +29,11 @@ jest.mock('../../common/lib/kibana', () => { }), }; }); -jest.mock('../../containers/configure/use_connectors'); + jest.mock('../connectors/resilient/use_get_incident_types'); jest.mock('../connectors/resilient/use_get_severity'); jest.mock('../connectors/servicenow/use_get_choices'); -const useConnectorsMock = useConnectors as jest.Mock; const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; const useGetSeverityMock = useGetSeverity as jest.Mock; const useGetChoicesMock = useGetChoices as jest.Mock; @@ -55,6 +53,12 @@ const useGetChoicesResponse = { choices, }; +const defaultProps = { + connectors: connectorsMock, + isLoading: false, + isLoadingConnectors: false, +}; + describe('Connector', () => { let globalForm: FormHook; @@ -74,7 +78,6 @@ describe('Connector', () => { beforeEach(() => { jest.resetAllMocks(); - useConnectorsMock.mockReturnValue({ loading: false, connectors: connectorsMock }); useGetIncidentTypesMock.mockReturnValue(useGetIncidentTypesResponse); useGetSeverityMock.mockReturnValue(useGetSeverityResponse); useGetChoicesMock.mockReturnValue(useGetChoicesResponse); @@ -83,7 +86,7 @@ describe('Connector', () => { it('it renders', async () => { const wrapper = mount( <MockHookWrapperComponent> - <Connector isLoading={false} /> + <Connector {...defaultProps} /> </MockHookWrapperComponent> ); @@ -102,36 +105,26 @@ describe('Connector', () => { }); }); - it('it is loading when fetching connectors', async () => { - useConnectorsMock.mockReturnValue({ loading: true, connectors: connectorsMock }); + it('it is disabled and loading when isLoadingConnectors=true', async () => { const wrapper = mount( <MockHookWrapperComponent> - <Connector isLoading={false} /> + <Connector {...{ ...defaultProps, isLoadingConnectors: true }} /> </MockHookWrapperComponent> ); expect( wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('isLoading') ).toEqual(true); - }); - - it('it is disabled when fetching connectors', async () => { - useConnectorsMock.mockReturnValue({ loading: true, connectors: connectorsMock }); - const wrapper = mount( - <MockHookWrapperComponent> - <Connector isLoading={false} /> - </MockHookWrapperComponent> - ); expect(wrapper.find('[data-test-subj="dropdown-connectors"]').first().prop('disabled')).toEqual( true ); }); - it('it is disabled and loading when passing loading as true', async () => { + it('it is disabled and loading when isLoading=true', async () => { const wrapper = mount( <MockHookWrapperComponent> - <Connector isLoading={true} /> + <Connector {...{ ...defaultProps, isLoading: true }} /> </MockHookWrapperComponent> ); @@ -146,7 +139,7 @@ describe('Connector', () => { it(`it should change connector`, async () => { const wrapper = mount( <MockHookWrapperComponent> - <Connector isLoading={false} /> + <Connector {...defaultProps} /> </MockHookWrapperComponent> ); diff --git a/x-pack/plugins/cases/public/components/create/connector.tsx b/x-pack/plugins/cases/public/components/create/connector.tsx index 0b4cdca6dd6ff..9591933806946 100644 --- a/x-pack/plugins/cases/public/components/create/connector.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.tsx @@ -10,7 +10,6 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { ConnectorTypes } from '../../../common'; import { UseField, useFormData, FieldHook, useFormContext } from '../../common/shared_imports'; -import { useConnectors } from '../../containers/configure/use_connectors'; import { ConnectorSelector } from '../connector_selector/form'; import { ConnectorFieldsForm } from '../connectors/fields_form'; import { ActionConnector } from '../../../common'; @@ -18,7 +17,9 @@ import { getConnectorById } from '../configure_cases/utils'; import { FormProps } from './schema'; interface Props { + connectors: ActionConnector[]; isLoading: boolean; + isLoadingConnectors: boolean; hideConnectorServiceNowSir?: boolean; } @@ -55,16 +56,17 @@ const ConnectorFields = ({ ); }; -const ConnectorComponent: React.FC<Props> = ({ hideConnectorServiceNowSir = false, isLoading }) => { +const ConnectorComponent: React.FC<Props> = ({ + connectors, + hideConnectorServiceNowSir = false, + isLoading, + isLoadingConnectors, +}) => { const { getFields } = useFormContext(); - const { loading: isLoadingConnectors, connectors } = useConnectors(); - const handleConnectorChange = useCallback( - (newConnector) => { - const { fields } = getFields(); - fields.setValue(null); - }, - [getFields] - ); + const handleConnectorChange = useCallback(() => { + const { fields } = getFields(); + fields.setValue(null); + }, [getFields]); return ( <EuiFlexGroup> diff --git a/x-pack/plugins/cases/public/components/create/form.tsx b/x-pack/plugins/cases/public/components/create/form.tsx index a81ecf32576a9..83f759947ba65 100644 --- a/x-pack/plugins/cases/public/components/create/form.tsx +++ b/x-pack/plugins/cases/public/components/create/form.tsx @@ -17,6 +17,7 @@ import { Tags } from './tags'; import { Connector } from './connector'; import * as i18n from './translations'; import { SyncAlertsToggle } from './sync_alerts_toggle'; +import { ActionConnector } from '../../../common'; interface ContainerProps { big?: boolean; @@ -36,12 +37,19 @@ const MySpinner = styled(EuiLoadingSpinner)` `; interface Props { + connectors?: ActionConnector[]; hideConnectorServiceNowSir?: boolean; + isLoadingConnectors?: boolean; withSteps?: boolean; } - +const empty: ActionConnector[] = []; export const CreateCaseForm: React.FC<Props> = React.memo( - ({ hideConnectorServiceNowSir = false, withSteps = true }) => { + ({ + connectors = empty, + isLoadingConnectors = false, + hideConnectorServiceNowSir = false, + withSteps = true, + }) => { const { isSubmitting } = useFormContext(); const firstStep = useMemo( @@ -80,13 +88,15 @@ export const CreateCaseForm: React.FC<Props> = React.memo( children: ( <Container> <Connector + connectors={connectors} hideConnectorServiceNowSir={hideConnectorServiceNowSir} + isLoadingConnectors={isLoadingConnectors} isLoading={isSubmitting} /> </Container> ), }), - [hideConnectorServiceNowSir, isSubmitting] + [connectors, hideConnectorServiceNowSir, isLoadingConnectors, isSubmitting] ); const allSteps = useMemo(() => [firstStep, secondStep, thirdStep], [ diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 207ff6207e09d..80f4605dcea1c 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -71,6 +71,11 @@ const defaultPostCase = { postCase, }; +const defaultCreateCaseForm = { + isLoadingConnectors: false, + connectors: [], +}; + const defaultPostPushToService = { isLoading: false, isError: false, @@ -127,7 +132,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -151,7 +156,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -171,7 +176,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -206,7 +211,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -256,7 +261,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -281,7 +286,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -348,7 +353,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -416,7 +421,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -506,7 +511,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -604,7 +609,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess} afterCaseCreated={afterCaseCreated}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> @@ -638,7 +643,7 @@ describe('Create case', () => { const wrapper = mount( <TestProviders> <FormContext onSuccess={onFormSubmitSuccess} afterCaseCreated={afterCaseCreated}> - <CreateCaseForm /> + <CreateCaseForm {...defaultCreateCaseForm} /> <SubmitCaseButton /> </FormContext> </TestProviders> diff --git a/x-pack/plugins/cases/public/components/create/form_context.tsx b/x-pack/plugins/cases/public/components/create/form_context.tsx index e84f451ab4215..28e6278e3aa74 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.tsx @@ -33,6 +33,7 @@ const initialCaseValue: FormProps = { interface Props { afterCaseCreated?: (theCase: Case) => Promise<void>; caseType?: CaseType; + children?: JSX.Element | JSX.Element[]; hideConnectorServiceNowSir?: boolean; onSuccess?: (theCase: Case) => Promise<void>; } @@ -44,7 +45,7 @@ export const FormContext: React.FC<Props> = ({ hideConnectorServiceNowSir, onSuccess, }) => { - const { connectors } = useConnectors(); + const { connectors, loading: isLoadingConnectors } = useConnectors(); const { connector: configurationConnector } = useCaseConfigure(); const { postCase } = usePostCase(); const { pushCaseToExternalService } = usePostPushToService(); @@ -114,7 +115,16 @@ export const FormContext: React.FC<Props> = ({ // Set the selected connector to the configuration connector useEffect(() => setFieldValue('connectorId', connectorId), [connectorId, setFieldValue]); - return <Form form={form}>{children}</Form>; + const childrenWithExtraProp = useMemo( + () => + children != null + ? React.Children.map(children, (child: React.ReactElement) => + React.cloneElement(child, { connectors, isLoadingConnectors }) + ) + : null, + [children, connectors, isLoadingConnectors] + ); + return <Form form={form}>{childrenWithExtraProp}</Form>; }; FormContext.displayName = 'FormContext'; diff --git a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx index 7fbdd795a8436..3b91c77d0235a 100644 --- a/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx +++ b/x-pack/plugins/cases/public/containers/configure/use_connectors.tsx @@ -20,8 +20,13 @@ export interface UseConnectorsResponse { export const useConnectors = (): UseConnectorsResponse => { const toasts = useToasts(); - const [loading, setLoading] = useState(true); - const [connectors, setConnectors] = useState<ActionConnector[]>([]); + const [state, setState] = useState<{ + loading: boolean; + connectors: ActionConnector[]; + }>({ + loading: true, + connectors: [], + }); const isCancelledRef = useRef(false); const abortCtrlRef = useRef(new AbortController()); @@ -30,13 +35,17 @@ export const useConnectors = (): UseConnectorsResponse => { isCancelledRef.current = false; abortCtrlRef.current.abort(); abortCtrlRef.current = new AbortController(); - - setLoading(true); + setState({ + ...state, + loading: true, + }); const res = await fetchConnectors({ signal: abortCtrlRef.current.signal }); if (!isCancelledRef.current) { - setLoading(false); - setConnectors(res); + setState({ + loading: false, + connectors: res, + }); } } catch (error) { if (!isCancelledRef.current) { @@ -46,9 +55,10 @@ export const useConnectors = (): UseConnectorsResponse => { { title: i18n.ERROR_TITLE } ); } - - setLoading(false); - setConnectors([]); + setState({ + loading: false, + connectors: [], + }); } } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -64,8 +74,8 @@ export const useConnectors = (): UseConnectorsResponse => { }, []); return { - loading, - connectors, + loading: state.loading, + connectors: state.connectors, refetchConnectors, }; }; diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.tsx index 93daa0f70e232..ec1abd6214926 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.tsx @@ -137,9 +137,10 @@ export interface UseGetCases extends UseGetCasesState { setSelectedCases: (mySelectedCases: Case[]) => void; } +const empty = {}; export const useGetCases = ( - initialQueryParams: Partial<QueryParams> = {}, - initialFilterOptions: Partial<FilterOptions> = {} + initialQueryParams: Partial<QueryParams> = empty, + initialFilterOptions: Partial<FilterOptions> = empty ): UseGetCases => { const [state, dispatch] = useReducer(dataFetchReducer, { data: initialData, diff --git a/x-pack/plugins/cases/public/methods/get_all_cases.tsx b/x-pack/plugins/cases/public/methods/get_all_cases.tsx index 836a8610fd9de..d3e7a924788f3 100644 --- a/x-pack/plugins/cases/public/methods/get_all_cases.tsx +++ b/x-pack/plugins/cases/public/methods/get_all_cases.tsx @@ -9,11 +9,9 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import React, { lazy, Suspense } from 'react'; import { AllCasesProps } from '../components/all_cases'; -export const getAllCasesLazy = (props: AllCasesProps) => { - const AllCasesLazy = lazy(() => import('../components/all_cases')); - return ( - <Suspense fallback={<EuiLoadingSpinner />}> - <AllCasesLazy {...props} /> - </Suspense> - ); -}; +const AllCasesLazy = lazy(() => import('../components/all_cases')); +export const getAllCasesLazy = (props: AllCasesProps) => ( + <Suspense fallback={<EuiLoadingSpinner />}> + <AllCasesLazy {...props} /> + </Suspense> +); diff --git a/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx b/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx index 104822dbee49d..b6caae39c284a 100644 --- a/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx +++ b/x-pack/plugins/cases/public/methods/get_all_cases_selector_modal.tsx @@ -9,11 +9,9 @@ import React, { lazy, Suspense } from 'react'; import { EuiLoadingSpinner } from '@elastic/eui'; import { AllCasesSelectorModalProps } from '../components/all_cases/selector_modal'; -export const getAllCasesSelectorModalLazy = (props: AllCasesSelectorModalProps) => { - const AllCasesSelectorModalLazy = lazy(() => import('../components/all_cases/selector_modal')); - return ( - <Suspense fallback={<EuiLoadingSpinner />}> - <AllCasesSelectorModalLazy {...props} /> - </Suspense> - ); -}; +const AllCasesSelectorModalLazy = lazy(() => import('../components/all_cases/selector_modal')); +export const getAllCasesSelectorModalLazy = (props: AllCasesSelectorModalProps) => ( + <Suspense fallback={<EuiLoadingSpinner />}> + <AllCasesSelectorModalLazy {...props} /> + </Suspense> +); diff --git a/x-pack/plugins/cases/public/methods/get_case_view.tsx b/x-pack/plugins/cases/public/methods/get_case_view.tsx index f8b726385c1be..00fe2438a1a7d 100644 --- a/x-pack/plugins/cases/public/methods/get_case_view.tsx +++ b/x-pack/plugins/cases/public/methods/get_case_view.tsx @@ -9,11 +9,9 @@ import React, { lazy, Suspense } from 'react'; import { EuiLoadingSpinner } from '@elastic/eui'; import { CaseViewProps } from '../components/case_view'; -export const getCaseViewLazy = (props: CaseViewProps) => { - const CaseViewLazy = lazy(() => import('../components/case_view')); - return ( - <Suspense fallback={<EuiLoadingSpinner />}> - <CaseViewLazy {...props} /> - </Suspense> - ); -}; +const CaseViewLazy = lazy(() => import('../components/case_view')); +export const getCaseViewLazy = (props: CaseViewProps) => ( + <Suspense fallback={<EuiLoadingSpinner />}> + <CaseViewLazy {...props} /> + </Suspense> +); diff --git a/x-pack/plugins/cases/public/methods/get_configure_cases.tsx b/x-pack/plugins/cases/public/methods/get_configure_cases.tsx index fcea95a3e9ad4..96a3dbd55d7de 100644 --- a/x-pack/plugins/cases/public/methods/get_configure_cases.tsx +++ b/x-pack/plugins/cases/public/methods/get_configure_cases.tsx @@ -9,11 +9,9 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import React, { lazy, Suspense } from 'react'; import { ConfigureCasesProps } from '../components/configure_cases'; -export const getConfigureCasesLazy = (props: ConfigureCasesProps) => { - const ConfigureCasesLazy = lazy(() => import('../components/configure_cases')); - return ( - <Suspense fallback={<EuiLoadingSpinner />}> - <ConfigureCasesLazy {...props} /> - </Suspense> - ); -}; +const ConfigureCasesLazy = lazy(() => import('../components/configure_cases')); +export const getConfigureCasesLazy = (props: ConfigureCasesProps) => ( + <Suspense fallback={<EuiLoadingSpinner />}> + <ConfigureCasesLazy {...props} /> + </Suspense> +); diff --git a/x-pack/plugins/cases/public/methods/get_create_case.tsx b/x-pack/plugins/cases/public/methods/get_create_case.tsx index 60343ecac55fa..b030ed669b663 100644 --- a/x-pack/plugins/cases/public/methods/get_create_case.tsx +++ b/x-pack/plugins/cases/public/methods/get_create_case.tsx @@ -9,11 +9,9 @@ import React, { lazy, Suspense } from 'react'; import { EuiLoadingSpinner } from '@elastic/eui'; import { CreateCaseProps } from '../components/create'; -export const getCreateCaseLazy = (props: CreateCaseProps) => { - const CreateCaseLazy = lazy(() => import('../components/create')); - return ( - <Suspense fallback={<EuiLoadingSpinner />}> - <CreateCaseLazy {...props} /> - </Suspense> - ); -}; +const CreateCaseLazy = lazy(() => import('../components/create')); +export const getCreateCaseLazy = (props: CreateCaseProps) => ( + <Suspense fallback={<EuiLoadingSpinner />}> + <CreateCaseLazy {...props} /> + </Suspense> +); diff --git a/x-pack/plugins/cases/public/methods/get_recent_cases.tsx b/x-pack/plugins/cases/public/methods/get_recent_cases.tsx index 13ebef7ee42ee..e87db9320ca3d 100644 --- a/x-pack/plugins/cases/public/methods/get_recent_cases.tsx +++ b/x-pack/plugins/cases/public/methods/get_recent_cases.tsx @@ -9,11 +9,9 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import React, { lazy, Suspense } from 'react'; import { RecentCasesProps } from '../components/recent_cases'; -export const getRecentCasesLazy = (props: RecentCasesProps) => { - const RecentCasesLazy = lazy(() => import('../components/recent_cases')); - return ( - <Suspense fallback={<EuiLoadingSpinner />}> - <RecentCasesLazy {...props} /> - </Suspense> - ); -}; +const RecentCasesLazy = lazy(() => import('../components/recent_cases')); +export const getRecentCasesLazy = (props: RecentCasesProps) => ( + <Suspense fallback={<EuiLoadingSpinner />}> + <RecentCasesLazy {...props} /> + </Suspense> +); From f5fa7f1e68611ced9ff11c9ff665dd1a59b9e6bb Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Mon, 26 Apr 2021 17:29:11 -0400 Subject: [PATCH 50/52] fix infinite loop, improve breadcrumb --- .../public/cases/components/case_view/index.tsx | 13 +++++++------ .../components/flyout/add_to_case_button/index.tsx | 10 ++++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index b6557154a1302..b0f3ccb8c21ad 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -110,15 +110,17 @@ const InvestigateInTimelineActionComponent = (alertIds: string[]) => { }; export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) => { - const [caseTitle, setCaseTitle] = useState<string | null>(null); + const [spyState, setSpyState] = useState<{ caseTitle: string | undefined }>({ + caseTitle: undefined, + }); const onCaseDataSuccess = useCallback( (data: Case) => { - if (!caseTitle || caseTitle !== data.title) { - setCaseTitle(data.title); + if (spyState.caseTitle === undefined) { + setSpyState({ caseTitle: data.title }); } }, - [caseTitle] + [spyState.caseTitle] ); const { @@ -200,7 +202,6 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = }) ); }, [dispatch]); - return ( <> {casesUi.getCaseView({ @@ -247,7 +248,7 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = useFetchAlertData, userCanCrud, })} - {caseTitle && <SpyRoute state={{ caseTitle }} pageName={SecurityPageName.case} />} + <SpyRoute state={spyState} pageName={SecurityPageName.case} /> </> ); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx index 7fa2ec07b0ea2..a4c6fe1e344b3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx @@ -88,12 +88,9 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { const handleNewCaseClick = useCallback(() => { handlePopoverClose(); - - dispatch(showTimeline({ id: TimelineId.active, show: false })); - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { path: getCreateCaseUrl(), - }).then(() => + }).then(() => { dispatch( setInsertTimeline({ graphEventId, @@ -101,8 +98,9 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { timelineSavedObjectId: savedObjectId, timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, }) - ) - ); + ); + dispatch(showTimeline({ id: TimelineId.active, show: false })); + }); }, [ dispatch, graphEventId, From df7097ecb29b85268d0f534c148965f3b3d2448e Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola <michael.olorunnisola@elastic.co> Date: Wed, 28 Apr 2021 09:48:29 -0400 Subject: [PATCH 51/52] fix attach alert to new case --- .../components/create/form_context.test.tsx | 16 +++++-- .../public/components/create/form_context.tsx | 16 +++++-- .../cases/public/components/create/index.tsx | 3 +- .../timeline_actions/add_to_case_action.tsx | 43 ++++++++++++++++++- 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 4a6afbede0d78..9a8671c7fc571 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -13,6 +13,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { ConnectorTypes } from '../../../common'; import { TestProviders } from '../../common/mock'; import { usePostCase } from '../../containers/use_post_case'; +import { usePostComment } from '../../containers/use_post_comment'; import { useGetTags } from '../../containers/use_get_tags'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; @@ -41,6 +42,7 @@ import { usePostPushToService } from '../../containers/use_post_push_to_service' const sampleId = 'case-id'; jest.mock('../../containers/use_post_case'); +jest.mock('../../containers/use_post_comment'); jest.mock('../../containers/use_post_push_to_service'); jest.mock('../../containers/use_get_tags'); jest.mock('../../containers/configure/use_connectors'); @@ -56,6 +58,7 @@ jest.mock('../connectors/servicenow/use_get_choices'); const useConnectorsMock = useConnectors as jest.Mock; const useCaseConfigureMock = useCaseConfigure as jest.Mock; const usePostCaseMock = usePostCase as jest.Mock; +const usePostCommentMock = usePostComment as jest.Mock; const usePostPushToServiceMock = usePostPushToService as jest.Mock; const useGetIncidentTypesMock = useGetIncidentTypes as jest.Mock; const useGetSeverityMock = useGetSeverity as jest.Mock; @@ -104,6 +107,7 @@ describe('Create case', () => { const fetchTags = jest.fn(); const onFormSubmitSuccess = jest.fn(); const afterCaseCreated = jest.fn(); + const postComment = jest.fn(); beforeAll(() => { postCase.mockResolvedValue({ @@ -111,6 +115,7 @@ describe('Create case', () => { ...sampleData, }); usePostCaseMock.mockImplementation(() => defaultPostCase); + usePostCommentMock.mockImplementation(() => ({ postComment })); usePostPushToServiceMock.mockImplementation(() => defaultPostPushToService); useConnectorsMock.mockReturnValue(sampleConnectorData); useCaseConfigureMock.mockImplementation(() => useCaseConfigureResponse); @@ -629,10 +634,13 @@ describe('Create case', () => { wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); await waitFor(() => { - expect(afterCaseCreated).toHaveBeenCalledWith({ - id: sampleId, - ...sampleData, - }); + expect(afterCaseCreated).toHaveBeenCalledWith( + { + id: sampleId, + ...sampleData, + }, + postComment + ); }); }); diff --git a/x-pack/plugins/cases/public/components/create/form_context.tsx b/x-pack/plugins/cases/public/components/create/form_context.tsx index 28e6278e3aa74..7ca3fe4b88c8d 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.tsx @@ -20,6 +20,7 @@ import { useConnectors } from '../../containers/configure/use_connectors'; import { useCaseConfigure } from '../../containers/configure/use_configure'; import { Case } from '../../containers/types'; import { CaseType, ConnectorTypes } from '../../../common'; +import { UsePostComment, usePostComment } from '../../containers/use_post_comment'; const initialCaseValue: FormProps = { description: '', @@ -31,7 +32,7 @@ const initialCaseValue: FormProps = { }; interface Props { - afterCaseCreated?: (theCase: Case) => Promise<void>; + afterCaseCreated?: (theCase: Case, postComment: UsePostComment['postComment']) => Promise<void>; caseType?: CaseType; children?: JSX.Element | JSX.Element[]; hideConnectorServiceNowSir?: boolean; @@ -48,6 +49,7 @@ export const FormContext: React.FC<Props> = ({ const { connectors, loading: isLoadingConnectors } = useConnectors(); const { connector: configurationConnector } = useCaseConfigure(); const { postCase } = usePostCase(); + const { postComment } = usePostComment(); const { pushCaseToExternalService } = usePostPushToService(); const connectorId = useMemo(() => { @@ -87,7 +89,7 @@ export const FormContext: React.FC<Props> = ({ }); if (afterCaseCreated && updatedCase) { - await afterCaseCreated(updatedCase); + await afterCaseCreated(updatedCase, postComment); } if (updatedCase?.id && dataConnectorId !== 'none') { @@ -102,7 +104,15 @@ export const FormContext: React.FC<Props> = ({ } } }, - [caseType, connectors, postCase, onSuccess, pushCaseToExternalService, afterCaseCreated] + [ + caseType, + connectors, + postCase, + postComment, + onSuccess, + pushCaseToExternalService, + afterCaseCreated, + ] ); const { form } = useForm<FormProps>({ diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index 5f4db25d72228..a1de4d9730b9f 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -19,6 +19,7 @@ import { CaseType } from '../../../common/api/cases'; import { CasesTimelineIntegration, CasesTimelineIntegrationProvider } from '../timeline_context'; import { fieldName as descriptionFieldName } from './description'; import { InsertTimeline } from '../insert_timeline'; +import { UsePostComment } from '../../containers/use_post_comment'; export const CommonUseField = getUseField({ component: Field }); @@ -29,7 +30,7 @@ const Container = styled.div` `; export interface CreateCaseProps { - afterCaseCreated?: (theCase: Case) => Promise<void>; + afterCaseCreated?: (theCase: Case, postComment: UsePostComment['postComment']) => Promise<void>; caseType?: CaseType; hideConnectorServiceNowSir?: boolean; onCancel: () => void; diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx index c4dc30dcf4966..1682b4b7e7dee 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx @@ -38,6 +38,18 @@ interface AddToCaseActionProps { ecsRowData: Ecs; } +interface PostCommentArg { + caseId: string; + data: { + type: 'alert'; + alertId: string | string[]; + index: string | string[]; + rule: { id: string | null; name: string | null }; + }; + updateCase?: (newCase: Case) => void; + subCaseId?: string; +} + const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ ariaLabel = i18n.ACTION_ADD_TO_CASE_ARIA_LABEL, ecsRowData, @@ -80,6 +92,31 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ closeControl: closeCaseFlyoutOpen, } = useControl(); + const attachAlertToCase = useCallback( + async ( + theCase: Case, + postComment?: (arg: PostCommentArg) => Promise<void>, + updateCase?: (newCase: Case) => void + ) => { + closeCaseFlyoutOpen(); + if (postComment) { + await postComment({ + caseId: theCase.id, + data: { + type: 'alert', + alertId: eventId, + index: eventIndex ?? '', + rule: { + id: rule?.id != null ? rule.id[0] : null, + name: rule?.name != null ? rule.name[0] : null, + }, + }, + updateCase, + }); + } + }, + [closeCaseFlyoutOpen, eventId, eventIndex, rule] + ); const onCaseSuccess = useCallback( async (theCase: Case) => { closeCaseFlyoutOpen(); @@ -183,7 +220,11 @@ const AddToCaseActionComponent: React.FC<AddToCaseActionProps> = ({ </EuiPopover> </ActionIconItem> {isCreateCaseFlyoutOpen && ( - <CreateCaseFlyout onCloseFlyout={closeCaseFlyoutOpen} onSuccess={onCaseSuccess} /> + <CreateCaseFlyout + afterCaseCreated={attachAlertToCase} + onCloseFlyout={closeCaseFlyoutOpen} + onSuccess={onCaseSuccess} + /> )} {isAllCaseModalOpen && cases.getAllCasesSelectorModal({ From e0e4bee1210e2e9c13e7aea49267f66d74f995f5 Mon Sep 17 00:00:00 2001 From: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed, 28 Apr 2021 08:29:45 -0600 Subject: [PATCH 52/52] rid of unnecessary log --- x-pack/plugins/security_solution/cypress/tasks/timeline.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts index 21312cf1cb367..89ced4b64cc2c 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts @@ -73,7 +73,6 @@ export const addDescriptionToTimeline = (description: string) => { export const addNameToTimeline = (name: string) => { cy.get(TIMELINE_EDIT_MODAL_OPEN_BUTTON).first().click(); - // cy.log('HERE:', cy.get(TIMELINE_TITLE_INPUT)); cy.get(TIMELINE_TITLE_INPUT).type(`${name}{enter}`); cy.get(TIMELINE_TITLE_INPUT).should('have.attr', 'value', name); cy.get(TIMELINE_EDIT_MODAL_SAVE_BUTTON).click();