From 4883d4bb2a89c3d16203fae837d555c3f5eb0b50 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Thu, 5 Mar 2020 07:52:24 -0800 Subject: [PATCH 01/25] Fixed ci type check errors for alerting and actions properties for SIEM RouteHandlerContext (#59400) * Fixed ci type check errors for alerting and actions optional properties on RouteHandlerContext * Reverted git revert b83f81458c11cbb890023e662920f3679c615ab7 --- .../routes/rules/add_prepackaged_rules_route.test.ts | 2 +- .../routes/rules/add_prepackaged_rules_route.ts | 3 +++ .../routes/rules/create_rules_bulk_route.test.ts | 2 +- .../routes/rules/create_rules_bulk_route.ts | 5 ++++- .../routes/rules/create_rules_route.test.ts | 2 +- .../lib/detection_engine/routes/rules/create_rules_route.ts | 3 +++ .../routes/rules/delete_rules_bulk_route.test.ts | 2 +- .../routes/rules/delete_rules_bulk_route.ts | 6 +++++- .../routes/rules/delete_rules_route.test.ts | 2 +- .../lib/detection_engine/routes/rules/delete_rules_route.ts | 3 +++ .../lib/detection_engine/routes/rules/export_rules_route.ts | 5 ++++- .../detection_engine/routes/rules/find_rules_route.test.ts | 2 +- .../lib/detection_engine/routes/rules/find_rules_route.ts | 3 +++ .../routes/rules/find_rules_status_route.test.ts | 2 +- .../routes/rules/find_rules_status_route.ts | 5 ++++- .../routes/rules/get_prepackaged_rules_status_route.test.ts | 2 +- .../routes/rules/get_prepackaged_rules_status_route.ts | 5 ++++- .../routes/rules/import_rules_route.test.ts | 4 ++-- .../lib/detection_engine/routes/rules/import_rules_route.ts | 6 +++++- .../routes/rules/patch_rules_bulk_route.test.ts | 2 +- .../detection_engine/routes/rules/patch_rules_bulk_route.ts | 6 +++++- .../detection_engine/routes/rules/patch_rules_route.test.ts | 2 +- .../lib/detection_engine/routes/rules/patch_rules_route.ts | 4 ++++ .../detection_engine/routes/rules/read_rules_route.test.ts | 2 +- .../lib/detection_engine/routes/rules/read_rules_route.ts | 6 +++++- .../routes/rules/update_rules_bulk_route.test.ts | 2 +- .../routes/rules/update_rules_bulk_route.ts | 6 +++++- .../routes/rules/update_rules_route.test.ts | 2 +- .../lib/detection_engine/routes/rules/update_rules_route.ts | 3 +++ .../lib/detection_engine/routes/tags/read_tags_route.ts | 6 +++++- x-pack/plugins/actions/server/routes/create.ts | 3 +++ x-pack/plugins/actions/server/routes/delete.ts | 3 +++ x-pack/plugins/actions/server/routes/find.ts | 3 +++ x-pack/plugins/actions/server/routes/get.ts | 3 +++ .../plugins/actions/server/routes/list_action_types.test.ts | 2 +- x-pack/plugins/actions/server/routes/list_action_types.ts | 3 +++ x-pack/plugins/actions/server/routes/update.ts | 3 +++ x-pack/plugins/actions/server/types.ts | 2 +- x-pack/plugins/alerting/server/routes/create.ts | 3 +++ x-pack/plugins/alerting/server/routes/delete.ts | 3 +++ x-pack/plugins/alerting/server/routes/disable.ts | 3 +++ x-pack/plugins/alerting/server/routes/enable.ts | 3 +++ x-pack/plugins/alerting/server/routes/find.ts | 3 +++ x-pack/plugins/alerting/server/routes/get.ts | 3 +++ x-pack/plugins/alerting/server/routes/get_alert_state.ts | 3 +++ .../plugins/alerting/server/routes/list_alert_types.test.ts | 2 +- x-pack/plugins/alerting/server/routes/list_alert_types.ts | 3 +++ x-pack/plugins/alerting/server/routes/mute_all.ts | 3 +++ x-pack/plugins/alerting/server/routes/mute_instance.ts | 3 +++ x-pack/plugins/alerting/server/routes/unmute_all.ts | 3 +++ x-pack/plugins/alerting/server/routes/unmute_instance.ts | 3 +++ x-pack/plugins/alerting/server/routes/update.ts | 3 +++ x-pack/plugins/alerting/server/routes/update_api_key.ts | 3 +++ x-pack/plugins/alerting/server/types.ts | 2 +- 54 files changed, 144 insertions(+), 29 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts index ec3db96ddc2f4..2b4fb8fa08a60 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts @@ -63,7 +63,7 @@ describe('add_prepackaged_rules_route', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const request = addPrepackagedRulesRequest(); const response = await server.inject(request, context); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 13373a2c2bbf0..4e08188af0d12 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -33,6 +33,9 @@ export const addPrepackedRulesRoute = (router: IRouter) => { const siemResponse = buildSiemResponse(response); try { + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const clusterClient = context.core.elasticsearch.dataClient; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index a497890b0599a..6ad9efebce2dd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -39,7 +39,7 @@ describe('create_rules_bulk', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getReadBulkRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 84841481a6c6f..ee8539faacf3e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -35,11 +35,14 @@ export const createRulesBulkRoute = (router: IRouter) => { }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const clusterClient = context.core.elasticsearch.dataClient; const siemClient = context.siem.getSiemClient(); - const siemResponse = buildSiemResponse(response); if (!actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index ab92f07852bfb..d019668e2a8d1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -41,7 +41,7 @@ describe('create_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getCreateRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 312ebbee3cd8c..cef7ded2b50b4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -59,6 +59,9 @@ export const createRulesRoute = (router: IRouter): void => { const siemResponse = buildSiemResponse(response); try { + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const clusterClient = context.core.elasticsearch.dataClient; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts index f804d4c2e55ce..16f9a9524df55 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts @@ -82,7 +82,7 @@ describe('delete_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getDeleteBulkRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index c4a1e0bdb2c18..c56f34588cbc6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -32,10 +32,14 @@ export const deleteRulesBulkRoute = (router: IRouter) => { }, }; const handler: Handler = async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; - const siemResponse = buildSiemResponse(response); if (!actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts index 0e4c22057d706..0519addb275d6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts @@ -56,7 +56,7 @@ describe('delete_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getDeleteRequest(), context); expect(response.status).toEqual(404); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index a637b7e0ef73e..753b281dbc09e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -33,6 +33,9 @@ export const deleteRulesRoute = (router: IRouter) => { try { const { id, rule_id: ruleId } = request.query; + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index 88e14ad2b410b..c434f42780e47 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -27,8 +27,11 @@ export const exportRulesRoute = (router: IRouter, config: LegacyServices['config }, }, async (context, request, response) => { - const alertsClient = context.alerting.getAlertsClient(); const siemResponse = buildSiemResponse(response); + if (!context.alerting) { + return siemResponse.error({ statusCode: 404 }); + } + const alertsClient = context.alerting.getAlertsClient(); if (!alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts index 4271dcd240546..57759844c100d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts @@ -36,7 +36,7 @@ describe('find_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getFindRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 936957a3bb1ae..961859417ef1b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -32,6 +32,9 @@ export const findRulesRoute = (router: IRouter) => { try { const { query } = request; + if (!context.alerting) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts index 182a2c66b67c9..9c86b70b88270 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts @@ -29,7 +29,7 @@ describe('find_statuses', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(ruleStatusRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index f222fa419f440..4f4ae7c2c1fa6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -34,9 +34,12 @@ export const findRulesStatusesRoute = (router: IRouter) => { }, async (context, request, response) => { const { query } = request; + const siemResponse = buildSiemResponse(response); + if (!context.alerting) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; - const siemResponse = buildSiemResponse(response); if (!alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts index 23309944f511e..03059ed5ec5cc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts @@ -58,7 +58,7 @@ describe('get_prepackaged_rule_status_route', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getPrepackagedRulesStatusRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index ea20c2763886c..7e16b4495593e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -28,8 +28,11 @@ export const getPrepackagedRulesStatusRoute = (router: IRouter) => { }, }, async (context, request, response) => { - const alertsClient = context.alerting.getAlertsClient(); const siemResponse = buildSiemResponse(response); + if (!context.alerting) { + return siemResponse.error({ statusCode: 404 }); + } + const alertsClient = context.alerting.getAlertsClient(); if (!alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index c2daa5e8f2f9f..c224e0f055b85 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -78,14 +78,14 @@ describe('import_rules_route', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(request, context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); }); test('returns 404 if actionsClient is not available on the route', async () => { - context.actions.getActionsClient = jest.fn(); + context.actions!.getActionsClient = jest.fn(); const response = await server.inject(request, context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 38b409cc1dc5b..d9fc9b4e3c04f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -54,12 +54,16 @@ export const importRulesRoute = (router: IRouter, config: LegacyServices['config }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const clusterClient = context.core.elasticsearch.dataClient; const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.siem.getSiemClient(); - const siemResponse = buildSiemResponse(response); if (!actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts index 1a7294682688a..19bcd2e7f0596 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts @@ -48,7 +48,7 @@ describe('patch_rules_bulk', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getPatchBulkRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts index 40250aaa5d532..7ca16a75fb562 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts @@ -30,10 +30,14 @@ export const patchRulesBulkRoute = (router: IRouter) => { }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; - const siemResponse = buildSiemResponse(response); if (!actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts index 712adb460d6f2..1658de77e3390 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts @@ -49,7 +49,7 @@ describe('patch_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getPatchRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts index 951a5c5abdb33..dce5f4037db1c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts @@ -60,6 +60,10 @@ export const patchRulesRoute = (router: IRouter) => { const siemResponse = buildSiemResponse(response); try { + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } + const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts index a6e84c45f17b4..7ebac9b785c82 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts @@ -36,7 +36,7 @@ describe('read_signals', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getReadRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index 584beffa7abb1..e4117166ed4fa 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -30,9 +30,13 @@ export const readRulesRoute = (router: IRouter) => { }, async (context, request, response) => { const { id, rule_id: ruleId } = request.query; + const siemResponse = buildSiemResponse(response); + + if (!context.alerting) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; - const siemResponse = buildSiemResponse(response); try { if (!alertsClient) { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts index 438b80302fae4..7a9159ecc852b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts @@ -53,7 +53,7 @@ describe('update_rules_bulk', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getUpdateBulkRequest(), context); expect(response.status).toEqual(404); expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 4607af524139d..953fb16d26ac6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -30,11 +30,15 @@ export const updateRulesBulkRoute = (router: IRouter) => { }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.siem.getSiemClient(); - const siemResponse = buildSiemResponse(response); if (!actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index ccdfacd7c3d5b..6ef508b817713 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -50,7 +50,7 @@ describe('update_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getAlertsClient = jest.fn(); + context.alerting!.getAlertsClient = jest.fn(); const response = await server.inject(getUpdateRequest(), context); expect(response.status).toEqual(404); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index b5825a19f4762..fbb930d780f01 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -60,6 +60,9 @@ export const updateRulesRoute = (router: IRouter) => { const siemResponse = buildSiemResponse(response); try { + if (!context.alerting || !context.actions) { + return siemResponse.error({ statusCode: 404 }); + } const alertsClient = context.alerting.getAlertsClient(); const actionsClient = context.actions.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts index 4663928ac1e46..e12bf50169c17 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts @@ -19,9 +19,13 @@ export const readTagsRoute = (router: IRouter) => { }, }, async (context, request, response) => { - const alertsClient = context.alerting.getAlertsClient(); const siemResponse = buildSiemResponse(response); + if (!context.alerting) { + return siemResponse.error({ statusCode: 404 }); + } + const alertsClient = context.alerting.getAlertsClient(); + if (!alertsClient) { return siemResponse.error({ statusCode: 404 }); } diff --git a/x-pack/plugins/actions/server/routes/create.ts b/x-pack/plugins/actions/server/routes/create.ts index f8f9aff9323a0..2150dc4076449 100644 --- a/x-pack/plugins/actions/server/routes/create.ts +++ b/x-pack/plugins/actions/server/routes/create.ts @@ -41,6 +41,9 @@ export const createActionRoute = (router: IRouter, licenseState: LicenseState) = ): Promise> { verifyApiAccess(licenseState); + if (!context.actions) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for actions' }); + } const actionsClient = context.actions.getActionsClient(); const action = req.body; const actionRes: ActionResult = await actionsClient.create({ action }); diff --git a/x-pack/plugins/actions/server/routes/delete.ts b/x-pack/plugins/actions/server/routes/delete.ts index d96523997ad34..8508137b97750 100644 --- a/x-pack/plugins/actions/server/routes/delete.ts +++ b/x-pack/plugins/actions/server/routes/delete.ts @@ -41,6 +41,9 @@ export const deleteActionRoute = (router: IRouter, licenseState: LicenseState) = res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.actions) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for actions' }); + } const actionsClient = context.actions.getActionsClient(); const { id } = req.params; await actionsClient.delete({ id }); diff --git a/x-pack/plugins/actions/server/routes/find.ts b/x-pack/plugins/actions/server/routes/find.ts index e791aff4fb598..71d4274980fcc 100644 --- a/x-pack/plugins/actions/server/routes/find.ts +++ b/x-pack/plugins/actions/server/routes/find.ts @@ -57,6 +57,9 @@ export const findActionRoute = (router: IRouter, licenseState: LicenseState) => res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.actions) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for actions' }); + } const actionsClient = context.actions.getActionsClient(); const query = req.query; const options: FindOptions['options'] = { diff --git a/x-pack/plugins/actions/server/routes/get.ts b/x-pack/plugins/actions/server/routes/get.ts index 26aa74da5d36b..836f46bfe55fd 100644 --- a/x-pack/plugins/actions/server/routes/get.ts +++ b/x-pack/plugins/actions/server/routes/get.ts @@ -36,6 +36,9 @@ export const getActionRoute = (router: IRouter, licenseState: LicenseState) => { res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.actions) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for actions' }); + } const actionsClient = context.actions.getActionsClient(); const { id } = req.params; return res.ok({ diff --git a/x-pack/plugins/actions/server/routes/list_action_types.test.ts b/x-pack/plugins/actions/server/routes/list_action_types.test.ts index 87cc4dfee5336..e983b8d1f2f84 100644 --- a/x-pack/plugins/actions/server/routes/list_action_types.test.ts +++ b/x-pack/plugins/actions/server/routes/list_action_types.test.ts @@ -58,7 +58,7 @@ describe('listActionTypesRoute', () => { } `); - expect(context.actions.listTypes).toHaveBeenCalledTimes(1); + expect(context.actions!.listTypes).toHaveBeenCalledTimes(1); expect(res.ok).toHaveBeenCalledWith({ body: listTypes, diff --git a/x-pack/plugins/actions/server/routes/list_action_types.ts b/x-pack/plugins/actions/server/routes/list_action_types.ts index 0b9791eedb39c..46f62e3a9c8bb 100644 --- a/x-pack/plugins/actions/server/routes/list_action_types.ts +++ b/x-pack/plugins/actions/server/routes/list_action_types.ts @@ -29,6 +29,9 @@ export const listActionTypesRoute = (router: IRouter, licenseState: LicenseState res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.actions) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for actions' }); + } return res.ok({ body: context.actions.listTypes(), }); diff --git a/x-pack/plugins/actions/server/routes/update.ts b/x-pack/plugins/actions/server/routes/update.ts index 9c5f32e8b9119..315695382b2d9 100644 --- a/x-pack/plugins/actions/server/routes/update.ts +++ b/x-pack/plugins/actions/server/routes/update.ts @@ -43,6 +43,9 @@ export const updateActionRoute = (router: IRouter, licenseState: LicenseState) = res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.actions) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for actions' }); + } const actionsClient = context.actions.getActionsClient(); const { id } = req.params; const { name, config, secrets } = req.body; diff --git a/x-pack/plugins/actions/server/types.ts b/x-pack/plugins/actions/server/types.ts index 2358f499c9f98..635c0829e02c3 100644 --- a/x-pack/plugins/actions/server/types.ts +++ b/x-pack/plugins/actions/server/types.ts @@ -22,7 +22,7 @@ export interface Services { declare module 'src/core/server' { interface RequestHandlerContext { - actions: { + actions?: { getActionsClient: () => ActionsClient; listTypes: ActionTypeRegistry['list']; }; diff --git a/x-pack/plugins/alerting/server/routes/create.ts b/x-pack/plugins/alerting/server/routes/create.ts index 8d854e0df8467..af518499a9abb 100644 --- a/x-pack/plugins/alerting/server/routes/create.ts +++ b/x-pack/plugins/alerting/server/routes/create.ts @@ -57,6 +57,9 @@ export const createAlertRoute = (router: IRouter, licenseState: LicenseState) => ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const alert = req.body; const alertRes: Alert = await alertsClient.create({ data: alert }); diff --git a/x-pack/plugins/alerting/server/routes/delete.ts b/x-pack/plugins/alerting/server/routes/delete.ts index 0556ef3d66982..fc36cf91fdad2 100644 --- a/x-pack/plugins/alerting/server/routes/delete.ts +++ b/x-pack/plugins/alerting/server/routes/delete.ts @@ -36,6 +36,9 @@ export const deleteAlertRoute = (router: IRouter, licenseState: LicenseState) => res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; await alertsClient.delete({ id }); diff --git a/x-pack/plugins/alerting/server/routes/disable.ts b/x-pack/plugins/alerting/server/routes/disable.ts index 5c6d977e62c38..da6562fb82af1 100644 --- a/x-pack/plugins/alerting/server/routes/disable.ts +++ b/x-pack/plugins/alerting/server/routes/disable.ts @@ -36,6 +36,9 @@ export const disableAlertRoute = (router: IRouter, licenseState: LicenseState) = res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; await alertsClient.disable({ id }); diff --git a/x-pack/plugins/alerting/server/routes/enable.ts b/x-pack/plugins/alerting/server/routes/enable.ts index f75344ad85998..1b995b7eb79b3 100644 --- a/x-pack/plugins/alerting/server/routes/enable.ts +++ b/x-pack/plugins/alerting/server/routes/enable.ts @@ -36,6 +36,9 @@ export const enableAlertRoute = (router: IRouter, licenseState: LicenseState) => res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; await alertsClient.enable({ id }); diff --git a/x-pack/plugins/alerting/server/routes/find.ts b/x-pack/plugins/alerting/server/routes/find.ts index 16f53aa218895..efc5c3ea97183 100644 --- a/x-pack/plugins/alerting/server/routes/find.ts +++ b/x-pack/plugins/alerting/server/routes/find.ts @@ -57,6 +57,9 @@ export const findAlertRoute = (router: IRouter, licenseState: LicenseState) => { res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const query = req.query; const options: FindOptions['options'] = { diff --git a/x-pack/plugins/alerting/server/routes/get.ts b/x-pack/plugins/alerting/server/routes/get.ts index 407d80b0f87ab..3fa2040aabc1f 100644 --- a/x-pack/plugins/alerting/server/routes/get.ts +++ b/x-pack/plugins/alerting/server/routes/get.ts @@ -36,6 +36,9 @@ export const getAlertRoute = (router: IRouter, licenseState: LicenseState) => { res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; return res.ok({ diff --git a/x-pack/plugins/alerting/server/routes/get_alert_state.ts b/x-pack/plugins/alerting/server/routes/get_alert_state.ts index b419889eea422..725b9139b2837 100644 --- a/x-pack/plugins/alerting/server/routes/get_alert_state.ts +++ b/x-pack/plugins/alerting/server/routes/get_alert_state.ts @@ -36,6 +36,9 @@ export const getAlertStateRoute = (router: IRouter, licenseState: LicenseState) res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; const state = await alertsClient.getAlertState({ id }); diff --git a/x-pack/plugins/alerting/server/routes/list_alert_types.test.ts b/x-pack/plugins/alerting/server/routes/list_alert_types.test.ts index 96ee8c5717453..723fd86fca8b5 100644 --- a/x-pack/plugins/alerting/server/routes/list_alert_types.test.ts +++ b/x-pack/plugins/alerting/server/routes/list_alert_types.test.ts @@ -70,7 +70,7 @@ describe('listAlertTypesRoute', () => { } `); - expect(context.alerting.listTypes).toHaveBeenCalledTimes(1); + expect(context.alerting!.listTypes).toHaveBeenCalledTimes(1); expect(res.ok).toHaveBeenCalledWith({ body: listTypes, diff --git a/x-pack/plugins/alerting/server/routes/list_alert_types.ts b/x-pack/plugins/alerting/server/routes/list_alert_types.ts index e33bb9a010bf7..6e2b7ebb9014c 100644 --- a/x-pack/plugins/alerting/server/routes/list_alert_types.ts +++ b/x-pack/plugins/alerting/server/routes/list_alert_types.ts @@ -29,6 +29,9 @@ export const listAlertTypesRoute = (router: IRouter, licenseState: LicenseState) res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } return res.ok({ body: context.alerting.listTypes(), }); diff --git a/x-pack/plugins/alerting/server/routes/mute_all.ts b/x-pack/plugins/alerting/server/routes/mute_all.ts index 796efd457f478..224c7e3bf7ea9 100644 --- a/x-pack/plugins/alerting/server/routes/mute_all.ts +++ b/x-pack/plugins/alerting/server/routes/mute_all.ts @@ -36,6 +36,9 @@ export const muteAllAlertRoute = (router: IRouter, licenseState: LicenseState) = res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; await alertsClient.muteAll({ id }); diff --git a/x-pack/plugins/alerting/server/routes/mute_instance.ts b/x-pack/plugins/alerting/server/routes/mute_instance.ts index bae7b00548a26..c0d9f01a99e23 100644 --- a/x-pack/plugins/alerting/server/routes/mute_instance.ts +++ b/x-pack/plugins/alerting/server/routes/mute_instance.ts @@ -37,6 +37,9 @@ export const muteAlertInstanceRoute = (router: IRouter, licenseState: LicenseSta res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { alertId, alertInstanceId } = req.params; await alertsClient.muteInstance({ alertId, alertInstanceId }); diff --git a/x-pack/plugins/alerting/server/routes/unmute_all.ts b/x-pack/plugins/alerting/server/routes/unmute_all.ts index 5483f691b5462..4ab009b5722a9 100644 --- a/x-pack/plugins/alerting/server/routes/unmute_all.ts +++ b/x-pack/plugins/alerting/server/routes/unmute_all.ts @@ -36,6 +36,9 @@ export const unmuteAllAlertRoute = (router: IRouter, licenseState: LicenseState) res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; await alertsClient.unmuteAll({ id }); diff --git a/x-pack/plugins/alerting/server/routes/unmute_instance.ts b/x-pack/plugins/alerting/server/routes/unmute_instance.ts index fc24ea88ddb67..26439d47f430e 100644 --- a/x-pack/plugins/alerting/server/routes/unmute_instance.ts +++ b/x-pack/plugins/alerting/server/routes/unmute_instance.ts @@ -37,6 +37,9 @@ export const unmuteAlertInstanceRoute = (router: IRouter, licenseState: LicenseS res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { alertId, alertInstanceId } = req.params; await alertsClient.unmuteInstance({ alertId, alertInstanceId }); diff --git a/x-pack/plugins/alerting/server/routes/update.ts b/x-pack/plugins/alerting/server/routes/update.ts index a402d13c5fbab..76b864a51aec6 100644 --- a/x-pack/plugins/alerting/server/routes/update.ts +++ b/x-pack/plugins/alerting/server/routes/update.ts @@ -57,6 +57,9 @@ export const updateAlertRoute = (router: IRouter, licenseState: LicenseState) => res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; const { name, actions, params, schedule, tags } = req.body; diff --git a/x-pack/plugins/alerting/server/routes/update_api_key.ts b/x-pack/plugins/alerting/server/routes/update_api_key.ts index 0951b6c7b939e..3c8a7d911b158 100644 --- a/x-pack/plugins/alerting/server/routes/update_api_key.ts +++ b/x-pack/plugins/alerting/server/routes/update_api_key.ts @@ -36,6 +36,9 @@ export const updateApiKeyRoute = (router: IRouter, licenseState: LicenseState) = res: KibanaResponseFactory ): Promise> { verifyApiAccess(licenseState); + if (!context.alerting) { + return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); + } const alertsClient = context.alerting.getAlertsClient(); const { id } = req.params; await alertsClient.updateApiKey({ id }); diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index 90bc7996729a6..635cf0cbd1371 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -21,7 +21,7 @@ export type SpaceIdToNamespaceFunction = (spaceId?: string) => string | undefine declare module 'src/core/server' { interface RequestHandlerContext { - alerting: { + alerting?: { getAlertsClient: () => AlertsClient; listTypes: AlertTypeRegistry['list']; }; From 8ded7f91c821b0b4a1ea578d907757b36ffa73fe Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 5 Mar 2020 08:55:54 -0800 Subject: [PATCH 02/25] [DOCS] Updates intro doc (#58161) * [DOCS] Updates intro doc * [DOCS] Incorporates review comments * [DOCS] Added image of a solution and other tweaks * [DOCS] Updates image and content in get data section * [DOCS] Incorporates review comments into docs intro * Updated Lens and Visualize * [DOCS] Adds note about Lens * [DOCS] Added link to es docs Co-authored-by: Kaarina Tungseth --- docs/images/intro-dashboard.png | Bin 0 -> 316373 bytes docs/images/intro-data-tutorial.png | Bin 0 -> 155494 bytes docs/images/intro-discover.png | Bin 0 -> 209454 bytes docs/images/intro-kibana.png | Bin 0 -> 367348 bytes docs/images/intro-management.png | Bin 0 -> 199087 bytes docs/images/intro-spaces.jpg | Bin 0 -> 78941 bytes docs/user/introduction.asciidoc | 169 ++++++++++++++++++++++++++-- 7 files changed, 161 insertions(+), 8 deletions(-) create mode 100755 docs/images/intro-dashboard.png create mode 100644 docs/images/intro-data-tutorial.png create mode 100755 docs/images/intro-discover.png create mode 100644 docs/images/intro-kibana.png create mode 100644 docs/images/intro-management.png create mode 100755 docs/images/intro-spaces.jpg diff --git a/docs/images/intro-dashboard.png b/docs/images/intro-dashboard.png new file mode 100755 index 0000000000000000000000000000000000000000..5d18acb67bef56eabbd9b2bb606d115a7d3c0078 GIT binary patch literal 316373 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

b@!+UV(| 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 z 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 o39( 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 literal 0 HcmV?d00001 diff --git a/docs/images/intro-data-tutorial.png b/docs/images/intro-data-tutorial.png new file mode 100644 index 0000000000000000000000000000000000000000..a00e41c8b2a4cbc588d543b904f854f5a39f6724 GIT binary patch literal 155494 zcmd43Wl-Dg);9_iDNvw=0>!0hvAalccPLV{1Z!~!?rv?NxCBCh;_k&ISPK+)cZw7z zMFWArn|nX!nYs5a`^%X*bKZPNCV#ke`ERY22u*cG0z67QG&D2 zhuEkmn5mEXP#@@ST8c7gl_S)^ud3;VJclw+&^!Kxn3~Z?#t_Ox3&8QKBPx2oAu{*|23J=|8L9Q;JI!_L;+O4 z;{-)sUhnOdgadx|x0g_x5NkllwLJm?xOToft}nJbUO4>5yZ1&O(rdoLz`~0!JQ8J7 zresQ%!jC7*wRPqf5Y`Rl-eqX70Fj!>el$IgdvLw^-XYy${u`U})UYM)2JJK<=P$$F zRa5NQa<1ol{PBND-sJ(aKHg6^dZ?70{RgH)6INxv+vNPd!$e~8f~$1)^<(_Ut7DYw z`t=Ey({>E))0DQsJVEcb@t@L@(h<;M+c-~I##_N`+D(;TK{`)GRL2U$dmQ*yImiw} zNd(Ii{AMfT`=&PiyJ(tmN={ae99;JC5CDaE9Lb< zNhSf`l*>=p@*XL#o zqc`dMruw{uy~!VY4lxJPGs{1)p~QbN&=81J@Y&s(wd^U?ov1XXvK=ok!T+@2eCV*) zFvyw}$l%m^mHCK5Oo_X7jT-mSBhH%T#bdc%o$~SCei4Jjo(8-L;>H^;mplIg+07_! z+p*Am_Lop*tDmC85<9W4NCZjQr1qY~UGB+lM^2c(n!bx2OVsWmp``yNn8DOOY)Ad> zXK0&)WO>g_xkQQS4+OStFPAb9I%W0aMWJ3&?^6oWts~#55@XdDx_F~g8y`Mk&bL~o zuM|8?^gZ9R@Qri&Q`LvmuxTc_fU^QKpT|kuMxPx{YO{1)mQPjb3obImwO*(g)SS`z ztmX7teuG7Aj)%jN?WQBSamQkd*kWzVu-!UtPN?P^0>blY<(CH5{iG?+4reNAABkKs z2~ubQKIHl5NcDn~=&Mz&K6NmaDUM?)RqO+nBmx(SmFF&@nEav=NE^JT^f7Ac@ooLp z#A%dFB9W#TM5K!Knzo6BomP0Mc9=%~;>7%Wn8*8x*Y>Y>#b1Cl{007M@hR)ms1^_&E*$8L!{K$bEN(+Co7uIO!ZZzmRb znk}QO97-ssVq+zWZAV=UR@eRRxti~I2g{A7nSOzZk0cH)QU!x@Zhmjr8#Fq;$Hc)= zown1>ZzHTQA+PHV5E|0XZU3U~5lF*qn z;d-+m__h5D_0*d^9~q|K6STz6VOBuMww3Hb#WF8YPP;;2g6*W&>{yKNwbmWHyw6P| z-!hq2e!+DCTlMG;GI5aCn_y_?rVcxtlq8P2GkI}QZxus1QJ|_wlbNN*CL|$YLdJP1 zd-p~sIV?@>x;HDR`Tg$1mQaaFMOwK*t@^D&yH-$jXufrvqgK6L@+%yu%La?V#V8*6 zSBHuG2=^J8-sW?z$w>eAf7+?137vJjS

HAHbK{PX(lW7c=0hTLZ}!(Jb8_HmiUD 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

hGYhVsV&Q9 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�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 JOhn)R{{f2FrP%-g literal 0 HcmV?d00001 diff --git a/docs/images/intro-discover.png b/docs/images/intro-discover.png new file mode 100755 index 0000000000000000000000000000000000000000..27e7a2c7285976cbca378fff118071fbfc5f3f46 GIT binary patch literal 209454 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�qX8vw>Bew#u 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 Nex@N`_0;0c{{ZLR)r9~6 literal 0 HcmV?d00001 diff --git a/docs/images/intro-kibana.png b/docs/images/intro-kibana.png new file mode 100644 index 0000000000000000000000000000000000000000..1a59230f2f1665340f870fee2a574cf0a2c20e83 GIT binary patch literal 367348 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%0AJ`!qupE(&pzK2HL0;yS;Ur>OFi650% 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 literal 0 HcmV?d00001 diff --git a/docs/images/intro-management.png b/docs/images/intro-management.png new file mode 100644 index 0000000000000000000000000000000000000000..3c14529a53e909680f56d2dbb3feaf35e6a4672c GIT binary patch literal 199087 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

QJWmZ->1QcT2qe1NQGa#VHOg~}6xx2^_ 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%0A|0Wc0sT*7X}BZ!{#VHdPd~zqULqXRMzqAl z9p>3k>{hg9D;kwQqHG4#mI~BtDDehp7&?K%s@0Y$jS8QU<34Zx4 zE(Csnd2q?Yo;4Q=Pn3*F(T9y?LTuX9H8GNnTiqz%wY!60`UAl)U4)wLvh?w4%pU5! z9|8WjRzDfw6Zp!sbVia`DkO!7(SGtMI|`Pk3ECuBqNK}e#*9dU2kt9+FFh|(vLgjV zq!kNeF7>Ah@SM)-b^egdmFb!k;y4sD1#PXanOPLc&YrhvzIU@4$!ASsFEHT8%0AYuwYP5oZ2kOqp=J|^yY-GX8U${Dj%fH z7BS0vn`UWg1N9lCVr{95@TJ{~+W1qo5ohGzvxxII=sKFL_xR^Zr-8#6T!u_eG-W#om%#!<67 zG(Ib*Pb(n~iy!BPK3$32g!XLvujRT`!-%>`fwC%-MDk*{*2^g2TTbzfcjsH$rja5M zZ0WosBeMtmc%F5ANL-Ohp%W8&FveEif@!#r%W+6?8_RkJn|F&(jR^jM$36qiX#IST z%~rPsLpdiXi`uNvS65`T4ibj~pIW=GQ*x;_-T5F)9Mntey$Kc z=H9WaTVqhVq@WnT%Mjcf#W;%vc(YrbCyuPhH^ib>U9~lUkuFxyN((-}4N*>EV}=*Z z(qsfJr!Z-l8-t(&(TNOy(S<+XpbGelN5QL7XAR7HVX+9hY=@;<8}W5!!upY2dBOXg zn{OKv#{6}4n60$E=GrEUjXFa&_HG4H(ftXm&@R``9{yrWsRI1Qx^-w+7Hfa?9zzrf z_&sZjGVH=lsZJ`WS6HB&E(xPcL*;`#cjOXRC ztfee<4HCd{)br+PY}(|`MEz+#TH-e8Vu1KR6ysr5pDpoUh5pJDQPwV?Ml`h~B(FU4 zzu)-ADPLD0TI-_Uf zny)fstsg%pW|$l1e*A>#P_kj?3$^rnd477o5wm1Vs+dfnBf{yie>%`H zzX+j}ebFsc^xau$faFxJu0pp`9DP9T;LmF%*IRW^cRhORNO}tSDIIRX6ds zGw5L>+C%iOFVxM3{oTxRp6KP}Sdx9O9~B<1`y&cvqinhdx^=i_D7ik?CNUXcMvq}% zW!OcJckP@fk1o8E7sLg^Lg!8q;`5t-zztoDf`646yo>BrlP9RpPGtIkJ^PAGBAYZh zS=+MbHK#i!pyBr8bXF=t7Yr*6D;*h*L{8zGi3yVp4I~-~!WSuQe(~l8$o_nXuUy5- zDqqYIX)aNL)Bx`>N-zQ!`lf4k8yrBWZa1=&5DnWUB%0wg!H zXNIg`P5RksmL}=7HzL(FqZX}EUU}RuH@vo->yTME`QVW+SVvX#LS7^g1=V~5XIxfg z8D=f(Y@LH{r3eBNo^F4=_sK3+BJ9Vwq>UUv`kc{@GJo>=C3O4aO}BynyLu61>Am00 z;W3CBZ#_5ojxYri?5E3ev_sPC7~c?a$d)N4h+*>Kelec+G#? z;YE;l5ptwqTaWWM(YQ_OH`pUF$*J~1w%~u&f_R&X4L0x3Irphzhv)rtql0fPOHa~_ z)g|9Qw%#A+cz2hXd^G<^fjpHT;!2sr&;KiEnt;Y|8N2QzP7q$3)OAA~0|7fj$O;x+ z^v6*7Bu_alV$Olw?+3R%PF96aInURRgt^4vU&ftaxz&@w`f0*h?ye6GL+=Qt`DXg9 z!Ca9yv&w*XZ%r4wJ`hI1T&u=i%gY^DjST!MeP(*wi$c|}O@biZ*zM*Gt^Gmy>mj9U z{#Mm8vlu>VV5-`N)zDGe)iUmr>R zX>tCs9Y0W#&XBtTV;U)fO<%|q%pJZCT~akOBdh0sh!2>$zuYU`37M_X>0Nl@S(XbQ z<>&jceX23;gQKOvB=;oA@Ht?>S2bBnGiD~;o6}%bRX^Xj_4Bi=@9)lc&omR{-EN=M za_yA;I24oJ?8IX*dqn z2|yo}vuw`a5#0$)cmdtmCrTT#k8;7^X959(A>x6;?-O?+Bok9E&_wvJlapMRD%+QF zMUTrq7qd?YKlpdMw(nWF&O1lmz6pMi=QUqdVwh+VtjL~KZGU7N0cQmRnJ z3>yAs!MsYvft8@OE~=ElXJFZ0To#J)dU@h}0qPnn^K!YwO}T0QYN@8i*_FM&JRS(BxKc_mK)x2I;WU&(Pmhfcb+&J%=b4+e9k0lDri#?pG z;Mk$jDsaiF1>grfEa=Ni10^;}8KZUrK+8mF><#XF3yR}5cjoJ11K_x#Ts_N05n1r- zP|f?ZLTrh9J($KtIKVr>xJ&iJ*Ft=&P5VD()t=JYk7qRGDAPPhx&wF9W61F9GnCGD zLkfMsD65A2rcbN#`}5@`m9CBJ&}iH256Ml57A9|bDj3Tvwv_mowIe}Xc?DFmc;%_p zsj2jC$Ub-UX**ehm8{N(sJjOt*>nf4YJM)=%jHdPjXc+mAJTJ+)|YC$rjOXfi5D(f zMwbP;xzH@{(tIeKIX$ zH5SiA!+v9SrnoVJWmnqu(GqqpmuWu5_FO8R;GW*4PLjCRMnvR8vViqgwV85*g`akaepEfWD zvPD$IdmzVW5a$=_C(;|AvE&1x+zkM@(I)&_*ZpZG ztAtuaq>8Ue0&dmsR@0{6|3KBsE^5y2O?KFpegb3NCq4w+GPpw@W6@izHrQ2ZFI265 z=q1-1+pm*}3dJ$B{b}BQ(Xse7SwKEhs6x5uE^z39WMbM=k>Ay_BIH;GN<1Cz#-yyXK1r@;=`i|3ed1}m2)?2)py z`1eUrL0s>_FLVZ(C+fL^<-n|ZLq@KTE3)@*CWXQX${cAmY=Uo{Thv$T9BN=b6r}Hp z$Kx6HtUZAYI+FK}=YDqhxGC;=gfs38+`LV_lg<06Q9Hj$H7s38tD{or2m~=n3#ZaEiTFJ#OG}tJq%vpcVG2=I<#W9qoUr_`K*GM|tDuiLN3;Z- z6un$d^IC49LP_e;eL4^=xIA&_?1MD&<#a1qh0-BCU1`vr3^x5d8BFid$?aJ^6h{(1 zYL{8AgQrH#=ihzwF-x)3|1fb8Cl!N2Q25=Kp{#p##3I+fGKBaQrzE%>)Gv)1qJ-3D zP|l5gv^0oo8F`ir5WII$v$*Krfmo$p?U)r>cOnorN}$Jk@8+qPzXQ&VYd3Tsid2Sz z>`J2XPzlY$Vw=G3N0If8U9)g3V)WV{m!Vi9l!_2d*Q>B*mhg9Rgz_2hGV!BaHZWb) z>(l)VuYQ;R>waIHP$Jr8?gRFCO$*!~%7m1Q&gUQ@hTCMRF&G-)gtTYQ&$MdgzJ}p} zEn7_BRXgJV8TeTjg+iI^a|+dbT-0?X3X;uj3xOoJakZ)6F3?2q8_vIlf40 z0zskE*r3DAR{aqPS`r@V{ciWYvT5ti=74vIdS%Ue4j~rCJ}>*M>2})sNYVH|cxb zk<-S8{*OpjYk#ct{Y)^qI@h}1j$N8Gb6hn3rYZn_>9$%_$aIZ$YfKc|p)3^A*gaYd z|B*fWwSyg#a&Ed%a=XInJLMKX&V>mKl2pjWM;PSk0T~b|%%@Eex&gg#q%)QjoiM_@ zUnKo`{TZUv;ZlI*@a2@l8|p8TD+F-`Muk4P_jrFFV=UMCpb!7*mV-d@kG*eZ6i*^DgtRuV`{BF2tE1E{U%@ zZxa1Wu~`hlJj8IKu~bjQ(iINZf0s5mJ|D)yp(-A-w2n7fvs8nA+6Z;;uCL}FvQ0P~ z>^`UNsyv}(M!@eX$CKao4B3qj?Jb+P{8k@QFLNcIyRiO29*SDD4J!~u);cW3vB9X# zG3NQ8buwR3!y1n$E&g;y+0(=3`R&^W8Sj_GV611You|>U?EQg-GxY{u)5{N>s<~_? z*eic@XPU1#v?`ZBkwo<+g}h918y;tc0tP+43@%jbf1J+H48~juyG2pr+qI&PfXwI48 zCKrGD^`&-HP;j=4>^lciqQmqXZdz1SU|(2V;6pc zVhlxc59cpk#|sRe^U`6ngK^$#Xvl>2r{l3Q(7lW` z=q5m|6NfS0F!#)$;|UCRJU)qo|rSdUSw71Mmua}&9boY0SvFHJbkBG~-w z(=U}yUu`!|aU6`dH&$T@!zs+5q%b4f`!`q;x-Y($Q)EY*0eJ^RJX@2r@iT5n@K(%H zpDmRX<*U6m@j}8PZ&*tW=-DOX@K8hrg3CYSkw$;9ZtK16g!ZkO@y-3R+-SENYjH!m zX8B1i@f;!m6s2;Q_|$g--eP}IuG|kp#d~j#gSYK9aVW+ag6t$G&Tr)02JgMG7I!N# zD?BnOw1jp-3u99ANxm!wtuom9?b$=AVd)DCnX5l0Y*UcoJp^e4l@G8djJM zox}a+^2@6!aw1du&1K+^!7Sk?#uo3D+Wng!!Kv+D-?wj0QOEg_D-5Y6Y+{-*nQso5 z)VhQpzer5khF3WIE;}X13W?&+)s%MX(Pri%lh{$oV5-(ZR);wiGrJtf$rwAv<0o;1 zBfCG4uXp$~J?$I!YY!D|8Ptr$azo{)LGgUc5;CDydpQKsZ;0Yh6EUXbXFDe-&ZEwQ z$zPn+{ZE^(tg$7Xe^{G6ecd-r^y?l^uT!tmfC$zvf0O<;EzJ+s{_uOAcF)XHlr5$f z%-k*yh0@@X3o8pOs>vs`ya1d1g3}^6#c#UZD-K7ktS!xc*nWC*4;Rl$8}1{j65c%9 z#pJg&Ut>rh)_r(<5lJ;A2#piqi6Vu}Wj7eOz5jC%%rz-0n0l~4<#XnK#IlD1e{~7 z)F(XLZRqv@uQXHIUib*fx}HvgSp2-Of)uYulNs{4G&4AT zVikVn`cy|gy%f}#Ds(>@7&cgA`Ih3SIfuNxBVZ2K0EU06mY#S9h4j&o1dxKAxkwim zmcu8Lrx70xt82A07hbwj)WF?rrig+z?|J-~4Sg_QS~CCva+_Nc3_ba27y0FK13F(3 zV#HBy&njc&navg#$BReE2AM+(YBrek+amx=hTU0MUG+9KRZueU(!VaIBwWU7qy6zX zBd{P!QTS0wee@Qb%BMz;LCl{SP3Mp*Y|JKne3g|DL3sJDPf8EA7^B z9Ub6!zz};F6hgL%=bP$sdjEJxvRQ<08qoLL*FrR8Pg&aLenx4x(jIY5;rL>D*5~C< z32&7#=^q+J0FIui7rP)uV*q-ESze7;LfS$`{>*aOE)@wS2?vkzGH+Zg2_&MWRtNIK zg}XVDQ>_tAOg*}e0zBS~A2>4tyw4rkmk!U+w#H~E_ZYR#ZE&Mo)nulLzW6>$k^~N2 z9`5dj!U{K(lYs*+%eOqO?6#R?j@)pUkH$NPR1c-Ro}a~P&E&wbsSXTB4;P{HA*G;J z2qNy+A1Xnhout=1M`BNm}Qi(b}3UxAZfPMW<9G1`MgeN!PS$-aUWK5 z!SCDEJ21qtzN40i?<}Ku_7-55W|#RjIXcynx$E2TR}2QIrJS?} z;uvONjDGKPGB#big^+V^&Zd__ z_2I6BFzPx_ko8ESR{Rzl;he7!cJdJj{YuEXsyO!fg}&qO))$ z@%`kf;W|bx2C*y})U*16TSb5SX|OiRi11`TmqIboCR)xNE6dOZ<-`NA`^BcdUABpj zX2905gZ(+iLp0FOWxD$)Q(%&;`h^#%s&(au97SwVAFk z^M=#Rb3r;V}9~zg6-`|NW@X zga`Zc+A7sXz@YWk>!C4p;tk_Xi*W}ym7)ixm`11U7j%p4GFC0M;B~t5SbB8ibv=zX zy$7ihX1V|IDhTcu^yMR>GxYb68IOABWb=`WZBb2c+(d0Af}DuT&5gtVIqb6X zNtp1nX6ekOy$X~8{p~&)W|BS;>!v)Od-VTT_S;<;{NYdvDc1@TV?USY{G-rFXH%UC$x^&q>Ow6S^yez49W1{HYU5+LK!)p2Qfpss+(L$4 zJ%6{j5cp6?yTbZX5-$Uv4+AG%mJcepMV`S#RZ>z`_6FuHJq%Q9iJ%q170eWaHheBR zKq8{@aMFSAuLrdwR8VlJq(KfzYwH`QBJi|9d$J-65itau-ymaE z>M`rIai}(@kB7m3mqLKt0WhZgQLUrW2D-ulEIEG&*7&7 zmy%!-lxl4*;>TMVf@{U7f9eZ@>e3Rftn9&($A$&m_gYxsM-EbcUe=F-?}?{6+-c&8 z@0%?VWwfH?C;V(TKUxJh@lregpRN6`iIM(6@+H}5j+n{Xb3boD*6H~QfuYE zkMMuAPvC|a+7lEY%Kqn7{pSgc!~_BWBX$z50)K7X|LEjDEQB;2JThClVmz|q|JnvT zC2mN1dg>;;>8t;(pT8{4R6zuzf$|1^W}7Z3NsjdR3CY|!MQtL(mx^k#FjoH``X{Cd z%5?muqDoV`XGTy~u(K;bQ|~}^8G^y%OOCs}STLTtiQ!-7?fH)jAVvtv{JbE2whj4y zibpK-3|cJ%06?+|AXP}2t!gMjA|fxEfgpE)^-oVtEuDYdcM(Xa{&&UdnnYb?Www^z z5wVhB$x$$6ywBI{+}u3)`LF+Q06~%pq%8)T6=e^@iqL0D@B)HRln22pv_gV6Rg&fZ zVEodGf3>F(UL7g2s9~c2Uk>8$BZ?1!Qd5%?OcYYg|i49R(b-{lp&w!NorOjK=?YK}tFOWz|lqB_B1w-%MqU2eSCOU@(LEUwjyVEud*ka8Rot-v zoIdjH+@6m_43GJi3c3WVafYJ8t?%wt_<@m?b#H&5O=S)`OH;%pfh8!C(bzQhb;tFlgJmCox z(`Z-Y3b*3BenM&&cEYhfypvF}q%5)JjUhZ*k6ucli(&95FJ)TWTpUBXm>Z8-OBej@ zzq^pz-I=HKxrlVt;|eXS(-RB2w&V-W{aNma22DONTvBgnYhUu0<0P+0ETUn zWf*y=_dNP0bz+3kf#Q5B%)}SMJ-Xj*scriZ_(@|QJ_ny#~73Y|=?|-54 z*^Ne*S5r8*6}F|eM8euaGJ5C5?9!F(hRWn2=%)Q`7}`|k4B%k{g{!d;Xeto=z^hfu zvIN)9d2J!4>yN#rmnD~MwL0+)decUa648IRxrWtNqzea;Yzz4?XueVCzkiYA+u_zW z2x+`xR3!`lx_LZ{prWD4eO`Qz?c1L>kuggH(|D^0CRFAKcdLC%$KAERsP~ z_#Un80U5Kr@dY4Fj?9#=rTLgTzeIB8+@4f3=HEp)+n6I^fbd;ed2!l$iTYOeo6BqR zF0MR8_3j@#37+c`M^5us>CaClg80DonDEKI^pdcTBZvD&1ZXlr(xYL8I9IP(A3cpO zVX}6d%uBWSjOW?ZPMYw;X@{xQs#TP12e?|}HiODexVNR1%MX**Jwtta9dC)Dk3VS0W=7%yn^^{++fa$g@`|A5dJNykBJys)LmT#TD0 zn9abYQdBXzcz;E_@9SCpj!*Hnzvso7{j7GDJQN+Fj`no~oL-X-9R!9~c2;z2xQ!2!yrJFMWGTxQTLbQEGl$W>Sh-B{BEG)F2H zepn7Zd~I?8Wx8A3@R+@2ya17-MuxLrUpwx3GLY5-Z>If5JPk~ zNq}?*FPPJhG_8qUFN@S6tg+_QfMhFlx`@o4Ba;7qIVT_mfpwoKGq;aL{xY@%crkHt zA?gs|9B_B9`sVkejQdJH65Mws)H1n%|V2~SY z`{9tnnqpvK`KZ2ssQ%zONX%HGzA3N6%{QBIbs_;Sjr=0Sk*11MO>THGkk))fDO9b9 zDAhT+pv({eb8Dl#r0(s=@h>g_*SU5zRD6{!bcmCA1YV~|NF`~VpRW>Q)$~E>a{R@w zGljEDb`K=0!-@O%8UZR^{pE$UX-r5d0b0|iK6|#f{ux~)#zD0E?BdN86(pD0cLiUxQkQTyl1}5B6SH@sQOxVL|&gT1?3gu=su4p@51Z3ZLMSzwao`nkI zLx09>4CI^{KzH2+Y73D)ex~!usnN`YN zhOUuEwKJs|m3hO61AXqWJekKeaOI8_V3NL+VSMI#{aOH)TnYn6a3^kjdv%MWIe)?> z6hBu68p3#tQ>)?tDiXPJdZRG?n~1w2=pQ+Z_A++UWR3hJ!r9AYWyR=z^J}GXT^|%P=*^nJ}(sfw?~)AC>8ikGn&m$)PnA53@0WbvAy?Gwb}I%0Xnun3Se(< zKYWmgm6Jm(Jt$g43Y>d#elqaw+Cqit)T5M8YPX~LY~@pG9*Bln92;SmUGZ2*09{#l z*!Lqm#nw=zERnpr+TxFQdp5T2qE(Q`b;9ogxeb@1t?Pv5Nr3Z+3SATT%xu+zQoXt< z1j6?K<>sh}_Moqay-OON^~HrBnf0SSKd&7rGPm-xta?CpO$Y}b(t(RlT!(5{1`xdO zqRc~I+I%_DeJp>|E+l@buWXkY>$buCuHxkTgV4neVBj3Bg78ojhBKr^!&-=jX{I}J zYPBVe#<&NtlQZ5<3tRY3ME^XpT9Q;iOI_VB3xXwZnzSrm$n?#U4yvGCr4vDOQ>>>l z6Om9f>1lB^93~PMKXO=UB%Rv@YJD&Gyq;1$Yd9|Wf%rQed4}I&QJxnwbGHTUo?X6r zu^P|7ZX-a=BGCx|mwgTXxvSVEGvbkr5;VecdgWt+ba=mM4X!>9pA65p_^rny599>+ z$qJ0s0di3VqQ;AMtU9kk=>;ZZbihP04Kz8W=!6tKPF0vDHKG2(9!WT$(6 z>k+D-6kw{J}^WzZ>aVCDO(F?occLMJ$zSC+(oiAqVK!MwK5Gn;dz@`Cq62~Pc zQ{y)7zk3mM$=zo)-YUmvN6mjdb(NtCXuD5^9Z{>RnTNB-NbIYtBk{YmICBt@d)|U! zf6!=FQ(|DNvK{2~XFO*(?doM`#|wjH>}W?Hikh_VwSy@y8et;7+{{c zs%SVU4+t{`y2-D37D9_HE9R^WA!1et1CgU6GL(@Vi*cZTJqtIRSlEbg zywDIObdjDrc7=pRl|dY}I-;O`2Gjk~7E~N-r_fH_A9CA2lwCVYY&v%9mngcV)2w)e zob-hhf@VW+j(4#@?J|ek#u+$YboAP9lr2+k`a3a;EO|UMQSHTa^G131&d~|Z#9}wc z71!2x2 z{v!BWNom^o}{>Sx?DFtd=jDu@dk2bWoBj`l$j0!3`QoF#&at& zBT!wbCHPoRYiR3PUGQZ7+~&{8#?$s^_LRp!vhPuc-E3=d!X*c>1G8D51Fx(c7TIQ4`DGT0Tdf?QVanpO|+MCszFyn!7dflXZ|C zP+r=%NC(-K!~KB$MQwI<8#rvobwQ-OR41>=MiVPjwu68LriAT5< z?C&_Ta)ffverJkIyppYPtFdO!U;j*GlVG`ceO>bBw-7F|<2C8h{XQv3D+2I*m8|380)sT^p!vdWeoR-TLp_9y<;>GL=@T&qlgtM~Wz|>AlwO$Oz z^A*{q+(@|w8F8Rt3UYFw?W2tCQZuwRyM<`-DAv|R?#&gljE^Eaq|KsT_xZYya-lbt z>0}O5iGE8^i}8RpqjqC&h_+XWFP>V3&Pe5B@yz#7S;w7zY3kmnjv%@d{pA{|ZBbf{ zO4h~UMfr|A(m~od128a2OB0_IEZRbJG&4YrAAO{iO9>y8T(Pj#9rU$Ky$-+Dydkt+ zx@lz^SFhX+$VJ z(r%ZGlx1N72=!nHT2>)2avl50U}-Rcji`K|KIYXd!lt7aJEr^x6S1EyI(I3Nc}k_9 z56G}<0pRa2UG$fLY8Q_t8o3dzRhQ)*=SksMj&1%j*1YS&nVj$t$LVGU*?tMiz>s2* z4k=jQWl^<#_Zd*0GdsB0)7UdM+vr@^a^FL(vN}3HJBj0aM4S;-OO+V0t9BJoM1go@ z+621bc)wl{gk*IE0@_97M^R}MQAYNhit_V~9(F1&=sq!tPh@pAdtQ-;#o&O@-94MzOlJ0uEa&o= zg&vz>O$zu;-o6iLHJA(Tx(-#ZQ$fv4o6t-Zo9I%|k3Mo-#u@SWQNvlyt}J|4p^-nH zqg5>l0RT{rZdaS$KY07E5tJ&z_Dr%I+KCUu$KU+QJ zuIXB!KcIf=K)%@-ko~jjK)Ml7Qvr@WB3!V|FDBoZK-R2-z0_}Y8t5PkoYZD}AgFgR z9rD8>b3J2Qovf|#DrN;+YT!HKvBlXn7PcJfxwEYseB)SF$A&d6*CWgJw3l?3BLeY+`Ejs8)XShq% zR-E^7(F5iqgIb}Oos{sSrHSr4+B!qhYaN{lc4_1poH+o~^uOWIKrY8|=mfWJVk{2+rsCEJQa z-JokCEZsuzI?bsV>bkd!ish@ayD@MALmsS|T^trFK z1n<(yu3SUhRjRxk+~z~8FII-jB)eekZ>q$Qc1?<=k(Jl=mtbmt(mM)ONZu}kXb=c* zJ$}=Zx)fOQ61fXtUkGS)k{T%Jv^pa9gEIu?^ebbY^gcyP(&A;ovQ_6byT`3N0@&b# zm7{lZvWcxuXg3UjAI?S}5;lKtOuB6I9mhW(n514lMt77YuzWP29TB1>ZYr=`wmBvq zoNA9Hx7Ccb_{_l^=h+crbtRu8+h=L_B*4KOpe@XzqRjM~u$)1}a|TZo?ogA51;1f%YtL1t*uSTU_ zOl5nw^)O-?lWwEQU}ejJvGq>T5nO?r`(dmD87nIZ7;+v2+@;yx%BMIW|7pLTQKoXV z%!7E<;e&U*)iuK7cKms!R51=Gr^exY1F`SdFV>gdP>x1Iv=v8ne( zp?U?z$;bBCO_)zTxqWZqcjd`WUDzWtrCA&b?e0?v?BGCp8vB8?G~?309};zw zVB%0=8|9WjPc?W4;w7Lkk%TwU15l{X#eAq8(1L1+pvk1icf@ft=!mOhFG~@tngKfE z{d9&p%f)fAg^R7W?u6e?yTCeJCQ|^D;gP4@`O%o|6UFJ)(P^zpX}z`w#1CI6;MFDS z>5SIgg)>_wwR+6Vz$_%yCDRMRhFr+~p}%O&t2SWSnkz)MYY9x4?Mv=*qQ&1LNz-~J zh&1(52k=$(oT|u&NLNFGF(XNErLL;}Cp*uOY?`LeQa^@$<${k<1jn7y09a)Nb2uw=+ns?kzqyt#~uRo$B1nNk#qvd1k>br1+Od8KW3xvZ=4fs=5 z=}`f8$FeqScwmjK=!yfzdWWSdy1lx~~OUas2bNRRn`f@>aMtvyUVQ|#iwcG#jPAW%)t&AyS% zhBxcMfx&|_9y_hQw@+Z&6V&mCXJ1&(=Z>kha42WCiQt4yN6q#4Nr+j$HTrm-e)m%q zowx52;!gSe-Xn~Jnt=Zf)L?XW;C%h?a2DOiiwBEho8$5 zZ%FK>QgL8fN#og)D$nre+t)_|wJPJWTmQDJ(%Z9MT`_Gm11id}W_7MILz=-3`@v{l z9`6?(=!H>pGSkr{vw9+LESHw&w~tXtE=r#=uDWZJ(*qVDq^2&Sr)6szwMPd(W<&67@c9Nd8azAbxk1BB?L8Z-$C$2fvl*$RQUjh5_*@QEec?2EEHFf3j3h&W6GYb{X^Z3I0R->oHV8yD`bE$e)< zjQunB*M4dj(x1#Vo1Fy=eL2pI3km$H_0W*15UYT~#hc}d0XO<`sf&Z)p$qjZM~h)t zJp~&aX(YynkhM)58m6WG#p43uzucaVx_^!{j$)@YjWm|lc(xQO(DE_brvLT6$?aJo zac^L@Psn)lwZUB5GSV#D?}ulgiWqC+lJ7)p!L7EryMpXVQ@uNR z=6r1P@0{Y|92yf`KxkI~cw&vB1p=c6|4fZ-9pHAqABp@}Yaf#7NR&>`tl%5Pt4v$% zW@dn0e^S+#1kQnSYadhLu4(J*{cA4GRToTRie>wf&-U=GC!@HbUo`;vDyE-OK41k1 zTq7~tjj(BnR{B6JgbZkV&rBV z4Q2*1aVla3WFWCdd~M-#YvmbPs5%v~`88naL>3`9Pu;^YIv;li;DWJ-y$}e=@$>;LXsBg;(8Ngyfmki$sx^ySvIy~_&MVsH;u-F z<+ru^r#7>5lLKD&^Wy4TuM~kA7opuaUVmYY)wpY?yY1jI_7@bfDbsmAi>kMMU-vDD zaoeyT_9ca~9r`iQQhYcUD4&OYVtGGPh*C(i%r@~1B z>>0T>?4NbyFa*8*CD=|$VNhN|?M=9*)z|#Q>hXo$n}IUEufG)}NS~`VK~jm-G1}h( zB$}qcB<$aMo4fGt$sq3t8d!1kK0d#j>h*k2?>?SiTrITxA^LEC@;-12DiQ>j!BO&g zJb%FXL#|sWfn@?gRq$<=I_AZO-U$&sCRVr<0(QTa59*%1Vq6j^$`EtwZ(;-?xFP_}gOjpVJxXdcpKdF^pe$vmC z-KfS}fBOKn7iL+ZxgkoVlfY$vONcM{jt=uaz1S};Cs*ejY(KTtWtsehBJm~&^?1GC z6M;ry)xndrjpCfPsl@AHiln-o?tD;^Tba$p=3l*5bT;NvhTsqeu#m{)<|D@vTqYzW zRBm*Y9-I`mTHEJu^a=iccoK;hyC4k-so7h-Z8{~sH@sseX5urw*!kGp1b4dG5`M_- z)idat#l?}*e?EjL25T@iQ!4KuN}ZCvpbDvo3(*poY79@%s2K;Ufn#s~?L0<$$^^%> zElwXvOQ!8zEL9LgSnuDakM@O@pQ){qJjFl*=rFWG9e3}iy(%7`6rceNDRIce?3cW| zUMC-o98OF(PE==Smmbdsz^UF3_eERH4YVOnjT#!sBfH!y=@K*Ohkk9~26$+wy7<`L6xuE;Q zl6j4nM>abeQs>e82fa$J9gvA#KvG=hWL5#L2U4uNQhS*yL&)YY!!1wDOOxM80& zOnxfqK}sI&*=L)T;bt#wZdcQt{V>VbLu=i2TnO9w@;l3JJLUFemx%MpSj;&p)())= zB3|cD+uLYMP4A>D%31A>+vpQl1>=#`zrjMweFXz!xF>%;v9p)hQVuadTvi3%;jw!b zid`8WK*|k%WBOpi7a*GRiQuiK$IkV=C0?lBjJU!m*_w^p{(5-ERMQN#rWYB|b|$eoBi z@0=gVEnEpaN7fw_Y2muXdWRmb;S{+r&+uNs5)koNl?;l zm$AL)`?W1vbv%?mcGPXs2nek8uQ2L176COHH~4YJwUz|p{7W+%`jy+e)3PWeV@kyX ze8TXpuKM3PwTIrzNS@z?`YSp1VE)imv!UzWbL5XjbV+W15+BLtcfSd<)}){veVeFf zZI`f_)zoe3zlk}?%*;RIa~(pU{*K3H8wd~WlG8O?(`XfE#-IU?df#INu>+WwzQWwq zt$!#=9noz6!SCBoJGa-$;K3a5vxF)gwfS!J+yHhE5m2VhkIHM^0rh)lW12lkPkpU= z%DMl?`S)tUlkT3xYAWY}%m{MohM7vevXMx0LsPbicX{AOlisjtAthaWXafezPH|hm zsa``vNdP$FtprIIEP_2KJ#IXPl~@Ur6{g{dM>o8F1onVn88wo$FWgEc)eI{oT+Cu) zzCK2@&fB9)i&Pq2c(PxMxdF!{yxPpoe)zuiievCkcPbpu<7Cm& zmG`aZMFI}nrayjP6Kux8TN!9NEvH7B4Q-KXA9D13I1UUiR?6$+$<|&o;s#>R%c? zqOffmbDw=f*IGWtC#LL^3%x!)f7?Zhr$ND35O0$%6#$Gl^gAcI9-MkT98^rosbuZa zD5ihWx$!PVlXMiMWGfI?OQH<6z~k2mG2`A4iN}o*8YgDb&MzJY1$n~jbrRxJ2*^m` zlH@XeB649a$&><2lZ(pe(#c$U!tk_wRtb#)1Vu(z zmO2@gQYJLidd`8Z*2hrG0Mwbfh+>Y%)Eu3&(t@4Q|Vii9T`!j$<3{6c)ue$j$?(?f-)M?nXHDvmXuy;MSUz-T@-c!T?N(ets^9fjx*Ug?6GO)FNqz|$l4g7m`mdT z>D=+^vI#L5)AHuxW*dxULxg?eA?crMe_67^F_|Fr9Pahs1k*cpoXw(DM9McN3(_wWn$8JX@l zygas@m0t)OLpoW2zVM~q?ARZ|3`oMlczGPDV8w>|qBGHs7Cb%O(YC+3!&Vw};Dc!{ zL^lnea8JH!&t+Rs1DhT;%GE1=_g;Y@Uh(?!>HXh|S`nx_xW0XmFA!$l{Zf5Ezf+AyU09uocnqDmn{Av~K75e&#~HzmtD_Jv03^qaC1di_PW8@Hlu#Kw17mVOE~)+!p%#B2m8leJfVEgbn8*j zweD61UCO$|6C}EG8DqmMC8U=0Adg9YZ)1<#GCabm)1%g z;=Vx1S19;ad|butKjU+M=bul0((qv?etsPf{C_fYmrC%%7nhn1C%f4Q^YO6-1^r4% z0amnX4GhnWPh6Jh6x8chq%#u?(P)%$cB^g!r5&B@3--HjnWoHTmC*G9gH7g%p-ozL z5k5<>fHO-B9!qowZzN)MZaI3BhG`2_%YS%!u?B57|SKU zJ9Ji35c!|Uqh243j88Wek0u8O+Hn($#&b9}weWR@>b%dqH>89By`czc^5n=e0x~VA zjicf^R5A<8=mSx>lUTrCsG3aLx_~JCoVAvC2F(u+#x>m4?hF1;U?6CB2U`3EtMndQ z%t+<;!T~ZXqvN@BiEp%q)#DwUWep_!5Ype~&#M-r)$_GbpC0$~R;@KSa(AfGm@-jj zrV4*KZbMSnhxj(>h}%aECa*v6jCQCB4S z`vvp&r4uem$`nu+V7~yN6Fs*?`R z8i;f753!ph^x*Z$N=r7dJt{hy)vh!KM|FB^4AEKAa6v%P_(x`Kl@4dPmfG!088?{s z+jhYPy+#&F{CO!nwmtG$whN*imCxcp5^5Q&w6wh&x4~(7Je?@cZr^qDHspD8r@5Wo zgLreuQc^s?=)3$(G5GD%=e1qLzS=t5MBeFyTc{8l(ecDi8oMhau(jo;>T+=`&+&Vl z_1MU+}O_kB*IdVO7HCD`k^TTA`{K0LOas6J%)W={a-&~9L2C%Zn4yB zFom?}3 zz6pq~(uyN9QV>BO8NTrOAqvcwmZNz(1Y$(A^>$2d^F&6)1!LG>D`O8dzMtZow2L3E zK*yK6@n*(niy{6(qj($0`|@>ZTE59Cywg4pTTKYb`Z__LcE9X>_}gpEzZzjr(a0n(yPK*A3=w+85PHaIC9zIVu#AjRCf$pUOw+xcF=5b zfRY$^ulNs)jSf&S)JbaW79PJR97H6RUb|lB?zohzPflu{d3|`rc}Qk92oC#X!4L?mzxobZ zh7D`0r*IQv#U6vN7+xFZa_g&&pgb$oD#SmC<|wDyN2eA0VJM3DB6O+viJ1MneQkAn ztToaIbH)A$DQOo+XT1(4qHo1861#Nk^+`=I>uJr8gSKX|tAfE$E)$7Wc@Chr?)Xwf zgSCcu3wv>;{w`RkTm$O$`Ty|smQitaS-W;1I6(?`2=4Aq@ZjzcG`PFFySqbhcXxO9 zK;aPF{i~<@Jm>B1uh08)*Vv(Xk8}zac!{ zPeR0T;ptUBSYcd9QOlp~6dvdkcRh4k8AVpGQSlN41R_kyoo~D!-5tjq1ZOV9Wn}Yf z)TiG?b|l9$2}7ac&U#11$0b)?zY&Rg>ydqkCNv?`n4G!a;4%nIIh`nrH`AZ(W?Gm) zzum0Bas~$JwNpiqzDRbaC~zs#uCq8IMn`LgOP`y?j*foTjjpoI8^IbSs^lQf-&S5i zq9| ztZNg&R4`n7?vTo<{{=JK2Urlp&z6R>FD2>kFdhN~{|qzUSC73}i)ji-B5Hee{b7RszV7Ad{(F~w8-eEXH&kyIf19INz zYc-fs4X-by+DO?t)w(C%@4?^gr)V<28xne(>fA;@@MYs_zMVtR(!jYz77kv9v0!ee zOyXKs#Rv>#MVc*Vd%a4V7+e>vxKg6fxtTKU5xg0qy;SjoR4Rh7yu9Eb zWBMT^fwyqPvn^i;&TbrUbe|7CDEP;W51w7&Bs!(*9j7WfTyWsiS8O3NL(|uY34Vch zb6VbCvIJI3TJc7L^x+loDUUFN2_h)qAPw=7y1(Xy76#hAhUC+Y@lvts3T}B7KRE&z zlVU8qvd4ksd|lIZ3ry%?iswD85YR44_(et&ye>HgcozgC1Qf;U9+6>beU_VsFuEUX z(o1}bq!0^PYF#3hcSeP9QbnmXqGT zP`O9_F(ee8uQN%!k=RODUV7+OFCo9hwYkfSL5k@~s!^TJ)IoQLw5~X1yCKt=cajJoN zqs5G6%j4s-!!;BH#P(s%b1DP1lzhW|T!P$y;Avpu8Dc{*uM}qL25T#b|3_Rbmk|ge z+nAq#a*)Bq z0CY`f7#fluhd?@LEi8g*TWisk%V5t!-H8lGrFP0YdnCpE0=O}JSa?iCiL=XigpGC_r%#he*v>s;beuv zDekOps$NfOjJ?$)-s(C#xsZbBigA}k?pe2C5Tupss8g2rOdKGT(W^^NndpLr4QB>t z2oJl06kWAmXGn5OTy~+ce=o^(<@hf7(8X4LZK?-^55LY{V7ejcv+H<%ew2 z6N&>nV~9aH~`FmZam z**=5d4u*)&-PgiLG1&w{?V{v(-G@EJj`XqLjv3e6CLzUaa0z%_qrst%*qodYl3g|+ z$4(cd&VnFfd@qPIy!1m8y(%sN3iepjbkC>vP`j*^K|59bn3kwl1qTB#2R3O0_ zc3d7oq3iZRS4fqL-ycKJSFej5E8wIlavgmYfWZ`UcXLyaiaDB_H9S+UW`jm4?^~-@ zXTP4cj>&O?$5qGDu18?VNwpNkW&g-HyT37ld-Cwsq-g*WTjmKq9 zOR|sHY&>LvA4048_VzX@B?$zMR;U5F9TLue1JkKQPbRW>rU$e^i=ZA1OI~YRTTh&H zp$y&kZ8MS|=OPN~5BoovL&5U~sFJ3eTO>D1NBCH3xs%mZ-zU@$rm%iVs!S=#d%nlq zsk)lwcj{m;l{qgkXl6o=IIsadV3~S+&B6=|85^KVybidsx!e64!ul z={E?_w?}KR=;kVYgyKlKyYFX|Bd!rXkQm~}j$25iwBaz6RDVJcpFW3Bermdy870+v zx*o5d{b=qIGetiAwVtGPp}H>ZZX>33&&}Mmw`f}|aj}2^tfM9G0)-un&OisWcWZ-< zmJeX+uIAf-%`%R^I(zt!m4e|AEH?8mL1L-*<_jezfx{rEJ$CJ!xj11`&%Bu62AQ_D z;#Z4uYbs5%wZ+!ke)!Pr+*Q*ZSNq5-t9~I-;0hV4AA0hcKSb0;u>71B|L7=Sf`_L z84NGdxEeo@E%AJyW621uz2tH*N8dy?uxTt9o zwtZ#Of#x#{a{c8)P;vU5X)f)BJSmq_THJ;+=p=}F5GK5?(hJ?k@}&Xp+C(yHlY+r; zdR4wdo)unJFS;jMDaDSG^NY%jNzW9ES|m@ypMrnunZFgYJqgl8l9Oh{sZ7->o57~@ zJ1Q0JSpLo)%|PbL+suKA&<|%l1kn&LEv7tM4Od39FeB&o90SO6$6U@;5UX6h-5KAR zc?#(A`%Wkfg-pIhe%mSo{pu?%ZKRV=&$6D6ejVe(@eRvnNeoW;0JRGBE;oz1WTJ%l zkj;ejDHSZg$H9cgE0?9K^rzW%=hzIKhEg%#9^x?FgkwHq{1U-J4P#5Zt;*4y1 z@S(X_VD5l4+i&==NAuX}y0db!wFyqxSW#xrzFMgr$~YG5VD4iYB~7*Y{xqp&8%)sLxNDYlD*XV)^?)6^Z9@7On-;pf6pu4V~BWZE8BM>3GPOFFBCE)WLYf#VM5NbywB;e?dSH?(%f2H6B+5 zv6PaCjlX8{I*pP31Vm7q&D+;D4H|JAhlKRe_fvxorJPkrzLtgU^>h?MLa3Yai0&}Yo? zvthFlcKztwl7VuFbvoj_iz4ljl$Lep!H{~$i#YikF%%TUBkrltc&sE!y>hiKBq;9K z^#J3v-9|Q<$TY49VK$jCJ^5MWl)I2(IoZ|KMXA;F1?qj4(0DA-pdxEwBl+{$dh;O2 zJ;qc!n}soBcUs^Bt_3imBvZqIoJZ#i#KoEdMb{x^&-EB6Elc268 zxgoxqO`nw#hWW7R@;ldVR}6HBi~w>}urYYOz4(n(^gYP{muq|H7~A3s?P2CF>8~gy z)Yo%*0b#;7sC{bZsI?|lH{}9BEWyvBHiZct-bm^*!;pfu$1CymQ{m2O1I%8xaIacz z;9cg^)AE1HQvM2hzHduXY$IcMpB1C-ei<9QeM7SYWV5*PUZ>E6{}H{(ySsNvwT-@l zT|GD(bJF~B4+}H!(xBRrVmV{*Mlq@=(vSc_sTvm-L37(^0dzJ^xF_umSJ6We3jIWx z99}0=H`LZzWMFbY83+O0AB3IN+1V+Lf?n&L7$2@G4pPtpCLW9l0hDBEft5()VLv?j zq$@Cr)T<}q-)oH*_czzyb$m}z6qB?*g&K*kd8O*r3Y%%w(= zm_V9g>qaP__UEhL9L#17>gH#Ldg9qU5=|HvFZv;k|>QLbH*)p2Y+0@N;#9$GT!^S41Q}D z;G9R$fE;YkpM(4BoeT;*9^}6uskU)+@MkwaIV?usy+P_pDinj`LAom-TsQ|jUV;bjQF3w``<2Hu^-|!2Hte_#FbbEWe{a?G|pWoI~0D=zy z3w~Dd{ioFWU(haoXfi~iWag6lmh*xn1=hUCj^g6toVBGOnX%o?!6dZ#sWXq3*MQFl zRC~MkTkjBIx6EJKm46+N|8_w@=7&Z?&CSjIWAxey4a_DNSZ{ox^~KSEhe9@cs4YrM z0pyhH>Q*#}pzs`DBSH8pU`l^69idnSK#!ja#UYcvFp@#>iOa!=Wmm2um+ED#8%1oCuIv9NbpM~;=WT^h1j!(jw)gf#G#Hygx5gqtr>BJ4A)pYi) z;JJ~LolExkp>35spR7Hc1QG5tQ&(ho8)AyG?19^#7X4_wXwkLk?UucjNsHAUVkA(h zpVXt~3y1-=NAx!8JvEhy#2@1>=;COm_W!{2fLbm%_BA$NL=?XKvr2VnIUtqS3laR) zo(Pmb(`vprSm#h^umx)qPhslIUBJwsn7~bp6`a`} z8Wf?neN>xZo3E})q-U*MCZC+_XYH7R*q3D;*248fY7%@F;C2$&P_xUG5J1*3gMPvxaTF;G){05%ZB`tr)$4)qm<+v}n+V3= zF@#s=1}Ss7K?V5rwPA*s@WXi|LqtAX+LVfv$h#DijD5g01TEX65d~KFDh$x!y!E2R zvdy4on@dQL&VH?X-uIwum|R~f+C9#}@AZ`HoUV_Q_k_HWbw%My+qeDxqT>kd2pP@0 zx5q3JDfDz@YHk={@9bAfoM$|?SmUNlI4GWA*49;&dc_dm=MUghvs5EXBQ35#E-&+ajN$YX$97q&KD*>o zg7Wf=bg=j}rla30wA%q(UiHH;sV+Dj>aSNmnux{B7~XSLiDWcO+sy*+%uAu~Tn^hf zkaGZ%kN&Ym+*SJ6WIL?EGQ|pt`68Ksh3sq-&pI7VGyrpFN(vW2En{Z4Em!b6A4YHQ z*T0IW?+H2my*~%fdOgQtH`}h%IZ=p3<@j6iJoH5L=?_J24TamI#~fZLpxT~m!)*3- z)T?!d4qn73V@Cw7Qe4RbEww8yqr}R*9YZLS)q%3{%r~Sw~K63 zaH=`Q*>nI!nf1A~_0hsP8_BCq7fLYU3&K#a%({HRT0PpyltC|WpHiWMXsyW%RxL%D zQyjh>^jmkIi&n4#;i-_JvJk|YqpL}L2z=&W07W-i&9*spN(`#h&m=x|YNWvZ;894f$N`{!6v&z{+hG~PGBGssXm z=Fe(fUjX=iZ~t)AWwKwgdnq5EZK@S$SD2(=Iaw~Z)(&}4G#byOA~{(ovlQuBmx(0V z4Em`sq18wp1=#hcGCkjN>1lyK{Ds>zU|FHt+Tq6QvqP*CJ*~LG8&dA5b)O5FkB&Nv z@<+t77DZ62FJj-Bwr?9GQL`muMSDusf8Hx4s_$0kI)EDq!*9QjA5?LekQNSzAB4Mk z+=wDNk?2(l4`n5${+=lUpn4ls)XohMrcZqswBlvGEd!vCIXEXzq)|HZ|DBxdvT1yQah zsSP?wiPJ-EuP?5XXogUx6M(rbgj!?)%^W%QpBGuehAF`}LF%I`kT>F*XJQd?5F6l5 zBr%Z~e7k;M%5Zh;j??}YYprt@&P>T;YxcW>NKAc$Z-?tu9jiD^|AOgi!`HDCIy3Fm zK?B?AuKrYh4?h6IVBO5(BxIhx{)ou(z6YH_5~cMVijBe=yE!4~y-Z=FYVb~jeY_a;5!UI_}M1cq*eM*UcVMUj0^j!derQbNp{(OadI7 zN>@2@x<{6WwQ5$azu&A8OCLTPOXq1UNuD2dHflAWswvDjnJ0x1vKvY|)F8r%vT8Bj zYAxtI2_(&DKay#`|4K?4_^k+fi3RYTO7o73>GSy604sn-&wL9j2>hld3RmnXViF4h zE`0}!&zpKPv^w9oJ~&e8C_ox}-f%?Ekm{3el!K|*mqdZ9Z~#(4a~MsDQLyzQ(9LKv zbM}_XMkB4NvvWQzHMVY2*C=T@jLKkjrA*Xtp+Yx|_z#ukR$Ko-MdF_shB-c7=CN#V z1I-2Q@1KUa)%Zie-n}0Jh3`kx$?8`R2S$}fQaGArq`QBqT32=$=rKCybObI{7IWyp3(jY(i%Z@wTD4&3HB{bM9jrS*VP zLp65u7`(q*_<6DAw57(#h?WgNbvXUc2pLf+N_XZ-u_+epbW}OMo?;KP@N)dW41UP@EmncRV+Y;MwV z4hnQQMcmP2aFG zo=pdjNWcxpp~+`*BWb~y0}Iz%)`)AGrIzWGHW9QGoKQSf?BOKKD=gK&^ASBfmvky0 zQHy&)T`X$hH>aoEa7m8gn_{Nn8i$=zuHpuTo~oibRy3~f7=Y-Xl46BdCle?JL)EVL7VL_RKoe5~@9@6Up z{#0z!iA@h3KYEdxV>=%cO46BiEf&R<8D<3GfljM=7v!3} zn|{M=u3Vj;ZvdCA*=l`s_rxK_IhMeKsamBSzpoG z2{L%gZkjGAR$EW5hlhW?rGC!5BV`9U7vMCCh_+U}6Ucl?Oxb_8kjUBOq175tj1N zAJc6wTU_wN?==*7s!@MXAd`_Yled|%KyS^qEm4!_ic99WblEMIClt^|O+93I!>L1Z^wttPLEd<<3_;q{KG=opy64bDOgg8vr$w{L?2Q=RPQXNVYm#=(A#H{1 z6XqzgH~o#V@>Fpoj}0DdbW{E3NA7%I=0QEf12%4M!LkA32uFXI&ys% z%Y&3-+_W-y@^IMJ2W$l;r}oI~rKiL&#aDdAtEou!YzlR27KVt2%z%gt7STb7hqme{ z`wIIiGdErc#1M$xGf6|Hi%akIEN;ZzWi}f5*<~c*Y#YBG+OTFLKF>W$v1q&)kkcCr zq8)d~S{qp1<^~8b&t1YvB!tW%dw;Svq!(g2<;idRU|{$we_91zuNTBA&`PM>*%Dk}Fv` zluj2bgSZ>ZDZ=iWjwL=ohj4;|OOu^$OguI_2D?^!L+Xe31Y9vcVAe!YP*XY0a3DkX zA6uu@N@OF7LGO{0_i`uTJQ%TE(F4O@~ zAI9F@du_|TvVxkzyII{I_yJW}TYab1&B38^0uT7UdM`*~t93Ll z91!_mesfGH$g@s)TpQeHLaMh}qE}b53_js^7Uf&F1PM~!Fn8Q+4X=po(!gerZ>3+2 zFPPOcreK5!c&_6*oh&d8DG+)+Lq5y1(#pWk-yU}YFZ@L#QVh|Sxqf@zrPX?(S?QAo z?d5nsWqsZGK3pr^X?)mjiEJYcOZaR53RQwBKVSPajiJEQB;Pz@)Qa0XPSis8Kmmwh zGInHz@ipGHkV_|hkj}OL;B2ME4O%C%p1D=RYeKIjlMo9tAyx#U4un)sBc+Y!(+KCSe^?uq(V(K+a?3i0B>|~uMV~eQi zu4rCNrSlYB%Sb!aVh7&w2~4ZJo(?ql`K#751Eo44kl6#~-HCF)x%bo74@0tWbmp+1 z>FnN!sKpa~V=AYnVQC3=So0ZQW=oIBiHFN!!e@lUlnPG%;r~^WjV_9BDC;p+}33+H=829#j>0%m3^mAqRiFwNYepT zxJuypt$T5zG`nPKUIkrq+VJBwq0R>W|gRgcLaz7@DK@2N46t2$A*(CaTWBVcwwx&6t zLdDTmWj4IwGRQi{5Hl{yy6xi9N%CWb@K~wg2v=}zdE6!}&&2Uf% zz>z95U&h?An!xv!zgaIbI9Pm#gW&XAxcl{{5?KsKn{7_Rc^J=9|KYc*@z;QrF)je$ zF#xBPl6naJdH~&xb(kYto8CbeoY^&3tMOCf4&~aM)QvKPi%dV>QP~!Cpzo* zZl-8@`|Zyb`p2V$E%FNCc}$#IcdtxtCmd8){Z9Q|lf8+w01i$E+pPFFjswJehh>7| z(eIA4aNHirnC3YJ4#Ult2e{R#XBJCU!|fM7=1Xk*<0*q%oiDRR>mf&PZgLAgRnf;T z@BU=!^(K6EOgkXyqu)x49X$WhlfcMDCrqN8J(o9-RP4sUm|^oG@)VCQN7r;?rb2G7 z<(G7tU%z;a;zUVbMCug`B4RKhpR8u*1|HZum*I>=q%J@pSursQUTbINqzE%E?o^rz znB8nUtH^3KH?qLv{--5vn7z6Yh{LEQ&GWq13mbZ=-0h8zC*Tbp5d1m_<>d9WtxPBf zPs~4=%9b*On-rBxS%5s7=dpZmdLu^Ra8qQRl^*lccJ0&)HTG1v)sAc_PzxJQigw0Y zZD8N+dI8(?_c_8VhaL4m{0w!%FX_XFS_WOWqN3IVG@F7Zo33y!heN~jjUX}Q#I8RP znMyt%EKvL7Nn%`Ziud~)tv_y01x8v7K%mQ4dJ9Qjuvs!3Hcv#GMlXbNwd!B&wVYE^ zzjHsRfFF2K$GTLbyhpw5m#E1jnjJwezs@m-9@Uo)O zi$i01+M#`X*uJ8~l&E0mA$*78TqivVO z3iQA|>tPB)M<(LjMKx6u{`W$0%=urp7J7xU=br>TS5MzKy;hdv4w(t`+Ps`EUdcgv z{E1T>@j@9A;?l`A#UYC16k>07EA5nF)kWIMJz)l~y~*8}hxSe@1C}w&+DMgwUK0jh zam@V_a{7Xfdm~yAGo^cg+APwRnaz+fegrQ@uIRxB|2e_Wj_gSM)yjEXCa2BKO>B}n z0M1f1?300{AyyHyVd8xwr5{C@Z*A(X*`@;!@s;s{D7b+-yyAGHCV>fEyo$%Kc(86D zJe>DK@5O`Vm8v)?AB!!9e&NnrFXCg1I;c&w4lD04;KMop!au-t;Ej6!eyHM1$du6* zAH$I*rVlMvgceWK&H_YKpo||x4f0gnwF!@nxQ8+{j)5DItUaY1EZ2NfRZ46RUfQ=u zevo{HW1UYI7@6=<1JF*_@&g@Vl4#{1TJL1mD(Ya}uR#bn&GGvj@gY|Fk+^gY zB})3}4cqIFKRVEY=))MD)QT$MzP?fUD}S-@(NL9WXR!>WU&74DnI=h#%?%>bOKShY z$){mQL#9zwhS*4MbY`v4rG8%rZ3ek5Hd z#UbD$^|t!>-XxV$Q^+V@L-%!O8Oo6pO|8VY+PBcNItcZq&$Y*q?$30v@d(58qYE6= z)ZlalhJ0X(4No~*Xl~EnLk}#DfPGbmIy5GT zuI8E=Pk$))V|0rB){1Y04kHSU>^x|zyOBv7ctCvHxgT4pI4~}`M$Eq(=fE^)JYn7H z$tD}ufqh4J#=h0AN7ybk<;o<6CJC1stMj3dYUD#V|y%|K;ov= zsE7^LU<9;0-%4t@-PW*%&^VfiB|+x={)ogQ_45l-zEUU{9*+?~=poJ8*VG4Rl||#f zk)}BYNBNHJE%p21LxvNU^R?PH*suHM@;uT2XC^78eBUTlmmH|FQDD z7eb$eRR@d`ObkLBhO~fbQj`yz>vnFWU%6uY@K;rv9z~Q>4)30Bi&7JQ0pfer`rYMM zvHJrj-4FhshMS{sG={E}2aam@J9D3o9y%j0*@c9L_k#}Ci%z8Td_M(dU#rqrl(HW& z$U%TBQ?T1Cso&jQ?&Lc9{BkUMyL%8)tTZPxi(2ta$Zg?>yt?!cn3iCR4XBuAgbNPG zWFQBbq%*1(Y1*SiB}nvdT_kZ&5r0R(Vg8nMHrpBDxz(&!_I8^x0U-L>QwtrHkYIMv ztwu~Nbf2YUF6>|x^y)Q;)G<7pYk06Ynv>&GRoNitfW&FfDp3V|zPzt<4GIhj8Ba8; z4?0;iKvs{denJgjq0b$BjS}kC{zQIbJ=4XqgBK9cvD*a>!!?F^r=|BX_nn{jEbeLhJ zlbD8w2TzjB@--jZv02sn28G4xl~5!Sn6UC_xh#ED#Ar&)LL-@A1qr zVesR6KQrL^rf!$HOiAPT3nWfd^Vg6+tBUPa{wt;6jla9YSH`JRa=|NZ)}fxjYadV0 zjcMm;fr#G@n-9asU!v#+`aR_Ho_rb=P5g36N=HB$3^ScMC2#L76x&oIO{J1uRbTZ} z?fP8pfb>eR1$TUly_7OA3`m({_l5&dp<(IUnLAM8~K(r;8r0x7g^-EGwOs`z?O z4ue;FI>+4!}QnMjpRgnga zjFHuM+cgdP*}>gbuYPZ$IP!~)9k^h443I>Ek>{|}k$R;=m)*B5Q4+CvuM!E+bCG{I zvO=#lX(J>w1%VP_hsHwFV{=%kGrDE*YB&LunXM$!y0YAa<^f3p0eQBhwJpy+i-m9_ z-`0qbYi#6J;1lW82o}BFa-rUCg5u}khs8GKj2As6{mtMqlw^aOco8pj{t{&=W(qtakrn?L5o&EXVHk=V|+ca#WDA<_v0fYcMG z0ftL}ITI=A7sGhhB)lq4i6Jtn6dD(1BqUPf{%4SL7wK?T0lae>b5YG(#Yw;umvzI( z9s}xrj>7K3_)w~Xa6$q<8YFx7J3E%$;|aBY?1^X>jMK%MB-Ibs4XgEr#O1cmA|S{- z^hx{@e3iWZkUqBh#XJ4=+v3jPVWCnAhcS5~t4@1II40_sl&g%x2x*TFqS>)T>aV|V zUqlh{`TZZ)lYeKd<$i2nLU0Z(+#8V~V`GQ?MCBV->|l2l@f5cUQCoew!OZ#d8D!|K)wAy4wC1+ea~WLYy1qH7S`k>&034&lNCf#H*~83gwPqFR>3EFj8aV zQe`HxH28%}SY8~km@PD73PMhg4m655h_X?rFFr|qx7P!>=1UBE zaM@c3AX?mElNL5wA=zgMk((@txex!a;#=0x%29Z0Za))R@@n^**=Geuf&+_(Q?9ua z3O*EAf(p2#PLQT7UMDBV+^V{W5K1tP_cPLxi&g3*KTp~oUoK)yH1X2(mF~Z|MhmT~ zp;Mwh24VRMT;euT@*927KF+)J$sd&EZ%;846H)VBH zNQ{@PxEeM)rik)7j9fbPUiZI}TuVdRz+T$M6K2bdrY^OJ5bSirE7aDZo-hBLIj1Ti zF=XN_$Y3;-88Y-Q(9dlrMq8EtikAT&-7KUJZ#V2jHY-QbZixaGL=vTsmnpR6^jX0~ zohmkuK}e_tWwj|R0H_=lrB2UptNZ;MpX6MOS6(aUN_a>@Wd%fUGN5$i{ve>lLX}&N zId9~R$Di@db4OvHed^+#D5TpQ(jW0~-)PQl6_VpN<4Dd`@wZ0wMH4AtatZH5hYSbHQH+z1tngGW#XmqZNeg|>2?M(DYFNSbbs)MwC<#k6T4ED^umyn`Bbiw z=gz@+GD%UHQ|j~&cQ*Mri6G)domR$j8}@iJJhd9jHL%Xsjf7_|D29|% z4(nv+Gfi^TaNgv@Y^#EiZ*5WYGU44?vTIGkc;EZM;h_b4HRP5m)^nA^LHSoj&_}jX z0*;TA;bg>O2~iLbkE8EzA@R;qf%e1{%n7P2WeOtncKklFs3fDgM@TqesNi-I9YR-- z!Zc}<_5uxHlE@ail>!2yFpSE>C9}JQ9?etV2gQiPOn76k1n!{72Py`Yf7!<+7@J8B z7LBV>?OR-YXmmg$wB+wZJ>mjy7R3%shfvrjOvfLqQXYao2?xmQo3{|)HUbVSutH|o z_*mMb?dH{fzlOpF!4vs*OJGP}X}1#}m{=J>b4*Nk6ZN&ZQpl}cw_S=pqKrFeA}lUA zDK#iJ#ag&M@lKa2)ttP&Fh4mV)+0;+-qwd8FzJrmprzvbZHC zu{wO<1|pivZo=dSveXR_-eVE^)s(s_JX2f%DMVbVKqv#fG^K-Z%mkyK4a4}G&=UK% z4xxI0114Sq(+>EN5z0m+G`#@5knLTQBsW9a;xu;v=+VCDo3%E%1WR6!hoqmZPh8AN zL*D!#!_@1a0&4i`-`hk27`wj2&l6Uy(1#+JvD@I07+Ro!=+^>zfopcx{7=7cKcjG* z`6|;LRRHaq{M;2XApNMHuBBut&kGm@WnbocEduJ#o!;P#;V_|FzSP=dmkHPFbh_i` zDd#IR8^`yqm}tAaP9f9d<#s>YdlXsj!DB=PIK>A#zHz}e62B~;RxTGYo7|!%@M1rr zh}}UMVk=CVPEJ^9tiKmlw<8*Zhb?#TQzbC+l8Zxopf|^#D+Y6wFfz&xsWp-U@KBvp zs&>didyh#-3RJFP8sh}WUy~mdPaz&0`)T(i!ZWf(g%W`J28r`hQNCh5{-1WY5&{`v z$UbAnM|FrNQ>reg7p2Gnz%y-eFAo`EFCUb`nfYTP_lkz?XQVgXpW!WvE4$CS$+u$iI9nd|0TUFPE}2eVrn+IV%2YzIJf?ur4A<7A7jK z9PG)2o0FsrKL^Q8vfKJm^?RE7b>yP^R>^v5bl)yJwI&(X;LC2S6pz^ML&NDcabo7G z{SQSBm-7wk;5xU?_tzf)iMQZ~AM10C7NEh5<2OtIMy+N4^?0;fp7I^6ahayTc{ClV zjDiBc*8S581xjH2YM+of*|#eRCwvu4ouRWhbI43%`(`*rEQolT1uwtf6^gZblP`9U z2}@u4&OpGH!jF8Sr+nkwhJf!?L(iCd`|*)p0qg=+Z~;1M14V*)?uM!g!rXHVO2c zG<(CoWNo5RiLK(z9O}OBwxtB{#^jrcW?w}0p@9q@KEITtM(nmY%Om~HD$P+jy=a3KP~QQsqZn5qr61>Y}fQCOP1oVGr>pQNw;>VX`3p$$eU(7h*aIx0nTkQzr*l z%ErHvPOSRBBWO4&a=+GpW+E<^8Z0an6kGi`sS9+`J=X22du?+L+7QteH7OtsqnIk1{Trxv-ybzCjh2j-QX>`#QaE*ad zk2U1#%j0q$r#ga`#ZVoi$a^k~Ej5QJRVtIwJa#<))fUxU|IdAnR=hgdlLzE^l1ap{ z6luU6NTgV!9*g5Sy8px+$x!M1IA!D>DK)yXDhyJ(1KJ9Y++uzlNRhu5Xy{5ub>1nG z9qwzLw=aStBG655rV%U;l(G>EPqo;*4y&>Fl3vG z>aR~SS_qV!Hzq{e&hfeT3n%OFnC?>kG(cPdgQ}k-SVvn=r_%(^#3?r--uYXmO-`#R zzQ!aKZfn=)=%bx15(~;|IQ9qnLcXKV4PRc}Y^a-Mm6A^v3xouCdmDGTYsx_&t>*z$ z4nG|N?$T&YAK2%RG0&Eg2VsmOP5Go^wl9?zuNo1(xH@%{&TpC(ZA(Wwxo10HW8HDy zb{fmI=Ki^glYwt%4dBu@R|?iexwb}zJFOr{s+W9|TF&Ln{4|)M&mn}!L=`4rfQJFW zg!zR7Xu$#8F~_C6i*PHE?oft|XRRAhWWAqob^A1cy361l!0EFu*fKlmepfq=f@GYX zc3YpV>wdD`6Ce-JCqKTFI6a{) zux>Ns_!fLpWQ$+i-l{)-$;V8LLF#Wjc`T)tbb99!s-WIn60#RC#z=`*R)jUM&H@HE zB~&$3JaG6md7zAJ!6&O6Gggq2KaDD*Y_MUqD5|NFPEvKQ?5UN~<$gaj%WP%vNIk8A zPPuHGcirztB_uH3T-3yeJyJ4&+zP(`zM`y~w8`gN@pY6?N@0l{eNveFid0eJi6g_9 zxs=fMY4GI!Ja^RKCfJqV?yfSPs2Y!lTeG{>Q={m*@}Yon^+JvWZ|Cz^1hvrGDc@Go z7NO7A>h7!P2_aAZE(u%_w3N)zL-=TYWv;F(_n)gxUKF}*{Be-*Db$UF>la?MyA(1? zOoXLyKQK&9mR?`Sy+~zi)kPv!wC(08W}))Nrj0#5T3(l1AhMQX13WfNZQ;gF$R%?!&`oWBmFf& zvIz)MX-}yqV@I3SYl*2x#h3=#$Fn!Z$d0J|_i~k~mr8Y%oX^(+eA*L)Kq&1jJV;ob zX4%O-CnhGfJjKkys-kf8aq{Xz=(2ac^GjZ4h2|8XWw{7bgPL^aWu&c>UEG|+WgLl& zYpgQ*5kqs-C&{)l73xyjasA?-yV}S>%G5aBhqy$sX^X2PxV=#Cel)LpR4jn@$ND`| zf#ywHD9Gd0T8wFjdKd773OisUhzySXr<7yU2BJan%A2I@^shE%n?jVx7a07ZmJn>q zi9XX-)%>zWYtvt}AVJx82Bk0fUuv$A(Z-_AQXpw~nS8vh+h!T$OMzYatYD)cS;r{f}OZ zXB9@_RY+KPss-l+4R??m0R?WOq0e5=D{5Hg#H@+NOBZj++8PXa!P2x88 za`&b@^ao7BARd7e>x}^s7$vF7A6RaCSoS1{H$0wWA@}{24Ox&}a9mjb`{2Q^`TO$J z6m-GMM!FrUdU+o^BlG)jPAvyrCMli~D;d`E zWX$6ZFwFijV(}Q7QGKoZPO+U{CWP^1J-%>5Z=vJIP{zizXtlhkBGJo>Hs!LCzfFP$ zFovHw7{~owRnY~tK~t~?mb&>OqcOe;y?iA5l2PbZh-&|s%rB z6J{)w*e_`Rvr*CO(R^3S6s-uWPTJd>XWlm%yDVc|kY#Cnj`yqP`}@y|FIb!+Y+5J` zA~p{v(SkS0SVa@*BQ0KET)T}=or_8=7izLQ?o2p}7IwEc3F*bFs;bO=c4OK-toL=T zO6;TVg&Qblpr<;sYf@s?XQ)S51;z#cZM&8RzI` z&8HVGF`vThf?9_j&V@V&Jg(nwP~r(HHR^TU@1Ny08%^{3xF=GX)O5X{+*+ib`GEu{ z2N&pI;}@*Pb4hpmsDi&9N&gd$&*pg;uY}42c*@4*2s=I_ujAqxYPgXt1PjAf^MY>s<%r0BRk#@n7 z-rAUl44ElAuCnvM9YmcfOR6MS3b*S;$8NP{RYg;*#?S8?a|~ZR3v8{tdh7(-RmVL1 zBsItM@qTm#N50)%_kPWl9E1+3tkMAO>8{`aA|Yig(%d{E%P-eQ%ReK=d(bJ2SN$9m zQQ*1^Bt+upx4t2B_IovdSuoOLr>QVNmt6r+bLC#*F60$t(^OB$;l+5f;N zQKBH~A?nI4UZF5rW=&aVlOe$H) zxIP_2{a&g9J*viUrY%ACJr5Z2Ms>1Jx>bx7;iyASU@e=>U#DAk-!jESCH6zxGan6X z^`8FnQGeAg46O7d3BJ(yA$%m-O47bpJ$}&cH4;^FJR~)7;`Q|@Q}}u^pGcJZAizKI zd|kSy4t?*4i;}Mr-$Db=!Wh|yMZW1`qyM^hLYR|cwNNhMlLq9s=qr3Px7i`}%oI5x z=lg6g^*Gy3bIe3D*&U#Mc+qNk6(P!!ws7#ld_4YPa-l(Y)1V+P#mMw{3{3@&Aogmz zf-j!0loOi7C|jtMS&LQq&?EF=Z!dd!qImJ8K~LN=&LsBv;r#ECLZF6s^MHK?B!I?_ zKf2o)Wk*W!u{uRcs`3+uMu&j*QO%1|yMg_YcH|d9!V#W%QFqyx@7GropRW|Fjo!rn5ht|-eE4er4$I2_!9YjC%~!96$xcXxL$|tR ztKR?p?Y(ray~dnlj5zl%bTSqIpD7o5NC@I=DGlRcCZFT^u>~&9_D>p9=&DyeL{=ZI>V7%|CIEOCOaepsfc z8;>nYV?;lMJAHYFscoiHWvKBZ%@(|Wmw-hjDjU-7THXE0ixDv;Y)WW|GJ&4t2$;G)6lj&pZ9*$735~BIVaV{XC2i6$5D;` zvHdK}Nvrj9e3!l-tEoD-jB(6!jeA>LOiFmJQ``bqS67K~f(P;pK>;<(##8A%vhYefVyQE>{Fok;oA>05QL z{K;Z9W7dhv%ak)w#Q5k{-Qpy~Y4B;ycqb3ie$;@dhF*$E^paq$!b0Np#i~kh-{>2D zy8Bv*qWQ!cCR6+KEY3xw6gOtcwi@eQ-qP4}>O#Gsid7rwH5=y0Z{F8VT^w@J8^*zi ziI47GLHz1GIdp@LJ+F>_FO4uvK?%N5*Ml_-jtDHD-4&#QwCH;s0HRA~^F|ubIz>yi z14D(E*XU@G;~`e@=B2vI96`}~r26XKin==X4Eq9jw^QTUOM{v@OE4KSW!{QZI53)) zNVgRRwhD_BvVOhmlgD937-XZ?{KSUh`ARE+qTlFLYz1F#+B?=83uXf$1DS;013H$$ zfG{%tO@%|Pw_Vk7diaMVBpl$p1Z4|L!PPahZ|TXhqp7^g*{0lx$o72Zho3sxE01!+ zX%r<6b8NOd*L0^EOUu010#DbSWVx4}Trb4UosZ9Tjg9Sl&9^PL%J&BoXf10Sw4?Uy zmewb|Vhn&(Jo*Kz)zEh-(zS5SOaupG+_;Bi z-y007Ivc==p~}-<`w!8Wz~wU%$SHLr%9~Z};gmt~R|%Ap=%Oi*8r>(UKSdHk6c@kI zH&Mb_zE1Qo%A0tM8W+!K!S(j^^b^-=mTtC^6o-(g4UhudKo6BFP~B5dVc;0kRyp#M1jZuF!^ZS^q0BS|#AFY4 z+v6r95X;$jwJ;9Y%>C(iJ=2?X;`nnVD2NG}wAoBWxPHG&yDq=0_ZeR3l9(OIvl8A=sNWwawNg zeY?1z*}LvTHg=j^J-Vv~t8&@|T|<7JzA3QL9sK$8tx@SLVai9%wP&P#iMq4xt>T!i z_xCWZH)XCc4MzLe5z9rR8q;Z8RF@^|l+e`_gK~E;f4aaQH4ZRZ17?_H+B=9c{GhkP z6lDMz?q^j+fQrb6Z$QsI*S+>HYg#sr@!k>hv{N? z2q|ORL%Df*gyKVJ9Md&xVdp6HC0(tlg7V7GyA@v6kB7hET!MW%XZW&>rObumls{J zyRq;%asdxv;O5P~-NoI9w+6~v<-a%VpG)k*nDpYI&g5`Yl67k&i6*Vxj%TQr(qVH` zY46P(i(09Pa22-aCzplE62;;Ky{p30k5-5OgIjT&uFHtyB_lmYwfj zvw0jlVz3P`CLv#4MS&RK!9#5E1;*#%xOxWmWW8e1>0H)3PoNKmeOME z%JvQ>7LNpLq|DGM-#uN=7{iGX0fXmtaese$4jcJ^R7f3iQm_O`%fx3;-phm!{;h)r zQ*WI_du1(#-vQks`0b!?z_w4`9PK*oyUn#8LP25ysOLx0_iRVBs5{Ke;m zGQod<%l{`9{Ezj;PY4ZUvqdc#_x!#`1>ZNm;^P1FD%nsR(s=JE8pGwT~by$Kc`#DUa2k{ zZxESWi9<~-na1hp@8-6f>|&iRW0RtTfo!sl*x-G(3X?cWWg?54qQyZ+o6o?gE;-FW zz8z5+kZ}>7@GHXn`f`Fo{?n{*mQ8s(*o5xcF23ij&ga@CJR%~wV_k2$#lYI$)e*+t zLpjlb^`??RyH;UBgy(Q`lN9AhMcq0*c4_$lx-T1G;{$UY*{u(u*=#^Rn}SOjTjI%T z19)EyHKAXi4K8M6J%+{k7}wTV5gyoCC6_Ir?{dmRT3gFyytsi0_z_prV7;W_a`J_y z{W5lOcjPc=e=DHtKF(^fLAP2=Li*#TdJ&MPOtHF<9M%0J_16pv;^-lbDoL%GH=^hKf3$QOo)m=0B0BNL3b_lp9 zRxlZTAm(>cImN|vRCPI7XWl6p1FrC|I!4lmNrDWRNYTpjcU)avxoStVbwzq7MmM|P zlAsm^_4SzTof=Xu6U>IUi!8CwEzaOpx-sx+14G~GWz{ROxzK`Oa{sK$ z*z_FQTf;iDvUnv>zin-wR7z=LWC93mS6lLQ%DDothFG-QJcnPgyohsv(SuNMI@hw9@j z+i-bCBfjJ7-%I-c*fjq-UN?V{Ux?9SOLu|k$5Pv9^tHy}H(u zfFvKW0}dwiA(a|s%2jEZYh27r;A`C~b3Ng3Rk7ld_eh6S|t~&A1`?i05 z3Br*-60K4fsWR0T6=Dww%ECU-fiP#w=<`o3xT=xqXDyF%B}PqaHV@8(i9b^RT*IK> zsYjmo&8uC~td#v#H4R2eip_bTL&c_7qJ04LeGDw9O{;zi>W54!XY=*3U8;4=nJrTi zuM@FIL)ip*QKBy%M=JmcTYe)lTq+@s{;ogBU9TjYno>{NzHDt8&y#Ud(X34(U{i@! zvC<2Vigyol)kHhk%i`h-Om+6#MjIK3-!b{Modhgav8Q2P!)le{I$3D%pb^j`mI>#! zyP#RBKlfv|)R82w7NeVPQW!74+ID1A(T~7oL>75WRHLP1zajZ|XZ1hw!yo;rCCY{# zJZibNO`c;q6}z!NSR~;Zf5RyQwpK#Jg-Trcv(o9Lk`2H~C|3ZMrZ2xvF~NKdWscWx4d0Agf(6dE@IPg+V zDz&E>{f;7U$m8VHsz_ipy&zA+SR|zq{v9tia4bi#h8#_6-Z@TKJfO^Wf<)9rNKURGr~iyNQ3 zM6?&69z!VeI3V*!ivVsxryKzZ4ojskrPaZP+MUbt%+T~rY6;qgfp6A%p}NGFfr{1? zEtD2U*_Rw&4XbaREsUh)`?v%?yHyl753dX@4Rr=rl`qn-L8>&`G`h~J6<1kgcs7tB zfU>?whAN>HUj7au3jfo1{*%ad;)e9oCHI<+P6D4;56GFvM5r$QGrz|PyG}{(R&}Oq zhzQHj5k*0MBCp*-_A9ByHAJXJD?~s7bddo7ZRuTy^d6aYYSGkM+R42#{9%&lYz8*D z&_o)ou0}mqNF}6aNq%s$POiGw#Z3nQ(06M}8cVI0qLR-DtqLDWYIC1~Mf4>O{D1$3 z|9hPGmkj({n+RGpTdTc%3ARm6e@*RcXX+l~4uO^2!AE}Anfj~CH6*FdHdfjmw|qQG~6(`Z=l z9CB;KyVIXQx7LCuGqVp9aRhwU$YKHn^U~vjsD>r#P5iZ6;@AR;#sQIq;@d9qK1#ir!fL=TZ|SUlKNXs>R}aW zV9R~wk}*8)Do2>I*vw*#>*4}?HiO-_KJ z1v4H(CqjF?$*ua5<&O7F^gSCLnx6|a*&P6zDEk(qw6rwM)&&Bhq)~Pxv}O*1rr}ik z85KxeVo4uB9FG&Xl*!DUM5gHSJkfJdTA99ESJJK|D1)IiVV4x)%lxk$HU=^>;j7)t zK9+sOrJ_TbtTou+Z(tb`wL(fGS*=Jui`ie4YxB&crh7o+)@r?~0IVzK+_$}KnN` zzv_H;)XFsSqQC@fVHP6>%TlE1Ytcp>o0d!7UTe33%ziq(Z&_NZ=mjjmeFhCWGhv)$ zCSsajW)mX@eH6x~CIgV{^nav^pno!YPStS?<@3u%;3CDv{kFStE@>l;;%tpY@18Qx zSs8mRS1;i;i9tyJuA{kq%jB#i}IOlS~%i$Uq6vtzAAmi@aCz#3fI}{c2 zVr=5Q8k2ydDb?(@$&(@c$KCDdnW$|I_qNV?x` zjpa1zr{mhL5xAfQH#c*Uc(*SIE_Wh@5y9!%b+^*ouxpb4b{=G)hf=tgS7Zd3QzVz7 zwU>Rsa{=;{Yw3v^7T^4s(HB`3NQQo}e-s6vFT&QujTR$mUCYFN6swEAvsx(@Ng^=% z1Y8=tMLC)ib4Yr^DaMr+xq5Po4D2KdV{D9k>TUZX{EcOXg-xnvrA1yQiGd2tW>tyk z0}HGSmnoYi(mOj>TEgs+4`XIq_2LEALbEant`w(L>UC?zWbqemBY}Rdbl%7P{*uvO zW_&ZUV?*|-mTkdaTQANH2iHa^Tu$%&C4U6|3rSi9qs`)NE)zdhHK~C7c=*2!CZpGgBYY189|GBN^tsoGiDUL;DC%7zvK zqmj~XrNKFL@#lEELw}u2+Mm-TNm}$_Yff9>*IW1AV(SRxCVy>?dyCc5CUJvwN+n94 z;nR?oNNGiT=@hGZQHsZhCrcvZ^?{a=SQ&E0iN>~r!o;$KG18^^c7~RGBd?+_-=Z3mDVtdg zhUYA69bT86YoXl1U=ymyCc!nBRjM_$-omsM4D1gGjJXXAi<%TiqsOxU1D zvO+B^*=%6SSeSGMWs=BQP9)veP04=x)=LPGbACd1`8E2yoO#G&yz6s#B&JF(e{;Gb zI~usa*PkcF{wEt4qL#W_+F70|{tsvR&nTgrISqs_uHsjF_7FMA9BFKT4WlON5EXXU zCmX@*&Bxf?2;qiR8(lfH-uLn6H4AT7ErHIiOG2#}3TNMGdS9+%=>W)Ll|jqu(9@YQ zx76nA>sN4sW7ySkV*2i&`)Q3^Qs+DHvfBgu&(8cmDntI~(EmIovuiKh#@u@I@(j&% zFY_cTPGz7}Rl{I+ExBE@c)W?Bp{Qf-^geTXm48w&`^KLr z(r*a74|dDbRsZ_E|BIgeuRs4^At2LLybu-g1)%@k=KZgi{OlDIN{B$kv|da82N?Ii zzV06#-J}%)Kl$~S^la$A`Rc#M!z~rw9C&GvU$ye@*XTdn&JXkVNm}mkC$#@`x%}H$ zR7?nYIsv%`XYGG|=YMakf60fxPr^_ukp%qz^~r$z+x2IH8S8)CZT+Lr!aD6mF}5*T z=|CNfmh%jTW@gl2&bu@i^ZoaOeqo39yKuYrmu7Q5cs7jvgse_bz<@(iYQ=&g9ZMjH zHbaVX*|-^-F^wA<*TqkAnIO1j804Xl|NbM-86siX)!z@2)*EUX}OJ}EImhhGT z&ovT8g?%gjcNY19&=XmFHDP@LFjpH&f>u^meKRve&j1%KTo(xzV_*o~oBf{!0fy>P^#ChTIk~1Zu93 zc^S{ByV`U=ockVb)#3CkWXY`cDkm z4*q1VUBAhCgLYDI0Vg5GWBTG3+3TidOsj`#GJ|H>M2R{vs)b^A3>Gt3*OseN+ierx zYN<~5BMAzyTiG)Rz`Bw&B&FHvfHLvS)EaItT@d12q_?KEPY#N+Q&y|eqd%Uv#n9H) zF4Jxg0V|5|v?9YmJ036scf2UT-W^eUC#R=-X)cWY<8!J>onVc(u}ltqU89(ok3hKF z*&222I@3;P!W^B}H#;QAg=*ad9!K1veMY{%^WIy<&Dn=GTOX`wwqRVH$_^7o~~U&OUyH`9tUQU!`~i7x>7ryVJd;tgPxs z4#pwRx8Rk}+g^7~9=*VHH^p`BPbp&*{(3yd7wHMpt_E>VPETX8{(KrHUpM7vx zBxcGgTK863tjRDiUD-r|mpA%*iX6T72p-* zIA3c7=U%cva2R7N_2+EESE}p$JtLDJADR5eh&L&Af${E;Z~t7sIJoD#-&?LFa!U2n zP;`2kB*jKzbf4{~vXjMD<6gY4WgqJ(`}=uH`UWixFDIBGzAtyQ zT(49p+vAuh)ZFK7VQ&?cu-ktQ7q@C?ZHj3;g{9HK|lgwI^{4~#| z6?6JdPK>Eg2K*bc`qRTXPrl=-Ir*UzKO@t=k<;0nrl=`mup4(H%Y0qRH;bn%Q2XjQh;|Q_iE$Nss#>uTg&GM}c8YY3J46W^2%h_WbCO3$qmM z`N|*_&7YPRJ{wRbKQ;r{Nv{V<8Lp^pD0CR~m%EUN$!0o{)MTwSlt^2@+tVL8{T$d_ zBo=Py!2TySia-$NIeS1BRKO17Kiy%`t5WW#+x~zdAm1~Yg?XSeadpC0Rj5#PbR^K5 z;&H(2G;-8PVCQY7EG7r`xtaDxa9dVjKOb*SXrO1gq#7woOY1`VY}4G? zUiu{1i6k9T)BUKVR;g7XlCK!;#CLEjh_YeFLU~k_k)34wrU^(g5STPdDH` z#uLJv3b#ywAUmQ!3iJ!P;BUB5`<9kH6u zEl{?n)8$jS!J$)^cEe{zQmfgjI7k9e?fc}Ot5OC;m>hhXcbPe!CjDVI#kv%>aRjy- zR_s<)FusEe@kJpiO3c|CNmi&2-J>5JOYaoY(QycenvK5S$sXseGn>r*&S2bV-+5Il zO#0efI9ME+9CJ~0q+(YZMa-wlq!)u`%Z$3pj$yKJ_F8Att9E#GbPbvulm)9ETMYz{ zL*#NO*W9+)&8$p#vsU!dIMz689Ovkjpu3f$OC7kna}8!rouAtrvE6NX7oV?+I_$2h z;$L{#llk9ljfq|fiwc%0ewN+~ex9+96Wd_srhD$m?_(>e>d+lj|AckVULLO@=MlBy zrbTs%oKR|M589X$UavTy=0H49GjYj^h&#uD8xB>Bm0$cs&X?2BOPut0@g1i+tj#HTP)l=^*swwriuUl%FHBX*PHh6o~3N08LFV+n9Em~U=ZU?h!Q z%@cQBn^L}}<0MZ%I+ig-FX1sfixw2g(|&!lctqeKan_A++y7Y$BQ@-m%sT(%15^Hc zBZVX-DU`W%yb-B&`27d!4(fUg5lU>bellS~CpWbMDU9H+uHju>pE=el0q?023Lgb*+JyT;Eo6fPS5mOPW`FXr-{dsCw^NOS+p#68h9!UOjnN+Rn58qEO^Xs*v#AS^@VSV1biL-0pQm$L zkZzex4&&t#tX~YJ?*6BT15;?L7{kCtsO% z3G5vYv;N&FH5pmnbb%*sn^xhaE|5K_rWf%<6W5K@VQ@dy4cxqOLp-S zTKLKq)zPuGkc_DA59<}CL#W`etSm;o;!gmQm6->BF(&Dy0#X<2OGsdei}U8X0uf)V z>r)hu!}hMUg>pMQE?(%11d78Suw{XYRu9CP~ zjV3Dgm`q%sbrNWQEDdcKjI26&o~qJn{P0tX)?255B(&uMv#YavZ9^kc@_b(dKUKwU zoY&HJK8p(ZRVRW4-jXCxj_5!E@*puUg7OlDEYH&6l>PBfUxKp#P@Pdjs_Y7`R5y04 zS0$V*)@pNGB+r8fk%m!=U3HSrrr?=j&74|3n=CKSprzSkzCe{xct*U2qLJn?5P z5>~`DE`xvj3!*rkUQC$cBo9f)jy7A&6qn61I1!fu3?d)>;Y+0FCV|7C!2s^>LSa6~ z=5*x_o85dS%yho{&h7@Cy;r-sD@T)^y@GG00+(Y5dl<~pDx6VjLz7|ucW`zPZh(iw zWTZh80~;S@;YRDoz3m&>1p0(C!?Nvksed{DK1+Tr5a@yQ0u z;K{GZ!AUqVC3nx5juJy(#xmPA^2zLdy4BS$8B@O^1jKwJ!Vws9JD;3l!6fO_`WuV7U&dL`oLjVqtx}MYLN`Ad{>VexD3cp0?Z;uz)8o7f1M- z21j1?Mv`HCEy+>T@>M}IN`Ql;PF!a5+A)kr%CL4}x6=WCS1V`VUq-kYjpZHZ^rQM- z1(s91G$}3DCO5xOAr1tYIP77f!`Ni)cmu(4SQ#qfs_ENcKPCsDvjhJcsROkkWag$v3E=O6+8Gh*J+i67E zmog_E=ZB6UKd)-_K3yiB<)IH~^(D-@NzygySR`nXlpT&kE-h-fPzJ--3Rm2pUVTg- zICJ{&*i5(17DMEpI-w`ZjztsO~;E9hncr250X;! z6-`>s7dCEjxwzEvdAxFg+z!1L=te>yc@eq%eGng5XX*0bGp%-0BJk0e8UpdTX=9QV zS|(;7`lu|0Iz|;w#BlTcHA%*ABu1UDlWbJI(!E?-ylw9GcaM}WT=Tx8J8stG0)JlYZ; z9Gwv@)8n*SCZ`BN!E(J{m4V?kI}_mn8+nASVA$0nK^yR>ef-9_)=(?m2&nNgb`~@d!=!b1@Xm zC{q2h-h7@rw?P|DRX_FWK9L!$xN@L!kX?)MHRoe|c@ll8XQNW`NK zkCKv0q2~a2+rEC0HkVO9?< zD;S6tLa}eF(cBy%e=d6J%aBSQC16;sNB6DOYJz7XYhRkYzWCPd}^Ny63&T z^P8&h>p`v1W;iLf`%DY5XD@4SrXYz<_BAD@t2or_UZeWT4i#oBk|t@q05hBLXU_a}mt+x&`k+BIq%ea|#O8L^a17)zJp zmYgGC1(3PezCpfNa21B=73t9DQDdk)H|{?{l_L12c}2U;z+hHjtKrhFi=mN`$y@nt zs<?x{5{A>Gva!Rq10t8p5^K$~NYkkhY46bAm$VM9=65&(ddqTN_FI)x5+T zIbhapk|*WMO_k5pN{e^XvANtsk4XO4d`l*FVFU5;Pd65;X{r$^d0wA;R}x zb>TQ0u$*U3V+ZY*MJ}l5bVd1PLXyWG{o?5?FEw1V#7WGn_!`DYrD2}w^+@t`uX+8` zn1eJaO*t>>xm3x|LB812!G?y=tV>fmlc-+ynAN?I6Uz&*D>Bs~0Z^+z`%jxN;5 zs3)UBQNm}A^>dmX1+CU;%I!3XOb<&I<8xV-y>GGns)vMHprTGd7cgGZGY=FyOYlP) zELd}*QQ)VQvYzv+LO}{IY`Kv{MRwpjx709~A9hIIcP<4wm=6nEHHpa!me1wRH46-+ zKHlmhI&mSL8Q95R(IxF)l_H<7o2C1Rkfx*CT%iOXJ511rVF=Cb?Xc4zLATzeg4R}Y z3!%&DR|lGag79C)bL2FiyMMl&Nsq|x+v9yz4*z4N*NeGc^^%h4R(YD z%N5kMB`cc!_NEU;lg5(lz?vJB>oOqxX}i&-U221j@})wg?K7e9ddK>A{$4kg%vM2c zFA1281L*G}UIFQV+dy*r^_PAO9GnhA5&ha%H-1QD6a|!uPLGSX)}{YA75_vaX}e>n9;8MPTlAl@@2xgzg3~=tA9F zFbM?@iAkeHtn2-3)L48J=~VcGs~432`vEOS%w8~iWCxh;HeGEktNL|#yT6cG#~GD~ zH-D9TPUiKXi!AQyxz$$nD1w+3GM*G$8Y>}{E91-T(wQ4-o84Bvd*j;+GN`uptyUj>V6-Ur{bSkH$o3dtg=Zw9JF*e{;Jolz%4PNg=LrjiKTrj*u>HrJSrqOSL|8Bdg}{sdv6u%dN&KQ?;qHO-Z=SWo zfM;y;`cdlEc z>+P;1lEFDrDMC|rD!FW00?u>AOFSsF6#IkhK-QD<%d2(mnlkR_+EfI5KKl@>m0ESM zmMO$Oe~Q&c>(`HjymaUJa>TK#b*RQWKjL>j`?-R^r6+qY!Lne9Cw7DF@O}B?U%^zu z0|i-G?Wp-N+uP|In)BAHbS1xjbYGj|+B-NXGOfl=?&W&^g^Ad<4M zl+4j04)dY5OU!ijIa&GRdDqVXq$HVVbC;DA+w`9B(Q@drZi z_{rD+ptiEw_LX8ms}O`6;#p%uk9+2B^T(n+#Ji;!hFLR;>fui>8xn$`4(U@LB#?PUMYlAtWn zAeS##I7N07tvInl2G)tWw|D6~T(0t*CL&(%Xoi9ol)N>&avj049VoYUT|V0GB1|Gh zX{a{$T#6w$W*__~iCa(lu@~?3U3B`9s$fAK*jVvj3wWljVY~6OAzoH(Ijlwv#QRg5 zzA;eo)%g9mvTKf8A8`2?;J9lCS(fTx!-IDqR%n3iFnR30bTwD!vL=BEK}**}-pnU1 z@(VEoxq0=_j+w2yqqViQbkW#-Q$(UCatE!RMS*eUKp?FXKK0%cC~&A~3;uYC( zl9t1mS6h|gl2*esZdZhbFPLMH`K$BScW=B`a&9UFN-0SE+SZ8c_My>oO{`yqkmY+m*3dZx#2ZWz`>G}) z+(S75Y((iVwj_4KZ{0KXk=#bo*cA7g5dGhhB1}|Bl~CgXnE6+L>Ff=KO(hYv8HdGvQxp=Aqy(?zj35Cb3i zLo~cZg?CvF#TDAYS!_d+*g`iKiF2ejZkla!$m-sP%Z$mPbJ^Hogg8YfK)={D$urlE9yI)&5Jn*$@7^PVj_KIo%S zA4T}&4`ouU4fJ4r12}uET@Bk(Hffr5v7J^zD!dt7GMI`@ z=C4ypSC0&EO0HOKM?LsScmoLE*4!lCG<SHgD_;&5}E8k=g38)4jAhUOW^{CWJxtp93=*p#*2Iw($&h#y98$0+zx+k^u z{|sVI?whd!fR%Cibw$5;rR9%4lz4Y>;wrhd`^B-3iNqAHA~8xAVI)jODk(672^kPb zkP~6O0~*#TxtweS=ic#X9*G~6@=gyWa;?&Utad`a&N-PZj>L6s_i)0g`m|5@`fS@* zN!lO6S{%ePw_ry-t4l)LpUkjE!WA*s&`0B0aMNf)3JrbSSUx`Om_33$#=+UEDmRhW z2lQFzF+;DT8w-w0)03K%d34f88P|h@Y>O&*@nrJ(sEpy%P&qu;=0fu0?ZprlbQB6y zL;Qydu8_hxX(-JCv}C}i@d2|s>e&c%^kzM-eTS#(UP;nhg7se8_a^N^Xik#Vfc4`! z`Bske)lO8+-1}j$15DDV%c48$J_2ZxXsG+|s&q6W@rZcZIz!Hz%W_3q_$~PEc{&+5 zD0^UZ9K&nB68K5+NY>&^wa+W}RL~9&*TJUGgC?{OIaU7Gw=T4yQGrg+Ey;M*9@4Fk zd<0CY^htptm-#_GDB*0MJAOarcGz9kJ!};p9vv~PxSWYAy13FJO1o@*5Tu2`wRH57 zoXdSH_?zCufd_293Gb}|TCP6ocmsKRqFry{=89Bc5yb6gq}BHD;m~1$Q6pmNk~Apj zd^OK~oj}y18h_?Q6_y*F-y!en^m*H|>*vT(4YH7PjR?KKPM7 z`zXc9EjkQvGc-2LOIjXBW&N}m7DuyL*xnrZw%ym07Y1OF;o4|;PQa@`#yt<$9id7n z2MnAD-IQxIN$ja5JMFl@;(HN8moG_iO7sm-(>H$%mKY{TxRZ%AJYy||nvBH6XfsX- z(7);^ya~&Z%cO-J48QtlXnckmo-7zgT7>v?2$gctbsh6F>$S3V`1x)Lid#u@$e1ol z-$Fx5ta5L)#Ka^TQlpqK+=5b|SoH@-FUMS=7;&jNg(|~n4lbN@sISY2sd1i9I;atA zbcfMat(;Di<-k%_wg?qB0cp)}=0=yBoRNGO?z%OWjZZm=PuTE&^mVN)0J^Rv$i`fq5crLsli=VetIcFdW-eC zGuN!r2|fpyoq2NMD>bV+I&LK-53iM&-7g>2;*PS#2>bi-;0#Gq3tjDdV|(4=x9L4U z4t>YBrTHZA%+T!8%lUY@@N4?LIgb_gNVFWoHeDx)$seMmBC_C%PGZ9Pd}~fYL7+oL zF^0b;ZtKQo_rS=7FV#@o*84~gWrd1qeX6;!g7_6UEH(jmcgJ{SciZ25hiafgN6$J# zft|U!M>;Nf!tCWns_n;9esA&oIP;Aw^x07pkAfX!iA!(q zAOh*R7feOM_Kd2v6OC8n&w5uT#iW({61-|zYaM`l3&fpnvMv^~viEPzuo$b{i>65= zDTMu-6Cz?HaGGBnUTHa|oT(Wv++_klOI0Wozn-RMUmb7|tnqfPPd$9Dx+NeSNC6l& zTgk(m1t&8Rr6@C5{EB!8e@!M_tHjH-H?giu1 z>T!iy%@O$DpN_LsUixAM4(a8vt`2g$cLUe;NiT=K&zc=#A9JciNeGsC0e;;ze9|o% zNn&KYj$2D$X+}1>GaV>k2$aiZe~URZZ2W%9TM(8GuUBsxs3P`asQ{Zos|-xddtQCK zwi~_zd-~df3-53ydJ(du$nm*eg(>Vx;1$a>3OqQ{_+nYUDQCaW#6cwQL>$cldk|JF z*4kcnB0ucxbj}?^m16kH+^+IL+hq zP1o{mvxHEmEOnS<&|zwD3spUv-MG1f)nddYJ_V6uI!q-sOYguAKOdqVQfx+>=_B+Z zn0Ckvka1ca)~TY&=mz~5(XTR0<-r)(zl>74^I<-0tTjHAX$`TX4q?>l(2>W$p#?62 zmAzsSAio9y(Tzl~`DYdJSsk&G$TMHfHJaO?DLiMlC9+LgmgHN;e>z4w`I?rg2KVP`) zfZ67^MuFv;fL#VI5bSy4ox_)5Nf4$u((|z7`F-3>OZe3W*mP#^+_$9ESztZe&HhIR zp#arF;8}>oreLh!2s|nz6YN<(3>vc?VWNY4ym$*77FZe_BR)=rm5QL$3i_F9rz!Yb zKAG@$Kje%?dL1?w2;D-lE;kc!gA_i2x756sBfJmoVoJD2qJyamg zX9Z}ZUHtOa@1>r7ZOT_vb$AKJTE65W1AYL2Y_f}>k*|?7?jmKFa?8;lN}d4jZ~;<< zwEpy4E=gAWWk=FagVqS~w!*yoqP}M2d^hR2vOug_LKL?9(BmOXyDa}uttp+Cyx zHUmzKZ%z|r2(V-t9}q_cHv{A$k6)jX{SimC>>5`w`PAt@7~Vy(i@1DGwug=>u&>OB zk(5&P<>E}p>(m@nr%ZK+P0QRUJ1(gcL|yUg)8$r|;P1s4>X5tL=S#SkmP9Kvwm<(U2GK!SluC%R{K!W2f;z|!cR{YyTwfe49sD^@ zBMMAA`=d`5{~N*d!RAlw@fW>*T^-*Skjy4V1c0k|9!?g!Z{+4z<3&RnR2{$XQfZn~ zwW8)-4qrtNJQ(lB61<@ z0bC%n{%0NL2ts?+(T0XOtRWn&qq9SW4Iq#sLGh7D|MY{%ov8bJ;N&iTOB|cuJ6O(I zRa*IIzAVjak+22@pBE$CvIon6+xf{V4>&bszSLsyC5|{!Xx@j3xqDWxOe%$9ey?2h zc<?*~Rsq`Jq1QC*|itp065DGt>y-%^_VtmNgJUggw z?LLZZuJMpyx}N4((yPW5Wk}#&Td?g92~xnxJ~|XB&y{3{qv;fNnrXL7Fkt4C<&<5f zB6EoR!gKx{zs8qpWj$9H4(0<52^I`W*B7HW{|QnV5+v5oh6lz64u;VyvHq!<0wP-M zw|CDAcj966nA5->MvUcFC;!~l2p7IlYe7=201}_khvfvTX2c~1L)n?y6cclfl zn&*;K#J|D?#s#0$VIcuv5LiEd7UHyCqJ7?k)oldgCmr58Nwt7!hw9%|D}pjqSU4__ zd3|Kk^N2-<>yhaC{xam0UbVvNoiuTnbzyLiuIxOS;9dVex~>AMj%C>fg6jc-2KPX4 zcXxM(;O-$f1b26LcXxMpcXxOH=RW=KzIR!(SaXIst9zQBuIgR8b{)3LO0p0ACh#0_ z7X7$+b}Fv_TQbz<72oe&ouSsIP84xKKc zCj6&s@7U}n{3|gv^4`SFURr6{SYaJF`GYwwfLn8~pRLqL(f{ zNf{2MSm*Vi9cPIM$rB9qkd6;v6k2G%f$Fm%s$!C}EX&x};3;UFkzr%}<94qSnzhP} zA_dv}a|9L4n6Mq^lJX4SPYY`JYDqT0jUvyc^xc8Zi3}xuAszDSE#K(yTVUNFYpf)r zzO=92Y~Rgnp)Z-{_*tZ6A4yy_9b$Qm9Z)+;PFcO1EZ~vgJXbekQ`)7 zV(0Zt#VUU41!mX3ZXh8_4|pIlCj1kHQzIF_iglrlrThS_9e$jpLAu2%&G*Z=R76gK z62wjdOBMwFE+j`gRaIGVa9Go7NSLT|6zcNE_XZ`z$pw}zuqNO&fj$azJ7|hwk@P19 zlf*|!e_=>Uay)k(@g()RV3=SNiH?pQLr-2$CYm&Re}AX{H7a_dyMD$X!xQh=(YkJ0 z<|ofRt*MnG98m>bK3uG`k$!zTBa@hWvB*L#Yi813W~}J@rYx`($$=!cu`xs21T4FO z$vD{XIREiZk`eJNoL|Hm8vBJ0tNv;K>qjI=!xBHUTrarTR+QtgnN12|89a67l6X3A zAR1Aya(lR*+t5TWl0*!zmP3sD>y*ZIUm+d6WxvJMoLhaz$C|alqt8S9el7M31X3ru zx>Hz`aCbY`{h^P%P(>5Lr*J%;p;sR4_Dtt@78xuN)@MSVb;yhM@{A3gAvcHIEtd~m zRP+p&>#5cb*IZQ0r=gbqAs*A=iGA2~kcPXMjbqk9(@^CO53MKF52{Y%N8g~BF?D|) zn+VSLMFEx4k7F-%ObF_dY%_Zg7hfRs_G8fa{&@-Z#2o)Quv?Mk+7Lw(n)I-mH zEmhjqgucF-$Hecp>pG^~@q!srYJh3VPfy$bpsDke8<|J8Ea}>N>m6b+n3`4sre4>2 zoaktjd@&qkF1vM8j5B9N0IK@LwLyjt24r}Y;SrXr_ci$!t-3vmh88uiwn?};%fjXZ zsnmSyPnWPL`K!uW{)0JYm z6%v>{1!=fGe9@et8OC#~2UE-`c)&`nT}N3&j|;hM*|iBv{F5(VQ`#g-O()tvlO9O- zO_sDwz^K#M8J?|pPQJ>(+j+(s`BZ}2mKFNbng-I^^rFsg$IQKzmUH>OYFqm-unVn) z5002@q)*eHVRA4E3i5nhGdWbWc{+Y>s?c(1E|jx*gc9LiBes9euCS@i(^QbPx<=Za zTD}q~2!C@ovjEm70%Pv9HaSoexd4BVSAv52QLpOF5KeNme94Vasb8n!*XNadFs&T5 zVkLd1GPEIq)-fx`|5_171=RoC0whu{LpR#UzH3pc545gxWB`KePz&;o(pzVBt=r1z zWcY_GJR{JI&#xzqr*kv*KHeY7IiC+dKYzezjdr~3^nYYJBQ*>U%50z#7a3E!g8~d~ zqqdyrZt9iG1rKjRO;JKq&~=>~FT488`QVYL3Pm*(GrY%l=#cTfN>DmC&;_@<-`~r* zL0wsiKr|6|KIl$60QRepFwdLra)4yTHY)nKkH8eOh(rZ~JfSGXXR_#V=T=rum8T_{FiHi-F8szM5Q zNRa-pVl^!Y_(T2Ru1#!T!->Q;-tl5{q&LcdfRRm*wmhRTD45_+y~@X6!_|d>V;SKb z`gWRg0kFI5?aut+Xuj|ZQ%@g7fY<6$LzUU0sU^uH-`L~BMY~5wV}bsqTkCi&C(EcYkO8G!!TYi z_@0chwVo-4le6&p*KB$c03!Uj?RB%3{KLp%WYNin*?%x ztSU?k!S+_IX@Xj}-+4i&r7+*QY8$MtCV1Dxe1eYr+rf(IWk*Kg%|ji##^|W%ug#dV z2@~7#`x6hm>o10EP;6oV>c*Q*ZR_PI(R8j{t-lmmQl-fkQ$Ac_i64AAzJ0``q+he9 zM0#RJZ`dQ|AU6^ZW4*J#lW%)-hN$|u;|fA04dxiV8132}B40yhF6}oN%%7CQv}9zA zAzSeH9}Vgd%Zh`QJ}_7@jASYxA!zR|b~VJ>Ts*Ta?!)$gvJ7EL;ikqXQ_Gn}4K%1M zP|SW|W{ybs4x)&pUC2i2=}}*|uiVPkZ8UU#xF1@7-O1)`d5pW{Od&>n)FI`OY+T*o zf6(EsBH%z1A7&k6jgXYWLz#_1of?6TM`ewRhL#U{amNv5{cbfp0RzBlGdhEKdaZf5 z?milxIB!Hj#s~SwLCyubC$CsLV5oLLb%ij&x4F{tQQ7*|MefX3BEVw4jIScv`u)pt zgx3oYSOT(+Sh*tx;!g?+xorr#Ja0RSXlTzq;0v6=} zN2g6U(UFlhLiDfQ7>#Dj5Wa<3lgMB~EH@;-DX1(A!$0v`M0o-Ty50Od)}$@!PS`}jxCJ}^$38EB`H6l@-gj`UC0{K96341auk4%#V2k8QNf z!9o6%@1I@Z1ziy7G_|8Zb94nj$JABVRQPjnC}&fgW1NbB?gjlO2~JQdAXLry1oQrj zrpO%Wp^ORrj=j?m&XG`13@Z2wYDjk9f#`3rKOdP+V8d++RkUybEN{@yp}cacc(`OB z$mAMep);~QNd(C1-g?61ab|0bX68@@tW}enD~F6{(t=LEaU4m?a2snaSleA z)|`EE3kMV3>_?Fell_Vlz>>~sO#IJT@UQ8B?`2N5>2g+Z3HR?Q^6x+X{dO;nq)$S9 z8c%Zv>tg@i^}k=)WQUSfY(+5P^!u-8`{!4z3_-u3TJNc3xB{Q-&u#ppr4xK!xhwX} zt1o|X0|;_s95k?@I34%%w7+br+y~g-li&Rce;($4c13hknUq(q3cK~0nwom=2l^`L ze~snemzCc&02{}6KlPKJ4i2a+klz?zq6hONo=-?w0$tCosO3}d8c#^E>pDwMv4?;^ zD}E&w+y_T$EQXv6&6!l3lUCQX_FkXBmKvQ~u(@3{Kh^zGgg0Gk4f6E| z6IY%eLqQ|>L`qCN?A=G1=Un42U!V*>q#QL_#pl!ubSFd%fSIUv1l-!3oSb>OZ|u|A zYWi1qck?%j#EQ1pf)=UYwc3TB?}3T0{60#oV?4O)vOtBC$O}^GxI=b1JJ*l&ea!*3 zr$jI-G_OYcpy>1@2fyDQHS;~r|6@XQE&-zppKiJ43fEB_FSmSeRnzUdKkvvs?2&SKve1~=4%LPB z6B`<;Hs~{hMud$!T#kx9qfH)rN+4n|rio;`NeIlyr~rcm7Z(=xFWqPqQZAozhwBjO z?xraGEVsM*1WWJOC2zWr-{cG2blJo2pNT+@jt(kjF=-=HlWJGhZI|Pa?S~aTbh+#u z!&e(`@HJT<;-j*=SJ-&#S-jYnC#FJ*@e(Nv`&L$F zZv8$3;3otCHRye%`uREcUX>6?v{Y0IX};&%S=3?!v<9qXNDgV~=>+ZE>D%Yw9_L1G z3{gEazMM1~O?*b9YUF1t^|2g~4{`y9fx*E^)gCj-NtZi6F+X+~ovnHWnvD>5OnO(X ztgJx07$_+z9T8N96jey?74pPMo^B{7jer{!_EZ~h!1x(xP-=P3Al86)En(nZ6 z3@XH;E?KaQVme_Nc@uyvA)=iP1?$|i zftW6{=eWAOrPU+0!?0SfmJsT$v%AuZ_6<;pM3ef8Nz?r~X($FLR{tie>!Rn{h))!NO{up@%z>|68PQ{pManOU;+ z#l?#yli3w|I*Ibk3+ns7IupEStGxgVr%BgmaR zo%*sh)8_gMjYkLX={&%++I>J96?<=-uIdhibzFy)hl>$Rx zed;`*Vh4o@y9=lF;Y(sn)Ia^5e=qxgyRym)ia;V`wK=*#i;C^XeGCSNSYpC&r&6&- zc!Wg{_kgbsJEpss@1U?l9U37MIUyVtmq$4-?tqH_b+&}a^&T&_qCJfqI%r5(b){WD z!eXOtfVjzbF(EaT0;qF5v+@NR=90;Kdw^(Q&|}P1wMLi;8V)Y<+l*0(6N`lL2;B`K z-u8h`Sb`Hght+ImIgED^y&O1SUYA6;A3{f(uhN2j8E5y%MWcTZF0cq$ajJ;L;KjG;f zoOsMrRKQT=Dl-#q9$J%%+KC6#+eOXT9_-dk?HJtDYsuHRC_z_XP}qB@eb*n5k+Wr1 zC^pA%{@syr@4)gBKpx^vd%|oHN4MiK%avbpsJ77x@uSjw0tD4QZM)1scaQ2Xj6r7w z{^l2Hp_&eC^rn;WchZ9G1PXw1L?K~at*8Wp0|3Y zOY8SpfYRC4#QVKsMFr&?sSVC2(nsag9IRgv@xr1QfcYkwAZ<#b_AyKL=phN=57!|w z;zCrB-ptmzzORgyyt?`h4b5c_s|T60%!>Q zl@+okrWOKZjdoSwffpVNGW!TgcTzLdj&7_SuJWsD0JAxK#)j?`B-Q`H* zq4h3jq--v)zW1K0$&97u;dN$9iW8VQe!BG%5#?tFUD2qZS9gBKcnY{oQh1k|K!K`M z#i<&NgL+cyy<~@!y>Ksg#UHb&!OcIu3_>e6?A%On7Hp5j*m!}i#~k!PUi z2lDbrflR(h+PyU4pAs`}q30A>^+2UgU*UoDP=+QL7HhdGNpP-4tQ{KCkt>uc;l~ym z0zNG#NW+Wwp6!DjbL>DHtaLWl^xc7BpTfpw2N}XrB6}JH|icTmxy|Y z1w_J=S|bPJ7BfAxh{*LMUw@uV^S$3*+sm_YjzXmm>IV6z1`iHEp%eGc&Lo@LZX3W) zDU&WvX!*Q|QNdUIDwVX9-v7(B)J`nZ2D~)X5}lwAP#<|y;j@ooQGpsIcZEUF8pFux zbR61ry&8ikR?PlnWa6*~ul`6ZB@p$-6pGFUw#8ek9wU5bINvH%ZU4YsR*YTTy#ivo zh_CJ^Q%&5f!)5GiLU{NTnHMu;6$c6$`RW`8uX0=we!b&J0;C<_0Lh$zd zYoRsfob(`jC(%vv-_G}cm|)p=C|18hC_1F4PZ4+#aTHiE*x7_%Vd}uZz(gac&vpaR z43^q1GKop@2ANS?Wq;>dSCmgH-+Wgt1r)P^O$>A3h0}Xu8q^QR^+*OX+MyF(;A00_ zYA`WWP*Y$DY?{xtR;{jg1Q?irU@!(ck&kbeWRvy_DDB&$Q)8gxrw8cJN`a5T!CO<4 z7Z3`v1^Q(XbS0Buywp9yZ$loD|HlU^Qcq;s2l37Y64D~kHdLaX5W_6txbx)jw^7Q;k7@*#9Tg(zc?5u{hB67+td7Ml+q zQ|`jp#TG<8_Qn!y`cX!)R_|cHlzl$zC!vhlhH$WbU@|K9WctiW#F>2=GG{lN6KFO9 z^&!l&tEyS$;^SK=QRxkn|3i1<*wkYPW%x5;Y27bGRFnf6ZQWkkFM&a&NLhrZAn-Ty z!xK$60*7uFIaA9Ap=#)fJ$KLnM65*EF8iw_>XU{=zDiKcb47TK4+uoj=R8h}9?-2a ze>JDZp;`SDkh+yoQSaFuO>+GBlm}lja?MC~m$BAU%j2RSu;i}VvwS3l_Ll3+hf8(h z2NSPifbkIaZ`#KqyV$?UxAo`T#(BEkyCaP@&F31)IEg^`wU7nsW3+cT3h`RYB$0R_27 zN0m!&d;N2%+C5nD^?T>se4PF_q`>1BB`N3nl0Kj zvlHehEtYD2NeQW){-2w6Bdpy)vW0ng$y9-t~n`jayownAH#I!#fc>A z)xlhIoWL*hUz=n_6i^B+RbrTC#j5J4QFqF>%`s`xNecjZe;58zmWj>9#c7by4A^S7 z$Um5mDAzAmxtQ9fDNGDo07I?eD55ppv#z}#Ua1!QbaBzU%Lt8dNvC^hXdkDE`oGL- z=NMsRR8rY8Uo+UV>(`j{JWTb5`R2c2=c|kp={qRO0o6Z4n3_$`yCl~%tD8?IB?-{r zxBOC&vT>4IxcwLX`ALCF(O76_`TR-49?M;Jl-YRvZd2G1I~e`ExPrb&0-HB;wzvJG zJ_l2ikl-2sb$GgoegE%HoGY018}r=wxcT{JkF~*$>+85iZ_0eAw}Lz?h}{uNaN^?h zecG)|zL@3$xWc|%1VhM|lU_pgnEV6%PA!VsG%oC;&zAmYM7mNZzPhc&gKQcSm z;Ht*tX1nzRe|Q~pe?N3K=ak^B!Cl!<*XNHFq%5R)&U}RSsAPt6?=zj}o<#S?OJ>S& zj(mZAyVPeog+v^CSKQ=qeh!sPWE4Q2JAyjMokMv-pK5Ju8!NMHAMqwcP~Rp27K$2p zDr0JHT3RP`f{UkEONLp{)=oFFbmCh4tHs=k3RIeeV!4A6&=_n6=sLY^%x*?|!tVc8 ztabL3J>F-(VAuYZuBE6L%Hb|8ofaIk@_bMGgoYzDwjJtT#|_SPY1DU3kIIBmX@EBzWL`u>gDsN$DJ5q4p5>PlcP|Zpo`eRKgcpMUMsd8NNo1*e zG9=KVZX*0OLrs*)Yi=$AIsP};1A=S=0V@6V{S?kd!Zj@Zb6M@d*5h9-CB#2uI)Tp8 zJJiKr_4|*<;6(x>r$7S2yvKo;OZ~>6w|E_b4bBxLBjHWYH4kvEDhq4X@SB zgj~UV4!hmN(L^SZ^LG16#WHmg>(S9s$)tx7{=e~uon6H$(zWs=4#J%$ZV>*wo-Cpa zj<*v7%V|djqY4mz|33O&gxvD+mb_DaXW}jB|1`|Nm3_-To7dal&s*iPmXexEIOSj- zA^{ztl?_X^{{uLT(8amUTT(lt#V%sDo268FbC-R>`c@aApq16q(jv}BQxH5S zk4BXn4w?E2eYt zjJ3-%Qk+Vj6k+=Z2V`Mb%(M`p*ZAMr!wRAJtlqm(?XH2ja+$(lZ2>RZt&{!f5?7HSZ>(WqP~yml-*4z(US1&duU@Wu z2S+sqEB9&6+1vLxEulaBtesk0TXP*Ntn4NxIqupEzN^r=Di$#)=;FabzC9zOg0JdAQYUt@iBb@TWY441^<=#_ii;0Dx0h{IiLIm99x z$aB<1B+&iuD? z<6Z6HxLoBgM;S7Qt;^1C>HldFH}?UoZjXhjT&~hU)du2r7fbnRDk>t4d7SVB3J~q> z>}7?~rrGFp!VM=7koRd(hwp;F*jg%8*{999HA!whWpC$~aTwe+O98dX#Db1qhSMb~jfCaARU{_vOx`bSHrEy<&gzkEdLtNI^*-YvZGM54mp^@kGt|_~4*eQpb*pL^0}4Xc zOuT7_<8YMg={W*%Jb`tO2Yu(AvWGAm)Gx@yluCm>PQLyfE#G*gVuV5xhWe#6M(F~r zW5}dp9v?&Y@$w8ul!rzt-lganGj=TBo&zf~Dq61tI)<;~N~AmobkM1Z2klVrwO>v; zNThq}s}LMfpWbhmd6W!NqZZy0odw}c!v9T+zX+p=#)6WIoC#TIBcfn@@V ze>|r9L*X%YtL8x5-HbP!<7+zg^p9O%_PG>x!3(TDq+))=3BSLs&*u!^@k9^pbsDG7!*+J%}9 zx&8qe(FAE6#ndwVkJp8-!h=Eqqod!S4mvg>6XN7nlWLsxS2j$`n`l?+EJ@ynr{7`G zP7Nc*mvU`;-1H3mCS^@0Gt=A4>F#?p?>t(o-)?l?NotHHTFi7#PaJ99)WT2N|Llki zbAxE&^%h;_@cEcr&6tNwoA7z0U-twmSD(*~+d1kpsjYtcoJjJ$Unh{IJKI4@1?z=! zj4rLe$i!ze8+e5U zkkLvBL<<9L@I3CHRQjL%tt$u#i;E5$hFPD&aU$d%w%CfYJUvSmENH`9P^zlzzLN^u zKXMg$c9d6}jj?-CUiUm~(4MzLp5sxVkV+##X@N7P`XIhN-yILGSicYW{@{6?bidw~ z@Qj|)35x+H$6!TW)kNtO!&cU`-pqSmw{JcUbi9-0bYPdbyX*#;RbF;{oS*F1WMw{G zs^xlKZl7Eb;kjSt`+rfPT>}O~h8H%%SqOUJl_Eb!pnJZAaz6F;80j4Pw$Z3oD*CTG z1O%JX(Z9cl(JSJ_*_dQ=*?e$auinsnB_j#m`k|BIai6#UP)Mm0`r7HXpQ$r8czivV zcww-4_C~_ln$7ugyJN@q0aB~|`Sx2OTfPf#`ltlfdFX`jfO3<3V`gQD7)lnQrR_4l zmW-KMvaOvSH79kUr6S)IqUUP>9PZB)&Kz?VN!a5-{r|Aqyr72OokcUYSXa*cHf1Q- zUlh&EukUSQ5F9KPJQ6~e70nd(zAhr8ZK-nRT8%E(nX#`q1jhsg59bA_o+1Vk6+n#ejWq0`5lX9 z$an>qArTMbWWJ9*Anbicwjl(yxyi1cU%BughH4m7wuRj$?7d0Qc2mYGsW}^6syPU^ucm%Pek~p30~`*xi_f7j~L=)%ymZ!~A8g^RqJv6(5rO1-4zwE3Ikq zkBG+rG~Llhwqj~&#Tjl}LS?NrvfSq2Qj?Zn7jXvg&h09&8>(Xq3j?LLH}RIqzKe6E zC!1MBq_Zvq<68R+vr|uULXPp`70sKp&l-7+XVTh(h>f1SHZhP^eG2z8m(&;fQ+npkEY5` z>0PN>p{<27rX)2+KbfCe#FkbV7{bT;nFKOxjCpp+r7C;}fJp%K$Jr&~%QPv&zRt&( z)lnANG>CA&yM?wsuIm30k`b4Z%-kH5;+Ht+DP}~by z%nG2)2*)zUmO4{siE(nUb+6D(88n;+W<+s9jNj((sEcL(06lJ>BYVC-%0lQgks^q+ zxJF|(Tjj;|IP|a=-|i#c$t}_5BHRG*J(tBrG&H=Qr7{n2IG7X=bTEXSSf=Gmn#l5~ zKi{2w1M;+f2o3=)V-n(dpqY}CXXC~8_W04pD`ygibr#ZtHQuC5I`&niN8!tE%81LS z2E9NS%X_L)y+Y_TVbCoL2gV##7{QKj$vv_>sgf$G0nSl`1hn{*Zog28E0-cdUI43` zyEWD}D&1>t+Bam`d>F5XJ2ayWn(N8t^!Sq-xf-3RCXcJXc@G~W>?)P<1@PR$vk_yP zoIAcplSnAw>QZXa0v%X$>wLBT{-<%3!*zGKA>*~9nH`273wsOYg0N_ zCo^NAiw%w{&L?dXVJj8VWn0Jo(*Pb+yr__~qk#(+^h$SEhd4x@7h#<6k-R!~cmmFG zomPIWAgSFTk$|9p_D&lP4@SGt(I>+yMuh?b?Vp;y0RetP5)(Y-pk5g;xa@hAuWFI&xTvkaahr5 z-#VP1b&GJ6)=rJLrswFjVcYQozJ7&{MF)LM@fUyx=U#3w*RS{UFP&B$6fnOYqxicQ9TdMN*Ht~iA4Q&S;Bv&&cO z4#v;=I%ZF_n-$8hAEnzfn}5uhf~#DorM`4(tAZi6;=SKTEQARlc@w5q z{uwhh%=lE!Wg}H1l{1Qf%U)_!Mn0!Lyzw#76BYzj^K9nZRhL~;_lk-%{CF&P_C-j2 z-N`Yx^=Vzyp5y-I8`iRl&^gB9fac{NrFHy3Rp8+fBDH{-fcI%Hj9;#5ZE?FWW3mW_ zY*u;qPL_+xnq-A>g>>*}Q16$MLhkJkw)cF~V@ktQaj^*D`KFF%N?gfM{6j-*T8Fkm zL(3Irpn?y5079CPM6*a^;`KrL;qd&R-JCfm!kEUyt5J&~85t3pv)Fb??EOgYK651+ zBT&KhSN6F|H>AkrdR|QRJB`2~&bZ_!{+2oaHP-_FW&e>vnhqu%a^I2~)@osgBs%l- zZ!QLRDGbK#oqO~3QWEx1-g+hRV+N;=JQz`k1XF-(cGG8XJkM01NK1>!VAUMyJF8Ip z`##4T2SVijSjuooMJxGSu@aqbpK``)Lw&bIp`OK!%Cc`)M!|$Ki!KT3SaG6*9uE1T zH^uCrXJCesx-AyC(q+;Q?vQIl%|jwqxCANO3ZrEqF`z&2NzZaG-+3|_p&eWx-vdn9+G_xN=f0d?Na_OvUK!sGizJsIY zbj)=#Tf_3_d?QCozsF{9WIe&))AuvwKhv_}mG=-82p495~xmKt`_p!Tt55PjZdiM>@{K zDQm>tq5uzNWZ`3;igt`g^TJM(IWA*m#*;E^h5(hi3HQPkk9aD&E_I*j zjM0*IPyAQ~#*R87T+_}khn9L~P!o96tffC8lc_PkJMv|UE3&^{_qZN2NeKE<`6-#6 zk-}QhFohZ}qE1kSHJySBy|g~%(W#h*9~orpg%>@})M&W&fT4dt)@F7_8=B{4?Q`8u zhUog96AUcIM66Z#fdi18h5`f6)yE+9vOAhT5vXs1vIzO{x!#-#jV<_pCQsZf*vSOI zuJRP$>@n@42q1{;TGu4E@4;9CpeqXaID6Rvc23%qrP)hhBIsk^BD1%azU^P#g^t;a zW`0M$yt#=pIwltkEO-CPY4f{Oy-vE`YDE{@3INOVyb1rbpK>KE`P0!pVE_+@I)d9< z5hCGi8;b3Gt|aAlvKCy~Dp)w#7E&?dX9NawoBBBjx7fet{=Ze02UzfDm!qL74-%GRW~i-$fZh|6$+^s z#|k~zBJIQpR_?M0DWb3wy#O_pEQO1&)@?f|V6^e@BY~&m`-SIYQg9ILowJHUEqK;$ zVWFiv8hpzG^^Mdb|C)KSvQ)eAA%z{dJdX#YlrbS#n(uNl-owT~olerfqtB{=Puo;kA{_a}n{Z^*Dt6h=8zJtP)dAD&A&Bs2G>I&v)!4 zyFRX2LO2{~F(b9!vY`ooJPxf>M?b6W1Z!SBG%MH-LI#h2WaY1Z(CG|f)Is;fBA8Vv`}osdXU z71%IliO{)fv>|Od!=Pqs$*@kS5GYEo0ximxNH4vq z0BM!-b^Mh2^XZUB|6|S3=)4h?5w)=(<&C;}CLC+A&LimAG6jux+_x*#m*3=fLn77( z9P3%`8V->4OhN+q?HXHc_i4q7MZ`HBkCX3_`)Y9UQ5o$i7Z|vkBT$Vu_{m)ap#v)B z35<%3(rM(*9TzA2urSuv6`BcEYe~;)pIJyeF8zFW)UP6T$ne??9r?E$ubh3%rpVQA zRyMfx?RwbvS9uGsPd?sSp6J2CjYo|)E}N>&7jTIn+Fz${oMqfOetAD})?91=g>xKK ze$l$xFVL`DmSxV--s5RMmEBbiuCUjc4;4=EG-e}m3lMnofA4dOKXeun!Tk@w76|U| zLHib(mP(&3tE=o}ZZ1;_hT)UU)n|ytKE_JspfW|kMa9cy3A?Jdf20bkTqlTobx>Ed zzOl;`i|sc0a}ovU36a4&*Kb591O+!f);_!)G1UVJDcbWU4hu>4Xi2L+0Avl*tT-{A zF~%(CI7%f&rkBib$@C_?)+_5ur#_!;Ce}Zzt37cP;b}?yI$yWO-LPNaRk-Zi*jNaC z8|mH?HYm&!lAkmlD0ip79S2Fyp_9e&8H&y`xBG&Ag^@MeXyR`JJ+Sk;eQnH-p&Npx zOS%O9?NYVk<_3%U`RwKPWKJk18aGN#M}~IWsF*!OHW4H)YbqfO49F7})s>Bg-!|X_ z&D+7Q@0j`imfaQqQN>EQTcJhSF58KS6`b~EuJtT+_Wo^pdV24UWjz5%qZ+Qkg1{-# z-E65VenZb0C@iTeVJEGC)2AL^KRsxie~AydRiDuJ{4+Ej!b>ve2#8WjHLo`(xH+08 zsy@F2M{*>W{#6`v%=Ce!Dg(h(lQ+{GPX~Jf%U7%G<6@>v$tG7@*<{sgTY!X`l_6xZ z1@;2ucj%&e@7=$*)o$Og2gy0=`MA{WcD?wU5X8tXWzQu%;ILXycV2WjR-)-u`AMzh zvZ6P+4q8?N*bN&Fvc61XuwkbFBOrncaUDp?ZlnXl2h1x&u2+=# zYOc=lJC&d+-2_iwZl_z{32@JQzMd&P0ryqAGf_H8G|T`9j}-QAI!^CL$R7hs$w1)j z|AqelIG05R6DQJqyn#%P?VS#0f`BoOFW8Tcj!*aDCm08~_ygD&MU3&mI2m_k1behs zS2bs+5=@crT#JxTi@I^T^VjYk^UGTHYUK3yXeziX2(_4+3JHdx&Tg)!j|-Lu>^|*> z<)G%w%*;sP3Lzr0Fhr1m>RGKiYNE`0aT=H$sWWy-;mA(5OyNljje1?l+4QS799b+t zDq%++Ac12hGZk5LQ621{>~&as5L4BD>JxZCq>C%MNe8+yHuyie|15^k;EiiJUY(mv?CzRU_SGZtR;9R$;J7ajx{b(Y~nYI%)^7l1?s?W&K z5rZ3|`;(alejEnz%8mUQ6ebZFDBdMJP|YZCGQXTX!-`t9>Fvvb?f7NS1|&Vsk0L)o z05eKuYF;xm6H>0z7x#p(WU_OQyFT4{r%+-LM>pO`(;Qm^Z=lIi#6Cm7t)5vyNohi; z<|5*XK#!fdB%)l+F(t)OoOxR)Zc<=|fe@$- z!uzt#zPTDMcjFoCh~`L>-yIeCY*S@Br}Y1bZH9xTiYxxqe4WD;sI|9X^>s5)q6jb_ ztO-EcgE=<#T%SvCxX_ql zK+nb|6DIroSUopW)w^)yOg6qS?2jPzNQT`}?^UGQr=1)V`qz-qEaKwQh}hWJ z`qV+jk2D-(z0R#&X1zczqJH%H8nQ}r}zN*p9$1jUm>CVz^i_7h7YKzscmm< zmD_*0sI!Hb*ChILIQt(|hu>kp6@r5SLulXCzZFPlM1j1yirdKYR`r$~)u4&~_}u|C zl+r@12WTz$t9f~OL$gOAdCH2pwHE7@om_mPTsV%>^OlPgBH_5`sVXhXxwV#Snn0da z(W8o+?o?o;OM4C^(f}QGa!N|b>1v%0=^LlSImV>Q!d#(dP-8vM*LUEH_wQl+*SVKQ z%5NXfveTa5nNC~$t)m)^ntxE+LFcs{w%CR>6COaSMvz!{++ceOtv-kojc$or6Q8-;G5Kjoh)3Xlm8rwTD8n{jCdK zxUsfL#L|6chMt&#fx+73MFnaHb?!8Srqr14DRlmV7WUieX@PZcCu&p`TlJ29O2qGQ?HySpj6Dl$ig4$R3dbl=Vl<8c&~vxno0 z^mvN69>5zFBqDCy1J9dy{)9R?4d+cH8|;ZcYX}#??;R-_ z$;kQ}WSBYf06=}cQO^BI<1Bf5?=0>>zPHurt-0X#_UF~T9E8gxx5bKw=lc3OJ9>BF z4ac`B$b-DYldUaXS1p{EA2@#og#NV<=81G32?_-|*c=GW7m|iy36G>YhwK62ImL*= zR5Dq)$Q?AbQ&6&qq#PPbO9vRgOZ)|&8!^y*Y_61)LRyQEZ;gj(uvsJ z*)N#fr_xvQbaprMTGcqF08i8^wYWUXi&%|BIl`+3pHqkft2fP zcg?&se>BIlRce*fnxI(Ngo+r4uMLHn@mV+E;t%C#d1^Zl6xiDIdK#laGspOvgjHlR zNzTV}Wh6jgl4)!C(8spHa)T0BemfQx8X7rMcQuWpmd+j4#g%u^mp8~kL^*=iJDWs) zz8vS949|Nek_Q3i~3uDGns=fU>8*ITSmg(Q^In+qqp$heO&Tdh;y9nZ&8<7ku& zCgl)bOW(L?N=hnT%?q&Cnvc z!V*o1AL|v;^44g$Q0$syCR+V9Ad?z9Asi6{WFh{M@F6b+UM;3zJOs_PAoY@?R0=TD z3{%W&+O>iP(ML%cfp$Jq)q3;(_a>U;i#_7Ci!B+MiV zZQPkE2!mnAv^XCMkd~ndKCl4-zxdk4R`LtBv|RXcYg-IUu}`IayHv_V|=&iywQo zUbEo~txt`yOIWNNzrlSISoCW(Pl4lUgChg0t6HE1O?XhV(JAle@uawxn61Gn7^d#hNy7#G4d>J0 z+jPAW3Il%uLfPKfgRmKOKNJ1wIf$Lc#(6&zhFV)O-0U_h`A?rq17C>>wGOf7<8~r* z#i0}&-KF_vfL-|Ik*)xwn1X{#Hh2KoFr(HBCMs2lh@yPLt~@k6H1kUd2A0LMWD>Is zFtN=faqE+>cqqqq)k|JBTGG(0jU7~_jcE07Enhzn=Ko*z#zp{&HLTF2+nMPn2HO|& zxzeojp5gwsd0`xL{ecf+k?=lIpF?%wUH+@c=DM8F%)}zLr_FxzDWEP;n$DE(S09TX zzcU!;E_Z-|vt(K$C^eftU>TMCZB-?rWWG=4iXG)h5L+g`F;{}8VrdI=yTZOEkRm^F zAda_ZID-=@SqF6}iVqXAoe`(P2YQQTlc)h-xBLb1JUw-Y()mmzX1H)<8}t*|$+iYV zX2i!-X@ZL%P1bvN=*X0yN(lS0c=+zeXrO{DVPSh>c*dN3e9ko}3ac9j!3t-rTd{!vY*23n|b?QG$e ze&2{4*=!VoLrs_l+n#4e^_miEa_u#TfiUL|3criG8C-vw0bn#65hW*ja#`(U?t5@G z#uibn&lCuom@0D-);EBweCq8@&(Ckuj0AR3SYVw!J<|Z!U|L#R(*UT!r(0cJQb8=@^jvn9;H3TP z8;iIg$0DN(m#(Gz*su-`BS$nUIytA8CvP!*6VR%*W&RZ12KeJG5g3w4D$dNS%)fvq z87%o65qyeqkUo&2J-30^Nmy9TstK<&!FM9A*yN*oq>>FY%kz7AVBFUbo_m72jg}5P zBp7owI6gZ5Sv22O)PsW_LGI%c)wpq~o3j}? zZ@$g{2!+)=*w)%zjSA{(qiJ5+TT^)d@COpKHlu{DFKJ*-Mky`37RfR&R^|f_Vrc$}pItarHF< z{F7uesW&spbk}@nQrV*}(8c9F+bMWFQpvF?1Nx@r%<*xyyxx0abA0`C`km~C)1;nk z*_*I3mK)|dYM$tZ3dZ)kkK=L_mZeg{=~=TZJQHFMjo&lAMcMdpf6%RI;*h@U`bbO- z_ja`hh-Q;#U0{#)Ip9|Wo9jgc5(|D*qsHcMX;j@`Y)^frz|RIFO| zBAt~owOoecwh_E~uu^wtp_BLVhRc>X1!fB6I0_mk#3yFn^)W>!d?0mxS1+p0+NhKv z)KuL z5y$1L_FiaRRbk7nBf>CuIkfyd(w~JQ%1xjB&e}_#_gH#U(MY5N|9pe3p1aY*l8fx} zWxBM~CV^ip&y%=n!_%FB8O8z|MG+g_Td@J)DM8(cja`QMAj0&8sqD>D0plcfD=%>XUEN z+K~RsJ+E>yQ2b8&d%T}%JR?2>Uk_+C1X@J&$*2@yZV{SeEu8D7=cUT*izD;v81xCh zWpc?`>SfW-j`eZy7w0buXNM44>2>;?m}*5tL`s4|PzsewQHU>T0 zp)2PCU=%vl5OB%Db~&Np(jkQ z6?7M!L5mi5F1t9fNXwEktbnZMbyqFXOK9AW)k<4-T?d`nxQy0BPF)?)JwOb$C=oO1 zE!vIsUM~%ijP+Prr66V-Jdl(4Q47dL$a0T)XNg}`!Dt-TW7mK}NKDGH=5n(Fxwp@! zsT*Z^B40TVJP1J?Mr|(_C9Y@fFMbnQ!i3jSm|e8is%T#JZ*0w@Y7Dm}&&(LlodZmo z=JLrfa~7FFmzO z?EaSR^0VMr?zk8q*$bcAHGv*wC4}HPAL;qH3RkkJ{sJg2f8yCvZM8Q2B9!MifASsZ zQJWgnFseh2o87ZL`HkI3c3G>e3T8%7Q*{yzZA2YaB!^f{3_jd3GwoB9(d$p%VOoFj z8aaU{wNn(~GwnfH_wx6kYdlwiF4mic zmMUC&RG})QIeXhrhjTx-qPw2>kOdk3V!oM$>wf>g6hV+=J3f{}s=B{$3HR`kN#ydqXMxKsIALjrpP_>!>``+6}9t`1uEgmbA#LekU2yGTE8dVP1Qz z&gvB(om)@L**vejcV4K+Rdq`>_rYU;i`ViW`OUT~f)vucoOgfb#%?a|j0d^ZKU3ih zA26&saN{SRy&oelEO;^I*?P)gld~FFcbbT00mvt+TftsBk$;2>#HIG#E*}T(xUK7N zLKCfRZ;VI~zj8_`e1o#pCRzk+fcq(wm%HfEf;slF<6uvtwu2R~pr=99VaWV*v%{< z9h*=t?{`$@h8CK%#XMb%zj5!OX{$S%bnH{DMtoC*EgBuJWju;ToQ)#a>+ zi^lnB0NZa|NLgv<{f4w6>BA3*0-=n%D96DnuGAX=yF-Fb>YRP2rGqR~5MoN}ptnVC zg!&_naqZ81E8>s$p@ug5&n6ps2{M$8-FP@2vBh zHMKg;956%l(uqSpu%Il|YVbrl{!=!({VPYTyz_vdXeI-IyWA*Y|zAVxy6mK< z%@uJx(rU-Z=cJ^H)tPcz{7t-q3{@wX&t$-o@1gblvb0Ah^<}x_@_QLjM-Q%oGZ*?5 zj?P!gnfntodNn9+`^mWN*rK9EaVR-q#vFKWhGm?p4&9=F4i4yl$IPkO5TosBWhO_z zFsNoB!nB2Ics2A@)kMUiny`LOl953hH|!yZ3#rjMc)r1{xw-oSJ3j5e#{ zG4n33Kz!VHyhLL^gc(z6X-NS4orQ(%gxlUma6HAm+N5DHKZ$jj=eOB{Fhd*< zX*g$uemxo{2OuxQ`)eSa3x-mQ#V$8K$WZyv{GFCAML(6qsIS1}q&f--nwX`frR8hC zELhBsvwPPN9V`uoqa8b)l3xf@ebqlt!oG>6@SbHqc@xbQT(q5$$00y9W_}KBD>rHr zmEdGM4%>h%BvB3Gf8G#AC}joS^hM`whb@QfFX40;EnYoB({lJ}er|ASt3cg}z4-9|a+O`ciMD>$Aq+89J#&t- NnHb#E$LTsp{tv3=qv!wt literal 0 HcmV?d00001 diff --git a/docs/images/intro-spaces.jpg b/docs/images/intro-spaces.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7569dfc16b4f790005a22bceba7bf562abe99b64 GIT binary patch literal 78941 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

!@_3}Pn7DJBjv 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 h^{$h9mFh22What is Kibana? +++++ -Kibana is an open source analytics and visualization platform designed to work with Elasticsearch. You use Kibana to -search, view, and interact with data stored in Elasticsearch indices. You can easily perform advanced data analysis -and visualize your data in a variety of charts, tables, and maps. +**_Explore and visualize your data and manage all things Elastic Stack._** -Kibana makes it easy to understand large volumes of data. Its simple, browser-based interface enables you to quickly -create and share dynamic dashboards that display changes to Elasticsearch queries in real time. +Whether you’re a user or admin, {kib} makes your data actionable by providing +three key functions. Kibana is: -Setting up Kibana is a snap. You can install Kibana and start exploring your Elasticsearch indices in minutes -- no -code, no additional infrastructure required. +* **An open-source analytics and visualization platform.** +Use {kib} to explore your {es} data, and then build beautiful visualizations and dashboards. + +* **A UI for managing the Elastic Stack.** +Manage your security settings, assign user roles, take snapshots, roll up your data, +and more — all from the convenience of a {kib} UI. + +* **A centralized hub for Elastic's solutions.** From log analytics to +document discovery to SIEM, {kib} is the portal for accessing these and other capabilities. + +[role="screenshot"] +image::images/intro-kibana.png[] + +[float] +[[get-data-into-kibana]] +=== Getting data into {kib} + +{kib} is designed to use {es} as a data source. Think of Elasticsearch as the engine that stores +and processes the data, with {kib} sitting on top. + +From the home page, {kib} provides these options for getting data in: + +* Set up a data flow to Elasticsearch using our built-in tutorials. +(If a tutorial doesn’t exist for your data, go to the +{beats-ref}/beats-reference.html[Beats overview] to learn about other data shippers +in the {beats} family.) +* <> and take {kib} for a test drive without loading data yourself. +* Import static data using the +https://www.elastic.co/blog/importing-csv-and-log-data-into-elasticsearch-with-file-data-visualizer[file upload feature]. +* Index your data into Elasticsearch with {ref}/getting-started-index.html[REST APIs] + or https://www.elastic.co/guide/en/elasticsearch/client/index.html[client libraries]. ++ +[role="screenshot"] +image::images/intro-data-tutorial.png[Ways to get data in from the home page] + + +{kib} uses an +<> to tell it which {es} indices to explore. +If you add sample data or run a built-in tutorial, you get an index pattern for free, +and are good to start exploring. If you load your own data, you can create +an index pattern in <>. + +[float] +[[explore-and-query]] +=== Explore & query + +Ready to dive into your data? With <>, you can explore your data and +search for hidden insights and relationships. Ask your questions, and then +narrow the results to just the data you want. + +[role="screenshot"] +image::images/intro-discover.png[] + +[float] +[[visualize-and-analyze]] +=== Visualize & analyze + +A visualization is worth a thousand log lines, and {kib} provides +many options for showcasing your data. Use <>, +our drag-and-drop interface, +to rapidly build +charts, tables, metrics, and more. If there +is a better visualization for your data, *Lens* suggests it, allowing for quick +switching between visualization types. + +Once your visualizations are just the way you want, +use <> to collect them in one place. A dashboard provides +insights into your data from multiple perspectives. + +[role="screenshot"] +image::images/intro-dashboard.png[] + +{kib} also offers these visualization features: + +* <> allows you to display your data in +line charts, bar graphs, pie charts, histograms, and tables +(just to name a few). It's also home to *Lens*, mentioned above. +*Visualize* supports the ability to add interactive +controls to your dashboard, and filter dashboard content in real time. + +* <> gives you the ability to present your data in a +visually compelling, pixel-perfect report. Give your data the “wow” factor +needed to impress your CEO or to captivate people with a big-screen display. + +* <> enables you to ask (and answer) meaningful +questions of your location-based data. *Elastic Maps* supports multiple +layers and data sources, mapping of individual geo points and shapes, +and dynamic client-side styling. + +* <> allows you to combine +an infinite number of aggregations to display complex data in a meaningful way. +With TSVB, you can analyze multiple index patterns and customize +every aspect of your visualization. Choose your own date format and color +gradients, and easily switch your data view between time series, metric, +top N, gauge, and markdown. + +[float] +[[organize-and-secure]] +=== Organize & secure + +Want to share Kibana’s goodness with other people or teams? You can do so with +<>, built for organizing your visualizations, dashboards, and indices. +Think of a space as its own mini {kib} installation — it’s isolated from +all other spaces, so you can tailor it to your specific needs without impacting others. + +You can even choose which features to enable within each space. Don’t need +Machine learning in your “Executive” space? Simply turn it off. + +[role="screenshot"] +image::images/intro-spaces.jpg[] + +You can take this all one step further with Kibana’s security features, and +control which users have access to each space. {kib} allows for fine-grained +controls, so you can give a user read-only access to +dashboards in one space, but full access to all of Kibana’s features in another. + +[float] +[[manage-all-things-stack]] +=== Manage all things Elastic Stack + +<> provides guided processes for managing all +things Elastic Stack — indices, clusters, licenses, UI settings, index patterns, +and more. Want to update your {es} indices? Set user roles and privileges? +Turn on dark mode? Kibana has UIs for all that. + +[role="screenshot"] +image::images/intro-management.png[] + +[float] +[[extend-your-use-case]] +=== Extend your use case — or add a new one + +As a hub for Elastic's https://www.elastic.co/products/[solutions], {kib} +can help you find security vulnerabilities, +monitor performance, and address your business needs. Get alerted if a key +metric spikes. Detect anomalous behavior or forecast future spikes. Root out +bottlenecks in your application code. Kibana doesn’t limit or dictate how you explore your data. + +[role="screenshot"] +image::siem/images/detections-ui.png[] + +[float] +[[try-kibana]] +=== Give {kib} a try + +There is no faster way to try out {kib} than with our hosted {es} Service. +https://www.elastic.co/cloud/elasticsearch-service/signup[Sign up for a free trial] +and start exploring data in minutes. + +You can also <> — no code, no additional +infrastructure required. + +Our <> and in-product guidance can +help you get up and running, faster. Use our Help menu if you have questions or feedback. From 87a3d02d44f77df8b3ac9a5b31a0b50bf261cfae Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Thu, 5 Mar 2020 10:18:12 -0700 Subject: [PATCH 03/25] Remove schemas from agg configs (#58462) --- src/legacy/core_plugins/data/public/index.ts | 3 - .../public/search/aggs/agg_config.test.ts | 3 +- .../data/public/search/aggs/agg_config.ts | 61 ++------------ .../public/search/aggs/agg_configs.test.ts | 82 +------------------ .../data/public/search/aggs/agg_configs.ts | 47 +---------- .../data/public/search/aggs/buckets/terms.ts | 16 +--- .../aggs/filter/agg_type_filters.test.ts | 14 ++-- .../search/aggs/filter/agg_type_filters.ts | 15 +++- .../data/public/search/aggs/index.ts | 1 - .../metrics/lib/parent_pipeline_agg_helper.ts | 18 +--- .../lib/sibling_pipeline_agg_helper.ts | 27 +----- .../search/aggs/metrics/metric_agg_type.ts | 4 +- .../aggs/metrics/parent_pipeline.test.ts | 9 -- .../aggs/metrics/sibling_pipeline.test.ts | 9 -- .../public/search/aggs/metrics/top_hit.ts | 7 +- .../public/search/aggs/param_types/agg.ts | 5 ++ .../search/aggs/param_types/field.test.ts | 41 ---------- .../public/search/aggs/param_types/field.ts | 13 +-- .../data/public/search/aggs/types.ts | 1 - .../core_plugins/data/public/search/mocks.ts | 1 - .../data/public/search/search_service.ts | 1 - .../public/search/tabify/get_columns.test.ts | 36 +------- .../search/tabify/response_writer.test.ts | 12 +-- .../data/public/search/tabify/tabify.test.ts | 12 +-- .../discover/np_ready/angular/discover.js | 2 +- .../tile_map/public/tile_map_type.js | 2 +- .../__snapshots__/agg.test.tsx.snap | 21 +++-- .../public/components/agg.test.tsx | 14 ++-- .../public/components/agg.tsx | 13 +-- .../public/components/agg_add.tsx | 5 +- .../public/components/agg_common_props.ts | 4 +- .../public/components/agg_group.test.tsx | 13 ++- .../public/components/agg_group.tsx | 17 ++-- .../components/agg_group_helper.test.ts | 44 ++++++++-- .../public/components/agg_group_helper.tsx | 21 +++-- .../public/components/agg_param_props.ts | 2 + .../public/components/agg_params.test.tsx | 1 + .../public/components/agg_params.tsx | 32 +++++--- .../components/agg_params_helper.test.ts | 38 +++++---- .../public/components/agg_params_helper.ts | 39 +++++++-- .../public/components/controls/field.test.tsx | 1 + .../public/components/controls/order_agg.tsx | 4 + .../components/controls/percentiles.test.tsx | 1 + .../components/controls/rows_or_columns.tsx | 11 ++- .../public/components/controls/sub_agg.tsx | 4 + .../public/components/controls/sub_metric.tsx | 4 + .../public/components/controls/test_utils.ts | 1 + .../public/components/sidebar/data_tab.tsx | 6 +- .../public/components/sidebar/sidebar.tsx | 8 +- .../components/sidebar/state/actions.ts | 10 ++- .../components/sidebar/state/reducers.ts | 29 ++++--- .../vis_default_editor/public/index.ts | 1 + .../public/legacy_imports.ts | 2 - .../public}/schemas.ts | 15 +++- .../public/vis_type_agg_filter.ts | 4 +- .../public/table_vis_controller.test.ts | 30 +++---- .../components/options/gauge/style_panel.tsx | 3 +- .../public/legacy/build_pipeline.test.ts | 4 +- .../np_ready/public/legacy/build_pipeline.ts | 7 +- .../public/np_ready/public/vis_impl.d.ts | 4 + .../public/np_ready/public/vis_impl.js | 25 ++++-- src/legacy/ui/public/agg_types/index.ts | 5 +- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 64 files changed, 357 insertions(+), 532 deletions(-) rename src/legacy/core_plugins/{data/public/search/aggs => vis_default_editor/public}/schemas.ts (84%) diff --git a/src/legacy/core_plugins/data/public/index.ts b/src/legacy/core_plugins/data/public/index.ts index ab3bc598bddd8..424e5ab0bf4d5 100644 --- a/src/legacy/core_plugins/data/public/index.ts +++ b/src/legacy/core_plugins/data/public/index.ts @@ -44,7 +44,6 @@ export { IFieldParamType, IMetricAggType, IpRangeKey, // only used in field formatter deserialization, which will live in data - ISchemas, OptionedParamEditorProps, // only type is used externally OptionedValueProp, // only type is used externally } from './search/types'; @@ -75,8 +74,6 @@ export { OptionedParamType, parentPipelineType, propFilter, - Schema, - Schemas, siblingPipelineType, termsAggFilter, toAbsoluteDates, diff --git a/src/legacy/core_plugins/data/public/search/aggs/agg_config.test.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_config.test.ts index 4913499403c00..36d5451a4cd00 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/agg_config.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_config.test.ts @@ -343,8 +343,7 @@ describe('AggConfig', () => { expect(typeof aggConfig.params).toBe('object'); expect(aggConfig.type).toBeInstanceOf(AggType); expect(aggConfig.type).toHaveProperty('name', 'date_histogram'); - expect(typeof aggConfig.schema).toBe('object'); - expect(aggConfig.schema).toHaveProperty('name', 'segment'); + expect(typeof aggConfig.schema).toBe('string'); const state = aggConfig.toJSON(); expect(state).toHaveProperty('id', '1'); diff --git a/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts index 1465731d5e82b..bf2d2f734c989 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_config.ts @@ -20,10 +20,8 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { IAggType } from './agg_type'; -import { AggGroupNames } from './agg_groups'; import { writeParams } from './agg_params'; import { IAggConfigs } from './agg_configs'; -import { Schema } from './schemas'; import { ISearchSource, FetchOptions, @@ -38,37 +36,9 @@ export interface AggConfigOptions { enabled?: boolean; id?: string; params?: Record; - schema?: string | Schema; + schema?: string; } -const unknownSchema: Schema = { - name: 'unknown', - title: 'Unknown', // only here for illustrative purposes - hideCustomLabel: true, - aggFilter: [], - min: 1, - max: 1, - params: [], - defaults: {}, - editor: false, - group: AggGroupNames.Metrics, - aggSettings: { - top_hits: { - allowStrings: true, - }, - }, -}; - -const getSchemaFromRegistry = (schemas: any, schema: string): Schema => { - let registeredSchema = schemas ? schemas.byName[schema] : null; - if (!registeredSchema) { - registeredSchema = Object.assign({}, unknownSchema); - registeredSchema.name = schema; - } - - return registeredSchema; -}; - /** * @name AggConfig * @@ -122,8 +92,8 @@ export class AggConfig { public params: any; public parent?: IAggConfigs; public brandNew?: boolean; + public schema?: string; - private __schema: Schema; private __type: IAggType; private __typeDecorations: any; private subAggs: AggConfig[] = []; @@ -141,14 +111,12 @@ export class AggConfig { this.setType(opts.type); if (opts.schema) { - this.setSchema(opts.schema); + this.schema = opts.schema; } // set the params to the values from opts, or just to the defaults this.setParams(opts.params || {}); - // @ts-ignore - this.__schema = this.__schema; // @ts-ignore this.__type = this.__type; } @@ -305,16 +273,13 @@ export class AggConfig { id: this.id, enabled: this.enabled, type: this.type && this.type.name, - schema: _.get(this, 'schema.name', this.schema), + schema: this.schema, params: outParams, }; } getAggParams() { - return [ - ...(_.has(this, 'type.params') ? this.type.params : []), - ...(_.has(this, 'schema.params') ? (this.schema as Schema).params : []), - ]; + return [...(_.has(this, 'type.params') ? this.type.params : [])]; } getRequestAggs() { @@ -434,9 +399,6 @@ export class AggConfig { // clear out the previous params except for a few special ones this.setParams({ - // split row/columns is "outside" of the agg, so don't reset it - row: this.params.row, - // almost every agg has fields, so we try to persist that when type changes field: availableFields.find((field: any) => field.name === this.getField()), }); @@ -445,17 +407,4 @@ export class AggConfig { public setType(type: IAggType) { this.type = type; } - - public get schema() { - return this.__schema; - } - - public set schema(schema) { - this.__schema = schema; - } - - public setSchema(schema: string | Schema) { - this.schema = - typeof schema === 'string' ? getSchemaFromRegistry(this.aggConfigs.schemas, schema) : schema; - } } diff --git a/src/legacy/core_plugins/data/public/search/aggs/agg_configs.test.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_configs.test.ts index 49eed55f0233d..d69376b4026d9 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/agg_configs.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_configs.test.ts @@ -21,8 +21,6 @@ import { indexBy } from 'lodash'; import { AggConfig } from './agg_config'; import { AggConfigs } from './agg_configs'; import { AggTypesRegistryStart } from './agg_types_registry'; -import { Schemas } from './schemas'; -import { AggGroupNames } from './agg_groups'; import { mockDataServices, mockAggTypesRegistry } from './test_helpers'; import { IndexPatternField, IndexPattern } from '../../../../../../plugins/data/public'; import { @@ -81,67 +79,6 @@ describe('AggConfigs', () => { expect(spy.mock.calls[0]).toEqual([configStates]); spy.mockRestore(); }); - - describe('defaults', () => { - const schemas = new Schemas([ - { - group: AggGroupNames.Metrics, - name: 'metric', - title: 'Simple', - min: 1, - max: 2, - defaults: [ - { schema: 'metric', type: 'count' }, - { schema: 'metric', type: 'avg' }, - { schema: 'metric', type: 'sum' }, - ], - }, - { - group: AggGroupNames.Buckets, - name: 'segment', - title: 'Example', - min: 0, - max: 1, - defaults: [ - { schema: 'segment', type: 'terms' }, - { schema: 'segment', type: 'filters' }, - ], - }, - ]); - - it('should only set the number of defaults defined by the max', () => { - const ac = new AggConfigs(indexPattern, [], { - schemas: schemas.all, - typesRegistry, - }); - expect(ac.bySchemaName('metric')).toHaveLength(2); - }); - - it('should set the defaults defined in the schema when none exist', () => { - const ac = new AggConfigs(indexPattern, [], { - schemas: schemas.all, - typesRegistry, - }); - expect(ac.aggs).toHaveLength(3); - }); - - it('should NOT set the defaults defined in the schema when some exist', () => { - const configStates = [ - { - enabled: true, - type: 'date_histogram', - params: {}, - schema: 'segment', - }, - ]; - const ac = new AggConfigs(indexPattern, configStates, { - schemas: schemas.all, - typesRegistry, - }); - expect(ac.aggs).toHaveLength(3); - expect(ac.bySchemaName('segment')[0].type.name).toEqual('date_histogram'); - }); - }); }); describe('#createAggConfig', () => { @@ -285,17 +222,6 @@ describe('AggConfigs', () => { }); describe('#toDsl', () => { - const schemas = new Schemas([ - { - group: AggGroupNames.Buckets, - name: 'segment', - }, - { - group: AggGroupNames.Buckets, - name: 'split', - }, - ]); - beforeEach(() => { indexPattern = stubIndexPattern as IndexPattern; indexPattern.fields.getByName = name => (name as unknown) as IndexPatternField; @@ -319,7 +245,6 @@ describe('AggConfigs', () => { const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, - schemas: schemas.all, }); const aggInfos = ac.aggs.map(aggConfig => { @@ -390,11 +315,10 @@ describe('AggConfigs', () => { const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, - schemas: schemas.all, }); const dsl = ac.toDsl(); const histo = ac.byName('date_histogram')[0]; - const metrics = ac.bySchemaGroup('metrics'); + const metrics = ac.bySchemaName('metrics'); expect(dsl).toHaveProperty(histo.id); expect(typeof dsl[histo.id]).toBe('object'); @@ -418,8 +342,8 @@ describe('AggConfigs', () => { const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); const topLevelDsl = ac.toDsl(true); - const buckets = ac.bySchemaGroup('buckets'); - const metrics = ac.bySchemaGroup('metrics'); + const buckets = ac.bySchemaName('buckets'); + const metrics = ac.bySchemaName('metrics'); (function checkLevel(dsl) { const bucket = buckets.shift(); diff --git a/src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts b/src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts index ab70e66b1e138..4a48f356d3f79 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/agg_configs.ts @@ -23,7 +23,6 @@ import { Assign } from '@kbn/utility-types'; import { AggConfig, AggConfigOptions, IAggConfig } from './agg_config'; import { IAggType } from './agg_type'; import { AggTypesRegistryStart } from './agg_types_registry'; -import { Schema } from './schemas'; import { AggGroupNames } from './agg_groups'; import { IndexPattern, @@ -32,8 +31,6 @@ import { TimeRange, } from '../../../../../../plugins/data/public'; -type Schemas = Record; - function removeParentAggs(obj: any) { for (const prop in obj) { if (prop === 'parentAggs') delete obj[prop]; @@ -51,7 +48,6 @@ function parseParentAggs(dslLvlCursor: any, dsl: any) { } export interface AggConfigsOptions { - schemas?: Schemas; typesRegistry: AggTypesRegistryStart; } @@ -73,7 +69,6 @@ export type IAggConfigs = AggConfigs; export class AggConfigs { public indexPattern: IndexPattern; - public schemas: any; public timeRange?: TimeRange; private readonly typesRegistry: AggTypesRegistryStart; @@ -90,37 +85,8 @@ export class AggConfigs { this.aggs = []; this.indexPattern = indexPattern; - this.schemas = opts.schemas; configStates.forEach((params: any) => this.createAggConfig(params)); - - if (this.schemas) { - this.initializeDefaultsFromSchemas(this.schemas); - } - } - - // do this wherever the schemas were passed in, & pass in state defaults instead - initializeDefaultsFromSchemas(schemas: Schemas) { - // Set the defaults for any schema which has them. If the defaults - // for some reason has more then the max only set the max number - // of defaults (not sure why a someone define more... - // but whatever). Also if a schema.name is already set then don't - // set anything. - _(schemas) - .filter((schema: Schema) => { - return Array.isArray(schema.defaults) && schema.defaults.length > 0; - }) - .each((schema: any) => { - if (!this.aggs.find((agg: AggConfig) => agg.schema && agg.schema.name === schema.name)) { - // the result here should be passable as a configState - const defaults = schema.defaults.slice(0, schema.max); - _.each(defaults, defaultState => { - const state = _.defaults({ id: AggConfig.nextId(this.aggs) }, defaultState); - this.createAggConfig(state as AggConfigOptions); - }); - } - }) - .commit(); } setTimeRange(timeRange: TimeRange) { @@ -148,7 +114,6 @@ export class AggConfigs { }; const aggConfigs = new AggConfigs(this.indexPattern, this.aggs.filter(filterAggs), { - schemas: this.schemas, typesRegistry: this.typesRegistry, }); @@ -271,23 +236,19 @@ export class AggConfigs { } byName(name: string) { - return this.aggs.filter(agg => agg.type.name === name); + return this.aggs.filter(agg => agg.type?.name === name); } byType(type: string) { - return this.aggs.filter(agg => agg.type.type === type); + return this.aggs.filter(agg => agg.type?.type === type); } byTypeName(type: string) { - return this.aggs.filter(agg => agg.type.name === type); + return this.byName(type); } bySchemaName(schema: string) { - return this.aggs.filter(agg => agg.schema && agg.schema.name === schema); - } - - bySchemaGroup(group: string) { - return this.aggs.filter(agg => agg.schema && agg.schema.group === group); + return this.aggs.filter(agg => agg.schema === schema); } getRequestAggs(): AggConfig[] { diff --git a/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts b/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts index 8fd95c86d8476..b387e9b7d306a 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/buckets/terms.ts @@ -40,8 +40,6 @@ import { mergeOtherBucketAggResponse, updateMissingBucket, } from './_terms_other_bucket_helper'; -import { Schemas } from '../schemas'; -import { AggGroupNames } from '../agg_groups'; export const termsAggFilter = [ '!top_hits', @@ -58,17 +56,6 @@ export const termsAggFilter = [ '!sum_bucket', ]; -const [orderAggSchema] = new Schemas([ - { - group: AggGroupNames.None, - name: 'orderAgg', - // This string is never visible to the user so it doesn't need to be translated - title: 'Order Agg', - hideCustomLabel: true, - aggFilter: termsAggFilter, - }, -]).all; - const termsTitle = i18n.translate('data.search.aggs.buckets.termsTitle', { defaultMessage: 'Terms', }); @@ -158,10 +145,11 @@ export const termsBucketAgg = new BucketAggType({ { name: 'orderAgg', type: 'agg', + allowedAggs: termsAggFilter, default: null, makeAgg(termsAgg, state) { state = state || {}; - state.schema = orderAggSchema; + state.schema = 'orderAgg'; const orderAgg = termsAgg.aggConfigs.createAggConfig(state, { addToAggConfigs: false, }); diff --git a/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts index 0de1c31d02f96..90c29675c0db2 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.test.ts @@ -32,7 +32,7 @@ describe('AggTypeFilters', () => { it('should filter nothing without registered filters', async () => { const aggTypes = [{ name: 'count' }, { name: 'sum' }] as IAggType[]; - const filtered = registry.filter(aggTypes, indexPattern, aggConfig); + const filtered = registry.filter(aggTypes, indexPattern, aggConfig, []); expect(filtered).toEqual(aggTypes); }); @@ -40,23 +40,23 @@ describe('AggTypeFilters', () => { const aggTypes = [{ name: 'count' }, { name: 'sum' }] as IAggType[]; const filter = jest.fn(); registry.addFilter(filter); - registry.filter(aggTypes, indexPattern, aggConfig); - expect(filter).toHaveBeenCalledWith(aggTypes[0], indexPattern, aggConfig); - expect(filter).toHaveBeenCalledWith(aggTypes[1], indexPattern, aggConfig); + registry.filter(aggTypes, indexPattern, aggConfig, []); + expect(filter).toHaveBeenCalledWith(aggTypes[0], indexPattern, aggConfig, []); + expect(filter).toHaveBeenCalledWith(aggTypes[1], indexPattern, aggConfig, []); }); it('should allow registered filters to filter out aggTypes', async () => { const aggTypes = [{ name: 'count' }, { name: 'sum' }, { name: 'avg' }] as IAggType[]; - let filtered = registry.filter(aggTypes, indexPattern, aggConfig); + let filtered = registry.filter(aggTypes, indexPattern, aggConfig, []); expect(filtered).toEqual(aggTypes); registry.addFilter(() => true); registry.addFilter(aggType => aggType.name !== 'count'); - filtered = registry.filter(aggTypes, indexPattern, aggConfig); + filtered = registry.filter(aggTypes, indexPattern, aggConfig, []); expect(filtered).toEqual([aggTypes[1], aggTypes[2]]); registry.addFilter(aggType => aggType.name !== 'avg'); - filtered = registry.filter(aggTypes, indexPattern, aggConfig); + filtered = registry.filter(aggTypes, indexPattern, aggConfig, []); expect(filtered).toEqual([aggTypes[1]]); }); }); diff --git a/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts index 13a4cc0856b09..8da547e592af9 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/filter/agg_type_filters.ts @@ -23,7 +23,8 @@ import { IAggConfig, IAggType } from '../types'; type AggTypeFilter = ( aggType: IAggType, indexPattern: IndexPattern, - aggConfig: IAggConfig + aggConfig: IAggConfig, + aggFilter: string[] ) => boolean; /** @@ -48,12 +49,20 @@ class AggTypeFilters { * @param aggTypes A list of aggTypes that will be filtered down by this registry. * @param indexPattern The indexPattern for which this list should be filtered down. * @param aggConfig The aggConfig for which the returning list will be used. + * @param schema * @return A filtered list of the passed aggTypes. */ - public filter(aggTypes: IAggType[], indexPattern: IndexPattern, aggConfig: IAggConfig) { + public filter( + aggTypes: IAggType[], + indexPattern: IndexPattern, + aggConfig: IAggConfig, + aggFilter: string[] + ) { const allFilters = Array.from(this.filters); const allowedAggTypes = aggTypes.filter(aggType => { - const isAggTypeAllowed = allFilters.every(filter => filter(aggType, indexPattern, aggConfig)); + const isAggTypeAllowed = allFilters.every(filter => + filter(aggType, indexPattern, aggConfig, aggFilter) + ); return isAggTypeAllowed; }); return allowedAggTypes; diff --git a/src/legacy/core_plugins/data/public/search/aggs/index.ts b/src/legacy/core_plugins/data/public/search/aggs/index.ts index be44e04a0129b..8d6fbeacd606a 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/index.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/index.ts @@ -56,7 +56,6 @@ export { OptionedParamType } from './param_types/optioned'; export { isValidJson, isValidInterval } from './utils'; export { BUCKET_TYPES } from './buckets/bucket_agg_types'; export { METRIC_TYPES } from './metrics/metric_agg_types'; -export { ISchemas, Schema, Schemas } from './schemas'; // types export { CreateAggConfigParams, IAggConfig, IAggConfigs } from './types'; diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts index 88549ee3019ee..df4cbaf49c8b3 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts @@ -23,7 +23,7 @@ import { noop, identity } from 'lodash'; import { forwardModifyAggConfigOnSearchRequestStart } from './nested_agg_helpers'; import { IMetricAggConfig, MetricAggParam } from '../metric_agg_type'; import { parentPipelineAggWriter } from './parent_pipeline_agg_writer'; -import { Schemas } from '../../schemas'; + import { fieldFormats } from '../../../../../../../../plugins/data/public'; const metricAggFilter = [ @@ -36,20 +36,6 @@ const metricAggFilter = [ '!geo_centroid', ]; -const metricAggTitle = i18n.translate('data.search.aggs.metrics.metricAggTitle', { - defaultMessage: 'Metric agg', -}); - -const [metricAggSchema] = new Schemas([ - { - group: 'none', - name: 'metricAgg', - title: metricAggTitle, - hideCustomLabel: true, - aggFilter: metricAggFilter, - }, -]).all; - const parentPipelineType = i18n.translate( 'data.search.aggs.metrics.parentPipelineAggregationsSubtypeTitle', { @@ -69,9 +55,9 @@ const parentPipelineAggHelper = { { name: 'customMetric', type: 'agg', + allowedAggs: metricAggFilter, makeAgg(termsAgg, state: any) { state = state || { type: 'count' }; - state.schema = metricAggSchema; const metricAgg = termsAgg.aggConfigs.createAggConfig(state, { addToAggConfigs: false }); diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts index 05e009cc9da30..33d6d72540868 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts @@ -22,7 +22,6 @@ import { i18n } from '@kbn/i18n'; import { siblingPipelineAggWriter } from './sibling_pipeline_agg_writer'; import { forwardModifyAggConfigOnSearchRequestStart } from './nested_agg_helpers'; import { IMetricAggConfig, MetricAggParam } from '../metric_agg_type'; -import { Schemas } from '../../schemas'; import { fieldFormats } from '../../../../../../../../plugins/data/public'; const metricAggFilter: string[] = [ @@ -44,28 +43,6 @@ const metricAggFilter: string[] = [ ]; const bucketAggFilter: string[] = []; -const [metricAggSchema] = new Schemas([ - { - group: 'none', - name: 'metricAgg', - title: i18n.translate('data.search.aggs.metrics.metricAggTitle', { - defaultMessage: 'Metric agg', - }), - aggFilter: metricAggFilter, - }, -]).all; - -const [bucketAggSchema] = new Schemas([ - { - group: 'none', - title: i18n.translate('data.search.aggs.metrics.bucketAggTitle', { - defaultMessage: 'Bucket agg', - }), - name: 'bucketAgg', - aggFilter: bucketAggFilter, - }, -]).all; - const siblingPipelineType = i18n.translate( 'data.search.aggs.metrics.siblingPipelineAggregationsSubtypeTitle', { @@ -80,10 +57,10 @@ const siblingPipelineAggHelper = { { name: 'customBucket', type: 'agg', + allowedAggs: bucketAggFilter, default: null, makeAgg(agg: IMetricAggConfig, state: any) { state = state || { type: 'date_histogram' }; - state.schema = bucketAggSchema; const orderAgg = agg.aggConfigs.createAggConfig(state, { addToAggConfigs: false }); orderAgg.id = agg.id + '-bucket'; @@ -97,10 +74,10 @@ const siblingPipelineAggHelper = { { name: 'customMetric', type: 'agg', + allowedAggs: metricAggFilter, default: null, makeAgg(agg: IMetricAggConfig, state: any) { state = state || { type: 'count' }; - state.schema = metricAggSchema; const orderAgg = agg.aggConfigs.createAggConfig(state, { addToAggConfigs: false }); orderAgg.id = agg.id + '-metric'; diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts index 952dcc96de833..82b042a1e3378 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/metric_agg_type.ts @@ -21,11 +21,11 @@ import { i18n } from '@kbn/i18n'; import { AggType, AggTypeConfig } from '../agg_type'; import { AggParamType } from '../param_types/agg'; import { AggConfig } from '../agg_config'; -import { FilterFieldTypes } from '../param_types/field'; import { METRIC_TYPES } from './metric_agg_types'; import { KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { getFieldFormats } from '../../../../../../../plugins/data/public/services'; +import { FieldTypes } from '../param_types'; export interface IMetricAggConfig extends AggConfig { type: InstanceType; @@ -33,7 +33,7 @@ export interface IMetricAggConfig extends AggConfig { export interface MetricAggParam extends AggParamType { - filterFieldTypes?: FilterFieldTypes; + filterFieldTypes?: FieldTypes; onlyAggregatable?: boolean; } diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts index 58b4ee530a8c2..02e63f653f94f 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts @@ -25,15 +25,6 @@ import { AggConfigs } from '../agg_configs'; import { mockDataServices, mockAggTypesRegistry } from '../test_helpers'; import { IMetricAggConfig, MetricAggType } from './metric_agg_type'; -jest.mock('../schemas', () => { - class MockedSchemas { - all = [{}]; - } - return { - Schemas: jest.fn().mockImplementation(() => new MockedSchemas()), - }; -}); - describe('parent pipeline aggs', function() { beforeEach(() => { mockDataServices(); diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts index d3456bacceb6a..8389ed8262ce5 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts @@ -26,15 +26,6 @@ import { AggConfigs } from '../agg_configs'; import { IMetricAggConfig, MetricAggType } from './metric_agg_type'; import { mockDataServices, mockAggTypesRegistry } from '../test_helpers'; -jest.mock('../schemas', () => { - class MockedSchemas { - all = [{}]; - } - return { - Schemas: jest.fn().mockImplementation(() => new MockedSchemas()), - }; -}); - describe('sibling pipeline aggs', () => { beforeEach(() => { mockDataServices(); diff --git a/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts index 3112d882bb87e..c850eb4ff2220 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/metrics/top_hit.ts @@ -63,10 +63,7 @@ export const topHitMetricAgg = new MetricAggType({ name: 'field', type: 'field', onlyAggregatable: false, - filterFieldTypes: (aggConfig: IMetricAggConfig) => - _.get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) - ? '*' - : KBN_FIELD_TYPES.NUMBER, + filterFieldTypes: '*', write(agg, output) { const field = agg.getParam('field'); output.params = {}; @@ -133,7 +130,7 @@ export const topHitMetricAgg = new MetricAggType({ defaultMessage: 'Concatenate', }), isCompatible(aggConfig: IMetricAggConfig) { - return _.get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false); + return _.get(aggConfig.params, 'field.filterFieldTypes', '*') === '*'; }, disabled: true, value: 'concat', diff --git a/src/legacy/core_plugins/data/public/search/aggs/param_types/agg.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/agg.ts index d31abe64491d0..e5b53020c3159 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/param_types/agg.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/agg.ts @@ -24,10 +24,15 @@ export class AggParamType extends Ba TAggConfig > { makeAgg: (agg: TAggConfig, state?: any) => TAggConfig; + allowedAggs: string[] = []; constructor(config: Record) { super(config); + if (config.allowedAggs) { + this.allowedAggs = config.allowedAggs; + } + if (!config.write) { this.write = (aggConfig: TAggConfig, output: Record) => { if (aggConfig.params[this.name] && aggConfig.params[this.name].length) { diff --git a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts index 7338c41f920d7..18b666f454664 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.test.ts @@ -17,13 +17,10 @@ * under the License. */ -import { get } from 'lodash'; import { BaseParamType } from './base'; import { FieldParamType } from './field'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../../../../../../../plugins/data/public'; import { IAggConfig } from '../agg_config'; -import { IMetricAggConfig } from '../metrics/metric_agg_type'; -import { Schema } from '../schemas'; describe('Field', () => { const indexPattern = { @@ -105,43 +102,5 @@ describe('Field', () => { expect(fields.length).toBe(2); }); - - it('should return only numeric fields if filterFieldTypes was specified as a function', () => { - const aggParam = new FieldParamType({ - name: 'field', - type: 'field', - filterFieldTypes: (aggConfig: IMetricAggConfig) => - get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) - ? '*' - : KBN_FIELD_TYPES.NUMBER, - }); - const fields = aggParam.getAvailableFields(agg); - - expect(fields.length).toBe(1); - expect(fields[0].type).toBe(KBN_FIELD_TYPES.NUMBER); - }); - - it('should return all fields if filterFieldTypes was specified as a function and aggSettings allow string type fields', () => { - const aggParam = new FieldParamType({ - name: 'field', - type: 'field', - filterFieldTypes: (aggConfig: IMetricAggConfig) => - get(aggConfig.schema, 'aggSettings.top_hits.allowStrings', false) - ? '*' - : KBN_FIELD_TYPES.NUMBER, - }); - - agg.schema = { - aggSettings: { - top_hits: { - allowStrings: true, - }, - }, - } as Schema; - - const fields = aggParam.getAvailableFields(agg); - - expect(fields.length).toBe(2); - }); }); }); diff --git a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts index bb5707cbb482e..6882b8aa39e7e 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/param_types/field.ts @@ -18,12 +18,10 @@ */ import { i18n } from '@kbn/i18n'; -import { isFunction } from 'lodash'; import { IAggConfig } from '../agg_config'; import { SavedObjectNotFound } from '../../../../../../../plugins/kibana_utils/public'; import { BaseParamType } from './base'; import { propFilter } from '../filter'; -import { IMetricAggConfig } from '../metrics/metric_agg_type'; import { IndexPatternField, indexPatterns, @@ -34,15 +32,14 @@ import { getNotifications } from '../../../../../../../plugins/data/public/servi const filterByType = propFilter('type'); -type FieldTypes = KBN_FIELD_TYPES | KBN_FIELD_TYPES[] | '*'; -export type FilterFieldTypes = ((aggConfig: IMetricAggConfig) => FieldTypes) | FieldTypes; +export type FieldTypes = KBN_FIELD_TYPES | KBN_FIELD_TYPES[] | '*'; // TODO need to make a more explicit interface for this export type IFieldParamType = FieldParamType; export class FieldParamType extends BaseParamType { required = true; scriptable = true; - filterFieldTypes: FilterFieldTypes; + filterFieldTypes: FieldTypes; onlyAggregatable: boolean; constructor(config: Record) { @@ -127,12 +124,6 @@ export class FieldParamType extends BaseParamType { return false; } - if (isFunction(filterFieldTypes)) { - const filter = filterFieldTypes(aggConfig as IMetricAggConfig); - - return filterByType([field], filter).length !== 0; - } - return filterByType([field], filterFieldTypes).length !== 0; }); diff --git a/src/legacy/core_plugins/data/public/search/aggs/types.ts b/src/legacy/core_plugins/data/public/search/aggs/types.ts index 5d02f426b5896..069a933fd994a 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/types.ts +++ b/src/legacy/core_plugins/data/public/search/aggs/types.ts @@ -26,4 +26,3 @@ export { IMetricAggType } from './metrics/metric_agg_type'; export { DateRangeKey } from './buckets/date_range'; export { IpRangeKey } from './buckets/ip_range'; export { OptionedValueProp, OptionedParamEditorProps } from './param_types/optioned'; -export { ISchemas } from './schemas'; diff --git a/src/legacy/core_plugins/data/public/search/mocks.ts b/src/legacy/core_plugins/data/public/search/mocks.ts index 5629f597edff4..46c26dc8f1bd0 100644 --- a/src/legacy/core_plugins/data/public/search/mocks.ts +++ b/src/legacy/core_plugins/data/public/search/mocks.ts @@ -71,7 +71,6 @@ export const searchStartMock = (): SearchStart => ({ calculateAutoTimeExpression: getCalculateAutoTimeExpression(coreMock.createStart().uiSettings), createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { - schemas, typesRegistry: mockAggTypesRegistry(), }); }), diff --git a/src/legacy/core_plugins/data/public/search/search_service.ts b/src/legacy/core_plugins/data/public/search/search_service.ts index a38cc98c837ce..2d01ac446d951 100644 --- a/src/legacy/core_plugins/data/public/search/search_service.ts +++ b/src/legacy/core_plugins/data/public/search/search_service.ts @@ -99,7 +99,6 @@ export class SearchService { calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), createAggConfigs: (indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { - schemas, typesRegistry: aggTypesStart, }); }, diff --git a/src/legacy/core_plugins/data/public/search/tabify/get_columns.test.ts b/src/legacy/core_plugins/data/public/search/tabify/get_columns.test.ts index 6c5dc790ef976..b7dadc3f65d82 100644 --- a/src/legacy/core_plugins/data/public/search/tabify/get_columns.test.ts +++ b/src/legacy/core_plugins/data/public/search/tabify/get_columns.test.ts @@ -19,7 +19,7 @@ import { tabifyGetColumns } from './get_columns'; import { TabbedAggColumn } from './types'; -import { AggConfigs, AggGroupNames, Schemas } from '../aggs'; +import { AggConfigs } from '../aggs'; import { mockAggTypesRegistry, mockDataServices } from '../aggs/test_helpers'; describe('get columns', () => { @@ -45,26 +45,10 @@ describe('get columns', () => { return new AggConfigs(indexPattern, aggs, { typesRegistry, - schemas: new Schemas([ - { - group: AggGroupNames.Metrics, - name: 'metric', - min: 1, - defaults: [{ schema: 'metric', type: 'count' }], - }, - ]).all, }); }; - test('should inject a count metric if no aggs exist', () => { - const columns = tabifyGetColumns(createAggConfigs().aggs, true); - - expect(columns).toHaveLength(1); - expect(columns[0]).toHaveProperty('aggConfig'); - expect(columns[0].aggConfig.type).toHaveProperty('name', 'count'); - }); - - test('should inject a count metric if only buckets exist', () => { + test('should inject the metric after each bucket if the vis is hierarchical', () => { const columns = tabifyGetColumns( createAggConfigs([ { @@ -72,18 +56,6 @@ describe('get columns', () => { schema: 'segment', params: { field: '@timestamp', interval: '10s' }, }, - ]).aggs, - true - ); - - expect(columns).toHaveLength(2); - expect(columns[1]).toHaveProperty('aggConfig'); - expect(columns[1].aggConfig.type).toHaveProperty('name', 'count'); - }); - - test('should inject the metric after each bucket if the vis is hierarchical', () => { - const columns = tabifyGetColumns( - createAggConfigs([ { type: 'date_histogram', schema: 'segment', @@ -100,9 +72,7 @@ describe('get columns', () => { params: { field: '@timestamp', interval: '10s' }, }, { - type: 'date_histogram', - schema: 'segment', - params: { field: '@timestamp', interval: '10s' }, + type: 'count', }, ]).aggs, false diff --git a/src/legacy/core_plugins/data/public/search/tabify/response_writer.test.ts b/src/legacy/core_plugins/data/public/search/tabify/response_writer.test.ts index 94301eedac74a..91835bc948abb 100644 --- a/src/legacy/core_plugins/data/public/search/tabify/response_writer.test.ts +++ b/src/legacy/core_plugins/data/public/search/tabify/response_writer.test.ts @@ -18,7 +18,7 @@ */ import { TabbedAggResponseWriter } from './response_writer'; -import { AggConfigs, AggGroupNames, Schemas, BUCKET_TYPES } from '../aggs'; +import { AggConfigs, BUCKET_TYPES } from '../aggs'; import { mockDataServices, mockAggTypesRegistry } from '../aggs/test_helpers'; import { TabbedResponseWriterOptions } from './types'; @@ -39,6 +39,7 @@ describe('TabbedAggResponseWriter class', () => { field: 'geo.src', }, }, + { type: 'count' }, ]; const twoSplitsAggConfig = [ @@ -54,6 +55,7 @@ describe('TabbedAggResponseWriter class', () => { field: 'machine.os.raw', }, }, + { type: 'count' }, ]; const createResponseWritter = (aggs: any[] = [], opts?: Partial) => { @@ -73,14 +75,6 @@ describe('TabbedAggResponseWriter class', () => { return new TabbedAggResponseWriter( new AggConfigs(indexPattern, aggs, { typesRegistry, - schemas: new Schemas([ - { - group: AggGroupNames.Metrics, - name: 'metric', - min: 1, - defaults: [{ schema: 'metric', type: 'count' }], - }, - ]).all, }), { metricsAtAllLevels: false, diff --git a/src/legacy/core_plugins/data/public/search/tabify/tabify.test.ts b/src/legacy/core_plugins/data/public/search/tabify/tabify.test.ts index db4ad3bdea96b..7e7748c00ab43 100644 --- a/src/legacy/core_plugins/data/public/search/tabify/tabify.test.ts +++ b/src/legacy/core_plugins/data/public/search/tabify/tabify.test.ts @@ -19,7 +19,7 @@ import { IndexPattern } from '../../../../../../plugins/data/public'; import { tabifyAggResponse } from './tabify'; -import { IAggConfig, IAggConfigs, AggGroupNames, Schemas, AggConfigs } from '../aggs'; +import { IAggConfig, IAggConfigs, AggConfigs } from '../aggs'; import { mockAggTypesRegistry } from '../aggs/test_helpers'; import { metricOnly, threeTermBuckets } from 'fixtures/fake_hierarchical_data'; @@ -42,21 +42,13 @@ describe('tabifyAggResponse Integration', () => { return new AggConfigs(indexPattern, aggs, { typesRegistry, - schemas: new Schemas([ - { - group: AggGroupNames.Metrics, - name: 'metric', - min: 1, - defaults: [{ schema: 'metric', type: 'count' }], - }, - ]).all, }); }; const mockAggConfig = (agg: any): IAggConfig => (agg as unknown) as IAggConfig; test('transforms a simple response properly', () => { - const aggConfigs = createAggConfigs(); + const aggConfigs = createAggConfigs([{ type: 'count' } as any]); const resp = tabifyAggResponse(aggConfigs, metricOnly, { metricsAtAllLevels: true, diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js index 58da4f8eeddc3..fb4158a6e3e03 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js @@ -643,7 +643,7 @@ function discoverController( // no timefield, no vis, nothing to update if (!$scope.opts.timefield) return; - const buckets = $scope.vis.getAggConfig().bySchemaGroup('buckets'); + const buckets = $scope.vis.getAggConfig().byTypeName('buckets'); if (buckets && buckets.length === 1) { $scope.bucketInterval = buckets[0].buckets.getInterval(); diff --git a/src/legacy/core_plugins/tile_map/public/tile_map_type.js b/src/legacy/core_plugins/tile_map/public/tile_map_type.js index 80cec5b93f485..544b63abe82c7 100644 --- a/src/legacy/core_plugins/tile_map/public/tile_map_type.js +++ b/src/legacy/core_plugins/tile_map/public/tile_map_type.js @@ -137,7 +137,7 @@ export function createTileMapTypeDefinition(dependencies) { title: i18n.translate('tileMap.vis.map.editorConfig.schemas.geoCoordinatesTitle', { defaultMessage: 'Geo coordinates', }), - aggFilter: 'geohash_grid', + aggFilter: ['geohash_grid'], min: 1, max: 1, }, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/__snapshots__/agg.test.tsx.snap b/src/legacy/core_plugins/vis_default_editor/public/components/__snapshots__/agg.test.tsx.snap index aed0285fd3405..ba5f2ae975cbe 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/__snapshots__/agg.test.tsx.snap +++ b/src/legacy/core_plugins/vis_default_editor/public/components/__snapshots__/agg.test.tsx.snap @@ -2,11 +2,11 @@ exports[`DefaultEditorAgg component should init with the default set of props 1`] = ` - Schema name + metric } @@ -45,9 +45,7 @@ exports[`DefaultEditorAgg component should init with the default set of props 1` "getIndexPattern": [Function], "id": "1", "params": Object {}, - "schema": Object { - "title": "Schema name", - }, + "schema": "metric", "title": "Metrics", } } @@ -58,10 +56,21 @@ exports[`DefaultEditorAgg component should init with the default set of props 1` indexPattern={Object {}} metricAggs={Array []} onAggTypeChange={[Function]} + schemas={ + Array [ + Object { + "name": "metric", + }, + ] + } setAggParamValue={[MockFunction]} setTouched={[Function]} setValidity={[Function]} - state={Object {}} + state={ + Object { + "params": Object {}, + } + } /> `; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx index f5ce55e82967d..22e0ebb3d30dc 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg.test.tsx @@ -28,6 +28,7 @@ import { IAggType, AggGroupNames } from '../legacy_imports'; import { DefaultEditorAgg, DefaultEditorAggProps } from './agg'; import { DefaultEditorAggParams } from './agg_params'; import { AGGS_ACTION_KEYS } from './agg_group_state'; +import { Schema } from '../schemas'; jest.mock('ui/new_platform'); @@ -55,7 +56,7 @@ describe('DefaultEditorAgg component', () => { id: '1', brandNew: true, getIndexPattern: () => ({} as IndexPattern), - schema: { title: 'Schema name' }, + schema: 'metric', title: 'Metrics', params: {}, } as any, @@ -69,13 +70,18 @@ describe('DefaultEditorAgg component', () => { isLastBucket: false, isRemovable: false, metricAggs: [], - state: {} as VisState, + state: { params: {} } as VisState, setAggParamValue, setStateParamValue, onAggTypeChange: () => {}, setAggsState, onToggleEnableAgg, removeAgg, + schemas: [ + { + name: 'metric', + } as Schema, + ], }; }); @@ -175,9 +181,7 @@ describe('DefaultEditorAgg component', () => { }); it('should add schema component', () => { - defaultProps.agg.schema = { - name: 'split', - } as any; + defaultProps.agg.schema = 'split'; const comp = mount(); expect(comp.find('RowsOrColumnsControl').exists()).toBeTruthy(); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx index 5450c29450bac..30ccd4f0b6cae 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg.tsx @@ -34,6 +34,7 @@ import { DefaultEditorAggCommonProps } from './agg_common_props'; import { AGGS_ACTION_KEYS, AggsAction } from './agg_group_state'; import { RowsOrColumnsControl } from './controls/rows_or_columns'; import { RadiusRatioOptionControl } from './controls/radius_ratio_option'; +import { getSchemaByName } from '../schemas'; export interface DefaultEditorAggProps extends DefaultEditorAggCommonProps { agg: IAggConfig; @@ -67,6 +68,7 @@ function DefaultEditorAgg({ onToggleEnableAgg, removeAgg, setAggsState, + schemas, }: DefaultEditorAggProps) { const [isEditorOpen, setIsEditorOpen] = useState((agg as any).brandNew); const [validState, setValidState] = useState(true); @@ -80,11 +82,11 @@ function DefaultEditorAgg({ let SchemaComponent; - if (agg.schema.name === 'split') { + if (agg.schema === 'split') { SchemaComponent = RowsOrColumnsControl; } - if (agg.schema.name === 'radius') { + if (agg.schema === 'radius') { SchemaComponent = RadiusRatioOptionControl; } @@ -255,10 +257,10 @@ function DefaultEditorAgg({ ); }; - + const schemaTitle = getSchemaByName(schemas, agg.schema).title; const buttonContent = ( <> - {agg.schema.title} {showDescription && {aggDescription}} + {schemaTitle || agg.schema} {showDescription && {aggDescription}} ); @@ -272,7 +274,7 @@ function DefaultEditorAgg({ className="visEditorSidebar__section visEditorSidebar__collapsible visEditorSidebar__collapsible--marginBottom" aria-label={i18n.translate('visDefaultEditor.agg.toggleEditorButtonAriaLabel', { defaultMessage: 'Toggle {schema} editor', - values: { schema: agg.schema.title }, + values: { schema: schemaTitle || agg.schema }, })} data-test-subj={`visEditorAggAccordion${agg.id}`} extraAction={renderAggButtons()} @@ -303,6 +305,7 @@ function DefaultEditorAgg({ onAggTypeChange={onAggTypeChange} setTouched={setTouched} setValidity={setValidity} + schemas={schemas} /> diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx index d8df5b315fca0..24cb83498d4d0 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_add.tsx @@ -29,7 +29,8 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { IAggConfig, AggGroupNames, Schema } from '../legacy_imports'; +import { IAggConfig, AggGroupNames } from '../legacy_imports'; +import { Schema } from '../schemas'; interface DefaultEditorAggAddProps { group?: IAggConfig[]; @@ -72,7 +73,7 @@ function DefaultEditorAggAdd({ : i18n.translate('visDefaultEditor.aggAdd.metricLabel', { defaultMessage: 'metric' }); const isSchemaDisabled = (schema: Schema): boolean => { - const count = group.filter(agg => agg.schema.name === schema.name).length; + const count = group.filter(agg => agg.schema === schema.name).length; return count >= schema.max; }; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts index 17d2c18d2532c..b43894e74689f 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_common_props.ts @@ -18,7 +18,8 @@ */ import { VisState, VisParams } from 'src/legacy/core_plugins/visualizations/public'; -import { IAggType, IAggConfig, AggGroupNames, Schema } from '../legacy_imports'; +import { IAggType, IAggConfig, AggGroupNames } from '../legacy_imports'; +import { Schema } from '../schemas'; type AggId = IAggConfig['id']; type AggParams = IAggConfig['params']; @@ -44,4 +45,5 @@ export interface DefaultEditorAggCommonProps extends DefaultEditorCommonProps { setStateParamValue: (paramName: T, value: VisParams[T]) => void; onToggleEnableAgg: (aggId: AggId, isEnable: boolean) => void; removeAgg: (aggId: AggId) => void; + schemas: Schema[]; } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx index c36c0176439f9..ec467480539ab 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.test.tsx @@ -21,10 +21,11 @@ import React from 'react'; import { mount, shallow } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { VisState } from 'src/legacy/core_plugins/visualizations/public'; -import { IAggConfigs, IAggConfig, Schema } from '../legacy_imports'; +import { IAggConfigs, IAggConfig } from '../legacy_imports'; import { DefaultEditorAggGroup, DefaultEditorAggGroupProps } from './agg_group'; import { DefaultEditorAgg } from './agg'; import { DefaultEditorAggAdd } from './agg_add'; +import { Schema } from '../schemas'; jest.mock('@elastic/eui', () => ({ EuiTitle: 'eui-title', @@ -75,7 +76,7 @@ describe('DefaultEditorAgg component', () => { type: 'number', }, }, - schema: { group: 'metrics' }, + schema: 'metrics', } as IAggConfig, { id: '3', @@ -84,7 +85,7 @@ describe('DefaultEditorAgg component', () => { type: 'string', }, }, - schema: { group: 'metrics' }, + schema: 'metrics', } as IAggConfig, { id: '2', @@ -93,7 +94,7 @@ describe('DefaultEditorAgg component', () => { type: 'number', }, }, - schema: { group: 'buckets' }, + schema: 'buckets', } as IAggConfig, ], } as IAggConfigs; @@ -107,9 +108,13 @@ describe('DefaultEditorAgg component', () => { } as VisState, schemas: [ { + name: 'metrics', + group: 'metrics', max: 1, } as Schema, { + name: 'buckets', + group: 'buckets', max: 1, } as Schema, ], diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx index 768a9669025e4..a15a98d4983ce 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group.tsx @@ -30,7 +30,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IAggConfig, aggGroupNamesMap, AggGroupNames, Schema } from '../legacy_imports'; +import { IAggConfig, aggGroupNamesMap, AggGroupNames } from '../legacy_imports'; import { DefaultEditorAgg } from './agg'; import { DefaultEditorAggAdd } from './agg_add'; import { AddSchema, ReorderAggs, DefaultEditorAggCommonProps } from './agg_common_props'; @@ -41,6 +41,7 @@ import { getEnabledMetricAggsCount, } from './agg_group_helper'; import { aggGroupReducer, initAggsState, AGGS_ACTION_KEYS } from './agg_group_state'; +import { Schema, getSchemasByGroup } from '../schemas'; export interface DefaultEditorAggGroupProps extends DefaultEditorAggCommonProps { schemas: Schema[]; @@ -69,9 +70,12 @@ function DefaultEditorAggGroup({ }: DefaultEditorAggGroupProps) { const groupNameLabel = (aggGroupNamesMap() as any)[groupName]; // e.g. buckets can have no aggs + const schemaNames = getSchemasByGroup(schemas, groupName).map(s => s.name); const group: IAggConfig[] = useMemo( - () => state.aggs.aggs.filter((agg: IAggConfig) => agg.schema.group === groupName) || [], - [groupName, state.aggs.aggs] + () => + state.aggs.aggs.filter((agg: IAggConfig) => agg.schema && schemaNames.includes(agg.schema)) || + [], + [state.aggs.aggs, schemaNames] ); const stats = { @@ -162,14 +166,14 @@ function DefaultEditorAggGroup({ 1} isLastBucket={groupName === AggGroupNames.Buckets && index === group.length - 1} - isRemovable={isAggRemovable(agg, group)} - isDisabled={agg.schema.name === 'metric' && isMetricAggregationDisabled} + isRemovable={isAggRemovable(agg, group, schemas)} + isDisabled={agg.schema === 'metric' && isMetricAggregationDisabled} lastParentPipelineAggTitle={lastParentPipelineAggTitle} metricAggs={metricAggs} state={state} @@ -179,6 +183,7 @@ function DefaultEditorAggGroup({ onToggleEnableAgg={onToggleEnableAgg} removeAgg={removeAgg} setAggsState={setAggsState} + schemas={schemas} /> )} diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.test.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.test.ts index b18e5af27f8b4..aebece29e7ae6 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.test.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.test.ts @@ -25,9 +25,11 @@ import { getEnabledMetricAggsCount, } from './agg_group_helper'; import { AggsState } from './agg_group_state'; +import { Schema } from '../schemas'; describe('DefaultEditorGroup helpers', () => { let group: IAggConfig[]; + let schemas: Schema[]; beforeEach(() => { group = [ @@ -38,7 +40,7 @@ describe('DefaultEditorGroup helpers', () => { type: 'number', }, }, - schema: { name: 'metric', min: 1, mustBeFirst: true }, + schema: 'metric', } as IAggConfig, { id: '2', @@ -47,20 +49,45 @@ describe('DefaultEditorGroup helpers', () => { type: 'string', }, }, - schema: { name: 'metric', min: 2 }, + schema: 'metric2', } as IAggConfig, ]; + schemas = [ + { + name: 'metric', + title: 'Metric', + group: 'metrics', + min: 0, + max: 3, + aggFilter: [], + editor: false, + params: [], + defaults: null, + mustBeFirst: true, + }, + { + name: 'metric2', + title: 'Metric', + group: 'metrics', + min: 2, + max: 3, + aggFilter: [], + editor: false, + params: [], + defaults: null, + }, + ]; }); describe('isAggRemovable', () => { it('should return true when the number of aggs with the same schema is above the min', () => { - const isRemovable = isAggRemovable(group[0], group); + const isRemovable = isAggRemovable(group[0], group, schemas); expect(isRemovable).toBeTruthy(); }); it('should return false when the number of aggs with the same schema is not above the min', () => { - const isRemovable = isAggRemovable(group[1], group); + const isRemovable = isAggRemovable(group[1], group, schemas); expect(isRemovable).toBeFalsy(); }); @@ -77,6 +104,7 @@ describe('DefaultEditorGroup helpers', () => { it('should return 2 when there are multiple enabled aggs', () => { group[0].enabled = true; group[1].enabled = true; + group[1].schema = 'metric'; const enabledAggs = getEnabledMetricAggsCount(group); expect(enabledAggs).toBe(2); @@ -85,26 +113,26 @@ describe('DefaultEditorGroup helpers', () => { describe('calcAggIsTooLow', () => { it('should return false when agg.schema.mustBeFirst has falsy value', () => { - const isRemovable = calcAggIsTooLow(group[1], 0, group); + const isRemovable = calcAggIsTooLow(group[1], 0, group, schemas); expect(isRemovable).toBeFalsy(); }); it('should return false when there is no different schema', () => { group[1].schema = group[0].schema; - const isRemovable = calcAggIsTooLow(group[0], 0, group); + const isRemovable = calcAggIsTooLow(group[0], 0, group, schemas); expect(isRemovable).toBeFalsy(); }); it('should return false when different schema is not less than agg index', () => { - const isRemovable = calcAggIsTooLow(group[0], 0, group); + const isRemovable = calcAggIsTooLow(group[0], 0, group, schemas); expect(isRemovable).toBeFalsy(); }); it('should return true when agg index is greater than different schema index', () => { - const isRemovable = calcAggIsTooLow(group[0], 2, group); + const isRemovable = calcAggIsTooLow(group[0], 2, group, schemas); expect(isRemovable).toBeTruthy(); }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx index d2e8e5401c0f7..0a8c5c3077ada 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_group_helper.tsx @@ -20,27 +20,34 @@ import { findIndex, isEmpty } from 'lodash'; import { IAggConfig } from '../legacy_imports'; import { AggsState } from './agg_group_state'; +import { Schema, getSchemaByName } from '../schemas'; -const isAggRemovable = (agg: IAggConfig, group: IAggConfig[]) => { +const isAggRemovable = (agg: IAggConfig, group: IAggConfig[], schemas: Schema[]) => { + const schema = getSchemaByName(schemas, agg.schema); const metricCount = group.reduce( - (count, aggregation: IAggConfig) => - aggregation.schema.name === agg.schema.name ? ++count : count, + (count, aggregation: IAggConfig) => (aggregation.schema === agg.schema ? ++count : count), 0 ); // make sure the the number of these aggs is above the min - return metricCount > agg.schema.min; + return metricCount > schema.min; }; const getEnabledMetricAggsCount = (group: IAggConfig[]) => { return group.reduce( (count, aggregation: IAggConfig) => - aggregation.schema.name === 'metric' && aggregation.enabled ? ++count : count, + aggregation.schema === 'metric' && aggregation.enabled ? ++count : count, 0 ); }; -const calcAggIsTooLow = (agg: IAggConfig, aggIndex: number, group: IAggConfig[]) => { - if (!agg.schema.mustBeFirst) { +const calcAggIsTooLow = ( + agg: IAggConfig, + aggIndex: number, + group: IAggConfig[], + schemas: Schema[] +) => { + const schema = getSchemaByName(schemas, agg.schema); + if (!schema.mustBeFirst) { return false; } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts index 843cfddc07010..cdc5a4c8f8a77 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_param_props.ts @@ -22,6 +22,7 @@ import { VisState } from 'src/legacy/core_plugins/visualizations/public'; import { IAggConfig, AggParam } from '../legacy_imports'; import { ComboBoxGroupedOptions } from '../utils'; import { EditorConfig } from './utils'; +import { Schema } from '../schemas'; // NOTE: we cannot export the interface with export { InterfaceName } // as there is currently a bug on babel typescript transform plugin for it @@ -38,6 +39,7 @@ export interface AggParamCommonProps { state: VisState; value?: T; metricAggs: IAggConfig[]; + schemas: Schema[]; } export interface AggParamEditorProps extends AggParamCommonProps { diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx index af851aa9b4418..d2821566fcb37 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.test.tsx @@ -105,6 +105,7 @@ describe('DefaultEditorAggParams component', () => { onAggTypeChange, setTouched, setValidity, + schemas: [], }; }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx index e9583ab4cec79..510c21af95da1 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params.tsx @@ -40,6 +40,7 @@ import { } from './agg_params_state'; import { DefaultEditorCommonProps } from './agg_common_props'; import { EditorParamConfig, TimeIntervalParam, FixedParam, getEditorConfig } from './utils'; +import { Schema, getSchemaByName } from '../schemas'; const FIXED_VALUE_PROP = 'fixedValue'; const DEFAULT_PROP = 'default'; @@ -57,6 +58,9 @@ export interface DefaultEditorAggParamsProps extends DefaultEditorCommonProps { indexPattern: IndexPattern; setValidity: (isValid: boolean) => void; setTouched: (isTouched: boolean) => void; + schemas: Schema[]; + allowedAggs?: string[]; + hideCustomLabel?: boolean; } function DefaultEditorAggParams({ @@ -75,16 +79,22 @@ function DefaultEditorAggParams({ onAggTypeChange, setTouched, setValidity, + schemas, + allowedAggs = [], + hideCustomLabel = false, }: DefaultEditorAggParamsProps) { - const groupedAggTypeOptions = useMemo(() => getAggTypeOptions(agg, indexPattern, groupName), [ - agg, - indexPattern, - groupName, - ]); + const schema = getSchemaByName(schemas, agg.schema); + const { title } = schema; + const aggFilter = [...allowedAggs, ...(schema.aggFilter || [])]; + const groupedAggTypeOptions = useMemo( + () => getAggTypeOptions(agg, indexPattern, groupName, aggFilter), + [agg, indexPattern, groupName, aggFilter] + ); + const error = aggIsTooLow ? i18n.translate('visDefaultEditor.aggParams.errors.aggWrongRunOrderErrorMessage', { defaultMessage: '"{schema}" aggs must run before all other buckets!', - values: { schema: agg.schema.title }, + values: { schema: title }, }) : ''; const aggTypeName = agg.type?.name; @@ -94,12 +104,10 @@ function DefaultEditorAggParams({ aggTypeName, fieldName, ]); - const params = useMemo(() => getAggParamsToRender({ agg, editorConfig, metricAggs, state }), [ - agg, - editorConfig, - metricAggs, - state, - ]); + const params = useMemo( + () => getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas, hideCustomLabel }), + [agg, editorConfig, metricAggs, state, schemas, hideCustomLabel] + ); const allParams = [...params.basic, ...params.advanced]; const [paramsState, onChangeParamsState] = useReducer( aggParamsReducer, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts index f3bee80baa1ba..047467750794b 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.test.ts @@ -27,6 +27,7 @@ import { } from './agg_params_helper'; import { FieldParamEditor, OrderByParamEditor } from './controls'; import { EditorConfig } from './utils'; +import { Schema } from '../schemas'; jest.mock('../utils', () => ({ groupAndSortBy: jest.fn(() => ['indexedFields']), @@ -38,6 +39,15 @@ describe('DefaultEditorAggParams helpers', () => { describe('getAggParamsToRender', () => { let agg: IAggConfig; let editorConfig: EditorConfig; + const schemas: Schema[] = [ + { + name: 'metric', + } as Schema, + { + name: 'metric2', + hideCustomLabel: true, + } as Schema, + ]; const state = {} as VisState; const metricAggs: IAggConfig[] = []; const emptyParams = { @@ -50,16 +60,16 @@ describe('DefaultEditorAggParams helpers', () => { type: { params: [{ name: 'interval' }], }, - schema: {}, + schema: 'metric', } as IAggConfig; - const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); + const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual(emptyParams); }); it('should not create any param if there is no agg type', () => { - agg = {} as IAggConfig; - const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); + agg = { schema: 'metric' } as IAggConfig; + const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual(emptyParams); }); @@ -75,21 +85,19 @@ describe('DefaultEditorAggParams helpers', () => { hidden: true, }, }; - const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); + const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual(emptyParams); }); it('should skip customLabel param if it is hidden', () => { - agg = { + agg = ({ type: { params: [{ name: 'customLabel' }], }, - schema: { - hideCustomLabel: true, - }, - } as IAggConfig; - const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); + schema: 'metric2', + } as any) as IAggConfig; + const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual(emptyParams); }); @@ -116,7 +124,7 @@ describe('DefaultEditorAggParams helpers', () => { }, ], }, - schema: {}, + schema: 'metric', getIndexPattern: jest.fn(() => ({ fields: [ { name: '@timestamp', type: 'date' }, @@ -128,7 +136,7 @@ describe('DefaultEditorAggParams helpers', () => { field: 'field', }, } as any) as IAggConfig; - const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state }); + const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual({ basic: [ @@ -140,6 +148,7 @@ describe('DefaultEditorAggParams helpers', () => { paramEditor: FieldParamEditor, metricAggs, state, + schemas, value: agg.params.field, }, { @@ -150,6 +159,7 @@ describe('DefaultEditorAggParams helpers', () => { paramEditor: OrderByParamEditor, metricAggs, state, + schemas, value: agg.params.orderBy, }, ], @@ -162,7 +172,7 @@ describe('DefaultEditorAggParams helpers', () => { describe('getAggTypeOptions', () => { it('should return agg type options grouped by subtype', () => { const indexPattern = {} as IndexPattern; - const aggs = getAggTypeOptions({} as IAggConfig, indexPattern, 'metrics'); + const aggs = getAggTypeOptions({} as IAggConfig, indexPattern, 'metrics', []); expect(aggs).toEqual(['indexedFields']); }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts index 0c0726ec67d50..520ff6ffc5ff5 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_params_helper.ts @@ -35,12 +35,15 @@ import { IAggType, } from '../legacy_imports'; import { EditorConfig } from './utils'; +import { Schema, getSchemaByName } from '../schemas'; interface ParamInstanceBase { agg: IAggConfig; editorConfig: EditorConfig; metricAggs: IAggConfig[]; state: VisState; + schemas: Schema[]; + hideCustomLabel?: boolean; } export interface ParamInstance extends ParamInstanceBase { @@ -50,7 +53,14 @@ export interface ParamInstance extends ParamInstanceBase { value: unknown; } -function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamInstanceBase) { +function getAggParamsToRender({ + agg, + editorConfig, + metricAggs, + state, + schemas, + hideCustomLabel, +}: ParamInstanceBase) { const params = { basic: [] as ParamInstance[], advanced: [] as ParamInstance[], @@ -63,19 +73,26 @@ function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamIns .filter((param: AggParam) => !get(editorConfig, [param.name, 'hidden'], false))) || []; + const schema = getSchemaByName(schemas, agg.schema); // build collection of agg params components paramsToRender.forEach((param: AggParam, index: number) => { let indexedFields: ComboBoxGroupedOptions = []; let fields: IndexPatternField[]; - if (agg.schema.hideCustomLabel && param.name === 'customLabel') { + if (hideCustomLabel && param.name === 'customLabel') { return; } // if field param exists, compute allowed fields if (param.type === 'field') { - const availableFields: IndexPatternField[] = (param as IFieldParamType).getAvailableFields( - agg - ); + let availableFields: IndexPatternField[] = (param as IFieldParamType).getAvailableFields(agg); + // should be refactored in the future to provide a more general way + // for visualization to override some agg config settings + if (agg.type.name === 'top_hits' && param.name === 'field') { + const allowStrings = _.get(schema, `aggSettings[${agg.type.name}].allowStrings`, false); + if (!allowStrings) { + availableFields = availableFields.filter(field => field.type === 'number'); + } + } fields = aggTypeFieldFilters.filter(availableFields, agg); indexedFields = groupAndSortBy(fields, 'type', 'name'); @@ -109,6 +126,8 @@ function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamIns metricAggs, state, value: agg.params[param.name], + schemas, + hideCustomLabel, }); } }); @@ -119,9 +138,15 @@ function getAggParamsToRender({ agg, editorConfig, metricAggs, state }: ParamIns function getAggTypeOptions( agg: IAggConfig, indexPattern: IndexPattern, - groupName: string + groupName: string, + allowedAggs: string[] ): ComboBoxGroupedOptions { - const aggTypeOptions = aggTypeFilters.filter((aggTypes as any)[groupName], indexPattern, agg); + const aggTypeOptions = aggTypeFilters.filter( + (aggTypes as any)[groupName], + indexPattern, + agg, + allowedAggs + ); return groupAndSortBy(aggTypeOptions as any[], 'subtype', 'title'); } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx index 89d39a0605b60..36496c2800b64 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx @@ -81,6 +81,7 @@ describe('FieldParamEditor component', () => { setTouched, state: {} as VisState, metricAggs: [] as IAggConfig[], + schemas: [], }; }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx index 10679b578d54e..8c020c668b3c6 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/order_agg.tsx @@ -35,6 +35,7 @@ function OrderAggParamEditor({ setValue, setValidity, setTouched, + schemas, }: AggParamEditorProps) { const orderBy = agg.params.orderBy; @@ -64,6 +65,8 @@ function OrderAggParamEditor({ ); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/percentiles.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/percentiles.test.tsx index 020dbb351b497..0eaf9bcc987c1 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/percentiles.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/percentiles.test.tsx @@ -47,6 +47,7 @@ describe('PercentilesEditor component', () => { setTouched, state: {} as VisState, metricAggs: [] as IAggConfig[], + schemas: [], }; }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/rows_or_columns.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/rows_or_columns.tsx index 65c7964709279..83a341e045b5c 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/rows_or_columns.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/rows_or_columns.tsx @@ -28,8 +28,11 @@ const PARAMS = { COLUMNS: 'visEditorSplitBy__false', }; -function RowsOrColumnsControl({ agg, setAggParamValue }: AggControlProps) { - const idSelected = `visEditorSplitBy__${agg.params.row}`; +function RowsOrColumnsControl({ editorStateParams, setStateParamValue }: AggControlProps) { + if (editorStateParams.row === undefined) { + setStateParamValue(PARAMS.NAME, true); + } + const idSelected = `visEditorSplitBy__${editorStateParams.row}`; const options = [ { id: PARAMS.ROWS, @@ -45,8 +48,8 @@ function RowsOrColumnsControl({ agg, setAggParamValue }: AggControlProps) { }, ]; const onChange = useCallback( - optionId => setAggParamValue(agg.id, PARAMS.NAME, optionId === PARAMS.ROWS), - [setAggParamValue] + optionId => setStateParamValue(PARAMS.NAME, optionId === PARAMS.ROWS), + [setStateParamValue] ); return ( diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_agg.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_agg.tsx index 5dc28b59a52b3..5bc94bd4af226 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_agg.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_agg.tsx @@ -35,6 +35,7 @@ function SubAggParamEditor({ setValue, setValidity, setTouched, + schemas, }: AggParamEditorProps) { useEffect(() => { // we aren't creating a custom aggConfig @@ -61,6 +62,7 @@ function SubAggParamEditor({ ); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx index 45ff0610d88ed..9d48b1c964a27 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/sub_metric.tsx @@ -35,6 +35,7 @@ function SubMetricParamEditor({ setValue, setValidity, setTouched, + schemas, }: AggParamEditorProps) { const metricTitle = i18n.translate('visDefaultEditor.controls.metrics.metricTitle', { defaultMessage: 'Metric', @@ -73,6 +74,7 @@ function SubMetricParamEditor({ ); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts b/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts index 4280f85c901d7..8a21114999cd6 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/test_utils.ts @@ -29,4 +29,5 @@ export const aggParamCommonPropsMock = { metricAggs: [] as IAggConfig[], state: {} as VisState, showValidation: false, + schemas: [], }; diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx index efd17f02a0e09..1c1f9d57d8b90 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/data_tab.tsx @@ -25,7 +25,6 @@ import { VisState } from 'src/legacy/core_plugins/visualizations/public'; import { IAggConfig, AggGroupNames, - ISchemas, parentPipelineType, IMetricAggType, } from '../../legacy_imports'; @@ -40,6 +39,7 @@ import { toggleEnabledAgg, } from './state'; import { AddSchema, ReorderAggs, DefaultEditorAggCommonProps } from '../agg_common_props'; +import { ISchemas } from '../../schemas'; export interface DefaultEditorDataTabProps { dispatch: React.Dispatch; @@ -76,8 +76,8 @@ function DefaultEditorDataTab({ const addSchema: AddSchema = useCallback(schema => dispatch(addNewAgg(schema)), [dispatch]); const onAggRemove: DefaultEditorAggCommonProps['removeAgg'] = useCallback( - aggId => dispatch(removeAgg(aggId)), - [dispatch] + aggId => dispatch(removeAgg(aggId, schemas.all || [])), + [dispatch, schemas] ); const onReorderAggs: ReorderAggs = useCallback((...props) => dispatch(reorderAggs(...props)), [ diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/sidebar.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/sidebar.tsx index a70ffd3cd88e1..1efd8dae8178b 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/sidebar.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/sidebar.tsx @@ -31,6 +31,7 @@ import { DefaultEditorAggCommonProps } from '../agg_common_props'; import { SidebarTitle } from './sidebar_title'; import { PersistedState } from '../../../../../../plugins/visualizations/public'; import { SavedSearch } from '../../../../../../plugins/discover/public'; +import { getSchemasByGroup } from '../../schemas'; interface DefaultEditorSideBarProps { isCollapsed: boolean; @@ -57,9 +58,12 @@ function DefaultEditorSideBar({ const { formState, setTouched, setValidity, resetValidity } = useEditorFormState(); const responseAggs = useMemo(() => state.aggs.getResponseAggs(), [state.aggs]); + const metricSchemas = getSchemasByGroup(vis.type.schemas.all || [], AggGroupNames.Metrics).map( + s => s.name + ); const metricAggs = useMemo( - () => responseAggs.filter(agg => get(agg, 'schema.group') === AggGroupNames.Metrics), - [responseAggs] + () => responseAggs.filter(agg => metricSchemas.includes(get(agg, 'schema'))), + [responseAggs, metricSchemas] ); const hasHistogramAgg = useMemo(() => responseAggs.some(agg => agg.type.name === 'histogram'), [ responseAggs, diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts index 93fa1083bebf9..f9915bedc8878 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/actions.ts @@ -18,8 +18,9 @@ */ import { Vis, VisParams } from 'src/legacy/core_plugins/visualizations/public'; -import { IAggConfig, Schema } from '../../../legacy_imports'; +import { IAggConfig } from '../../../legacy_imports'; import { EditorStateActionTypes } from './constants'; +import { Schema } from '../../../schemas'; export interface ActionType { type: T; @@ -47,7 +48,7 @@ type SetStateParamValue = ActionTyp EditorStateActionTypes.SET_STATE_PARAM_VALUE, { paramName: T; value: AggParams[T] } >; -type RemoveAgg = ActionType; +type RemoveAgg = ActionType; type ReorderAggs = ActionType< EditorStateActionTypes.REORDER_AGGS, { sourceAgg: IAggConfig; destinationAgg: IAggConfig } @@ -85,7 +86,7 @@ export interface EditorActions { paramName: T, value: AggParams[T] ): SetStateParamValue; - removeAgg(aggId: AggId): RemoveAgg; + removeAgg(aggId: AggId, schemas: Schema[]): RemoveAgg; reorderAggs(sourceAgg: IAggConfig, destinationAgg: IAggConfig): ReorderAggs; toggleEnabledAgg(aggId: AggId, enabled: IAggConfig['enabled']): ToggleEnabledAgg; updateStateParams(params: VisParams): UpdateStateParams; @@ -128,10 +129,11 @@ const setStateParamValue: EditorActions['setStateParamValue'] = (paramName, valu }, }); -const removeAgg: EditorActions['removeAgg'] = aggId => ({ +const removeAgg: EditorActions['removeAgg'] = (aggId, schemas) => ({ type: EditorStateActionTypes.REMOVE_AGG, payload: { aggId, + schemas, }, }); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts index 6ae4e415f8caa..73675e75cbe36 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/components/sidebar/state/reducers.ts @@ -20,8 +20,7 @@ import { cloneDeep } from 'lodash'; import { Vis, VisState } from 'src/legacy/core_plugins/visualizations/public'; - -import { createAggConfigs, IAggConfig, AggGroupNames } from '../../../legacy_imports'; +import { createAggConfigs, AggGroupNames } from '../../../legacy_imports'; import { EditorStateActionTypes } from './constants'; import { getEnabledMetricAggsCount } from '../../agg_group_helper'; import { EditorAction } from './actions'; @@ -33,8 +32,12 @@ function initEditorState(vis: Vis) { function editorStateReducer(state: VisState, action: EditorAction): VisState { switch (action.type) { case EditorStateActionTypes.ADD_NEW_AGG: { - const payloadAggConfig = action.payload as IAggConfig; - const aggConfig = state.aggs.createAggConfig(payloadAggConfig, { + const { schema } = action.payload; + const defaultConfig = + !state.aggs.aggs.find(agg => agg.schema === schema.name) && schema.defaults + ? (schema as any).defaults.slice(0, schema.max) + : { schema: schema.name }; + const aggConfig = state.aggs.createAggConfig(defaultConfig, { addToAggConfigs: false, }); aggConfig.brandNew = true; @@ -42,7 +45,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { return { ...state, - aggs: createAggConfigs(state.aggs.indexPattern, newAggs, state.aggs.schemas), + aggs: createAggConfigs(state.aggs.indexPattern, newAggs), }; } @@ -65,7 +68,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { return { ...state, - aggs: createAggConfigs(state.aggs.indexPattern, newAggs, state.aggs.schemas), + aggs: createAggConfigs(state.aggs.indexPattern, newAggs), }; } @@ -90,7 +93,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { return { ...state, - aggs: createAggConfigs(state.aggs.indexPattern, newAggs, state.aggs.schemas), + aggs: createAggConfigs(state.aggs.indexPattern, newAggs), }; } @@ -108,10 +111,10 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { case EditorStateActionTypes.REMOVE_AGG: { let isMetric = false; - const newAggs = state.aggs.aggs.filter(({ id, schema }) => { if (id === action.payload.aggId) { - if (schema.group === AggGroupNames.Metrics) { + const schemaDef = action.payload.schemas.find(s => s.name === schema); + if (schemaDef && schemaDef.group === AggGroupNames.Metrics) { isMetric = true; } @@ -122,7 +125,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { }); if (isMetric && getEnabledMetricAggsCount(newAggs) === 0) { - const aggToEnable = newAggs.find(agg => agg.schema.name === 'metric'); + const aggToEnable = newAggs.find(agg => agg.schema === 'metric'); if (aggToEnable) { aggToEnable.enabled = true; @@ -131,7 +134,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { return { ...state, - aggs: createAggConfigs(state.aggs.indexPattern, newAggs, state.aggs.schemas), + aggs: createAggConfigs(state.aggs.indexPattern, newAggs), }; } @@ -143,7 +146,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { return { ...state, - aggs: createAggConfigs(state.aggs.indexPattern, newAggs, state.aggs.schemas), + aggs: createAggConfigs(state.aggs.indexPattern, newAggs), }; } @@ -165,7 +168,7 @@ function editorStateReducer(state: VisState, action: EditorAction): VisState { return { ...state, - aggs: createAggConfigs(state.aggs.indexPattern, newAggs, state.aggs.schemas), + aggs: createAggConfigs(state.aggs.indexPattern, newAggs), }; } diff --git a/src/legacy/core_plugins/vis_default_editor/public/index.ts b/src/legacy/core_plugins/vis_default_editor/public/index.ts index fa6c2ee6d5ec7..156d50f451b57 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/index.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/index.ts @@ -23,3 +23,4 @@ export { RangesParamEditor, RangeValues } from './components/controls/ranges'; export * from './editor_size'; export * from './vis_options_props'; export * from './utils'; +export { ISchemas, Schemas, Schema } from './schemas'; diff --git a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts index 8aed263c4e4d1..5c02b50286a95 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/legacy_imports.ts @@ -32,8 +32,6 @@ export { IFieldParamType, BUCKET_TYPES, METRIC_TYPES, - ISchemas, - Schema, termsAggFilter, } from 'ui/agg_types'; export { aggTypeFilters, propFilter } from 'ui/agg_types'; diff --git a/src/legacy/core_plugins/data/public/search/aggs/schemas.ts b/src/legacy/core_plugins/vis_default_editor/public/schemas.ts similarity index 84% rename from src/legacy/core_plugins/data/public/search/aggs/schemas.ts rename to src/legacy/core_plugins/vis_default_editor/public/schemas.ts index 1aa5ebe08656b..5849d9d80011e 100644 --- a/src/legacy/core_plugins/data/public/search/aggs/schemas.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/schemas.ts @@ -22,16 +22,17 @@ import _ from 'lodash'; import { Optional } from '@kbn/utility-types'; import { IndexedArray } from 'ui/indexed_array'; -import { AggGroupNames } from './agg_groups'; -import { AggParam } from './agg_params'; +import { AggGroupNames } from '../../data/public/search/aggs/agg_groups'; +import { AggParam } from '../../data/public/search/aggs/agg_params'; export interface ISchemas { [AggGroupNames.Buckets]: Schema[]; [AggGroupNames.Metrics]: Schema[]; + all: Schema[]; } export interface Schema { - aggFilter: string | string[]; + aggFilter: string[]; editor: boolean | string; group: AggGroupNames; max: number; @@ -103,3 +104,11 @@ export class Schemas { .commit(); } } + +export const getSchemaByName = (schemas: Schema[], schemaName?: string) => { + return schemas.find(s => s.name === schemaName) || ({} as Schema); +}; + +export const getSchemasByGroup = (schemas: Schema[], schemaGroup?: string) => { + return schemas.filter(s => s.group === schemaGroup); +}; diff --git a/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts b/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts index 60b675f50a342..fcb06f73513b0 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts +++ b/src/legacy/core_plugins/vis_default_editor/public/vis_type_agg_filter.ts @@ -26,8 +26,8 @@ const filterByName = propFilter('name'); * and limits available aggregations based on that. */ aggTypeFilters.addFilter( - (aggType: IAggType, indexPatterns: IndexPattern, aggConfig: IAggConfig) => { - const doesSchemaAllowAggType = filterByName([aggType], aggConfig.schema.aggFilter).length !== 0; + (aggType: IAggType, indexPatterns: IndexPattern, aggConfig: IAggConfig, aggFilter: string[]) => { + const doesSchemaAllowAggType = filterByName([aggType], aggFilter).length !== 0; return doesSchemaAllowAggType; } ); diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts index 736152c7014dc..6d4e94c6292a6 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts @@ -113,24 +113,20 @@ describe('Table Vis - Controller', () => { return ({ type: tableVisTypeDefinition, params: Object.assign({}, tableVisTypeDefinition.visConfig.defaults, params), - aggs: createAggConfigs( - stubIndexPattern, - [ - { type: 'count', schema: 'metric' }, - { - type: 'range', - schema: 'bucket', - params: { - field: 'bytes', - ranges: [ - { from: 0, to: 1000 }, - { from: 1000, to: 2000 }, - ], - }, + aggs: createAggConfigs(stubIndexPattern, [ + { type: 'count', schema: 'metric' }, + { + type: 'range', + schema: 'bucket', + params: { + field: 'bytes', + ranges: [ + { from: 0, to: 1000 }, + { from: 1000, to: 2000 }, + ], }, - ], - tableVisTypeDefinition.editorConfig.schemas.all - ), + }, + ]), } as unknown) as Vis; } diff --git a/src/legacy/core_plugins/vis_type_vislib/public/components/options/gauge/style_panel.tsx b/src/legacy/core_plugins/vis_type_vislib/public/components/options/gauge/style_panel.tsx index 9ed270257c559..4c936c93a4c8a 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/components/options/gauge/style_panel.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/components/options/gauge/style_panel.tsx @@ -28,8 +28,7 @@ import { AggGroupNames } from '../../../legacy_imports'; function StylePanel({ aggs, setGaugeValue, stateParams, vis }: GaugeOptionsInternalProps) { const diasableAlignment = - aggs.bySchemaGroup(AggGroupNames.Metrics).length === 1 && - !aggs.bySchemaGroup(AggGroupNames.Buckets); + aggs.byType(AggGroupNames.Metrics).length === 1 && !aggs.byType(AggGroupNames.Buckets); return ( diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts index afa638cdc5bf0..33b2da75b547e 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.test.ts @@ -383,9 +383,7 @@ describe('visualize loader pipeline helpers: build pipeline', () => { type: 'metrics', name: 'count', }, - schema: { - name: 'metric', - }, + schema: 'metric', params: {}, } as IAggConfig, ]; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts index 1339e1f2fdfe8..069b5814908a8 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/legacy/build_pipeline.ts @@ -142,10 +142,7 @@ const getSchemas = ( const metrics = responseAggs.filter((agg: IAggConfig) => agg.type.type === 'metrics'); responseAggs.forEach((agg: IAggConfig) => { let skipMetrics = false; - let schemaName = agg.schema ? agg.schema.name || agg.schema : null; - if (typeof schemaName === 'object') { - schemaName = null; - } + let schemaName = agg.schema; if (!schemaName) { if (agg.type.name === 'geo_centroid') { schemaName = 'geo_centroid'; @@ -155,7 +152,7 @@ const getSchemas = ( } } if (schemaName === 'split') { - schemaName = `split_${agg.params.row ? 'row' : 'column'}`; + schemaName = `split_${vis.params.row ? 'row' : 'column'}`; skipMetrics = responseAggs.length - metrics.length > 1; } if (!schemas[schemaName]) { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.d.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.d.ts index 62b68082e21f8..0c4ea1572c4cd 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.d.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.d.ts @@ -20,6 +20,8 @@ import { Vis, VisState, VisParams } from './vis'; import { VisType } from './vis_types'; import { IIndexPattern } from '../../../../../../plugins/data/common'; +import { Schema } from '../../../../vis_default_editor/public'; +import { IAggConfig } from '../../../../data/public/search/aggs'; type InitVisStateType = | Partial @@ -44,6 +46,8 @@ export declare class VisImpl implements Vis { aggs: Array<{ [key: string]: any }>; }; + private initializeDefaultsFromSchemas(configStates: IAggConfig[], schemas: Schema[]); + // Since we haven't typed everything here yet, we basically "any" the rest // of that interface. This should be removed as soon as this type definition // has been completed. But that way we at least have typing for a couple of diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.js b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.js index d5e6412b6bdab..abd8f351ae94d 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.js +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/vis_impl.js @@ -61,6 +61,23 @@ class VisImpl extends EventEmitter { }; } + initializeDefaultsFromSchemas(configStates, schemas) { + // Set the defaults for any schema which has them. If the defaults + // for some reason has more then the max only set the max number + // of defaults (not sure why a someone define more... + // but whatever). Also if a schema.name is already set then don't + // set anything. + const newConfigs = [...configStates]; + schemas + .filter(schema => Array.isArray(schema.defaults) && schema.defaults.length > 0) + .filter(schema => !configStates.find(agg => agg.schema && agg.schema === schema.name)) + .forEach(schema => { + const defaults = schema.defaults.slice(0, schema.max); + defaults.forEach(d => newConfigs.push(d)); + }); + return newConfigs; + } + setCurrentState(state) { this.title = state.title || ''; const type = state.type || this.type; @@ -82,11 +99,9 @@ class VisImpl extends EventEmitter { updateVisualizationConfig(state.params, this.params); if (state.aggs || !this.aggs) { - this.aggs = getAggs().createAggConfigs( - this.indexPattern, - state.aggs ? state.aggs.aggs || state.aggs : [], - this.type.schemas.all - ); + let configStates = state.aggs ? state.aggs.aggs || state.aggs : []; + configStates = this.initializeDefaultsFromSchemas(configStates, this.type.schemas.all || []); + this.aggs = getAggs().createAggConfigs(this.indexPattern, configStates); } } diff --git a/src/legacy/ui/public/agg_types/index.ts b/src/legacy/ui/public/agg_types/index.ts index 9773b11086b78..db64bd025b8cb 100644 --- a/src/legacy/ui/public/agg_types/index.ts +++ b/src/legacy/ui/public/agg_types/index.ts @@ -52,7 +52,6 @@ export { BUCKET_TYPES, DateRangeKey, IpRangeKey, - ISchemas, METRIC_TYPES, OptionedParamEditorProps, OptionedValueProp, @@ -78,8 +77,8 @@ export { OptionedParamType, parentPipelineType, propFilter, - Schema, - Schemas, siblingPipelineType, termsAggFilter, } from '../../../core_plugins/data/public'; + +export { ISchemas, Schemas, Schema } from '../../../core_plugins/vis_default_editor/public/schemas'; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 43772f62bc19f..195b75f84a8c0 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -299,7 +299,6 @@ "data.search.aggs.metrics.averageBucketTitle": "平均バケット", "data.search.aggs.metrics.averageLabel": "平均 {field}", "data.search.aggs.metrics.averageTitle": "平均", - "data.search.aggs.metrics.bucketAggTitle": "バケット集約", "data.search.aggs.metrics.countLabel": "カウント", "data.search.aggs.metrics.countTitle": "カウント", "data.search.aggs.metrics.cumulativeSumLabel": "累積合計", @@ -316,7 +315,6 @@ "data.search.aggs.metrics.medianLabel": "中央 {field}", "data.search.aggs.metrics.medianTitle": "中央", "data.search.aggs.metrics.metricAggregationsSubtypeTitle": "メトリック集約", - "data.search.aggs.metrics.metricAggTitle": "メトリック集約", "data.search.aggs.metrics.minBucketTitle": "最低バケット", "data.search.aggs.metrics.minLabel": "最低 {field}", "data.search.aggs.metrics.minTitle": "最低", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 16ee94d33fbf6..9add5c6bcdbc3 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -299,7 +299,6 @@ "data.search.aggs.metrics.averageBucketTitle": "平均存储桶", "data.search.aggs.metrics.averageLabel": "{field}平均值", "data.search.aggs.metrics.averageTitle": "平均值", - "data.search.aggs.metrics.bucketAggTitle": "存储桶聚合", "data.search.aggs.metrics.countLabel": "计数", "data.search.aggs.metrics.countTitle": "计数", "data.search.aggs.metrics.cumulativeSumLabel": "累计和", @@ -316,7 +315,6 @@ "data.search.aggs.metrics.medianLabel": "{field}中值", "data.search.aggs.metrics.medianTitle": "中值", "data.search.aggs.metrics.metricAggregationsSubtypeTitle": "指标聚合", - "data.search.aggs.metrics.metricAggTitle": "指标聚合", "data.search.aggs.metrics.minBucketTitle": "最小存储桶", "data.search.aggs.metrics.minLabel": "{field}最小值", "data.search.aggs.metrics.minTitle": "最小值", From 46738cfa0aa5cdc94214df091a2e55ef2e5c0984 Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Thu, 5 Mar 2020 12:26:28 -0500 Subject: [PATCH 04/25] [Maps] Add field and style-meta types (#58766) --- .../plugins/maps/common/descriptor_types.d.ts | 33 ++++ .../properties/components/ordinal_legend.js | 2 +- .../properties/dynamic_color_property.js | 2 +- .../properties/dynamic_color_property.test.js | 163 ++++++++++-------- .../properties/dynamic_icon_property.js | 2 +- .../properties/dynamic_size_property.js | 4 +- .../properties/dynamic_style_property.js | 104 ++++++++--- .../public/layers/styles/vector/style_meta.ts | 42 +++++ .../layers/styles/vector/vector_style.js | 91 ++++------ .../layers/styles/vector/vector_style.test.js | 4 +- .../maps/public/layers/vector_layer.js | 12 +- 11 files changed, 291 insertions(+), 168 deletions(-) create mode 100644 x-pack/legacy/plugins/maps/public/layers/styles/vector/style_meta.ts diff --git a/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts b/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts index f1d172cf5ad16..f342260c3e7a4 100644 --- a/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts +++ b/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts @@ -119,3 +119,36 @@ export type VectorLayerDescriptor = LayerDescriptor & { joins?: JoinDescriptor[]; style?: unknown; }; + +export type RangeFieldMeta = { + min: number; + max: number; + delta: number; + isMinOutsideStdRange?: boolean; + isMaxOutsideStdRange?: boolean; +}; + +export type Category = { + key: string; + count: number; +}; + +export type CategoryFieldMeta = { + categories: Category[]; +}; + +export type GeometryTypes = { + isPointsOnly: boolean; + isLinesOnly: boolean; + isPolygonsOnly: boolean; +}; + +export type StyleMetaDescriptor = { + geometryTypes?: GeometryTypes; + fieldMeta: { + [key: string]: { + range: RangeFieldMeta; + categories: CategoryFieldMeta; + }; + }; +}; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/components/ordinal_legend.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/components/ordinal_legend.js index 564bae3ef3f72..1ebd042118480 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/components/ordinal_legend.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/components/ordinal_legend.js @@ -46,7 +46,7 @@ export class OrdinalLegend extends React.Component { this._loadParams(); } render() { - const fieldMeta = this.props.style.getFieldMeta(); + const fieldMeta = this.props.style.getRangeFieldMeta(); let minLabel = EMPTY_VALUE; let maxLabel = EMPTY_VALUE; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.js index 70e905907bc79..9404c2da3d274 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.js @@ -169,7 +169,7 @@ export class DynamicColorProperty extends DynamicStyleProperty { }; } - const fieldMeta = this.getFieldMeta(); + const fieldMeta = this.getCategoryFieldMeta(); if (!fieldMeta || !fieldMeta.categories) { return EMPTY_STOPS; } diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.test.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.test.js index 8648b073a7b79..c2f7a1313d02a 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.test.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.test.js @@ -16,7 +16,8 @@ import { shallow } from 'enzyme'; import { VECTOR_STYLES } from '../vector_style_defaults'; import { DynamicColorProperty } from './dynamic_color_property'; -import { COLOR_MAP_TYPE } from '../../../../../common/constants'; +import { StyleMeta } from '../style_meta'; +import { COLOR_MAP_TYPE, FIELD_ORIGIN } from '../../../../../common/constants'; const mockField = { async getLabel() { @@ -28,35 +29,59 @@ const mockField = { getRootName() { return 'foobar'; }, + getOrigin() { + return FIELD_ORIGIN.SOURCE; + }, supportsFieldMeta() { return true; }, }; -const getOrdinalFieldMeta = () => { - return { min: 0, max: 100 }; -}; - -const getCategoricalFieldMeta = () => { - return { - categories: [ - { - key: 'US', - count: 10, +class MockStyle { + getStyleMeta() { + return new StyleMeta({ + geometryTypes: { + isPointsOnly: false, + isLinesOnly: false, + isPolygonsOnly: false, }, - { - key: 'CN', - count: 8, + fieldMeta: { + foobar: { + range: { min: 0, max: 100 }, + categories: { + categories: [ + { + key: 'US', + count: 10, + }, + { + key: 'CN', + count: 8, + }, + ], + }, + }, }, - ], - }; -}; -const makeProperty = (options, getFieldMeta) => { + }); + } +} + +class MockLayer { + getStyle() { + return new MockStyle(); + } + + findDataRequestById() { + return null; + } +} + +const makeProperty = options => { return new DynamicColorProperty( options, VECTOR_STYLES.LINE_COLOR, mockField, - getFieldMeta, + new MockLayer(), () => { return x => x + '_format'; } @@ -69,13 +94,10 @@ const defaultLegendParams = { }; test('Should render ordinal legend', async () => { - const colorStyle = makeProperty( - { - color: 'Blues', - type: undefined, - }, - getOrdinalFieldMeta - ); + const colorStyle = makeProperty({ + color: 'Blues', + type: undefined, + }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -85,23 +107,20 @@ test('Should render ordinal legend', async () => { }); test('Should render ordinal legend with breaks', async () => { - const colorStyle = makeProperty( - { - type: COLOR_MAP_TYPE.ORDINAL, - useCustomColorRamp: true, - customColorRamp: [ - { - stop: 0, - color: '#FF0000', - }, - { - stop: 10, - color: '#00FF00', - }, - ], - }, - getOrdinalFieldMeta - ); + const colorStyle = makeProperty({ + type: COLOR_MAP_TYPE.ORDINAL, + useCustomColorRamp: true, + customColorRamp: [ + { + stop: 0, + color: '#FF0000', + }, + { + stop: 10, + color: '#00FF00', + }, + ], + }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -116,14 +135,11 @@ test('Should render ordinal legend with breaks', async () => { }); test('Should render categorical legend with breaks from default', async () => { - const colorStyle = makeProperty( - { - type: COLOR_MAP_TYPE.CATEGORICAL, - useCustomColorPalette: false, - colorCategory: 'palette_0', - }, - getCategoricalFieldMeta - ); + const colorStyle = makeProperty({ + type: COLOR_MAP_TYPE.CATEGORICAL, + useCustomColorPalette: false, + colorCategory: 'palette_0', + }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -138,27 +154,24 @@ test('Should render categorical legend with breaks from default', async () => { }); test('Should render categorical legend with breaks from custom', async () => { - const colorStyle = makeProperty( - { - type: COLOR_MAP_TYPE.CATEGORICAL, - useCustomColorPalette: true, - customColorPalette: [ - { - stop: null, //should include the default stop - color: '#FFFF00', - }, - { - stop: 'US_STOP', - color: '#FF0000', - }, - { - stop: 'CN_STOP', - color: '#00FF00', - }, - ], - }, - getCategoricalFieldMeta - ); + const colorStyle = makeProperty({ + type: COLOR_MAP_TYPE.CATEGORICAL, + useCustomColorPalette: true, + customColorPalette: [ + { + stop: null, //should include the default stop + color: '#FFFF00', + }, + { + stop: 'US_STOP', + color: '#FF0000', + }, + { + stop: 'CN_STOP', + color: '#00FF00', + }, + ], + }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -182,11 +195,10 @@ test('Should pluck the categorical style-meta', async () => { const colorStyle = makeProperty({ type: COLOR_MAP_TYPE.CATEGORICAL, colorCategory: 'palette_0', - getCategoricalFieldMeta, }); const features = makeFeatures(['CN', 'CN', 'US', 'CN', 'US', 'IN']); - const meta = colorStyle.pluckStyleMetaFromFeatures(features); + const meta = colorStyle.pluckCategoricalStyleMetaFromFeatures(features); expect(meta).toEqual({ categories: [ @@ -201,10 +213,9 @@ test('Should pluck the categorical style-meta from fieldmeta', async () => { const colorStyle = makeProperty({ type: COLOR_MAP_TYPE.CATEGORICAL, colorCategory: 'palette_0', - getCategoricalFieldMeta, }); - const meta = colorStyle.pluckStyleMetaFromFieldMetaData({ + const meta = colorStyle.pluckCategoricalStyleMetaFromFieldMetaData({ foobar: { buckets: [ { diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_icon_property.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_icon_property.js index c0e56f962db74..c492efbdf4ba3 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_icon_property.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_icon_property.js @@ -62,7 +62,7 @@ export class DynamicIconProperty extends DynamicStyleProperty { } return assignCategoriesToPalette({ - categories: _.get(this.getFieldMeta(), 'categories', []), + categories: _.get(this.getCategoryFieldMeta(), 'categories', []), paletteValues: getIconPalette(this._options.iconPaletteId), }); } diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_size_property.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_size_property.js index dfc5c530cc90f..77f2d09982291 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_size_property.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_size_property.js @@ -43,8 +43,8 @@ function getSymbolSizeIcons() { } export class DynamicSizeProperty extends DynamicStyleProperty { - constructor(options, styleName, field, getFieldMeta, getFieldFormatter, isSymbolizedAsIcon) { - super(options, styleName, field, getFieldMeta, getFieldFormatter); + constructor(options, styleName, field, vectorLayer, getFieldFormatter, isSymbolizedAsIcon) { + super(options, styleName, field, vectorLayer, getFieldFormatter); this._isSymbolizedAsIcon = isSymbolizedAsIcon; } diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js index e40c82e6276c7..19e80f330378b 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js @@ -7,7 +7,12 @@ import _ from 'lodash'; import { AbstractStyleProperty } from './style_property'; import { DEFAULT_SIGMA } from '../vector_style_defaults'; -import { COLOR_PALETTE_MAX_SIZE, STYLE_TYPE } from '../../../../../common/constants'; +import { + COLOR_PALETTE_MAX_SIZE, + STYLE_TYPE, + SOURCE_META_ID_ORIGIN, + FIELD_ORIGIN, +} from '../../../../../common/constants'; import { scaleValue, getComputedFieldName } from '../style_util'; import React from 'react'; import { OrdinalLegend } from './components/ordinal_legend'; @@ -17,10 +22,10 @@ import { OrdinalFieldMetaOptionsPopover } from '../components/ordinal_field_meta export class DynamicStyleProperty extends AbstractStyleProperty { static type = STYLE_TYPE.DYNAMIC; - constructor(options, styleName, field, getFieldMeta, getFieldFormatter) { + constructor(options, styleName, field, vectorLayer, getFieldFormatter) { super(options, styleName); this._field = field; - this._getFieldMeta = getFieldMeta; + this._layer = vectorLayer; this._getFieldFormatter = getFieldFormatter; } @@ -30,8 +35,57 @@ export class DynamicStyleProperty extends AbstractStyleProperty { return fieldSource && field ? fieldSource.getValueSuggestions(field, query) : []; }; - getFieldMeta() { - return this._getFieldMeta && this._field ? this._getFieldMeta(this._field.getName()) : null; + _getStyleMetaDataRequestId(fieldName) { + if (this.getFieldOrigin() === FIELD_ORIGIN.SOURCE) { + return SOURCE_META_ID_ORIGIN; + } + + const join = this._layer.getValidJoins().find(join => { + return join.getRightJoinSource().hasMatchingMetricField(fieldName); + }); + return join ? join.getSourceMetaDataRequestId() : null; + } + + getRangeFieldMeta() { + const style = this._layer.getStyle(); + const styleMeta = style.getStyleMeta(); + const fieldName = this.getFieldName(); + const rangeFieldMetaFromLocalFeatures = styleMeta.getRangeFieldMetaDescriptor(fieldName); + + const dataRequestId = this._getStyleMetaDataRequestId(fieldName); + if (!dataRequestId) { + return rangeFieldMetaFromLocalFeatures; + } + + const styleMetaDataRequest = this._layer.findDataRequestById(dataRequestId); + if (!styleMetaDataRequest || !styleMetaDataRequest.hasData()) { + return rangeFieldMetaFromLocalFeatures; + } + + const data = styleMetaDataRequest.getData(); + const rangeFieldMeta = this.pluckOrdinalStyleMetaFromFieldMetaData(data); + return rangeFieldMeta ? rangeFieldMeta : rangeFieldMetaFromLocalFeatures; + } + + getCategoryFieldMeta() { + const style = this._layer.getStyle(); + const styleMeta = style.getStyleMeta(); + const fieldName = this.getFieldName(); + const rangeFieldMetaFromLocalFeatures = styleMeta.getCategoryFieldMetaDescriptor(fieldName); + + const dataRequestId = this._getStyleMetaDataRequestId(fieldName); + if (!dataRequestId) { + return rangeFieldMetaFromLocalFeatures; + } + + const styleMetaDataRequest = this._layer.findDataRequestById(dataRequestId); + if (!styleMetaDataRequest || !styleMetaDataRequest.hasData()) { + return rangeFieldMetaFromLocalFeatures; + } + + const data = styleMetaDataRequest.getData(); + const rangeFieldMeta = this.pluckCategoricalStyleMetaFromFieldMetaData(data); + return rangeFieldMeta ? rangeFieldMeta : rangeFieldMetaFromLocalFeatures; } getField() { @@ -121,7 +175,11 @@ export class DynamicStyleProperty extends AbstractStyleProperty { return _.get(this.getOptions(), 'fieldMetaOptions', {}); } - _pluckOrdinalStyleMetaFromFeatures(features) { + pluckOrdinalStyleMetaFromFeatures(features) { + if (!this.isOrdinal()) { + return null; + } + const name = this.getField().getName(); let min = Infinity; let max = -Infinity; @@ -143,7 +201,11 @@ export class DynamicStyleProperty extends AbstractStyleProperty { }; } - _pluckCategoricalStyleMetaFromFeatures(features) { + pluckCategoricalStyleMetaFromFeatures(features) { + if (!this.isCategorical()) { + return null; + } + const fieldName = this.getField().getName(); const counts = new Map(); for (let i = 0; i < features.length; i++) { @@ -173,17 +235,11 @@ export class DynamicStyleProperty extends AbstractStyleProperty { }; } - pluckStyleMetaFromFeatures(features) { - if (this.isOrdinal()) { - return this._pluckOrdinalStyleMetaFromFeatures(features); - } else if (this.isCategorical()) { - return this._pluckCategoricalStyleMetaFromFeatures(features); - } else { + pluckOrdinalStyleMetaFromFieldMetaData(fieldMetaData) { + if (!this.isOrdinal()) { return null; } - } - _pluckOrdinalStyleMetaFromFieldMetaData(fieldMetaData) { const stats = fieldMetaData[this._field.getRootName()]; if (!stats) { return null; @@ -203,7 +259,11 @@ export class DynamicStyleProperty extends AbstractStyleProperty { }; } - _pluckCategoricalStyleMetaFromFieldMetaData(fieldMetaData) { + pluckCategoricalStyleMetaFromFieldMetaData(fieldMetaData) { + if (!this.isCategorical()) { + return null; + } + const rootFieldName = this._field.getRootName(); if (!fieldMetaData[rootFieldName] || !fieldMetaData[rootFieldName].buckets) { return null; @@ -220,16 +280,6 @@ export class DynamicStyleProperty extends AbstractStyleProperty { }; } - pluckStyleMetaFromFieldMetaData(fieldMetaData) { - if (this.isOrdinal()) { - return this._pluckOrdinalStyleMetaFromFieldMetaData(fieldMetaData); - } else if (this.isCategorical()) { - return this._pluckCategoricalStyleMetaFromFieldMetaData(fieldMetaData); - } else { - return null; - } - } - formatField(value) { if (this.getField()) { const fieldName = this.getField().getName(); @@ -247,7 +297,7 @@ export class DynamicStyleProperty extends AbstractStyleProperty { const valueAsFloat = parseFloat(value); if (this.isOrdinalScaled()) { - return scaleValue(valueAsFloat, this.getFieldMeta()); + return scaleValue(valueAsFloat, this.getRangeFieldMeta()); } if (isNaN(valueAsFloat)) { return 0; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/style_meta.ts b/x-pack/legacy/plugins/maps/public/layers/styles/vector/style_meta.ts new file mode 100644 index 0000000000000..646b88d005af7 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/style_meta.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + StyleMetaDescriptor, + RangeFieldMeta, + CategoryFieldMeta, +} from '../../../../common/descriptor_types'; + +export class StyleMeta { + private readonly _descriptor: StyleMetaDescriptor; + constructor(styleMetaDescriptor: StyleMetaDescriptor | null | undefined) { + this._descriptor = styleMetaDescriptor ? styleMetaDescriptor : { fieldMeta: {} }; + } + + getRangeFieldMetaDescriptor(fieldName: string): RangeFieldMeta | null { + return this._descriptor && this._descriptor.fieldMeta[fieldName] + ? this._descriptor.fieldMeta[fieldName].range + : null; + } + + getCategoryFieldMetaDescriptor(fieldName: string): CategoryFieldMeta | null { + return this._descriptor && this._descriptor.fieldMeta[fieldName] + ? this._descriptor.fieldMeta[fieldName].categories + : null; + } + + isPointsOnly(): boolean { + return this._descriptor.geometryTypes ? !!this._descriptor.geometryTypes.isPointsOnly : false; + } + + isLinesOnly(): boolean { + return this._descriptor.geometryTypes ? !!this._descriptor.geometryTypes.isLinesOnly : false; + } + + isPolygonsOnly(): boolean { + return this._descriptor.geometryTypes ? !!this._descriptor.geometryTypes.isPolygonsOnly : false; + } +} diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.js index 053aa114d94ae..528c5a9bfdc85 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.js @@ -18,11 +18,11 @@ import { GEO_JSON_TYPE, FIELD_ORIGIN, STYLE_TYPE, - SOURCE_META_ID_ORIGIN, SOURCE_FORMATTERS_ID_ORIGIN, LAYER_STYLE_TYPE, DEFAULT_ICON, } from '../../../../common/constants'; +import { StyleMeta } from './style_meta'; import { VectorIcon } from './components/legend/vector_icon'; import { VectorStyleLegend } from './components/legend/vector_style_legend'; import { VECTOR_SHAPE_TYPES } from '../../sources/vector_feature_types'; @@ -71,6 +71,8 @@ export class VectorStyle extends AbstractStyle { ...VectorStyle.createDescriptor(descriptor.properties, descriptor.isTimeAware), }; + this._styleMeta = new StyleMeta(this._descriptor.__styleMeta); + this._symbolizeAsStyleProperty = new SymbolizeAsProperty( this._descriptor.properties[VECTOR_STYLES.SYMBOLIZE_AS].options, VECTOR_STYLES.SYMBOLIZE_AS @@ -272,7 +274,7 @@ export class VectorStyle extends AbstractStyle { } } - const featuresMeta = { + const styleMeta = { geometryTypes: { isPointsOnly: isOnlySingleFeatureType( VECTOR_SHAPE_TYPES.POINT, @@ -290,23 +292,32 @@ export class VectorStyle extends AbstractStyle { hasFeatureType ), }, + fieldMeta: {}, }; const dynamicProperties = this.getDynamicPropertiesArray(); if (dynamicProperties.length === 0 || features.length === 0) { // no additional meta data to pull from source data request. - return featuresMeta; + return styleMeta; } dynamicProperties.forEach(dynamicProperty => { - const styleMeta = dynamicProperty.pluckStyleMetaFromFeatures(features); - if (styleMeta) { - const name = dynamicProperty.getField().getName(); - featuresMeta[name] = styleMeta; + const categoricalStyleMeta = dynamicProperty.pluckCategoricalStyleMetaFromFeatures(features); + const ordinalStyleMeta = dynamicProperty.pluckOrdinalStyleMetaFromFeatures(features); + const name = dynamicProperty.getField().getName(); + if (!styleMeta.fieldMeta[name]) { + styleMeta.fieldMeta[name] = {}; + } + if (categoricalStyleMeta) { + styleMeta.fieldMeta[name].categories = categoricalStyleMeta; + } + + if (ordinalStyleMeta) { + styleMeta.fieldMeta[name].range = ordinalStyleMeta; } }); - return featuresMeta; + return styleMeta; } getSourceFieldNames() { @@ -335,15 +346,15 @@ export class VectorStyle extends AbstractStyle { } _getIsPointsOnly = () => { - return _.get(this._getStyleMeta(), 'geometryTypes.isPointsOnly', false); + return this._styleMeta.isPointsOnly(); }; _getIsLinesOnly = () => { - return _.get(this._getStyleMeta(), 'geometryTypes.isLinesOnly', false); + return this._styleMeta.isLinesOnly(); }; _getIsPolygonsOnly = () => { - return _.get(this._getStyleMeta(), 'geometryTypes.isPolygonsOnly', false); + return this._styleMeta.isPolygonsOnly(); }; _getDynamicPropertyByFieldName(fieldName) { @@ -353,39 +364,9 @@ export class VectorStyle extends AbstractStyle { }); } - _getFieldMeta = fieldName => { - const fieldMetaFromLocalFeatures = _.get(this._descriptor, ['__styleMeta', fieldName]); - - const dynamicProp = this._getDynamicPropertyByFieldName(fieldName); - if (!dynamicProp || !dynamicProp.isFieldMetaEnabled()) { - return fieldMetaFromLocalFeatures; - } - - let dataRequestId; - if (dynamicProp.getFieldOrigin() === FIELD_ORIGIN.SOURCE) { - dataRequestId = SOURCE_META_ID_ORIGIN; - } else { - const join = this._layer.getValidJoins().find(join => { - return join.getRightJoinSource().hasMatchingMetricField(fieldName); - }); - if (join) { - dataRequestId = join.getSourceMetaDataRequestId(); - } - } - - if (!dataRequestId) { - return fieldMetaFromLocalFeatures; - } - - const styleMetaDataRequest = this._layer._findDataRequestById(dataRequestId); - if (!styleMetaDataRequest || !styleMetaDataRequest.hasData()) { - return fieldMetaFromLocalFeatures; - } - - const data = styleMetaDataRequest.getData(); - const fieldMeta = dynamicProp.pluckStyleMetaFromFieldMetaData(data); - return fieldMeta ? fieldMeta : fieldMetaFromLocalFeatures; - }; + getStyleMeta() { + return this._styleMeta; + } _getFieldFormatter = fieldName => { const dynamicProp = this._getDynamicPropertyByFieldName(fieldName); @@ -409,7 +390,7 @@ export class VectorStyle extends AbstractStyle { return null; } - const formattersDataRequest = this._layer._findDataRequestById(dataRequestId); + const formattersDataRequest = this._layer.findDataRequestById(dataRequestId); if (!formattersDataRequest || !formattersDataRequest.hasData()) { return null; } @@ -418,10 +399,6 @@ export class VectorStyle extends AbstractStyle { return formatters[fieldName]; }; - _getStyleMeta = () => { - return _.get(this._descriptor, '__styleMeta', {}); - }; - _getSymbolId() { return this.arePointsSymbolizedAsCircles() ? undefined @@ -623,7 +600,7 @@ export class VectorStyle extends AbstractStyle { descriptor.options, styleName, field, - this._getFieldMeta, + this._layer, this._getFieldFormatter, isSymbolizedAsIcon ); @@ -643,7 +620,7 @@ export class VectorStyle extends AbstractStyle { descriptor.options, styleName, field, - this._getFieldMeta, + this._layer, this._getFieldFormatter ); } else { @@ -658,7 +635,13 @@ export class VectorStyle extends AbstractStyle { return new StaticOrientationProperty(descriptor.options, styleName); } else if (descriptor.type === DynamicStyleProperty.type) { const field = this._makeField(descriptor.options.field); - return new DynamicOrientationProperty(descriptor.options, styleName, field); + return new DynamicOrientationProperty( + descriptor.options, + styleName, + field, + this._layer, + this._getFieldFormatter + ); } else { throw new Error(`${descriptor} not implemented`); } @@ -675,7 +658,7 @@ export class VectorStyle extends AbstractStyle { descriptor.options, VECTOR_STYLES.LABEL_TEXT, field, - this._getFieldMeta, + this._layer, this._getFieldFormatter ); } else { @@ -694,7 +677,7 @@ export class VectorStyle extends AbstractStyle { descriptor.options, VECTOR_STYLES.ICON, field, - this._getFieldMeta, + this._layer, this._getFieldFormatter ); } else { diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.test.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.test.js index cc52d44aed8d3..66b7ae5e02c5f 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.test.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.test.js @@ -279,8 +279,8 @@ describe('pluckStyleMetaFromSourceDataRequest', () => { new MockSource() ); - const featuresMeta = await vectorStyle.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); - expect(featuresMeta.myDynamicField).toEqual({ + const styleMeta = await vectorStyle.pluckStyleMetaFromSourceDataRequest(sourceDataRequest); + expect(styleMeta.fieldMeta.myDynamicField.range).toEqual({ delta: 9, max: 10, min: 1, diff --git a/x-pack/legacy/plugins/maps/public/layers/vector_layer.js b/x-pack/legacy/plugins/maps/public/layers/vector_layer.js index b03dfc38f3841..32fdbcf965414 100644 --- a/x-pack/legacy/plugins/maps/public/layers/vector_layer.js +++ b/x-pack/legacy/plugins/maps/public/layers/vector_layer.js @@ -61,6 +61,10 @@ export class VectorLayer extends AbstractLayer { this._style = new VectorStyle(this._descriptor.style, this._source, this); } + getStyle() { + return this._style; + } + destroy() { if (this._source) { this._source.destroy(); @@ -227,7 +231,7 @@ export class VectorLayer extends AbstractLayer { return indexPatternIds; } - _findDataRequestById(sourceDataId) { + findDataRequestById(sourceDataId) { return this._dataRequests.find(dataRequest => dataRequest.getDataId() === sourceDataId); } @@ -248,7 +252,7 @@ export class VectorLayer extends AbstractLayer { sourceQuery: joinSource.getWhereQuery(), applyGlobalQuery: joinSource.getApplyGlobalQuery(), }; - const prevDataRequest = this._findDataRequestById(sourceDataId); + const prevDataRequest = this.findDataRequestById(sourceDataId); const canSkipFetch = await canSkipSourceUpdate({ source: joinSource, @@ -471,7 +475,7 @@ export class VectorLayer extends AbstractLayer { isTimeAware: this._style.isTimeAware() && (await source.isTimeAware()), timeFilters: dataFilters.timeFilters, }; - const prevDataRequest = this._findDataRequestById(dataRequestId); + const prevDataRequest = this.findDataRequestById(dataRequestId); const canSkipFetch = canSkipStyleMetaUpdate({ prevDataRequest, nextMeta }); if (canSkipFetch) { return; @@ -547,7 +551,7 @@ export class VectorLayer extends AbstractLayer { const nextMeta = { fieldNames: _.uniq(fieldNames).sort(), }; - const prevDataRequest = this._findDataRequestById(dataRequestId); + const prevDataRequest = this.findDataRequestById(dataRequestId); const canSkipUpdate = canSkipFormattersUpdate({ prevDataRequest, nextMeta }); if (canSkipUpdate) { return; From 91a5b17cfd058ecab180094b29900b9c34e50f6a Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Thu, 5 Mar 2020 11:29:44 -0700 Subject: [PATCH 05/25] [SIEM] [Case] All cases page design updates (#59248) --- .../components/filter_popover/index.tsx | 119 +++++++++ .../__snapshots__/utility_bar.test.tsx.snap | 0 .../utility_bar_action.test.tsx.snap | 0 .../utility_bar_group.test.tsx.snap | 0 .../utility_bar_section.test.tsx.snap | 0 .../utility_bar_text.test.tsx.snap | 0 .../utility_bar/index.ts | 0 .../utility_bar/styles.tsx | 0 .../utility_bar/utility_bar.test.tsx | 2 +- .../utility_bar/utility_bar.tsx | 0 .../utility_bar/utility_bar_action.test.tsx | 2 +- .../utility_bar/utility_bar_action.tsx | 2 +- .../utility_bar/utility_bar_group.test.tsx | 2 +- .../utility_bar/utility_bar_group.tsx | 0 .../utility_bar/utility_bar_section.test.tsx | 2 +- .../utility_bar/utility_bar_section.tsx | 0 .../utility_bar/utility_bar_text.test.tsx | 2 +- .../utility_bar/utility_bar_text.tsx | 0 .../siem/public/containers/case/api.ts | 8 +- .../siem/public/containers/case/constants.ts | 1 + .../siem/public/containers/case/types.ts | 2 +- .../public/containers/case/use_get_cases.tsx | 200 +++++++++++---- .../containers/case/use_update_case.tsx | 2 +- .../plugins/siem/public/pages/case/case.tsx | 16 -- .../components/all_cases/__mock__/index.tsx | 9 +- .../case/components/all_cases/actions.tsx | 60 +++++ .../case/components/all_cases/columns.tsx | 101 +++++--- .../case/components/all_cases/index.test.tsx | 36 ++- .../pages/case/components/all_cases/index.tsx | 229 ++++++++++++++---- .../components/all_cases/table_filters.tsx | 66 +++-- .../case/components/all_cases/translations.ts | 55 +++-- .../case/components/bulk_actions/index.tsx | 72 ++++++ .../components/bulk_actions/translations.ts | 28 +++ .../components/open_closed_stats/index.tsx | 38 +++ .../siem/public/pages/case/translations.ts | 19 +- .../components/activity_monitor/index.tsx | 2 +- .../signals/signals_utility_bar/index.tsx | 2 +- .../detection_engine/rules/all/index.tsx | 2 +- 38 files changed, 863 insertions(+), 216 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/public/components/filter_popover/index.tsx rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/__snapshots__/utility_bar.test.tsx.snap (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/index.ts (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/styles.tsx (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar.test.tsx (98%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar.tsx (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_action.test.tsx (95%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_action.tsx (97%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_group.test.tsx (93%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_group.tsx (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_section.test.tsx (94%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_section.tsx (100%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_text.test.tsx (92%) rename x-pack/legacy/plugins/siem/public/components/{detection_engine => }/utility_bar/utility_bar_text.tsx (100%) create mode 100644 x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/index.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/translations.ts create mode 100644 x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx diff --git a/x-pack/legacy/plugins/siem/public/components/filter_popover/index.tsx b/x-pack/legacy/plugins/siem/public/components/filter_popover/index.tsx new file mode 100644 index 0000000000000..1d269dffeccf5 --- /dev/null +++ b/x-pack/legacy/plugins/siem/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; + * you may not use this file except in compliance with the Elastic License. + */ + +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>; + options: string[]; + optionsEmptyLabel: string; + selectedOptions: string[]; +} + +const ScrollableDiv = styled.div` + max-height: 250px; + overflow: auto; +`; + +export const toggleSelectedGroup = ( + group: string, + selectedGroups: string[], + setSelectedGroups: Dispatch> +): void => { + const selectedGroupIndex = selectedGroups.indexOf(group); + const updatedSelectedGroups = [...selectedGroups]; + if (selectedGroupIndex >= 0) { + updatedSelectedGroups.splice(selectedGroupIndex, 1); + } else { + updatedSelectedGroups.push(group); + } + return setSelectedGroups(updatedSelectedGroups); +}; + +/** + * 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 => toggleSelectedGroup(option, selectedOptions, onSelectedOptionsChanged), + [selectedOptions, onSelectedOptionsChanged] + ); + + return ( + 0} + numActiveFilters={selectedOptions.length} + > + {buttonLabel} + + } + isOpen={isPopoverOpen} + closePopover={setIsPopoverOpenCb} + panelPaddingSize="none" + > + + {options.map((option, index) => ( + + {option} + + ))} + + {options.length === 0 && ( + + + + {optionsEmptyLabel} + + + + )} + + ); +}; + +FilterPopoverComponent.displayName = 'FilterPopoverComponent'; + +export const FilterPopover = React.memo(FilterPopoverComponent); + +FilterPopover.displayName = 'FilterPopover'; diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar.test.tsx.snap rename to x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap rename to x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap rename to x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap rename to x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap rename to x-pack/legacy/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/index.ts b/x-pack/legacy/plugins/siem/public/components/utility_bar/index.ts similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/index.ts rename to x-pack/legacy/plugins/siem/public/components/utility_bar/index.ts diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/styles.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/styles.tsx similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/styles.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/styles.tsx diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar.test.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar.test.tsx similarity index 98% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar.test.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar.test.tsx index eae0fc4ff422b..5fd010362be10 100644 --- a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar.test.tsx @@ -8,7 +8,7 @@ import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../mock'; import { UtilityBar, UtilityBarAction, diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar.tsx similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar.tsx diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_action.test.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_action.test.tsx similarity index 95% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_action.test.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_action.test.tsx index 2a8a71955a986..09c62773fddd1 100644 --- a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_action.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_action.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../mock'; import { UtilityBarAction } from './index'; describe('UtilityBarAction', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_action.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_action.tsx similarity index 97% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_action.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_action.tsx index 4e850a0a11957..d3e2be0e8f816 100644 --- a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_action.tsx +++ b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_action.tsx @@ -7,7 +7,7 @@ import { EuiPopover } from '@elastic/eui'; import React, { useCallback, useState } from 'react'; -import { LinkIcon, LinkIconProps } from '../../link_icon'; +import { LinkIcon, LinkIconProps } from '../link_icon'; import { BarAction } from './styles'; const Popover = React.memo( diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_group.test.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_group.test.tsx similarity index 93% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_group.test.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_group.test.tsx index e18e7d5e0b524..8e184e5aaec30 100644 --- a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_group.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_group.test.tsx @@ -7,7 +7,7 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../mock'; import { UtilityBarGroup, UtilityBarText } from './index'; describe('UtilityBarGroup', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_group.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_group.tsx similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_group.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_group.tsx diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_section.test.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_section.test.tsx similarity index 94% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_section.test.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_section.test.tsx index f849fa4b4ee46..c6037c75670eb 100644 --- a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_section.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_section.test.tsx @@ -7,7 +7,7 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../mock'; import { UtilityBarGroup, UtilityBarSection, UtilityBarText } from './index'; describe('UtilityBarSection', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_section.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_section.tsx similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_section.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_section.tsx diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_text.test.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_text.test.tsx similarity index 92% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_text.test.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_text.test.tsx index 230dd80b1a86b..fcfc2b6b0cefa 100644 --- a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_text.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_text.test.tsx @@ -7,7 +7,7 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../mock'; import { UtilityBarText } from './index'; describe('UtilityBarText', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_text.tsx b/x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_text.tsx similarity index 100% rename from x-pack/legacy/plugins/siem/public/components/detection_engine/utility_bar/utility_bar_text.tsx rename to x-pack/legacy/plugins/siem/public/components/utility_bar/utility_bar_text.tsx diff --git a/x-pack/legacy/plugins/siem/public/containers/case/api.ts b/x-pack/legacy/plugins/siem/public/containers/case/api.ts index f1d87ca58b44b..ff03a3799018c 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/api.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/api.ts @@ -35,6 +35,7 @@ export const getCase = async (caseId: string, includeComments: boolean = true): export const getCases = async ({ filterOptions = { search: '', + state: 'open', tags: [], }, queryParams = { @@ -44,7 +45,12 @@ export const getCases = async ({ sortOrder: 'desc', }, }: FetchCasesProps): Promise => { - const tags = [...(filterOptions.tags?.map(t => `case-workflow.attributes.tags: ${t}`) ?? [])]; + const stateFilter = `case-workflow.attributes.state: ${filterOptions.state}`; + const tags = [ + ...(filterOptions.tags?.reduce((acc, t) => [...acc, `case-workflow.attributes.tags: ${t}`], [ + stateFilter, + ]) ?? [stateFilter]), + ]; const query = { ...queryParams, filter: tags.join(' AND '), diff --git a/x-pack/legacy/plugins/siem/public/containers/case/constants.ts b/x-pack/legacy/plugins/siem/public/containers/case/constants.ts index 031ba1c128a24..ac62ba7b6f997 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/constants.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/constants.ts @@ -13,4 +13,5 @@ export const FETCH_SUCCESS = 'FETCH_SUCCESS'; export const POST_NEW_CASE = 'POST_NEW_CASE'; export const POST_NEW_COMMENT = 'POST_NEW_COMMENT'; export const UPDATE_FILTER_OPTIONS = 'UPDATE_FILTER_OPTIONS'; +export const UPDATE_TABLE_SELECTIONS = 'UPDATE_TABLE_SELECTIONS'; export const UPDATE_QUERY_PARAMS = 'UPDATE_QUERY_PARAMS'; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/types.ts b/x-pack/legacy/plugins/siem/public/containers/case/types.ts index 75ed6f7c2366d..9cc9f519f3a62 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/types.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/types.ts @@ -71,6 +71,7 @@ export interface QueryParams { export interface FilterOptions { search: string; + state: string; tags: string[]; } @@ -89,7 +90,6 @@ export interface AllCases { } export enum SortFieldCase { createdAt = 'createdAt', - state = 'state', updatedAt = 'updatedAt', } diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx index 4037823ccfc94..e73b251477bf3 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx @@ -4,58 +4,87 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dispatch, SetStateAction, useEffect, useReducer, useState } from 'react'; +import { Dispatch, SetStateAction, useCallback, useEffect, useReducer, useState } from 'react'; import { isEqual } from 'lodash/fp'; -import { - DEFAULT_TABLE_ACTIVE_PAGE, - DEFAULT_TABLE_LIMIT, - FETCH_FAILURE, - FETCH_INIT, - FETCH_SUCCESS, - UPDATE_QUERY_PARAMS, - UPDATE_FILTER_OPTIONS, -} from './constants'; -import { AllCases, SortFieldCase, FilterOptions, QueryParams } from './types'; -import { getTypedPayload } from './utils'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; +import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case } from './types'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; import { useStateToaster } from '../../components/toasters'; import * as i18n from './translations'; -import { getCases } from './api'; +import { UpdateByKey } from './use_update_case'; +import { getCases, updateCaseProperty } from './api'; export interface UseGetCasesState { + caseCount: CaseCount; data: AllCases; - isLoading: boolean; + filterOptions: FilterOptions; isError: boolean; + loading: string[]; queryParams: QueryParams; - filterOptions: FilterOptions; + selectedCases: Case[]; +} + +export interface CaseCount { + open: number; + closed: number; } -export interface Action { - type: string; - payload?: AllCases | Partial | FilterOptions; +export interface UpdateCase extends UpdateByKey { + caseId: string; + version: string; } + +export type Action = + | { type: 'FETCH_INIT'; payload: string } + | { type: 'FETCH_CASE_COUNT_SUCCESS'; payload: Partial } + | { type: 'FETCH_CASES_SUCCESS'; payload: AllCases } + | { type: 'FETCH_FAILURE'; payload: string } + | { type: 'FETCH_UPDATE_CASE_SUCCESS' } + | { type: 'UPDATE_FILTER_OPTIONS'; payload: FilterOptions } + | { type: 'UPDATE_QUERY_PARAMS'; payload: Partial } + | { type: 'UPDATE_TABLE_SELECTIONS'; payload: Case[] }; + const dataFetchReducer = (state: UseGetCasesState, action: Action): UseGetCasesState => { switch (action.type) { - case FETCH_INIT: + case 'FETCH_INIT': return { ...state, - isLoading: true, 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_CASE_COUNT_SUCCESS': + return { + ...state, + caseCount: { + ...state.caseCount, + ...action.payload, + }, + loading: state.loading.filter(e => e !== 'caseCount'), }; - case FETCH_SUCCESS: + case 'FETCH_CASES_SUCCESS': return { ...state, - isLoading: false, isError: false, - data: getTypedPayload(action.payload), + data: action.payload, + loading: state.loading.filter(e => e !== 'cases'), }; - case FETCH_FAILURE: + case 'FETCH_FAILURE': return { ...state, - isLoading: false, isError: true, + loading: state.loading.filter(e => e !== action.payload), }; - case UPDATE_QUERY_PARAMS: + case 'UPDATE_FILTER_OPTIONS': + return { + ...state, + filterOptions: action.payload, + }; + case 'UPDATE_QUERY_PARAMS': return { ...state, queryParams: { @@ -63,10 +92,10 @@ const dataFetchReducer = (state: UseGetCasesState, action: Action): UseGetCasesS ...action.payload, }, }; - case UPDATE_FILTER_OPTIONS: + case 'UPDATE_TABLE_SELECTIONS': return { ...state, - filterOptions: getTypedPayload(action.payload), + selectedCases: action.payload, }; default: throw new Error(); @@ -74,51 +103,64 @@ const dataFetchReducer = (state: UseGetCasesState, action: Action): UseGetCasesS }; const initialData: AllCases = { + cases: [], page: 0, perPage: 0, total: 0, - cases: [], }; -export const useGetCases = (): [ - UseGetCasesState, - Dispatch>>, - Dispatch> -] => { +interface UseGetCases extends UseGetCasesState { + dispatchUpdateCaseProperty: Dispatch; + getCaseCount: Dispatch; + setFilters: Dispatch>; + setQueryParams: Dispatch>>; + setSelectedCases: Dispatch; +} +export const useGetCases = (): UseGetCases => { const [state, dispatch] = useReducer(dataFetchReducer, { - isLoading: false, - isError: false, + caseCount: { + open: 0, + closed: 0, + }, data: initialData, filterOptions: { search: '', + state: 'open', tags: [], }, + isError: false, + loading: [], queryParams: { page: DEFAULT_TABLE_ACTIVE_PAGE, perPage: DEFAULT_TABLE_LIMIT, sortField: SortFieldCase.createdAt, sortOrder: 'desc', }, + selectedCases: [], }); - const [queryParams, setQueryParams] = useState>(state.queryParams); - const [filterQuery, setFilters] = useState(state.filterOptions); const [, dispatchToaster] = useStateToaster(); + const [filterQuery, setFilters] = useState(state.filterOptions); + const [queryParams, setQueryParams] = useState>(state.queryParams); + + const setSelectedCases = useCallback((mySelectedCases: Case[]) => { + dispatch({ type: 'UPDATE_TABLE_SELECTIONS', payload: mySelectedCases }); + }, []); useEffect(() => { if (!isEqual(queryParams, state.queryParams)) { - dispatch({ type: UPDATE_QUERY_PARAMS, payload: queryParams }); + dispatch({ type: 'UPDATE_QUERY_PARAMS', payload: queryParams }); } }, [queryParams, state.queryParams]); useEffect(() => { if (!isEqual(filterQuery, state.filterOptions)) { - dispatch({ type: UPDATE_FILTER_OPTIONS, payload: filterQuery }); + dispatch({ type: 'UPDATE_FILTER_OPTIONS', payload: filterQuery }); } }, [filterQuery, state.filterOptions]); - useEffect(() => { + const fetchCases = useCallback(() => { let didCancel = false; const fetchData = async () => { - dispatch({ type: FETCH_INIT }); + dispatch({ type: 'FETCH_INIT', payload: 'cases' }); try { const response = await getCases({ filterOptions: state.filterOptions, @@ -126,14 +168,14 @@ export const useGetCases = (): [ }); if (!didCancel) { dispatch({ - type: FETCH_SUCCESS, + type: 'FETCH_CASES_SUCCESS', payload: response, }); } } catch (error) { if (!didCancel) { errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); - dispatch({ type: FETCH_FAILURE }); + dispatch({ type: 'FETCH_FAILURE', payload: 'cases' }); } } }; @@ -142,5 +184,73 @@ export const useGetCases = (): [ didCancel = true; }; }, [state.queryParams, state.filterOptions]); - return [state, setQueryParams, setFilters]; + useEffect(() => fetchCases(), [state.queryParams, state.filterOptions]); + + const getCaseCount = useCallback((caseState: keyof CaseCount) => { + let didCancel = false; + const fetchData = async () => { + dispatch({ type: 'FETCH_INIT', payload: 'caseCount' }); + try { + const response = await getCases({ + filterOptions: { search: '', state: caseState, tags: [] }, + }); + if (!didCancel) { + dispatch({ + type: 'FETCH_CASE_COUNT_SUCCESS', + payload: { [caseState]: response.total }, + }); + } + } catch (error) { + if (!didCancel) { + errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + dispatch({ type: 'FETCH_FAILURE', payload: 'caseCount' }); + } + } + }; + fetchData(); + return () => { + didCancel = true; + }; + }, []); + + const dispatchUpdateCaseProperty = useCallback( + ({ updateKey, updateValue, caseId, version }: UpdateCase) => { + let didCancel = false; + const fetchData = async () => { + dispatch({ type: 'FETCH_INIT', payload: 'caseUpdate' }); + try { + await updateCaseProperty( + caseId, + { [updateKey]: updateValue }, + version ?? '' // saved object versions are typed as string | undefined, hope that's not true + ); + if (!didCancel) { + dispatch({ type: 'FETCH_UPDATE_CASE_SUCCESS' }); + fetchCases(); + getCaseCount('open'); + getCaseCount('closed'); + } + } catch (error) { + if (!didCancel) { + errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + dispatch({ type: 'FETCH_FAILURE', payload: 'caseUpdate' }); + } + } + }; + fetchData(); + return () => { + didCancel = true; + }; + }, + [filterQuery, state.filterOptions] + ); + + return { + ...state, + dispatchUpdateCaseProperty, + getCaseCount, + setFilters, + setQueryParams, + setSelectedCases, + }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx index ebbb1e14dc237..f23be526fbeb7 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx @@ -22,7 +22,7 @@ interface NewCaseState { updateKey: UpdateKey | null; } -interface UpdateByKey { +export interface UpdateByKey { updateKey: UpdateKey; updateValue: Case[UpdateKey]; } diff --git a/x-pack/legacy/plugins/siem/public/pages/case/case.tsx b/x-pack/legacy/plugins/siem/public/pages/case/case.tsx index 15a6d076f1009..9255dee461940 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/case.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/case.tsx @@ -6,29 +6,13 @@ import React from 'react'; -import { EuiButton, EuiButtonIcon, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { CaseHeaderPage } from './components/case_header_page'; import { WrapperPage } from '../../components/wrapper_page'; import { AllCases } from './components/all_cases'; import { SpyRoute } from '../../utils/route/spy_routes'; -import * as i18n from './translations'; -import { getCreateCaseUrl, getConfigureCasesUrl } from '../../components/link_to'; export const CasesPage = React.memo(() => ( <> - - - - - {i18n.CREATE_TITLE} - - - - - - - diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx index 0169493773b74..a054d685399bc 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx @@ -75,7 +75,12 @@ export const useGetCasesMockState: UseGetCasesState = { perPage: 5, total: 10, }, - isLoading: false, + caseCount: { + open: 0, + closed: 0, + }, + loading: [], + selectedCases: [], isError: false, queryParams: { page: 1, @@ -83,5 +88,5 @@ export const useGetCasesMockState: UseGetCasesState = { sortField: SortFieldCase.createdAt, sortOrder: 'desc', }, - filterOptions: { search: '', tags: [] }, + filterOptions: { search: '', tags: [], state: 'open' }, }; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx new file mode 100644 index 0000000000000..5dad19b1e54d3 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; +import { Dispatch } from 'react'; +import { Case } from '../../../../containers/case/types'; + +import * as i18n from './translations'; +import { UpdateCase } from '../../../../containers/case/use_get_cases'; + +interface GetActions { + caseStatus: string; + dispatchUpdate: Dispatch; +} + +export const getActions = ({ + caseStatus, + dispatchUpdate, +}: GetActions): Array> => [ + { + description: i18n.DELETE, + icon: 'trash', + name: i18n.DELETE, + // eslint-disable-next-line no-console + onClick: ({ caseId }: Case) => console.log('TO DO Delete case', caseId), + type: 'icon', + 'data-test-subj': 'action-delete', + }, + caseStatus === 'open' + ? { + description: i18n.CLOSE_CASE, + icon: 'magnet', + name: i18n.CLOSE_CASE, + onClick: (theCase: Case) => + dispatchUpdate({ + updateKey: 'state', + updateValue: 'closed', + caseId: theCase.caseId, + version: theCase.version, + }), + type: 'icon', + 'data-test-subj': 'action-close', + } + : { + description: i18n.REOPEN_CASE, + icon: 'magnet', + name: i18n.REOPEN_CASE, + onClick: (theCase: Case) => + dispatchUpdate({ + updateKey: 'state', + updateValue: 'open', + caseId: theCase.caseId, + version: theCase.version, + }), + type: 'icon', + 'data-test-subj': 'action-open', + }, +]; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx index 9c276d1b24da1..41a2bdf52d5a1 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx @@ -4,7 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ import React from 'react'; -import { EuiBadge, EuiTableFieldDataColumnType, EuiTableComputedColumnType } from '@elastic/eui'; +import { + EuiBadge, + EuiTableFieldDataColumnType, + EuiTableComputedColumnType, + EuiTableActionsColumnType, + EuiAvatar, +} from '@elastic/eui'; +import styled from 'styled-components'; +import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; import { getEmptyTagValue } from '../../../../components/empty_value'; import { Case } from '../../../../containers/case/types'; import { FormattedRelativePreferenceDate } from '../../../../components/formatted_date'; @@ -12,17 +20,61 @@ import { CaseDetailsLink } from '../../../../components/links'; import { TruncatableText } from '../../../../components/truncatable_text'; import * as i18n from './translations'; -export type CasesColumns = EuiTableFieldDataColumnType | EuiTableComputedColumnType; +export type CasesColumns = + | EuiTableFieldDataColumnType + | EuiTableComputedColumnType + | EuiTableActionsColumnType; -const renderStringField = (field: string, dataTestSubj: string) => - field != null ? {field} : getEmptyTagValue(); +const MediumShadeText = styled.p` + color: ${({ theme }) => theme.eui.euiColorMediumShade}; +`; -export const getCasesColumns = (): CasesColumns[] => [ +const Spacer = styled.span` + margin-left: ${({ theme }) => theme.eui.paddingSizes.s}; +`; + +const TempNumberComponent = () => {1}; +TempNumberComponent.displayName = 'TempNumberComponent'; + +export const getCasesColumns = ( + actions: Array> +): CasesColumns[] => [ { name: i18n.NAME, render: (theCase: Case) => { if (theCase.caseId != null && theCase.title != null) { - return {theCase.title}; + const caseDetailsLinkComponent = ( + {theCase.title} + ); + return theCase.state === 'open' ? ( + caseDetailsLinkComponent + ) : ( + <> + + {caseDetailsLinkComponent} + {i18n.CLOSED} + + + ); + } + return getEmptyTagValue(); + }, + }, + { + field: 'createdBy', + name: i18n.REPORTER, + render: (createdBy: Case['createdBy']) => { + if (createdBy != null) { + return ( + <> + + {createdBy.username} + + ); } return getEmptyTagValue(); }, @@ -50,9 +102,16 @@ export const getCasesColumns = (): CasesColumns[] => [ }, truncateText: true, }, + { + align: 'right', + field: 'commentCount', // TO DO once we have commentCount returned in the API: https://github.com/elastic/kibana/issues/58525 + name: i18n.COMMENTS, + sortable: true, + render: TempNumberComponent, + }, { field: 'createdAt', - name: i18n.CREATED_AT, + name: i18n.OPENED_ON, sortable: true, render: (createdAt: Case['createdAt']) => { if (createdAt != null) { @@ -67,31 +126,7 @@ export const getCasesColumns = (): CasesColumns[] => [ }, }, { - field: 'createdBy.username', - name: i18n.REPORTER, - render: (createdBy: Case['createdBy']['username']) => - renderStringField(createdBy, `case-table-column-username`), - }, - { - field: 'updatedAt', - name: i18n.LAST_UPDATED, - sortable: true, - render: (updatedAt: Case['updatedAt']) => { - if (updatedAt != null) { - return ( - - ); - } - return getEmptyTagValue(); - }, - }, - { - field: 'state', - name: i18n.STATE, - sortable: true, - render: (state: Case['state']) => renderStringField(state, `case-table-column-state`), + name: 'Actions', + actions, }, ]; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx index 5a87cf53142f7..dd584f3f716b6 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx @@ -13,13 +13,21 @@ import { useGetCasesMockState } from './__mock__'; import * as apiHook from '../../../../containers/case/use_get_cases'; describe('AllCases', () => { - const setQueryParams = jest.fn(); const setFilters = jest.fn(); + const setQueryParams = jest.fn(); + const setSelectedCases = jest.fn(); + const getCaseCount = jest.fn(); + const dispatchUpdateCaseProperty = jest.fn(); beforeEach(() => { jest.resetAllMocks(); - jest - .spyOn(apiHook, 'useGetCases') - .mockReturnValue([useGetCasesMockState, setQueryParams, setFilters]); + jest.spyOn(apiHook, 'useGetCases').mockReturnValue({ + ...useGetCasesMockState, + dispatchUpdateCaseProperty, + getCaseCount, + setFilters, + setQueryParams, + setSelectedCases, + }); moment.tz.setDefault('UTC'); }); it('should render AllCases', () => { @@ -40,12 +48,6 @@ describe('AllCases', () => { .first() .text() ).toEqual(useGetCasesMockState.data.cases[0].title); - expect( - wrapper - .find(`[data-test-subj="case-table-column-state"]`) - .first() - .text() - ).toEqual(useGetCasesMockState.data.cases[0].state); expect( wrapper .find(`span[data-test-subj="case-table-column-tags-0"]`) @@ -54,7 +56,7 @@ describe('AllCases', () => { ).toEqual(useGetCasesMockState.data.cases[0].tags[0]); expect( wrapper - .find(`[data-test-subj="case-table-column-username"]`) + .find(`[data-test-subj="case-table-column-createdBy"]`) .first() .text() ).toEqual(useGetCasesMockState.data.cases[0].createdBy.username); @@ -64,13 +66,6 @@ describe('AllCases', () => { .first() .prop('value') ).toEqual(useGetCasesMockState.data.cases[0].createdAt); - expect( - wrapper - .find(`[data-test-subj="case-table-column-updatedAt"]`) - .first() - .prop('value') - ).toEqual(useGetCasesMockState.data.cases[0].updatedAt); - expect( wrapper .find(`[data-test-subj="case-table-case-count"]`) @@ -85,12 +80,13 @@ describe('AllCases', () => { ); wrapper - .find('[data-test-subj="tableHeaderCell_state_5"] [data-test-subj="tableHeaderSortButton"]') + .find('[data-test-subj="tableHeaderSortButton"]') + .first() .simulate('click'); expect(setQueryParams).toBeCalledWith({ page: 1, perPage: 5, - sortField: 'state', + sortField: 'createdAt', sortOrder: 'asc', }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx index 3253a036c2990..484d9051ee43f 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx @@ -8,45 +8,85 @@ import React, { useCallback, useMemo } from 'react'; import { EuiBasicTable, EuiButton, + EuiButtonIcon, + EuiContextMenuPanel, EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, EuiLoadingContent, + EuiProgress, EuiTableSortingType, } from '@elastic/eui'; -import { isEmpty } from 'lodash/fp'; +import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; +import styled, { css } from 'styled-components'; import * as i18n from './translations'; import { getCasesColumns } from './columns'; -import { SortFieldCase, Case, FilterOptions } from '../../../../containers/case/types'; +import { Case, FilterOptions, SortFieldCase } from '../../../../containers/case/types'; import { useGetCases } from '../../../../containers/case/use_get_cases'; import { EuiBasicTableOnChange } from '../../../detection_engine/rules/types'; import { Panel } from '../../../../components/panel'; -import { HeaderSection } from '../../../../components/header_section'; import { CasesTableFilters } from './table_filters'; import { UtilityBar, + UtilityBarAction, UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../components/detection_engine/utility_bar'; -import { getCreateCaseUrl } from '../../../../components/link_to'; +} from '../../../../components/utility_bar'; +import { getConfigureCasesUrl, getCreateCaseUrl } from '../../../../components/link_to'; +import { getBulkItems } from '../bulk_actions'; +import { CaseHeaderPage } from '../case_header_page'; +import { OpenClosedStats } from '../open_closed_stats'; +import { getActions } from './actions'; + +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` + .euiFlexGroup--gutterMedium > &.euiFlexItem { + 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.state) { - return SortFieldCase.state; } else if (field === SortFieldCase.updatedAt) { return SortFieldCase.updatedAt; } return SortFieldCase.createdAt; }; export const AllCases = React.memo(() => { - const [ - { data, isLoading, queryParams, filterOptions }, - setQueryParams, + const { + caseCount, + data, + dispatchUpdateCaseProperty, + filterOptions, + getCaseCount, + loading, + queryParams, + selectedCases, setFilters, - ] = useGetCases(); + setQueryParams, + setSelectedCases, + } = useGetCases(); const tableOnChangeCallback = useCallback( ({ page, sort }: EuiBasicTableOnChange) => { @@ -77,7 +117,13 @@ export const AllCases = React.memo(() => { [filterOptions, setFilters] ); - const memoizedGetCasesColumns = useMemo(() => getCasesColumns(), []); + const actions = useMemo( + () => + getActions({ caseStatus: filterOptions.state, dispatchUpdate: dispatchUpdateCaseProperty }), + [filterOptions.state, dispatchUpdateCaseProperty] + ); + + const memoizedGetCasesColumns = useMemo(() => getCasesColumns(actions), [filterOptions.state]); const memoizedPagination = useMemo( () => ({ pageIndex: queryParams.page - 1, @@ -88,55 +134,132 @@ export const AllCases = React.memo(() => { [data, queryParams] ); + const getBulkItemsPopoverContent = useCallback( + (closePopover: () => void) => ( + + ), + [selectedCases, filterOptions.state] + ); + const sorting: EuiTableSortingType = { sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, }; + const euiBasicTableSelectionProps = useMemo>( + () => ({ + selectable: (item: Case) => true, + onSelectionChange: setSelectedCases, + }), + [selectedCases] + ); + const isCasesLoading = useMemo( + () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, + [loading] + ); + const isDataEmpty = useMemo(() => data.total === 0, [data]); return ( - - + <> + + + + -1} + /> + + + -1} + /> + + + + {i18n.CREATE_TITLE} + + + + + + + + {isCasesLoading && !isDataEmpty && } + - - {isLoading && isEmpty(data.cases) && ( - - )} - {!isLoading && !isEmpty(data.cases) && ( - <> - - - - - {i18n.SHOWING_CASES(data.total ?? 0)} - - - - - {i18n.NO_CASES}} - titleSize="xs" - body={i18n.NO_CASES_BODY} - actions={ - - {i18n.ADD_NEW_CASE} - - } - /> - } - onChange={tableOnChangeCallback} - pagination={memoizedPagination} - sorting={sorting} - /> - - )} - + {isCasesLoading && isDataEmpty ? ( +

+ +
+ ) : ( +
+ + + + + {i18n.SHOWING_CASES(data.total ?? 0)} + + + + + {i18n.SELECTED_CASES(selectedCases.length)} + + + {i18n.BULK_ACTIONS} + + + + + {i18n.NO_CASES}} + titleSize="xs" + body={i18n.NO_CASES_BODY} + actions={ + + {i18n.ADD_NEW_CASE} + + } + /> + } + onChange={tableOnChangeCallback} + pagination={memoizedPagination} + selection={euiBasicTableSelectionProps} + sorting={sorting} + /> +
+ )} + + ); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx index e593623788046..5256fb6d7b3ee 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx @@ -6,20 +6,22 @@ import React, { useCallback, useState } from 'react'; import { isEqual } from 'lodash/fp'; -import { EuiFieldSearch, EuiFilterGroup, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { + EuiFieldSearch, + EuiFilterButton, + EuiFilterGroup, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; import * as i18n from './translations'; import { FilterOptions } from '../../../../containers/case/types'; import { useGetTags } from '../../../../containers/case/use_get_tags'; -import { TagsFilterPopover } from '../../../../pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover'; +import { FilterPopover } from '../../../../components/filter_popover'; -interface Initial { - search: string; - tags: string[]; -} interface CasesTableFiltersProps { onFilterChanged: (filterOptions: Partial) => void; - initial: Initial; + initial: FilterOptions; } /** @@ -31,17 +33,18 @@ interface CasesTableFiltersProps { const CasesTableFiltersComponent = ({ onFilterChanged, - initial = { search: '', tags: [] }, + initial = { search: '', tags: [], state: 'open' }, }: CasesTableFiltersProps) => { const [search, setSearch] = useState(initial.search); const [selectedTags, setSelectedTags] = useState(initial.tags); - const [{ isLoading, data }] = useGetTags(); + const [showOpenCases, setShowOpenCases] = useState(initial.state === 'open'); + const [{ data }] = useGetTags(); const handleSelectedTags = useCallback( newTags => { if (!isEqual(newTags, selectedTags)) { setSelectedTags(newTags); - onFilterChanged({ search, tags: newTags }); + onFilterChanged({ tags: newTags }); } }, [search, selectedTags] @@ -51,12 +54,20 @@ const CasesTableFiltersComponent = ({ const trimSearch = newSearch.trim(); if (!isEqual(trimSearch, search)) { setSearch(trimSearch); - onFilterChanged({ tags: selectedTags, search: trimSearch }); + onFilterChanged({ search: trimSearch }); } }, [search, selectedTags] ); - + const handleToggleFilter = useCallback( + showOpen => { + if (showOpen !== showOpenCases) { + setShowOpenCases(showOpen); + onFilterChanged({ state: showOpen ? 'open' : 'closed' }); + } + }, + [showOpenCases] + ); return ( @@ -71,11 +82,32 @@ const CasesTableFiltersComponent = ({ - + {i18n.OPEN_CASES} + + + {i18n.CLOSED_CASES} + + {}} + selectedOptions={[]} + options={[]} + optionsEmptyLabel={i18n.NO_REPORTERS_AVAILABLE} + /> + diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/translations.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/translations.ts index ab8e22ebcf1be..19117136ed046 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/translations.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/translations.ts @@ -8,9 +8,6 @@ import { i18n } from '@kbn/i18n'; export * from '../../translations'; -export const ALL_CASES = i18n.translate('xpack.siem.case.caseTable.title', { - defaultMessage: 'All Cases', -}); export const NO_CASES = i18n.translate('xpack.siem.case.caseTable.noCases.title', { defaultMessage: 'No Cases', }); @@ -21,6 +18,12 @@ export const ADD_NEW_CASE = i18n.translate('xpack.siem.case.caseTable.addNewCase defaultMessage: 'Add New Case', }); +export const SELECTED_CASES = (totalRules: number) => + i18n.translate('xpack.siem.case.caseTable.selectedCasesTitle', { + values: { totalRules }, + defaultMessage: 'Selected {totalRules} {totalRules, plural, =1 {case} other {cases}}', + }); + export const SHOWING_CASES = (totalRules: number) => i18n.translate('xpack.siem.case.caseTable.showingCasesTitle', { values: { totalRules }, @@ -33,16 +36,36 @@ export const UNIT = (totalCount: number) => defaultMessage: `{totalCount, plural, =1 {case} other {cases}}`, }); -export const SEARCH_CASES = i18n.translate( - 'xpack.siem.detectionEngine.case.caseTable.searchAriaLabel', - { - defaultMessage: 'Search cases', - } -); - -export const SEARCH_PLACEHOLDER = i18n.translate( - 'xpack.siem.detectionEngine.case.caseTable.searchPlaceholder', - { - defaultMessage: 'e.g. case name', - } -); +export const SEARCH_CASES = i18n.translate('xpack.siem.case.caseTable.searchAriaLabel', { + defaultMessage: 'Search cases', +}); + +export const BULK_ACTIONS = i18n.translate('xpack.siem.case.caseTable.bulkActions', { + defaultMessage: 'Bulk actions', +}); + +export const SEARCH_PLACEHOLDER = i18n.translate('xpack.siem.case.caseTable.searchPlaceholder', { + defaultMessage: 'e.g. case name', +}); +export const OPEN_CASES = i18n.translate('xpack.siem.case.caseTable.openCases', { + defaultMessage: 'Open cases', +}); +export const CLOSED_CASES = i18n.translate('xpack.siem.case.caseTable.closedCases', { + defaultMessage: 'Closed cases', +}); + +export const CLOSED = i18n.translate('xpack.siem.case.caseTable.closed', { + defaultMessage: 'Closed', +}); +export const DELETE = i18n.translate('xpack.siem.case.caseTable.delete', { + defaultMessage: 'Delete', +}); +export const REOPEN_CASE = i18n.translate('xpack.siem.case.caseTable.reopenCase', { + defaultMessage: 'Reopen case', +}); +export const CLOSE_CASE = i18n.translate('xpack.siem.case.caseTable.closeCase', { + defaultMessage: 'Close case', +}); +export const DUPLICATE_CASE = i18n.translate('xpack.siem.case.caseTable.duplicateCase', { + defaultMessage: 'Duplicate case', +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/index.tsx new file mode 100644 index 0000000000000..2fe25a7d1f5d0 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiContextMenuItem } from '@elastic/eui'; +import React from 'react'; +import * as i18n from './translations'; +import { Case } from '../../../../containers/case/types'; + +interface GetBulkItems { + // cases: Case[]; + closePopover: () => void; + // dispatch: Dispatch; + // dispatchToaster: Dispatch; + // reFetchCases: (refreshPrePackagedCase?: boolean) => void; + selectedCases: Case[]; + caseStatus: string; +} + +export const getBulkItems = ({ + // cases, + closePopover, + caseStatus, + // dispatch, + // dispatchToaster, + // reFetchCases, + selectedCases, +}: GetBulkItems) => { + return [ + caseStatus === 'open' ? ( + { + closePopover(); + // await deleteCasesAction(selectedCases, dispatch, dispatchToaster); + // reFetchCases(true); + }} + > + {i18n.BULK_ACTION_CLOSE_SELECTED} + + ) : ( + { + closePopover(); + // await deleteCasesAction(selectedCases, dispatch, dispatchToaster); + // reFetchCases(true); + }} + > + {i18n.BULK_ACTION_OPEN_SELECTED} + + ), + { + closePopover(); + // await deleteCasesAction(selectedCases, dispatch, dispatchToaster); + // reFetchCases(true); + }} + > + {i18n.BULK_ACTION_DELETE_SELECTED} + , + ]; +}; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/translations.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/translations.ts new file mode 100644 index 0000000000000..0bf213868bd76 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/bulk_actions/translations.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +export const BULK_ACTION_CLOSE_SELECTED = i18n.translate( + 'xpack.siem.case.caseTable.bulkActions.closeSelectedTitle', + { + defaultMessage: 'Close selected', + } +); + +export const BULK_ACTION_OPEN_SELECTED = i18n.translate( + 'xpack.siem.case.caseTable.bulkActions.openSelectedTitle', + { + defaultMessage: 'Open selected', + } +); + +export const BULK_ACTION_DELETE_SELECTED = i18n.translate( + 'xpack.siem.case.caseTable.bulkActions.deleteSelectedTitle', + { + defaultMessage: 'Delete selected', + } +); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx new file mode 100644 index 0000000000000..8d0fafdfc36ca --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { Dispatch, useEffect, useMemo } from 'react'; +import { EuiDescriptionList, EuiLoadingSpinner } from '@elastic/eui'; +import * as i18n from '../all_cases/translations'; +import { CaseCount } from '../../../../containers/case/use_get_cases'; + +export interface Props { + caseCount: CaseCount; + caseState: 'open' | 'closed'; + getCaseCount: Dispatch; + isLoading: boolean; +} + +export const OpenClosedStats = React.memo( + ({ caseCount, caseState, getCaseCount, isLoading }) => { + useEffect(() => { + getCaseCount(caseState); + }, [caseState]); + + const openClosedStats = useMemo( + () => [ + { + title: caseState === 'open' ? i18n.OPEN_CASES : i18n.CLOSED_CASES, + description: isLoading ? : caseCount[caseState], + }, + ], + [caseCount, caseState, isLoading] + ); + return ; + } +); + +OpenClosedStats.displayName = 'OpenClosedStats'; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/translations.ts b/x-pack/legacy/plugins/siem/public/pages/case/translations.ts index 5f0509586fc81..fc64bd64ec4a2 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/translations.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/translations.ts @@ -18,8 +18,8 @@ export const NAME = i18n.translate('xpack.siem.case.caseView.name', { defaultMessage: 'Name', }); -export const CREATED_AT = i18n.translate('xpack.siem.case.caseView.createdAt', { - defaultMessage: 'Created at', +export const OPENED_ON = i18n.translate('xpack.siem.case.caseView.openedOn', { + defaultMessage: 'Opened on', }); export const REPORTER = i18n.translate('xpack.siem.case.caseView.createdBy', { @@ -88,6 +88,21 @@ export const TAGS = i18n.translate('xpack.siem.case.caseView.tags', { defaultMessage: 'Tags', }); +export const NO_TAGS_AVAILABLE = i18n.translate('xpack.siem.case.allCases.noTagsAvailable', { + defaultMessage: 'No tags available', +}); + +export const NO_REPORTERS_AVAILABLE = i18n.translate( + 'xpack.siem.case.caseView.noReportersAvailable', + { + defaultMessage: 'No reporters available.', + } +); + +export const COMMENTS = i18n.translate('xpack.siem.case.allCases.comments', { + defaultMessage: 'Comments', +}); + export const TAGS_HELP = i18n.translate('xpack.siem.case.createCase.fieldTagsHelpText', { defaultMessage: 'Type one or more custom identifying tags for this case. Press enter after each tag to begin a new one.', diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx index 4c7cfac33c546..31420ad07cd50 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx @@ -13,7 +13,7 @@ import { UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../components/detection_engine/utility_bar'; +} from '../../../../components/utility_bar'; import { columns } from './columns'; import { ColumnTypes, PageTypes, SortTypes } from './types'; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx index 86772eb0e155d..25c0424cadf11 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx @@ -13,7 +13,7 @@ import { UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../../components/detection_engine/utility_bar'; +} from '../../../../../components/utility_bar'; import * as i18n from './translations'; import { useUiSetting$ } from '../../../../../lib/kibana'; import { DEFAULT_NUMBER_FORMAT } from '../../../../../../common/constants'; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx index 9676b83a26f55..e7d68164c4ef4 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.tsx @@ -30,7 +30,7 @@ import { UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../components/detection_engine/utility_bar'; +} from '../../../../components/utility_bar'; import { useStateToaster } from '../../../../components/toasters'; import { Loader } from '../../../../components/loader'; import { Panel } from '../../../../components/panel'; From e0022be6d3dcb41788519853c38d754710df9c96 Mon Sep 17 00:00:00 2001 From: Lee Drengenberg Date: Thu, 5 Mar 2020 13:08:29 -0600 Subject: [PATCH 06/25] wait for any text in dialog (#59352) Co-authored-by: Elastic Machine --- test/functional/services/saved_query_management_component.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/functional/services/saved_query_management_component.ts b/test/functional/services/saved_query_management_component.ts index b94558c209e6a..244c1cd214de5 100644 --- a/test/functional/services/saved_query_management_component.ts +++ b/test/functional/services/saved_query_management_component.ts @@ -164,6 +164,10 @@ export function SavedQueryManagementComponentProvider({ getService }: FtrProvide if (isOpenAlready) return; await testSubjects.click('saved-query-management-popover-button'); + await retry.waitFor('saved query management popover to have any text', async () => { + const queryText = await testSubjects.getVisibleText('saved-query-management-popover'); + return queryText.length > 0; + }); } async closeSavedQueryManagementComponent() { From 096dda6f3460eee926661c7271a397d874e739a5 Mon Sep 17 00:00:00 2001 From: Chandler Prall Date: Thu, 5 Mar 2020 12:27:52 -0700 Subject: [PATCH 07/25] Upgrade EUI to v20.0.2 (#59199) * Updated EUI to 20.0.1; updated typescript usage * snapshots * Upgrade to eui 20.0.2, fix one more type * PR feedback * Update EUI icon usage to the correct types * Updated with master --- package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 2 +- .../public/components/editor/field_select.tsx | 8 +- .../public/components/vis/list_control.tsx | 2 +- .../public/input_control_vis_type.ts | 2 +- .../public/components/agg_select.tsx | 4 +- .../public/components/controls/field.test.tsx | 2 +- .../public/components/controls/field.tsx | 4 +- .../components/controls/time_interval.tsx | 6 +- .../public/components/timelion_interval.tsx | 4 +- .../__snapshots__/icon_select.test.js.snap | 1 + .../splits/__snapshots__/terms.test.js.snap | 1 + .../vis_type_vislib/public/heatmap.ts | 2 +- .../field/__snapshots__/field.test.tsx.snap | 12 - .../components/field/field.test.tsx | 6 +- .../management_app/components/field/field.tsx | 15 +- .../filter_editor/generic_combo_box.tsx | 6 +- .../index_pattern_select.tsx | 2 +- .../components/fields/combobox_field.tsx | 4 +- .../static/forms/helpers/de_serializers.ts | 6 +- .../min_selectable_selection.ts | 4 +- .../static/forms/helpers/serializers.ts | 4 +- .../inspector_panel.test.tsx.snap | 32 +- .../plugins/kbn_tp_run_pipeline/package.json | 2 +- .../kbn_tp_custom_visualizations/package.json | 2 +- .../self_changing_vis/self_changing_vis.js | 2 +- .../kbn_tp_embeddable_explorer/package.json | 2 +- .../kbn_tp_sample_panel_action/package.json | 2 +- typings/@elastic/eui/index.d.ts | 1 - .../public/components/inputs/code_editor.tsx | 2 - .../asset_manager/asset_manager.tsx | 3 +- .../components/asset_manager/asset_modal.tsx | 2 +- .../custom_element_modal.tsx | 5 +- .../keyboard_shortcuts_doc.stories.storyshot | 2096 +++++++++-------- .../components/field_manager/field_editor.tsx | 13 +- .../dimension_panel/field_select.tsx | 8 +- .../create_analytics_form.tsx | 12 +- .../hooks/use_create_analytics_form/state.ts | 6 +- .../__snapshots__/overrides.test.js.snap | 3 + .../__snapshots__/editor.test.tsx.snap | 4 + .../components/custom_url_editor/editor.tsx | 10 +- .../ml_job_editor/ml_job_editor.tsx | 4 +- .../common/components/job_groups_input.tsx | 12 +- .../time_field/time_field_select.tsx | 11 +- .../calendars/calendars_selection.tsx | 6 +- .../components/groups/groups_input.tsx | 12 +- .../advanced_detector_modal.tsx | 30 +- .../components/agg_select/agg_select.tsx | 10 +- .../categorization_field_select.tsx | 8 +- .../influencers/influencers_select.tsx | 8 +- .../split_field/split_field_select.tsx | 8 +- .../summary_count_field_select.tsx | 8 +- .../entity_control/entity_control.tsx | 12 +- .../report_info_button.test.tsx.snap | 96 +- .../components/edit_data_provider/helpers.tsx | 14 +- .../components/edit_data_provider/index.tsx | 12 +- .../timeline/search_super_select/index.tsx | 8 +- .../detection_engine/rules/all/columns.tsx | 2 +- .../components/import_rule_modal/index.tsx | 4 +- .../detection_engine/rules/details/index.tsx | 2 +- .../aggregation_dropdown/dropdown.tsx | 6 +- .../components/step_define/common.ts | 6 +- .../ping_list/__tests__/ping_list.test.tsx | 4 +- x-pack/package.json | 2 +- .../add_log_column_popover.tsx | 8 +- .../top_categories/datasets_selector.tsx | 4 +- .../remote_cluster_form.test.js.snap | 4 +- .../role_combo_box/role_combo_box_option.tsx | 4 +- .../json_rule_editor.test.tsx | 22 +- .../cluster_privileges.test.tsx.snap | 1 + .../elasticsearch_privileges.test.tsx.snap | 1 + .../index_privilege_form.test.tsx.snap | 2 + .../privileges/es/index_privilege_form.tsx | 10 +- .../space_selector.tsx | 8 +- .../policy_form/steps/step_settings.tsx | 10 +- .../type_settings/hdfs_settings.tsx | 17 +- .../steps/step_logistics.tsx | 10 +- .../steps/step_review.tsx | 10 +- .../steps/step_settings.tsx | 10 +- .../policy_details/tabs/tab_history.tsx | 17 +- .../type_details/default_details.tsx | 17 +- .../customize_space_avatar.test.tsx.snap | 9 +- .../customize_space_avatar.tsx | 7 +- .../builtin_action_types/webhook.tsx | 2 - .../threshold/expression.tsx | 6 +- .../common/expression_items/of.test.tsx | 56 +- .../json_watch_edit_simulate.tsx | 1 - .../action_fields/webhook_action_fields.tsx | 1 - .../threshold_watch_edit.tsx | 4 +- x-pack/typings/@elastic/eui/index.d.ts | 1 - yarn.lock | 16 +- 91 files changed, 1436 insertions(+), 1413 deletions(-) diff --git a/package.json b/package.json index 2c401724c72cd..9f12f04223103 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "@elastic/charts": "^17.1.1", "@elastic/datemath": "5.0.2", "@elastic/ems-client": "7.6.0", - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "@elastic/filesaver": "1.1.2", "@elastic/good": "8.1.1-kibana2", "@elastic/numeral": "2.4.0", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index e9ad227b235fa..65fd837ad17c2 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@elastic/charts": "^17.1.1", "abortcontroller-polyfill": "^1.4.0", - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", "@kbn/i18n": "1.0.0", diff --git a/src/legacy/core_plugins/input_control_vis/public/components/editor/field_select.tsx b/src/legacy/core_plugins/input_control_vis/public/components/editor/field_select.tsx index bde2f09ab0a47..68cca9bf6c4f2 100644 --- a/src/legacy/core_plugins/input_control_vis/public/components/editor/field_select.tsx +++ b/src/legacy/core_plugins/input_control_vis/public/components/editor/field_select.tsx @@ -22,13 +22,13 @@ import React, { Component } from 'react'; import { InjectedIntlProps } from 'react-intl'; import { injectI18n, FormattedMessage } from '@kbn/i18n/react'; -import { EuiFormRow, EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiFormRow, EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { IIndexPattern, IFieldType } from '../../../../../../plugins/data/public'; interface FieldSelectUiState { isLoading: boolean; - fields: Array>; + fields: Array>; indexPatternId: string; } @@ -105,7 +105,7 @@ class FieldSelectUi extends Component { } const fieldsByTypeMap = new Map(); - const fields: Array> = []; + const fields: Array> = []; indexPattern.fields .filter(this.props.filterField ?? (() => true)) .forEach((field: IFieldType) => { @@ -135,7 +135,7 @@ class FieldSelectUi extends Component { }); }, 300); - onChange = (selectedOptions: Array>) => { + onChange = (selectedOptions: Array>) => { this.props.onChange(_.get(selectedOptions, '0.value')); }; diff --git a/src/legacy/core_plugins/input_control_vis/public/components/vis/list_control.tsx b/src/legacy/core_plugins/input_control_vis/public/components/vis/list_control.tsx index d01cef15ea41b..6ded66917a3fd 100644 --- a/src/legacy/core_plugins/input_control_vis/public/components/vis/list_control.tsx +++ b/src/legacy/core_plugins/input_control_vis/public/components/vis/list_control.tsx @@ -76,7 +76,7 @@ class ListControlUi extends PureComponent { + setTextInputRef = (ref: HTMLInputElement | null) => { this.textInput = ref; }; diff --git a/src/legacy/core_plugins/input_control_vis/public/input_control_vis_type.ts b/src/legacy/core_plugins/input_control_vis/public/input_control_vis_type.ts index 9473ea5a20b35..1bdff06b3a59f 100644 --- a/src/legacy/core_plugins/input_control_vis/public/input_control_vis_type.ts +++ b/src/legacy/core_plugins/input_control_vis/public/input_control_vis_type.ts @@ -34,7 +34,7 @@ export function createInputControlVisTypeDefinition(deps: InputControlVisDepende title: i18n.translate('inputControl.register.controlsTitle', { defaultMessage: 'Controls', }), - icon: 'visControls', + icon: 'controlsHorizontal', description: i18n.translate('inputControl.register.controlsDescription', { defaultMessage: 'Create interactive controls for easy dashboard manipulation.', }), diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx index 9a408c2d98b22..4d969a2d8ec6c 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/agg_select.tsx @@ -19,7 +19,7 @@ import { get, has } from 'lodash'; import React, { useEffect, useCallback, useState } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps, EuiFormRow, EuiLink, EuiText } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow, EuiLink, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -104,7 +104,7 @@ function DefaultEditorAggSelect({ const isValid = !!value && !errors.length && !isDirty; const onChange = useCallback( - (options: EuiComboBoxOptionProps[]) => { + (options: EuiComboBoxOptionOption[]) => { const selectedOption = get(options, '0.target'); if (selectedOption) { setValue(selectedOption as IAggType); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx index 36496c2800b64..186738d0f551c 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.test.tsx @@ -29,7 +29,7 @@ import { FieldParamEditor, FieldParamEditorProps } from './field'; import { IAggConfig } from '../../legacy_imports'; function callComboBoxOnChange(comp: ReactWrapper, value: any = []) { - const comboBoxProps: EuiComboBoxProps = comp.find(EuiComboBox).props(); + const comboBoxProps = comp.find(EuiComboBox).props() as EuiComboBoxProps; if (comboBoxProps.onChange) { comboBoxProps.onChange(value); } diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx index d605fb203f4d3..0ec00ab6f20f0 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/field.tsx @@ -20,7 +20,7 @@ import { get } from 'lodash'; import React, { useEffect, useState, useCallback } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps, EuiFormRow } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { IndexPatternField } from 'src/plugins/data/public'; @@ -55,7 +55,7 @@ function FieldParamEditor({ ? [{ label: value.displayName || value.name, target: value }] : []; - const onChange = (options: EuiComboBoxOptionProps[]) => { + const onChange = (options: EuiComboBoxOptionOption[]) => { const selectedOption: IndexPatternField = get(options, '0.target'); if (!(aggParam.required && !selectedOption)) { setValue(selectedOption); diff --git a/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx b/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx index 5da0d6462a8ba..ee3666b2ed441 100644 --- a/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx +++ b/src/legacy/core_plugins/vis_default_editor/public/components/controls/time_interval.tsx @@ -19,14 +19,14 @@ import { get, find } from 'lodash'; import React, { useEffect } from 'react'; -import { EuiFormRow, EuiIconTip, EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiFormRow, EuiIconTip, EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { isValidInterval, AggParamOption } from '../../legacy_imports'; import { AggParamEditorProps } from '../agg_param_props'; -interface ComboBoxOption extends EuiComboBoxOptionProps { +interface ComboBoxOption extends EuiComboBoxOptionOption { key: string; } @@ -105,7 +105,7 @@ function TimeIntervalParamEditor({ } }; - const onChange = (opts: EuiComboBoxOptionProps[]) => { + const onChange = (opts: EuiComboBoxOptionOption[]) => { const selectedOpt: ComboBoxOption = get(opts, '0'); setValue(selectedOpt ? selectedOpt.key : ''); diff --git a/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_interval.tsx b/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_interval.tsx index 02783434bfdc2..13a57296bab7a 100644 --- a/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_interval.tsx +++ b/src/legacy/core_plugins/vis_type_timelion/public/components/timelion_interval.tsx @@ -18,7 +18,7 @@ */ import React, { useMemo, useCallback } from 'react'; -import { EuiFormRow, EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiFormRow, EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isValidEsInterval } from '../../../../core_plugins/data/common'; @@ -90,7 +90,7 @@ function TimelionInterval({ value, setValue, setValidity }: TimelionIntervalProp ); const onChange = useCallback( - (opts: Array>) => { + (opts: Array>) => { setValue((opts[0] && opts[0].value) || ''); }, [setValue] diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/__snapshots__/icon_select.test.js.snap b/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/__snapshots__/icon_select.test.js.snap index fd22bcafb8df4..d269f61beefab 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/__snapshots__/icon_select.test.js.snap +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/__snapshots__/icon_select.test.js.snap @@ -2,6 +2,7 @@ exports[`src/legacy/core_plugins/metrics/public/components/icon_select/icon_select.js should render and match a snapshot 1`] = ` ({ name: 'heatmap', title: i18n.translate('visTypeVislib.heatmap.heatmapTitle', { defaultMessage: 'Heat Map' }), - icon: 'visHeatmap', + icon: 'heatmap', description: i18n.translate('visTypeVislib.heatmap.heatmapDescription', { defaultMessage: 'Shade cells within a matrix', }), diff --git a/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap index dba1678339f24..88f30e03df052 100644 --- a/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap +++ b/src/plugins/advanced_settings/public/management_app/components/field/__snapshots__/field.test.tsx.snap @@ -1350,7 +1350,6 @@ exports[`Field for json setting should render as read only if saving is disabled "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={true} maxLines={30} @@ -1456,7 +1455,6 @@ exports[`Field for json setting should render as read only with help text if ove "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={true} maxLines={30} @@ -1538,7 +1536,6 @@ exports[`Field for json setting should render custom setting icon if it is custo "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -1651,7 +1648,6 @@ exports[`Field for json setting should render default value if there is no user "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -1740,7 +1736,6 @@ exports[`Field for json setting should render unsaved value if there are unsaved "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -1864,7 +1859,6 @@ exports[`Field for json setting should render user value if there is user value "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -1935,7 +1929,6 @@ exports[`Field for markdown setting should render as read only if saving is disa "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={true} maxLines={30} @@ -2038,7 +2031,6 @@ exports[`Field for markdown setting should render as read only with help text if "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={true} maxLines={30} @@ -2120,7 +2112,6 @@ exports[`Field for markdown setting should render custom setting icon if it is c "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -2191,7 +2182,6 @@ exports[`Field for markdown setting should render default value if there is no u "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -2280,7 +2270,6 @@ exports[`Field for markdown setting should render unsaved value if there are uns "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} @@ -2397,7 +2386,6 @@ exports[`Field for markdown setting should render user value if there is user va "$blockScrolling": Infinity, } } - fullWidth={true} height="auto" isReadOnly={false} maxLines={30} diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx index 8e41fed685898..356e38c799659 100644 --- a/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx @@ -363,7 +363,7 @@ describe('Field', () => { (component.instance() as Field).getImageAsBase64 = ({}: Blob) => Promise.resolve(''); it('should be able to change value and cancel', async () => { - (component.instance() as Field).onImageChange([userValue]); + (component.instance() as Field).onImageChange(([userValue] as unknown) as FileList); expect(handleChange).toBeCalled(); await wrapper.setProps({ unsavedChanges: { @@ -387,7 +387,9 @@ describe('Field', () => { const updated = wrapper.update(); findTestSubject(updated, `advancedSetting-changeImage-${setting.name}`).simulate('click'); const newUserValue = `${userValue}=`; - await (component.instance() as Field).onImageChange([newUserValue]); + await (component.instance() as Field).onImageChange(([ + newUserValue, + ] as unknown) as FileList); expect(handleChange).toBeCalled(); }); diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field.tsx index 18a1a365709d1..60d2b55dfceb4 100644 --- a/src/plugins/advanced_settings/public/management_app/components/field/field.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/field/field.tsx @@ -90,7 +90,7 @@ export const getEditableValue = ( }; export class Field extends PureComponent { - private changeImageForm: EuiFilePicker | undefined = React.createRef(); + private changeImageForm = React.createRef(); getDisplayedDefaultValue( type: UiSettingsType, @@ -138,7 +138,7 @@ export class Field extends PureComponent { } } - onCodeEditorChange = (value: UiSettingsType) => { + onCodeEditorChange = (value: string) => { const { defVal, type } = this.props.setting; let newUnsavedValue; @@ -212,7 +212,9 @@ export class Field extends PureComponent { }); }; - onImageChange = async (files: any[]) => { + onImageChange = async (files: FileList | null) => { + if (files == null) return; + if (!files.length) { this.setState({ unsavedValue: null, @@ -278,9 +280,9 @@ export class Field extends PureComponent { }; cancelChangeImage = () => { - if (this.changeImageForm.current) { - this.changeImageForm.current.fileInput.value = null; - this.changeImageForm.current.handleChange({}); + if (this.changeImageForm.current?.fileInput) { + this.changeImageForm.current.fileInput.value = ''; + this.changeImageForm.current.handleChange(); } if (this.props.clearChange) { this.props.clearChange(this.props.setting.name); @@ -352,7 +354,6 @@ export class Field extends PureComponent { $blockScrolling: Infinity, }} showGutter={false} - fullWidth /> ); diff --git a/src/plugins/data/public/ui/filter_bar/filter_editor/generic_combo_box.tsx b/src/plugins/data/public/ui/filter_bar/filter_editor/generic_combo_box.tsx index 9d541af5a1d17..a5db8b66caa01 100644 --- a/src/plugins/data/public/ui/filter_bar/filter_editor/generic_combo_box.tsx +++ b/src/plugins/data/public/ui/filter_bar/filter_editor/generic_combo_box.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import React from 'react'; export interface GenericComboBoxProps { @@ -38,7 +38,7 @@ export function GenericComboBox(props: GenericComboBoxProps) { const { options, selectedOptions, getLabel, onChange, ...otherProps } = props; const labels = options.map(getLabel); - const euiOptions: EuiComboBoxOptionProps[] = labels.map(label => ({ label })); + const euiOptions: EuiComboBoxOptionOption[] = labels.map(label => ({ label })); const selectedEuiOptions = selectedOptions .filter(option => { return options.indexOf(option) !== -1; @@ -47,7 +47,7 @@ export function GenericComboBox(props: GenericComboBoxProps) { return euiOptions[options.indexOf(option)]; }); - const onComboBoxChange = (newOptions: EuiComboBoxOptionProps[]) => { + const onComboBoxChange = (newOptions: EuiComboBoxOptionOption[]) => { const newValues = newOptions.map(({ label }) => { return options[labels.indexOf(label)]; }); diff --git a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx index 829c8205a8b52..c56060bb9c288 100644 --- a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx +++ b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx @@ -39,7 +39,7 @@ export type IndexPatternSelectProps = Required< interface IndexPatternSelectState { isLoading: boolean; options: []; - selectedIndexPattern: string | undefined; + selectedIndexPattern: { value: string; label: string } | undefined; searchValue: string | undefined; } diff --git a/src/plugins/es_ui_shared/static/forms/components/fields/combobox_field.tsx b/src/plugins/es_ui_shared/static/forms/components/fields/combobox_field.tsx index 3613867950098..a10da62fa6906 100644 --- a/src/plugins/es_ui_shared/static/forms/components/fields/combobox_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/fields/combobox_field.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiFormRow, EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiFormRow, EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { FieldHook, VALIDATION_TYPES, FieldValidateResponse } from '../../hook_form_lib'; @@ -69,7 +69,7 @@ export const ComboBoxField = ({ field, euiFieldProps = {}, ...rest }: Props) => field.setValue(newValue); }; - const onComboChange = (options: EuiComboBoxOptionProps[]) => { + const onComboChange = (options: EuiComboBoxOptionOption[]) => { field.setValue(options.map(option => option.label)); }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/de_serializers.ts b/src/plugins/es_ui_shared/static/forms/helpers/de_serializers.ts index f4b528e681d43..274aa82b31834 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/de_serializers.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/de_serializers.ts @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -import { Option } from '@elastic/eui/src/components/selectable/types'; +import { EuiSelectableOption } from '@elastic/eui'; import { SerializerFunc } from '../hook_form_lib'; -type FuncType = (selectOptions: Option[]) => SerializerFunc; +type FuncType = (selectOptions: EuiSelectableOption[]) => SerializerFunc; export const multiSelectComponent: Record = { // This deSerializer takes the previously selected options and map them @@ -31,7 +31,7 @@ export const multiSelectComponent: Record = { return selectOptions; } - return (selectOptions as Option[]).map(option => ({ + return (selectOptions as EuiSelectableOption[]).map(option => ({ ...option, checked: (defaultFormValue as string[]).includes(option.label) ? 'on' : undefined, })); diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts index a10371d08ad5a..8f75c45df6c4a 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Option } from '@elastic/eui/src/components/selectable/types'; +import { EuiSelectableOption } from '@elastic/eui'; import { ValidationFunc, ValidationError } from '../../hook_form_lib'; import { hasMinLengthArray } from '../../../validators/array'; @@ -42,7 +42,7 @@ export const minSelectableSelectionField = ({ // We need to convert all the options from the multi selectable component, to the // an actual Array of selection _before_ validating the Array length. - return hasMinLengthArray(total)(optionsToSelectedValue(value as Option[])) + return hasMinLengthArray(total)(optionsToSelectedValue(value as EuiSelectableOption[])) ? undefined : { code: 'ERR_MIN_SELECTION', diff --git a/src/plugins/es_ui_shared/static/forms/helpers/serializers.ts b/src/plugins/es_ui_shared/static/forms/helpers/serializers.ts index 0bb89cc1af593..bae6b4c2652ca 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/serializers.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/serializers.ts @@ -36,7 +36,7 @@ * ```` */ -import { Option } from '@elastic/eui/src/components/selectable/types'; +import { EuiSelectableOption } from '@elastic/eui'; import { SerializerFunc } from '../hook_form_lib'; export const multiSelectComponent: Record> = { @@ -45,7 +45,7 @@ export const multiSelectComponent: Record> = { * * @param value The Eui Selectable options array */ - optionsToSelectedValue(options: Option[]): string[] { + optionsToSelectedValue(options: EuiSelectableOption[]): string[] { return options.filter(option => option.checked === 'on').map(option => option.label); }, }; diff --git a/src/plugins/inspector/public/ui/__snapshots__/inspector_panel.test.tsx.snap b/src/plugins/inspector/public/ui/__snapshots__/inspector_panel.test.tsx.snap index 9cf725a2faa73..fcd03df5637d0 100644 --- a/src/plugins/inspector/public/ui/__snapshots__/inspector_panel.test.tsx.snap +++ b/src/plugins/inspector/public/ui/__snapshots__/inspector_panel.test.tsx.snap @@ -326,21 +326,25 @@ exports[`InspectorPanel should render as expected 1`] = `
- -

- View 1 -

-
+ +

+ View 1 +

+
+
diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json index cb0b9de01c4ed..594823ad047a7 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json @@ -7,7 +7,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "react": "^16.12.0", "react-dom": "^16.12.0" } diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json index c68ef6dcd0202..56f5719b5dbef 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json @@ -7,7 +7,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "react": "^16.12.0" } } diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js index 1c6acab4aba16..2976a6cd98e30 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis/self_changing_vis.js @@ -25,7 +25,7 @@ import { setup as visualizations } from '../../../../../../src/legacy/core_plugi visualizations.types.createReactVisualization({ name: 'self_changing_vis', title: 'Self Changing Vis', - icon: 'visControls', + icon: 'controlsHorizontal', description: 'This visualization is able to change its own settings, that you could also set in the editor.', visConfig: { diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json index d4e4c6bf2fee0..d12c15d0688b2 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_sample_panel_action/package.json b/test/plugin_functional/plugins/kbn_tp_sample_panel_action/package.json index 3ade079419a55..eb24035f9acbe 100644 --- a/test/plugin_functional/plugins/kbn_tp_sample_panel_action/package.json +++ b/test/plugin_functional/plugins/kbn_tp_sample_panel_action/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "react": "^16.12.0" }, "scripts": { diff --git a/typings/@elastic/eui/index.d.ts b/typings/@elastic/eui/index.d.ts index 9268f72724141..db07861d63cfe 100644 --- a/typings/@elastic/eui/index.d.ts +++ b/typings/@elastic/eui/index.d.ts @@ -21,6 +21,5 @@ import { Direction } from '@elastic/eui/src/services/sort/sort_direction'; // TODO: Remove once typescript definitions are in EUI declare module '@elastic/eui' { - export const EuiCodeEditor: React.FC; export const Query: any; } diff --git a/x-pack/legacy/plugins/beats_management/public/components/inputs/code_editor.tsx b/x-pack/legacy/plugins/beats_management/public/components/inputs/code_editor.tsx index 6ec2a7f02f3a3..46ea90a9c1b30 100644 --- a/x-pack/legacy/plugins/beats_management/public/components/inputs/code_editor.tsx +++ b/x-pack/legacy/plugins/beats_management/public/components/inputs/code_editor.tsx @@ -93,13 +93,11 @@ class CodeEditor extends Component< error={error ? getErrorMessage() : []} > { this.props.onAssetDelete(this.state.deleteId); }; - private handleFileUpload = (files: FileList) => { + private handleFileUpload = (files: FileList | null) => { + if (files == null) return; this.setState({ isLoading: true }); Promise.all(Array.from(files).map(file => this.props.onAssetAdd(file))).finally(() => { this.setState({ isLoading: false }); diff --git a/x-pack/legacy/plugins/canvas/public/components/asset_manager/asset_modal.tsx b/x-pack/legacy/plugins/canvas/public/components/asset_manager/asset_modal.tsx index f8bce19a46968..3dfbb1b1fde3c 100644 --- a/x-pack/legacy/plugins/canvas/public/components/asset_manager/asset_modal.tsx +++ b/x-pack/legacy/plugins/canvas/public/components/asset_manager/asset_modal.tsx @@ -43,7 +43,7 @@ interface Props { /** Function to invoke when the modal is closed */ onClose: () => void; /** Function to invoke when a file is uploaded */ - onFileUpload: (assets: FileList) => void; + onFileUpload: (assets: FileList | null) => void; /** Function to invoke when an asset is copied */ onAssetCopy: (asset: AssetType) => void; /** Function to invoke when an asset is created */ diff --git a/x-pack/legacy/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx b/x-pack/legacy/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx index bd7fc775a34a0..56bd0bf5e9f2a 100644 --- a/x-pack/legacy/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx +++ b/x-pack/legacy/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx @@ -100,8 +100,9 @@ export class CustomElementModal extends PureComponent { this.setState({ [type]: value }); }; - private _handleUpload = (files: File[]) => { - const [file] = files; + private _handleUpload = (files: FileList | null) => { + if (files == null) return; + const file = files[0]; const [type, subtype] = get(file, 'type', '').split('/'); if (type === 'image' && VALID_IMAGE_TYPES.indexOf(subtype) >= 0) { encode(file).then((dataurl: string) => this._handleChange('image', dataurl)); diff --git a/x-pack/legacy/plugins/canvas/public/components/keyboard_shortcuts_doc/__examples__/__snapshots__/keyboard_shortcuts_doc.stories.storyshot b/x-pack/legacy/plugins/canvas/public/components/keyboard_shortcuts_doc/__examples__/__snapshots__/keyboard_shortcuts_doc.stories.storyshot index 35cdd5ac378f4..9954ae0147a97 100644 --- a/x-pack/legacy/plugins/canvas/public/components/keyboard_shortcuts_doc/__examples__/__snapshots__/keyboard_shortcuts_doc.stories.storyshot +++ b/x-pack/legacy/plugins/canvas/public/components/keyboard_shortcuts_doc/__examples__/__snapshots__/keyboard_shortcuts_doc.stories.storyshot @@ -82,1060 +82,1064 @@ exports[`Storyshots components/KeyboardShortcutsDoc default 1`] = ` className="euiFlyoutBody__overflow" >
-

- Element controls -

-
-
-
- Cut -
-
- - - - CTRL - - - - - - X - - - -
-
- Copy -
-
- - - - CTRL - - - - - - C - - - -
-
- Paste -
-
- - - - CTRL - - - - - - V - - - -
-
- Clone -
-
- - - - CTRL - - - - - - D - - - -
-
- Delete -
-
- - - - DEL - - - - - - or - - - - - - BACKSPACE - - - -
-
- Bring forward -
-
- - - - CTRL - - - - - - ↑ - - - -
-
- Bring to front -
-
- - - - CTRL - - - - - - SHIFT - - - - - - ↑ - - - -
-
- Send backward -
-
- - - - CTRL - - - - - - ↓ - - - -
-
- Send to back -
-
- - - - CTRL - - - - - - SHIFT - - - - - - ↓ - - - -
-
- Group -
-
- - - - G - - - -
-
- Ungroup -
-
- - - - U - - - -
-
- Shift up by 10px -
-
- - - - ↑ - - - -
-
- Shift down by 10px -
-
- - - - ↓ - - - -
-
- Shift left by 10px -
-
- - - - ← - - - -
-
- Shift right by 10px -
-
- - - - → - - - -
-
- Shift up by 1px -
-
- - - - SHIFT - - - - - - ↑ - - - -
-
- Shift down by 1px -
-
- - - - SHIFT - - - - - - ↓ - - - -
-
- Shift left by 1px -
-
- - - - SHIFT - - - - - - ← - - - -
-
- Shift right by 1px -
-
- - - - SHIFT - - - - - - → - - - -
-
-
-
-

- Expression controls -

-
-
-
- Run whole expression -
-
- - - - CTRL - - - - - - ENTER - - - -
-
+

+ Element controls +

+
+
+
+ Cut +
+
+ + + + CTRL + + + + + + X + + + +
+
+ Copy +
+
+ + + + CTRL + + + + + + C + + + +
+
+ Paste +
+
+ + + + CTRL + + + + + + V + + + +
+
+ Clone +
+
+ + + + CTRL + + + + + + D + + + +
+
+ Delete +
+
+ + + + DEL + + + + + + or + + + + + + BACKSPACE + + + +
+
+ Bring forward +
+
+ + + + CTRL + + + + + + ↑ + + + +
+
+ Bring to front +
+
+ + + + CTRL + + + + + + SHIFT + + + + + + ↑ + + + +
+
+ Send backward +
+
+ + + + CTRL + + + + + + ↓ + + + +
+
+ Send to back +
+
+ + + + CTRL + + + + + + SHIFT + + + + + + ↓ + + + +
+
+ Group +
+
+ + + + G + + + +
+
+ Ungroup +
+
+ + + + U + + + +
+
+ Shift up by 10px +
+
+ + + + ↑ + + + +
+
+ Shift down by 10px +
+
+ + + + ↓ + + + +
+
+ Shift left by 10px +
+
+ + + + ← + + + +
+
+ Shift right by 10px +
+
+ + + + → + + + +
+
+ Shift up by 1px +
+
+ + + + SHIFT + + + + + + ↑ + + + +
+
+ Shift down by 1px +
+
+ + + + SHIFT + + + + + + ↓ + + + +
+
+ Shift left by 1px +
+
+ + + + SHIFT + + + + + + ← + + + +
+
+ Shift right by 1px +
+
+ + + + SHIFT + + + + + + → + + + +
+
+
+
-
-
-

- Editor controls -

-
-
-
- Select multiple elements -
-
- - - - SHIFT - - - - - - CLICK - - - -
-
- Resize from center -
-
- - - - ALT - - - - - - DRAG - - - -
-
- Move, resize, and rotate without snapping -
-
- - - - CTRL - - - - - - DRAG - - - -
-
- Select element below -
-
- - - - CTRL - - - - - - CLICK - - - -
-
- Undo last action -
-
- - - - CTRL - - - - - - Z - - - -
-
- Redo last action -
-
- - - - CTRL - - - - - - SHIFT - - - - - - Z - - - -
-
- Go to previous page -
-
- - - - ALT - - - - - - [ - - - -
-
- Go to next page -
-
- - - - ALT - - - - - - ] - - - -
-
- Toggle edit mode -
-
- - - - ALT - - - - - - E - - - -
-
- Show grid -
-
- - - - ALT - - - - - - G - - - -
-
- Refresh workpad -
-
- - - - ALT - - - - - - R - - - -
-
- Zoom in -
-
- - - - CTRL - - - - - - ALT - - - - - - + - - - -
-
- Zoom out -
-
- - - - CTRL - - - - - - ALT - - - - - - - - - - -
-
- Reset zoom to 100% -
-
- - - - CTRL - - - - - - ALT - - - - - - [ - - - -
-
- Enter presentation mode -
-
- - - - ALT - - - - - - F - - - - - - or - - - - - - ALT - - - - - - P - - - -
-
+

+ Expression controls +

+
+
+
+ Run whole expression +
+
+ + + + CTRL + + + + + + ENTER + + + +
+
+
+
-
-
-

- Presentation controls -

-
-
-
- Enter presentation mode -
-
- - - - ALT - - - - - - F - - - - - - or - - - - - - ALT - - - - - - P - - - -
-
- Exit presentation mode -
-
- - - - ESC - - - -
-
- Go to previous page -
-
- - - - ALT - - - - - - [ - - - - - - or - - - - - - BACKSPACE - - - - - - or - - - - - - ← - - - -
-
- Go to next page -
-
- - - - ALT - - - - - - ] - - - - - - or - - - - - - SPACE - - - - - - or - - - - - - → - - - -
-
- Refresh workpad -
-
- - - - ALT - - - - - - R - - - -
-
- Toggle page cycling -
-
- - - - P - - - -
-
+

+ Editor controls +

+
+
+
+ Select multiple elements +
+
+ + + + SHIFT + + + + + + CLICK + + + +
+
+ Resize from center +
+
+ + + + ALT + + + + + + DRAG + + + +
+
+ Move, resize, and rotate without snapping +
+
+ + + + CTRL + + + + + + DRAG + + + +
+
+ Select element below +
+
+ + + + CTRL + + + + + + CLICK + + + +
+
+ Undo last action +
+
+ + + + CTRL + + + + + + Z + + + +
+
+ Redo last action +
+
+ + + + CTRL + + + + + + SHIFT + + + + + + Z + + + +
+
+ Go to previous page +
+
+ + + + ALT + + + + + + [ + + + +
+
+ Go to next page +
+
+ + + + ALT + + + + + + ] + + + +
+
+ Toggle edit mode +
+
+ + + + ALT + + + + + + E + + + +
+
+ Show grid +
+
+ + + + ALT + + + + + + G + + + +
+
+ Refresh workpad +
+
+ + + + ALT + + + + + + R + + + +
+
+ Zoom in +
+
+ + + + CTRL + + + + + + ALT + + + + + + + + + + +
+
+ Zoom out +
+
+ + + + CTRL + + + + + + ALT + + + + + + - + + + +
+
+ Reset zoom to 100% +
+
+ + + + CTRL + + + + + + ALT + + + + + + [ + + + +
+
+ Enter presentation mode +
+
+ + + + ALT + + + + + + F + + + + + + or + + + + + + ALT + + + + + + P + + + +
+
+
+
+ className="canvasKeyboardShortcut" + > +

+ Presentation controls +

+
+
+
+ Enter presentation mode +
+
+ + + + ALT + + + + + + F + + + + + + or + + + + + + ALT + + + + + + P + + + +
+
+ Exit presentation mode +
+
+ + + + ESC + + + +
+
+ Go to previous page +
+
+ + + + ALT + + + + + + [ + + + + + + or + + + + + + BACKSPACE + + + + + + or + + + + + + ← + + + +
+
+ Go to next page +
+
+ + + + ALT + + + + + + ] + + + + + + or + + + + + + SPACE + + + + + + or + + + + + + → + + + +
+
+ Refresh workpad +
+
+ + + + ALT + + + + + + R + + + +
+
+ Toggle page cycling +
+
+ + + + P + + + +
+
+
+
diff --git a/x-pack/legacy/plugins/graph/public/components/field_manager/field_editor.tsx b/x-pack/legacy/plugins/graph/public/components/field_manager/field_editor.tsx index f2a4c28afcdae..9c7cffa775781 100644 --- a/x-pack/legacy/plugins/graph/public/components/field_manager/field_editor.tsx +++ b/x-pack/legacy/plugins/graph/public/components/field_manager/field_editor.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, ButtonHTMLAttributes } from 'react'; import { EuiPopover, EuiFormRow, @@ -23,7 +23,6 @@ import { EuiForm, EuiSpacer, EuiIconTip, - EuiComboBoxOptionProps, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import classNames from 'classnames'; @@ -224,14 +223,12 @@ export function FieldEditor({ }} singleSelection={{ asPlainText: true }} isClearable={false} - options={ - toOptions(allFields, initialField) as Array> - } + options={toOptions(allFields, initialField)} selectedOptions={[ { value: currentField.name, label: currentField.name, - type: currentField.type, + type: currentField.type as ButtonHTMLAttributes['type'], }, ]} renderOption={(option, searchValue, contentClassName) => { @@ -379,12 +376,12 @@ export function FieldEditor({ function toOptions( fields: WorkspaceField[], currentField: WorkspaceField -): Array<{ label: string; value: string; type: string }> { +): Array<{ label: string; value: string; type: ButtonHTMLAttributes['type'] }> { return fields .filter(field => !field.selected || field === currentField) .map(({ name, type }) => ({ label: name, value: name, - type, + type: type as ButtonHTMLAttributes['type'], })); } diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx index 77435fcdf3eed..8651751ea365b 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx @@ -7,7 +7,7 @@ import _ from 'lodash'; import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiComboBox, EuiFlexGroup, EuiFlexItem, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiFlexGroup, EuiFlexItem, EuiComboBoxOptionOption } from '@elastic/eui'; import classNames from 'classnames'; import { EuiHighlight } from '@elastic/eui'; import { OperationType } from '../indexpattern'; @@ -138,10 +138,10 @@ export function FieldSelect({ placeholder={i18n.translate('xpack.lens.indexPattern.fieldPlaceholder', { defaultMessage: 'Field', })} - options={(memoizedFieldOptions as unknown) as EuiComboBoxOptionProps[]} + options={(memoizedFieldOptions as unknown) as EuiComboBoxOptionOption[]} isInvalid={Boolean(incompatibleSelectedOperationType && selectedColumnOperationType)} selectedOptions={ - selectedColumnOperationType + ((selectedColumnOperationType ? selectedColumnSourceField ? [ { @@ -150,7 +150,7 @@ export function FieldSelect({ }, ] : [memoizedFieldOptions[0]] - : [] + : []) as unknown) as EuiComboBoxOptionOption[] } singleSelection={{ asPlainText: true }} onChange={choices => { diff --git a/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx b/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx index 70722d9cb953a..c744c357c9550 100644 --- a/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx +++ b/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx @@ -8,7 +8,7 @@ import React, { Fragment, FC, useEffect, useMemo } from 'react'; import { EuiComboBox, - EuiComboBoxOptionProps, + EuiComboBoxOptionOption, EuiForm, EuiFieldText, EuiFormRow, @@ -118,7 +118,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta } }; - const onCreateOption = (searchValue: string, flattenedOptions: EuiComboBoxOptionProps[]) => { + const onCreateOption = (searchValue: string, flattenedOptions: EuiComboBoxOptionOption[]) => { const normalizedSearchValue = searchValue.trim().toLowerCase(); if (!normalizedSearchValue) { @@ -132,7 +132,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta // Create the option if it doesn't exist. if ( !flattenedOptions.some( - (option: EuiComboBoxOptionProps) => + (option: EuiComboBoxOptionOption) => option.label.trim().toLowerCase() === normalizedSearchValue ) ) { @@ -164,7 +164,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta // If sourceIndex has changed load analysis field options again if (previousSourceIndex !== sourceIndex || previousJobType !== jobType) { - const analyzedFieldsOptions: EuiComboBoxOptionProps[] = []; + const analyzedFieldsOptions: EuiComboBoxOptionOption[] = []; if (resp.field_selection) { resp.field_selection.forEach((selectedField: FieldSelectionItem) => { @@ -229,7 +229,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta // Get fields and filter for supported types for job type const { fields } = newJobCapsService; - const depVarOptions: EuiComboBoxOptionProps[] = []; + const depVarOptions: EuiComboBoxOptionOption[] = []; fields.forEach((field: Field) => { if (shouldAddAsDepVarOption(field, jobType)) { @@ -276,7 +276,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta return errors; }; - const onSourceIndexChange = (selectedOptions: EuiComboBoxOptionProps[]) => { + const onSourceIndexChange = (selectedOptions: EuiComboBoxOptionOption[]) => { setFormState({ excludes: [], excludesOptions: [], diff --git a/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 1f23048e09d1f..170700d35e651 100644 --- a/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/legacy/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBoxOptionOption } from '@elastic/eui'; import { DeepPartial } from '../../../../../../../common/types/common'; import { checkPermission } from '../../../../../privilege/check_privilege'; import { mlNodesAvailable } from '../../../../../ml_nodes_check/check_ml_nodes'; @@ -46,7 +46,7 @@ export interface State { createIndexPattern: boolean; dependentVariable: DependentVariable; dependentVariableFetchFail: boolean; - dependentVariableOptions: EuiComboBoxOptionProps[] | []; + dependentVariableOptions: EuiComboBoxOptionOption[]; description: string; destinationIndex: EsIndexName; destinationIndexNameExists: boolean; @@ -54,7 +54,7 @@ export interface State { destinationIndexNameValid: boolean; destinationIndexPatternTitleExists: boolean; excludes: string[]; - excludesOptions: EuiComboBoxOptionProps[]; + excludesOptions: EuiComboBoxOptionOption[]; fieldOptionsFetchFail: boolean; jobId: DataFrameAnalyticsId; jobIdExists: boolean; diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/edit_flyout/__snapshots__/overrides.test.js.snap b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/edit_flyout/__snapshots__/overrides.test.js.snap index 997b437508c34..46428ff9c351a 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/edit_flyout/__snapshots__/overrides.test.js.snap +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/file_based/components/edit_flyout/__snapshots__/overrides.test.js.snap @@ -40,6 +40,7 @@ exports[`Overrides render overrides 1`] = ` labelType="label" > = ({ }); }; - const onQueryEntitiesChange = (selectedOptions: EuiComboBoxOption[]) => { + const onQueryEntitiesChange = (selectedOptions: EuiComboBoxOptionOption[]) => { const selectedFieldNames = selectedOptions.map(option => option.label); const kibanaSettings = customUrl.kibanaSettings; @@ -172,7 +168,7 @@ export const CustomUrlEditor: FC = ({ }); const entityOptions = queryEntityFieldNames.map(fieldName => ({ label: fieldName })); - let selectedEntityOptions: EuiComboBoxOption[] = []; + let selectedEntityOptions: EuiComboBoxOptionOption[] = []; if (kibanaSettings !== undefined && kibanaSettings.queryFieldNames !== undefined) { const queryFieldNames: string[] = kibanaSettings.queryFieldNames; selectedEntityOptions = queryFieldNames.map(fieldName => ({ label: fieldName })); diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/jobs_list/components/ml_job_editor/ml_job_editor.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/jobs_list/components/ml_job_editor/ml_job_editor.tsx index ff6706edb0179..0633c62f754e0 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/jobs_list/components/ml_job_editor/ml_job_editor.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/jobs_list/components/ml_job_editor/ml_job_editor.tsx @@ -6,7 +6,7 @@ import React, { FC } from 'react'; -import { EuiCodeEditor } from '@elastic/eui'; +import { EuiCodeEditor, EuiCodeEditorProps } from '@elastic/eui'; import { expandLiteralStrings } from '../../../../../../shared_imports'; import { xJsonMode } from '../../../../components/custom_hooks'; @@ -20,7 +20,7 @@ interface MlJobEditorProps { readOnly?: boolean; syntaxChecking?: boolean; theme?: string; - onChange?: Function; + onChange?: EuiCodeEditorProps['onChange']; } export const MLJobEditor: FC = ({ value, diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/components/job_groups_input.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/components/job_groups_input.tsx index 7211c034617f1..131e313e7c9e5 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/components/job_groups_input.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/components/job_groups_input.tsx @@ -6,7 +6,7 @@ import React, { FC, memo } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { Validation } from '../job_validator'; import { tabColor } from '../../../../../../common/util/group_color_utils'; import { Description } from '../../pages/components/job_details_step/components/groups/description'; @@ -20,28 +20,28 @@ export interface JobGroupsInputProps { export const JobGroupsInput: FC = memo( ({ existingGroups, selectedGroups, onChange, validation }) => { - const options = existingGroups.map(g => ({ + const options = existingGroups.map(g => ({ label: g, color: tabColor(g), })); - const selectedOptions = selectedGroups.map(g => ({ + const selectedOptions = selectedGroups.map(g => ({ label: g, color: tabColor(g), })); - function onChangeCallback(optionsIn: EuiComboBoxOptionProps[]) { + function onChangeCallback(optionsIn: EuiComboBoxOptionOption[]) { onChange(optionsIn.map(g => g.label)); } - function onCreateGroup(input: string, flattenedOptions: EuiComboBoxOptionProps[]) { + function onCreateGroup(input: string, flattenedOptions: EuiComboBoxOptionOption[]) { const normalizedSearchValue = input.trim().toLowerCase(); if (!normalizedSearchValue) { return; } - const newGroup: EuiComboBoxOptionProps = { + const newGroup: EuiComboBoxOptionOption = { label: input, color: tabColor(input), }; diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field_select.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field_select.tsx index 9af1226d1fe6c..869dc046648b3 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field_select.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field_select.tsx @@ -5,7 +5,7 @@ */ import React, { FC, useContext } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { JobCreatorContext } from '../../../job_creator_context'; import { Field } from '../../../../../../../../../common/types/fields'; @@ -19,14 +19,17 @@ interface Props { export const TimeFieldSelect: FC = ({ fields, changeHandler, selectedField }) => { const { jobCreator } = useContext(JobCreatorContext); - const options: EuiComboBoxOptionProps[] = createFieldOptions(fields, jobCreator.additionalFields); + const options: EuiComboBoxOptionOption[] = createFieldOptions( + fields, + jobCreator.additionalFields + ); - const selection: EuiComboBoxOptionProps[] = []; + const selection: EuiComboBoxOptionOption[] = []; if (selectedField !== null) { selection.push({ label: selectedField }); } - function onChange(selectedOptions: EuiComboBoxOptionProps[]) { + function onChange(selectedOptions: EuiComboBoxOptionOption[]) { const option = selectedOptions[0]; if (typeof option !== 'undefined') { changeHandler(option.label); diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx index 1e7327552623e..597fe42543301 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx @@ -9,7 +9,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiButtonIcon, EuiComboBox, - EuiComboBoxOptionProps, + EuiComboBoxOptionOption, EuiComboBoxProps, EuiFlexGroup, EuiFlexItem, @@ -28,10 +28,10 @@ import { GLOBAL_CALENDAR } from '../../../../../../../../../../../common/constan export const CalendarsSelection: FC = () => { const { jobCreator, jobCreatorUpdate } = useContext(JobCreatorContext); const [selectedCalendars, setSelectedCalendars] = useState(jobCreator.calendars); - const [selectedOptions, setSelectedOptions] = useState>>( + const [selectedOptions, setSelectedOptions] = useState>>( [] ); - const [options, setOptions] = useState>>([]); + const [options, setOptions] = useState>>([]); const [isLoading, setIsLoading] = useState(false); async function loadCalendars() { diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx index cf0be9d3c0c4e..841ccfdce0958 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx @@ -5,7 +5,7 @@ */ import React, { FC, useState, useContext, useEffect } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { JobCreatorContext } from '../../../job_creator_context'; import { tabColor } from '../../../../../../../../../common/util/group_color_utils'; @@ -24,28 +24,28 @@ export const GroupsInput: FC = () => { jobCreatorUpdate(); }, [selectedGroups.join()]); - const options: EuiComboBoxOptionProps[] = existingJobsAndGroups.groupIds.map((g: string) => ({ + const options: EuiComboBoxOptionOption[] = existingJobsAndGroups.groupIds.map((g: string) => ({ label: g, color: tabColor(g), })); - const selectedOptions: EuiComboBoxOptionProps[] = selectedGroups.map((g: string) => ({ + const selectedOptions: EuiComboBoxOptionOption[] = selectedGroups.map((g: string) => ({ label: g, color: tabColor(g), })); - function onChange(optionsIn: EuiComboBoxOptionProps[]) { + function onChange(optionsIn: EuiComboBoxOptionOption[]) { setSelectedGroups(optionsIn.map(g => g.label)); } - function onCreateGroup(input: string, flattenedOptions: EuiComboBoxOptionProps[]) { + function onCreateGroup(input: string, flattenedOptions: EuiComboBoxOptionOption[]) { const normalizedSearchValue = input.trim().toLowerCase(); if (!normalizedSearchValue) { return; } - const newGroup: EuiComboBoxOptionProps = { + const newGroup: EuiComboBoxOptionOption = { label: input, color: tabColor(input), }; diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx index 753cea7adcb35..9e784a20c4f5f 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx @@ -10,7 +10,7 @@ import { EuiFlexItem, EuiFlexGroup, EuiFlexGrid, - EuiComboBoxOptionProps, + EuiComboBoxOptionOption, EuiHorizontalRule, EuiTextArea, } from '@elastic/eui'; @@ -54,11 +54,11 @@ export interface ModalPayload { index?: number; } -const emptyOption: EuiComboBoxOptionProps = { +const emptyOption: EuiComboBoxOptionOption = { label: '', }; -const excludeFrequentOptions: EuiComboBoxOptionProps[] = [{ label: 'all' }, { label: 'none' }]; +const excludeFrequentOptions: EuiComboBoxOptionOption[] = [{ label: 'all' }, { label: 'none' }]; export const AdvancedDetectorModal: FC = ({ payload, @@ -90,7 +90,7 @@ export const AdvancedDetectorModal: FC = ({ const usingScriptFields = jobCreator.additionalFields.length > 0; // list of aggregation combobox options. - const aggOptions: EuiComboBoxOptionProps[] = aggs + const aggOptions: EuiComboBoxOptionOption[] = aggs .filter(agg => filterAggs(agg, usingScriptFields)) .map(createAggOption); @@ -101,19 +101,19 @@ export const AdvancedDetectorModal: FC = ({ fields ); - const allFieldOptions: EuiComboBoxOptionProps[] = [ + const allFieldOptions: EuiComboBoxOptionOption[] = [ ...createFieldOptions(fields, jobCreator.additionalFields), ].sort(comboBoxOptionsSort); - const splitFieldOptions: EuiComboBoxOptionProps[] = [ + const splitFieldOptions: EuiComboBoxOptionOption[] = [ ...allFieldOptions, ...createMlcategoryFieldOption(jobCreator.categorizationFieldName), ].sort(comboBoxOptionsSort); const eventRateField = fields.find(f => f.id === EVENT_RATE_FIELD_ID); - const onOptionChange = (func: (p: EuiComboBoxOptionProps) => any) => ( - selectedOptions: EuiComboBoxOptionProps[] + const onOptionChange = (func: (p: EuiComboBoxOptionOption) => any) => ( + selectedOptions: EuiComboBoxOptionOption[] ) => { func(selectedOptions[0] || emptyOption); }; @@ -312,7 +312,7 @@ export const AdvancedDetectorModal: FC = ({ ); }; -function createAggOption(agg: Aggregation | null): EuiComboBoxOptionProps { +function createAggOption(agg: Aggregation | null): EuiComboBoxOptionOption { if (agg === null) { return emptyOption; } @@ -328,7 +328,7 @@ function filterAggs(agg: Aggregation, usingScriptFields: boolean) { return agg.fields !== undefined && (usingScriptFields || agg.fields.length); } -function createFieldOption(field: Field | null): EuiComboBoxOptionProps { +function createFieldOption(field: Field | null): EuiComboBoxOptionOption { if (field === null) { return emptyOption; } @@ -337,7 +337,7 @@ function createFieldOption(field: Field | null): EuiComboBoxOptionProps { }; } -function createExcludeFrequentOption(excludeFrequent: string | null): EuiComboBoxOptionProps { +function createExcludeFrequentOption(excludeFrequent: string | null): EuiComboBoxOptionOption { if (excludeFrequent === null) { return emptyOption; } @@ -406,15 +406,15 @@ function createDefaultDescription(dtr: RichDetector) { // if the options list only contains one option and nothing has been selected, set // selectedOptions list to be an empty array function createSelectedOptions( - selectedOption: EuiComboBoxOptionProps, - options: EuiComboBoxOptionProps[] -): EuiComboBoxOptionProps[] { + selectedOption: EuiComboBoxOptionOption, + options: EuiComboBoxOptionOption[] +): EuiComboBoxOptionOption[] { return (options.length === 1 && options[0].label !== selectedOption.label) || selectedOption.label === '' ? [] : [selectedOption]; } -function comboBoxOptionsSort(a: EuiComboBoxOptionProps, b: EuiComboBoxOptionProps) { +function comboBoxOptionsSort(a: EuiComboBoxOptionOption, b: EuiComboBoxOptionOption) { return a.label.localeCompare(b.label); } diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx index a2434f3c33559..e4eccb5f01423 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx @@ -5,7 +5,7 @@ */ import React, { FC, useContext, useState, useEffect } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps, EuiFormRow } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; import { JobCreatorContext } from '../../../job_creator_context'; import { Field, Aggregation, AggFieldPair } from '../../../../../../../../../common/types/fields'; @@ -26,12 +26,12 @@ export interface DropDownOption { options: DropDownLabel[]; } -export type DropDownProps = DropDownLabel[] | EuiComboBoxOptionProps[]; +export type DropDownProps = DropDownLabel[] | EuiComboBoxOptionOption[]; interface Props { fields: Field[]; - changeHandler(d: EuiComboBoxOptionProps[]): void; - selectedOptions: EuiComboBoxOptionProps[]; + changeHandler(d: EuiComboBoxOptionOption[]): void; + selectedOptions: EuiComboBoxOptionOption[]; removeOptions: AggFieldPair[]; } @@ -42,7 +42,7 @@ export const AggSelect: FC = ({ fields, changeHandler, selectedOptions, r // so they can be removed from the dropdown list const removeLabels = removeOptions.map(createLabel); - const options: EuiComboBoxOptionProps[] = fields.map(f => { + const options: EuiComboBoxOptionOption[] = fields.map(f => { const aggOption: DropDownOption = { label: f.name, options: [] }; if (typeof f.aggs !== 'undefined') { aggOption.options = f.aggs diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx index 6451c2785eae0..2f3e8d43bc169 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx @@ -5,7 +5,7 @@ */ import React, { FC, useContext } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { JobCreatorContext } from '../../../job_creator_context'; import { Field } from '../../../../../../../../../common/types/fields'; @@ -19,16 +19,16 @@ interface Props { export const CategorizationFieldSelect: FC = ({ fields, changeHandler, selectedField }) => { const { jobCreator } = useContext(JobCreatorContext); - const options: EuiComboBoxOptionProps[] = [ + const options: EuiComboBoxOptionOption[] = [ ...createFieldOptions(fields, jobCreator.additionalFields), ]; - const selection: EuiComboBoxOptionProps[] = []; + const selection: EuiComboBoxOptionOption[] = []; if (selectedField !== null) { selection.push({ label: selectedField }); } - function onChange(selectedOptions: EuiComboBoxOptionProps[]) { + function onChange(selectedOptions: EuiComboBoxOptionOption[]) { const option = selectedOptions[0]; if (typeof option !== 'undefined') { changeHandler(option.label); diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers_select.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers_select.tsx index d4ac470f4ea4f..25c924ee0b42f 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers_select.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers_select.tsx @@ -5,7 +5,7 @@ */ import React, { FC, useContext } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { JobCreatorContext } from '../../../job_creator_context'; import { Field } from '../../../../../../../../../common/types/fields'; @@ -22,14 +22,14 @@ interface Props { export const InfluencersSelect: FC = ({ fields, changeHandler, selectedInfluencers }) => { const { jobCreator } = useContext(JobCreatorContext); - const options: EuiComboBoxOptionProps[] = [ + const options: EuiComboBoxOptionOption[] = [ ...createFieldOptions(fields, jobCreator.additionalFields), ...createMlcategoryFieldOption(jobCreator.categorizationFieldName), ]; - const selection: EuiComboBoxOptionProps[] = selectedInfluencers.map(i => ({ label: i })); + const selection: EuiComboBoxOptionOption[] = selectedInfluencers.map(i => ({ label: i })); - function onChange(selectedOptions: EuiComboBoxOptionProps[]) { + function onChange(selectedOptions: EuiComboBoxOptionOption[]) { changeHandler(selectedOptions.map(o => o.label)); } diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field_select.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field_select.tsx index 378c088332ed4..816614fb2a772 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field_select.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field_select.tsx @@ -5,7 +5,7 @@ */ import React, { FC } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { Field, SplitField } from '../../../../../../../../../common/types/fields'; @@ -31,7 +31,7 @@ export const SplitFieldSelect: FC = ({ testSubject, placeholder, }) => { - const options: EuiComboBoxOptionProps[] = fields.map( + const options: EuiComboBoxOptionOption[] = fields.map( f => ({ label: f.name, @@ -39,12 +39,12 @@ export const SplitFieldSelect: FC = ({ } as DropDownLabel) ); - const selection: EuiComboBoxOptionProps[] = []; + const selection: EuiComboBoxOptionOption[] = []; if (selectedField !== null) { selection.push({ label: selectedField.name, field: selectedField } as DropDownLabel); } - function onChange(selectedOptions: EuiComboBoxOptionProps[]) { + function onChange(selectedOptions: EuiComboBoxOptionOption[]) { const option = selectedOptions[0] as DropDownLabel; if (typeof option !== 'undefined') { changeHandler(option.field); diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field_select.tsx b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field_select.tsx index 6fe3aaf0a8652..8136008dce11b 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field_select.tsx +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field_select.tsx @@ -5,7 +5,7 @@ */ import React, { FC, useContext } from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { JobCreatorContext } from '../../../job_creator_context'; import { Field } from '../../../../../../../../../common/types/fields'; @@ -22,17 +22,17 @@ interface Props { export const SummaryCountFieldSelect: FC = ({ fields, changeHandler, selectedField }) => { const { jobCreator } = useContext(JobCreatorContext); - const options: EuiComboBoxOptionProps[] = [ + const options: EuiComboBoxOptionOption[] = [ ...createFieldOptions(fields, jobCreator.additionalFields), ...createDocCountFieldOption(jobCreator.aggregationFields.length > 0), ]; - const selection: EuiComboBoxOptionProps[] = []; + const selection: EuiComboBoxOptionOption[] = []; if (selectedField !== null) { selection.push({ label: selectedField }); } - function onChange(selectedOptions: EuiComboBoxOptionProps[]) { + function onChange(selectedOptions: EuiComboBoxOptionOption[]) { const option = selectedOptions[0]; if (typeof option !== 'undefined') { changeHandler(option.label); diff --git a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_control.tsx b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_control.tsx index 6727102f55a52..8911ed53e74d0 100644 --- a/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_control.tsx +++ b/x-pack/legacy/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_control.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { EuiComboBox, - EuiComboBoxOptionProps, + EuiComboBoxOptionOption, EuiFlexItem, EuiFormRow, EuiToolTip, @@ -29,13 +29,13 @@ interface EntityControlProps { isLoading: boolean; onSearchChange: (entity: Entity, queryTerm: string) => void; forceSelection: boolean; - options: EuiComboBoxOptionProps[]; + options: EuiComboBoxOptionOption[]; } interface EntityControlState { - selectedOptions: EuiComboBoxOptionProps[] | undefined; + selectedOptions: EuiComboBoxOptionOption[] | undefined; isLoading: boolean; - options: EuiComboBoxOptionProps[] | undefined; + options: EuiComboBoxOptionOption[] | undefined; } export class EntityControl extends Component { @@ -53,7 +53,7 @@ export class EntityControl extends Component 0) || (Array.isArray(selectedOptions) && @@ -84,7 +84,7 @@ export class EntityControl extends Component { + onChange = (selectedOptions: EuiComboBoxOptionOption[]) => { const options = selectedOptions.length > 0 ? selectedOptions : undefined; this.setState({ selectedOptions: options, diff --git a/x-pack/legacy/plugins/reporting/public/components/__snapshots__/report_info_button.test.tsx.snap b/x-pack/legacy/plugins/reporting/public/components/__snapshots__/report_info_button.test.tsx.snap index 2055afdcf2bfe..f89e90cc4860c 100644 --- a/x-pack/legacy/plugins/reporting/public/components/__snapshots__/report_info_button.test.tsx.snap +++ b/x-pack/legacy/plugins/reporting/public/components/__snapshots__/report_info_button.test.tsx.snap @@ -182,9 +182,13 @@ Array [ class="euiFlyoutBody__overflow" >
- Could not fetch the job info +
+ Could not fetch the job info +
@@ -243,9 +247,13 @@ Array [ class="euiFlyoutBody__overflow" >
- Could not fetch the job info +
+ Could not fetch the job info +
@@ -332,13 +340,17 @@ Array [
- -
- Could not fetch the job info -
-
+
+ +
+ Could not fetch the job info +
+
+
@@ -440,13 +452,17 @@ Array [
- -
- Could not fetch the job info -
-
+
+ +
+ Could not fetch the job info +
+
+
@@ -599,8 +615,12 @@ Array [ class="euiFlyoutBody__overflow" >
+ class="euiFlyoutBody__overflowContent" + > +
+
@@ -658,8 +678,12 @@ Array [ class="euiFlyoutBody__overflow" >
+ class="euiFlyoutBody__overflowContent" + > +
+
@@ -745,11 +769,15 @@ Array [
- -
- +
+ +
+ +
@@ -851,11 +879,15 @@ Array [
- -
- +
+ +
+ +
diff --git a/x-pack/legacy/plugins/siem/public/components/edit_data_provider/helpers.tsx b/x-pack/legacy/plugins/siem/public/components/edit_data_provider/helpers.tsx index 1b003f1336406..e6afc86a7ee67 100644 --- a/x-pack/legacy/plugins/siem/public/components/edit_data_provider/helpers.tsx +++ b/x-pack/legacy/plugins/siem/public/components/edit_data_provider/helpers.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { findIndex } from 'lodash/fp'; -import { EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBoxOptionOption } from '@elastic/eui'; import { BrowserField, BrowserFields, getAllFieldsByName } from '../../containers/source'; import { @@ -16,7 +16,7 @@ import { import * as i18n from './translations'; /** The list of operators to display in the `Operator` select */ -export const operatorLabels: EuiComboBoxOptionProps[] = [ +export const operatorLabels: EuiComboBoxOptionOption[] = [ { label: i18n.IS, }, @@ -38,7 +38,7 @@ export const getFieldNames = (category: Partial): string[] => : []; /** Returns all field names by category, for display in an `EuiComboBox` */ -export const getCategorizedFieldNames = (browserFields: BrowserFields): EuiComboBoxOptionProps[] => +export const getCategorizedFieldNames = (browserFields: BrowserFields): EuiComboBoxOptionOption[] => Object.keys(browserFields) .sort() .map(categoryId => ({ @@ -55,8 +55,8 @@ export const selectionsAreValid = ({ selectedOperator, }: { browserFields: BrowserFields; - selectedField: EuiComboBoxOptionProps[]; - selectedOperator: EuiComboBoxOptionProps[]; + selectedField: EuiComboBoxOptionOption[]; + selectedOperator: EuiComboBoxOptionOption[]; }): boolean => { const fieldId = selectedField.length > 0 ? selectedField[0].label : ''; const operator = selectedOperator.length > 0 ? selectedOperator[0].label : ''; @@ -69,7 +69,7 @@ export const selectionsAreValid = ({ /** Returns a `QueryOperator` based on the user's Operator selection */ export const getQueryOperatorFromSelection = ( - selectedOperator: EuiComboBoxOptionProps[] + selectedOperator: EuiComboBoxOptionOption[] ): QueryOperator => { const selection = selectedOperator.length > 0 ? selectedOperator[0].label : ''; @@ -88,7 +88,7 @@ export const getQueryOperatorFromSelection = ( /** * Returns `true` when the search excludes results that match the specified data provider */ -export const getExcludedFromSelection = (selectedOperator: EuiComboBoxOptionProps[]): boolean => { +export const getExcludedFromSelection = (selectedOperator: EuiComboBoxOptionOption[]): boolean => { const selection = selectedOperator.length > 0 ? selectedOperator[0].label : ''; switch (selection) { diff --git a/x-pack/legacy/plugins/siem/public/components/edit_data_provider/index.tsx b/x-pack/legacy/plugins/siem/public/components/edit_data_provider/index.tsx index 87e83e0c47b6d..5ecc96187532d 100644 --- a/x-pack/legacy/plugins/siem/public/components/edit_data_provider/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/edit_data_provider/index.tsx @@ -8,7 +8,7 @@ import { noop } from 'lodash/fp'; import { EuiButton, EuiComboBox, - EuiComboBoxOptionProps, + EuiComboBoxOptionOption, EuiFieldText, EuiFlexGroup, EuiFlexItem, @@ -64,7 +64,7 @@ const sanatizeValue = (value: string | number): string => export const getInitialOperatorLabel = ( isExcluded: boolean, operator: QueryOperator -): EuiComboBoxOptionProps[] => { +): EuiComboBoxOptionOption[] => { if (operator === ':') { return isExcluded ? [{ label: i18n.IS_NOT }] : [{ label: i18n.IS }]; } else { @@ -84,8 +84,8 @@ export const StatefulEditDataProvider = React.memo( timelineId, value, }) => { - const [updatedField, setUpdatedField] = useState([{ label: field }]); - const [updatedOperator, setUpdatedOperator] = useState( + const [updatedField, setUpdatedField] = useState([{ label: field }]); + const [updatedOperator, setUpdatedOperator] = useState( getInitialOperatorLabel(isExcluded, operator) ); const [updatedValue, setUpdatedValue] = useState(value); @@ -105,13 +105,13 @@ export const StatefulEditDataProvider = React.memo( } }; - const onFieldSelected = useCallback((selectedField: EuiComboBoxOptionProps[]) => { + const onFieldSelected = useCallback((selectedField: EuiComboBoxOptionOption[]) => { setUpdatedField(selectedField); focusInput(); }, []); - const onOperatorSelected = useCallback((operatorSelected: EuiComboBoxOptionProps[]) => { + const onOperatorSelected = useCallback((operatorSelected: EuiComboBoxOptionOption[]) => { setUpdatedOperator(operatorSelected); focusInput(); diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/search_super_select/index.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/search_super_select/index.tsx index b8280aedd12fa..be83a4f7b33a7 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/search_super_select/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/search_super_select/index.tsx @@ -16,8 +16,8 @@ import { EuiFilterButton, EuiFilterGroup, EuiPortal, + EuiSelectableOption, } from '@elastic/eui'; -import { Option } from '@elastic/eui/src/components/selectable/types'; import { isEmpty } from 'lodash/fp'; import React, { memo, useCallback, useMemo, useState } from 'react'; import { ListProps } from 'react-virtualized'; @@ -91,10 +91,10 @@ const getBasicSelectableOptions = (timelineId: string) => [ description: i18n.DEFAULT_TIMELINE_DESCRIPTION, favorite: [], label: i18n.DEFAULT_TIMELINE_TITLE, - id: null, + id: undefined, title: i18n.DEFAULT_TIMELINE_TITLE, checked: timelineId === '-1' ? 'on' : undefined, - } as Option, + } as EuiSelectableOption, ]; const ORIGINAL_PAGE_SIZE = 50; @@ -326,7 +326,7 @@ const SearchTimelineSuperSelectComponent: React.FC diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx index 2214190de6a16..8cbad4e89c106 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx @@ -42,7 +42,7 @@ export const getActions = ( ) => [ { description: i18n.EDIT_RULE_SETTINGS, - icon: 'visControls', + icon: 'controlsHorizontal', name: i18n.EDIT_RULE_SETTINGS, onClick: (rowItem: Rule) => editRuleAction(rowItem, history), enabled: (rowItem: Rule) => !rowItem.immutable, diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/import_rule_modal/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/import_rule_modal/index.tsx index 9a68797aea79b..97649fb03dac0 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/import_rule_modal/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/import_rule_modal/index.tsx @@ -113,8 +113,8 @@ export const ImportRuleModalComponent = ({ { - setSelectedFiles(Object.keys(files).length > 0 ? files : null); + onChange={(files: FileList | null) => { + setSelectedFiles(files && files.length > 0 ? files : null); }} display={'large'} fullWidth={true} diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx index 83dd18f0f14b7..cd255b0951597 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx @@ -274,7 +274,7 @@ const RuleDetailsPageComponent: FC = ({ {ruleI18n.EDIT_RULE_SETTINGS} diff --git a/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx b/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx index 9ff235fb40d8a..157e0f76856c8 100644 --- a/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx +++ b/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx @@ -6,12 +6,12 @@ import React from 'react'; -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; interface Props { - options: EuiComboBoxOptionProps[]; + options: EuiComboBoxOptionOption[]; placeholder?: string; - changeHandler(d: EuiComboBoxOptionProps[]): void; + changeHandler(d: EuiComboBoxOptionOption[]): void; testSubj?: string; } diff --git a/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/step_define/common.ts b/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/step_define/common.ts index 7b78d4ffccfa1..35e1ea02a5cef 100644 --- a/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/step_define/common.ts +++ b/x-pack/legacy/plugins/transform/public/app/sections/create_transform/components/step_define/common.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { get } from 'lodash'; -import { EuiComboBoxOptionProps, EuiDataGridSorting } from '@elastic/eui'; +import { EuiComboBoxOptionOption, EuiDataGridSorting } from '@elastic/eui'; import { IndexPattern, KBN_FIELD_TYPES, @@ -112,11 +112,11 @@ const illegalEsAggNameChars = /[[\]>]/g; export function getPivotDropdownOptions(indexPattern: IndexPattern) { // The available group by options - const groupByOptions: EuiComboBoxOptionProps[] = []; + const groupByOptions: EuiComboBoxOptionOption[] = []; const groupByOptionsData: PivotGroupByConfigWithUiSupportDict = {}; // The available aggregations - const aggOptions: EuiComboBoxOptionProps[] = []; + const aggOptions: EuiComboBoxOptionOption[] = []; const aggOptionsData: PivotAggsConfigWithUiSupportDict = {}; const ignoreFieldNames = ['_id', '_index', '_type']; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx index ba07d6c63b36c..7705c72fa14a0 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; import { PingResults, Ping } from '../../../../../common/graphql/types'; import { PingListComponent, AllLocationOption, toggleDetails } from '../ping_list'; -import { EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBoxOptionOption } from '@elastic/eui'; import { ExpandedRowMap } from '../../monitor_list/types'; describe('PingList component', () => { @@ -205,7 +205,7 @@ describe('PingList component', () => { loading={false} data={{ allPings }} onPageCountChange={jest.fn()} - onSelectedLocationChange={(loc: EuiComboBoxOptionProps[]) => {}} + onSelectedLocationChange={(loc: EuiComboBoxOptionOption[]) => {}} onSelectedStatusChange={jest.fn()} pageSize={30} selectedOption="down" diff --git a/x-pack/package.json b/x-pack/package.json index 585d05b3c8a13..11068bcccf561 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -179,7 +179,7 @@ "@elastic/apm-rum-react": "^0.3.2", "@elastic/datemath": "5.0.2", "@elastic/ems-client": "7.6.0", - "@elastic/eui": "19.0.0", + "@elastic/eui": "20.0.2", "@elastic/filesaver": "1.1.2", "@elastic/maki": "6.1.0", "@elastic/node-crypto": "^1.0.0", diff --git a/x-pack/plugins/infra/public/components/source_configuration/add_log_column_popover.tsx b/x-pack/plugins/infra/public/components/source_configuration/add_log_column_popover.tsx index 0835a904585ed..3c96d505dce4d 100644 --- a/x-pack/plugins/infra/public/components/source_configuration/add_log_column_popover.tsx +++ b/x-pack/plugins/infra/public/components/source_configuration/add_log_column_popover.tsx @@ -5,7 +5,7 @@ */ import { EuiBadge, EuiButton, EuiPopover, EuiPopoverTitle, EuiSelectable } from '@elastic/eui'; -import { Option } from '@elastic/eui/src/components/selectable/types'; +import { EuiSelectableOption } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useMemo } from 'react'; import { v4 as uuidv4 } from 'uuid'; @@ -15,7 +15,7 @@ import { useVisibilityState } from '../../utils/use_visibility_state'; import { euiStyled } from '../../../../observability/public'; interface SelectableColumnOption { - optionProps: Option; + optionProps: EuiSelectableOption; columnConfiguration: LogColumnConfiguration; } @@ -78,13 +78,13 @@ export const AddLogColumnButtonAndPopover: React.FunctionComponent<{ [availableFields] ); - const availableOptions = useMemo( + const availableOptions = useMemo( () => availableColumnOptions.map(availableColumnOption => availableColumnOption.optionProps), [availableColumnOptions] ); const handleColumnSelection = useCallback( - (selectedOptions: Option[]) => { + (selectedOptions: EuiSelectableOption[]) => { closePopover(); const selectedOptionIndex = selectedOptions.findIndex( diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/datasets_selector.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/datasets_selector.tsx index 9c22caa4b3465..c2087e9032f59 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/datasets_selector.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/sections/top_categories/datasets_selector.tsx @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiComboBox, EuiComboBoxOptionProps } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useCallback, useMemo } from 'react'; import { getFriendlyNameForPartitionId } from '../../../../../../common/log_analysis'; -type DatasetOptionProps = EuiComboBoxOptionProps; +type DatasetOptionProps = EuiComboBoxOptionOption; export const DatasetsSelector: React.FunctionComponent<{ availableDatasets: string[]; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap index 45751997eb0d5..590ea27617adf 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/__snapshots__/remote_cluster_form.test.js.snap @@ -165,6 +165,7 @@ Array [ style="font-size:14px;display:inline-block" > @@ -473,6 +474,7 @@ Array [ style="font-size: 14px; display: inline-block;" > ; + option: EuiComboBoxOptionOption<{ isDeprecated: boolean }>; } export const RoleComboBoxOption = ({ option }: Props) => { diff --git a/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/rule_editor_panel/json_rule_editor.test.tsx b/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/rule_editor_panel/json_rule_editor.test.tsx index 43f6c50ea1172..c5b3ea433adaa 100644 --- a/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/rule_editor_panel/json_rule_editor.test.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/rule_editor_panel/json_rule_editor.test.tsx @@ -55,7 +55,7 @@ describe('JSONRuleEditor', () => { const wrapper = mountWithIntl(); const { value } = wrapper.find(EuiCodeEditor).props(); - expect(JSON.parse(value)).toEqual({ + expect(JSON.parse(value as string)).toEqual({ all: [ { any: [{ field: { username: '*' } }], @@ -90,10 +90,7 @@ describe('JSONRuleEditor', () => { const allRule = JSON.stringify(new AllRule().toRaw()); act(() => { - wrapper - .find(EuiCodeEditor) - .props() - .onChange(allRule + ', this makes invalid JSON'); + wrapper.find(EuiCodeEditor).props().onChange!(allRule + ', this makes invalid JSON'); }); expect(props.onValidityChange).toHaveBeenCalledTimes(1); @@ -121,10 +118,7 @@ describe('JSONRuleEditor', () => { }); act(() => { - wrapper - .find(EuiCodeEditor) - .props() - .onChange(invalidRule); + wrapper.find(EuiCodeEditor).props().onChange!(invalidRule); }); expect(props.onValidityChange).toHaveBeenCalledTimes(1); @@ -143,10 +137,7 @@ describe('JSONRuleEditor', () => { const allRule = JSON.stringify(new AllRule().toRaw()); act(() => { - wrapper - .find(EuiCodeEditor) - .props() - .onChange(allRule + ', this makes invalid JSON'); + wrapper.find(EuiCodeEditor).props().onChange!(allRule + ', this makes invalid JSON'); }); expect(props.onValidityChange).toHaveBeenCalledTimes(1); @@ -156,10 +147,7 @@ describe('JSONRuleEditor', () => { props.onValidityChange.mockReset(); act(() => { - wrapper - .find(EuiCodeEditor) - .props() - .onChange(allRule); + wrapper.find(EuiCodeEditor).props().onChange!(allRule); }); expect(props.onValidityChange).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/cluster_privileges.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/cluster_privileges.test.tsx.snap index b38b7e6634ada..a52438ca93638 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/cluster_privileges.test.tsx.snap +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/cluster_privileges.test.tsx.snap @@ -6,6 +6,7 @@ exports[`it renders without crashing 1`] = ` key="clusterPrivs" > { }); }; - private onIndexPatternsChange = (newPatterns: EuiComboBoxOptionProps[]) => { + private onIndexPatternsChange = (newPatterns: EuiComboBoxOptionOption[]) => { this.props.onChange({ ...this.props.indexPrivilege, names: newPatterns.map(fromOption), }); }; - private onPrivilegeChange = (newPrivileges: EuiComboBoxOptionProps[]) => { + private onPrivilegeChange = (newPrivileges: EuiComboBoxOptionOption[]) => { this.props.onChange({ ...this.props.indexPrivilege, privileges: newPrivileges.map(fromOption), @@ -418,7 +418,7 @@ export class IndexPrivilegeForm extends Component { }); }; - private onGrantedFieldsChange = (grantedFields: EuiComboBoxOptionProps[]) => { + private onGrantedFieldsChange = (grantedFields: EuiComboBoxOptionOption[]) => { this.props.onChange({ ...this.props.indexPrivilege, field_security: { @@ -447,7 +447,7 @@ export class IndexPrivilegeForm extends Component { }); }; - private onDeniedFieldsChange = (deniedFields: EuiComboBoxOptionProps[]) => { + private onDeniedFieldsChange = (deniedFields: EuiComboBoxOptionOption[]) => { this.props.onChange({ ...this.props.indexPrivilege, field_security: { diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx index 3e5ea9f146876..1e42a926c51f7 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_selector.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiComboBox, EuiComboBoxOptionProps, EuiHealth, EuiHighlight } from '@elastic/eui'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiHealth, EuiHighlight } from '@elastic/eui'; import { InjectedIntl } from '@kbn/i18n/react'; import React, { Component } from 'react'; import { Space, getSpaceColor } from '../../../../../../../../spaces/public'; @@ -65,7 +65,7 @@ export class SpaceSelector extends Component { ); } - private onChange = (selectedSpaces: EuiComboBoxOptionProps[]) => { + private onChange = (selectedSpaces: EuiComboBoxOptionOption[]) => { this.props.onChange(selectedSpaces.map(s => (s.id as string).split('spaceOption_')[1])); }; @@ -81,12 +81,12 @@ export class SpaceSelector extends Component { ) ); - return options.filter(Boolean) as EuiComboBoxOptionProps[]; + return options.filter(Boolean) as EuiComboBoxOptionOption[]; }; private getSelectedOptions = () => { const options = this.props.selectedSpaceIds.map(spaceIdToOption(this.props.spaces)); - return options.filter(Boolean) as EuiComboBoxOptionProps[]; + return options.filter(Boolean) as EuiComboBoxOptionOption[]; }; } diff --git a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_settings.tsx index 45eea10a28311..fc743767e9f70 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_settings.tsx @@ -20,7 +20,7 @@ import { EuiComboBox, EuiToolTip, } from '@elastic/eui'; -import { Option } from '@elastic/eui/src/components/selectable/types'; +import { EuiSelectableOption } from '@elastic/eui'; import { SlmPolicyPayload, SnapshotConfig } from '../../../../../common/types'; import { documentationLinksService } from '../../../services/documentation'; import { useServices } from '../../../app_context'; @@ -45,9 +45,9 @@ export const PolicyStepSettings: React.FunctionComponent = ({ // States for choosing all indices, or a subset, including caching previously chosen subset list const [isAllIndices, setIsAllIndices] = useState(!Boolean(config.indices)); const [indicesSelection, setIndicesSelection] = useState([...indices]); - const [indicesOptions, setIndicesOptions] = useState( + const [indicesOptions, setIndicesOptions] = useState( indices.map( - (index): Option => ({ + (index): EuiSelectableOption => ({ label: index, checked: isAllIndices || @@ -210,7 +210,7 @@ export const PolicyStepSettings: React.FunctionComponent = ({ data-test-subj="deselectIndicesLink" onClick={() => { // TODO: Change this to setIndicesOptions() when https://github.com/elastic/eui/issues/2071 is fixed - indicesOptions.forEach((option: Option) => { + indicesOptions.forEach((option: EuiSelectableOption) => { option.checked = undefined; }); updatePolicyConfig({ indices: [] }); @@ -226,7 +226,7 @@ export const PolicyStepSettings: React.FunctionComponent = ({ { // TODO: Change this to setIndicesOptions() when https://github.com/elastic/eui/issues/2071 is fixed - indicesOptions.forEach((option: Option) => { + indicesOptions.forEach((option: EuiSelectableOption) => { option.checked = 'on'; }); updatePolicyConfig({ indices: [...indices] }); diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/hdfs_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/hdfs_settings.tsx index c504cccf0ac4b..6d936f41206cc 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/hdfs_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/hdfs_settings.tsx @@ -5,6 +5,7 @@ */ import React, { Fragment, useState } from 'react'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCode, @@ -391,15 +392,13 @@ export const HDFSSettings: React.FunctionComponent = ({ }} showGutter={false} minLines={6} - aria-label={ - - } + aria-label={i18n.translate( + 'xpack.snapshotRestore.repositoryForm.typeHDFS.configurationAriaLabel', + { + defaultMessage: `Additional configuration for HDFS repository '{name}'`, + values: { name }, + } + )} onChange={(value: string) => { setAdditionalConf(value); try { diff --git a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_logistics.tsx b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_logistics.tsx index 6780ab4bc664e..0896b283a6762 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_logistics.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_logistics.tsx @@ -20,7 +20,7 @@ import { EuiTitle, EuiComboBox, } from '@elastic/eui'; -import { Option } from '@elastic/eui/src/components/selectable/types'; +import { EuiSelectableOption } from '@elastic/eui'; import { RestoreSettings } from '../../../../../common/types'; import { documentationLinksService } from '../../../services/documentation'; import { useServices } from '../../../app_context'; @@ -48,9 +48,9 @@ export const RestoreSnapshotStepLogistics: React.FunctionComponent = // States for choosing all indices, or a subset, including caching previously chosen subset list const [isAllIndices, setIsAllIndices] = useState(!Boolean(restoreIndices)); - const [indicesOptions, setIndicesOptions] = useState( + const [indicesOptions, setIndicesOptions] = useState( snapshotIndices.map( - (index): Option => ({ + (index): EuiSelectableOption => ({ label: index, checked: isAllIndices || @@ -230,7 +230,7 @@ export const RestoreSnapshotStepLogistics: React.FunctionComponent = { // TODO: Change this to setIndicesOptions() when https://github.com/elastic/eui/issues/2071 is fixed - indicesOptions.forEach((option: Option) => { + indicesOptions.forEach((option: EuiSelectableOption) => { option.checked = undefined; }); updateRestoreSettings({ indices: [] }); @@ -249,7 +249,7 @@ export const RestoreSnapshotStepLogistics: React.FunctionComponent = { // TODO: Change this to setIndicesOptions() when https://github.com/elastic/eui/issues/2071 is fixed - indicesOptions.forEach((option: Option) => { + indicesOptions.forEach((option: EuiSelectableOption) => { option.checked = 'on'; }); updateRestoreSettings({ indices: [...snapshotIndices] }); diff --git a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_review.tsx b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_review.tsx index 3f7daea361f7f..52d162d0963f3 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_review.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_review.tsx @@ -282,12 +282,10 @@ export const RestoreSnapshotStepReview: React.FunctionComponent = ({ setOptions={{ maxLines: Infinity }} value={JSON.stringify(serializedRestoreSettings, null, 2)} editorProps={{ $blockScrolling: Infinity }} - aria-label={ - - } + aria-label={i18n.translate( + 'xpack.snapshotRestore.restoreForm.stepReview.jsonTab.jsonAriaLabel', + { defaultMessage: 'Restore settings to be executed' } + )} /> ); diff --git a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_settings.tsx index fd29fc3105f90..d9a5a06d862d6 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/restore_snapshot_form/steps/step_settings.tsx @@ -183,12 +183,10 @@ export const RestoreSnapshotStepSettings: React.FunctionComponent = ( showGutter={false} minLines={6} maxLines={15} - aria-label={ - - } + aria-label={i18n.translate( + 'xpack.snapshotRestore.restoreForm.stepSettings.indexSettingsAriaLabel', + { defaultMessage: 'Index settings to modify' } + )} onChange={(value: string) => { updateRestoreSettings({ indexSettings: value, diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/tabs/tab_history.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/tabs/tab_history.tsx index 708042359d088..22c37241348e7 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/tabs/tab_history.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/tabs/tab_history.tsx @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { Fragment } from 'react'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCodeEditor, @@ -155,15 +156,13 @@ export const TabHistory: React.FunctionComponent = ({ policy }) => { maxLines={12} wrapEnabled={true} showGutter={false} - aria-label={ - - } + aria-label={i18n.translate( + 'xpack.snapshotRestore.policyDetails.lastFailure.detailsAriaLabel', + { + defaultMessage: `Last failure details for policy '{name}'`, + values: { name }, + } + )} /> diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/type_details/default_details.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/type_details/default_details.tsx index 6b99628863e77..80bf9fdee24e1 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/type_details/default_details.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/type_details/default_details.tsx @@ -6,6 +6,7 @@ import 'brace/theme/textmate'; import React, { Fragment } from 'react'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCodeEditor, EuiSpacer, EuiTitle } from '@elastic/eui'; @@ -47,15 +48,15 @@ export const DefaultDetails: React.FunctionComponent = ({ }} showGutter={false} minLines={6} - aria-label={ - - } + }, + } + )} /> ); diff --git a/x-pack/plugins/spaces/public/management/edit_space/customize_space/__snapshots__/customize_space_avatar.test.tsx.snap b/x-pack/plugins/spaces/public/management/edit_space/customize_space/__snapshots__/customize_space_avatar.test.tsx.snap index 562641d8fca51..269b2b6908183 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/customize_space/__snapshots__/customize_space_avatar.test.tsx.snap +++ b/x-pack/plugins/spaces/public/management/edit_space/customize_space/__snapshots__/customize_space_avatar.test.tsx.snap @@ -53,14 +53,7 @@ exports[`renders without crashing 1`] = ` labelType="label" > { image.src = imgUrl; }; - private onFileUpload = (files: File[]) => { - const [file] = files; + private onFileUpload = (files: FileList | null) => { + if (files == null) return; + const file = files[0]; if (imageTypes.indexOf(file.type) > -1) { encode(file).then((dataurl: string) => this.handleImageUpload(dataurl)); } @@ -169,7 +170,7 @@ export class CustomizeSpaceAvatar extends Component { } )} onChange={this.onFileUpload} - accept={imageTypes} + accept={imageTypes.join(',')} /> ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx index fecf846ed6c9a..8625487282880 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx @@ -473,8 +473,6 @@ const WebhookParamsFields: React.FunctionComponent 0 && body !== undefined} mode="json" width="100%" height="200px" diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx index a2ef67be7bca2..866a7e497742c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx @@ -17,7 +17,7 @@ import { EuiSelect, EuiSpacer, EuiComboBox, - EuiComboBoxOptionProps, + EuiComboBoxOptionOption, EuiFormRow, EuiCallOut, } from '@elastic/eui'; @@ -104,7 +104,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent>([]); - const [indexOptions, setIndexOptions] = useState([]); + const [indexOptions, setIndexOptions] = useState([]); const [timeFieldOptions, setTimeFieldOptions] = useState([firstFieldOption]); const [isIndiciesLoading, setIsIndiciesLoading] = useState(false); @@ -256,7 +256,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent { + onChange={async (selected: EuiComboBoxOptionOption[]) => { setAlertParams( 'index', selected.map(aSelected => aSelected.value) diff --git a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/of.test.tsx b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/of.test.tsx index 2e674f4fb47b1..4d0017ce5c8e6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/of.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/of.test.tsx @@ -23,6 +23,7 @@ describe('of expression', () => { expect(wrapper.find('[data-test-subj="availablefieldsOptionsComboBox"]')) .toMatchInlineSnapshot(` { ); expect(wrapper.find('[data-test-subj="availablefieldsOptionsComboBox"]')) .toMatchInlineSnapshot(` - + /> `); }); diff --git a/x-pack/plugins/watcher/public/application/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/application/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index c906d05be64be..b9fce52b480ef 100644 --- a/x-pack/plugins/watcher/public/application/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/application/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -374,7 +374,6 @@ export const JsonWatchEditSimulate = ({ errors={executeWatchErrors} > = ({ errors={errors} > { value: anIndex, }; })} - onChange={async (selected: EuiComboBoxOptionProps[]) => { + onChange={async (selected: EuiComboBoxOptionOption[]) => { setWatchProperty( 'index', selected.map(aSelected => aSelected.value) diff --git a/x-pack/typings/@elastic/eui/index.d.ts b/x-pack/typings/@elastic/eui/index.d.ts index 688d1a2fa127d..ea7a81fa986ce 100644 --- a/x-pack/typings/@elastic/eui/index.d.ts +++ b/x-pack/typings/@elastic/eui/index.d.ts @@ -7,7 +7,6 @@ // TODO: Remove once typescript definitions are in EUI declare module '@elastic/eui' { - export const EuiCodeEditor: React.FC; export const Query: any; } diff --git a/yarn.lock b/yarn.lock index dde08490d62f0..1cf77d50d7dbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1952,16 +1952,17 @@ tabbable "^1.1.0" uuid "^3.1.0" -"@elastic/eui@19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-19.0.0.tgz#cf7d644945c95997d442585cf614e853f173746e" - integrity sha512-8/USz56MYhu6bV4oecJct7tsdi0ktErOIFLobNmQIKdxDOni/KpttX6IHqxM7OuIWi1AEMXoIozw68+oyL/uKQ== +"@elastic/eui@20.0.2": + version "20.0.2" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-20.0.2.tgz#c64b16fef15da6aa9e627d45cdd372f1fc676359" + integrity sha512-8TtazI7RO1zJH4Qkl6TZKvAxaFG9F8BEdwyGmbGhyvXOJbkvttRzoaEg9jSQpKr+z7w2vsjGNbza/fEAE41HOA== dependencies: "@types/chroma-js" "^1.4.3" "@types/enzyme" "^3.1.13" "@types/lodash" "^4.14.116" "@types/numeral" "^0.0.25" "@types/react-beautiful-dnd" "^10.1.0" + "@types/react-input-autosize" "^2.0.2" "@types/react-virtualized" "^9.18.7" chroma-js "^2.0.4" classnames "^2.2.5" @@ -5011,6 +5012,13 @@ dependencies: "@types/react" "*" +"@types/react-input-autosize@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/react-input-autosize/-/react-input-autosize-2.0.2.tgz#6ccdfb100c21b6096c1a04c3c3fac196b0ce61c1" + integrity sha512-QzewaD5kog7c6w5e3dretb+50oM8RDdDvVumQKCtPjI6VHyR8lA/HxCiTrv5l9Vgbi4NCitYuix/NorOevlrng== + dependencies: + "@types/react" "*" + "@types/react-intl@^2.3.15": version "2.3.17" resolved "https://registry.yarnpkg.com/@types/react-intl/-/react-intl-2.3.17.tgz#e1fc6e46e8af58bdef9531259d509380a8a99e8e" From 2f97b4c06aefb01c0d800b4b695710547db60592 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 5 Mar 2020 11:32:32 -0800 Subject: [PATCH 08/25] [DOCS] Updates Snapshot and Restore doc (#59451) * [DOCS] Updates Snapshot and Restore doc * [DOCS] Incorporates review comment --- .../images/snapshot_permissions.png | Bin 0 -> 86563 bytes .../snapshot-restore/index.asciidoc | 122 ++++++++++-------- 2 files changed, 67 insertions(+), 55 deletions(-) create mode 100644 docs/management/snapshot-restore/images/snapshot_permissions.png diff --git a/docs/management/snapshot-restore/images/snapshot_permissions.png b/docs/management/snapshot-restore/images/snapshot_permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..463d4d6e389c61557cbc90a5231a0581af857586 GIT binary patch literal 86563 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:aD#DJlBNY}#yS6LzfhUC&+RFM$Pip-9+^9ri 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 Elasticsearch*. +You’ll find *Snapshot and Restore* under *Management > Elasticsearch*. With this UI, you can: * Register a repository for storing your snapshots @@ -20,29 +20,42 @@ With this UI, you can: [role="screenshot"] image:management/snapshot-restore/images/snapshot_list.png["Snapshot list"] -Before using this feature, you should be familiar with how snapshots work. -{ref}/snapshot-restore.html[Snapshot and Restore] is a good source for +Before using this feature, you should be familiar with how snapshots work. +{ref}/snapshot-restore.html[Snapshot and Restore] is a good source for more detailed information. +[float] +[[snapshot-permissions]] +=== Required permissions +The minimum required permissions to access *Snapshot and Restore* include: + +* Cluster privileges: `monitor`, `manage_slm`, `cluster:admin/snapshot`, and `cluster:admin/repository` +* Index privileges: `all` on the `monitor` index if you want to access content in the *Restore Status* tab + +You can add these privileges in *Management > Security > Roles*. + +[role="screenshot"] +image:management/snapshot-restore/images/snapshot_permissions.png["Edit Role"] + [float] [[kib-snapshot-register-repository]] === Register a repository -A repository is where your snapshots live. You must register a snapshot -repository before you can perform snapshot and restore operations. +A repository is where your snapshots live. You must register a snapshot +repository before you can perform snapshot and restore operations. -If you don't have a repository, Kibana walks you through the process of -registering one. +If you don't have a repository, Kibana walks you through the process of +registering one. {kib} supports three repository types -out of the box: shared file system, read-only URL, and source-only. -For more information on these repositories and their settings, +out of the box: shared file system, read-only URL, and source-only. +For more information on these repositories and their settings, see {ref}/snapshots-register-repository.html[Repositories]. -To use other repositories, such as S3, see +To use other repositories, such as S3, see {ref}/snapshots-register-repository.html#snapshots-repository-plugins[Repository plugins]. -Once you create a repository, it is listed in the *Repositories* -view. -Click a repository name to view its type, number of snapshots, and settings, +Once you create a repository, it is listed in the *Repositories* +view. +Click a repository name to view its type, number of snapshots, and settings, and to verify status. [role="screenshot"] @@ -53,46 +66,46 @@ image:management/snapshot-restore/images/repository_list.png["Repository list"] [[kib-view-snapshot]] === View your snapshots -A snapshot is a backup taken from a running {es} cluster. You'll find an overview of -your snapshots in the *Snapshots* view, and you can drill down +A snapshot is a backup taken from a running {es} cluster. You'll find an overview of +your snapshots in the *Snapshots* view, and you can drill down into each snapshot for further investigation. [role="screenshot"] image:management/snapshot-restore/images/snapshot_details.png["Snapshot details"] -If you don’t have any snapshots, you can create them from the {kib} <>. The +If you don’t have any snapshots, you can create them from the {kib} <>. The {ref}/snapshots-take-snapshot.html[snapshot API] -takes the current state and data in your index or cluster, and then saves it to a -shared repository. +takes the current state and data in your index or cluster, and then saves it to a +shared repository. -The snapshot process is "smart." Your first snapshot is a complete copy of +The snapshot process is "smart." Your first snapshot is a complete copy of the data in your index or cluster. -All subsequent snapshots save the changes between the existing snapshots and +All subsequent snapshots save the changes between the existing snapshots and the new data. [float] [[kib-restore-snapshot]] === Restore a snapshot -The information stored in a snapshot is not tied to a specific +The information stored in a snapshot is not tied to a specific cluster or a cluster name. This enables you to -restore a snapshot made from one cluster to another cluster. You might +restore a snapshot made from one cluster to another cluster. You might use the restore operation to: * Recover data lost due to a failure * Migrate a current Elasticsearch cluster to a new version * Move data from one cluster to another cluster -To get started, go to the *Snapshots* view, find the -snapshot, and click the restore icon in the *Actions* column. +To get started, go to the *Snapshots* view, find the +snapshot, and click the restore icon in the *Actions* column. The Restore wizard presents -options for the restore operation, including which +options for the restore operation, including which indices to restore and whether to modify the index settings. -You can restore an existing index only if it’s closed and has the same +You can restore an existing index only if it’s closed and has the same number of shards as the index in the snapshot. Once you initiate the restore, you're navigated to the *Restore Status* view, -where you can track the current state for each shard in the snapshot. +where you can track the current state for each shard in the snapshot. [role="screenshot"] image:management/snapshot-restore/images/snapshot-restore.png["Snapshot details"] @@ -102,26 +115,26 @@ image:management/snapshot-restore/images/snapshot-restore.png["Snapshot details" [[kib-snapshot-policy]] === Create a snapshot lifecycle policy -Use a {ref}/snapshot-lifecycle-management-api.html[snapshot lifecycle policy] -to automate the creation and deletion +Use a {ref}/snapshot-lifecycle-management-api.html[snapshot lifecycle policy] +to automate the creation and deletion of cluster snapshots. Taking automatic snapshots: * Ensures your {es} indices and clusters are backed up on a regular basis -* Ensures a recent and relevant snapshot is available if a situation +* Ensures a recent and relevant snapshot is available if a situation arises where a cluster needs to be recovered -* Allows you to manage your snapshots in {kib}, instead of using a +* Allows you to manage your snapshots in {kib}, instead of using a third-party tool - -If you don’t have any snapshot policies, follow the -*Create policy* wizard. It walks you through defining -when and where to take snapshots, the settings you want, + +If you don’t have any snapshot policies, follow the +*Create policy* wizard. It walks you through defining +when and where to take snapshots, the settings you want, and how long to retain snapshots. [role="screenshot"] image:management/snapshot-restore/images/snapshot-retention.png["Snapshot details"] An overview of your policies is on the *Policies* view. -You can drill down into each policy to examine its settings and last successful and failed run. +You can drill down into each policy to examine its settings and last successful and failed run. You can perform the following actions on a snapshot policy: @@ -139,8 +152,8 @@ image:management/snapshot-restore/images/create-policy.png["Snapshot details"] === Delete a snapshot Delete snapshots to manage your repository storage space. -Find the snapshot in the *Snapshots* view and click the trash icon in the -*Actions* column. To delete snapshots in bulk, select their checkboxes, +Find the snapshot in the *Snapshots* view and click the trash icon in the +*Actions* column. To delete snapshots in bulk, select their checkboxes, and then click *Delete snapshots*. [[snapshot-repositories-example]] @@ -159,10 +172,10 @@ Ready to try *Snapshot and Restore*? In this tutorial, you'll learn to: ==== Before you begin -This example shows you how to register a shared file system repository +This example shows you how to register a shared file system repository and store snapshots. -Before you begin, you must register the location of the repository in the -{ref}/snapshots-register-repository.html#snapshots-filesystem-repository[path.repo] setting on +Before you begin, you must register the location of the repository in the +{ref}/snapshots-register-repository.html#snapshots-filesystem-repository[path.repo] setting on your master and data nodes. You can do this in one of two ways: * Edit your `elasticsearch.yml` to include the `path.repo` setting. @@ -175,14 +188,14 @@ your master and data nodes. You can do this in one of two ways: [[register-repo-example]] ==== Register a repository -Use *Snapshot and Restore* to register the repository where your snapshots -will live. +Use *Snapshot and Restore* to register the repository where your snapshots +will live. . Go to *Management > Elasticsearch > Snapshot and Restore*. . Click *Register a repository* in either the introductory message or *Repository view*. . Enter a name for your repository, for example, `my_backup`. . Select *Shared file system*. -+ ++ [role="screenshot"] image:management/snapshot-restore/images/register_repo.png["Register repository"] @@ -205,13 +218,13 @@ Use the {ref}/snapshots-take-snapshot.html[snapshot API] to create a snapshot. [source,js] PUT /_snapshot/my_backup/2019-04-25_snapshot?wait_for_completion=true + -In this example, the snapshot name is `2019-04-25_snapshot`. You can also +In this example, the snapshot name is `2019-04-25_snapshot`. You can also use {ref}/date-math-index-names.html[date math expression] for the snapshot name. + [role="screenshot"] image:management/snapshot-restore/images/create_snapshot.png["Create snapshot"] -. Return to *Snapshot and Restore*. +. Return to *Snapshot and Restore*. + Your new snapshot is available in the *Snapshots* view. @@ -223,7 +236,7 @@ using the repository created in the previous example. . Open the *Policies* view. . Click *Create a policy*. -+ ++ [role="screenshot"] image:management/snapshot-restore/images/create-policy-example.png["Create policy wizard"] @@ -288,17 +301,16 @@ Finally, you'll restore indices from an existing snapshot. |*Index settings* | |Modify index settings -|Toggle to overwrite index settings when they are restored, +|Toggle to overwrite index settings when they are restored, or leave in place to keep existing settings. |Reset index settings -|Toggle to reset index settings back to the default when they are restored, +|Toggle to reset index settings back to the default when they are restored, or leave in place to keep existing settings. |=== . Review your restore settings, and then click *Restore snapshot*. + -The operation loads for a few seconds, -and then you’re navigated to *Restore Status*, +The operation loads for a few seconds, +and then you’re navigated to *Restore Status*, where you can monitor the status of your restored indices. - From 26aed8dc30ab83f1656fe7a6ec354b68a2f1aeb3 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Thu, 5 Mar 2020 11:55:30 -0800 Subject: [PATCH 09/25] Extended AlertContextValue with metadata optional property (#59391) * Extended AlertContextValue with metadata optional property * Made metadata generic --- .../threshold/expression.tsx | 3 +- .../application/context/alerts_context.tsx | 3 +- .../sections/alert_form/alert_add.test.tsx | 33 +++++++++++++++---- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx index 866a7e497742c..9a01a7f50c3df 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx @@ -143,7 +143,8 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent 0) { + + if (index && index.length > 0) { const currentEsFields = await getFields(index); const timeFields = getTimeFieldOptions(currentEsFields as any); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx b/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx index 1ffebed2eb002..a8578acc24636 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx @@ -11,7 +11,7 @@ import { DataPublicPluginSetup } from 'src/plugins/data/public'; import { TypeRegistry } from '../type_registry'; import { AlertTypeModel, ActionTypeModel } from '../../types'; -export interface AlertsContextValue { +export interface AlertsContextValue> { reloadAlerts?: () => Promise; http: HttpSetup; alertTypeRegistry: TypeRegistry; @@ -23,6 +23,7 @@ export interface AlertsContextValue { >; charts?: ChartsPluginSetup; dataFieldsFormats?: DataPublicPluginSetup['fieldFormats']; + metadata?: MetaData; } const AlertsContext = createContext(null as any); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx index 7bc44eafe7543..1177b41788bd6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx @@ -6,11 +6,13 @@ import * as React from 'react'; import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; import { act } from 'react-dom/test-utils'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiFormLabel } from '@elastic/eui'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { AlertAdd } from './alert_add'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; -import { AlertsContextProvider } from '../../context/alerts_context'; +import { AlertsContextProvider, useAlertsContext } from '../../context/alerts_context'; import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; @@ -18,6 +20,21 @@ import { ReactWrapper } from 'enzyme'; const actionTypeRegistry = actionTypeRegistryMock.create(); const alertTypeRegistry = alertTypeRegistryMock.create(); +export const TestExpression: React.FunctionComponent = () => { + const alertsContext = useAlertsContext(); + const { metadata } = alertsContext; + + return ( + + + + ); +}; + describe('alert_add', () => { let deps: any; let wrapper: ReactWrapper; @@ -41,7 +58,7 @@ describe('alert_add', () => { validate: (): ValidationResult => { return { errors: {} }; }, - alertParamsExpression: () => , + alertParamsExpression: TestExpression, }; const actionTypeModel = { @@ -77,13 +94,10 @@ describe('alert_add', () => { alertTypeRegistry: deps.alertTypeRegistry, toastNotifications: deps.toastNotifications, uiSettings: deps.uiSettings, + metadata: { test: 'some value', fields: ['test'] }, }} > - {}} - /> + {}} /> ); // Wait for active space to resolve before requesting the component to update @@ -97,5 +111,10 @@ describe('alert_add', () => { await setup(); expect(wrapper.find('[data-test-subj="addAlertFlyoutTitle"]').exists()).toBeTruthy(); expect(wrapper.find('[data-test-subj="saveAlertButton"]').exists()).toBeTruthy(); + wrapper + .find('[data-test-subj="my-alert-type-SelectOption"]') + .first() + .simulate('click'); + expect(wrapper.contains('Metadata: some value. Fields: test.')).toBeTruthy(); }); }); From 4bc9e8b4a891c2949e8da9a6a5175144e8753015 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 5 Mar 2020 13:01:42 -0700 Subject: [PATCH 10/25] Fix visual baseline job (#59348) * Establish Percy baselines * move Jenkinsfile changed back to `.ci` directory * rename xpack workers Co-authored-by: Elastic Machine --- .ci/Jenkinsfile_visual_baseline | 14 +-- test/functional/services/elastic_chart.ts | 6 +- test/scripts/jenkins_visual_regression.sh | 14 ++- .../jenkins_xpack_visual_regression.sh | 18 +++- .../services/visual_testing/visual_testing.ts | 7 ++ ...isualization.js => chart_visualization.ts} | 91 +++++++------------ .../tests/discover/{index.js => index.ts} | 8 +- .../{config.js => config.ts} | 11 +-- .../ftr_provider_context.d.ts | 12 +++ x-pack/test/visual_regression/page_objects.ts | 9 ++ x-pack/test/visual_regression/services.ts | 13 +++ .../tests/{login_page.js => login_page.ts} | 4 +- 12 files changed, 119 insertions(+), 88 deletions(-) rename test/visual_regression/tests/discover/{chart_visualization.js => chart_visualization.ts} (55%) rename test/visual_regression/tests/discover/{index.js => index.ts} (86%) rename x-pack/test/visual_regression/{config.js => config.ts} (69%) create mode 100644 x-pack/test/visual_regression/ftr_provider_context.d.ts create mode 100644 x-pack/test/visual_regression/page_objects.ts create mode 100644 x-pack/test/visual_regression/services.ts rename x-pack/test/visual_regression/tests/{login_page.js => login_page.ts} (91%) diff --git a/.ci/Jenkinsfile_visual_baseline b/.ci/Jenkinsfile_visual_baseline index 4a1e0f7d74e07..5c13ccccd9c6f 100644 --- a/.ci/Jenkinsfile_visual_baseline +++ b/.ci/Jenkinsfile_visual_baseline @@ -6,13 +6,15 @@ kibanaLibrary.load() kibanaPipeline(timeoutMinutes: 120) { catchError { parallel([ - workers.base(name: 'oss-visualRegression', label: 'linux && immutable') { - kibanaPipeline.buildOss() - kibanaPipeline.functionalTestProcess('oss-visualRegression', './test/scripts/jenkins_visual_regression.sh') + 'oss-visualRegression': { + workers.ci(name: 'oss-visualRegression', label: 'linux && immutable', ramDisk: false) { + kibanaPipeline.functionalTestProcess('oss-visualRegression', './test/scripts/jenkins_visual_regression.sh')(1) + } }, - workers.base(name: 'xpack-visualRegression', label: 'linux && immutable') { - kibanaPipeline.buildXpack() - kibanaPipeline.functionalTestProcess('xpack-visualRegression', './test/scripts/jenkins_xpack_visual_regression.sh') + 'xpack-visualRegression': { + workers.ci(name: 'xpack-visualRegression', label: 'linux && immutable', ramDisk: false) { + kibanaPipeline.functionalTestProcess('xpack-visualRegression', './test/scripts/jenkins_xpack_visual_regression.sh')(1) + } }, ]) } diff --git a/test/functional/services/elastic_chart.ts b/test/functional/services/elastic_chart.ts index 45ad157fc5c02..1c3071ac01587 100644 --- a/test/functional/services/elastic_chart.ts +++ b/test/functional/services/elastic_chart.ts @@ -51,11 +51,11 @@ export function ElasticChartProvider({ getService }: FtrProviderContext) { return Number(renderingCount); } - public async waitForRenderingCount(dataTestSubj: string, previousCount = 1) { - await retry.waitFor(`rendering count to be equal to [${previousCount + 1}]`, async () => { + public async waitForRenderingCount(dataTestSubj: string, minimumCount: number) { + await retry.waitFor(`rendering count to be equal to [${minimumCount}]`, async () => { const currentRenderingCount = await this.getVisualizationRenderingCount(dataTestSubj); log.debug(`-- currentRenderingCount=${currentRenderingCount}`); - return currentRenderingCount === previousCount + 1; + return currentRenderingCount >= minimumCount; }); } } diff --git a/test/scripts/jenkins_visual_regression.sh b/test/scripts/jenkins_visual_regression.sh index dda966dea98d0..4fdd197147eac 100755 --- a/test/scripts/jenkins_visual_regression.sh +++ b/test/scripts/jenkins_visual_regression.sh @@ -1,10 +1,18 @@ #!/usr/bin/env bash -source test/scripts/jenkins_test_setup_xpack.sh +source src/dev/ci_setup/setup_env.sh source "$KIBANA_DIR/src/dev/ci_setup/setup_percy.sh" -checks-reporter-with-killswitch "Kibana visual regression tests" \ - yarn run percy exec -t 500 \ +echo " -> building and extracting OSS Kibana distributable for use in functional tests" +node scripts/build --debug --oss +linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" +installDir="$PARENT_DIR/install/kibana" +mkdir -p "$installDir" +tar -xzf "$linuxBuild" -C "$installDir" --strip=1 + +echo " -> running visual regression tests from kibana directory" +checks-reporter-with-killswitch "X-Pack visual regression tests" \ + yarn percy exec -t 500 \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ diff --git a/test/scripts/jenkins_xpack_visual_regression.sh b/test/scripts/jenkins_xpack_visual_regression.sh index 6e3d4dd7c249b..73e92da3bad63 100755 --- a/test/scripts/jenkins_xpack_visual_regression.sh +++ b/test/scripts/jenkins_xpack_visual_regression.sh @@ -1,11 +1,21 @@ #!/usr/bin/env bash -source test/scripts/jenkins_test_setup_xpack.sh +source src/dev/ci_setup/setup_env.sh source "$KIBANA_DIR/src/dev/ci_setup/setup_percy.sh" +echo " -> building and extracting default Kibana distributable" +cd "$KIBANA_DIR" +node scripts/build --debug --no-oss +linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" +installDir="$PARENT_DIR/install/kibana" +mkdir -p "$installDir" +tar -xzf "$linuxBuild" -C "$installDir" --strip=1 + +echo " -> running visual regression tests from x-pack directory" +cd "$XPACK_DIR" checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn run percy exec -t 500 \ + yarn percy exec -t 500 \ node scripts/functional_tests \ --debug --bail \ - --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --config test/visual_regression/config.js; + --kibana-install-dir "$installDir" \ + --config test/visual_regression/config.ts; diff --git a/test/visual_regression/services/visual_testing/visual_testing.ts b/test/visual_regression/services/visual_testing/visual_testing.ts index 4ad97f8d98717..0882beecf7f5c 100644 --- a/test/visual_regression/services/visual_testing/visual_testing.ts +++ b/test/visual_regression/services/visual_testing/visual_testing.ts @@ -71,6 +71,13 @@ export async function VisualTestingProvider({ getService }: FtrProviderContext) return new (class VisualTesting { public async snapshot(options: SnapshotOptions = {}) { + if (process.env.DISABLE_VISUAL_TESTING) { + log.warning( + 'Capturing of percy snapshots disabled, would normally capture a snapshot here!' + ); + return; + } + log.debug('Capturing percy snapshot'); if (!currentTest) { diff --git a/test/visual_regression/tests/discover/chart_visualization.js b/test/visual_regression/tests/discover/chart_visualization.ts similarity index 55% rename from test/visual_regression/tests/discover/chart_visualization.js rename to test/visual_regression/tests/discover/chart_visualization.ts index 10ac559b9f982..49c3057a27cb0 100644 --- a/test/visual_regression/tests/discover/chart_visualization.js +++ b/test/visual_regression/tests/discover/chart_visualization.ts @@ -19,8 +19,9 @@ import expect from '@kbn/expect'; -export default function({ getService, getPageObjects }) { - const log = getService('log'); +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const esArchiver = getService('esArchiver'); const browser = getService('browser'); @@ -34,58 +35,56 @@ export default function({ getService, getPageObjects }) { describe('discover', function describeIndexTests() { before(async function() { - log.debug('load kibana index with default index pattern'); await esArchiver.load('discover'); // and load a set of makelogs data await esArchiver.loadIfNeeded('logstash_functional'); await kibanaServer.uiSettings.replace(defaultSettings); - log.debug('discover'); await PageObjects.common.navigateToApp('discover'); await PageObjects.timePicker.setDefaultAbsoluteRange(); }); + after(function unloadMakelogs() { + return esArchiver.unload('logstash_functional'); + }); + + async function refreshDiscover() { + await browser.refresh(); + await PageObjects.header.awaitKibanaChrome(); + await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.waitForChartLoadingComplete(1); + } + + async function takeSnapshot() { + await refreshDiscover(); + await visualTesting.snapshot({ + show: ['discoverChart'], + }); + } + describe('query', function() { this.tags(['skipFirefox']); - let renderCounter = 0; it('should show bars in the correct time zone', async function() { await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('should show correct data for chart interval Hourly', async function() { - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.setChartInterval('Hourly'); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('should show correct data for chart interval Daily', async function() { - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.setChartInterval('Daily'); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('should show correct data for chart interval Weekly', async function() { - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.setChartInterval('Weekly'); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('browser back button should show previous interval Daily', async function() { @@ -94,57 +93,31 @@ export default function({ getService, getPageObjects }) { const actualInterval = await PageObjects.discover.getChartInterval(); expect(actualInterval).to.be('Daily'); }); - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('should show correct data for chart interval Monthly', async function() { - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.setChartInterval('Monthly'); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('should show correct data for chart interval Yearly', async function() { - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.setChartInterval('Yearly'); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); it('should show correct data for chart interval Auto', async function() { - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.discover.setChartInterval('Auto'); - await PageObjects.discover.waitForChartLoadingComplete(++renderCounter); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); }); describe('time zone switch', () => { it('should show bars in the correct time zone after switching', async function() { await kibanaServer.uiSettings.replace({ 'dateFormat:tz': 'America/Phoenix' }); - await browser.refresh(); - await PageObjects.header.awaitKibanaChrome(); + await refreshDiscover(); await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.discover.waitForChartLoadingComplete(1); - await visualTesting.snapshot({ - show: ['discoverChart'], - }); + await takeSnapshot(); }); }); }); diff --git a/test/visual_regression/tests/discover/index.js b/test/visual_regression/tests/discover/index.ts similarity index 86% rename from test/visual_regression/tests/discover/index.js rename to test/visual_regression/tests/discover/index.ts index f98aac52aa4cb..d036327ae7475 100644 --- a/test/visual_regression/tests/discover/index.js +++ b/test/visual_regression/tests/discover/index.ts @@ -18,12 +18,12 @@ */ import { DEFAULT_OPTIONS } from '../../services/visual_testing/visual_testing'; +import { FtrProviderContext } from '../../ftr_provider_context'; // Width must be the same as visual_testing or canvas image widths will get skewed const [SCREEN_WIDTH] = DEFAULT_OPTIONS.widths || []; -export default function({ getService, loadTestFile }) { - const esArchiver = getService('esArchiver'); +export default function({ getService, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); describe('discover app', function() { @@ -33,10 +33,6 @@ export default function({ getService, loadTestFile }) { return browser.setWindowSize(SCREEN_WIDTH, 1000); }); - after(function unloadMakelogs() { - return esArchiver.unload('logstash_functional'); - }); - loadTestFile(require.resolve('./chart_visualization')); }); } diff --git a/x-pack/test/visual_regression/config.js b/x-pack/test/visual_regression/config.ts similarity index 69% rename from x-pack/test/visual_regression/config.js rename to x-pack/test/visual_regression/config.ts index aff6aaaf4114a..dce17348f75e6 100644 --- a/x-pack/test/visual_regression/config.js +++ b/x-pack/test/visual_regression/config.ts @@ -4,9 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { services as ossVisualRegressionServices } from '../../../test/visual_regression/services'; +import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; -export default async function({ readConfigFile }) { +import { services } from './services'; + +export default async function({ readConfigFile }: FtrConfigProviderContext) { const functionalConfig = await readConfigFile(require.resolve('../functional/config')); return { @@ -19,10 +21,7 @@ export default async function({ readConfigFile }) { require.resolve('./tests/infra'), ], - services: { - ...functionalConfig.get('services'), - visualTesting: ossVisualRegressionServices.visualTesting, - }, + services, junit: { reportName: 'X-Pack Visual Regression Tests', diff --git a/x-pack/test/visual_regression/ftr_provider_context.d.ts b/x-pack/test/visual_regression/ftr_provider_context.d.ts new file mode 100644 index 0000000000000..bb257cdcbfe1b --- /dev/null +++ b/x-pack/test/visual_regression/ftr_provider_context.d.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { GenericFtrProviderContext } from '@kbn/test/types/ftr'; + +import { pageObjects } from './page_objects'; +import { services } from './services'; + +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/visual_regression/page_objects.ts b/x-pack/test/visual_regression/page_objects.ts new file mode 100644 index 0000000000000..ea3e49d0ccc5e --- /dev/null +++ b/x-pack/test/visual_regression/page_objects.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { pageObjects } from '../functional/page_objects'; + +export { pageObjects }; diff --git a/x-pack/test/visual_regression/services.ts b/x-pack/test/visual_regression/services.ts new file mode 100644 index 0000000000000..447c16281b838 --- /dev/null +++ b/x-pack/test/visual_regression/services.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { services as ossVisualRegressionServices } from '../../../test/visual_regression/services'; +import { services as functionalServices } from '../functional/services'; + +export const services = { + ...functionalServices, + visualTesting: ossVisualRegressionServices.visualTesting, +}; diff --git a/x-pack/test/visual_regression/tests/login_page.js b/x-pack/test/visual_regression/tests/login_page.ts similarity index 91% rename from x-pack/test/visual_regression/tests/login_page.js rename to x-pack/test/visual_regression/tests/login_page.ts index b290b8f819589..ce90669a6bfe1 100644 --- a/x-pack/test/visual_regression/tests/login_page.js +++ b/x-pack/test/visual_regression/tests/login_page.ts @@ -4,7 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -export default function({ getService, getPageObjects }) { +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const visualTesting = getService('visualTesting'); const testSubjects = getService('testSubjects'); From 944be8009187228a1709796fb1d52849d17822cf Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Thu, 5 Mar 2020 14:16:37 -0700 Subject: [PATCH 11/25] Rename status_page to statusPage (#59186) --- .github/CODEOWNERS | 1 + src/plugins/status_page/kibana.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5948b9672e6d4..de74a2c42be8b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -132,6 +132,7 @@ /src/legacy/server/logging/ @elastic/kibana-platform /src/legacy/server/saved_objects/ @elastic/kibana-platform /src/legacy/server/status/ @elastic/kibana-platform +/src/plugins/status_page/ @elastic/kibana-platform /src/dev/run_check_core_api_changes.ts @elastic/kibana-platform # Security diff --git a/src/plugins/status_page/kibana.json b/src/plugins/status_page/kibana.json index edebf8cb12239..0d54f6a39e2b1 100644 --- a/src/plugins/status_page/kibana.json +++ b/src/plugins/status_page/kibana.json @@ -1,5 +1,5 @@ { - "id": "status_page", + "id": "statusPage", "version": "kibana", "server": false, "ui": true From d5497d99b2c67c81411d694454d406e8ae361f75 Mon Sep 17 00:00:00 2001 From: marshallmain <55718608+marshallmain@users.noreply.github.com> Date: Thu, 5 Mar 2020 16:35:54 -0500 Subject: [PATCH 12/25] [Endpoint] Fix alert list functional test error (#59357) * fix the functional test error * fix linting Co-authored-by: Elastic Machine --- x-pack/test/functional/apps/endpoint/alert_list.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x-pack/test/functional/apps/endpoint/alert_list.ts b/x-pack/test/functional/apps/endpoint/alert_list.ts index 089fa487ef1b8..eae7713c37a06 100644 --- a/x-pack/test/functional/apps/endpoint/alert_list.ts +++ b/x-pack/test/functional/apps/endpoint/alert_list.ts @@ -8,10 +8,12 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function({ getPageObjects, getService }: FtrProviderContext) { const pageObjects = getPageObjects(['common', 'endpoint']); const testSubjects = getService('testSubjects'); + const esArchiver = getService('esArchiver'); describe('Endpoint Alert List', function() { this.tags(['ciGroup7']); before(async () => { + await esArchiver.load('endpoint/alerts/api_feature'); await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/alerts'); }); @@ -21,5 +23,9 @@ export default function({ getPageObjects, getService }: FtrProviderContext) { it('includes Alert list data grid', async () => { await testSubjects.existOrFail('alertListGrid'); }); + + after(async () => { + await esArchiver.unload('endpoint/alerts/api_feature'); + }); }); } From 75dabc5dce507074ba60cdec947b04d119dc9e5b Mon Sep 17 00:00:00 2001 From: Alex Holmansky Date: Thu, 5 Mar 2020 17:21:23 -0500 Subject: [PATCH 13/25] Temporarily disabling PR project mappings (#59485) * Use diagnostics-enable action in the workflow. Issue: #56526 * Update workflow to use v1.0.2 of the action * Adding a new test workflow that uses a personal access token * Remove an extra coma * Updated project-assigner action version and access key * Deleted the test workflow * Temporarily commenting out project mappings while we debug the permissions issues Co-authored-by: Elastic Machine --- .github/workflows/pr-project-assigner.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-project-assigner.yml b/.github/workflows/pr-project-assigner.yml index 517aefb36e8d6..9d4bcacb4fe3b 100644 --- a/.github/workflows/pr-project-assigner.yml +++ b/.github/workflows/pr-project-assigner.yml @@ -13,8 +13,8 @@ jobs: with: issue-mappings: | [ - { "label": "Team:AppArch", "projectName": "kibana-app-arch", "columnId": 6173897 }, - { "label": "Feature:Lens", "projectName": "Lens", "columnId": 6219362 }, - { "label": "Team:Canvas", "projectName": "canvas", "columnId": 6187580 } +# { "label": "Team:AppArch", "projectName": "kibana-app-arch", "columnId": 6173897 }, +# { "label": "Feature:Lens", "projectName": "Lens", "columnId": 6219362 }, +# { "label": "Team:Canvas", "projectName": "canvas", "columnId": 6187580 } ] ghToken: ${{ secrets.PROJECT_ASSIGNER_TOKEN }} From c3f8647c3ed0e4ff5fb02546d25924f2a9a378d0 Mon Sep 17 00:00:00 2001 From: Alex Holmansky Date: Thu, 5 Mar 2020 17:23:48 -0500 Subject: [PATCH 14/25] Revert "Temporarily disabling PR project mappings (#59485)" (#59491) This reverts commit 75dabc5dce507074ba60cdec947b04d119dc9e5b. --- .github/workflows/pr-project-assigner.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-project-assigner.yml b/.github/workflows/pr-project-assigner.yml index 9d4bcacb4fe3b..517aefb36e8d6 100644 --- a/.github/workflows/pr-project-assigner.yml +++ b/.github/workflows/pr-project-assigner.yml @@ -13,8 +13,8 @@ jobs: with: issue-mappings: | [ -# { "label": "Team:AppArch", "projectName": "kibana-app-arch", "columnId": 6173897 }, -# { "label": "Feature:Lens", "projectName": "Lens", "columnId": 6219362 }, -# { "label": "Team:Canvas", "projectName": "canvas", "columnId": 6187580 } + { "label": "Team:AppArch", "projectName": "kibana-app-arch", "columnId": 6173897 }, + { "label": "Feature:Lens", "projectName": "Lens", "columnId": 6219362 }, + { "label": "Team:Canvas", "projectName": "canvas", "columnId": 6187580 } ] ghToken: ${{ secrets.PROJECT_ASSIGNER_TOKEN }} From e869695d7349c9edbbf73b2b9c725d9e5a9d8fee Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Thu, 5 Mar 2020 14:57:32 -0800 Subject: [PATCH 15/25] Added possibility to embed connectors create and edit flyouts (#58514) * Added possibility to embed connectors flyout * Fixed type checks and removed example from siem start page * Fixed jest tests * Fixed failing tests * fixed type check * Added config for siem tests * Fixed failing tests * Fixed due to comments * Added missing documentation --- x-pack/plugins/triggers_actions_ui/README.md | 217 +++++++++++++++++- .../context/actions_connectors_context.tsx | 18 +- .../action_connector_form.test.tsx | 13 +- .../action_type_menu.test.tsx | 42 ++-- .../action_type_menu.tsx | 44 +++- .../connector_add_flyout.test.tsx | 60 +++-- .../connector_add_flyout.tsx | 61 +++-- .../connector_add_modal.test.tsx | 50 +--- .../connector_edit_flyout.test.tsx | 27 +-- .../connector_edit_flyout.tsx | 48 ++-- .../components/actions_connectors_list.tsx | 20 +- .../sections/alert_form/alert_edit.test.tsx | 7 +- .../sections/alert_form/alert_form.test.tsx | 186 +++++++-------- .../triggers_actions_ui/public/index.ts | 5 + .../triggers_actions_ui/public/plugin.ts | 73 +++--- .../apps/triggers_actions_ui/alerts.ts | 3 + 16 files changed, 539 insertions(+), 335 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/README.md b/x-pack/plugins/triggers_actions_ui/README.md index c6a7808356b86..ccd33c99f9e1c 100644 --- a/x-pack/plugins/triggers_actions_ui/README.md +++ b/x-pack/plugins/triggers_actions_ui/README.md @@ -43,6 +43,8 @@ Table of Contents - [Action type model definition](#action-type-model-definition) - [Register action type model](#register-action-type-model) - [Create and register new action type UI example](#reate-and-register-new-action-type-ui-example) + - [Embed the Create Connector flyout within any Kibana plugin](#embed-the-create-connector-flyout-within-any-kibana-plugin) + - [Embed the Edit Connector flyout within any Kibana plugin](#embed-the-edit-connector-flyout-within-any-kibana-plugin) ## Built-in Alert Types @@ -667,6 +669,7 @@ const [alertFlyoutVisible, setAlertFlyoutVisibility] = useState(false); uiSettings, charts, dataFieldsFormats, + metadata: { test: 'some value', fields: ['test'] }, }} > @@ -690,7 +693,7 @@ interface AlertAddProps { AlertsContextProvider value options: ``` -export interface AlertsContextValue { +export interface AlertsContextValue> { addFlyoutVisible: boolean; setAddFlyoutVisibility: React.Dispatch>; reloadAlerts?: () => Promise; @@ -704,6 +707,7 @@ export interface AlertsContextValue { >; charts?: ChartsPluginSetup; dataFieldsFormats?: Pick; + metadata?: MetaData; } ``` @@ -719,6 +723,7 @@ export interface AlertsContextValue { |toastNotifications|Optional toast messages.| |charts|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| |dataFieldsFormats|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| +|metadata|Optional generic property, which allows to define component specific metadata. This metadata can be used for passing down preloaded data for Alert type expression component.| ## Build and register Action Types @@ -1198,3 +1203,213 @@ Clicking on the select card for `Example Action Type` will open the action type or create a new connector: ![Example Action Type with empty connectors list](https://i.imgur.com/EamA9Xv.png) + +## Embed the Create Connector flyout within any Kibana plugin + +Follow the instructions bellow to embed the Create Connector flyout within any Kibana plugin: +1. Add TriggersAndActionsUIPublicPluginSetup and TriggersAndActionsUIPublicPluginStart to Kibana plugin setup dependencies: + +``` +import { + TriggersAndActionsUIPublicPluginSetup, + TriggersAndActionsUIPublicPluginStart, + } from '../../../../../x-pack/plugins/triggers_actions_ui/public'; + +triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; +... + +triggers_actions_ui: TriggersAndActionsUIPublicPluginStart; +``` +Then this dependency will be used to embed Create Connector flyout or register new action type. + +2. Add Create Connector flyout to React component: +``` +// import section +import { ActionsConnectorsContextProvider, ConnectorAddFlyout } from '../../../../../../../triggers_actions_ui/public'; + +// in the component state definition section +const [addFlyoutVisible, setAddFlyoutVisibility] = useState(false); + +// load required dependancied +const { http, triggers_actions_ui, toastNotifications, capabilities } = useKibana().services; + +const connector = { + secrets: {}, + id: 'test', + actionTypeId: '.index', + actionType: 'Index', + name: 'action-connector', + referencedByCount: 0, + config: {}, + }; + +// UI control item for open flyout + setAddFlyoutVisibility(true)} +> + + + +// in render section of component + + + +``` + +ConnectorAddFlyout Props definition: +``` +export interface ConnectorAddFlyoutProps { + addFlyoutVisible: boolean; + setAddFlyoutVisibility: React.Dispatch>; + actionTypes?: ActionType[]; +} +``` + +|Property|Description| +|---|---| +|addFlyoutVisible|Visibility state of the Create Connector flyout.| +|setAddFlyoutVisibility|Function for changing visibility state of the Create Connector flyout.| +|actionTypes|Optional property, that allows to define only specific action types list which is available for a current plugin.| + +ActionsConnectorsContextValue options: +``` +export interface ActionsConnectorsContextValue { + http: HttpSetup; + actionTypeRegistry: TypeRegistry; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + capabilities: ApplicationStart['capabilities']; + reloadConnectors?: () => Promise; +} +``` + +|Property|Description| +|---|---| +|http|HttpSetup needed for executing API calls.| +|actionTypeRegistry|Registry for action types.| +|capabilities|Property, which is defining action current user usage capabilities like canSave or canDelete.| +|toastNotifications|Toast messages.| +|reloadConnectors|Optional function, which will be executed if connector was saved sucsessfuly, like reload list of connecotrs.| + + +## Embed the Edit Connector flyout within any Kibana plugin + +Follow the instructions bellow to embed the Edit Connector flyout within any Kibana plugin: +1. Add TriggersAndActionsUIPublicPluginSetup and TriggersAndActionsUIPublicPluginStart to Kibana plugin setup dependencies: + +``` +import { + TriggersAndActionsUIPublicPluginSetup, + TriggersAndActionsUIPublicPluginStart, + } from '../../../../../x-pack/plugins/triggers_actions_ui/public'; + +triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; +... + +triggers_actions_ui: TriggersAndActionsUIPublicPluginStart; +``` +Then this dependency will be used to embed Edit Connector flyout. + +2. Add Create Connector flyout to React component: +``` +// import section +import { ActionsConnectorsContextProvider, ConnectorEditFlyout } from '../../../../../../../triggers_actions_ui/public'; + +// in the component state definition section +const [editFlyoutVisible, setEditFlyoutVisibility] = useState(false); + +// load required dependancied +const { http, triggers_actions_ui, toastNotifications, capabilities } = useKibana().services; + +// UI control item for open flyout + setEditFlyoutVisibility(true)} +> + + + +// in render section of component + + + + +``` + +ConnectorEditFlyout Props definition: +``` +export interface ConnectorEditProps { + initialConnector: ActionConnectorTableItem; + editFlyoutVisible: boolean; + setEditFlyoutVisibility: React.Dispatch>; +} +``` + +|Property|Description| +|---|---| +|initialConnector|Property, that allows to define the initial state of edited connector.| +|editFlyoutVisible|Visibility state of the Edit Connector flyout.| +|setEditFlyoutVisibility|Function for changing visibility state of the Edit Connector flyout.| + +ActionsConnectorsContextValue options: +``` +export interface ActionsConnectorsContextValue { + http: HttpSetup; + actionTypeRegistry: TypeRegistry; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + capabilities: ApplicationStart['capabilities']; + reloadConnectors?: () => Promise; +} +``` + +|Property|Description| +|---|---| +|http|HttpSetup needed for executing API calls.| +|actionTypeRegistry|Registry for action types.| +|capabilities|Property, which is defining action current user usage capabilities like canSave or canDelete.| +|toastNotifications|Toast messages.| +|reloadConnectors|Optional function, which will be executed if connector was saved sucsessfuly, like reload list of connecotrs.| diff --git a/x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx b/x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx index 11786950d0f26..b49cdc3d7d8b8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx @@ -5,15 +5,19 @@ */ import React, { createContext, useContext } from 'react'; -import { ActionType } from '../../types'; +import { HttpSetup, ToastsApi, ApplicationStart } from 'kibana/public'; +import { ActionTypeModel } from '../../types'; +import { TypeRegistry } from '../type_registry'; export interface ActionsConnectorsContextValue { - addFlyoutVisible: boolean; - editFlyoutVisible: boolean; - setEditFlyoutVisibility: React.Dispatch>; - setAddFlyoutVisibility: React.Dispatch>; - actionTypesIndex: Record | undefined; - reloadConnectors: () => Promise; + http: HttpSetup; + actionTypeRegistry: TypeRegistry; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + capabilities: ApplicationStart['capabilities']; + reloadConnectors?: () => Promise; } const ActionsConnectorsContext = createContext(null as any); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx index f7becb16c244a..800863e46034e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.test.tsx @@ -9,26 +9,21 @@ import { coreMock } from '../../../../../../../src/core/public/mocks'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult, ActionConnector } from '../../../types'; import { ActionConnectorForm } from './action_connector_form'; +import { ActionsConnectorsContextValue } from '../../context/actions_connectors_context'; const actionTypeRegistry = actionTypeRegistryMock.create(); describe('action_connector_form', () => { - let deps: any; + let deps: ActionsConnectorsContextValue; beforeAll(async () => { const mocks = coreMock.createSetup(); const [ { - chrome, - docLinks, application: { capabilities }, }, ] = await mocks.getStartServices(); deps = { - chrome, - docLinks, toastNotifications: mocks.notifications.toasts, - injectedMetadata: mocks.injectedMetadata, http: mocks.http, - uiSettings: mocks.uiSettings, capabilities: { ...capabilities, actions: { @@ -37,11 +32,7 @@ describe('action_connector_form', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, actionTypeRegistry: actionTypeRegistry as any, - alertTypeRegistry: {} as any, }; }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx index c1c6d9d94e810..4f098165033e7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.test.tsx @@ -6,31 +6,28 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; +import { + ActionsConnectorsContextProvider, + ActionsConnectorsContextValue, +} from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ActionTypeMenu } from './action_type_menu'; import { ValidationResult } from '../../../types'; const actionTypeRegistry = actionTypeRegistryMock.create(); describe('connector_add_flyout', () => { - let deps: any; + let deps: ActionsConnectorsContextValue; beforeAll(async () => { const mockes = coreMock.createSetup(); const [ { - chrome, - docLinks, application: { capabilities }, }, ] = await mockes.getStartServices(); deps = { - chrome, - docLinks, - toastNotifications: mockes.notifications.toasts, - injectedMetadata: mockes.injectedMetadata, http: mockes.http, - uiSettings: mockes.uiSettings, + toastNotifications: mockes.notifications.toasts, capabilities: { ...capabilities, actions: { @@ -39,11 +36,7 @@ describe('connector_add_flyout', () => { show: true, }, }, - legacy: { - MANAGEMENT_BREADCRUMB: { set: () => {} } as any, - }, actionTypeRegistry: actionTypeRegistry as any, - alertTypeRegistry: {} as any, }; }); @@ -68,14 +61,10 @@ describe('connector_add_flyout', () => { const wrapper = mountWithIntl( {}, - editFlyoutVisible: false, - setEditFlyoutVisibility: state => {}, - actionTypesIndex: { - 'first-action-type': { id: 'first-action-type', name: 'first', enabled: true }, - 'second-action-type': { id: 'second-action-type', name: 'second', enabled: true }, - }, + http: deps!.http, + actionTypeRegistry: deps!.actionTypeRegistry, + capabilities: deps!.capabilities, + toastNotifications: deps!.toastNotifications, reloadConnectors: () => { return new Promise(() => {}); }, @@ -83,12 +72,17 @@ describe('connector_add_flyout', () => { > ); - expect(wrapper.find('[data-test-subj="first-action-type-card"]').exists()).toBeTruthy(); - expect(wrapper.find('[data-test-subj="second-action-type-card"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="my-action-type-card"]').exists()).toBeTruthy(); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.tsx index ddd08cf6d6d79..a63665a68fb6b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_menu.tsx @@ -3,24 +3,46 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { EuiFlexItem, EuiCard, EuiIcon, EuiFlexGrid } from '@elastic/eui'; -import { ActionType, ActionTypeModel } from '../../../types'; +import { i18n } from '@kbn/i18n'; +import { ActionType, ActionTypeIndex } from '../../../types'; +import { loadActionTypes } from '../../lib/action_connector_api'; import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; -import { TypeRegistry } from '../../type_registry'; interface Props { onActionTypeChange: (actionType: ActionType) => void; - actionTypeRegistry: TypeRegistry; + actionTypes?: ActionType[]; } -export const ActionTypeMenu = ({ onActionTypeChange, actionTypeRegistry }: Props) => { - const { actionTypesIndex } = useActionsConnectorsContext(); - if (!actionTypesIndex) { - return null; - } +export const ActionTypeMenu = ({ onActionTypeChange, actionTypes }: Props) => { + const { http, toastNotifications, actionTypeRegistry } = useActionsConnectorsContext(); + const [actionTypesIndex, setActionTypesIndex] = useState(undefined); - const actionTypes = Object.entries(actionTypesIndex) + useEffect(() => { + (async () => { + try { + const availableActionTypes = actionTypes ?? (await loadActionTypes({ http })); + const index: ActionTypeIndex = {}; + for (const actionTypeItem of availableActionTypes) { + index[actionTypeItem.id] = actionTypeItem; + } + setActionTypesIndex(index); + } catch (e) { + if (toastNotifications) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.actionsConnectorsList.unableToLoadActionTypesMessage', + { defaultMessage: 'Unable to load action types' } + ), + }); + } + } + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const registeredActionTypes = Object.entries(actionTypesIndex ?? []) .filter(([index]) => actionTypeRegistry.has(index)) .map(([index, actionType]) => { const actionTypeModel = actionTypeRegistry.get(index); @@ -33,7 +55,7 @@ export const ActionTypeMenu = ({ onActionTypeChange, actionTypeRegistry }: Props }; }); - const cardNodes = actionTypes + const cardNodes = registeredActionTypes .sort((a, b) => a.name.localeCompare(b.name)) .map((item, index) => { return ( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx index 6b87002a1d2cf..cf0edbe422495 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.test.tsx @@ -7,37 +7,28 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ConnectorAddFlyout } from './connector_add_flyout'; -import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; +import { + ActionsConnectorsContextProvider, + ActionsConnectorsContextValue, +} from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; -import { AppContextProvider } from '../../app_context'; -import { AppDeps } from '../../app'; -import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; -import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; const actionTypeRegistry = actionTypeRegistryMock.create(); describe('connector_add_flyout', () => { - let deps: AppDeps | null; + let deps: ActionsConnectorsContextValue; beforeAll(async () => { const mocks = coreMock.createSetup(); const [ { - chrome, - docLinks, application: { capabilities }, }, ] = await mocks.getStartServices(); deps = { - chrome, - docLinks, - dataPlugin: dataPluginMock.createStartContract(), - charts: chartPluginMock.createStartContract(), toastNotifications: mocks.notifications.toasts, - injectedMetadata: mocks.injectedMetadata, http: mocks.http, - uiSettings: mocks.uiSettings, capabilities: { ...capabilities, actions: { @@ -46,9 +37,7 @@ describe('connector_add_flyout', () => { show: true, }, }, - setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, - alertTypeRegistry: {} as any, }; }); @@ -71,24 +60,29 @@ describe('connector_add_flyout', () => { actionTypeRegistry.has.mockReturnValue(true); const wrapper = mountWithIntl( - - {}, - editFlyoutVisible: false, - setEditFlyoutVisibility: state => {}, - actionTypesIndex: { - 'my-action-type': { id: 'my-action-type', name: 'test', enabled: true }, + { + return new Promise(() => {}); + }, + }} + > + {}} + actionTypes={[ + { + id: actionType.id, + enabled: true, + name: 'Test', }, - reloadConnectors: () => { - return new Promise(() => {}); - }, - }} - > - - - + ]} + /> + ); expect(wrapper.find('ActionTypeMenu')).toHaveLength(1); expect(wrapper.find('[data-test-subj="my-action-type-card"]').exists()).toBeTruthy(); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx index 1eabf2441da4f..1b86116781084 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_flyout.tsx @@ -20,18 +20,33 @@ import { EuiBetaBadge, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; import { ActionTypeMenu } from './action_type_menu'; import { ActionConnectorForm, validateBaseProperties } from './action_connector_form'; import { ActionType, ActionConnector, IErrorObject } from '../../../types'; -import { useAppDependencies } from '../../app_context'; import { connectorReducer } from './connector_reducer'; import { hasSaveActionsCapability } from '../../lib/capabilities'; import { createActionConnector } from '../../lib/action_connector_api'; +import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; + +export interface ConnectorAddFlyoutProps { + addFlyoutVisible: boolean; + setAddFlyoutVisibility: React.Dispatch>; + actionTypes?: ActionType[]; +} -export const ConnectorAddFlyout = () => { +export const ConnectorAddFlyout = ({ + addFlyoutVisible, + setAddFlyoutVisibility, + actionTypes, +}: ConnectorAddFlyoutProps) => { let hasErrors = false; - const { http, toastNotifications, capabilities, actionTypeRegistry } = useAppDependencies(); + const { + http, + toastNotifications, + capabilities, + actionTypeRegistry, + reloadConnectors, + } = useActionsConnectorsContext(); const [actionType, setActionType] = useState(undefined); // hooks @@ -48,11 +63,6 @@ export const ConnectorAddFlyout = () => { dispatch({ command: { type: 'setConnector' }, payload: { key: 'connector', value } }); }; - const { - addFlyoutVisible, - setAddFlyoutVisibility, - reloadConnectors, - } = useActionsConnectorsContext(); const [isSaving, setIsSaving] = useState(false); const closeFlyout = useCallback(() => { @@ -79,10 +89,7 @@ export const ConnectorAddFlyout = () => { let actionTypeModel; if (!actionType) { currentForm = ( - + ); } else { actionTypeModel = actionTypeRegistry.get(actionType.id); @@ -108,17 +115,19 @@ export const ConnectorAddFlyout = () => { const onActionConnectorSave = async (): Promise => await createActionConnector({ http, connector }) .then(savedConnector => { - toastNotifications.addSuccess( - i18n.translate( - 'xpack.triggersActionsUI.sections.addConnectorForm.updateSuccessNotificationText', - { - defaultMessage: "Created '{connectorName}'", - values: { - connectorName: savedConnector.name, - }, - } - ) - ); + if (toastNotifications) { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.triggersActionsUI.sections.addConnectorForm.updateSuccessNotificationText', + { + defaultMessage: "Created '{connectorName}'", + values: { + connectorName: savedConnector.name, + }, + } + ) + ); + } return savedConnector; }) .catch(errorRes => { @@ -218,7 +227,9 @@ export const ConnectorAddFlyout = () => { setIsSaving(false); if (savedAction) { closeFlyout(); - reloadConnectors(); + if (reloadConnectors) { + reloadConnectors(); + } } }} > diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx index d9f3e98919d76..94c2b823e8bcf 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx @@ -7,35 +7,24 @@ import * as React from 'react'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { ConnectorAddModal } from './connector_add_modal'; -import { ActionsConnectorsContextProvider } from '../../context/actions_connectors_context'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; -import { AppDeps } from '../../app'; -import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; -import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; +import { ActionsConnectorsContextValue } from '../../context/actions_connectors_context'; const actionTypeRegistry = actionTypeRegistryMock.create(); describe('connector_add_modal', () => { - let deps: AppDeps | null; + let deps: ActionsConnectorsContextValue; beforeAll(async () => { const mocks = coreMock.createSetup(); const [ { - chrome, - docLinks, application: { capabilities }, }, ] = await mocks.getStartServices(); deps = { - chrome, - docLinks, - dataPlugin: dataPluginMock.createStartContract(), - charts: chartPluginMock.createStartContract(), toastNotifications: mocks.notifications.toasts, - injectedMetadata: mocks.injectedMetadata, http: mocks.http, - uiSettings: mocks.uiSettings, capabilities: { ...capabilities, actions: { @@ -44,9 +33,7 @@ describe('connector_add_modal', () => { show: true, }, }, - setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, - alertTypeRegistry: {} as any, }; }); it('renders connector modal form if addModalVisible is true', () => { @@ -75,30 +62,15 @@ describe('connector_add_modal', () => { const wrapper = deps ? mountWithIntl( - {}, - editFlyoutVisible: false, - setEditFlyoutVisibility: state => {}, - actionTypesIndex: { - 'my-action-type': { id: 'my-action-type', name: 'test', enabled: true }, - }, - reloadConnectors: () => { - return new Promise(() => {}); - }, - }} - > - {}} - actionType={actionType} - http={deps.http} - actionTypeRegistry={deps.actionTypeRegistry} - alertTypeRegistry={deps.alertTypeRegistry} - toastNotifications={deps.toastNotifications} - /> - + {}} + actionType={actionType} + http={deps.http} + actionTypeRegistry={deps.actionTypeRegistry} + alertTypeRegistry={{} as any} + toastNotifications={deps.toastNotifications} + /> ) : undefined; expect(wrapper?.find('EuiModalHeader')).toHaveLength(1); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx index a82003759d973..f9aa2cad8bfc6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.test.tsx @@ -11,8 +11,6 @@ import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { ValidationResult } from '../../../types'; import { ConnectorEditFlyout } from './connector_edit_flyout'; import { AppContextProvider } from '../../app_context'; -import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; -import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; const actionTypeRegistry = actionTypeRegistryMock.create(); let deps: any; @@ -22,18 +20,11 @@ describe('connector_edit_flyout', () => { const mockes = coreMock.createSetup(); const [ { - chrome, - docLinks, application: { capabilities }, }, ] = await mockes.getStartServices(); deps = { - chrome, - docLinks, - dataPlugin: dataPluginMock.createStartContract(), - charts: chartPluginMock.createStartContract(), toastNotifications: mockes.notifications.toasts, - injectedMetadata: mockes.injectedMetadata, http: mockes.http, uiSettings: mockes.uiSettings, capabilities: { @@ -44,7 +35,6 @@ describe('connector_edit_flyout', () => { show: true, }, }, - setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, alertTypeRegistry: {} as any, }; @@ -82,19 +72,20 @@ describe('connector_edit_flyout', () => { {}, - editFlyoutVisible: true, - setEditFlyoutVisibility: state => {}, - actionTypesIndex: { - 'test-action-type-id': { id: 'test-action-type-id', name: 'test', enabled: true }, - }, + http: deps.http, + toastNotifications: deps.toastNotifications, + capabilities: deps.capabilities, + actionTypeRegistry: deps.actionTypeRegistry, reloadConnectors: () => { return new Promise(() => {}); }, }} > - + {}} + /> ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx index 6fe555fd74b39..c52bb8cc08f6f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx @@ -19,27 +19,33 @@ import { EuiBetaBadge, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; import { ActionConnectorForm, validateBaseProperties } from './action_connector_form'; -import { useAppDependencies } from '../../app_context'; import { ActionConnectorTableItem, ActionConnector, IErrorObject } from '../../../types'; import { connectorReducer } from './connector_reducer'; import { updateActionConnector } from '../../lib/action_connector_api'; import { hasSaveActionsCapability } from '../../lib/capabilities'; +import { useActionsConnectorsContext } from '../../context/actions_connectors_context'; export interface ConnectorEditProps { initialConnector: ActionConnectorTableItem; + editFlyoutVisible: boolean; + setEditFlyoutVisibility: React.Dispatch>; } -export const ConnectorEditFlyout = ({ initialConnector }: ConnectorEditProps) => { +export const ConnectorEditFlyout = ({ + initialConnector, + editFlyoutVisible, + setEditFlyoutVisibility, +}: ConnectorEditProps) => { let hasErrors = false; - const { http, toastNotifications, capabilities, actionTypeRegistry } = useAppDependencies(); - const canSave = hasSaveActionsCapability(capabilities); const { - editFlyoutVisible, - setEditFlyoutVisibility, + http, + toastNotifications, + capabilities, + actionTypeRegistry, reloadConnectors, } = useActionsConnectorsContext(); + const canSave = hasSaveActionsCapability(capabilities); const closeFlyout = useCallback(() => setEditFlyoutVisibility(false), [setEditFlyoutVisibility]); const [{ connector }, dispatch] = useReducer(connectorReducer, { connector: { ...initialConnector, secrets: {} }, @@ -63,17 +69,19 @@ export const ConnectorEditFlyout = ({ initialConnector }: ConnectorEditProps) => const onActionConnectorSave = async (): Promise => await updateActionConnector({ http, connector, id: connector.id }) .then(savedConnector => { - toastNotifications.addSuccess( - i18n.translate( - 'xpack.triggersActionsUI.sections.editConnectorForm.updateSuccessNotificationText', - { - defaultMessage: "Updated '{connectorName}'", - values: { - connectorName: savedConnector.name, - }, - } - ) - ); + if (toastNotifications) { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.triggersActionsUI.sections.editConnectorForm.updateSuccessNotificationText', + { + defaultMessage: "Updated '{connectorName}'", + values: { + connectorName: savedConnector.name, + }, + } + ) + ); + } return savedConnector; }) .catch(errorRes => { @@ -151,7 +159,9 @@ export const ConnectorEditFlyout = ({ initialConnector }: ConnectorEditProps) => setIsSaving(false); if (savedAction) { closeFlyout(); - reloadConnectors(); + if (reloadConnectors) { + reloadConnectors(); + } } }} > diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx index f48e27791419d..4e514281be0ea 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx @@ -18,16 +18,16 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { ActionsConnectorsContextProvider } from '../../../context/actions_connectors_context'; import { useAppDependencies } from '../../../app_context'; import { loadAllActions, loadActionTypes } from '../../../lib/action_connector_api'; import { ActionConnector, ActionConnectorTableItem, ActionTypeIndex } from '../../../../types'; import { ConnectorAddFlyout, ConnectorEditFlyout } from '../../action_connector_form'; import { hasDeleteActionsCapability, hasSaveActionsCapability } from '../../../lib/capabilities'; import { DeleteConnectorsModal } from '../../../components/delete_connectors_modal'; +import { ActionsConnectorsContextProvider } from '../../../context/actions_connectors_context'; export const ActionsConnectorsList: React.FunctionComponent = () => { - const { http, toastNotifications, capabilities } = useAppDependencies(); + const { http, toastNotifications, capabilities, actionTypeRegistry } = useAppDependencies(); const canDelete = hasDeleteActionsCapability(capabilities); const canSave = hasSaveActionsCapability(capabilities); @@ -377,19 +377,23 @@ export const ActionsConnectorsList: React.FunctionComponent = () => { {data.length === 0 && !canSave && noPermissionPrompt} - + {editedConnectorItem ? ( ) : null} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx index d216b4d2a4afe..4ebeba3924faf 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx @@ -20,7 +20,7 @@ describe('alert_edit', () => { let deps: any; let wrapper: ReactWrapper; - beforeAll(async () => { + async function setup() { const mockes = coreMock.createSetup(); deps = { toastNotifications: mockes.notifications.toasts, @@ -122,9 +122,10 @@ describe('alert_edit', () => { await nextTick(); wrapper.update(); }); - }); + } - it('renders alert add flyout', () => { + it('renders alert add flyout', async () => { + await setup(); expect(wrapper.find('[data-test-subj="editAlertFlyoutTitle"]').exists()).toBeTruthy(); expect(wrapper.find('[data-test-subj="saveEditedAlertButton"]').exists()).toBeTruthy(); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx index 0c22ce0fca80c..bd18c99dca8fb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx @@ -4,22 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { Fragment } from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { actionTypeRegistryMock } from '../../action_type_registry.mock'; import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; import { ValidationResult, Alert } from '../../../types'; import { AlertForm } from './alert_form'; -import { AppDeps } from '../../app'; -import { chartPluginMock } from '../../../../../../../src/plugins/charts/public/mocks'; -import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; import { AlertsContextProvider } from '../../context/alerts_context'; +import { coreMock } from 'src/core/public/mocks'; const actionTypeRegistry = actionTypeRegistryMock.create(); const alertTypeRegistry = alertTypeRegistryMock.create(); describe('alert_form', () => { - let deps: AppDeps | null; + let deps: any; const alertType = { id: 'my-alert-type', iconClass: 'test', @@ -44,42 +41,19 @@ describe('alert_form', () => { actionConnectorFields: null, actionParamsFields: null, }; - beforeAll(async () => { - const mockes = coreMock.createSetup(); - const [ - { - chrome, - docLinks, - application: { capabilities }, - }, - ] = await mockes.getStartServices(); - deps = { - chrome, - docLinks, - toastNotifications: mockes.notifications.toasts, - injectedMetadata: mockes.injectedMetadata, - http: mockes.http, - uiSettings: mockes.uiSettings, - dataPlugin: dataPluginMock.createStartContract(), - charts: chartPluginMock.createStartContract(), - capabilities: { - ...capabilities, - siem: { - 'alerting:show': true, - 'alerting:save': true, - 'alerting:delete': false, - }, - }, - setBreadcrumbs: jest.fn(), - actionTypeRegistry: actionTypeRegistry as any, - alertTypeRegistry: alertTypeRegistry as any, - }; - }); describe('alert_form create alert', () => { let wrapper: ReactWrapper; - beforeAll(async () => { + async function setup() { + const mockes = coreMock.createSetup(); + deps = { + toastNotifications: mockes.notifications.toasts, + http: mockes.http, + uiSettings: mockes.uiSettings, + actionTypeRegistry: actionTypeRegistry as any, + alertTypeRegistry: alertTypeRegistry as any, + }; alertTypeRegistry.list.mockReturnValue([alertType]); alertTypeRegistry.has.mockReturnValue(true); actionTypeRegistry.list.mockReturnValue([actionType]); @@ -99,47 +73,49 @@ describe('alert_form', () => { mutedInstanceIds: [], } as unknown) as Alert; + wrapper = mountWithIntl( + { + return new Promise(() => {}); + }, + http: deps!.http, + actionTypeRegistry: deps!.actionTypeRegistry, + alertTypeRegistry: deps!.alertTypeRegistry, + toastNotifications: deps!.toastNotifications, + uiSettings: deps!.uiSettings, + }} + > + {}} + errors={{ name: [] }} + serverError={null} + /> + + ); + await act(async () => { - if (deps) { - wrapper = mountWithIntl( - { - return new Promise(() => {}); - }, - http: deps.http, - actionTypeRegistry: deps.actionTypeRegistry, - alertTypeRegistry: deps.alertTypeRegistry, - toastNotifications: deps.toastNotifications, - uiSettings: deps.uiSettings, - }} - > - {}} - errors={{ name: [] }} - serverError={null} - /> - - ); - } + await nextTick(); + wrapper.update(); }); + } - await waitForRender(wrapper); - }); - - it('renders alert name', () => { + it('renders alert name', async () => { + await setup(); const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); expect(alertNameField.exists()).toBeTruthy(); expect(alertNameField.first().prop('value')).toBe('test'); }); - it('renders registered selected alert type', () => { + it('renders registered selected alert type', async () => { + await setup(); const alertTypeSelectOptions = wrapper.find('[data-test-subj="my-alert-type-SelectOption"]'); expect(alertTypeSelectOptions.exists()).toBeTruthy(); }); - it('renders registered action types', () => { + it('renders registered action types', async () => { + await setup(); const alertTypeSelectOptions = wrapper.find( '[data-test-subj=".server-log-ActionTypeSelectOption"]' ); @@ -150,7 +126,15 @@ describe('alert_form', () => { describe('alert_form edit alert', () => { let wrapper: ReactWrapper; - beforeAll(async () => { + async function setup() { + const mockes = coreMock.createSetup(); + deps = { + toastNotifications: mockes.notifications.toasts, + http: mockes.http, + uiSettings: mockes.uiSettings, + actionTypeRegistry: actionTypeRegistry as any, + alertTypeRegistry: alertTypeRegistry as any, + }; alertTypeRegistry.list.mockReturnValue([alertType]); alertTypeRegistry.get.mockReturnValue(alertType); alertTypeRegistry.has.mockReturnValue(true); @@ -173,57 +157,53 @@ describe('alert_form', () => { mutedInstanceIds: [], } as unknown) as Alert; + wrapper = mountWithIntl( + { + return new Promise(() => {}); + }, + http: deps!.http, + actionTypeRegistry: deps!.actionTypeRegistry, + alertTypeRegistry: deps!.alertTypeRegistry, + toastNotifications: deps!.toastNotifications, + uiSettings: deps!.uiSettings, + }} + > + {}} + errors={{ name: [] }} + serverError={null} + /> + + ); + await act(async () => { - if (deps) { - wrapper = mountWithIntl( - { - return new Promise(() => {}); - }, - http: deps.http, - actionTypeRegistry: deps.actionTypeRegistry, - alertTypeRegistry: deps.alertTypeRegistry, - toastNotifications: deps.toastNotifications, - uiSettings: deps.uiSettings, - }} - > - {}} - errors={{ name: [] }} - serverError={null} - /> - - ); - } + await nextTick(); + wrapper.update(); }); + } - await waitForRender(wrapper); - }); - - it('renders alert name', () => { + it('renders alert name', async () => { + await setup(); const alertNameField = wrapper.find('[data-test-subj="alertNameInput"]'); expect(alertNameField.exists()).toBeTruthy(); expect(alertNameField.first().prop('value')).toBe('test'); }); - it('renders registered selected alert type', () => { + it('renders registered selected alert type', async () => { + await setup(); const alertTypeSelectOptions = wrapper.find('[data-test-subj="selectedAlertTypeTitle"]'); expect(alertTypeSelectOptions.exists()).toBeTruthy(); }); - it('renders registered action types', () => { + it('renders registered action types', async () => { + await setup(); const actionTypeSelectOptions = wrapper.find( '[data-test-subj="my-action-type-ActionTypeSelectOption"]' ); expect(actionTypeSelectOptions.exists()).toBeTruthy(); }); }); - - async function waitForRender(wrapper: ReactWrapper) { - await Promise.resolve(); - await Promise.resolve(); - wrapper.update(); - } }); diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 0be0a919112f8..74af4a77d0ef0 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -8,7 +8,12 @@ import { PluginInitializerContext } from 'src/core/public'; import { Plugin } from './plugin'; export { AlertsContextProvider } from './application/context/alerts_context'; +export { ActionsConnectorsContextProvider } from './application/context/actions_connectors_context'; export { AlertAdd } from './application/sections/alert_form'; +export { + ConnectorAddFlyout, + ConnectorEditFlyout, +} from './application/sections/action_connector_form'; export function plugin(ctx: PluginInitializerContext) { return new Plugin(ctx); diff --git a/x-pack/plugins/triggers_actions_ui/public/plugin.ts b/x-pack/plugins/triggers_actions_ui/public/plugin.ts index 459197d80d7aa..9f975cba3c0d1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/plugin.ts +++ b/x-pack/plugins/triggers_actions_ui/public/plugin.ts @@ -22,7 +22,10 @@ export interface TriggersAndActionsUIPublicPluginSetup { alertTypeRegistry: TypeRegistry; } -export type Start = void; +export interface TriggersAndActionsUIPublicPluginStart { + actionTypeRegistry: TypeRegistry; + alertTypeRegistry: TypeRegistry; +} interface PluginsStart { data: DataPublicPluginStart; @@ -30,7 +33,9 @@ interface PluginsStart { management: ManagementStart; } -export class Plugin implements CorePlugin { +export class Plugin + implements + CorePlugin { private actionTypeRegistry: TypeRegistry; private alertTypeRegistry: TypeRegistry; @@ -57,44 +62,46 @@ export class Plugin implements CorePlugin { + boot({ + dataPlugin: plugins.data, + charts: plugins.charts, + element: params.element, + toastNotifications: core.notifications.toasts, + injectedMetadata: core.injectedMetadata, + http: core.http, + uiSettings: core.uiSettings, + docLinks: core.docLinks, + chrome: core.chrome, + savedObjects: core.savedObjects.client, + I18nContext: core.i18n.Context, + capabilities: core.application.capabilities, + setBreadcrumbs: params.setBreadcrumbs, + actionTypeRegistry: this.actionTypeRegistry, + alertTypeRegistry: this.alertTypeRegistry, + }); + return () => {}; + }, + }); } - - plugins.management.sections.getSection('kibana')!.registerApp({ - id: 'triggersActions', - title: i18n.translate('xpack.triggersActionsUI.managementSection.displayName', { - defaultMessage: 'Alerts and Actions', - }), - order: 7, - mount: params => { - boot({ - dataPlugin: plugins.data, - charts: plugins.charts, - element: params.element, - toastNotifications: core.notifications.toasts, - injectedMetadata: core.injectedMetadata, - http: core.http, - uiSettings: core.uiSettings, - docLinks: core.docLinks, - chrome: core.chrome, - savedObjects: core.savedObjects.client, - I18nContext: core.i18n.Context, - capabilities: core.application.capabilities, - setBreadcrumbs: params.setBreadcrumbs, - actionTypeRegistry: this.actionTypeRegistry, - alertTypeRegistry: this.alertTypeRegistry, - }); - return () => {}; - }, - }); + return { + actionTypeRegistry: this.actionTypeRegistry, + alertTypeRegistry: this.alertTypeRegistry, + }; } public stop() {} diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts index 25ebc6d610f86..75ae6b9ea7c21 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts @@ -60,7 +60,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.click('thresholdAlertTimeFieldSelect'); const fieldOptions = await find.allByCssSelector('#thresholdTimeField option'); await fieldOptions[1].click(); + // need this two out of popup clicks to close them await nameInput.click(); + await testSubjects.click('intervalInput'); + await testSubjects.click('.slack-ActionTypeSelectOption'); await testSubjects.click('createActionConnectorButton'); const connectorNameInput = await testSubjects.find('nameInput'); From 5408f45b525d53b95375db47281cab410c239113 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 5 Mar 2020 15:59:33 -0700 Subject: [PATCH 16/25] expand max-old-space-size for xpack jest tests (#59455) * expand max-old-space-size for xpack jest tests * turns out we are already at 4GB * limit to 6GB for now --- test/scripts/jenkins_xpack.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/scripts/jenkins_xpack.sh b/test/scripts/jenkins_xpack.sh index b629e064b39b5..5055997df642a 100755 --- a/test/scripts/jenkins_xpack.sh +++ b/test/scripts/jenkins_xpack.sh @@ -11,7 +11,7 @@ if [[ -z "$CODE_COVERAGE" ]] ; then echo " -> Running jest tests" cd "$XPACK_DIR" - checks-reporter-with-killswitch "X-Pack Jest" node scripts/jest --ci --verbose --detectOpenHandles + checks-reporter-with-killswitch "X-Pack Jest" node --max-old-space-size=6144 scripts/jest --ci --verbose --detectOpenHandles echo "" echo "" From 1a548a1e42710c421a5e9b69bf120ba4ca8d786b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Fri, 6 Mar 2020 00:19:32 +0100 Subject: [PATCH 17/25] [Logs UI] Speed up stream rendering using memoization (#59163) This aims to be a quick performance improvement by memoizing the LogEntryRow component. --- .../logging/log_text_stream/log_entry_row.tsx | 296 +++++++++--------- 1 file changed, 149 insertions(+), 147 deletions(-) diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx index 9c1a1bb5962e4..566cc7ec09336 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx @@ -5,7 +5,7 @@ */ // import { darken, transparentize } from 'polished'; -import React, { useState, useCallback, useMemo } from 'react'; +import React, { memo, useState, useCallback, useMemo } from 'react'; import { euiStyled } from '../../../../../observability/public'; import { @@ -41,155 +41,157 @@ interface LogEntryRowProps { wrap: boolean; } -export const LogEntryRow = ({ - boundingBoxRef, - columnConfigurations, - columnWidths, - highlights, - isActiveHighlight, - isHighlighted, - logEntry, - openFlyoutWithItem, - scale, - wrap, -}: LogEntryRowProps) => { - const [isHovered, setIsHovered] = useState(false); - - const setItemIsHovered = useCallback(() => { - setIsHovered(true); - }, []); - - const setItemIsNotHovered = useCallback(() => { - setIsHovered(false); - }, []); - - const openFlyout = useCallback(() => openFlyoutWithItem(logEntry.gid), [ +export const LogEntryRow = memo( + ({ + boundingBoxRef, + columnConfigurations, + columnWidths, + highlights, + isActiveHighlight, + isHighlighted, + logEntry, openFlyoutWithItem, - logEntry.gid, - ]); - - const logEntryColumnsById = useMemo( - () => - logEntry.columns.reduce<{ - [columnId: string]: LogEntry['columns'][0]; - }>( - (columnsById, column) => ({ - ...columnsById, - [column.columnId]: column, - }), - {} - ), - [logEntry.columns] - ); - - const highlightsByColumnId = useMemo( - () => - highlights.reduce<{ - [columnId: string]: LogEntryHighlightColumn[]; - }>( - (columnsById, highlight) => - highlight.columns.reduce( - (innerColumnsById, column) => ({ - ...innerColumnsById, - [column.columnId]: [...(innerColumnsById[column.columnId] || []), column], - }), - columnsById - ), - {} - ), - [highlights] - ); - - return ( - - {columnConfigurations.map(columnConfiguration => { - if (isTimestampLogColumnConfiguration(columnConfiguration)) { - const column = logEntryColumnsById[columnConfiguration.timestampColumn.id]; - const columnWidth = columnWidths[columnConfiguration.timestampColumn.id]; - - return ( - - {isTimestampColumn(column) ? ( - - ) : null} - - ); - } else if (isMessageLogColumnConfiguration(columnConfiguration)) { - const column = logEntryColumnsById[columnConfiguration.messageColumn.id]; - const columnWidth = columnWidths[columnConfiguration.messageColumn.id]; - - return ( - - {column ? ( - - ) : null} - - ); - } else if (isFieldLogColumnConfiguration(columnConfiguration)) { - const column = logEntryColumnsById[columnConfiguration.fieldColumn.id]; - const columnWidth = columnWidths[columnConfiguration.fieldColumn.id]; - - return ( - - {column ? ( - - ) : null} - - ); + scale, + wrap, + }: LogEntryRowProps) => { + const [isHovered, setIsHovered] = useState(false); + + const setItemIsHovered = useCallback(() => { + setIsHovered(true); + }, []); + + const setItemIsNotHovered = useCallback(() => { + setIsHovered(false); + }, []); + + const openFlyout = useCallback(() => openFlyoutWithItem(logEntry.gid), [ + openFlyoutWithItem, + logEntry.gid, + ]); + + const logEntryColumnsById = useMemo( + () => + logEntry.columns.reduce<{ + [columnId: string]: LogEntry['columns'][0]; + }>( + (columnsById, column) => ({ + ...columnsById, + [column.columnId]: column, + }), + {} + ), + [logEntry.columns] + ); + + const highlightsByColumnId = useMemo( + () => + highlights.reduce<{ + [columnId: string]: LogEntryHighlightColumn[]; + }>( + (columnsById, highlight) => + highlight.columns.reduce( + (innerColumnsById, column) => ({ + ...innerColumnsById, + [column.columnId]: [...(innerColumnsById[column.columnId] || []), column], + }), + columnsById + ), + {} + ), + [highlights] + ); + + return ( + - - - - ); -}; + {columnConfigurations.map(columnConfiguration => { + if (isTimestampLogColumnConfiguration(columnConfiguration)) { + const column = logEntryColumnsById[columnConfiguration.timestampColumn.id]; + const columnWidth = columnWidths[columnConfiguration.timestampColumn.id]; + + return ( + + {isTimestampColumn(column) ? ( + + ) : null} + + ); + } else if (isMessageLogColumnConfiguration(columnConfiguration)) { + const column = logEntryColumnsById[columnConfiguration.messageColumn.id]; + const columnWidth = columnWidths[columnConfiguration.messageColumn.id]; + + return ( + + {column ? ( + + ) : null} + + ); + } else if (isFieldLogColumnConfiguration(columnConfiguration)) { + const column = logEntryColumnsById[columnConfiguration.fieldColumn.id]; + const columnWidth = columnWidths[columnConfiguration.fieldColumn.id]; + + return ( + + {column ? ( + + ) : null} + + ); + } + })} + + + + + ); + } +); interface LogEntryRowWrapperProps { scale: TextScale; From c4b385dfd5d7e1b4ebe447855951f115c53f0960 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Thu, 5 Mar 2020 16:47:45 -0700 Subject: [PATCH 18/25] [Search service] Add enhanced ES search strategy (#59224) * Add async search strategy * Add async search * Fix async strategy and add tests * Move types to separate file * Revert changes to demo search * Update demo search strategy to use async * Add async es search strategy * Return response as rawResponse * Poll after initial request * Add cancellation to search strategies * Add tests * Simplify async search strategy * Move loadingCount to search strategy * Update abort controller library * Bootstrap * Abort when the request is aborted * Add utility and update value suggestions route * Fix bad merge conflict * Update tests * Move to data_enhanced plugin * Remove bad merge * Revert switching abort controller libraries * Revert package.json in lib * Move to previous abort controller * Add support for frozen indices * Fix test to use fake timers to run debounced handlers * Revert changes to example plugin * Fix loading bar not going away when cancelling * Call getSearchStrategy instead of passing directly * Add async demo search strategy * Fix error with setting state * Update how aborting works * Fix type checks * Add test for loading count * Attempt to fix broken example test * Revert changes to test * Fix test * Update name to camelCase * Fix failing test * Don't require data_enhanced in example plugin * Actually send DELETE request * Use waitForCompletion parameter * Use default search params * Add support for rollups * Only make changes needed for frozen indices/rollups * Fix tests/types * Don't include skipped in loaded/total Co-authored-by: Elastic Machine --- src/plugins/data/common/index.ts | 1 + .../search/es_search/es_search_strategy.ts | 9 ++- .../es_search/get_es_preference.test.ts | 39 +++++++----- .../search/es_search/get_es_preference.ts | 14 ++--- .../data/public/search/es_search/index.ts | 21 +++++++ src/plugins/data/public/search/index.ts | 1 + src/plugins/data/server/index.ts | 12 +++- .../data/server/search/create_api.test.ts | 13 +++- src/plugins/data/server/search/create_api.ts | 4 ++ .../es_search/es_search_strategy.test.ts | 18 ------ .../search/es_search/es_search_strategy.ts | 24 +++----- .../es_search/get_default_search_params.ts | 28 +++++++++ .../data/server/search/es_search/index.ts | 4 +- src/plugins/data/server/search/index.ts | 4 +- x-pack/plugins/data_enhanced/common/index.ts | 7 +++ .../data_enhanced/common/search/index.ts | 7 +++ .../data_enhanced/common/search/types.ts | 19 ++++++ x-pack/plugins/data_enhanced/kibana.json | 2 +- x-pack/plugins/data_enhanced/public/plugin.ts | 16 ++++- .../public/search/es_search_strategy.ts | 41 +++++++++++++ .../data_enhanced/public/search/index.ts | 1 + x-pack/plugins/data_enhanced/server/index.ts | 14 +++++ x-pack/plugins/data_enhanced/server/plugin.ts | 37 ++++++++++++ .../server/search/es_search_strategy.ts | 59 +++++++++++++++++++ .../data_enhanced/server/search/index.ts | 7 +++ 25 files changed, 331 insertions(+), 71 deletions(-) create mode 100644 src/plugins/data/public/search/es_search/index.ts create mode 100644 src/plugins/data/server/search/es_search/get_default_search_params.ts create mode 100644 x-pack/plugins/data_enhanced/common/index.ts create mode 100644 x-pack/plugins/data_enhanced/common/search/index.ts create mode 100644 x-pack/plugins/data_enhanced/common/search/types.ts create mode 100644 x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts create mode 100644 x-pack/plugins/data_enhanced/server/index.ts create mode 100644 x-pack/plugins/data_enhanced/server/plugin.ts create mode 100644 x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts create mode 100644 x-pack/plugins/data_enhanced/server/search/index.ts diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index e02045de24e8f..7fa6e88b427a9 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -24,4 +24,5 @@ export * from './index_patterns'; export * from './es_query'; export * from './utils'; export * from './types'; +export * from './search'; export * from './constants'; diff --git a/src/plugins/data/public/search/es_search/es_search_strategy.ts b/src/plugins/data/public/search/es_search/es_search_strategy.ts index 5382a59123e78..a61428c998157 100644 --- a/src/plugins/data/public/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/public/search/es_search/es_search_strategy.ts @@ -30,11 +30,10 @@ export const esSearchStrategyProvider: TSearchStrategyProvider { - if (typeof request.params.preference === 'undefined') { - const setPreference = context.core.uiSettings.get('courier:setRequestPreference'); - const customPreference = context.core.uiSettings.get('courier:customRequestPreference'); - request.params.preference = getEsPreference(setPreference, customPreference); - } + request.params = { + preference: getEsPreference(context.core.uiSettings), + ...request.params, + }; return search({ ...request, serverStrategy: ES_SEARCH_STRATEGY }, options) as Observable< IEsSearchResponse >; diff --git a/src/plugins/data/public/search/es_search/get_es_preference.test.ts b/src/plugins/data/public/search/es_search/get_es_preference.test.ts index 27e6f9b48bbdd..8b8156b4519d6 100644 --- a/src/plugins/data/public/search/es_search/get_es_preference.test.ts +++ b/src/plugins/data/public/search/es_search/get_es_preference.test.ts @@ -18,29 +18,40 @@ */ import { getEsPreference } from './get_es_preference'; - -jest.useFakeTimers(); +import { CoreStart } from '../../../../../core/public'; +import { coreMock } from '../../../../../core/public/mocks'; describe('Get ES preference', () => { + let mockCoreStart: MockedKeys; + + beforeEach(() => { + mockCoreStart = coreMock.createStart(); + }); + test('returns the session ID if set to sessionId', () => { - const setPreference = 'sessionId'; - const customPreference = 'foobar'; - const sessionId = 'my_session_id'; - const preference = getEsPreference(setPreference, customPreference, sessionId); - expect(preference).toBe(sessionId); + mockCoreStart.uiSettings.get.mockImplementation((key: string) => { + if (key === 'courier:setRequestPreference') return 'sessionId'; + if (key === 'courier:customRequestPreference') return 'foobar'; + }); + const preference = getEsPreference(mockCoreStart.uiSettings, 'my_session_id'); + expect(preference).toBe('my_session_id'); }); test('returns the custom preference if set to custom', () => { - const setPreference = 'custom'; - const customPreference = 'foobar'; - const preference = getEsPreference(setPreference, customPreference); - expect(preference).toBe(customPreference); + mockCoreStart.uiSettings.get.mockImplementation((key: string) => { + if (key === 'courier:setRequestPreference') return 'custom'; + if (key === 'courier:customRequestPreference') return 'foobar'; + }); + const preference = getEsPreference(mockCoreStart.uiSettings); + expect(preference).toBe('foobar'); }); test('returns undefined if set to none', () => { - const setPreference = 'none'; - const customPreference = 'foobar'; - const preference = getEsPreference(setPreference, customPreference); + mockCoreStart.uiSettings.get.mockImplementation((key: string) => { + if (key === 'courier:setRequestPreference') return 'none'; + if (key === 'courier:customRequestPreference') return 'foobar'; + }); + const preference = getEsPreference(mockCoreStart.uiSettings); expect(preference).toBe(undefined); }); }); diff --git a/src/plugins/data/public/search/es_search/get_es_preference.ts b/src/plugins/data/public/search/es_search/get_es_preference.ts index 200e5bacb7f18..3f1c2b9b3b736 100644 --- a/src/plugins/data/public/search/es_search/get_es_preference.ts +++ b/src/plugins/data/public/search/es_search/get_es_preference.ts @@ -17,13 +17,13 @@ * under the License. */ +import { IUiSettingsClient } from '../../../../../core/public'; + const defaultSessionId = `${Date.now()}`; -export function getEsPreference( - setRequestPreference: string, - customRequestPreference?: string, - sessionId: string = defaultSessionId -) { - if (setRequestPreference === 'sessionId') return `${sessionId}`; - return setRequestPreference === 'custom' ? customRequestPreference : undefined; +export function getEsPreference(uiSettings: IUiSettingsClient, sessionId = defaultSessionId) { + const setPreference = uiSettings.get('courier:setRequestPreference'); + if (setPreference === 'sessionId') return `${sessionId}`; + const customPreference = uiSettings.get('courier:customRequestPreference'); + return setPreference === 'custom' ? customPreference : undefined; } diff --git a/src/plugins/data/public/search/es_search/index.ts b/src/plugins/data/public/search/es_search/index.ts new file mode 100644 index 0000000000000..41c6ec388bfaf --- /dev/null +++ b/src/plugins/data/public/search/es_search/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { esSearchStrategyProvider } from './es_search_strategy'; +export { getEsPreference } from './get_es_preference'; diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 853dbd09e1f93..2a54cfe2be785 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -36,6 +36,7 @@ export { export { IEsSearchResponse, IEsSearchRequest, ES_SEARCH_STRATEGY } from '../../common/search'; export { ISyncSearchRequest, SYNC_SEARCH_STRATEGY } from './sync_search_strategy'; +export { esSearchStrategyProvider, getEsPreference } from './es_search'; export { IKibanaSearchResponse, IKibanaSearchRequest } from '../../common/search'; diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index b7ec02871306c..18ba1130cc26a 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -151,8 +151,16 @@ export { * Search */ -export { IRequestTypesMap, IResponseTypesMap } from './search'; -export * from './search'; +export { + ISearch, + ICancel, + ISearchOptions, + IRequestTypesMap, + IResponseTypesMap, + ISearchContext, + TSearchStrategyProvider, + getDefaultSearchParams, +} from './search'; /** * Types to be shared externally diff --git a/src/plugins/data/server/search/create_api.test.ts b/src/plugins/data/server/search/create_api.test.ts index 99e48056ef857..0cf68b7e020ce 100644 --- a/src/plugins/data/server/search/create_api.test.ts +++ b/src/plugins/data/server/search/create_api.test.ts @@ -23,8 +23,6 @@ import { TSearchStrategiesMap } from './i_search_strategy'; import { IRouteHandlerSearchContext } from './i_route_handler_search_context'; import { DEFAULT_SEARCH_STRATEGY } from '../../common/search'; -// let mockCoreSetup: MockedKeys; - const mockDefaultSearch = jest.fn(() => Promise.resolve({ total: 100, loaded: 0 })); const mockDefaultSearchStrategyProvider = jest.fn(() => Promise.resolve({ @@ -59,4 +57,15 @@ describe('createApi', () => { `"No strategy found for noneByThisName"` ); }); + + it('logs the response if `debug` is set to `true`', async () => { + const spy = jest.spyOn(console, 'log'); + await api.search({ params: {} }); + + expect(spy).not.toBeCalled(); + + await api.search({ debug: true, params: {} }); + + expect(spy).toBeCalled(); + }); }); diff --git a/src/plugins/data/server/search/create_api.ts b/src/plugins/data/server/search/create_api.ts index 798a4b82caaef..00665b21f2ba7 100644 --- a/src/plugins/data/server/search/create_api.ts +++ b/src/plugins/data/server/search/create_api.ts @@ -31,6 +31,10 @@ export function createApi({ }) { const api: IRouteHandlerSearchContext = { search: async (request, options, strategyName) => { + if (request.debug) { + // eslint-disable-next-line + console.log(JSON.stringify(request, null, 2)); + } const name = strategyName ?? DEFAULT_SEARCH_STRATEGY; const strategyProvider = searchStrategies[name]; if (!strategyProvider) { diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts index 99ccb4dcbebab..c4b8119f9e095 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts @@ -51,24 +51,6 @@ describe('ES search strategy', () => { expect(typeof esSearch.search).toBe('function'); }); - it('logs the response if `debug` is set to `true`', async () => { - const spy = jest.spyOn(console, 'log'); - const esSearch = esSearchStrategyProvider( - { - core: mockCoreSetup, - config$: mockConfig$, - }, - mockApiCaller, - mockSearch - ); - - expect(spy).not.toBeCalled(); - - await esSearch.search({ params: {}, debug: true }); - - expect(spy).toBeCalled(); - }); - it('calls the API caller with the params with defaults', async () => { const params = { index: 'logstash-*' }; const esSearch = esSearchStrategyProvider( diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index 20bc964effc02..26055a3ae41f7 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -21,7 +21,7 @@ import { APICaller } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; import { ES_SEARCH_STRATEGY } from '../../../common/search'; import { ISearchStrategy, TSearchStrategyProvider } from '../i_search_strategy'; -import { ISearchContext } from '..'; +import { getDefaultSearchParams, ISearchContext } from '..'; export const esSearchStrategyProvider: TSearchStrategyProvider = ( context: ISearchContext, @@ -30,28 +30,18 @@ export const esSearchStrategyProvider: TSearchStrategyProvider { const config = await context.config$.pipe(first()).toPromise(); + const defaultParams = getDefaultSearchParams(config); const params = { - timeout: `${config.elasticsearch.shardTimeout.asMilliseconds()}ms`, - ignoreUnavailable: true, // Don't fail if the index/indices don't exist - restTotalHitsAsInt: true, // Get the number of hits as an int rather than a range + ...defaultParams, ...request.params, }; - if (request.debug) { - // eslint-disable-next-line - console.log(JSON.stringify(params, null, 2)); - } - const esSearchResponse = (await caller('search', params, options)) as SearchResponse; + const rawResponse = (await caller('search', params, options)) as SearchResponse; // The above query will either complete or timeout and throw an error. // There is no progress indication on this api. - return { - total: esSearchResponse._shards.total, - loaded: - esSearchResponse._shards.failed + - esSearchResponse._shards.skipped + - esSearchResponse._shards.successful, - rawResponse: esSearchResponse, - }; + const { total, failed, successful } = rawResponse._shards; + const loaded = failed + successful; + return { total, loaded, rawResponse }; }, }; }; diff --git a/src/plugins/data/server/search/es_search/get_default_search_params.ts b/src/plugins/data/server/search/es_search/get_default_search_params.ts new file mode 100644 index 0000000000000..b2341ccc0f3c8 --- /dev/null +++ b/src/plugins/data/server/search/es_search/get_default_search_params.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SharedGlobalConfig } from '../../../../../core/server'; + +export function getDefaultSearchParams(config: SharedGlobalConfig) { + return { + timeout: `${config.elasticsearch.shardTimeout.asMilliseconds()}ms`, + ignoreUnavailable: true, // Don't fail if the index/indices don't exist + restTotalHitsAsInt: true, // Get the number of hits as an int rather than a range + }; +} diff --git a/src/plugins/data/server/search/es_search/index.ts b/src/plugins/data/server/search/es_search/index.ts index e5dcb0c97d7c9..5a8b3bc94c679 100644 --- a/src/plugins/data/server/search/es_search/index.ts +++ b/src/plugins/data/server/search/es_search/index.ts @@ -17,6 +17,6 @@ * under the License. */ -export { esSearchStrategyProvider } from './es_search_strategy'; - export { ES_SEARCH_STRATEGY, IEsSearchRequest, IEsSearchResponse } from '../../../common/search'; +export { esSearchStrategyProvider } from './es_search_strategy'; +export { getDefaultSearchParams } from './get_default_search_params'; diff --git a/src/plugins/data/server/search/index.ts b/src/plugins/data/server/search/index.ts index 298a665fd5b2c..385e96ee803b6 100644 --- a/src/plugins/data/server/search/index.ts +++ b/src/plugins/data/server/search/index.ts @@ -21,8 +21,10 @@ export { ISearchSetup } from './i_search_setup'; export { ISearchContext } from './i_search_context'; -export { IRequestTypesMap, IResponseTypesMap } from './i_search'; +export { ISearch, ICancel, ISearchOptions, IRequestTypesMap, IResponseTypesMap } from './i_search'; export { TStrategyTypes } from './strategy_types'; export { TSearchStrategyProvider } from './i_search_strategy'; + +export { getDefaultSearchParams } from './es_search'; diff --git a/x-pack/plugins/data_enhanced/common/index.ts b/x-pack/plugins/data_enhanced/common/index.ts new file mode 100644 index 0000000000000..0d5e353b0e83b --- /dev/null +++ b/x-pack/plugins/data_enhanced/common/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { EnhancedSearchParams, IEnhancedEsSearchRequest } from './search'; diff --git a/x-pack/plugins/data_enhanced/common/search/index.ts b/x-pack/plugins/data_enhanced/common/search/index.ts new file mode 100644 index 0000000000000..3fe4fd029b940 --- /dev/null +++ b/x-pack/plugins/data_enhanced/common/search/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { EnhancedSearchParams, IEnhancedEsSearchRequest } from './types'; diff --git a/x-pack/plugins/data_enhanced/common/search/types.ts b/x-pack/plugins/data_enhanced/common/search/types.ts new file mode 100644 index 0000000000000..59ce9f0b36f20 --- /dev/null +++ b/x-pack/plugins/data_enhanced/common/search/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SearchParams } from 'elasticsearch'; +import { IEsSearchRequest } from '../../../../../src/plugins/data/common'; + +export interface EnhancedSearchParams extends SearchParams { + ignoreThrottled: boolean; +} + +export interface IEnhancedEsSearchRequest extends IEsSearchRequest { + /** + * Used to determine whether to use the _rollups_search or a regular search endpoint. + */ + isRollup?: boolean; +} diff --git a/x-pack/plugins/data_enhanced/kibana.json b/x-pack/plugins/data_enhanced/kibana.json index 4dbfe958eff68..841f49caa1a2b 100644 --- a/x-pack/plugins/data_enhanced/kibana.json +++ b/x-pack/plugins/data_enhanced/kibana.json @@ -8,6 +8,6 @@ "requiredPlugins": [ "data" ], - "server": false, + "server": true, "ui": true } diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts index 4fe27d400f45f..6316d87c50519 100644 --- a/x-pack/plugins/data_enhanced/public/plugin.ts +++ b/x-pack/plugins/data_enhanced/public/plugin.ts @@ -5,10 +5,18 @@ */ import { CoreSetup, CoreStart, Plugin } from 'src/core/public'; -import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../../src/plugins/data/public'; +import { + DataPublicPluginSetup, + DataPublicPluginStart, + ES_SEARCH_STRATEGY, +} from '../../../../src/plugins/data/public'; import { setAutocompleteService } from './services'; import { setupKqlQuerySuggestionProvider, KUERY_LANGUAGE_NAME } from './autocomplete'; -import { ASYNC_SEARCH_STRATEGY, asyncSearchStrategyProvider } from './search'; +import { + ASYNC_SEARCH_STRATEGY, + asyncSearchStrategyProvider, + enhancedEsSearchStrategyProvider, +} from './search'; export interface DataEnhancedSetupDependencies { data: DataPublicPluginSetup; @@ -29,6 +37,10 @@ export class DataEnhancedPlugin implements Plugin { setupKqlQuerySuggestionProvider(core) ); data.search.registerSearchStrategyProvider(ASYNC_SEARCH_STRATEGY, asyncSearchStrategyProvider); + data.search.registerSearchStrategyProvider( + ES_SEARCH_STRATEGY, + enhancedEsSearchStrategyProvider + ); } public start(core: CoreStart, plugins: DataEnhancedStartDependencies) { diff --git a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts new file mode 100644 index 0000000000000..25c6a789cca93 --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Observable } from 'rxjs'; +import { ES_SEARCH_STRATEGY, IEsSearchResponse } from '../../../../../src/plugins/data/common'; +import { + TSearchStrategyProvider, + ISearchContext, + ISearch, + SYNC_SEARCH_STRATEGY, + getEsPreference, +} from '../../../../../src/plugins/data/public'; +import { IEnhancedEsSearchRequest, EnhancedSearchParams } from '../../common'; + +export const enhancedEsSearchStrategyProvider: TSearchStrategyProvider = ( + context: ISearchContext +) => { + const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); + const { search: syncSearch } = syncStrategyProvider(context); + + const search: ISearch = ( + request: IEnhancedEsSearchRequest, + options + ) => { + const params: EnhancedSearchParams = { + ignoreThrottled: !context.core.uiSettings.get('search:includeFrozen'), + preference: getEsPreference(context.core.uiSettings), + ...request.params, + }; + request.params = params; + + return syncSearch({ ...request, serverStrategy: ES_SEARCH_STRATEGY }, options) as Observable< + IEsSearchResponse + >; + }; + + return { search }; +}; diff --git a/x-pack/plugins/data_enhanced/public/search/index.ts b/x-pack/plugins/data_enhanced/public/search/index.ts index a7729aeea5647..e39c1b6a1dd61 100644 --- a/x-pack/plugins/data_enhanced/public/search/index.ts +++ b/x-pack/plugins/data_enhanced/public/search/index.ts @@ -5,4 +5,5 @@ */ export { ASYNC_SEARCH_STRATEGY, asyncSearchStrategyProvider } from './async_search_strategy'; +export { enhancedEsSearchStrategyProvider } from './es_search_strategy'; export { IAsyncSearchRequest, IAsyncSearchOptions } from './types'; diff --git a/x-pack/plugins/data_enhanced/server/index.ts b/x-pack/plugins/data_enhanced/server/index.ts new file mode 100644 index 0000000000000..fbe1ecc10d632 --- /dev/null +++ b/x-pack/plugins/data_enhanced/server/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PluginInitializerContext } from 'kibana/server'; +import { EnhancedDataServerPlugin } from './plugin'; + +export function plugin(initializerContext: PluginInitializerContext) { + return new EnhancedDataServerPlugin(initializerContext); +} + +export { EnhancedDataServerPlugin as Plugin }; diff --git a/x-pack/plugins/data_enhanced/server/plugin.ts b/x-pack/plugins/data_enhanced/server/plugin.ts new file mode 100644 index 0000000000000..a27a73431574b --- /dev/null +++ b/x-pack/plugins/data_enhanced/server/plugin.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, +} from '../../../../src/core/server'; +import { ES_SEARCH_STRATEGY } from '../../../../src/plugins/data/common'; +import { PluginSetup as DataPluginSetup } from '../../../../src/plugins/data/server'; +import { enhancedEsSearchStrategyProvider } from './search'; + +interface SetupDependencies { + data: DataPluginSetup; +} + +export class EnhancedDataServerPlugin implements Plugin { + constructor(private initializerContext: PluginInitializerContext) {} + + public setup(core: CoreSetup, deps: SetupDependencies) { + deps.data.search.registerSearchStrategyProvider( + this.initializerContext.opaqueId, + ES_SEARCH_STRATEGY, + enhancedEsSearchStrategyProvider + ); + } + + public start(core: CoreStart) {} + + public stop() {} +} + +export { EnhancedDataServerPlugin as Plugin }; diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts new file mode 100644 index 0000000000000..6e12ffb6404c6 --- /dev/null +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { first } from 'rxjs/operators'; +import { mapKeys, snakeCase } from 'lodash'; +import { SearchResponse } from 'elasticsearch'; +import { APICaller } from '../../../../../src/core/server'; +import { ES_SEARCH_STRATEGY } from '../../../../../src/plugins/data/common'; +import { + ISearchContext, + TSearchStrategyProvider, + ISearch, + ISearchOptions, + getDefaultSearchParams, +} from '../../../../../src/plugins/data/server'; +import { IEnhancedEsSearchRequest } from '../../common'; + +export const enhancedEsSearchStrategyProvider: TSearchStrategyProvider = ( + context: ISearchContext, + caller: APICaller +) => { + const search: ISearch = async ( + request: IEnhancedEsSearchRequest, + options + ) => { + const config = await context.config$.pipe(first()).toPromise(); + const defaultParams = getDefaultSearchParams(config); + const params = { ...defaultParams, ...request.params }; + + const rawResponse = (await (request.isRollup + ? rollupSearch(caller, { ...request, params }, options) + : caller('search', params, options))) as SearchResponse; + + const { total, failed, successful } = rawResponse._shards; + const loaded = failed + successful; + return { total, loaded, rawResponse }; + }; + + return { search }; +}; + +function rollupSearch( + caller: APICaller, + request: IEnhancedEsSearchRequest, + options?: ISearchOptions +) { + const method = 'POST'; + const path = `${request.params.index}/_rollup_search`; + const { body, ...params } = request.params; + const query = toSnakeCase(params); + return caller('transport.request', { method, path, body, query }, options); +} + +function toSnakeCase(obj: Record) { + return mapKeys(obj, (value, key) => snakeCase(key)); +} diff --git a/x-pack/plugins/data_enhanced/server/search/index.ts b/x-pack/plugins/data_enhanced/server/search/index.ts new file mode 100644 index 0000000000000..f914326f30d32 --- /dev/null +++ b/x-pack/plugins/data_enhanced/server/search/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { enhancedEsSearchStrategyProvider } from './es_search_strategy'; From 5ff13ada6b3b8a48d9bf9f8fca79421cedbc7940 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Thu, 5 Mar 2020 17:47:08 -0800 Subject: [PATCH 19/25] Add custom action to registry and show actions list in siem (#58395) * Add custom action to registry and show actions list in siem * Exposed action form as reusable component * Fixed few small bugs * Fixed red ci * Fixed type checks * Fixed failed tests * Fixed due to comments * Fixed type check errors * Fixed plugin check * Rebalancing CI groups according to #58930 * Fixed merge issues --- x-pack/plugins/triggers_actions_ui/README.md | 165 +++++- .../components/builtin_action_types/email.tsx | 6 +- .../builtin_action_types/server_log.tsx | 2 +- .../components/builtin_action_types/slack.tsx | 2 +- .../application/context/alerts_context.tsx | 4 +- .../action_form.test.tsx | 117 ++++ .../action_connector_form/action_form.tsx | 512 ++++++++++++++++++ .../connector_add_modal.test.tsx | 1 - .../connector_add_modal.tsx | 9 +- .../sections/action_connector_form/index.ts | 1 + .../sections/alert_form/alert_form.test.tsx | 8 - .../sections/alert_form/alert_form.tsx | 508 ++--------------- .../triggers_actions_ui/public/index.ts | 2 + .../security_and_spaces/tests/index.ts | 2 +- .../spaces_only/tests/index.ts | 2 +- 15 files changed, 830 insertions(+), 511 deletions(-) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx diff --git a/x-pack/plugins/triggers_actions_ui/README.md b/x-pack/plugins/triggers_actions_ui/README.md index ccd33c99f9e1c..0d667f477f936 100644 --- a/x-pack/plugins/triggers_actions_ui/README.md +++ b/x-pack/plugins/triggers_actions_ui/README.md @@ -43,6 +43,7 @@ Table of Contents - [Action type model definition](#action-type-model-definition) - [Register action type model](#register-action-type-model) - [Create and register new action type UI example](#reate-and-register-new-action-type-ui-example) + - [Embed the Alert Actions form within any Kibana plugin](#embed-the-alert-actions-form-within-any-kibana-plugin) - [Embed the Create Connector flyout within any Kibana plugin](#embed-the-create-connector-flyout-within-any-kibana-plugin) - [Embed the Edit Connector flyout within any Kibana plugin](#embed-the-edit-connector-flyout-within-any-kibana-plugin) @@ -71,7 +72,7 @@ AlertTypeModel: ``` export function getAlertType(): AlertTypeModel { return { - id: 'threshold', + id: '.index-threshold', name: 'Index Threshold', iconClass: 'alert', alertParamsExpression: IndexThresholdAlertTypeExpression, @@ -660,8 +661,6 @@ const [alertFlyoutVisible, setAlertFlyoutVisibility] = useState(false); // in render section of component (false); metadata: { test: 'some value', fields: ['test'] }, }} > - + ``` @@ -680,6 +680,8 @@ AlertAdd Props definition: ``` interface AlertAddProps { consumer: string; + addFlyoutVisible: boolean; + setAddFlyoutVisibility: React.Dispatch>; alertTypeId?: string; canChangeTrigger?: boolean; } @@ -688,20 +690,20 @@ interface AlertAddProps { |Property|Description| |---|---| |consumer|Name of the plugin that creates an alert.| +|addFlyoutVisible|Visibility state of the Create Alert flyout.| +|setAddFlyoutVisibility|Function for changing visibility state of the Create Alert flyout.| |alertTypeId|Optional property to preselect alert type.| |canChangeTrigger|Optional property, that hides change alert type possibility.| AlertsContextProvider value options: ``` export interface AlertsContextValue> { - addFlyoutVisible: boolean; - setAddFlyoutVisibility: React.Dispatch>; reloadAlerts?: () => Promise; http: HttpSetup; alertTypeRegistry: TypeRegistry; actionTypeRegistry: TypeRegistry; uiSettings?: IUiSettingsClient; - toastNotifications?: Pick< + toastNotifications: Pick< ToastsApi, 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' >; @@ -713,14 +715,12 @@ export interface AlertsContextValue> { |Property|Description| |---|---| -|addFlyoutVisible|Visibility state of the Create Alert flyout.| -|setAddFlyoutVisibility|Function for changing visibility state of the Create Alert flyout.| |reloadAlerts|Optional function, which will be executed if alert was saved sucsessfuly.| |http|HttpSetup needed for executing API calls.| |alertTypeRegistry|Registry for alert types.| |actionTypeRegistry|Registry for action types.| |uiSettings|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| -|toastNotifications|Optional toast messages.| +|toastNotifications|Toast messages.| |charts|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| |dataFieldsFormats|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| |metadata|Optional generic property, which allows to define component specific metadata. This metadata can be used for passing down preloaded data for Alert type expression component.| @@ -1204,6 +1204,150 @@ Clicking on the select card for `Example Action Type` will open the action type or create a new connector: ![Example Action Type with empty connectors list](https://i.imgur.com/EamA9Xv.png) +## Embed the Alert Actions form within any Kibana plugin + +Follow the instructions bellow to embed the Alert Actions form within any Kibana plugin: +1. Add TriggersAndActionsUIPublicPluginSetup and TriggersAndActionsUIPublicPluginStart to Kibana plugin setup dependencies: + +``` +import { + TriggersAndActionsUIPublicPluginSetup, + TriggersAndActionsUIPublicPluginStart, + } from '../../../../../x-pack/plugins/triggers_actions_ui/public'; + +triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; +... + +triggers_actions_ui: TriggersAndActionsUIPublicPluginStart; +``` +Then this dependencies will be used to embed Actions form or register your own action type. + +2. Add Actions form to React component: + +``` + import React, { useCallback } from 'react'; + import { ActionForm } from '../../../../../../../../../plugins/triggers_actions_ui/public'; + import { AlertAction } from '../../../../../../../../../plugins/triggers_actions_ui/public/types'; + + const ALOWED_BY_PLUGIN_ACTION_TYPES = [ + { id: '.email', name: 'Email', enabled: true }, + { id: '.index', name: 'Index', enabled: false }, + { id: '.example-action', name: 'Example Action', enabled: false }, + ]; + + export const ComponentWithActionsForm: () => { + const { http, triggers_actions_ui, toastNotifications } = useKibana().services; + const actionTypeRegistry = triggers_actions_ui.actionTypeRegistry; + const initialAlert = ({ + name: 'test', + params: {}, + consumer: 'alerting', + alertTypeId: '.index-threshold', + schedule: { + interval: '1m', + }, + actions: [ + { + group: 'default', + id: 'test', + actionTypeId: '.index', + params: { + message: '', + }, + }, + ], + tags: [], + muteAll: false, + enabled: false, + mutedInstanceIds: [], + } as unknown) as Alert; + + return ( + { + initialAlert.actions[index].id = id; + }} + setAlertProperty={(_updatedActions: AlertAction[]) => {}} + setActionParamsProperty={(key: string, value: any, index: number) => + (initialAlert.actions[index] = { ...initialAlert.actions[index], [key]: value }) + } + http={http} + actionTypeRegistry={actionTypeRegistry} + defaultActionMessage={'Alert [{{ctx.metadata.name}}] has exceeded the threshold'} + actionTypes={ALOWED_BY_PLUGIN_ACTION_TYPES} + toastNotifications={toastNotifications} + /> + ); + }; +``` + +ActionForm Props definition: +``` +interface ActionAccordionFormProps { + actions: AlertAction[]; + defaultActionGroupId: string; + setActionIdByIndex: (id: string, index: number) => void; + setAlertProperty: (actions: AlertAction[]) => void; + setActionParamsProperty: (key: string, value: any, index: number) => void; + http: HttpSetup; + actionTypeRegistry: TypeRegistry; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + actionTypes?: ActionType[]; + messageVariables?: string[]; + defaultActionMessage?: string; +} + +``` + +|Property|Description| +|---|---| +|actions|List of actions comes from alert.actions property.| +|defaultActionGroupId|Default action group id to which each new action will belong to.| +|setActionIdByIndex|Function for changing action 'id' by the proper index in alert.actions array.| +|setAlertProperty|Function for changing alert property 'actions'. Used when deleting action from the array to reset it.| +|setActionParamsProperty|Function for changing action key/value property by index in alert.actions array.| +|http|HttpSetup needed for executing API calls.| +|actionTypeRegistry|Registry for action types.| +|toastNotifications|Toast messages.| +|actionTypes|Optional property, which allowes to define a list of available actions specific for a current plugin.| +|actionTypes|Optional property, which allowes to define a list of variables for action 'message' property.| +|defaultActionMessage|Optional property, which allowes to define a message value for action with 'message' property.| + + +AlertsContextProvider value options: +``` +export interface AlertsContextValue { + reloadAlerts?: () => Promise; + http: HttpSetup; + alertTypeRegistry: TypeRegistry; + actionTypeRegistry: TypeRegistry; + uiSettings?: IUiSettingsClient; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + charts?: ChartsPluginSetup; + dataFieldsFormats?: Pick; +} +``` + +|Property|Description| +|---|---| +|reloadAlerts|Optional function, which will be executed if alert was saved sucsessfuly.| +|http|HttpSetup needed for executing API calls.| +|alertTypeRegistry|Registry for alert types.| +|actionTypeRegistry|Registry for action types.| +|uiSettings|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| +|toastNotifications|Toast messages.| +|charts|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| +|dataFieldsFormats|Optional property, which is needed to display visualization of alert type expression. Will be changed after visualization refactoring.| + ## Embed the Create Connector flyout within any Kibana plugin Follow the instructions bellow to embed the Create Connector flyout within any Kibana plugin: @@ -1413,3 +1557,4 @@ export interface ActionsConnectorsContextValue { |capabilities|Property, which is defining action current user usage capabilities like canSave or canDelete.| |toastNotifications|Toast messages.| |reloadConnectors|Optional function, which will be executed if connector was saved sucsessfuly, like reload list of connecotrs.| + diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx index f82b2c8c88ada..6c994051ec980 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx @@ -263,14 +263,14 @@ const EmailActionConnectorFields: React.FunctionComponent 0 && port !== undefined} fullWidth name="port" - value={port} + value={port || ''} data-test-subj="emailPortInput" onChange={e => { editActionConfig('port', parseInt(e.target.value, 10)); }} onBlur={() => { if (!port) { - editActionConfig('port', ''); + editActionConfig('port', 0); } }} /> @@ -380,7 +380,7 @@ const EmailParamsFields: React.FunctionComponent(false); useEffect(() => { - if (defaultMessage && defaultMessage.length > 0) { + if (!message && defaultMessage && defaultMessage.length > 0) { editAction('message', defaultMessage, index); } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx index 8d8045042cfc3..f0ac43c04ee0e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx @@ -75,7 +75,7 @@ export const ServerLogParamsFields: React.FunctionComponent { editAction('level', 'info', index); - if (defaultMessage && defaultMessage.length > 0) { + if (!message && defaultMessage && defaultMessage.length > 0) { editAction('message', defaultMessage, index); } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx index 916715de7ae18..a8ba11faa08dd 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx @@ -143,7 +143,7 @@ const SlackParamsFields: React.FunctionComponent(false); useEffect(() => { - if (defaultMessage && defaultMessage.length > 0) { + if (!message && defaultMessage && defaultMessage.length > 0) { editAction('message', defaultMessage, index); } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx b/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx index a8578acc24636..1944cdeab7552 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/context/alerts_context.tsx @@ -16,11 +16,11 @@ export interface AlertsContextValue> { http: HttpSetup; alertTypeRegistry: TypeRegistry; actionTypeRegistry: TypeRegistry; - uiSettings?: IUiSettingsClient; - toastNotifications?: Pick< + toastNotifications: Pick< ToastsApi, 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' >; + uiSettings?: IUiSettingsClient; charts?: ChartsPluginSetup; dataFieldsFormats?: DataPublicPluginSetup['fieldFormats']; metadata?: MetaData; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx new file mode 100644 index 0000000000000..caed0caefe109 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { ReactWrapper } from 'enzyme'; +import { act } from 'react-dom/test-utils'; +import { actionTypeRegistryMock } from '../../action_type_registry.mock'; +import { ValidationResult, Alert, AlertAction } from '../../../types'; +import { ActionForm } from './action_form'; +const actionTypeRegistry = actionTypeRegistryMock.create(); +describe('action_form', () => { + let deps: any; + const alertType = { + id: 'my-alert-type', + iconClass: 'test', + name: 'test-alert', + validate: (): ValidationResult => { + return { errors: {} }; + }, + alertParamsExpression: () => , + }; + + const actionType = { + id: 'my-action-type', + iconClass: 'test', + selectMessage: 'test', + validateConnector: (): ValidationResult => { + return { errors: {} }; + }, + validateParams: (): ValidationResult => { + const validationResult = { errors: {} }; + return validationResult; + }, + actionConnectorFields: null, + actionParamsFields: null, + }; + + describe('action_form in alert', () => { + let wrapper: ReactWrapper; + + async function setup() { + const mockes = coreMock.createSetup(); + deps = { + toastNotifications: mockes.notifications.toasts, + http: mockes.http, + actionTypeRegistry: actionTypeRegistry as any, + }; + actionTypeRegistry.list.mockReturnValue([actionType]); + actionTypeRegistry.has.mockReturnValue(true); + + const initialAlert = ({ + name: 'test', + params: {}, + consumer: 'alerting', + alertTypeId: alertType.id, + schedule: { + interval: '1m', + }, + actions: [ + { + group: 'default', + id: 'test', + actionTypeId: actionType.id, + params: { + message: '', + }, + }, + ], + tags: [], + muteAll: false, + enabled: false, + mutedInstanceIds: [], + } as unknown) as Alert; + + wrapper = mountWithIntl( + { + initialAlert.actions[index].id = id; + }} + setAlertProperty={(_updatedActions: AlertAction[]) => {}} + setActionParamsProperty={(key: string, value: any, index: number) => + (initialAlert.actions[index] = { ...initialAlert.actions[index], [key]: value }) + } + http={deps!.http} + actionTypeRegistry={deps!.actionTypeRegistry} + defaultActionMessage={'Alert [{{ctx.metadata.name}}] has exceeded the threshold'} + actionTypes={[ + { id: actionType.id, name: 'Test', enabled: true }, + { id: '.index', name: 'Index', enabled: true }, + ]} + toastNotifications={deps!.toastNotifications} + /> + ); + + // Wait for active space to resolve before requesting the component to update + await act(async () => { + await nextTick(); + wrapper.update(); + }); + } + + it('renders available action cards', async () => { + await setup(); + const actionOption = wrapper.find( + `[data-test-subj="${actionType.id}-ActionTypeSelectOption"]` + ); + expect(actionOption.exists()).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx new file mode 100644 index 0000000000000..a43aa22026710 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx @@ -0,0 +1,512 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { Fragment, useState, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiTitle, + EuiSpacer, + EuiFormRow, + EuiComboBox, + EuiKeyPadMenuItem, + EuiAccordion, + EuiButtonIcon, + EuiEmptyPrompt, + EuiButtonEmpty, +} from '@elastic/eui'; +import { HttpSetup, ToastsApi } from 'kibana/public'; +import { loadActionTypes, loadAllActions } from '../../lib/action_connector_api'; +import { + IErrorObject, + ActionTypeModel, + AlertAction, + ActionTypeIndex, + ActionConnector, + ActionType, +} from '../../../types'; +import { SectionLoading } from '../../components/section_loading'; +import { ConnectorAddModal } from './connector_add_modal'; +import { TypeRegistry } from '../../type_registry'; + +interface ActionAccordionFormProps { + actions: AlertAction[]; + defaultActionGroupId: string; + setActionIdByIndex: (id: string, index: number) => void; + setAlertProperty: (actions: AlertAction[]) => void; + setActionParamsProperty: (key: string, value: any, index: number) => void; + http: HttpSetup; + actionTypeRegistry: TypeRegistry; + toastNotifications: Pick< + ToastsApi, + 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' + >; + actionTypes?: ActionType[]; + messageVariables?: string[]; + defaultActionMessage?: string; +} + +interface ActiveActionConnectorState { + actionTypeId: string; + index: number; +} + +export const ActionForm = ({ + actions, + defaultActionGroupId, + setActionIdByIndex, + setAlertProperty, + setActionParamsProperty, + http, + actionTypeRegistry, + actionTypes, + messageVariables, + defaultActionMessage, + toastNotifications, +}: ActionAccordionFormProps) => { + const [addModalVisible, setAddModalVisibility] = useState(false); + const [activeActionItem, setActiveActionItem] = useState( + undefined + ); + const [isAddActionPanelOpen, setIsAddActionPanelOpen] = useState(true); + const [connectors, setConnectors] = useState([]); + const [isLoadingActionTypes, setIsLoadingActionTypes] = useState(false); + const [actionTypesIndex, setActionTypesIndex] = useState(undefined); + + // load action types + useEffect(() => { + (async () => { + try { + setIsLoadingActionTypes(true); + const registeredActionTypes = actionTypes ?? (await loadActionTypes({ http })); + const index: ActionTypeIndex = {}; + for (const actionTypeItem of registeredActionTypes) { + index[actionTypeItem.id] = actionTypeItem; + } + setActionTypesIndex(index); + } catch (e) { + if (toastNotifications) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionTypesMessage', + { defaultMessage: 'Unable to load action types' } + ), + }); + } + } finally { + setIsLoadingActionTypes(false); + } + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + loadConnectors(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function loadConnectors() { + try { + const actionsResponse = await loadAllActions({ http }); + setConnectors(actionsResponse.data); + } catch (e) { + if (toastNotifications) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionsMessage', + { + defaultMessage: 'Unable to load connectors', + } + ), + }); + } + } + } + + const actionsErrors = actions.reduce( + (acc: Record, alertAction: AlertAction) => { + const actionType = actionTypeRegistry.get(alertAction.actionTypeId); + if (!actionType) { + return { ...acc }; + } + const actionValidationErrors = actionType.validateParams(alertAction.params); + return { ...acc, [alertAction.id]: actionValidationErrors }; + }, + {} + ) as Record; + + const getSelectedOptions = (actionItemId: string) => { + const val = connectors.find(connector => connector.id === actionItemId); + if (!val) { + return []; + } + return [ + { + label: val.name, + value: val.name, + id: actionItemId, + }, + ]; + }; + + const getActionTypeForm = ( + actionItem: AlertAction, + actionConnector: ActionConnector, + index: number + ) => { + const optionsList = connectors + .filter( + connectorItem => + connectorItem.actionTypeId === actionItem.actionTypeId && + (connectorItem.id === actionItem.id || + !actions.find( + (existingAction: AlertAction) => + existingAction.id === connectorItem.id && existingAction.group === actionItem.group + )) + ) + .map(({ name, id }) => ({ + label: name, + key: id, + id, + })); + const actionTypeRegistered = actionTypeRegistry.get(actionConnector.actionTypeId); + if (!actionTypeRegistered || actionItem.group !== defaultActionGroupId) return null; + const ParamsFieldsComponent = actionTypeRegistered.actionParamsFields; + const actionParamsErrors: { errors: IErrorObject } = + Object.keys(actionsErrors).length > 0 ? actionsErrors[actionItem.id] : { errors: {} }; + + return ( + + + + + + +
+ +
+
+
+ + } + extraAction={ + { + const updatedActions = actions.filter( + (item: AlertAction) => item.id !== actionItem.id + ); + setAlertProperty(updatedActions); + setIsAddActionPanelOpen( + updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === 0 + ); + setActiveActionItem(undefined); + }} + /> + } + paddingSize="l" + > + + + + } + labelAppend={ + { + setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); + setAddModalVisibility(true); + }} + > + + + } + > + { + setActionIdByIndex(selectedOptions[0].id ?? '', index); + }} + isClearable={false} + /> + + + + + {ParamsFieldsComponent ? ( + + ) : null} +
+ ); + }; + + const getAddConnectorsForm = (actionItem: AlertAction, index: number) => { + const actionTypeName = actionTypesIndex + ? actionTypesIndex[actionItem.actionTypeId].name + : actionItem.actionTypeId; + const actionTypeRegistered = actionTypeRegistry.get(actionItem.actionTypeId); + if (!actionTypeRegistered || actionItem.group !== defaultActionGroupId) return null; + return ( + + + + + + +
+ +
+
+
+ + } + extraAction={ + { + const updatedActions = actions.filter( + (item: AlertAction) => item.id !== actionItem.id + ); + setAlertProperty(updatedActions); + setIsAddActionPanelOpen( + updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === 0 + ); + setActiveActionItem(undefined); + }} + /> + } + paddingSize="l" + > + + } + actions={[ + { + setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); + setAddModalVisibility(true); + }} + > + + , + ]} + /> +
+ ); + }; + + function addActionType(actionTypeModel: ActionTypeModel) { + if (!defaultActionGroupId) { + toastNotifications!.addDanger({ + title: i18n.translate('xpack.triggersActionsUI.sections.alertForm.unableToAddAction', { + defaultMessage: 'Unable to add action, because default action group is not defined', + }), + }); + return; + } + setIsAddActionPanelOpen(false); + const actionTypeConnectors = connectors.filter( + field => field.actionTypeId === actionTypeModel.id + ); + let freeConnectors; + if (actionTypeConnectors.length > 0) { + // Should we allow adding multiple actions to the same connector under the alert? + freeConnectors = actionTypeConnectors.filter( + (actionConnector: ActionConnector) => + !actions.find((actionItem: AlertAction) => actionItem.id === actionConnector.id) + ); + if (freeConnectors.length > 0) { + actions.push({ + id: '', + actionTypeId: actionTypeModel.id, + group: defaultActionGroupId, + params: {}, + }); + setActionIdByIndex(freeConnectors[0].id, actions.length - 1); + } + } + if (actionTypeConnectors.length === 0 || !freeConnectors || freeConnectors.length === 0) { + // if no connectors exists or all connectors is already assigned an action under current alert + // set actionType as id to be able to create new connector within the alert form + actions.push({ + id: '', + actionTypeId: actionTypeModel.id, + group: defaultActionGroupId, + params: {}, + }); + setActionIdByIndex(actions.length.toString(), actions.length - 1); + } + } + + const actionTypeNodes = actionTypesIndex + ? actionTypeRegistry.list().map(function(item, index) { + return actionTypesIndex[item.id] ? ( + addActionType(item)} + > + + + ) : null; + }) + : null; + + return ( + + {actions.map((actionItem: AlertAction, index: number) => { + const actionConnector = connectors.find(field => field.id === actionItem.id); + // connectors doesn't exists + if (!actionConnector) { + return getAddConnectorsForm(actionItem, index); + } + return getActionTypeForm(actionItem, actionConnector, index); + })} + + {isAddActionPanelOpen === false ? ( + setIsAddActionPanelOpen(true)} + > + + + ) : null} + {isAddActionPanelOpen ? ( + + +
+ +
+
+ + + {isLoadingActionTypes ? ( + + + + ) : ( + actionTypeNodes + )} + +
+ ) : null} + {actionTypesIndex && activeActionItem ? ( + { + connectors.push(savedAction); + setActionIdByIndex(savedAction.id, activeActionItem.index); + }} + actionTypeRegistry={actionTypeRegistry} + http={http} + toastNotifications={toastNotifications} + /> + ) : null} +
+ ); +}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx index 94c2b823e8bcf..31d801bb340f3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.test.tsx @@ -68,7 +68,6 @@ describe('connector_add_modal', () => { actionType={actionType} http={deps.http} actionTypeRegistry={deps.actionTypeRegistry} - alertTypeRegistry={{} as any} toastNotifications={deps.toastNotifications} /> ) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx index 6486292725660..1cc26f39990ff 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_add_modal.tsx @@ -19,13 +19,7 @@ import { EuiOverlayMask } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { HttpSetup, ToastsApi } from 'kibana/public'; import { ActionConnectorForm, validateBaseProperties } from './action_connector_form'; -import { - ActionType, - ActionConnector, - IErrorObject, - AlertTypeModel, - ActionTypeModel, -} from '../../../types'; +import { ActionType, ActionConnector, IErrorObject, ActionTypeModel } from '../../../types'; import { connectorReducer } from './connector_reducer'; import { createActionConnector } from '../../lib/action_connector_api'; import { TypeRegistry } from '../../type_registry'; @@ -36,7 +30,6 @@ interface ConnectorAddModalProps { setAddModalVisibility: React.Dispatch>; postSaveEventHandler?: (savedAction: ActionConnector) => void; http: HttpSetup; - alertTypeRegistry: TypeRegistry; actionTypeRegistry: TypeRegistry; toastNotifications?: Pick< ToastsApi, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts index aac7a514948d1..52ee1efbdaf9f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts @@ -6,3 +6,4 @@ export { ConnectorAddFlyout } from './connector_add_flyout'; export { ConnectorEditFlyout } from './connector_edit_flyout'; +export { ActionForm } from './action_form'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx index bd18c99dca8fb..6119b407a6590 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx @@ -197,13 +197,5 @@ describe('alert_form', () => { const alertTypeSelectOptions = wrapper.find('[data-test-subj="selectedAlertTypeTitle"]'); expect(alertTypeSelectOptions.exists()).toBeTruthy(); }); - - it('renders registered action types', async () => { - await setup(); - const actionTypeSelectOptions = wrapper.find( - '[data-test-subj="my-action-type-ActionTypeSelectOption"]' - ); - expect(actionTypeSelectOptions.exists()).toBeTruthy(); - }); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx index b875fae75c7df..190f14f0428d8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx @@ -7,7 +7,6 @@ import React, { Fragment, useState, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { - EuiButton, EuiFlexGroup, EuiFlexItem, EuiIcon, @@ -22,29 +21,15 @@ import { EuiFieldNumber, EuiSelect, EuiIconTip, - EuiAccordion, EuiButtonIcon, - EuiEmptyPrompt, - EuiButtonEmpty, EuiHorizontalRule, } from '@elastic/eui'; import { loadAlertTypes } from '../../lib/alert_api'; -import { loadActionTypes, loadAllActions } from '../../lib/action_connector_api'; import { AlertReducerAction } from './alert_reducer'; -import { - AlertTypeModel, - Alert, - IErrorObject, - ActionTypeModel, - AlertAction, - ActionTypeIndex, - ActionConnector, - AlertTypeIndex, -} from '../../../types'; -import { SectionLoading } from '../../components/section_loading'; -import { ConnectorAddModal } from '../action_connector_form/connector_add_modal'; +import { AlertTypeModel, Alert, IErrorObject, AlertAction, AlertTypeIndex } from '../../../types'; import { getTimeOptions } from '../../../common/lib/get_time_options'; import { useAlertsContext } from '../../context/alerts_context'; +import { ActionForm } from '../action_connector_form/action_form'; export function validateBaseProperties(alertObject: Alert) { const validationResult = { errors: {} }; @@ -89,11 +74,6 @@ interface AlertFormProps { canChangeTrigger?: boolean; // to hide Change trigger button } -interface ActiveActionConnectorState { - actionTypeId: string; - index: number; -} - export const AlertForm = ({ alert, canChangeTrigger = true, @@ -108,9 +88,6 @@ export const AlertForm = ({ alert.alertTypeId ? alertTypeRegistry.get(alert.alertTypeId) : null ); - const [addModalVisible, setAddModalVisibility] = useState(false); - const [isLoadingActionTypes, setIsLoadingActionTypes] = useState(false); - const [actionTypesIndex, setActionTypesIndex] = useState(undefined); const [alertTypesIndex, setAlertTypesIndex] = useState(undefined); const [alertInterval, setAlertInterval] = useState( alert.schedule.interval ? parseInt(alert.schedule.interval.replace(/^[A-Za-z]+$/, ''), 0) : 1 @@ -124,39 +101,7 @@ export const AlertForm = ({ const [alertThrottleUnit, setAlertThrottleUnit] = useState( alert.throttle ? alert.throttle.replace((alertThrottle ?? '').toString(), '') : 'm' ); - const [isAddActionPanelOpen, setIsAddActionPanelOpen] = useState(true); - const [connectors, setConnectors] = useState([]); const [defaultActionGroupId, setDefaultActionGroupId] = useState(undefined); - const [activeActionItem, setActiveActionItem] = useState( - undefined - ); - - // load action types - useEffect(() => { - (async () => { - try { - setIsLoadingActionTypes(true); - const actionTypes = await loadActionTypes({ http }); - const index: ActionTypeIndex = {}; - for (const actionTypeItem of actionTypes) { - index[actionTypeItem.id] = actionTypeItem; - } - setActionTypesIndex(index); - } catch (e) { - if (toastNotifications) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionTypesMessage', - { defaultMessage: 'Unable to load action types' } - ), - }); - } - } finally { - setIsLoadingActionTypes(false); - } - })(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); // load alert types useEffect(() => { @@ -172,24 +117,17 @@ export const AlertForm = ({ } setAlertTypesIndex(index); } catch (e) { - if (toastNotifications) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.unableToLoadAlertTypesMessage', - { defaultMessage: 'Unable to load alert types' } - ), - }); - } + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadAlertTypesMessage', + { defaultMessage: 'Unable to load alert types' } + ), + }); } })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - useEffect(() => { - loadConnectors(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const setAlertProperty = (key: string, value: any) => { dispatch({ command: { type: 'setProperty' }, payload: { key, value } }); }; @@ -202,93 +140,20 @@ export const AlertForm = ({ dispatch({ command: { type: 'setScheduleProperty' }, payload: { key, value } }); }; - const setActionParamsProperty = (key: string, value: any, index: number) => { - dispatch({ command: { type: 'setAlertActionParams' }, payload: { key, value, index } }); - }; - const setActionProperty = (key: string, value: any, index: number) => { dispatch({ command: { type: 'setAlertActionProperty' }, payload: { key, value, index } }); }; - const tagsOptions = alert.tags ? alert.tags.map((label: string) => ({ label })) : []; - - async function loadConnectors() { - try { - const actionsResponse = await loadAllActions({ http }); - setConnectors(actionsResponse.data); - } catch (e) { - if (toastNotifications) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionsMessage', - { - defaultMessage: 'Unable to load connectors', - } - ), - }); - } - } - } + const setActionParamsProperty = (key: string, value: any, index: number) => { + dispatch({ command: { type: 'setAlertActionParams' }, payload: { key, value, index } }); + }; - const actionsErrors = alert.actions.reduce( - (acc: Record, alertAction: AlertAction) => { - const actionType = actionTypeRegistry.get(alertAction.actionTypeId); - if (!actionType) { - return { ...acc }; - } - const actionValidationErrors = actionType.validateParams(alertAction.params); - return { ...acc, [alertAction.id]: actionValidationErrors }; - }, - {} - ); + const tagsOptions = alert.tags ? alert.tags.map((label: string) => ({ label })) : []; const AlertParamsExpressionComponent = alertTypeModel ? alertTypeModel.alertParamsExpression : null; - function addActionType(actionTypeModel: ActionTypeModel) { - if (!defaultActionGroupId) { - toastNotifications!.addDanger({ - title: i18n.translate('xpack.triggersActionsUI.sections.alertForm.unableToAddAction', { - defaultMessage: 'Unable to add action, because default action group is not defined', - }), - }); - return; - } - setIsAddActionPanelOpen(false); - const actionTypeConnectors = connectors.filter( - field => field.actionTypeId === actionTypeModel.id - ); - let freeConnectors; - if (actionTypeConnectors.length > 0) { - // Should we allow adding multiple actions to the same connector under the alert? - freeConnectors = actionTypeConnectors.filter( - (actionConnector: ActionConnector) => - !alert.actions.find((actionItem: AlertAction) => actionItem.id === actionConnector.id) - ); - if (freeConnectors.length > 0) { - alert.actions.push({ - id: '', - actionTypeId: actionTypeModel.id, - group: defaultActionGroupId, - params: {}, - }); - setActionProperty('id', freeConnectors[0].id, alert.actions.length - 1); - } - } - if (actionTypeConnectors.length === 0 || !freeConnectors || freeConnectors.length === 0) { - // if no connectors exists or all connectors is already assigned an action under current alert - // set actionType as id to be able to create new connector within the alert form - alert.actions.push({ - id: '', - actionTypeId: actionTypeModel.id, - group: defaultActionGroupId, - params: {}, - }); - setActionProperty('id', alert.actions.length, alert.actions.length - 1); - } - } - const alertTypeNodes = alertTypeRegistry.list().map(function(item, index) { return ( addActionType(item)} - > - - - ); - }); - - const getSelectedOptions = (actionItemId: string) => { - const val = connectors.find(connector => connector.id === actionItemId); - if (!val) { - return []; - } - return [ - { - label: val.name, - value: val.name, - id: actionItemId, - }, - ]; - }; - - const getActionTypeForm = ( - actionItem: AlertAction, - actionConnector: ActionConnector, - index: number - ) => { - const optionsList = connectors - .filter( - connectorItem => - connectorItem.actionTypeId === actionItem.actionTypeId && - (connectorItem.id === actionItem.id || - !alert.actions.find( - (existingAction: AlertAction) => - existingAction.id === connectorItem.id && existingAction.group === actionItem.group - )) - ) - .map(({ name, id }) => ({ - label: name, - key: id, - id, - })); - const actionTypeRegisterd = actionTypeRegistry.get(actionConnector.actionTypeId); - if (!actionTypeRegisterd || actionItem.group !== defaultActionGroupId) return null; - const ParamsFieldsComponent = actionTypeRegisterd.actionParamsFields; - const actionParamsErrors: { errors: IErrorObject } = - Object.keys(actionsErrors).length > 0 ? actionsErrors[actionItem.id] : { errors: {} }; - - return ( - - - - - - -
- -
-
-
- - } - extraAction={ - { - const updatedActions = alert.actions.filter( - (item: AlertAction) => item.id !== actionItem.id - ); - setAlertProperty('actions', updatedActions); - setIsAddActionPanelOpen( - updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === 0 - ); - setActiveActionItem(undefined); - }} - /> - } - paddingSize="l" - > - - - - } - labelAppend={ - { - setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); - setAddModalVisibility(true); - }} - > - - - } - > - { - setActionProperty('id', selectedOptions[0].id, index); - }} - isClearable={false} - /> - - - - - {ParamsFieldsComponent ? ( - - ) : null} -
- ); - }; - - const getAddConnectorsForm = (actionItem: AlertAction, index: number) => { - const actionTypeName = actionTypesIndex - ? actionTypesIndex[actionItem.actionTypeId].name - : actionItem.actionTypeId; - const actionTypeRegisterd = actionTypeRegistry.get(actionItem.actionTypeId); - if (!actionTypeRegisterd || actionItem.group !== defaultActionGroupId) return null; - return ( - - - - - - -
- -
-
-
- - } - extraAction={ - { - const updatedActions = alert.actions.filter( - (item: AlertAction) => item.id !== actionItem.id - ); - setAlertProperty('actions', updatedActions); - setIsAddActionPanelOpen( - updatedActions.filter((item: AlertAction) => item.id !== actionItem.id).length === 0 - ); - setActiveActionItem(undefined); - }} - /> - } - paddingSize="l" - > - - } - actions={[ - { - setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); - setAddModalVisibility(true); - }} - > - - , - ]} - /> -
- ); - }; - - const selectedGroupActions = ( - - {alert.actions.map((actionItem: AlertAction, index: number) => { - const actionConnector = connectors.find(field => field.id === actionItem.id); - // connectors doesn't exists - if (!actionConnector) { - return getAddConnectorsForm(actionItem, index); - } - return getActionTypeForm(actionItem, actionConnector, index); - })} - - {isAddActionPanelOpen === false ? ( - setIsAddActionPanelOpen(true)} - > - - - ) : null} - - ); - const alertTypeDetails = ( @@ -639,31 +217,27 @@ export const AlertForm = ({ /> ) : null} - {selectedGroupActions} - {isAddActionPanelOpen ? ( - - -
- -
-
- - - {isLoadingActionTypes ? ( - - - - ) : ( - actionTypeNodes - )} - -
+ {defaultActionGroupId ? ( + setActionProperty('id', id, index)} + setAlertProperty={(updatedActions: AlertAction[]) => + setAlertProperty('actions', updatedActions) + } + setActionParamsProperty={(key: string, value: any, index: number) => + setActionParamsProperty(key, value, index) + } + http={http} + actionTypeRegistry={actionTypeRegistry} + defaultActionMessage={alertTypeModel?.defaultActionMessage} + toastNotifications={toastNotifications} + /> ) : null}
); @@ -862,22 +436,6 @@ export const AlertForm = ({
)} - {actionTypesIndex && activeActionItem ? ( - { - connectors.push(savedAction); - setActionProperty('id', savedAction.id, activeActionItem.index); - }} - actionTypeRegistry={actionTypeRegistry} - alertTypeRegistry={alertTypeRegistry} - http={http} - toastNotifications={toastNotifications} - /> - ) : null} ); }; diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 74af4a77d0ef0..fbffd5c2f999d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -10,6 +10,8 @@ import { Plugin } from './plugin'; export { AlertsContextProvider } from './application/context/alerts_context'; export { ActionsConnectorsContextProvider } from './application/context/actions_connectors_context'; export { AlertAdd } from './application/sections/alert_form'; +export { ActionForm } from './application/sections/action_connector_form'; +export { AlertAction, Alert } from './types'; export { ConnectorAddFlyout, ConnectorEditFlyout, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/index.ts index c0f56c55ba850..50cc80011777e 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/index.ts @@ -18,7 +18,7 @@ export default function alertingApiIntegrationTests({ const esArchiver = getService('esArchiver'); describe('alerting api integration security and spaces enabled', function() { - this.tags('ciGroup3'); + this.tags('ciGroup5'); before(async () => { for (const space of Spaces) { diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/index.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/index.ts index b118a48fd642c..10397a571b0ef 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/index.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/index.ts @@ -16,7 +16,7 @@ export default function alertingApiIntegrationTests({ const esArchiver = getService('esArchiver'); describe('alerting api integration spaces only', function() { - this.tags('ciGroup3'); + this.tags('ciGroup9'); before(async () => { for (const space of Object.values(Spaces)) { From 578137fb204fa70fe1a8251abd1dea442949a538 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 5 Mar 2020 19:58:22 -0700 Subject: [PATCH 20/25] [Maps] top term percentage field property (#59386) * [Maps] top term percentage property * populate percentage in feature properties * TS work * clean up TS * fix all type errors * unit test for esAggFieldsFactory * clean up * i18n cleanup * do not show decimal place for perentage * fix jest expects * fix eslint errors * tslint errors * handle empty top bucket aggregation Co-authored-by: Elastic Machine --- .../legacy/plugins/maps/common/constants.ts | 10 +- .../plugins/maps/common/descriptor_types.d.ts | 4 +- .../maps/public/layers/fields/es_agg_field.js | 96 ---------- .../public/layers/fields/es_agg_field.test.js | 28 --- .../public/layers/fields/es_agg_field.test.ts | 80 +++++++++ .../maps/public/layers/fields/es_agg_field.ts | 169 ++++++++++++++++++ .../maps/public/layers/fields/field.ts | 11 +- .../fields/top_term_percentage_field.ts | 70 ++++++++ .../public/layers/sources/es_agg_source.d.ts | 19 ++ .../public/layers/sources/es_agg_source.js | 50 ++---- .../convert_to_geojson.test.ts | 4 + .../es_geo_grid_source.d.ts | 12 ++ .../es_geo_grid_source/es_geo_grid_source.js | 6 +- .../convert_to_lines.test.ts | 1 + .../maps/public/layers/sources/es_source.d.ts | 10 +- .../public/layers/sources/es_term_source.js | 32 +--- .../public/layers/sources/vector_source.js | 4 +- .../properties/dynamic_style_property.js | 5 +- .../public/layers/util/es_agg_utils.test.ts | 19 +- .../maps/public/layers/util/es_agg_utils.ts | 13 ++ ...ic_countable.js => is_metric_countable.ts} | 2 +- .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 23 files changed, 439 insertions(+), 212 deletions(-) delete mode 100644 x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.js delete mode 100644 x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.js create mode 100644 x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.ts create mode 100644 x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.ts create mode 100644 x-pack/legacy/plugins/maps/public/layers/fields/top_term_percentage_field.ts create mode 100644 x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.d.ts create mode 100644 x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts rename x-pack/legacy/plugins/maps/public/layers/util/{is_metric_countable.js => is_metric_countable.ts} (85%) diff --git a/x-pack/legacy/plugins/maps/common/constants.ts b/x-pack/legacy/plugins/maps/common/constants.ts index 4f1b3223967a5..53289fbbc9005 100644 --- a/x-pack/legacy/plugins/maps/common/constants.ts +++ b/x-pack/legacy/plugins/maps/common/constants.ts @@ -55,10 +55,10 @@ export const ES_SEARCH = 'ES_SEARCH'; export const ES_PEW_PEW = 'ES_PEW_PEW'; export const EMS_XYZ = 'EMS_XYZ'; // identifies a custom TMS source. Name is a little unfortunate. -export const FIELD_ORIGIN = { - SOURCE: 'source', - JOIN: 'join', -}; +export enum FIELD_ORIGIN { + SOURCE = 'source', + JOIN = 'join', +} export const SOURCE_DATA_ID_ORIGIN = 'source'; export const META_ID_ORIGIN_SUFFIX = 'meta'; @@ -139,6 +139,8 @@ export enum GRID_RESOLUTION { MOST_FINE = 'MOST_FINE', } +export const TOP_TERM_PERCENTAGE_SUFFIX = '__percentage'; + export const COUNT_PROP_LABEL = i18n.translate('xpack.maps.aggs.defaultCountLabel', { defaultMessage: 'count', }); diff --git a/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts b/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts index f342260c3e7a4..f03f828200bbd 100644 --- a/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts +++ b/x-pack/legacy/plugins/maps/common/descriptor_types.d.ts @@ -40,8 +40,8 @@ export type AbstractESAggDescriptor = AbstractESSourceDescriptor & { }; export type ESGeoGridSourceDescriptor = AbstractESAggDescriptor & { - requestType: RENDER_AS; - resolution: GRID_RESOLUTION; + requestType?: RENDER_AS; + resolution?: GRID_RESOLUTION; }; export type ESSearchSourceDescriptor = AbstractESSourceDescriptor & { diff --git a/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.js b/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.js deleted file mode 100644 index 27ab8fc5bfb3a..0000000000000 --- a/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.js +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AbstractField } from './field'; -import { AGG_TYPE } from '../../../common/constants'; -import { isMetricCountable } from '../util/is_metric_countable'; -import { ESAggMetricTooltipProperty } from '../tooltips/es_aggmetric_tooltip_property'; -import { getField, addFieldToDSL } from '../util/es_agg_utils'; - -export class ESAggMetricField extends AbstractField { - static type = 'ES_AGG'; - - constructor({ label, source, aggType, esDocField, origin }) { - super({ source, origin }); - this._label = label; - this._aggType = aggType; - this._esDocField = esDocField; - } - - getName() { - return this._source.getAggKey(this.getAggType(), this.getRootName()); - } - - getRootName() { - return this._getESDocFieldName(); - } - - async getLabel() { - return this._label - ? this._label - : this._source.getAggLabel(this.getAggType(), this.getRootName()); - } - - getAggType() { - return this._aggType; - } - - isValid() { - return this.getAggType() === AGG_TYPE.COUNT ? true : !!this._esDocField; - } - - async getDataType() { - return this.getAggType() === AGG_TYPE.TERMS ? 'string' : 'number'; - } - - _getESDocFieldName() { - return this._esDocField ? this._esDocField.getName() : ''; - } - - getRequestDescription() { - return this.getAggType() !== AGG_TYPE.COUNT - ? `${this.getAggType()} ${this.getRootName()}` - : AGG_TYPE.COUNT; - } - - async createTooltipProperty(value) { - const indexPattern = await this._source.getIndexPattern(); - return new ESAggMetricTooltipProperty( - this.getName(), - await this.getLabel(), - value, - indexPattern, - this - ); - } - - getValueAggDsl(indexPattern) { - const field = getField(indexPattern, this.getRootName()); - const aggType = this.getAggType(); - const aggBody = aggType === AGG_TYPE.TERMS ? { size: 1, shard_size: 1 } : {}; - return { - [aggType]: addFieldToDSL(aggBody, field), - }; - } - - supportsFieldMeta() { - // count and sum aggregations are not within field bounds so they do not support field meta. - return !isMetricCountable(this.getAggType()); - } - - canValueBeFormatted() { - // Do not use field formatters for counting metrics - return ![AGG_TYPE.COUNT, AGG_TYPE.UNIQUE_COUNT].includes(this.getAggType()); - } - - async getOrdinalFieldMetaRequest(config) { - return this._esDocField.getOrdinalFieldMetaRequest(config); - } - - async getCategoricalFieldMetaRequest() { - return this._esDocField.getCategoricalFieldMetaRequest(); - } -} diff --git a/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.js b/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.js deleted file mode 100644 index aeeffd63607ee..0000000000000 --- a/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { ESAggMetricField } from './es_agg_field'; -import { AGG_TYPE } from '../../../common/constants'; - -describe('supportsFieldMeta', () => { - test('Non-counting aggregations should support field meta', () => { - const avgMetric = new ESAggMetricField({ aggType: AGG_TYPE.AVG }); - expect(avgMetric.supportsFieldMeta()).toBe(true); - const maxMetric = new ESAggMetricField({ aggType: AGG_TYPE.MAX }); - expect(maxMetric.supportsFieldMeta()).toBe(true); - const minMetric = new ESAggMetricField({ aggType: AGG_TYPE.MIN }); - expect(minMetric.supportsFieldMeta()).toBe(true); - }); - - test('Counting aggregations should not support field meta', () => { - const countMetric = new ESAggMetricField({ aggType: AGG_TYPE.COUNT }); - expect(countMetric.supportsFieldMeta()).toBe(false); - const sumMetric = new ESAggMetricField({ aggType: AGG_TYPE.SUM }); - expect(sumMetric.supportsFieldMeta()).toBe(false); - const uniqueCountMetric = new ESAggMetricField({ aggType: AGG_TYPE.UNIQUE_COUNT }); - expect(uniqueCountMetric.supportsFieldMeta()).toBe(false); - }); -}); diff --git a/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.ts b/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.ts new file mode 100644 index 0000000000000..7a65b5f9f6b46 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.test.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ESAggField, esAggFieldsFactory } from './es_agg_field'; +import { AGG_TYPE, FIELD_ORIGIN } from '../../../common/constants'; +import { IESAggSource } from '../sources/es_agg_source'; +import { IIndexPattern } from 'src/plugins/data/public'; + +const mockIndexPattern = { + title: 'wildIndex', + fields: [ + { + name: 'foo*', + }, + ], +} as IIndexPattern; + +const mockEsAggSource = { + getAggKey: (aggType: AGG_TYPE, fieldName: string) => { + return 'agg_key'; + }, + getAggLabel: (aggType: AGG_TYPE, fieldName: string) => { + return 'agg_label'; + }, + getIndexPattern: async () => { + return mockIndexPattern; + }, +} as IESAggSource; + +const defaultParams = { + label: 'my agg field', + source: mockEsAggSource, + aggType: AGG_TYPE.COUNT, + origin: FIELD_ORIGIN.SOURCE, +}; + +describe('supportsFieldMeta', () => { + test('Non-counting aggregations should support field meta', () => { + const avgMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.AVG }); + expect(avgMetric.supportsFieldMeta()).toBe(true); + const maxMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.MAX }); + expect(maxMetric.supportsFieldMeta()).toBe(true); + const minMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.MIN }); + expect(minMetric.supportsFieldMeta()).toBe(true); + const termsMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.TERMS }); + expect(termsMetric.supportsFieldMeta()).toBe(true); + }); + + test('Counting aggregations should not support field meta', () => { + const countMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.COUNT }); + expect(countMetric.supportsFieldMeta()).toBe(false); + const sumMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.SUM }); + expect(sumMetric.supportsFieldMeta()).toBe(false); + const uniqueCountMetric = new ESAggField({ ...defaultParams, aggType: AGG_TYPE.UNIQUE_COUNT }); + expect(uniqueCountMetric.supportsFieldMeta()).toBe(false); + }); +}); + +describe('esAggFieldsFactory', () => { + test('Should only create top terms field when term field is not provided', () => { + const fields = esAggFieldsFactory( + { type: AGG_TYPE.TERMS }, + mockEsAggSource, + FIELD_ORIGIN.SOURCE + ); + expect(fields.length).toBe(1); + }); + + test('Should create top terms and top terms percentage fields', () => { + const fields = esAggFieldsFactory( + { type: AGG_TYPE.TERMS, field: 'myField' }, + mockEsAggSource, + FIELD_ORIGIN.SOURCE + ); + expect(fields.length).toBe(2); + }); +}); diff --git a/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.ts b/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.ts new file mode 100644 index 0000000000000..9f08200442fea --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/layers/fields/es_agg_field.ts @@ -0,0 +1,169 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IndexPattern } from 'src/plugins/data/public'; +import { IField } from './field'; +import { AggDescriptor } from '../../../common/descriptor_types'; +import { IESAggSource } from '../sources/es_agg_source'; +import { IVectorSource } from '../sources/vector_source'; +// @ts-ignore +import { ESDocField } from './es_doc_field'; +import { AGG_TYPE, FIELD_ORIGIN } from '../../../common/constants'; +import { isMetricCountable } from '../util/is_metric_countable'; +// @ts-ignore +import { ESAggMetricTooltipProperty } from '../tooltips/es_aggmetric_tooltip_property'; +import { getField, addFieldToDSL } from '../util/es_agg_utils'; +import { TopTermPercentageField } from './top_term_percentage_field'; + +export interface IESAggField extends IField { + getValueAggDsl(indexPattern: IndexPattern): unknown | null; + getBucketCount(): number; +} + +export class ESAggField implements IESAggField { + static type = 'ES_AGG'; + + private _source: IESAggSource; + private _origin: FIELD_ORIGIN; + private _label?: string; + private _aggType: AGG_TYPE; + private _esDocField?: unknown; + + constructor({ + label, + source, + aggType, + esDocField, + origin, + }: { + label?: string; + source: IESAggSource; + aggType: AGG_TYPE; + esDocField?: unknown; + origin: FIELD_ORIGIN; + }) { + this._source = source; + this._origin = origin; + this._label = label; + this._aggType = aggType; + this._esDocField = esDocField; + } + + getSource(): IVectorSource { + return this._source; + } + + getOrigin(): FIELD_ORIGIN { + return this._origin; + } + + getName(): string { + return this._source.getAggKey(this.getAggType(), this.getRootName()); + } + + getRootName(): string { + return this._getESDocFieldName(); + } + + async getLabel(): Promise { + return this._label + ? this._label + : this._source.getAggLabel(this.getAggType(), this.getRootName()); + } + + getAggType(): AGG_TYPE { + return this._aggType; + } + + isValid(): boolean { + return this.getAggType() === AGG_TYPE.COUNT ? true : !!this._esDocField; + } + + async getDataType(): Promise { + return this.getAggType() === AGG_TYPE.TERMS ? 'string' : 'number'; + } + + _getESDocFieldName(): string { + // TODO remove when esDocField is typed + // @ts-ignore + return this._esDocField ? this._esDocField.getName() : ''; + } + + async createTooltipProperty(value: number | string): Promise { + const indexPattern = await this._source.getIndexPattern(); + return new ESAggMetricTooltipProperty( + this.getName(), + await this.getLabel(), + value, + indexPattern, + this + ); + } + + getValueAggDsl(indexPattern: IndexPattern): unknown | null { + if (this.getAggType() === AGG_TYPE.COUNT) { + return null; + } + + const field = getField(indexPattern, this.getRootName()); + const aggType = this.getAggType(); + const aggBody = aggType === AGG_TYPE.TERMS ? { size: 1, shard_size: 1 } : {}; + return { + [aggType]: addFieldToDSL(aggBody, field), + }; + } + + getBucketCount(): number { + // terms aggregation increases the overall number of buckets per split bucket + return this.getAggType() === AGG_TYPE.TERMS ? 1 : 0; + } + + supportsFieldMeta(): boolean { + // count and sum aggregations are not within field bounds so they do not support field meta. + return !isMetricCountable(this.getAggType()); + } + + canValueBeFormatted(): boolean { + // Do not use field formatters for counting metrics + return ![AGG_TYPE.COUNT, AGG_TYPE.UNIQUE_COUNT].includes(this.getAggType()); + } + + async getOrdinalFieldMetaRequest(): Promise { + // TODO remove when esDocField is typed + // @ts-ignore + return this._esDocField.getOrdinalFieldMetaRequest(); + } + + async getCategoricalFieldMetaRequest(): Promise { + // TODO remove when esDocField is typed + // @ts-ignore + return this._esDocField.getCategoricalFieldMetaRequest(); + } +} + +export function esAggFieldsFactory( + aggDescriptor: AggDescriptor, + source: IESAggSource, + origin: FIELD_ORIGIN +): IESAggField[] { + const aggField = new ESAggField({ + label: aggDescriptor.label, + esDocField: aggDescriptor.field + ? new ESDocField({ fieldName: aggDescriptor.field, source }) + : null, + aggType: aggDescriptor.type, + source, + origin, + }); + + const aggFields: IESAggField[] = [aggField]; + + if (aggDescriptor.field && aggDescriptor.type === AGG_TYPE.TERMS) { + aggFields.push(new TopTermPercentageField(aggField)); + } + + return aggFields; +} diff --git a/x-pack/legacy/plugins/maps/public/layers/fields/field.ts b/x-pack/legacy/plugins/maps/public/layers/fields/field.ts index 57a916e93ffe0..f7c27fec1c6c7 100644 --- a/x-pack/legacy/plugins/maps/public/layers/fields/field.ts +++ b/x-pack/legacy/plugins/maps/public/layers/fields/field.ts @@ -13,12 +13,15 @@ export interface IField { canValueBeFormatted(): boolean; getLabel(): Promise; getDataType(): Promise; + getSource(): IVectorSource; + getOrigin(): FIELD_ORIGIN; + isValid(): boolean; } export class AbstractField implements IField { private _fieldName: string; private _source: IVectorSource; - private _origin: string; + private _origin: FIELD_ORIGIN; constructor({ fieldName, @@ -27,7 +30,7 @@ export class AbstractField implements IField { }: { fieldName: string; source: IVectorSource; - origin: string; + origin: FIELD_ORIGIN; }) { this._fieldName = fieldName; this._source = source; @@ -66,7 +69,7 @@ export class AbstractField implements IField { throw new Error('must implement Field#createTooltipProperty'); } - getOrigin(): string { + getOrigin(): FIELD_ORIGIN { return this._origin; } @@ -74,7 +77,7 @@ export class AbstractField implements IField { return false; } - async getOrdinalFieldMetaRequest(/* config */): Promise { + async getOrdinalFieldMetaRequest(): Promise { return null; } diff --git a/x-pack/legacy/plugins/maps/public/layers/fields/top_term_percentage_field.ts b/x-pack/legacy/plugins/maps/public/layers/fields/top_term_percentage_field.ts new file mode 100644 index 0000000000000..cadf325652370 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/layers/fields/top_term_percentage_field.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IESAggField } from './es_agg_field'; +import { IVectorSource } from '../sources/vector_source'; +// @ts-ignore +import { TooltipProperty } from '../tooltips/tooltip_property'; +import { TOP_TERM_PERCENTAGE_SUFFIX } from '../../../common/constants'; +import { FIELD_ORIGIN } from '../../../common/constants'; + +export class TopTermPercentageField implements IESAggField { + private _topTermAggField: IESAggField; + + constructor(topTermAggField: IESAggField) { + this._topTermAggField = topTermAggField; + } + + getSource(): IVectorSource { + return this._topTermAggField.getSource(); + } + + getOrigin(): FIELD_ORIGIN { + return this._topTermAggField.getOrigin(); + } + + getName(): string { + return `${this._topTermAggField.getName()}${TOP_TERM_PERCENTAGE_SUFFIX}`; + } + + getRootName(): string { + // top term percentage is a derived value so it has no root field + return ''; + } + + async getLabel(): Promise { + const baseLabel = await this._topTermAggField.getLabel(); + return `${baseLabel}%`; + } + + isValid(): boolean { + return this._topTermAggField.isValid(); + } + + async getDataType(): Promise { + return 'number'; + } + + async createTooltipProperty(value: unknown): Promise { + return new TooltipProperty(this.getName(), await this.getLabel(), value); + } + + getValueAggDsl(): null { + return null; + } + + getBucketCount(): number { + return 0; + } + + supportsFieldMeta(): boolean { + return false; + } + + canValueBeFormatted(): boolean { + return false; + } +} diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.d.ts b/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.d.ts new file mode 100644 index 0000000000000..a91bb4a8bb1a7 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.d.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IESSource } from './es_source'; +import { AbstractESSource } from './es_source'; +import { AGG_TYPE } from '../../../common/constants'; + +export interface IESAggSource extends IESSource { + getAggKey(aggType: AGG_TYPE, fieldName: string): string; + getAggLabel(aggType: AGG_TYPE, fieldName: string): string; +} + +export class AbstractESAggSource extends AbstractESSource implements IESAggSource { + getAggKey(aggType: AGG_TYPE, fieldName: string): string; + getAggLabel(aggType: AGG_TYPE, fieldName: string): string; +} diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.js b/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.js index 775535d9e2299..62f3369ceb3a3 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.js +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_agg_source.js @@ -6,8 +6,8 @@ import { i18n } from '@kbn/i18n'; import { AbstractESSource } from './es_source'; -import { ESAggMetricField } from '../fields/es_agg_field'; -import { ESDocField } from '../fields/es_doc_field'; +import { esAggFieldsFactory } from '../fields/es_agg_field'; + import { AGG_TYPE, COUNT_PROP_LABEL, @@ -20,20 +20,14 @@ export const AGG_DELIMITER = '_of_'; export class AbstractESAggSource extends AbstractESSource { constructor(descriptor, inspectorAdapters) { super(descriptor, inspectorAdapters); - this._metricFields = this._descriptor.metrics - ? this._descriptor.metrics.map(metric => { - const esDocField = metric.field - ? new ESDocField({ fieldName: metric.field, source: this }) - : null; - return new ESAggMetricField({ - label: metric.label, - esDocField: esDocField, - aggType: metric.type, - source: this, - origin: this.getOriginForField(), - }); - }) - : []; + this._metricFields = []; + if (this._descriptor.metrics) { + this._descriptor.metrics.forEach(aggDescriptor => { + this._metricFields.push( + ...esAggFieldsFactory(aggDescriptor, this, this.getOriginForField()) + ); + }); + } } getFieldByName(name) { @@ -61,16 +55,9 @@ export class AbstractESAggSource extends AbstractESSource { getMetricFields() { const metrics = this._metricFields.filter(esAggField => esAggField.isValid()); - if (metrics.length === 0) { - metrics.push( - new ESAggMetricField({ - aggType: AGG_TYPE.COUNT, - source: this, - origin: this.getOriginForField(), - }) - ); - } - return metrics; + return metrics.length === 0 + ? esAggFieldsFactory({ type: AGG_TYPE.COUNT }, this, this.getOriginForField()) + : metrics; } getAggKey(aggType, fieldName) { @@ -93,13 +80,12 @@ export class AbstractESAggSource extends AbstractESSource { getValueAggsDsl(indexPattern) { const valueAggsDsl = {}; - this.getMetricFields() - .filter(esAggMetric => { - return esAggMetric.getAggType() !== AGG_TYPE.COUNT; - }) - .forEach(esAggMetric => { + this.getMetricFields().forEach(esAggMetric => { + const aggDsl = esAggMetric.getValueAggDsl(indexPattern); + if (aggDsl) { valueAggsDsl[esAggMetric.getName()] = esAggMetric.getValueAggDsl(indexPattern); - }); + } + }); return valueAggsDsl; } diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.test.ts b/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.test.ts index a8223c36df349..e79d8e09fce9b 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.test.ts +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.test.ts @@ -53,6 +53,7 @@ describe('convertCompositeRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', }); @@ -79,6 +80,7 @@ describe('convertCompositeRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', }); @@ -125,6 +127,7 @@ describe('convertRegularRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', }); @@ -151,6 +154,7 @@ describe('convertRegularRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', }); diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts b/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts new file mode 100644 index 0000000000000..652409b61fd72 --- /dev/null +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AbstractESAggSource } from '../es_agg_source'; +import { ESGeoGridSourceDescriptor } from '../../../../common/descriptor_types'; + +export class ESGeoGridSource extends AbstractESAggSource { + constructor(sourceDescriptor: ESGeoGridSourceDescriptor, inspectorAdapters: unknown); +} diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.js b/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.js index b2463275dad0a..4987d052b8ab7 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.js +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.js @@ -20,7 +20,6 @@ import { COLOR_GRADIENTS } from '../../styles/color_utils'; import { CreateSourceEditor } from './create_source_editor'; import { UpdateSourceEditor } from './update_source_editor'; import { - AGG_TYPE, DEFAULT_MAX_BUCKETS_LIMIT, SOURCE_DATA_ID_ORIGIN, ES_GEO_GRID, @@ -297,10 +296,7 @@ export class ESGeoGridSource extends AbstractESAggSource { let bucketsPerGrid = 1; this.getMetricFields().forEach(metricField => { - if (metricField.getAggType() === AGG_TYPE.TERMS) { - // each terms aggregation increases the overall number of buckets per grid - bucketsPerGrid++; - } + bucketsPerGrid += metricField.getBucketCount(); }); const features = diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.test.ts b/x-pack/legacy/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.test.ts index 5fbd5a3ad20c0..14c62aa0207fe 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.test.ts +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.test.ts @@ -62,6 +62,7 @@ it('Should convert elasticsearch aggregation response into feature collection of avg_of_FlightDelayMin: 3, doc_count: 1, terms_of_Carrier: 'ES-Air', + terms_of_Carrier__percentage: 100, }, type: 'Feature', }); diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_source.d.ts b/x-pack/legacy/plugins/maps/public/layers/sources/es_source.d.ts index 2aaaad15d6321..25c4fae89f024 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_source.d.ts +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_source.d.ts @@ -5,5 +5,13 @@ */ import { AbstractVectorSource } from './vector_source'; +import { IVectorSource } from './vector_source'; +import { IndexPattern } from '../../../../../../../src/plugins/data/public'; -export class AbstractESSource extends AbstractVectorSource {} +export interface IESSource extends IVectorSource { + getIndexPattern(): Promise; +} + +export class AbstractESSource extends AbstractVectorSource implements IESSource { + getIndexPattern(): Promise; +} diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_term_source.js b/x-pack/legacy/plugins/maps/public/layers/sources/es_term_source.js index 30f60f543d38d..c12b4befc0684 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_term_source.js +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_term_source.js @@ -105,7 +105,13 @@ export class ESTermSource extends AbstractESAggSource { requestName: `${this._descriptor.indexPatternTitle}.${this._termField.getName()}`, searchSource, registerCancelCallback, - requestDescription: this._getRequestDescription(leftSourceName, leftFieldName), + requestDescription: i18n.translate('xpack.maps.source.esJoin.joinDescription', { + defaultMessage: `Elasticsearch terms aggregation request, left source: {leftSource}, right source: {rightSource}`, + values: { + leftSource: `${leftSourceName}:${leftFieldName}`, + rightSource: `${this._descriptor.indexPatternTitle}:${this._termField.getName()}`, + }, + }), }); const countPropertyName = this.getAggKey(AGG_TYPE.COUNT); @@ -118,30 +124,6 @@ export class ESTermSource extends AbstractESAggSource { return false; } - _getRequestDescription(leftSourceName, leftFieldName) { - const metrics = this.getMetricFields().map(esAggMetric => esAggMetric.getRequestDescription()); - const joinStatement = []; - joinStatement.push( - i18n.translate('xpack.maps.source.esJoin.joinLeftDescription', { - defaultMessage: `Join {leftSourceName}:{leftFieldName} with`, - values: { leftSourceName, leftFieldName }, - }) - ); - joinStatement.push(`${this._descriptor.indexPatternTitle}:${this._termField.getName()}`); - joinStatement.push( - i18n.translate('xpack.maps.source.esJoin.joinMetricsDescription', { - defaultMessage: `for metrics {metrics}`, - values: { metrics: metrics.join(',') }, - }) - ); - return i18n.translate('xpack.maps.source.esJoin.joinDescription', { - defaultMessage: `Elasticsearch terms aggregation request for {description}`, - values: { - description: joinStatement.join(' '), - }, - }); - } - async getDisplayName() { //no need to localize. this is never rendered. return `es_table ${this._descriptor.indexPatternId}`; diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/vector_source.js b/x-pack/legacy/plugins/maps/public/layers/sources/vector_source.js index 3952aacf03b33..8369ca562e14b 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/vector_source.js +++ b/x-pack/legacy/plugins/maps/public/layers/sources/vector_source.js @@ -54,7 +54,7 @@ export class AbstractVectorSource extends AbstractSource { * factory function creating a new field-instance * @param fieldName * @param label - * @returns {ESAggMetricField} + * @returns {IField} */ createField() { throw new Error(`Should implemement ${this.constructor.type} ${this}`); @@ -64,7 +64,7 @@ export class AbstractVectorSource extends AbstractSource { * Retrieves a field. This may be an existing instance. * @param fieldName * @param label - * @returns {ESAggMetricField} + * @returns {IField} */ getFieldByName(name) { return this.createField({ fieldName: name }); diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js index 19e80f330378b..7b94e58f0e7d4 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js @@ -152,10 +152,7 @@ export class DynamicStyleProperty extends AbstractStyleProperty { async getFieldMetaRequest() { if (this.isOrdinal()) { - const fieldMetaOptions = this.getFieldMetaOptions(); - return this._field.getOrdinalFieldMetaRequest({ - sigma: _.get(fieldMetaOptions, 'sigma', DEFAULT_SIGMA), - }); + return this._field.getOrdinalFieldMetaRequest(); } else if (this.isCategorical()) { return this._field.getCategoricalFieldMetaRequest(); } else { diff --git a/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.test.ts b/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.test.ts index 201d6907981a2..445a7621194b7 100644 --- a/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.test.ts +++ b/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.test.ts @@ -19,19 +19,34 @@ describe('extractPropertiesFromBucket', () => { }); }); - test('Should extract bucket aggregation values', () => { + test('Should extract top bucket aggregation value and percentage', () => { const properties = extractPropertiesFromBucket({ + doc_count: 3, 'terms_of_machine.os.keyword': { buckets: [ { key: 'win xp', - doc_count: 16, + doc_count: 1, }, ], }, }); expect(properties).toEqual({ + doc_count: 3, 'terms_of_machine.os.keyword': 'win xp', + 'terms_of_machine.os.keyword__percentage': 33, + }); + }); + + test('Should handle empty top bucket aggregation', () => { + const properties = extractPropertiesFromBucket({ + doc_count: 3, + 'terms_of_machine.os.keyword': { + buckets: [], + }, + }); + expect(properties).toEqual({ + doc_count: 3, }); }); }); diff --git a/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.ts b/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.ts index 7af176acfaf46..9d4f24f80d6cd 100644 --- a/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.ts +++ b/x-pack/legacy/plugins/maps/public/layers/util/es_agg_utils.ts @@ -6,6 +6,7 @@ import { i18n } from '@kbn/i18n'; import _ from 'lodash'; import { IndexPattern, IFieldType } from '../../../../../../../src/plugins/data/public'; +import { TOP_TERM_PERCENTAGE_SUFFIX } from '../../../common/constants'; export function getField(indexPattern: IndexPattern, fieldName: string) { const field = indexPattern.fields.getByName(fieldName); @@ -42,7 +43,19 @@ export function extractPropertiesFromBucket(bucket: any, ignoreKeys: string[] = if (_.has(bucket[key], 'value')) { properties[key] = bucket[key].value; } else if (_.has(bucket[key], 'buckets')) { + if (bucket[key].buckets.length === 0) { + // No top term + continue; + } + properties[key] = _.get(bucket[key], 'buckets[0].key'); + const topBucketCount = bucket[key].buckets[0].doc_count; + const totalCount = bucket.doc_count; + if (totalCount && topBucketCount) { + properties[`${key}${TOP_TERM_PERCENTAGE_SUFFIX}`] = Math.round( + (topBucketCount / totalCount) * 100 + ); + } } else { properties[key] = bucket[key]; } diff --git a/x-pack/legacy/plugins/maps/public/layers/util/is_metric_countable.js b/x-pack/legacy/plugins/maps/public/layers/util/is_metric_countable.ts similarity index 85% rename from x-pack/legacy/plugins/maps/public/layers/util/is_metric_countable.js rename to x-pack/legacy/plugins/maps/public/layers/util/is_metric_countable.ts index 69ccb8890d10c..37916e53d6c45 100644 --- a/x-pack/legacy/plugins/maps/public/layers/util/is_metric_countable.js +++ b/x-pack/legacy/plugins/maps/public/layers/util/is_metric_countable.ts @@ -6,6 +6,6 @@ import { AGG_TYPE } from '../../../common/constants'; -export function isMetricCountable(aggType) { +export function isMetricCountable(aggType: AGG_TYPE): boolean { return [AGG_TYPE.COUNT, AGG_TYPE.SUM, AGG_TYPE.UNIQUE_COUNT].includes(aggType); } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 195b75f84a8c0..c57de95ecb82c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7257,9 +7257,6 @@ "xpack.maps.source.esGrid.showasFieldLabel": "表示形式", "xpack.maps.source.esGridDescription": "それぞれのグリッド付きセルのメトリックでグリッドにグループ分けされた地理空間データです。", "xpack.maps.source.esGridTitle": "グリッド集約", - "xpack.maps.source.esJoin.joinDescription": "{description} の Elasticsearch 用語集約リクエストです", - "xpack.maps.source.esJoin.joinLeftDescription": "{leftSourceName}:{leftFieldName} を次と結合:", - "xpack.maps.source.esJoin.joinMetricsDescription": "メトリック {metrics} の", "xpack.maps.source.esSearch.convertToGeoJsonErrorMsg": "検索への応答を geoJson 機能コレクションに変換できません。エラー: {errorMsg}", "xpack.maps.source.esSearch.disableFilterByMapBoundsExplainMsg": "インデックス「{indexPatternTitle}」はドキュメント数が少なく、ダイナミックフィルターが必要ありません。", "xpack.maps.source.esSearch.disableFilterByMapBoundsTitle": "ダイナミックデータフィルターは無効です", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9add5c6bcdbc3..f17f2eb509cf0 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7257,9 +7257,6 @@ "xpack.maps.source.esGrid.showasFieldLabel": "显示为", "xpack.maps.source.esGridDescription": "地理空间数据在网格中进行分组,每个网格单元格都具有指标", "xpack.maps.source.esGridTitle": "网格聚合", - "xpack.maps.source.esJoin.joinDescription": "{description} 的 Elasticsearch 词聚合请求", - "xpack.maps.source.esJoin.joinLeftDescription": "将 {leftSourceName}:{leftFieldName} 联接到", - "xpack.maps.source.esJoin.joinMetricsDescription": "以获取指标 {metrics}", "xpack.maps.source.esSearch.convertToGeoJsonErrorMsg": "无法将搜索响应转换成 geoJson 功能集合,错误:{errorMsg}", "xpack.maps.source.esSearch.disableFilterByMapBoundsExplainMsg": "索引“{indexPatternTitle}”具有很少数量的文档,不需要动态筛选。", "xpack.maps.source.esSearch.disableFilterByMapBoundsTitle": "动态数据筛选已禁用", From f511afa729e5a98d3cd4d05647611a98a0d1c275 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Thu, 5 Mar 2020 20:46:45 -0700 Subject: [PATCH 21/25] Use camelCase rather than snakeCase for plugin name (#59461) --- x-pack/plugins/data_enhanced/kibana.json | 2 +- x-pack/plugins/infra/kibana.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/data_enhanced/kibana.json b/x-pack/plugins/data_enhanced/kibana.json index 841f49caa1a2b..b2d5f42d9e468 100644 --- a/x-pack/plugins/data_enhanced/kibana.json +++ b/x-pack/plugins/data_enhanced/kibana.json @@ -1,5 +1,5 @@ { - "id": "data_enhanced", + "id": "dataEnhanced", "version": "8.0.0", "kibanaVersion": "kibana", "configPath": [ diff --git a/x-pack/plugins/infra/kibana.json b/x-pack/plugins/infra/kibana.json index f12bbd6cf7723..bb40d65d311e8 100644 --- a/x-pack/plugins/infra/kibana.json +++ b/x-pack/plugins/infra/kibana.json @@ -9,7 +9,7 @@ "spaces", "home", "data", - "data_enhanced", + "dataEnhanced", "metrics", "alerting" ], From c29ef14656fabb1de46ba0bf82f4b2e997946bf5 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Thu, 5 Mar 2020 23:29:55 -0500 Subject: [PATCH 22/25] [SIEM] [CASES] API with io-ts validation (#59265) * refactor to use io-ts, to be able to have ressource with sub, add total comments via comment_ids, be able to delete multiple cases/comments * fix test * adapt UI to refactor of the API * put it back the way it was * clean up to get cases * review I * review II - bring back url parameter * fix merge Co-authored-by: Elastic Machine --- .../ml/api/error_to_toaster.test.ts | 2 +- .../components/ml/api/error_to_toaster.ts | 2 +- .../siem/public/components/ml_popover/api.tsx | 2 +- .../siem/public/containers/case/api.ts | 102 ++++++++++-------- .../siem/public/containers/case/types.ts | 53 +-------- .../public/containers/case/use_get_case.tsx | 8 +- .../public/containers/case/use_get_cases.tsx | 59 +++++----- .../public/containers/case/use_get_tags.tsx | 25 ++--- .../public/containers/case/use_post_case.tsx | 80 +++++++------- .../containers/case/use_post_comment.tsx | 75 ++++++------- .../containers/case/use_update_case.tsx | 77 +++++++------ .../containers/case/use_update_comment.tsx | 78 +++++++++----- .../siem/public/containers/case/utils.ts | 31 +++++- .../detection_engine/rules/api.test.ts | 2 +- .../signals/errors_types/get_index_error.ts | 2 +- .../signals/errors_types/post_index_error.ts | 2 +- .../errors_types/privilege_user_error.ts | 2 +- .../plugins/siem/public/hooks/api/api.tsx | 2 +- .../ml => hooks}/api/throw_if_not_ok.test.ts | 2 +- .../ml => hooks}/api/throw_if_not_ok.ts | 8 +- .../case/components/add_comment/index.tsx | 34 +++--- .../case/components/add_comment/schema.tsx | 4 +- .../components/all_cases/__mock__/index.tsx | 10 +- .../case/components/all_cases/actions.tsx | 6 +- .../case/components/all_cases/columns.tsx | 4 +- .../case/components/all_cases/index.test.tsx | 2 +- .../components/case_view/__mock__/index.tsx | 8 +- .../case/components/case_view/index.test.tsx | 23 ++-- .../pages/case/components/case_view/index.tsx | 39 ++++--- .../pages/case/components/create/index.tsx | 32 +++--- .../pages/case/components/create/schema.tsx | 19 ++-- .../pages/case/components/tag_list/schema.tsx | 4 +- .../components/user_action_tree/index.tsx | 38 ++++--- .../server/lib/case/saved_object_mappings.ts | 81 -------------- .../plugins/siem/server/saved_objects.ts | 8 +- x-pack/plugins/case/common/api/cases/case.ts | 59 ++++++++++ .../plugins/case/common/api/cases/comment.ts | 56 ++++++++++ .../api/cases/index.ts} | 4 +- x-pack/plugins/case/common/api/index.ts | 9 ++ .../plugins/case/common/api/runtime_types.ts | 25 +++++ .../plugins/case/common/api/saved_object.ts | 34 ++++++ x-pack/plugins/case/common/api/user.ts | 12 +++ x-pack/plugins/case/kibana.json | 4 + x-pack/plugins/case/server/index.ts | 1 - x-pack/plugins/case/server/plugin.ts | 11 +- .../__fixtures__/create_mock_so_repository.ts | 56 ++++++++-- .../routes/api/__fixtures__/mock_router.ts | 2 +- .../api/__fixtures__/mock_saved_objects.ts | 60 ++++++++--- .../api/cases/comments/delete_all_comments.ts | 55 ++++++++++ .../comments}/delete_comment.test.ts | 37 ++++--- .../api/cases/comments/delete_comment.ts | 61 +++++++++++ .../api/cases/comments/find_comments.ts | 61 +++++++++++ .../comments/get_all_comment.ts} | 20 ++-- .../comments}/get_comment.test.ts | 45 +++++--- .../routes/api/cases/comments/get_comment.ts | 51 +++++++++ .../comments/patch_comment.test.ts} | 53 ++++++--- .../api/cases/comments/patch_comment.ts | 84 +++++++++++++++ .../comments}/post_comment.test.ts | 56 +++++++--- .../routes/api/cases/comments/post_comment.ts | 85 +++++++++++++++ .../delete_cases.test.ts} | 62 +++++++---- .../server/routes/api/cases/delete_cases.ts | 60 +++++++++++ .../get_all_cases.test.ts | 13 ++- .../routes/api/{ => cases}/get_all_cases.ts | 32 +++--- .../api/{__tests__ => cases}/get_case.test.ts | 57 ++++++---- .../server/routes/api/{ => cases}/get_case.ts | 35 +++--- .../patch_case.test.ts} | 66 +++++++----- .../server/routes/api/cases/patch_case.ts | 98 +++++++++++++++++ .../{__tests__ => cases}/post_case.test.ts | 27 +++-- .../case/server/routes/api/cases/post_case.ts | 48 +++++++++ .../routes/api/{ => cases/tags}/get_tags.ts | 4 +- .../case/server/routes/api/delete_case.ts | 56 ---------- .../case/server/routes/api/delete_comment.ts | 34 ------ .../case/server/routes/api/get_comment.ts | 33 ------ .../plugins/case/server/routes/api/index.ts | 43 ++++---- .../case/server/routes/api/post_case.ts | 40 ------- .../case/server/routes/api/post_comment.ts | 62 ----------- .../plugins/case/server/routes/api/types.ts | 76 +------------ .../case/server/routes/api/update_case.ts | 94 ---------------- .../case/server/routes/api/update_comment.ts | 67 ------------ .../plugins/case/server/routes/api/utils.ts | 102 ++++++++++-------- .../case/server/saved_object_types/cases.ts | 60 +++++++++++ .../server/saved_object_types/comments.ts | 48 +++++++++ .../case/server/saved_object_types/index.ts | 8 ++ x-pack/plugins/case/server/services/index.ts | 36 +++---- .../case/server/services/tags/read_tags.ts | 7 +- x-pack/tsconfig.json | 2 +- 86 files changed, 1889 insertions(+), 1248 deletions(-) rename x-pack/legacy/plugins/siem/public/{components/ml => hooks}/api/throw_if_not_ok.test.ts (99%) rename x-pack/legacy/plugins/siem/public/{components/ml => hooks}/api/throw_if_not_ok.ts (91%) delete mode 100644 x-pack/legacy/plugins/siem/server/lib/case/saved_object_mappings.ts create mode 100644 x-pack/plugins/case/common/api/cases/case.ts create mode 100644 x-pack/plugins/case/common/api/cases/comment.ts rename x-pack/plugins/case/{server/constants.ts => common/api/cases/index.ts} (67%) create mode 100644 x-pack/plugins/case/common/api/index.ts create mode 100644 x-pack/plugins/case/common/api/runtime_types.ts create mode 100644 x-pack/plugins/case/common/api/saved_object.ts create mode 100644 x-pack/plugins/case/common/api/user.ts create mode 100644 x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts rename x-pack/plugins/case/server/routes/api/{__tests__ => cases/comments}/delete_comment.test.ts (61%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts create mode 100644 x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts rename x-pack/plugins/case/server/routes/api/{get_all_case_comments.ts => cases/comments/get_all_comment.ts} (51%) rename x-pack/plugins/case/server/routes/api/{__tests__ => cases/comments}/get_comment.test.ts (53%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts rename x-pack/plugins/case/server/routes/api/{__tests__/update_comment.test.ts => cases/comments/patch_comment.test.ts} (64%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts rename x-pack/plugins/case/server/routes/api/{__tests__ => cases/comments}/post_comment.test.ts (66%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts rename x-pack/plugins/case/server/routes/api/{__tests__/delete_case.test.ts => cases/delete_cases.test.ts} (60%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/delete_cases.ts rename x-pack/plugins/case/server/routes/api/{__tests__ => cases}/get_all_cases.test.ts (84%) rename x-pack/plugins/case/server/routes/api/{ => cases}/get_all_cases.ts (52%) rename x-pack/plugins/case/server/routes/api/{__tests__ => cases}/get_case.test.ts (74%) rename x-pack/plugins/case/server/routes/api/{ => cases}/get_case.ts (58%) rename x-pack/plugins/case/server/routes/api/{__tests__/update_case.test.ts => cases/patch_case.test.ts} (69%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/patch_case.ts rename x-pack/plugins/case/server/routes/api/{__tests__ => cases}/post_case.test.ts (82%) create mode 100644 x-pack/plugins/case/server/routes/api/cases/post_case.ts rename x-pack/plugins/case/server/routes/api/{ => cases/tags}/get_tags.ts (89%) delete mode 100644 x-pack/plugins/case/server/routes/api/delete_case.ts delete mode 100644 x-pack/plugins/case/server/routes/api/delete_comment.ts delete mode 100644 x-pack/plugins/case/server/routes/api/get_comment.ts delete mode 100644 x-pack/plugins/case/server/routes/api/post_case.ts delete mode 100644 x-pack/plugins/case/server/routes/api/post_comment.ts delete mode 100644 x-pack/plugins/case/server/routes/api/update_case.ts delete mode 100644 x-pack/plugins/case/server/routes/api/update_comment.ts create mode 100644 x-pack/plugins/case/server/saved_object_types/cases.ts create mode 100644 x-pack/plugins/case/server/saved_object_types/comments.ts create mode 100644 x-pack/plugins/case/server/saved_object_types/index.ts diff --git a/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.test.ts b/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.test.ts index 507d6cf98ed08..d4f38d817bd6b 100644 --- a/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.test.ts +++ b/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.test.ts @@ -5,7 +5,7 @@ */ import { isAnError, isToasterError, errorToToaster } from './error_to_toaster'; -import { ToasterErrors } from './throw_if_not_ok'; +import { ToasterErrors } from '../../../hooks/api/throw_if_not_ok'; describe('error_to_toaster', () => { let dispatchToaster = jest.fn(); diff --git a/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.ts b/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.ts index 779befaa0cd8e..b341016fff6ef 100644 --- a/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.ts +++ b/x-pack/legacy/plugins/siem/public/components/ml/api/error_to_toaster.ts @@ -7,7 +7,7 @@ import { isError } from 'lodash/fp'; import uuid from 'uuid'; import { ActionToaster, AppToast } from '../../toasters'; -import { ToasterErrorsType, ToasterErrors } from './throw_if_not_ok'; +import { ToasterErrorsType, ToasterErrors } from '../../../hooks/api/throw_if_not_ok'; export type ErrorToToasterArgs = Partial & { error: unknown; diff --git a/x-pack/legacy/plugins/siem/public/components/ml_popover/api.tsx b/x-pack/legacy/plugins/siem/public/components/ml_popover/api.tsx index 120fd8c404ffd..1ab996f88515b 100644 --- a/x-pack/legacy/plugins/siem/public/components/ml_popover/api.tsx +++ b/x-pack/legacy/plugins/siem/public/components/ml_popover/api.tsx @@ -17,7 +17,7 @@ import { StartDatafeedResponse, StopDatafeedResponse, } from './types'; -import { throwIfErrorAttached, throwIfErrorAttachedToSetup } from '../ml/api/throw_if_not_ok'; +import { throwIfErrorAttached, throwIfErrorAttachedToSetup } from '../../hooks/api/throw_if_not_ok'; import { throwIfNotOk } from '../../hooks/api/api'; import { KibanaServices } from '../../lib/kibana'; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/api.ts b/x-pack/legacy/plugins/siem/public/containers/case/api.ts index ff03a3799018c..81f8f83217e11 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/api.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/api.ts @@ -4,24 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaServices } from '../../lib/kibana'; import { - AllCases, - Case, - CaseSnake, - Comment, - CommentSnake, - FetchCasesProps, - NewCase, - NewComment, - SortFieldCase, -} from './types'; + CaseResponse, + CasesResponse, + CaseRequest, + CommentRequest, + CommentResponse, +} from '../../../../../../plugins/case/common/api'; +import { KibanaServices } from '../../lib/kibana'; +import { AllCases, Case, Comment, FetchCasesProps, SortFieldCase } from './types'; import { throwIfNotOk } from '../../hooks/api/api'; import { CASES_URL } from './constants'; -import { convertToCamelCase, convertAllCasesToCamel } from './utils'; +import { + convertToCamelCase, + convertAllCasesToCamel, + decodeCaseResponse, + decodeCasesResponse, + decodeCommentResponse, +} from './utils'; + +const CaseSavedObjectType = 'cases'; export const getCase = async (caseId: string, includeComments: boolean = true): Promise => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}`, { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}`, { method: 'GET', asResponse: true, query: { @@ -29,7 +34,16 @@ export const getCase = async (caseId: string, includeComments: boolean = true): }, }); await throwIfNotOk(response.response); - return convertToCamelCase(response.body!); + return convertToCamelCase(decodeCaseResponse(response.body)); +}; + +export const getTags = async (): Promise => { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}/tags`, { + method: 'GET', + asResponse: true, + }); + await throwIfNotOk(response.response); + return response.body ?? []; }; export const getCases = async ({ @@ -45,70 +59,74 @@ export const getCases = async ({ sortOrder: 'desc', }, }: FetchCasesProps): Promise => { - const stateFilter = `case-workflow.attributes.state: ${filterOptions.state}`; + const stateFilter = `${CaseSavedObjectType}.attributes.state: ${filterOptions.state}`; const tags = [ - ...(filterOptions.tags?.reduce((acc, t) => [...acc, `case-workflow.attributes.tags: ${t}`], [ - stateFilter, - ]) ?? [stateFilter]), + ...(filterOptions.tags?.reduce( + (acc, t) => [...acc, `${CaseSavedObjectType}.attributes.tags: ${t}`], + [stateFilter] + ) ?? [stateFilter]), ]; const query = { ...queryParams, - filter: tags.join(' AND '), - search: filterOptions.search, + ...(tags.length > 0 ? { filter: tags.join(' AND ') } : {}), + ...(filterOptions.search.length > 0 ? { search: filterOptions.search } : {}), }; - const response = await KibanaServices.get().http.fetch(`${CASES_URL}`, { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}/_find`, { method: 'GET', query, asResponse: true, }); await throwIfNotOk(response.response); - return convertAllCasesToCamel(response.body!); + return convertAllCasesToCamel(decodeCasesResponse(response.body)); }; -export const createCase = async (newCase: NewCase): Promise => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}`, { +export const postCase = async (newCase: CaseRequest): Promise => { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}`, { method: 'POST', asResponse: true, body: JSON.stringify(newCase), }); await throwIfNotOk(response.response); - return convertToCamelCase(response.body!); + return convertToCamelCase(decodeCaseResponse(response.body)); }; -export const updateCaseProperty = async ( +export const patchCase = async ( caseId: string, - updatedCase: Partial, + updatedCase: Partial, version: string -): Promise> => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}`, { +): Promise => { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}`, { method: 'PATCH', asResponse: true, - body: JSON.stringify({ case: updatedCase, version }), + body: JSON.stringify({ ...updatedCase, id: caseId, version }), }); await throwIfNotOk(response.response); - return convertToCamelCase, Partial>(response.body!); + return convertToCamelCase(decodeCaseResponse(response.body)); }; -export const createComment = async (newComment: NewComment, caseId: string): Promise => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}/comment`, { - method: 'POST', - asResponse: true, - body: JSON.stringify(newComment), - }); +export const postComment = async (newComment: CommentRequest, caseId: string): Promise => { + const response = await KibanaServices.get().http.fetch( + `${CASES_URL}/${caseId}/comments`, + { + method: 'POST', + asResponse: true, + body: JSON.stringify(newComment), + } + ); await throwIfNotOk(response.response); - return convertToCamelCase(response.body!); + return convertToCamelCase(decodeCommentResponse(response.body)); }; -export const updateComment = async ( +export const patchComment = async ( commentId: string, commentUpdate: string, version: string ): Promise> => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/comment/${commentId}`, { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}/comments`, { method: 'PATCH', asResponse: true, - body: JSON.stringify({ comment: commentUpdate, version }), + body: JSON.stringify({ comment: commentUpdate, id: commentId, version }), }); await throwIfNotOk(response.response); - return convertToCamelCase, Partial>(response.body!); + return convertToCamelCase(decodeCommentResponse(response.body)); }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/types.ts b/x-pack/legacy/plugins/siem/public/containers/case/types.ts index 9cc9f519f3a62..d479abdbd4489 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/types.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/types.ts @@ -4,31 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -interface FormData { - isNew?: boolean; -} - -export interface NewCase extends FormData { - description: string; - tags: string[]; - title: string; -} - -export interface NewComment extends FormData { - comment: string; -} - -export interface CommentSnake { - comment_id: string; - created_at: string; - created_by: ElasticUserSnake; - comment: string; - updated_at: string; - version: string; -} - export interface Comment { - commentId: string; + id: string; createdAt: string; createdBy: ElasticUser; comment: string; @@ -36,21 +13,8 @@ export interface Comment { version: string; } -export interface CaseSnake { - case_id: string; - comments: CommentSnake[]; - created_at: string; - created_by: ElasticUserSnake; - description: string; - state: string; - tags: string[]; - title: string; - updated_at: string; - version: string; -} - export interface Case { - caseId: string; + id: string; comments: Comment[]; createdAt: string; createdBy: ElasticUser; @@ -75,29 +39,18 @@ export interface FilterOptions { tags: string[]; } -export interface AllCasesSnake { - cases: CaseSnake[]; - page: number; - per_page: number; - total: number; -} - export interface AllCases { cases: Case[]; page: number; perPage: number; total: number; } + export enum SortFieldCase { createdAt = 'createdAt', updatedAt = 'updatedAt', } -export interface ElasticUserSnake { - readonly username: string; - readonly full_name?: string | null; -} - export interface ElasticUser { readonly username: string; readonly fullName?: string | null; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx index ce71c26078db9..5f1dc96735d32 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_case.tsx @@ -50,7 +50,7 @@ const dataFetchReducer = (state: CaseState, action: Action): CaseState => { } }; const initialData: Case = { - caseId: '', + id: '', createdAt: '', comments: [], createdBy: { @@ -83,7 +83,11 @@ export const useGetCase = (caseId: string): [CaseState] => { } } catch (error) { if (!didCancel) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); dispatch({ type: FETCH_FAILURE }); } } diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx index e73b251477bf3..76e9b5c138269 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_cases.tsx @@ -4,15 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dispatch, SetStateAction, useCallback, useEffect, useReducer, useState } from 'react'; -import { isEqual } from 'lodash/fp'; +import { useCallback, useEffect, useReducer } from 'react'; import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case } from './types'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; import { useStateToaster } from '../../components/toasters'; import * as i18n from './translations'; import { UpdateByKey } from './use_update_case'; -import { getCases, updateCaseProperty } from './api'; +import { getCases, patchCase } from './api'; export interface UseGetCasesState { caseCount: CaseCount; @@ -109,11 +108,11 @@ const initialData: AllCases = { total: 0, }; interface UseGetCases extends UseGetCasesState { - dispatchUpdateCaseProperty: Dispatch; - getCaseCount: Dispatch; - setFilters: Dispatch>; - setQueryParams: Dispatch>>; - setSelectedCases: Dispatch; + dispatchUpdateCaseProperty: ({ updateKey, updateValue, caseId, version }: UpdateCase) => void; + getCaseCount: (caseState: keyof CaseCount) => void; + setFilters: (filters: FilterOptions) => void; + setQueryParams: (queryParams: QueryParams) => void; + setSelectedCases: (mySelectedCases: Case[]) => void; } export const useGetCases = (): UseGetCases => { const [state, dispatch] = useReducer(dataFetchReducer, { @@ -138,33 +137,27 @@ export const useGetCases = (): UseGetCases => { selectedCases: [], }); const [, dispatchToaster] = useStateToaster(); - const [filterQuery, setFilters] = useState(state.filterOptions); - const [queryParams, setQueryParams] = useState>(state.queryParams); const setSelectedCases = useCallback((mySelectedCases: Case[]) => { dispatch({ type: 'UPDATE_TABLE_SELECTIONS', payload: mySelectedCases }); }, []); - useEffect(() => { - if (!isEqual(queryParams, state.queryParams)) { - dispatch({ type: 'UPDATE_QUERY_PARAMS', payload: queryParams }); - } - }, [queryParams, state.queryParams]); + const setQueryParams = useCallback((newQueryParams: QueryParams) => { + dispatch({ type: 'UPDATE_QUERY_PARAMS', payload: newQueryParams }); + }, []); - useEffect(() => { - if (!isEqual(filterQuery, state.filterOptions)) { - dispatch({ type: 'UPDATE_FILTER_OPTIONS', payload: filterQuery }); - } - }, [filterQuery, state.filterOptions]); + const setFilters = useCallback((newFilters: FilterOptions) => { + dispatch({ type: 'UPDATE_FILTER_OPTIONS', payload: newFilters }); + }, []); - const fetchCases = useCallback(() => { + const fetchCases = useCallback((filterOptions: FilterOptions, queryParams: QueryParams) => { let didCancel = false; const fetchData = async () => { dispatch({ type: 'FETCH_INIT', payload: 'cases' }); try { const response = await getCases({ - filterOptions: state.filterOptions, - queryParams: state.queryParams, + filterOptions, + queryParams, }); if (!didCancel) { dispatch({ @@ -174,7 +167,11 @@ export const useGetCases = (): UseGetCases => { } } catch (error) { if (!didCancel) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); dispatch({ type: 'FETCH_FAILURE', payload: 'cases' }); } } @@ -183,8 +180,12 @@ export const useGetCases = (): UseGetCases => { return () => { didCancel = true; }; - }, [state.queryParams, state.filterOptions]); - useEffect(() => fetchCases(), [state.queryParams, state.filterOptions]); + }, []); + + useEffect(() => fetchCases(state.filterOptions, state.queryParams), [ + state.queryParams, + state.filterOptions, + ]); const getCaseCount = useCallback((caseState: keyof CaseCount) => { let didCancel = false; @@ -219,14 +220,14 @@ export const useGetCases = (): UseGetCases => { const fetchData = async () => { dispatch({ type: 'FETCH_INIT', payload: 'caseUpdate' }); try { - await updateCaseProperty( + await patchCase( caseId, { [updateKey]: updateValue }, version ?? '' // saved object versions are typed as string | undefined, hope that's not true ); if (!didCancel) { dispatch({ type: 'FETCH_UPDATE_CASE_SUCCESS' }); - fetchCases(); + fetchCases(state.filterOptions, state.queryParams); getCaseCount('open'); getCaseCount('closed'); } @@ -242,7 +243,7 @@ export const useGetCases = (): UseGetCases => { didCancel = true; }; }, - [filterQuery, state.filterOptions] + [state.filterOptions, state.queryParams] ); return { diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx index f796ae550c9ec..7d3e00a4f2be4 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx @@ -5,12 +5,12 @@ */ import { useEffect, useReducer } from 'react'; -import chrome from 'ui/chrome'; import { useStateToaster } from '../../components/toasters'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; -import * as i18n from './translations'; + +import { getTags } from './api'; import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS } from './constants'; -import { throwIfNotOk } from '../../hooks/api/api'; +import * as i18n from './translations'; interface TagsState { data: string[]; @@ -63,22 +63,17 @@ export const useGetTags = (): [TagsState] => { const fetchData = async () => { dispatch({ type: FETCH_INIT }); try { - const response = await fetch(`${chrome.getBasePath()}/api/cases/tags`, { - method: 'GET', - credentials: 'same-origin', - headers: { - 'content-type': 'application/json', - 'kbn-system-api': 'true', - }, - }); + const response = await getTags(); if (!didCancel) { - await throwIfNotOk(response); - const responseJson = await response.json(); - dispatch({ type: FETCH_SUCCESS, payload: responseJson }); + dispatch({ type: FETCH_SUCCESS, payload: response }); } } catch (error) { if (!didCancel) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); dispatch({ type: FETCH_FAILURE }); } } diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx index 0fcc8a3a1abec..7497b30395155 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_post_case.tsx @@ -4,24 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dispatch, SetStateAction, useEffect, useReducer, useState } from 'react'; +import { useReducer, useCallback } from 'react'; + +import { CaseRequest } from '../../../../../../plugins/case/common/api'; import { useStateToaster } from '../../components/toasters'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; + +import { postCase } from './api'; +import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS } from './constants'; import * as i18n from './translations'; -import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS, POST_NEW_CASE } from './constants'; -import { Case, NewCase } from './types'; -import { createCase } from './api'; -import { getTypedPayload } from './utils'; +import { Case } from './types'; interface NewCaseState { - data: NewCase; - newCase?: Case; + caseData: Case | null; isLoading: boolean; isError: boolean; } interface Action { type: string; - payload?: NewCase | Case; + payload?: Case; } const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { @@ -32,19 +33,12 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => isLoading: true, isError: false, }; - case POST_NEW_CASE: - return { - ...state, - isLoading: false, - isError: false, - data: getTypedPayload(action.payload), - }; case FETCH_SUCCESS: return { ...state, isLoading: false, isError: false, - newCase: getTypedPayload(action.payload), + caseData: action.payload ?? null, }; case FETCH_FAILURE: return { @@ -56,41 +50,43 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => throw new Error(); } }; -const initialData: NewCase = { - description: '', - isNew: false, - tags: [], - title: '', -}; -export const usePostCase = (): [NewCaseState, Dispatch>] => { +interface UsePostCase extends NewCaseState { + postCase: (data: CaseRequest) => void; +} +export const usePostCase = (): UsePostCase => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: false, isError: false, - data: initialData, + caseData: null, }); - const [formData, setFormData] = useState(initialData); const [, dispatchToaster] = useStateToaster(); - useEffect(() => { - dispatch({ type: POST_NEW_CASE, payload: formData }); - }, [formData]); - - useEffect(() => { - const postCase = async () => { + const postMyCase = useCallback(async (data: CaseRequest) => { + let cancel = false; + try { dispatch({ type: FETCH_INIT }); - try { - const { isNew, ...dataWithoutIsNew } = state.data; - const response = await createCase(dataWithoutIsNew); - dispatch({ type: FETCH_SUCCESS, payload: response }); - } catch (error) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + const response = await postCase({ ...data, state: 'open' }); + if (!cancel) { + dispatch({ + type: FETCH_SUCCESS, + payload: response, + }); + } + } catch (error) { + if (!cancel) { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); dispatch({ type: FETCH_FAILURE }); } - }; - if (state.data.isNew) { - postCase(); } - }, [state.data.isNew]); - return [state, setFormData]; + return () => { + cancel = true; + }; + }, []); + + return { ...state, postCase: postMyCase }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx index d8abda25af286..63d24e2935c2a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_post_comment.tsx @@ -4,25 +4,26 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dispatch, SetStateAction, useEffect, useReducer, useState } from 'react'; +import { useReducer, useCallback } from 'react'; + +import { CommentRequest } from '../../../../../../plugins/case/common/api'; import { useStateToaster } from '../../components/toasters'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; + +import { postComment } from './api'; +import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS } from './constants'; import * as i18n from './translations'; -import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS, POST_NEW_COMMENT } from './constants'; -import { Comment, NewComment } from './types'; -import { createComment } from './api'; -import { getTypedPayload } from './utils'; +import { Comment } from './types'; interface NewCommentState { - data: NewComment; - newComment?: Comment; + commentData: Comment | null; isLoading: boolean; isError: boolean; caseId: string; } interface Action { type: string; - payload?: NewComment | Comment; + payload?: Comment; } const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentState => { @@ -33,19 +34,12 @@ const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentSta isLoading: true, isError: false, }; - case POST_NEW_COMMENT: - return { - ...state, - isLoading: false, - isError: false, - data: getTypedPayload(action.payload), - }; case FETCH_SUCCESS: return { ...state, isLoading: false, isError: false, - newComment: getTypedPayload(action.payload), + commentData: action.payload ?? null, }; case FETCH_FAILURE: return { @@ -57,41 +51,42 @@ const dataFetchReducer = (state: NewCommentState, action: Action): NewCommentSta throw new Error(); } }; -const initialData: NewComment = { - comment: '', -}; -export const usePostComment = ( - caseId: string -): [NewCommentState, Dispatch>] => { +interface UsePostComment extends NewCommentState { + postComment: (data: CommentRequest) => void; +} + +export const usePostComment = (caseId: string): UsePostComment => { const [state, dispatch] = useReducer(dataFetchReducer, { + commentData: null, isLoading: false, isError: false, caseId, - data: initialData, }); - const [formData, setFormData] = useState(initialData); const [, dispatchToaster] = useStateToaster(); - useEffect(() => { - dispatch({ type: POST_NEW_COMMENT, payload: formData }); - }, [formData]); - - useEffect(() => { - const postComment = async () => { + const postMyComment = useCallback(async (data: CommentRequest) => { + let cancel = false; + try { dispatch({ type: FETCH_INIT }); - try { - const { isNew, ...dataWithoutIsNew } = state.data; - const response = await createComment(dataWithoutIsNew, state.caseId); + const response = await postComment(data, state.caseId); + if (!cancel) { dispatch({ type: FETCH_SUCCESS, payload: response }); - } catch (error) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); + } + } catch (error) { + if (!cancel) { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); dispatch({ type: FETCH_FAILURE }); } - }; - if (state.data.isNew) { - postComment(); } - }, [state.data.isNew]); - return [state, setFormData]; + return () => { + cancel = true; + }; + }, []); + + return { ...state, postComment: postMyComment }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx index f23be526fbeb7..21c8fb5dc7032 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_update_case.tsx @@ -4,19 +4,22 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useReducer } from 'react'; +import { useReducer, useCallback } from 'react'; + +import { CaseRequest } from '../../../../../../plugins/case/common/api'; import { useStateToaster } from '../../components/toasters'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; -import * as i18n from './translations'; + +import { patchCase } from './api'; import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS } from './constants'; +import * as i18n from './translations'; import { Case } from './types'; -import { updateCaseProperty } from './api'; import { getTypedPayload } from './utils'; -type UpdateKey = keyof Case; +type UpdateKey = keyof CaseRequest; interface NewCaseState { - data: Case; + caseData: Case; isLoading: boolean; isError: boolean; updateKey: UpdateKey | null; @@ -24,12 +27,12 @@ interface NewCaseState { export interface UpdateByKey { updateKey: UpdateKey; - updateValue: Case[UpdateKey]; + updateValue: CaseRequest[UpdateKey]; } interface Action { type: string; - payload?: Partial | UpdateKey; + payload?: Case | UpdateKey; } const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => { @@ -47,10 +50,7 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => ...state, isLoading: false, isError: false, - data: { - ...state.data, - ...getTypedPayload(action.payload), - }, + caseData: getTypedPayload(action.payload), updateKey: null, }; case FETCH_FAILURE: @@ -65,32 +65,47 @@ const dataFetchReducer = (state: NewCaseState, action: Action): NewCaseState => } }; -export const useUpdateCase = ( - caseId: string, - initialData: Case -): [NewCaseState, (updates: UpdateByKey) => void] => { +interface UseUpdateCase extends NewCaseState { + updateCaseProperty: (updates: UpdateByKey) => void; +} +export const useUpdateCase = (caseId: string, initialData: Case): UseUpdateCase => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: false, isError: false, - data: initialData, + caseData: initialData, updateKey: null, }); const [, dispatchToaster] = useStateToaster(); - const dispatchUpdateCaseProperty = async ({ updateKey, updateValue }: UpdateByKey) => { - dispatch({ type: FETCH_INIT, payload: updateKey }); - try { - const response = await updateCaseProperty( - caseId, - { [updateKey]: updateValue }, - state.data.version ?? '' // saved object versions are typed as string | undefined, hope that's not true - ); - dispatch({ type: FETCH_SUCCESS, payload: response }); - } catch (error) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); - dispatch({ type: FETCH_FAILURE }); - } - }; + const dispatchUpdateCaseProperty = useCallback( + async ({ updateKey, updateValue }: UpdateByKey) => { + let cancel = false; + try { + dispatch({ type: FETCH_INIT, payload: updateKey }); + const response = await patchCase( + caseId, + { [updateKey]: updateValue }, + state.caseData.version + ); + if (!cancel) { + dispatch({ type: FETCH_SUCCESS, payload: response }); + } + } catch (error) { + if (!cancel) { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + dispatch({ type: FETCH_FAILURE }); + } + } + return () => { + cancel = true; + }; + }, + [state] + ); - return [state, dispatchUpdateCaseProperty]; + return { ...state, updateCaseProperty: dispatchUpdateCaseProperty }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx index bc8369117433a..d7649cb7d8fdb 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_update_comment.tsx @@ -4,17 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useReducer, useRef } from 'react'; +import { useReducer, useCallback } from 'react'; + import { useStateToaster } from '../../components/toasters'; import { errorToToaster } from '../../components/ml/api/error_to_toaster'; -import * as i18n from './translations'; + +import { patchComment } from './api'; import { FETCH_FAILURE, FETCH_INIT, FETCH_SUCCESS } from './constants'; +import * as i18n from './translations'; import { Comment } from './types'; -import { updateComment } from './api'; import { getTypedPayload } from './utils'; -interface CommetUpdateState { - data: Comment[]; +interface CommentUpdateState { + comments: Comment[]; isLoadingIds: string[]; isError: boolean; } @@ -29,7 +31,7 @@ interface Action { payload?: CommentUpdate | string; } -const dataFetchReducer = (state: CommetUpdateState, action: Action): CommetUpdateState => { +const dataFetchReducer = (state: CommentUpdateState, action: Action): CommentUpdateState => { switch (action.type) { case FETCH_INIT: return { @@ -40,15 +42,19 @@ const dataFetchReducer = (state: CommetUpdateState, action: Action): CommetUpdat case FETCH_SUCCESS: const updatePayload = getTypedPayload(action.payload); - const foundIndex = state.data.findIndex( - comment => comment.commentId === updatePayload.commentId + const foundIndex = state.comments.findIndex( + comment => comment.id === updatePayload.commentId ); - state.data[foundIndex] = { ...state.data[foundIndex], ...updatePayload.update }; + const newComments = state.comments; + if (foundIndex !== -1) { + newComments[foundIndex] = { ...state.comments[foundIndex], ...updatePayload.update }; + } + return { ...state, isLoadingIds: state.isLoadingIds.filter(id => updatePayload.commentId !== id), isError: false, - data: [...state.data], + comments: newComments, }; case FETCH_FAILURE: return { @@ -63,30 +69,46 @@ const dataFetchReducer = (state: CommetUpdateState, action: Action): CommetUpdat } }; -export const useUpdateComment = ( - comments: Comment[] -): [CommetUpdateState, (commentId: string, commentUpdate: string) => void] => { +interface UseUpdateComment extends CommentUpdateState { + updateComment: (commentId: string, commentUpdate: string) => void; +} + +export const useUpdateComment = (comments: Comment[]): UseUpdateComment => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoadingIds: [], isError: false, - data: comments, + comments, }); - const dispatchUpdateComment = useRef<(commentId: string, commentUpdate: string) => void>(); const [, dispatchToaster] = useStateToaster(); - dispatchUpdateComment.current = async (commentId: string, commentUpdate: string) => { - dispatch({ type: FETCH_INIT, payload: commentId }); - try { - const currentComment = state.data.find(comment => comment.commentId === commentId) ?? { - version: '', + const dispatchUpdateComment = useCallback( + async (commentId: string, commentUpdate: string) => { + let cancel = false; + try { + dispatch({ type: FETCH_INIT, payload: commentId }); + const currentComment = state.comments.find(comment => comment.id === commentId) ?? { + version: '', + }; + const response = await patchComment(commentId, commentUpdate, currentComment.version); + if (!cancel) { + dispatch({ type: FETCH_SUCCESS, payload: { update: response, commentId } }); + } + } catch (error) { + if (!cancel) { + errorToToaster({ + title: i18n.ERROR_TITLE, + error: error.body && error.body.message ? new Error(error.body.message) : error, + dispatchToaster, + }); + dispatch({ type: FETCH_FAILURE, payload: commentId }); + } + } + return () => { + cancel = true; }; - const response = await updateComment(commentId, commentUpdate, currentComment.version); - dispatch({ type: FETCH_SUCCESS, payload: { update: response, commentId } }); - } catch (error) { - errorToToaster({ title: i18n.ERROR_TITLE, error, dispatchToaster }); - dispatch({ type: FETCH_FAILURE, payload: commentId }); - } - }; + }, + [state] + ); - return [state, dispatchUpdateComment.current]; + return { ...state, updateComment: dispatchUpdateComment }; }; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/utils.ts b/x-pack/legacy/plugins/siem/public/containers/case/utils.ts index 14a3819bdfdad..a377c496fe726 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/utils.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/utils.ts @@ -5,7 +5,21 @@ */ import { camelCase, isArray, isObject, set } from 'lodash'; -import { AllCases, AllCasesSnake, Case, CaseSnake } from './types'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; +import { pipe } from 'fp-ts/lib/pipeable'; + +import { + CaseResponse, + CaseResponseRt, + CasesResponse, + CasesResponseRt, + throwErrors, + CommentResponse, + CommentResponseRt, +} from '../../../../../../plugins/case/common/api'; +import { ToasterErrors } from '../../hooks/api/throw_if_not_ok'; +import { AllCases, Case } from './types'; export const getTypedPayload = (a: unknown): T => a as T; @@ -32,9 +46,20 @@ export const convertToCamelCase = (snakeCase: T): U => return acc; }, {} as U); -export const convertAllCasesToCamel = (snakeCases: AllCasesSnake): AllCases => ({ - cases: snakeCases.cases.map(snakeCase => convertToCamelCase(snakeCase)), +export const convertAllCasesToCamel = (snakeCases: CasesResponse): AllCases => ({ + cases: snakeCases.cases.map(snakeCase => convertToCamelCase(snakeCase)), page: snakeCases.page, perPage: snakeCases.per_page, total: snakeCases.total, }); + +export const createToasterPlainError = (message: string) => new ToasterErrors([message]); + +export const decodeCaseResponse = (respCase?: CaseResponse) => + pipe(CaseResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); + +export const decodeCasesResponse = (respCases?: CasesResponse) => + pipe(CasesResponseRt.decode(respCases), fold(throwErrors(createToasterPlainError), identity)); + +export const decodeCommentResponse = (respComment?: CommentResponse) => + pipe(CommentResponseRt.decode(respComment), fold(throwErrors(createToasterPlainError), identity)); diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.test.ts b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.test.ts index b348678e789f8..05446577a0fa0 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.test.ts +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/api.test.ts @@ -20,7 +20,7 @@ import { getPrePackagedRulesStatus, } from './api'; import { ruleMock, rulesMock } from './mock'; -import { ToasterErrors } from '../../../components/ml/api/throw_if_not_ok'; +import { ToasterErrors } from '../../../hooks/api/throw_if_not_ok'; const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/get_index_error.ts b/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/get_index_error.ts index 4f45b480772f2..79dae5b8acb87 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/get_index_error.ts +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/get_index_error.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MessageBody } from '../../../../components/ml/api/throw_if_not_ok'; +import { MessageBody } from '../../../../hooks/api/throw_if_not_ok'; export class SignalIndexError extends Error { message: string = ''; diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/post_index_error.ts b/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/post_index_error.ts index d6d8cccfb4540..227699af71b42 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/post_index_error.ts +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/post_index_error.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MessageBody } from '../../../../components/ml/api/throw_if_not_ok'; +import { MessageBody } from '../../../../hooks/api/throw_if_not_ok'; export class PostSignalError extends Error { message: string = ''; diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/privilege_user_error.ts b/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/privilege_user_error.ts index 5cd458a7fe9aa..19915e898bbeb 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/privilege_user_error.ts +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/signals/errors_types/privilege_user_error.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MessageBody } from '../../../../components/ml/api/throw_if_not_ok'; +import { MessageBody } from '../../../../hooks/api/throw_if_not_ok'; export class PrivilegeUserError extends Error { message: string = ''; diff --git a/x-pack/legacy/plugins/siem/public/hooks/api/api.tsx b/x-pack/legacy/plugins/siem/public/hooks/api/api.tsx index 69848c08fa3f8..1dfd6416531ee 100644 --- a/x-pack/legacy/plugins/siem/public/hooks/api/api.tsx +++ b/x-pack/legacy/plugins/siem/public/hooks/api/api.tsx @@ -6,7 +6,7 @@ import * as i18n from '../translations'; import { StartServices } from '../../plugin'; -import { parseJsonFromBody, ToasterErrors } from '../../components/ml/api/throw_if_not_ok'; +import { parseJsonFromBody, ToasterErrors } from './throw_if_not_ok'; import { IndexPatternSavedObject, IndexPatternSavedObjectAttributes } from '../types'; /** diff --git a/x-pack/legacy/plugins/siem/public/components/ml/api/throw_if_not_ok.test.ts b/x-pack/legacy/plugins/siem/public/hooks/api/throw_if_not_ok.test.ts similarity index 99% rename from x-pack/legacy/plugins/siem/public/components/ml/api/throw_if_not_ok.test.ts rename to x-pack/legacy/plugins/siem/public/hooks/api/throw_if_not_ok.test.ts index 9fd0010535203..bc0c765d6f2df 100644 --- a/x-pack/legacy/plugins/siem/public/components/ml/api/throw_if_not_ok.test.ts +++ b/x-pack/legacy/plugins/siem/public/hooks/api/throw_if_not_ok.test.ts @@ -14,7 +14,7 @@ import { ToasterErrors, tryParseResponse, } from './throw_if_not_ok'; -import { SetupMlResponse } from '../../ml_popover/types'; +import { SetupMlResponse } from '../../components/ml_popover/types'; describe('throw_if_not_ok', () => { afterEach(() => { diff --git a/x-pack/legacy/plugins/siem/public/components/ml/api/throw_if_not_ok.ts b/x-pack/legacy/plugins/siem/public/hooks/api/throw_if_not_ok.ts similarity index 91% rename from x-pack/legacy/plugins/siem/public/components/ml/api/throw_if_not_ok.ts rename to x-pack/legacy/plugins/siem/public/hooks/api/throw_if_not_ok.ts index 6ca843207a15e..7d70106b0e562 100644 --- a/x-pack/legacy/plugins/siem/public/components/ml/api/throw_if_not_ok.ts +++ b/x-pack/legacy/plugins/siem/public/hooks/api/throw_if_not_ok.ts @@ -6,11 +6,11 @@ import { has } from 'lodash/fp'; -import * as i18n from './translations'; -import { MlError } from '../types'; -import { SetupMlResponse } from '../../ml_popover/types'; +import * as i18n from '../../components/ml/api/translations'; +import { MlError } from '../../components/ml/types'; +import { SetupMlResponse } from '../../components/ml_popover/types'; -export { MessageBody, parseJsonFromBody } from '../../../utils/api'; +export { MessageBody, parseJsonFromBody } from '../../utils/api'; export interface MlStartJobError { error: MlError; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx index c8e0dafcf5742..16c6101b80d40 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/index.tsx @@ -3,15 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback } from 'react'; + import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; +import React, { useCallback } from 'react'; import styled from 'styled-components'; -import { Form, useForm, UseField } from '../../../../shared_imports'; -import { NewComment } from '../../../../containers/case/types'; + +import { CommentRequest } from '../../../../../../../../plugins/case/common/api'; import { usePostComment } from '../../../../containers/case/use_post_comment'; -import { schema } from './schema'; -import * as i18n from '../../translations'; import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; +import { Form, useForm, UseField } from '../../../../shared_imports'; +import * as i18n from '../../translations'; +import { schema } from './schema'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; @@ -19,24 +21,26 @@ const MySpinner = styled(EuiLoadingSpinner)` left: 50%; `; +const initialCommentValue: CommentRequest = { + comment: '', +}; + export const AddComment = React.memo<{ caseId: string; }>(({ caseId }) => { - const [{ data, isLoading, newComment }, setFormData] = usePostComment(caseId); - const { form } = useForm({ - defaultValue: data, + const { commentData, isLoading, postComment } = usePostComment(caseId); + const { form } = useForm({ + defaultValue: initialCommentValue, options: { stripEmptyFields: false }, schema, }); const onSubmit = useCallback(async () => { - const { isValid, data: newData } = await form.submit(); - if (isValid && newData.comment) { - setFormData({ ...newData, isNew: true } as NewComment); - } else if (isValid && data.comment) { - setFormData({ ...data, ...newData, isNew: true } as NewComment); + const { isValid, data } = await form.submit(); + if (isValid) { + await postComment(data); } - }, [form, data]); + }, [form]); return ( <> @@ -64,7 +68,7 @@ export const AddComment = React.memo<{ }} /> - {newComment && + {commentData != null && 'TO DO new comment got added but we didnt update the UI yet. Refresh the page to see your comment ;)'} ); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/schema.tsx index 5f30f59149d99..c61874a8dabfc 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/schema.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/add_comment/schema.tsx @@ -3,12 +3,14 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + +import { CommentRequest } from '../../../../../../../../plugins/case/common/api'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../../shared_imports'; import * as i18n from '../../translations'; const { emptyField } = fieldValidators; -export const schema: FormSchema = { +export const schema: FormSchema = { comment: { type: FIELD_TYPES.TEXTAREA, validations: [ diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx index a054d685399bc..2e57e5f2f95d9 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/__mock__/index.tsx @@ -11,7 +11,7 @@ export const useGetCasesMockState: UseGetCasesState = { data: { cases: [ { - caseId: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', + id: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', createdAt: '2020-02-13T19:44:23.627Z', createdBy: { username: 'elastic' }, comments: [], @@ -23,7 +23,7 @@ export const useGetCasesMockState: UseGetCasesState = { version: 'WzQ3LDFd', }, { - caseId: '362a5c10-4e99-11ea-9290-35d05cb55c15', + id: '362a5c10-4e99-11ea-9290-35d05cb55c15', createdAt: '2020-02-13T19:44:13.328Z', createdBy: { username: 'elastic' }, comments: [], @@ -35,7 +35,7 @@ export const useGetCasesMockState: UseGetCasesState = { version: 'WzQ3LDFd', }, { - caseId: '34f8b9e0-4e99-11ea-9290-35d05cb55c15', + id: '34f8b9e0-4e99-11ea-9290-35d05cb55c15', createdAt: '2020-02-13T19:44:11.328Z', createdBy: { username: 'elastic' }, comments: [], @@ -47,7 +47,7 @@ export const useGetCasesMockState: UseGetCasesState = { version: 'WzQ3LDFd', }, { - caseId: '31890e90-4e99-11ea-9290-35d05cb55c15', + id: '31890e90-4e99-11ea-9290-35d05cb55c15', createdAt: '2020-02-13T19:44:05.563Z', createdBy: { username: 'elastic' }, comments: [], @@ -59,7 +59,7 @@ export const useGetCasesMockState: UseGetCasesState = { version: 'WzQ3LDFd', }, { - caseId: '2f5b3210-4e99-11ea-9290-35d05cb55c15', + id: '2f5b3210-4e99-11ea-9290-35d05cb55c15', createdAt: '2020-02-13T19:44:01.901Z', createdBy: { username: 'elastic' }, comments: [], diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx index 5dad19b1e54d3..0ec09f2b57918 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/actions.tsx @@ -24,7 +24,7 @@ export const getActions = ({ icon: 'trash', name: i18n.DELETE, // eslint-disable-next-line no-console - onClick: ({ caseId }: Case) => console.log('TO DO Delete case', caseId), + onClick: ({ id }: Case) => console.log('TO DO Delete case', id), type: 'icon', 'data-test-subj': 'action-delete', }, @@ -37,7 +37,7 @@ export const getActions = ({ dispatchUpdate({ updateKey: 'state', updateValue: 'closed', - caseId: theCase.caseId, + caseId: theCase.id, version: theCase.version, }), type: 'icon', @@ -51,7 +51,7 @@ export const getActions = ({ dispatchUpdate({ updateKey: 'state', updateValue: 'open', - caseId: theCase.caseId, + caseId: theCase.id, version: theCase.version, }), type: 'icon', diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx index 41a2bdf52d5a1..f6ed2694fdc40 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx @@ -42,9 +42,9 @@ export const getCasesColumns = ( { name: i18n.NAME, render: (theCase: Case) => { - if (theCase.caseId != null && theCase.title != null) { + if (theCase.id != null && theCase.title != null) { const caseDetailsLinkComponent = ( - {theCase.title} + {theCase.title} ); return theCase.state === 'open' ? ( caseDetailsLinkComponent diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx index dd584f3f716b6..40a76c636954f 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx @@ -41,7 +41,7 @@ describe('AllCases', () => { .find(`a[data-test-subj="case-details-link"]`) .first() .prop('href') - ).toEqual(`#/link-to/case/${useGetCasesMockState.data.cases[0].caseId}`); + ).toEqual(`#/link-to/case/${useGetCasesMockState.data.cases[0].id}`); expect( wrapper .find(`a[data-test-subj="case-details-link"]`) diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx index 89d321c6d106a..c2d3cae6774b0 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/__mock__/index.tsx @@ -10,11 +10,11 @@ import { Case } from '../../../../../containers/case/types'; export const caseProps: CaseProps = { caseId: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', initialData: { - caseId: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', + id: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', comments: [ { comment: 'Solve this fast!', - commentId: 'a357c6a0-5435-11ea-b427-fb51a1fcb7b8', + id: 'a357c6a0-5435-11ea-b427-fb51a1fcb7b8', createdAt: '2020-02-20T23:06:33.798Z', createdBy: { fullName: 'Steph Milovic', @@ -36,11 +36,11 @@ export const caseProps: CaseProps = { }; export const data: Case = { - caseId: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', + id: '3c4ddcc0-4e99-11ea-9290-35d05cb55c15', comments: [ { comment: 'Solve this fast!', - commentId: 'a357c6a0-5435-11ea-b427-fb51a1fcb7b8', + id: 'a357c6a0-5435-11ea-b427-fb51a1fcb7b8', createdAt: '2020-02-20T23:06:33.798Z', createdBy: { fullName: 'Steph Milovic', diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx index 1539b3de5a0c1..e3bbfc0a83d71 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.test.tsx @@ -12,16 +12,17 @@ import { caseProps, data } from './__mock__'; import { TestProviders } from '../../../../mock'; describe('CaseView ', () => { - const dispatchUpdateCaseProperty = jest.fn(); + const updateCaseProperty = jest.fn(); beforeEach(() => { jest.resetAllMocks(); - jest - .spyOn(apiHook, 'useUpdateCase') - .mockReturnValue([ - { data, isLoading: false, isError: false, updateKey: null }, - dispatchUpdateCaseProperty, - ]); + jest.spyOn(apiHook, 'useUpdateCase').mockReturnValue({ + caseData: data, + isLoading: false, + isError: false, + updateKey: null, + updateCaseProperty, + }); }); it('should render CaseComponent', () => { @@ -79,7 +80,7 @@ describe('CaseView ', () => { .find('input[data-test-subj="toggle-case-state"]') .simulate('change', { target: { value: false } }); - expect(dispatchUpdateCaseProperty).toBeCalledWith({ + expect(updateCaseProperty).toBeCalledWith({ updateKey: 'state', updateValue: 'closed', }); @@ -94,7 +95,7 @@ describe('CaseView ', () => { expect( wrapper .find( - `div[data-test-subj="user-action-${data.comments[0].commentId}-avatar"] [data-test-subj="user-action-avatar"]` + `div[data-test-subj="user-action-${data.comments[0].id}-avatar"] [data-test-subj="user-action-avatar"]` ) .first() .prop('name') @@ -103,7 +104,7 @@ describe('CaseView ', () => { expect( wrapper .find( - `div[data-test-subj="user-action-${data.comments[0].commentId}"] [data-test-subj="user-action-title"] strong` + `div[data-test-subj="user-action-${data.comments[0].id}"] [data-test-subj="user-action-title"] strong` ) .first() .text() @@ -112,7 +113,7 @@ describe('CaseView ', () => { expect( wrapper .find( - `div[data-test-subj="user-action-${data.comments[0].commentId}"] [data-test-subj="markdown"]` + `div[data-test-subj="user-action-${data.comments[0].id}"] [data-test-subj="markdown"]` ) .first() .prop('source') diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx index 605f9e8fa1713..c917d27aebea3 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx @@ -60,10 +60,7 @@ export interface CaseProps { } export const CaseComponent = React.memo(({ caseId, initialData }) => { - const [{ data, isLoading, updateKey }, dispatchUpdateCaseProperty] = useUpdateCase( - caseId, - initialData - ); + const { caseData, isLoading, updateKey, updateCaseProperty } = useUpdateCase(caseId, initialData); const onUpdateField = useCallback( (newUpdateKey: keyof Case, updateValue: Case[keyof Case]) => { @@ -71,7 +68,7 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => case 'title': const titleUpdate = getTypedPayload(updateValue); if (titleUpdate.length > 0) { - dispatchUpdateCaseProperty({ + updateCaseProperty({ updateKey: 'title', updateValue: titleUpdate, }); @@ -80,7 +77,7 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => case 'description': const descriptionUpdate = getTypedPayload(updateValue); if (descriptionUpdate.length > 0) { - dispatchUpdateCaseProperty({ + updateCaseProperty({ updateKey: 'description', updateValue: descriptionUpdate, }); @@ -88,15 +85,15 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => break; case 'tags': const tagsUpdate = getTypedPayload(updateValue); - dispatchUpdateCaseProperty({ + updateCaseProperty({ updateKey: 'tags', updateValue: tagsUpdate, }); break; case 'state': const stateUpdate = getTypedPayload(updateValue); - if (data.state !== updateValue) { - dispatchUpdateCaseProperty({ + if (caseData.state !== updateValue) { + updateCaseProperty({ updateKey: 'state', updateValue: stateUpdate, }); @@ -105,7 +102,7 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => return null; } }, - [dispatchUpdateCaseProperty, data.state] + [updateCaseProperty, caseData.state] ); // TO DO refactor each of these const's into their own components @@ -146,11 +143,11 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => titleNode={ } - title={data.title} + title={caseData.title} > @@ -160,10 +157,10 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => {i18n.STATUS} - {data.state} + {caseData.state} @@ -172,7 +169,7 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => @@ -184,10 +181,10 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => @@ -204,7 +201,7 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => @@ -213,11 +210,11 @@ export const CaseComponent = React.memo(({ caseId, initialData }) => diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx index 65d7256fd6e20..840792f510fc0 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx @@ -14,8 +14,9 @@ import { } from '@elastic/eui'; import styled, { css } from 'styled-components'; import { Redirect } from 'react-router-dom'; + +import { CaseRequest } from '../../../../../../../../plugins/case/common/api'; import { Field, Form, getUseField, useForm, UseField } from '../../../../shared_imports'; -import { NewCase } from '../../../../containers/case/types'; import { usePostCase } from '../../../../containers/case/use_post_case'; import { schema } from './schema'; import * as i18n from '../../translations'; @@ -42,30 +43,37 @@ const MySpinner = styled(EuiLoadingSpinner)` z-index: 99; `; +const initialCaseValue: CaseRequest = { + description: '', + state: 'open', + tags: [], + title: '', +}; + export const Create = React.memo(() => { - const [{ data, isLoading, newCase }, setFormData] = usePostCase(); + const { caseData, isLoading, postCase } = usePostCase(); const [isCancel, setIsCancel] = useState(false); - const { form } = useForm({ - defaultValue: data, + const { form } = useForm({ + defaultValue: initialCaseValue, options: { stripEmptyFields: false }, schema, }); const onSubmit = useCallback(async () => { - const { isValid, data: newData } = await form.submit(); - if (isValid && newData.description) { - setFormData({ ...newData, isNew: true } as NewCase); - } else if (isValid && data.description) { - setFormData({ ...data, ...newData, isNew: true } as NewCase); + const { isValid, data } = await form.submit(); + if (isValid) { + await postCase(data); } - }, [form, data]); + }, [form]); - if (newCase && newCase.caseId) { - return ; + if (caseData != null && caseData.id) { + return ; } + if (isCancel) { return ; } + return ( {isLoading && } diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx index c81a31f0d4f3f..91d3b77493b03 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/schema.tsx @@ -4,13 +4,21 @@ * you may not use this file except in compliance with the Elastic License. */ +import { CaseRequest } from '../../../../../../../../plugins/case/common/api'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../../shared_imports'; -import { OptionalFieldLabel } from './optional_field_label'; import * as i18n from '../../translations'; +import { OptionalFieldLabel } from './optional_field_label'; const { emptyField } = fieldValidators; -export const schema: FormSchema = { +export const schemaTags = { + type: FIELD_TYPES.COMBO_BOX, + label: i18n.TAGS, + helpText: i18n.TAGS_HELP, + labelAppend: OptionalFieldLabel, +}; + +export const schema: FormSchema = { title: { type: FIELD_TYPES.TEXT, label: i18n.NAME, @@ -28,10 +36,5 @@ export const schema: FormSchema = { }, ], }, - tags: { - type: FIELD_TYPES.COMBO_BOX, - label: i18n.TAGS, - helpText: i18n.TAGS_HELP, - labelAppend: OptionalFieldLabel, - }, + tags: schemaTags, }; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/schema.tsx index 26a89408069fb..50ba114de528e 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/schema.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/schema.tsx @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ import { FormSchema } from '../../../../shared_imports'; -import { schema as createSchema } from '../create/schema'; +import { schemaTags } from '../create/schema'; export const schema: FormSchema = { - tags: createSchema.tags, + tags: schemaTags, }; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx index 63e0bbeb443c2..b68bfd73e50e9 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.tsx @@ -23,10 +23,8 @@ const DescriptionId = 'description'; const NewId = 'newComent'; export const UserActionTree = React.memo( - ({ data, onUpdateField, isLoadingDescription }: UserActionTreeProps) => { - const [{ data: comments, isLoadingIds }, dispatchUpdateComment] = useUpdateComment( - data.comments - ); + ({ data: caseData, onUpdateField, isLoadingDescription }: UserActionTreeProps) => { + const { comments, isLoadingIds, updateComment } = useUpdateComment(caseData.comments); const [manageMarkdownEditIds, setManangeMardownEditIds] = useState([]); @@ -44,16 +42,16 @@ export const UserActionTree = React.memo( const handleSaveComment = useCallback( (id: string, content: string) => { handleManageMarkdownEditId(id); - dispatchUpdateComment(id, content); + updateComment(id, content); }, - [handleManageMarkdownEditId, dispatchUpdateComment] + [handleManageMarkdownEditId, updateComment] ); const MarkdownDescription = useMemo( () => ( { handleManageMarkdownEditId(DescriptionId); @@ -62,45 +60,45 @@ export const UserActionTree = React.memo( onChangeEditable={handleManageMarkdownEditId} /> ), - [data.description, handleManageMarkdownEditId, manageMarkdownEditIds, onUpdateField] + [caseData.description, handleManageMarkdownEditId, manageMarkdownEditIds, onUpdateField] ); - const MarkdownNewComment = useMemo(() => , [data.caseId]); + const MarkdownNewComment = useMemo(() => , [caseData.id]); return ( <> {comments.map(comment => ( } - onEdit={handleManageMarkdownEditId.bind(null, comment.commentId)} + onEdit={handleManageMarkdownEditId.bind(null, comment.id)} userName={comment.createdBy.username} /> ))} diff --git a/x-pack/legacy/plugins/siem/server/lib/case/saved_object_mappings.ts b/x-pack/legacy/plugins/siem/server/lib/case/saved_object_mappings.ts deleted file mode 100644 index 80cdb9e979a68..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/case/saved_object_mappings.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -/* eslint-disable @typescript-eslint/no-empty-interface */ -/* eslint-disable @typescript-eslint/camelcase */ -import { CaseAttributes, CommentAttributes } from '../../../../../../../x-pack/plugins/case/server'; -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; - -// Temporary file to write mappings for case -// while Saved Object Mappings API is programmed for the NP -// See: https://github.com/elastic/kibana/issues/50309 - -export const caseSavedObjectType = 'case-workflow'; -export const caseCommentSavedObjectType = 'case-workflow-comment'; - -export const caseSavedObjectMappings: { - [caseSavedObjectType]: ElasticsearchMappingOf; -} = { - [caseSavedObjectType]: { - properties: { - created_at: { - type: 'date', - }, - description: { - type: 'text', - }, - title: { - type: 'keyword', - }, - created_by: { - properties: { - username: { - type: 'keyword', - }, - full_name: { - type: 'keyword', - }, - }, - }, - state: { - type: 'keyword', - }, - tags: { - type: 'keyword', - }, - updated_at: { - type: 'date', - }, - }, - }, -}; - -export const caseCommentSavedObjectMappings: { - [caseCommentSavedObjectType]: ElasticsearchMappingOf; -} = { - [caseCommentSavedObjectType]: { - properties: { - comment: { - type: 'text', - }, - created_at: { - type: 'date', - }, - created_by: { - properties: { - full_name: { - type: 'keyword', - }, - username: { - type: 'keyword', - }, - }, - }, - updated_at: { - type: 'date', - }, - }, - }, -}; diff --git a/x-pack/legacy/plugins/siem/server/saved_objects.ts b/x-pack/legacy/plugins/siem/server/saved_objects.ts index 58da333c7bc9a..76d8837883b8b 100644 --- a/x-pack/legacy/plugins/siem/server/saved_objects.ts +++ b/x-pack/legacy/plugins/siem/server/saved_objects.ts @@ -3,6 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { noteSavedObjectType, noteSavedObjectMappings } from './lib/note/saved_object_mappings'; import { pinnedEventSavedObjectType, @@ -16,10 +17,6 @@ import { ruleStatusSavedObjectMappings, ruleStatusSavedObjectType, } from './lib/detection_engine/rules/saved_object_mappings'; -import { - caseSavedObjectMappings, - caseCommentSavedObjectMappings, -} from './lib/case/saved_object_mappings'; export { noteSavedObjectType, @@ -31,8 +28,5 @@ export const savedObjectMappings = { ...timelineSavedObjectMappings, ...noteSavedObjectMappings, ...pinnedEventSavedObjectMappings, - // TODO: Remove once while Saved Object Mappings API is programmed for the NP See: https://github.com/elastic/kibana/issues/50309 - ...caseSavedObjectMappings, - ...caseCommentSavedObjectMappings, ...ruleStatusSavedObjectMappings, }; diff --git a/x-pack/plugins/case/common/api/cases/case.ts b/x-pack/plugins/case/common/api/cases/case.ts new file mode 100644 index 0000000000000..1bf39e6616480 --- /dev/null +++ b/x-pack/plugins/case/common/api/cases/case.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as rt from 'io-ts'; + +import { CommentResponseRt } from './comment'; +import { UserRT } from '../user'; + +const CaseBasicRt = rt.type({ + description: rt.string, + state: rt.union([rt.literal('open'), rt.literal('closed')]), + tags: rt.array(rt.string), + title: rt.string, +}); + +export const CaseAttributesRt = rt.intersection([ + CaseBasicRt, + rt.type({ + comment_ids: rt.array(rt.string), + created_at: rt.string, + created_by: UserRT, + updated_at: rt.union([rt.string, rt.null]), + updated_by: rt.union([UserRT, rt.null]), + }), +]); + +export const CaseRequestRt = CaseBasicRt; + +export const CaseResponseRt = rt.intersection([ + CaseAttributesRt, + rt.type({ + id: rt.string, + version: rt.string, + }), + rt.partial({ + comments: rt.array(CommentResponseRt), + }), +]); + +export const CasesResponseRt = rt.type({ + cases: rt.array(CaseResponseRt), + page: rt.number, + per_page: rt.number, + total: rt.number, +}); + +export const CasePatchRequestRt = rt.intersection([ + rt.partial(CaseRequestRt.props), + rt.type({ id: rt.string, version: rt.string }), +]); + +export type CaseAttributes = rt.TypeOf; +export type CaseRequest = rt.TypeOf; +export type CaseResponse = rt.TypeOf; +export type CasesResponse = rt.TypeOf; +export type CasePatchRequest = rt.TypeOf; diff --git a/x-pack/plugins/case/common/api/cases/comment.ts b/x-pack/plugins/case/common/api/cases/comment.ts new file mode 100644 index 0000000000000..cebfa00425728 --- /dev/null +++ b/x-pack/plugins/case/common/api/cases/comment.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as rt from 'io-ts'; + +import { UserRT } from '../user'; + +const CommentBasicRt = rt.type({ + comment: rt.string, +}); + +export const CommentAttributesRt = rt.intersection([ + CommentBasicRt, + rt.type({ + created_at: rt.string, + created_by: UserRT, + updated_at: rt.union([rt.string, rt.null]), + updated_by: rt.union([UserRT, rt.null]), + }), +]); + +export const CommentRequestRt = CommentBasicRt; + +export const CommentResponseRt = rt.intersection([ + CommentAttributesRt, + rt.type({ + id: rt.string, + version: rt.string, + }), +]); + +export const AllCommentsResponseRT = rt.array(CommentResponseRt); + +export const CommentPatchRequestRt = rt.intersection([ + rt.partial(CommentRequestRt.props), + rt.type({ id: rt.string, version: rt.string }), +]); + +export const CommentsResponseRt = rt.type({ + comments: rt.array(CommentResponseRt), + page: rt.number, + per_page: rt.number, + total: rt.number, +}); + +export const AllCommentsResponseRt = rt.array(CommentResponseRt); + +export type CommentAttributes = rt.TypeOf; +export type CommentRequest = rt.TypeOf; +export type CommentResponse = rt.TypeOf; +export type AllCommentsResponse = rt.TypeOf; +export type CommentsResponse = rt.TypeOf; +export type CommentPatchRequest = rt.TypeOf; diff --git a/x-pack/plugins/case/server/constants.ts b/x-pack/plugins/case/common/api/cases/index.ts similarity index 67% rename from x-pack/plugins/case/server/constants.ts rename to x-pack/plugins/case/common/api/cases/index.ts index 276dcd135254a..83e249e3257c4 100644 --- a/x-pack/plugins/case/server/constants.ts +++ b/x-pack/plugins/case/common/api/cases/index.ts @@ -4,5 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export const CASE_SAVED_OBJECT = 'case-workflow'; -export const CASE_COMMENT_SAVED_OBJECT = 'case-workflow-comment'; +export * from './case'; +export * from './comment'; diff --git a/x-pack/plugins/case/common/api/index.ts b/x-pack/plugins/case/common/api/index.ts new file mode 100644 index 0000000000000..3e94d91569ca5 --- /dev/null +++ b/x-pack/plugins/case/common/api/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; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './cases'; +export * from './runtime_types'; +export * from './saved_object'; diff --git a/x-pack/plugins/case/common/api/runtime_types.ts b/x-pack/plugins/case/common/api/runtime_types.ts new file mode 100644 index 0000000000000..d5b858df38def --- /dev/null +++ b/x-pack/plugins/case/common/api/runtime_types.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { Errors, Type } from 'io-ts'; +import { failure } from 'io-ts/lib/PathReporter'; + +type ErrorFactory = (message: string) => Error; + +export const createPlainError = (message: string) => new Error(message); + +export const throwErrors = (createError: ErrorFactory) => (errors: Errors) => { + throw createError(failure(errors).join('\n')); +}; + +export const decodeOrThrow = ( + runtimeType: Type, + createError: ErrorFactory = createPlainError +) => (inputValue: I) => + pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); diff --git a/x-pack/plugins/case/common/api/saved_object.ts b/x-pack/plugins/case/common/api/saved_object.ts new file mode 100644 index 0000000000000..0da859649a34e --- /dev/null +++ b/x-pack/plugins/case/common/api/saved_object.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as rt from 'io-ts'; + +import { either } from 'fp-ts/lib/Either'; + +const NumberFromString = new rt.Type( + 'NumberFromString', + rt.number.is, + (u, c) => + either.chain(rt.string.validate(u, c), s => { + const n = +s; + return isNaN(n) ? rt.failure(u, c, 'cannot parse to a number') : rt.success(n); + }), + String +); + +export const SavedObjectFindOptionsRt = rt.partial({ + defaultSearchOperator: rt.union([rt.literal('AND'), rt.literal('OR')]), + fields: rt.array(rt.string), + filter: rt.string, + page: NumberFromString, + perPage: NumberFromString, + search: rt.string, + searchFields: rt.array(rt.string), + sortField: rt.string, + sortOrder: rt.union([rt.literal('desc'), rt.literal('asc')]), +}); + +export type SavedObjectFindOptions = rt.TypeOf; diff --git a/x-pack/plugins/case/common/api/user.ts b/x-pack/plugins/case/common/api/user.ts new file mode 100644 index 0000000000000..bf5cde7af03f3 --- /dev/null +++ b/x-pack/plugins/case/common/api/user.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as rt from 'io-ts'; + +export const UserRT = rt.type({ + full_name: rt.union([rt.undefined, rt.string, rt.null]), + username: rt.union([rt.string, rt.null]), +}); diff --git a/x-pack/plugins/case/kibana.json b/x-pack/plugins/case/kibana.json index 23e3cc789ad3b..4a0151546c8fb 100644 --- a/x-pack/plugins/case/kibana.json +++ b/x-pack/plugins/case/kibana.json @@ -3,6 +3,10 @@ "id": "case", "kibanaVersion": "kibana", "requiredPlugins": ["security"], + "optionalPlugins": [ + "spaces", + "security" + ], "server": true, "ui": false, "version": "8.0.0" diff --git a/x-pack/plugins/case/server/index.ts b/x-pack/plugins/case/server/index.ts index 990aef19b74f7..f924810baa912 100644 --- a/x-pack/plugins/case/server/index.ts +++ b/x-pack/plugins/case/server/index.ts @@ -7,7 +7,6 @@ import { PluginInitializerContext } from '../../../../src/core/server'; import { ConfigSchema } from './config'; import { CasePlugin } from './plugin'; -export { CaseAttributes, CommentAttributes } from './routes/api/types'; export const config = { schema: ConfigSchema }; export const plugin = (initializerContext: PluginInitializerContext) => diff --git a/x-pack/plugins/case/server/plugin.ts b/x-pack/plugins/case/server/plugin.ts index 5ca640f0b25c3..7ce3a61f03779 100644 --- a/x-pack/plugins/case/server/plugin.ts +++ b/x-pack/plugins/case/server/plugin.ts @@ -5,11 +5,15 @@ */ import { first, map } from 'rxjs/operators'; -import { CoreSetup, Logger, PluginInitializerContext } from 'kibana/server'; +import { Logger, PluginInitializerContext } from 'kibana/server'; +import { CoreSetup } from 'src/core/server'; + +import { SecurityPluginSetup } from '../../security/server'; + import { ConfigType } from './config'; import { initCaseApi } from './routes/api'; +import { caseSavedObjectType, caseCommentSavedObjectType } from './saved_object_types'; import { CaseService } from './services'; -import { SecurityPluginSetup } from '../../security/server'; function createConfig$(context: PluginInitializerContext) { return context.config.create().pipe(map(config => config)); @@ -35,6 +39,9 @@ export class CasePlugin { return; } + core.savedObjects.registerType(caseSavedObjectType); + core.savedObjects.registerType(caseCommentSavedObjectType); + const service = new CaseService(this.log); this.log.debug( diff --git a/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts b/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts index eb9afb27a749e..7c97adc1b31bf 100644 --- a/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts +++ b/x-pack/plugins/case/server/routes/api/__fixtures__/create_mock_so_repository.ts @@ -5,12 +5,26 @@ */ import { SavedObjectsClientContract, SavedObjectsErrorHelpers } from 'src/core/server'; -import { CASE_COMMENT_SAVED_OBJECT } from '../../../constants'; -export const createMockSavedObjectsRepository = (savedObject: any[] = []) => { +import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT } from '../../../saved_object_types'; + +export const createMockSavedObjectsRepository = ({ + caseSavedObject = [], + caseCommentSavedObject = [], +}: { + caseSavedObject?: any[]; + caseCommentSavedObject?: any[]; +}) => { const mockSavedObjectsClientContract = ({ get: jest.fn((type, id) => { - const result = savedObject.filter(s => s.id === id); + if (type === CASE_COMMENT_SAVED_OBJECT) { + const result = caseCommentSavedObject.filter(s => s.id === id); + if (!result.length) { + throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); + } + return result[0]; + } + const result = caseSavedObject.filter(s => s.id === id); if (!result.length) { throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); } @@ -20,11 +34,20 @@ export const createMockSavedObjectsRepository = (savedObject: any[] = []) => { if (findArgs.hasReference && findArgs.hasReference.id === 'bad-guy') { throw SavedObjectsErrorHelpers.createBadRequestError('Error thrown for testing'); } + + if (findArgs.type === CASE_COMMENT_SAVED_OBJECT) { + return { + page: 1, + per_page: 5, + total: caseCommentSavedObject.length, + saved_objects: caseCommentSavedObject, + }; + } return { page: 1, per_page: 5, - total: savedObject.length, - saved_objects: savedObject, + total: caseSavedObject.length, + saved_objects: caseSavedObject, }; }), create: jest.fn((type, attributes, references) => { @@ -51,9 +74,16 @@ export const createMockSavedObjectsRepository = (savedObject: any[] = []) => { }; }), update: jest.fn((type, id, attributes) => { - if (!savedObject.find(s => s.id === id)) { - throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); + if (type === CASE_COMMENT_SAVED_OBJECT) { + if (!caseCommentSavedObject.find(s => s.id === id)) { + throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); + } + } else if (type === CASE_SAVED_OBJECT) { + if (!caseSavedObject.find(s => s.id === id)) { + throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); + } } + return { id, type, @@ -63,13 +93,17 @@ export const createMockSavedObjectsRepository = (savedObject: any[] = []) => { }; }), delete: jest.fn((type: string, id: string) => { - const result = savedObject.filter(s => s.id === id); - if (!result.length) { - throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); + let result = caseSavedObject.filter(s => s.id === id); + if (type === CASE_COMMENT_SAVED_OBJECT) { + result = caseCommentSavedObject.filter(s => s.id === id); } - if (type === 'case-workflow-comment' && id === 'bad-guy') { + if (type === CASE_COMMENT_SAVED_OBJECT && id === 'bad-guy') { throw SavedObjectsErrorHelpers.createBadRequestError('Error thrown for testing'); } + if (!result.length) { + throw SavedObjectsErrorHelpers.createGenericNotFoundError(type, id); + } + return {}; }), deleteByNamespace: jest.fn(), diff --git a/x-pack/plugins/case/server/routes/api/__fixtures__/mock_router.ts b/x-pack/plugins/case/server/routes/api/__fixtures__/mock_router.ts index ac9eddd6dd2cb..32348fecba1be 100644 --- a/x-pack/plugins/case/server/routes/api/__fixtures__/mock_router.ts +++ b/x-pack/plugins/case/server/routes/api/__fixtures__/mock_router.ts @@ -8,7 +8,7 @@ import { IRouter } from 'kibana/server'; import { loggingServiceMock, httpServiceMock } from '../../../../../../../src/core/server/mocks'; import { CaseService } from '../../../services'; import { authenticationMock } from '../__fixtures__'; -import { RouteDeps } from '../index'; +import { RouteDeps } from '../types'; export const createRoute = async ( api: (deps: RouteDeps) => void, diff --git a/x-pack/plugins/case/server/routes/api/__fixtures__/mock_saved_objects.ts b/x-pack/plugins/case/server/routes/api/__fixtures__/mock_saved_objects.ts index c7f6b6fad7d1a..3701e4f14e8b3 100644 --- a/x-pack/plugins/case/server/routes/api/__fixtures__/mock_saved_objects.ts +++ b/x-pack/plugins/case/server/routes/api/__fixtures__/mock_saved_objects.ts @@ -4,11 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -export const mockCases = [ +import { SavedObject } from 'kibana/server'; +import { CaseAttributes, CommentAttributes } from '../../../../common/api'; + +export const mockCases: Array> = [ { - type: 'case-workflow', + type: 'cases', id: 'mock-id-1', attributes: { + comment_ids: ['mock-comment-1'], created_at: '2019-11-25T21:54:48.952Z', created_by: { full_name: 'elastic', @@ -19,15 +23,20 @@ export const mockCases = [ state: 'open', tags: ['defacement'], updated_at: '2019-11-25T21:54:48.952Z', + updated_by: { + full_name: 'elastic', + username: 'elastic', + }, }, references: [], updated_at: '2019-11-25T21:54:48.952Z', version: 'WzAsMV0=', }, { - type: 'case-workflow', + type: 'cases', id: 'mock-id-2', attributes: { + comment_ids: [], created_at: '2019-11-25T22:32:00.900Z', created_by: { full_name: 'elastic', @@ -38,15 +47,20 @@ export const mockCases = [ state: 'open', tags: ['Data Destruction'], updated_at: '2019-11-25T22:32:00.900Z', + updated_by: { + full_name: 'elastic', + username: 'elastic', + }, }, references: [], updated_at: '2019-11-25T22:32:00.900Z', version: 'WzQsMV0=', }, { - type: 'case-workflow', + type: 'cases', id: 'mock-id-3', attributes: { + comment_ids: [], created_at: '2019-11-25T22:32:17.947Z', created_by: { full_name: 'elastic', @@ -57,6 +71,10 @@ export const mockCases = [ state: 'open', tags: ['LOLBins'], updated_at: '2019-11-25T22:32:17.947Z', + updated_by: { + full_name: 'elastic', + username: 'elastic', + }, }, references: [], updated_at: '2019-11-25T22:32:17.947Z', @@ -73,9 +91,9 @@ export const mockCasesErrorTriggerData = [ }, ]; -export const mockCaseComments = [ +export const mockCaseComments: Array> = [ { - type: 'case-workflow-comment', + type: 'cases-comment', id: 'mock-comment-1', attributes: { comment: 'Wow, good luck catching that bad meanie!', @@ -85,11 +103,15 @@ export const mockCaseComments = [ username: 'elastic', }, updated_at: '2019-11-25T21:55:00.177Z', + updated_by: { + full_name: 'elastic', + username: 'elastic', + }, }, references: [ { - type: 'case-workflow', - name: 'associated-case-workflow', + type: 'cases', + name: 'associated-cases', id: 'mock-id-1', }, ], @@ -97,7 +119,7 @@ export const mockCaseComments = [ version: 'WzEsMV0=', }, { - type: 'case-workflow-comment', + type: 'cases-comment', id: 'mock-comment-2', attributes: { comment: 'Well I decided to update my comment. So what? Deal with it.', @@ -107,19 +129,24 @@ export const mockCaseComments = [ username: 'elastic', }, updated_at: '2019-11-25T21:55:14.633Z', + updated_by: { + full_name: 'elastic', + username: 'elastic', + }, }, references: [ { - type: 'case-workflow', - name: 'associated-case-workflow', + type: 'cases', + name: 'associated-cases', id: 'mock-id-1', }, ], updated_at: '2019-11-25T21:55:14.633Z', + version: 'WzMsMV0=', }, { - type: 'case-workflow-comment', + type: 'cases-comment', id: 'mock-comment-3', attributes: { comment: 'Wow, good luck catching that bad meanie!', @@ -129,15 +156,20 @@ export const mockCaseComments = [ username: 'elastic', }, updated_at: '2019-11-25T22:32:30.608Z', + updated_by: { + full_name: 'elastic', + username: 'elastic', + }, }, references: [ { - type: 'case-workflow', - name: 'associated-case-workflow', + type: 'cases', + name: 'associated-cases', id: 'mock-id-3', }, ], updated_at: '2019-11-25T22:32:30.608Z', + version: 'WzYsMV0=', }, ]; diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts new file mode 100644 index 0000000000000..00d06bfdd2677 --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { RouteDeps } from '../../types'; +import { wrapError } from '../../utils'; + +export function initDeleteAllCommentsApi({ caseService, router }: RouteDeps) { + router.delete( + { + path: '/api/cases/{case_id}/comments', + validate: { + params: schema.object({ + case_id: schema.string(), + }), + }, + }, + async (context, request, response) => { + try { + const client = context.core.savedObjects.client; + + const comments = await caseService.getAllCaseComments({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + }); + await Promise.all( + comments.saved_objects.map(comment => + caseService.deleteComment({ + client, + commentId: comment.id, + }) + ) + ); + + const updateCase = { + comment_ids: [], + }; + await caseService.patchCase({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + updatedAttributes: { + ...updateCase, + }, + }); + + return response.ok({ body: 'true' }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/__tests__/delete_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts similarity index 61% rename from x-pack/plugins/case/server/routes/api/__tests__/delete_comment.test.ts rename to x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts index e50b3cbaa9c9a..8f05fbce391f8 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/delete_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts @@ -4,50 +4,61 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, - mockCasesErrorTriggerData, -} from '../__fixtures__'; -import { initDeleteCommentApi } from '../delete_comment'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; + mockCaseComments, +} from '../../__fixtures__'; +import { initDeleteCommentApi } from './delete_comment'; describe('DELETE comment', () => { let routeHandler: RequestHandler; beforeAll(async () => { routeHandler = await createRoute(initDeleteCommentApi, 'delete'); }); - it(`deletes the comment. responds with 204`, async () => { + it(`deletes the comment. responds with 200`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comments/{comment_id}', + path: '/api/cases/{case_id}/comments/{comment_id}', method: 'delete', params: { - comment_id: 'mock-id-1', + case_id: 'mock-id-1', + comment_id: 'mock-comment-1', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); - expect(response.status).toEqual(204); + expect(response.status).toEqual(200); }); it(`returns an error when thrown from deleteComment service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comments/{comment_id}', + path: '/api/cases/{case_id}/comments/{comment_id}', method: 'delete', params: { + case_id: 'mock-id-1', comment_id: 'bad-guy', }, }); const theContext = createRouteContext( - createMockSavedObjectsRepository(mockCasesErrorTriggerData) + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) ); const response = await routeHandler(theContext, request, kibanaResponseFactory); - expect(response.status).toEqual(400); + expect(response.status).toEqual(404); }); }); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts new file mode 100644 index 0000000000000..85c4701f82e1d --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import Boom from 'boom'; +import { schema } from '@kbn/config-schema'; +import { RouteDeps } from '../../types'; +import { wrapError } from '../../utils'; + +export function initDeleteCommentApi({ caseService, router }: RouteDeps) { + router.delete( + { + path: '/api/cases/{case_id}/comments/{comment_id}', + validate: { + params: schema.object({ + case_id: schema.string(), + comment_id: schema.string(), + }), + }, + }, + async (context, request, response) => { + try { + const client = context.core.savedObjects.client; + const myCase = await caseService.getCase({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + }); + + if (!myCase.attributes.comment_ids.includes(request.params.comment_id)) { + throw Boom.notFound( + `This comment ${request.params.comment_id} does not exist in ${myCase.attributes.title} (id: ${request.params.case_id}).` + ); + } + + await caseService.deleteComment({ + client, + commentId: request.params.comment_id, + }); + + const updateCase = { + comment_ids: myCase.attributes.comment_ids.filter( + cId => cId !== request.params.comment_id + ), + }; + await caseService.patchCase({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + updatedAttributes: { + ...updateCase, + }, + }); + + return response.ok({ body: 'true' }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts new file mode 100644 index 0000000000000..dcf70d0d9819c --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import Boom from 'boom'; + +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import { + CommentsResponseRt, + SavedObjectFindOptionsRt, + throwErrors, +} from '../../../../../common/api'; +import { RouteDeps } from '../../types'; +import { escapeHatch, transformComments, wrapError } from '../../utils'; + +export function initFindCaseCommentsApi({ caseService, router }: RouteDeps) { + router.get( + { + path: '/api/cases/{case_id}/comments/_find', + validate: { + params: schema.object({ + case_id: schema.string(), + }), + query: escapeHatch, + }, + }, + async (context, request, response) => { + try { + const query = pipe( + SavedObjectFindOptionsRt.decode(request.query), + fold(throwErrors(Boom.badRequest), identity) + ); + + const args = query + ? { + client: context.core.savedObjects.client, + caseId: request.params.case_id, + options: { + ...query, + sortField: 'created_at', + }, + } + : { + client: context.core.savedObjects.client, + caseId: request.params.case_id, + }; + + const theComments = await caseService.getAllCaseComments(args); + return response.ok({ body: CommentsResponseRt.encode(transformComments(theComments)) }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/get_all_case_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts similarity index 51% rename from x-pack/plugins/case/server/routes/api/get_all_case_comments.ts rename to x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts index b74227fa8d983..65f2de7125236 100644 --- a/x-pack/plugins/case/server/routes/api/get_all_case_comments.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts @@ -5,26 +5,30 @@ */ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '.'; -import { formatAllComments, wrapError } from './utils'; -export function initGetAllCaseCommentsApi({ caseService, router }: RouteDeps) { +import { AllCommentsResponseRt } from '../../../../../common/api'; +import { RouteDeps } from '../../types'; +import { flattenCommentSavedObjects, wrapError } from '../../utils'; + +export function initGetAllCommentsApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/{id}/comments', + path: '/api/cases/{case_id}/comments', validate: { params: schema.object({ - id: schema.string(), + case_id: schema.string(), }), }, }, async (context, request, response) => { try { - const theComments = await caseService.getAllCaseComments({ + const comments = await caseService.getAllCaseComments({ client: context.core.savedObjects.client, - caseId: request.params.id, + caseId: request.params.case_id, + }); + return response.ok({ + body: AllCommentsResponseRt.encode(flattenCommentSavedObjects(comments.saved_objects)), }); - return response.ok({ body: formatAllComments(theComments) }); } catch (error) { return response.customError(wrapError(error)); } diff --git a/x-pack/plugins/case/server/routes/api/__tests__/get_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts similarity index 53% rename from x-pack/plugins/case/server/routes/api/__tests__/get_comment.test.ts rename to x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts index 3add93acc641f..9c8d0e5254df0 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/get_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts @@ -3,18 +3,18 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCaseComments, -} from '../__fixtures__'; -import { initGetCommentApi } from '../get_comment'; -import { kibanaResponseFactory, RequestHandler, SavedObject } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; -import { flattenCommentSavedObject } from '../utils'; -import { CommentAttributes } from '../types'; + mockCases, +} from '../../__fixtures__'; +import { flattenCommentSavedObject } from '../../utils'; +import { initGetCommentApi } from './get_comment'; describe('GET comment', () => { let routeHandler: RequestHandler; @@ -23,33 +23,44 @@ describe('GET comment', () => { }); it(`returns the comment`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comments/{id}', + path: '/api/cases/{case_id}/comments/{comment_id}', method: 'get', params: { - id: 'mock-comment-1', + case_id: 'mock-id-1', + comment_id: 'mock-comment-1', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCaseComments)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); - expect(response.payload).toEqual( - flattenCommentSavedObject( - mockCaseComments.find(s => s.id === 'mock-comment-1') as SavedObject - ) - ); + const myPayload = mockCaseComments.find(s => s.id === 'mock-comment-1'); + expect(myPayload).not.toBeUndefined(); + if (myPayload != null) { + expect(response.payload).toEqual(flattenCommentSavedObject(myPayload)); + } }); it(`returns an error when getComment throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comments/{id}', + path: '/api/cases/{case_id}/comments/{comment_id}', method: 'get', params: { - id: 'not-real', + case_id: 'mock-id-1', + comment_id: 'not-real', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCaseComments)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(404); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts new file mode 100644 index 0000000000000..06619abae8487 --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import Boom from 'boom'; + +import { CommentResponseRt } from '../../../../../common/api'; +import { RouteDeps } from '../../types'; +import { flattenCommentSavedObject, wrapError } from '../../utils'; + +export function initGetCommentApi({ caseService, router }: RouteDeps) { + router.get( + { + path: '/api/cases/{case_id}/comments/{comment_id}', + validate: { + params: schema.object({ + case_id: schema.string(), + comment_id: schema.string(), + }), + }, + }, + async (context, request, response) => { + try { + const client = context.core.savedObjects.client; + const myCase = await caseService.getCase({ + client, + caseId: request.params.case_id, + }); + + if (!myCase.attributes.comment_ids.includes(request.params.comment_id)) { + throw Boom.notFound( + `This comment ${request.params.comment_id} does not exist in ${myCase.attributes.title} (id: ${request.params.case_id}).` + ); + } + + const comment = await caseService.getComment({ + client, + commentId: request.params.comment_id, + }); + return response.ok({ + body: CommentResponseRt.encode(flattenCommentSavedObject(comment)), + }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/__tests__/update_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts similarity index 64% rename from x-pack/plugins/case/server/routes/api/__tests__/update_comment.test.ts rename to x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts index 6b4e3c194eb82..4e7e266f326a2 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/update_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts @@ -3,72 +3,93 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCaseComments, -} from '../__fixtures__'; -import { initUpdateCommentApi } from '../update_comment'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; + mockCases, +} from '../../__fixtures__'; +import { initPatchCommentApi } from './patch_comment'; -describe('UPDATE comment', () => { +describe('PATCH comment', () => { let routeHandler: RequestHandler; beforeAll(async () => { - routeHandler = await createRoute(initUpdateCommentApi, 'patch'); + routeHandler = await createRoute(initPatchCommentApi, 'patch'); }); - it(`Updates a comment`, async () => { + it(`Patch a comment`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comment/{id}', + path: '/api/cases/{case_id}/comments', method: 'patch', params: { - id: 'mock-comment-1', + case_id: 'mock-id-1', }, body: { comment: 'Update my comment', + id: 'mock-comment-1', version: 'WzEsMV0=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCaseComments)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); expect(response.payload.comment).toEqual('Update my comment'); }); + it(`Fails with 409 if version does not match`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comment/{id}', + path: '/api/cases/{case_id}/comments', method: 'patch', params: { - id: 'mock-comment-1', + case_id: 'mock-id-1', }, body: { + id: 'mock-comment-1', comment: 'Update my comment', version: 'badv=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCaseComments)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(409); }); it(`Returns an error if updateComment throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/comment/{id}', + path: '/api/cases/{case_id}/comments', method: 'patch', params: { - id: 'mock-comment-does-not-exist', + case_id: 'mock-id-1', }, body: { comment: 'Update my comment', + id: 'mock-comment-does-not-exist', + version: 'WzEsMV0=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCaseComments)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(404); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts new file mode 100644 index 0000000000000..f1568f22c6c99 --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import Boom from 'boom'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import { CommentPatchRequestRt, CommentResponseRt, throwErrors } from '../../../../../common/api'; + +import { RouteDeps } from '../../types'; +import { escapeHatch, wrapError, flattenCommentSavedObject } from '../../utils'; + +export function initPatchCommentApi({ caseService, router }: RouteDeps) { + router.patch( + { + path: '/api/cases/{case_id}/comments', + validate: { + params: schema.object({ + case_id: schema.string(), + }), + body: escapeHatch, + }, + }, + async (context, request, response) => { + try { + const query = pipe( + CommentPatchRequestRt.decode(request.body), + fold(throwErrors(Boom.badRequest), identity) + ); + + const myCase = await caseService.getCase({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + }); + + if (!myCase.attributes.comment_ids.includes(query.id)) { + throw Boom.notFound( + `This comment ${query.id} does not exist in ${myCase.attributes.title} (id: ${request.params.case_id}).` + ); + } + + const myComment = await caseService.getComment({ + client: context.core.savedObjects.client, + commentId: query.id, + }); + + if (query.version !== myComment.version) { + throw Boom.conflict( + 'This case has been updated. Please refresh before saving additional updates.' + ); + } + + const updatedBy = await caseService.getUser({ request, response }); + const { full_name, username } = updatedBy; + const updatedComment = await caseService.patchComment({ + client: context.core.savedObjects.client, + commentId: query.id, + updatedAttributes: { + ...query, + updated_at: new Date().toISOString(), + updated_by: { full_name, username }, + }, + }); + + return response.ok({ + body: CommentResponseRt.encode( + flattenCommentSavedObject({ + ...updatedComment, + attributes: { ...myComment.attributes, ...updatedComment.attributes }, + references: myComment.references, + }) + ), + }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/__tests__/post_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts similarity index 66% rename from x-pack/plugins/case/server/routes/api/__tests__/post_comment.test.ts rename to x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts index 653140af2a7cf..e51ec7c894d08 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/post_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts @@ -4,15 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, -} from '../__fixtures__'; -import { initPostCommentApi } from '../post_comment'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; + mockCaseComments, +} from '../../__fixtures__'; +import { initPostCommentApi } from './post_comment'; describe('POST comment', () => { let routeHandler: RequestHandler; @@ -21,35 +23,45 @@ describe('POST comment', () => { }); it(`Posts a new comment`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}/comment', + path: '/api/cases/{case_id}/comments', method: 'post', params: { - id: 'mock-id-1', + case_id: 'mock-id-1', }, body: { comment: 'Wow, good luck catching that bad meanie!', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); - expect(response.payload.comment_id).toEqual('mock-comment'); + expect(response.payload.id).toEqual('mock-comment'); }); it(`Returns an error if the case does not exist`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}/comment', + path: '/api/cases/{case_id}/comments', method: 'post', params: { - id: 'this-is-not-real', + case_id: 'this-is-not-real', }, body: { comment: 'Wow, good luck catching that bad meanie!', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(404); @@ -57,17 +69,22 @@ describe('POST comment', () => { }); it(`Returns an error if postNewCase throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}/comment', + path: '/api/cases/{case_id}/comments', method: 'post', params: { - id: 'mock-id-1', + case_id: 'mock-id-1', }, body: { comment: 'Throw an error', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(400); @@ -77,17 +94,22 @@ describe('POST comment', () => { routeHandler = await createRoute(initPostCommentApi, 'post', true); const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}/comment', + path: '/api/cases/{case_id}/comments', method: 'post', params: { - id: 'mock-id-1', + case_id: 'mock-id-1', }, body: { comment: 'Wow, good luck catching that bad meanie!', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(500); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts new file mode 100644 index 0000000000000..9e82a8ffaaec7 --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import Boom from 'boom'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import { CommentRequestRt, CommentResponseRt, throwErrors } from '../../../../../common/api'; +import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; +import { + escapeHatch, + transformNewComment, + wrapError, + flattenCommentSavedObject, +} from '../../utils'; +import { RouteDeps } from '../../types'; + +export function initPostCommentApi({ caseService, router }: RouteDeps) { + router.post( + { + path: '/api/cases/{case_id}/comments', + validate: { + params: schema.object({ + case_id: schema.string(), + }), + body: escapeHatch, + }, + }, + async (context, request, response) => { + try { + const query = pipe( + CommentRequestRt.decode(request.body), + fold(throwErrors(Boom.badRequest), identity) + ); + + const myCase = await caseService.getCase({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + }); + + const createdBy = await caseService.getUser({ request, response }); + const createdDate = new Date().toISOString(); + + const newComment = await caseService.postNewComment({ + client: context.core.savedObjects.client, + attributes: transformNewComment({ + createdDate, + ...query, + ...createdBy, + }), + references: [ + { + type: CASE_SAVED_OBJECT, + name: `associated-${CASE_SAVED_OBJECT}`, + id: myCase.id, + }, + ], + }); + + const updateCase = { + comment_ids: [...myCase.attributes.comment_ids, newComment.id], + }; + + await caseService.patchCase({ + client: context.core.savedObjects.client, + caseId: request.params.case_id, + updatedAttributes: { + ...updateCase, + }, + }); + + return response.ok({ + body: CommentResponseRt.encode(flattenCommentSavedObject(newComment)), + }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/__tests__/delete_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts similarity index 60% rename from x-pack/plugins/case/server/routes/api/__tests__/delete_case.test.ts rename to x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts index 9ea42ba42406b..cee705694f21d 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/delete_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts @@ -4,61 +4,76 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, mockCasesErrorTriggerData, + mockCaseComments, } from '../__fixtures__'; -import { initDeleteCaseApi } from '../delete_case'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; +import { initDeleteCasesApi } from './delete_cases'; describe('DELETE case', () => { let routeHandler: RequestHandler; beforeAll(async () => { - routeHandler = await createRoute(initDeleteCaseApi, 'delete'); + routeHandler = await createRoute(initDeleteCasesApi, 'delete'); }); - it(`deletes the case. responds with 204`, async () => { + it(`deletes the case. responds with 200`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'delete', - params: { - id: 'mock-id-1', + query: { + ids: ['mock-id-1'], }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); - expect(response.status).toEqual(204); + expect(response.status).toEqual(200); }); it(`returns an error when thrown from deleteCase service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'delete', - params: { - id: 'not-real', + query: { + ids: ['not-real'], }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(404); }); it(`returns an error when thrown from getAllCaseComments service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'delete', - params: { - id: 'bad-guy', + query: { + ids: ['bad-guy'], }, }); const theContext = createRouteContext( - createMockSavedObjectsRepository(mockCasesErrorTriggerData) + createMockSavedObjectsRepository({ + caseSavedObject: mockCasesErrorTriggerData, + caseCommentSavedObject: mockCaseComments, + }) ); const response = await routeHandler(theContext, request, kibanaResponseFactory); @@ -66,15 +81,18 @@ describe('DELETE case', () => { }); it(`returns an error when thrown from deleteComment service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'delete', - params: { - id: 'valid-id', + query: { + ids: ['valid-id'], }, }); const theContext = createRouteContext( - createMockSavedObjectsRepository(mockCasesErrorTriggerData) + createMockSavedObjectsRepository({ + caseSavedObject: mockCasesErrorTriggerData, + caseCommentSavedObject: mockCasesErrorTriggerData, + }) ); const response = await routeHandler(theContext, request, kibanaResponseFactory); diff --git a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts new file mode 100644 index 0000000000000..559a477a83a6c --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { RouteDeps } from '../types'; +import { wrapError } from '../utils'; + +export function initDeleteCasesApi({ caseService, router }: RouteDeps) { + router.delete( + { + path: '/api/cases', + validate: { + query: schema.object({ + ids: schema.arrayOf(schema.string()), + }), + }, + }, + async (context, request, response) => { + try { + await Promise.all( + request.query.ids.map(id => + caseService.deleteCase({ + client: context.core.savedObjects.client, + caseId: id, + }) + ) + ); + const comments = await Promise.all( + request.query.ids.map(id => + caseService.getAllCaseComments({ + client: context.core.savedObjects.client, + caseId: id, + }) + ) + ); + + if (comments.some(c => c.saved_objects.length > 0)) { + await Promise.all( + comments.map(c => + Promise.all( + c.saved_objects.map(({ id }) => + caseService.deleteComment({ + client: context.core.savedObjects.client, + commentId: id, + }) + ) + ) + ) + ); + } + return response.ok({ body: 'true' }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/__tests__/get_all_cases.test.ts b/x-pack/plugins/case/server/routes/api/cases/get_all_cases.test.ts similarity index 84% rename from x-pack/plugins/case/server/routes/api/__tests__/get_all_cases.test.ts rename to x-pack/plugins/case/server/routes/api/cases/get_all_cases.test.ts index 96c411a746d49..ec56c32f91745 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/get_all_cases.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/get_all_cases.test.ts @@ -4,15 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, } from '../__fixtures__'; -import { initGetAllCasesApi } from '../get_all_cases'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; +import { initGetAllCasesApi } from './get_all_cases'; describe('GET all cases', () => { let routeHandler: RequestHandler; @@ -25,7 +26,11 @@ describe('GET all cases', () => { method: 'get', }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); diff --git a/x-pack/plugins/case/server/routes/api/get_all_cases.ts b/x-pack/plugins/case/server/routes/api/cases/get_all_cases.ts similarity index 52% rename from x-pack/plugins/case/server/routes/api/get_all_cases.ts rename to x-pack/plugins/case/server/routes/api/cases/get_all_cases.ts index ba26a07dc2394..96b8e8c110c01 100644 --- a/x-pack/plugins/case/server/routes/api/get_all_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/get_all_cases.ts @@ -4,37 +4,45 @@ * you may not use this file except in compliance with the Elastic License. */ -import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '.'; -import { formatAllCases, sortToSnake, wrapError } from './utils'; -import { SavedObjectsFindOptionsSchema } from './schema'; -import { AllCases } from './types'; +import Boom from 'boom'; + +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import { CasesResponseRt, SavedObjectFindOptionsRt, throwErrors } from '../../../../common/api'; +import { transformCases, sortToSnake, wrapError, escapeHatch } from '../utils'; +import { RouteDeps } from '../types'; export function initGetAllCasesApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases', + path: '/api/cases/_find', validate: { - query: schema.nullable(SavedObjectsFindOptionsSchema), + query: escapeHatch, }, }, async (context, request, response) => { try { - const args = request.query + const query = pipe( + SavedObjectFindOptionsRt.decode(request.query), + fold(throwErrors(Boom.badRequest), identity) + ); + + const args = query ? { client: context.core.savedObjects.client, options: { - ...request.query, - sortField: sortToSnake(request.query.sortField ?? ''), + ...query, + sortField: sortToSnake(query.sortField ?? ''), }, } : { client: context.core.savedObjects.client, }; const cases = await caseService.getAllCases(args); - const body: AllCases = formatAllCases(cases); return response.ok({ - body, + body: CasesResponseRt.encode(transformCases(cases)), }); } catch (error) { return response.customError(wrapError(error)); diff --git a/x-pack/plugins/case/server/routes/api/__tests__/get_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/get_case.test.ts similarity index 74% rename from x-pack/plugins/case/server/routes/api/__tests__/get_case.test.ts rename to x-pack/plugins/case/server/routes/api/cases/get_case.test.ts index 60becf1228a0c..5912df2c40aa3 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/get_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/get_case.test.ts @@ -4,18 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler, SavedObject } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + +import { CaseAttributes } from '../../../../common/api'; import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, mockCasesErrorTriggerData, + mockCaseComments, } from '../__fixtures__'; -import { initGetCaseApi } from '../get_case'; -import { kibanaResponseFactory, RequestHandler, SavedObject } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; import { flattenCaseSavedObject } from '../utils'; -import { CaseAttributes } from '../types'; +import { initGetCaseApi } from './get_case'; describe('GET case', () => { let routeHandler: RequestHandler; @@ -24,17 +26,21 @@ describe('GET case', () => { }); it(`returns the case with empty case comments when includeComments is false`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases/{case_id}', + method: 'get', params: { - id: 'mock-id-1', + case_id: 'mock-id-1', }, - method: 'get', query: { includeComments: false, }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); @@ -49,17 +55,21 @@ describe('GET case', () => { }); it(`returns an error when thrown from getCase`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases/{case_id}', + method: 'get', params: { - id: 'abcdefg', + case_id: 'abcdefg', }, - method: 'get', query: { includeComments: false, }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); @@ -68,17 +78,22 @@ describe('GET case', () => { }); it(`returns the case with case comments when includeComments is true`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases/{case_id}', + method: 'get', params: { - id: 'mock-id-1', + case_id: 'mock-id-1', }, - method: 'get', query: { includeComments: true, }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); @@ -87,18 +102,20 @@ describe('GET case', () => { }); it(`returns an error when thrown from getAllCaseComments`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases/{case_id}', + method: 'get', params: { - id: 'bad-guy', + case_id: 'bad-guy', }, - method: 'get', query: { includeComments: true, }, }); const theContext = createRouteContext( - createMockSavedObjectsRepository(mockCasesErrorTriggerData) + createMockSavedObjectsRepository({ + caseSavedObject: mockCasesErrorTriggerData, + }) ); const response = await routeHandler(theContext, request, kibanaResponseFactory); diff --git a/x-pack/plugins/case/server/routes/api/get_case.ts b/x-pack/plugins/case/server/routes/api/cases/get_case.ts similarity index 58% rename from x-pack/plugins/case/server/routes/api/get_case.ts rename to x-pack/plugins/case/server/routes/api/cases/get_case.ts index 2481197000beb..1415513bca346 100644 --- a/x-pack/plugins/case/server/routes/api/get_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/get_case.ts @@ -5,16 +5,18 @@ */ import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '.'; -import { flattenCaseSavedObject, wrapError } from './utils'; + +import { CaseResponseRt } from '../../../../common/api'; +import { RouteDeps } from '../types'; +import { flattenCaseSavedObject, wrapError } from '../utils'; export function initGetCaseApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/{id}', + path: '/api/cases/{case_id}', validate: { params: schema.object({ - id: schema.string(), + case_id: schema.string(), }), query: schema.object({ includeComments: schema.string({ defaultValue: 'true' }), @@ -22,26 +24,25 @@ export function initGetCaseApi({ caseService, router }: RouteDeps) { }, }, async (context, request, response) => { - let theCase; - const includeComments = JSON.parse(request.query.includeComments); try { - theCase = await caseService.getCase({ + const includeComments = JSON.parse(request.query.includeComments); + + const theCase = await caseService.getCase({ client: context.core.savedObjects.client, - caseId: request.params.id, + caseId: request.params.case_id, }); - } catch (error) { - return response.customError(wrapError(error)); - } - if (!includeComments) { - return response.ok({ body: flattenCaseSavedObject(theCase, []) }); - } - try { + + if (!includeComments) { + return response.ok({ body: CaseResponseRt.encode(flattenCaseSavedObject(theCase, [])) }); + } + const theComments = await caseService.getAllCaseComments({ client: context.core.savedObjects.client, - caseId: request.params.id, + caseId: request.params.case_id, }); + return response.ok({ - body: { ...flattenCaseSavedObject(theCase, theComments.saved_objects) }, + body: CaseResponseRt.encode(flattenCaseSavedObject(theCase, theComments.saved_objects)), }); } catch (error) { return response.customError(wrapError(error)); diff --git a/x-pack/plugins/case/server/routes/api/__tests__/update_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/patch_case.test.ts similarity index 69% rename from x-pack/plugins/case/server/routes/api/__tests__/update_case.test.ts rename to x-pack/plugins/case/server/routes/api/cases/patch_case.test.ts index 25d5cafb4bb06..42fe9967ad0a0 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/update_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/patch_case.test.ts @@ -4,35 +4,39 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, + mockCaseComments, } from '../__fixtures__'; -import { initUpdateCaseApi } from '../update_case'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; +import { initPatchCaseApi } from './patch_case'; -describe('UPDATE case', () => { +describe('PATCH case', () => { let routeHandler: RequestHandler; beforeAll(async () => { - routeHandler = await createRoute(initUpdateCaseApi, 'patch'); + routeHandler = await createRoute(initPatchCaseApi, 'patch'); }); - it(`Updates a case`, async () => { + it(`Patch a case`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'patch', - params: { - id: 'mock-id-1', - }, body: { - case: { state: 'closed' }, + id: 'mock-id-1', + state: 'closed', version: 'WzAsMV0=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); @@ -41,53 +45,61 @@ describe('UPDATE case', () => { }); it(`Fails with 409 if version does not match`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'patch', - params: { - id: 'mock-id-1', - }, body: { + id: 'mock-id-1', case: { state: 'closed' }, version: 'badv=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(409); }); it(`Fails with 406 if updated field is unchanged`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'patch', - params: { - id: 'mock-id-1', - }, body: { + id: 'mock-id-1', case: { state: 'open' }, version: 'WzAsMV0=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + caseCommentSavedObject: mockCaseComments, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(406); }); it(`Returns an error if updateCase throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{id}', + path: '/api/cases', method: 'patch', - params: { - id: 'mock-id-does-not-exist', - }, body: { + id: 'mock-id-does-not-exist', state: 'closed', + version: 'WzAsMV0=', }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(404); diff --git a/x-pack/plugins/case/server/routes/api/cases/patch_case.ts b/x-pack/plugins/case/server/routes/api/cases/patch_case.ts new file mode 100644 index 0000000000000..eccede372c688 --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/patch_case.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import Boom from 'boom'; +import { difference, get } from 'lodash'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import { + CaseAttributes, + CasePatchRequestRt, + throwErrors, + CaseResponseRt, +} from '../../../../common/api'; +import { escapeHatch, wrapError, flattenCaseSavedObject } from '../utils'; +import { RouteDeps } from '../types'; + +export function initPatchCaseApi({ caseService, router }: RouteDeps) { + router.patch( + { + path: '/api/cases', + validate: { + body: escapeHatch, + }, + }, + async (context, request, response) => { + try { + const query = pipe( + CasePatchRequestRt.decode(request.body), + fold(throwErrors(Boom.badRequest), identity) + ); + const myCase = await caseService.getCase({ + client: context.core.savedObjects.client, + caseId: query.id, + }); + + if (query.version !== myCase.version) { + throw Boom.conflict( + 'This case has been updated. Please refresh before saving additional updates.' + ); + } + const currentCase: CaseAttributes = myCase.attributes; + const updateCase: Partial = Object.entries(query).reduce( + (acc, [key, value]) => { + const currentValue = get(currentCase, key); + if ( + currentValue != null && + Array.isArray(value) && + Array.isArray(currentValue) && + difference(value, currentValue).length !== 0 + ) { + return { + ...acc, + [key]: value, + }; + } else if (currentValue != null && value !== currentValue) { + return { + ...acc, + [key]: value, + }; + } + return acc; + }, + {} + ); + if (Object.keys(updateCase).length > 0) { + const updatedBy = await caseService.getUser({ request, response }); + const { full_name, username } = updatedBy; + const updatedCase = await caseService.patchCase({ + client: context.core.savedObjects.client, + caseId: query.id, + updatedAttributes: { + ...updateCase, + updated_at: new Date().toISOString(), + updated_by: { full_name, username }, + }, + }); + return response.ok({ + body: CaseResponseRt.encode( + flattenCaseSavedObject({ + ...updatedCase, + attributes: { ...myCase.attributes, ...updatedCase.attributes }, + references: myCase.references, + }) + ), + }); + } + throw Boom.notAcceptable('All update fields are identical to current version.'); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/__tests__/post_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts similarity index 82% rename from x-pack/plugins/case/server/routes/api/__tests__/post_case.test.ts rename to x-pack/plugins/case/server/routes/api/cases/post_case.test.ts index 32c7c5a015af0..0d14a659d2c42 100644 --- a/x-pack/plugins/case/server/routes/api/__tests__/post_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts @@ -4,15 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; + import { createMockSavedObjectsRepository, createRoute, createRouteContext, mockCases, } from '../__fixtures__'; -import { initPostCaseApi } from '../post_case'; -import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; -import { httpServerMock } from 'src/core/server/mocks'; +import { initPostCaseApi } from './post_case'; describe('POST cases', () => { let routeHandler: RequestHandler; @@ -31,11 +32,15 @@ describe('POST cases', () => { }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(200); - expect(response.payload.case_id).toEqual('mock-it'); + expect(response.payload.id).toEqual('mock-it'); expect(response.payload.created_by.username).toEqual('awesome'); }); it(`Returns an error if postNewCase throws`, async () => { @@ -50,7 +55,11 @@ describe('POST cases', () => { }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(400); @@ -70,7 +79,11 @@ describe('POST cases', () => { }, }); - const theContext = createRouteContext(createMockSavedObjectsRepository(mockCases)); + const theContext = createRouteContext( + createMockSavedObjectsRepository({ + caseSavedObject: mockCases, + }) + ); const response = await routeHandler(theContext, request, kibanaResponseFactory); expect(response.status).toEqual(500); diff --git a/x-pack/plugins/case/server/routes/api/cases/post_case.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.ts new file mode 100644 index 0000000000000..9e854c3178e1e --- /dev/null +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import Boom from 'boom'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import { flattenCaseSavedObject, transformNewCase, wrapError, escapeHatch } from '../utils'; + +import { CaseRequestRt, throwErrors, CaseResponseRt } from '../../../../common/api'; +import { RouteDeps } from '../types'; + +export function initPostCaseApi({ caseService, router }: RouteDeps) { + router.post( + { + path: '/api/cases', + validate: { + body: escapeHatch, + }, + }, + async (context, request, response) => { + try { + const query = pipe( + CaseRequestRt.decode(request.body), + fold(throwErrors(Boom.badRequest), identity) + ); + + const createdBy = await caseService.getUser({ request, response }); + const createdDate = new Date().toISOString(); + const newCase = await caseService.postNewCase({ + client: context.core.savedObjects.client, + attributes: transformNewCase({ + createdDate, + newCase: query, + ...createdBy, + }), + }); + return response.ok({ body: CaseResponseRt.encode(flattenCaseSavedObject(newCase, [])) }); + } catch (error) { + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/plugins/case/server/routes/api/get_tags.ts b/x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts similarity index 89% rename from x-pack/plugins/case/server/routes/api/get_tags.ts rename to x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts index 1d714db4c0c28..b1a2f10dd6f95 100644 --- a/x-pack/plugins/case/server/routes/api/get_tags.ts +++ b/x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RouteDeps } from './index'; -import { wrapError } from './utils'; +import { RouteDeps } from '../../types'; +import { wrapError } from '../../utils'; export function initGetTagsApi({ caseService, router }: RouteDeps) { router.get( diff --git a/x-pack/plugins/case/server/routes/api/delete_case.ts b/x-pack/plugins/case/server/routes/api/delete_case.ts deleted file mode 100644 index a5ae72b8b46ff..0000000000000 --- a/x-pack/plugins/case/server/routes/api/delete_case.ts +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '.'; -import { wrapError } from './utils'; - -export function initDeleteCaseApi({ caseService, router }: RouteDeps) { - router.delete( - { - path: '/api/cases/{id}', - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - async (context, request, response) => { - let allCaseComments; - try { - await caseService.deleteCase({ - client: context.core.savedObjects.client, - caseId: request.params.id, - }); - } catch (error) { - return response.customError(wrapError(error)); - } - try { - allCaseComments = await caseService.getAllCaseComments({ - client: context.core.savedObjects.client, - caseId: request.params.id, - }); - } catch (error) { - return response.customError(wrapError(error)); - } - try { - if (allCaseComments.saved_objects.length > 0) { - await Promise.all( - allCaseComments.saved_objects.map(({ id }) => - caseService.deleteComment({ - client: context.core.savedObjects.client, - commentId: id, - }) - ) - ); - } - return response.noContent(); - } catch (error) { - return response.customError(wrapError(error)); - } - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/delete_comment.ts b/x-pack/plugins/case/server/routes/api/delete_comment.ts deleted file mode 100644 index 4a540dd9fd69f..0000000000000 --- a/x-pack/plugins/case/server/routes/api/delete_comment.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '.'; -import { wrapError } from './utils'; - -export function initDeleteCommentApi({ caseService, router }: RouteDeps) { - router.delete( - { - path: '/api/cases/comments/{comment_id}', - validate: { - params: schema.object({ - comment_id: schema.string(), - }), - }, - }, - async (context, request, response) => { - const client = context.core.savedObjects.client; - try { - await caseService.deleteComment({ - client, - commentId: request.params.comment_id, - }); - return response.noContent(); - } catch (error) { - return response.customError(wrapError(error)); - } - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/get_comment.ts b/x-pack/plugins/case/server/routes/api/get_comment.ts deleted file mode 100644 index d892b4cfebc3b..0000000000000 --- a/x-pack/plugins/case/server/routes/api/get_comment.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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { RouteDeps } from '.'; -import { flattenCommentSavedObject, wrapError } from './utils'; - -export function initGetCommentApi({ caseService, router }: RouteDeps) { - router.get( - { - path: '/api/cases/comments/{id}', - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - async (context, request, response) => { - try { - const theComment = await caseService.getComment({ - client: context.core.savedObjects.client, - commentId: request.params.id, - }); - return response.ok({ body: flattenCommentSavedObject(theComment) }); - } catch (error) { - return response.customError(wrapError(error)); - } - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/index.ts b/x-pack/plugins/case/server/routes/api/index.ts index 32dfd6a78d1c2..f4dca6a64c8d2 100644 --- a/x-pack/plugins/case/server/routes/api/index.ts +++ b/x-pack/plugins/case/server/routes/api/index.ts @@ -4,35 +4,36 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IRouter } from 'src/core/server'; -import { CaseServiceSetup } from '../../services'; -import { initDeleteCaseApi } from './delete_case'; -import { initDeleteCommentApi } from './delete_comment'; -import { initGetAllCaseCommentsApi } from './get_all_case_comments'; -import { initGetAllCasesApi } from './get_all_cases'; -import { initGetCaseApi } from './get_case'; -import { initGetCommentApi } from './get_comment'; -import { initGetTagsApi } from './get_tags'; -import { initPostCaseApi } from './post_case'; -import { initPostCommentApi } from './post_comment'; -import { initUpdateCaseApi } from './update_case'; -import { initUpdateCommentApi } from './update_comment'; +import { initDeleteCasesApi } from './cases/delete_cases'; +import { initGetAllCasesApi } from './cases/get_all_cases'; +import { initGetCaseApi } from './cases/get_case'; +import { initPatchCaseApi } from './cases/patch_case'; +import { initPostCaseApi } from './cases/post_case'; -export interface RouteDeps { - caseService: CaseServiceSetup; - router: IRouter; -} +import { initDeleteCommentApi } from './cases/comments/delete_comment'; +import { initDeleteAllCommentsApi } from './cases/comments/delete_all_comments'; +import { initFindCaseCommentsApi } from './cases/comments/find_comments'; +import { initGetAllCommentsApi } from './cases/comments/get_all_comment'; +import { initGetCommentApi } from './cases/comments/get_comment'; +import { initPatchCommentApi } from './cases/comments/patch_comment'; +import { initPostCommentApi } from './cases/comments/post_comment'; + +import { initGetTagsApi } from './cases/tags/get_tags'; + +import { RouteDeps } from './types'; export function initCaseApi(deps: RouteDeps) { - initDeleteCaseApi(deps); + initDeleteCasesApi(deps); initDeleteCommentApi(deps); - initGetAllCaseCommentsApi(deps); + initDeleteAllCommentsApi(deps); + initFindCaseCommentsApi(deps); initGetAllCasesApi(deps); initGetCaseApi(deps); initGetCommentApi(deps); + initGetAllCommentsApi(deps); initGetTagsApi(deps); initPostCaseApi(deps); initPostCommentApi(deps); - initUpdateCaseApi(deps); - initUpdateCommentApi(deps); + initPatchCaseApi(deps); + initPatchCommentApi(deps); } diff --git a/x-pack/plugins/case/server/routes/api/post_case.ts b/x-pack/plugins/case/server/routes/api/post_case.ts deleted file mode 100644 index 948bf02d5b3c1..0000000000000 --- a/x-pack/plugins/case/server/routes/api/post_case.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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { flattenCaseSavedObject, formatNewCase, wrapError } from './utils'; -import { NewCaseSchema } from './schema'; -import { RouteDeps } from '.'; - -export function initPostCaseApi({ caseService, router }: RouteDeps) { - router.post( - { - path: '/api/cases', - validate: { - body: NewCaseSchema, - }, - }, - async (context, request, response) => { - let createdBy; - try { - createdBy = await caseService.getUser({ request, response }); - } catch (error) { - return response.customError(wrapError(error)); - } - - try { - const newCase = await caseService.postNewCase({ - client: context.core.savedObjects.client, - attributes: formatNewCase(request.body, { - ...createdBy, - }), - }); - return response.ok({ body: flattenCaseSavedObject(newCase, []) }); - } catch (error) { - return response.customError(wrapError(error)); - } - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/post_comment.ts b/x-pack/plugins/case/server/routes/api/post_comment.ts deleted file mode 100644 index f3f21becddfad..0000000000000 --- a/x-pack/plugins/case/server/routes/api/post_comment.ts +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { flattenCommentSavedObject, formatNewComment, wrapError } from './utils'; -import { NewCommentSchema } from './schema'; -import { RouteDeps } from '.'; -import { CASE_SAVED_OBJECT } from '../../constants'; - -export function initPostCommentApi({ caseService, router }: RouteDeps) { - router.post( - { - path: '/api/cases/{id}/comment', - validate: { - params: schema.object({ - id: schema.string(), - }), - body: NewCommentSchema, - }, - }, - async (context, request, response) => { - let createdBy; - let newComment; - try { - await caseService.getCase({ - client: context.core.savedObjects.client, - caseId: request.params.id, - }); - } catch (error) { - return response.customError(wrapError(error)); - } - try { - createdBy = await caseService.getUser({ request, response }); - } catch (error) { - return response.customError(wrapError(error)); - } - try { - newComment = await caseService.postNewComment({ - client: context.core.savedObjects.client, - attributes: formatNewComment({ - newComment: request.body, - ...createdBy, - }), - references: [ - { - type: CASE_SAVED_OBJECT, - name: `associated-${CASE_SAVED_OBJECT}`, - id: request.params.id, - }, - ], - }); - - return response.ok({ body: flattenCommentSavedObject(newComment) }); - } catch (error) { - return response.customError(wrapError(error)); - } - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/types.ts b/x-pack/plugins/case/server/routes/api/types.ts index 5f1c207bf9829..1252fd19cda02 100644 --- a/x-pack/plugins/case/server/routes/api/types.ts +++ b/x-pack/plugins/case/server/routes/api/types.ts @@ -3,74 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { IRouter } from 'src/core/server'; +import { CaseServiceSetup } from '../../services'; -import { TypeOf } from '@kbn/config-schema'; -import { - CommentSchema, - NewCaseSchema, - NewCommentSchema, - SavedObjectsFindOptionsSchema, - UpdatedCaseSchema, - UpdatedCommentSchema, - UserSchema, -} from './schema'; -import { SavedObjectAttributes } from '../../../../../../src/core/types'; - -export type NewCaseType = TypeOf; -export type CommentAttributes = TypeOf & SavedObjectAttributes; -export type NewCommentType = TypeOf; -export type SavedObjectsFindOptionsType = TypeOf; -export type UpdatedCaseTyped = TypeOf; -export type UpdatedCommentType = TypeOf; -export type UserType = TypeOf; - -export interface CaseAttributes extends NewCaseType, SavedObjectAttributes { - created_at: string; - created_by: UserType; - updated_at: string; -} - -export type FlattenedCaseSavedObject = CaseAttributes & { - case_id: string; - version: string; - comments: FlattenedCommentSavedObject[]; -}; - -export type FlattenedCasesSavedObject = Array< - CaseAttributes & { - case_id: string; - version: string; - // TO DO it is partial because we need to add it the commentCount - commentCount?: number; - } ->; - -export interface AllCases { - cases: FlattenedCasesSavedObject; - page: number; - per_page: number; - total: number; -} - -export type FlattenedCommentSavedObject = CommentAttributes & { - comment_id: string; - version: string; - // TO DO We might want to add the case_id where this comment is related too -}; - -export interface AllComments { - comments: FlattenedCommentSavedObject[]; - page: number; - per_page: number; - total: number; -} - -export interface UpdatedCaseType { - description?: UpdatedCaseTyped['description']; - state?: UpdatedCaseTyped['state']; - tags?: UpdatedCaseTyped['tags']; - title?: UpdatedCaseTyped['title']; - updated_at: string; +export interface RouteDeps { + caseService: CaseServiceSetup; + router: IRouter; } export enum SortFieldCase { @@ -78,7 +16,3 @@ export enum SortFieldCase { state = 'state', updatedAt = 'updated_at', } - -export type Writable = { - -readonly [K in keyof T]: T[K]; -}; diff --git a/x-pack/plugins/case/server/routes/api/update_case.ts b/x-pack/plugins/case/server/routes/api/update_case.ts deleted file mode 100644 index 1c1a56dfe9b3a..0000000000000 --- a/x-pack/plugins/case/server/routes/api/update_case.ts +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { SavedObject } from 'kibana/server'; -import Boom from 'boom'; -import { difference } from 'lodash'; -import { wrapError } from './utils'; -import { RouteDeps } from '.'; -import { UpdateCaseArguments } from './schema'; -import { CaseAttributes, UpdatedCaseTyped, Writable } from './types'; - -interface UpdateCase extends Writable { - [key: string]: any; -} - -export function initUpdateCaseApi({ caseService, router }: RouteDeps) { - router.patch( - { - path: '/api/cases/{id}', - validate: { - params: schema.object({ - id: schema.string(), - }), - body: UpdateCaseArguments, - }, - }, - async (context, request, response) => { - let theCase: SavedObject; - try { - theCase = await caseService.getCase({ - client: context.core.savedObjects.client, - caseId: request.params.id, - }); - } catch (error) { - return response.customError(wrapError(error)); - } - - if (request.body.version !== theCase.version) { - return response.customError( - wrapError( - Boom.conflict( - 'This case has been updated. Please refresh before saving additional updates.' - ) - ) - ); - } - const currentCase = theCase.attributes; - const updateCase: Partial = Object.entries(request.body.case).reduce( - (acc, [key, value]) => { - const currentValue = currentCase[key]; - if ( - Array.isArray(value) && - Array.isArray(currentValue) && - difference(value, currentValue).length !== 0 - ) { - return { - ...acc, - [key]: value, - }; - } else if (value !== currentCase[key]) { - return { - ...acc, - [key]: value, - }; - } - return acc; - }, - {} - ); - if (Object.keys(updateCase).length > 0) { - try { - const updatedCase = await caseService.updateCase({ - client: context.core.savedObjects.client, - caseId: request.params.id, - updatedAttributes: { - ...updateCase, - updated_at: new Date().toISOString(), - }, - }); - return response.ok({ body: { ...updatedCase.attributes, version: updatedCase.version } }); - } catch (error) { - return response.customError(wrapError(error)); - } - } - return response.customError( - wrapError(Boom.notAcceptable('All update fields are identical to current version.')) - ); - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/update_comment.ts b/x-pack/plugins/case/server/routes/api/update_comment.ts deleted file mode 100644 index 9f99253f76629..0000000000000 --- a/x-pack/plugins/case/server/routes/api/update_comment.ts +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { SavedObject } from 'kibana/server'; -import Boom from 'boom'; -import { wrapError } from './utils'; -import { UpdateCommentArguments } from './schema'; -import { RouteDeps } from '.'; -import { CommentAttributes } from './types'; - -export function initUpdateCommentApi({ caseService, router }: RouteDeps) { - router.patch( - { - path: '/api/cases/comment/{id}', - validate: { - params: schema.object({ - id: schema.string(), - }), - body: UpdateCommentArguments, - }, - }, - async (context, request, response) => { - let theComment: SavedObject; - try { - theComment = await caseService.getComment({ - client: context.core.savedObjects.client, - commentId: request.params.id, - }); - } catch (error) { - return response.customError(wrapError(error)); - } - if (request.body.version !== theComment.version) { - return response.customError( - wrapError( - Boom.conflict( - 'This comment has been updated. Please refresh before saving additional updates.' - ) - ) - ); - } - if (request.body.comment === theComment.attributes.comment) { - return response.customError( - wrapError(Boom.notAcceptable('Comment is identical to current version.')) - ); - } - try { - const updatedComment = await caseService.updateComment({ - client: context.core.savedObjects.client, - commentId: request.params.id, - updatedAttributes: { - comment: request.body.comment, - updated_at: new Date().toISOString(), - }, - }); - return response.ok({ - body: { ...updatedComment.attributes, version: updatedComment.version }, - }); - } catch (error) { - return response.customError(wrapError(error)); - } - } - ); -} diff --git a/x-pack/plugins/case/server/routes/api/utils.ts b/x-pack/plugins/case/server/routes/api/utils.ts index 32de41e1c01c5..920c53f404456 100644 --- a/x-pack/plugins/case/server/routes/api/utils.ts +++ b/x-pack/plugins/case/server/routes/api/utils.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { schema } from '@kbn/config-schema'; import { boomify, isBoom } from 'boom'; import { CustomHttpResponseOptions, @@ -12,42 +13,53 @@ import { SavedObjectsFindResponse, } from 'kibana/server'; import { - AllComments, + CaseRequest, + CaseResponse, + CasesResponse, CaseAttributes, + CommentResponse, + CommentsResponse, CommentAttributes, - FlattenedCaseSavedObject, - FlattenedCommentSavedObject, - AllCases, - NewCaseType, - NewCommentType, - SortFieldCase, - UserType, -} from './types'; +} from '../../../common/api'; -export const formatNewCase = ( - newCase: NewCaseType, - { full_name, username }: { full_name?: string; username: string } -): CaseAttributes => ({ - created_at: new Date().toISOString(), +import { SortFieldCase } from './types'; + +export const transformNewCase = ({ + createdDate, + newCase, + full_name, + username, +}: { + createdDate: string; + newCase: CaseRequest; + full_name?: string | null; + username: string | null; +}): CaseAttributes => ({ + comment_ids: [], + created_at: createdDate, created_by: { full_name, username }, - updated_at: new Date().toISOString(), + updated_at: null, + updated_by: null, ...newCase, }); interface NewCommentArgs { - newComment: NewCommentType; - full_name?: UserType['full_name']; - username: UserType['username']; + comment: string; + createdDate: string; + full_name?: string | null; + username: string | null; } -export const formatNewComment = ({ - newComment, +export const transformNewComment = ({ + comment, + createdDate, full_name, username, }: NewCommentArgs): CommentAttributes => ({ - ...newComment, - created_at: new Date().toISOString(), + comment, + created_at: createdDate, created_by: { full_name, username }, - updated_at: new Date().toISOString(), + updated_at: null, + updated_by: null, }); export function wrapError(error: any): CustomHttpResponseOptions { @@ -59,7 +71,7 @@ export function wrapError(error: any): CustomHttpResponseOptions }; } -export const formatAllCases = (cases: SavedObjectsFindResponse): AllCases => ({ +export const transformCases = (cases: SavedObjectsFindResponse): CasesResponse => ({ page: cases.page, per_page: cases.per_page, total: cases.total, @@ -68,27 +80,24 @@ export const formatAllCases = (cases: SavedObjectsFindResponse): export const flattenCaseSavedObjects = ( savedObjects: SavedObjectsFindResponse['saved_objects'] -): FlattenedCaseSavedObject[] => - savedObjects.reduce( - (acc: FlattenedCaseSavedObject[], savedObject: SavedObject) => { - return [...acc, flattenCaseSavedObject(savedObject, [])]; - }, - [] - ); +): CaseResponse[] => + savedObjects.reduce((acc: CaseResponse[], savedObject: SavedObject) => { + return [...acc, flattenCaseSavedObject(savedObject, [])]; + }, []); export const flattenCaseSavedObject = ( savedObject: SavedObject, - comments: Array> -): FlattenedCaseSavedObject => ({ - case_id: savedObject.id, - version: savedObject.version ? savedObject.version : '0', + comments: Array> = [] +): CaseResponse => ({ + id: savedObject.id, + version: savedObject.version ?? '0', comments: flattenCommentSavedObjects(comments), ...savedObject.attributes, }); -export const formatAllComments = ( +export const transformComments = ( comments: SavedObjectsFindResponse -): AllComments => ({ +): CommentsResponse => ({ page: comments.page, per_page: comments.per_page, total: comments.total, @@ -97,19 +106,16 @@ export const formatAllComments = ( export const flattenCommentSavedObjects = ( savedObjects: SavedObjectsFindResponse['saved_objects'] -): FlattenedCommentSavedObject[] => - savedObjects.reduce( - (acc: FlattenedCommentSavedObject[], savedObject: SavedObject) => { - return [...acc, flattenCommentSavedObject(savedObject)]; - }, - [] - ); +): CommentResponse[] => + savedObjects.reduce((acc: CommentResponse[], savedObject: SavedObject) => { + return [...acc, flattenCommentSavedObject(savedObject)]; + }, []); export const flattenCommentSavedObject = ( savedObject: SavedObject -): FlattenedCommentSavedObject => ({ - comment_id: savedObject.id, - version: savedObject.version ? savedObject.version : '0', +): CommentResponse => ({ + id: savedObject.id, + version: savedObject.version ?? '0', ...savedObject.attributes, }); @@ -127,3 +133,5 @@ export const sortToSnake = (sortField: string): SortFieldCase => { return SortFieldCase.createdAt; } }; + +export const escapeHatch = schema.object({}, { allowUnknowns: true }); diff --git a/x-pack/plugins/case/server/saved_object_types/cases.ts b/x-pack/plugins/case/server/saved_object_types/cases.ts new file mode 100644 index 0000000000000..faed0a3100a42 --- /dev/null +++ b/x-pack/plugins/case/server/saved_object_types/cases.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SavedObjectsType } from 'src/core/server'; + +export const CASE_SAVED_OBJECT = 'cases'; + +export const caseSavedObjectType: SavedObjectsType = { + name: CASE_SAVED_OBJECT, + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + comment_ids: { + type: 'keyword', + }, + created_at: { + type: 'date', + }, + created_by: { + properties: { + username: { + type: 'keyword', + }, + full_name: { + type: 'keyword', + }, + }, + }, + description: { + type: 'text', + }, + title: { + type: 'keyword', + }, + state: { + type: 'keyword', + }, + tags: { + type: 'keyword', + }, + updated_at: { + type: 'date', + }, + updated_by: { + properties: { + username: { + type: 'keyword', + }, + full_name: { + type: 'keyword', + }, + }, + }, + }, + }, +}; diff --git a/x-pack/plugins/case/server/saved_object_types/comments.ts b/x-pack/plugins/case/server/saved_object_types/comments.ts new file mode 100644 index 0000000000000..51c31421fec2f --- /dev/null +++ b/x-pack/plugins/case/server/saved_object_types/comments.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SavedObjectsType } from 'src/core/server'; + +export const CASE_COMMENT_SAVED_OBJECT = 'cases-comments'; + +export const caseCommentSavedObjectType: SavedObjectsType = { + name: CASE_COMMENT_SAVED_OBJECT, + hidden: false, + namespaceAgnostic: false, + mappings: { + properties: { + comment: { + type: 'text', + }, + created_at: { + type: 'date', + }, + created_by: { + properties: { + full_name: { + type: 'keyword', + }, + username: { + type: 'keyword', + }, + }, + }, + updated_at: { + type: 'date', + }, + updated_by: { + properties: { + username: { + type: 'keyword', + }, + full_name: { + type: 'keyword', + }, + }, + }, + }, + }, +}; diff --git a/x-pack/plugins/case/server/saved_object_types/index.ts b/x-pack/plugins/case/server/saved_object_types/index.ts new file mode 100644 index 0000000000000..1e29b9dd98ead --- /dev/null +++ b/x-pack/plugins/case/server/saved_object_types/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; + * you may not use this file except in compliance with the Elastic License. + */ + +export { caseSavedObjectType, CASE_SAVED_OBJECT } from './cases'; +export { caseCommentSavedObjectType, CASE_COMMENT_SAVED_OBJECT } from './comments'; diff --git a/x-pack/plugins/case/server/services/index.ts b/x-pack/plugins/case/server/services/index.ts index e6416e268e30b..61b696d45d030 100644 --- a/x-pack/plugins/case/server/services/index.ts +++ b/x-pack/plugins/case/server/services/index.ts @@ -14,15 +14,10 @@ import { SavedObjectsUpdateResponse, SavedObjectReference, } from 'kibana/server'; -import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT } from '../constants'; -import { - CaseAttributes, - CommentAttributes, - SavedObjectsFindOptionsType, - UpdatedCaseType, - UpdatedCommentType, -} from '../routes/api/types'; + import { AuthenticatedUser, SecurityPluginSetup } from '../../../security/server'; +import { CaseAttributes, CommentAttributes, SavedObjectFindOptions } from '../../common/api'; +import { CASE_SAVED_OBJECT, CASE_COMMENT_SAVED_OBJECT } from '../saved_object_types'; import { readTags } from './tags/read_tags'; interface ClientArgs { @@ -33,8 +28,12 @@ interface GetCaseArgs extends ClientArgs { caseId: string; } +interface GetCommentsArgs extends GetCaseArgs { + options?: SavedObjectFindOptions; +} + interface GetCasesArgs extends ClientArgs { - options?: SavedObjectsFindOptionsType; + options?: SavedObjectFindOptions; } interface GetCommentArgs extends ClientArgs { commentId: string; @@ -47,13 +46,13 @@ interface PostCommentArgs extends ClientArgs { attributes: CommentAttributes; references: SavedObjectReference[]; } -interface UpdateCaseArgs extends ClientArgs { +interface PatchCaseArgs extends ClientArgs { caseId: string; - updatedAttributes: UpdatedCaseType; + updatedAttributes: Partial; } interface UpdateCommentArgs extends ClientArgs { commentId: string; - updatedAttributes: UpdatedCommentType; + updatedAttributes: Partial; } interface GetUserArgs { @@ -68,15 +67,15 @@ export interface CaseServiceSetup { deleteCase(args: GetCaseArgs): Promise<{}>; deleteComment(args: GetCommentArgs): Promise<{}>; getAllCases(args: GetCasesArgs): Promise>; - getAllCaseComments(args: GetCaseArgs): Promise>; + getAllCaseComments(args: GetCommentsArgs): Promise>; getCase(args: GetCaseArgs): Promise>; getComment(args: GetCommentArgs): Promise>; getTags(args: ClientArgs): Promise; getUser(args: GetUserArgs): Promise; postNewCase(args: PostCaseArgs): Promise>; postNewComment(args: PostCommentArgs): Promise>; - updateCase(args: UpdateCaseArgs): Promise>; - updateComment(args: UpdateCommentArgs): Promise>; + patchCase(args: PatchCaseArgs): Promise>; + patchComment(args: UpdateCommentArgs): Promise>; } export class CaseService { @@ -127,10 +126,11 @@ export class CaseService { throw error; } }, - getAllCaseComments: async ({ client, caseId }: GetCaseArgs) => { + getAllCaseComments: async ({ client, caseId, options }: GetCommentsArgs) => { try { this.log.debug(`Attempting to GET all comments for case ${caseId}`); return await client.find({ + ...options, type: CASE_COMMENT_SAVED_OBJECT, hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, }); @@ -175,7 +175,7 @@ export class CaseService { throw error; } }, - updateCase: async ({ client, caseId, updatedAttributes }: UpdateCaseArgs) => { + patchCase: async ({ client, caseId, updatedAttributes }: PatchCaseArgs) => { try { this.log.debug(`Attempting to UPDATE case ${caseId}`); return await client.update(CASE_SAVED_OBJECT, caseId, { ...updatedAttributes }); @@ -184,7 +184,7 @@ export class CaseService { throw error; } }, - updateComment: async ({ client, commentId, updatedAttributes }: UpdateCommentArgs) => { + patchComment: async ({ client, commentId, updatedAttributes }: UpdateCommentArgs) => { try { this.log.debug(`Attempting to UPDATE comment ${commentId}`); return await client.update(CASE_COMMENT_SAVED_OBJECT, commentId, { diff --git a/x-pack/plugins/case/server/services/tags/read_tags.ts b/x-pack/plugins/case/server/services/tags/read_tags.ts index da5905fe4ea35..ddb79507b5fef 100644 --- a/x-pack/plugins/case/server/services/tags/read_tags.ts +++ b/x-pack/plugins/case/server/services/tags/read_tags.ts @@ -5,8 +5,9 @@ */ import { SavedObject, SavedObjectsClientContract } from 'kibana/server'; -import { CASE_SAVED_OBJECT } from '../../constants'; -import { CaseAttributes } from '../..'; + +import { CaseAttributes } from '../../../common/api'; +import { CASE_SAVED_OBJECT } from '../../saved_object_types'; const DEFAULT_PER_PAGE: number = 1000; @@ -23,7 +24,7 @@ export const convertTagsToSet = (tagObjects: Array>) return new Set(convertToTags(tagObjects)); }; -// Note: This is doing an in-memory aggregation of the tags by calling each of the alerting +// Note: This is doing an in-memory aggregation of the tags by calling each of the case // records in batches of this const setting and uses the fields to try to get the least // amount of data per record back. If saved objects at some point supports aggregations // then this should be replaced with a an aggregation call. diff --git a/x-pack/tsconfig.json b/x-pack/tsconfig.json index 31ef0bef18a85..a6c94ff74620e 100644 --- a/x-pack/tsconfig.json +++ b/x-pack/tsconfig.json @@ -43,4 +43,4 @@ "jest" ] } -} \ No newline at end of file +} From 893d8da1d8739ee28adef8d1cd1e784b4ef5d33d Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Thu, 5 Mar 2020 22:26:36 -0700 Subject: [PATCH 23/25] [Reporting/Screenshots] Handle page setup errors and capture the page, don't fail the job (#58683) * [Reporting] Handle error if intercepted request could not be continued * [Reporting/Screenshots] Handle page setup errors and capture the page with errors shown * show warnings in UI * i18n todos * Cleanup an old troubleshooting task * set the default for all new timeout settings to 30 seconds * fix some tests * update error strings * Cleanup 2 * fix tests 2 * polish the job info map status items * More error message updating * Log the error that was caught * Oops fix ts * add documentation * fix i18n * fix mocha test * use the openUrl timeout as the default for navigation * fix comment Co-authored-by: Elastic Machine --- docs/settings/reporting-settings.asciidoc | 22 +++ .../__snapshots__/index.test.js.snap | 20 ++ x-pack/legacy/plugins/reporting/config.ts | 11 ++ .../export_types/common/constants.ts | 2 +- .../export_types/common/layouts/layout.ts | 8 +- .../common/layouts/preserve_layout.ts | 4 +- .../common/lib/screenshots/check_for_toast.ts | 58 ------ .../common/lib/screenshots/constants.ts | 2 +- .../screenshots/get_element_position_data.ts | 89 +++++---- .../lib/screenshots/get_number_of_items.ts | 72 +++++-- .../common/lib/screenshots/get_screenshots.ts | 40 ++-- .../common/lib/screenshots/inject_css.ts | 40 ++-- .../common/lib/screenshots/observable.test.ts | 60 ++++-- .../common/lib/screenshots/observable.ts | 77 +++++--- .../common/lib/screenshots/open_url.ts | 37 +++- .../common/lib/screenshots/scan_page.ts | 30 --- .../common/lib/screenshots/types.ts | 7 + .../lib/screenshots/wait_for_dom_elements.ts | 34 ---- .../common/lib/screenshots/wait_for_render.ts | 15 +- .../screenshots/wait_for_visualizations.ts | 67 +++++++ .../png/server/execute_job/index.test.js | 2 +- .../png/server/execute_job/index.ts | 19 +- .../png/server/lib/generate_png.ts | 25 ++- .../server/execute_job/index.test.js | 2 +- .../printable_pdf/server/execute_job/index.ts | 26 ++- .../printable_pdf/server/lib/generate_pdf.ts | 33 ++-- .../public/components/report_info_button.tsx | 181 +++++++++--------- .../public/components/report_listing.tsx | 24 ++- .../reporting/public/lib/job_queue_client.ts | 1 + .../chromium/driver/chromium_driver.ts | 120 +++++++----- .../browsers/chromium/driver_factory/index.ts | 29 ++- .../server/browsers/chromium/index.ts | 13 +- .../browsers/create_browser_driver_factory.ts | 10 +- .../reporting/server/lib/esqueue/worker.js | 10 +- .../create_mock_browserdriverfactory.ts | 18 +- .../create_mock_layoutinstance.ts | 1 - .../plugins/reporting/test_helpers/index.ts | 2 +- x-pack/legacy/plugins/reporting/types.d.ts | 8 +- .../translations/translations/ja-JP.json | 4 - .../translations/translations/zh-CN.json | 4 - 40 files changed, 724 insertions(+), 503 deletions(-) delete mode 100644 x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/check_for_toast.ts delete mode 100644 x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/scan_page.ts delete mode 100644 x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_dom_elements.ts create mode 100644 x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts diff --git a/docs/settings/reporting-settings.asciidoc b/docs/settings/reporting-settings.asciidoc index a9fa2bd18d315..9a45fb9ab1d0c 100644 --- a/docs/settings/reporting-settings.asciidoc +++ b/docs/settings/reporting-settings.asciidoc @@ -95,6 +95,8 @@ index for any pending Reporting jobs. Defaults to `3000` (3 seconds). [[xpack-reporting-q-timeout]]`xpack.reporting.queue.timeout`:: How long each worker has to produce a report. If your machine is slow or under heavy load, you might need to increase this timeout. Specified in milliseconds. +If a Reporting job execution time goes over this time limit, the job will be +marked as a failure and there will not be a download available. Defaults to `120000` (two minutes). [float] @@ -104,6 +106,26 @@ Defaults to `120000` (two minutes). Reporting works by capturing screenshots from Kibana. The following settings control the capturing process. +`xpack.reporting.capture.timeouts.openUrl`:: +How long to allow the Reporting browser to wait for the initial data of the +Kibana page to load. Defaults to `30000` (30 seconds). + +`xpack.reporting.capture.timeouts.waitForElements`:: +How long to allow the Reporting browser to wait for the visualization panels to +load on the Kibana page. Defaults to `30000` (30 seconds). + +`xpack.reporting.capture.timeouts.renderComplete`:: +How long to allow the Reporting brwoser to wait for each visualization to +signal that it is done renderings. Defaults to `30000` (30 seconds). + +[NOTE] +============ +If any timeouts from `xpack.reporting.capture.timeouts.*` settings occur when +running a report job, Reporting will log the error and try to continue +capturing the page with a screenshot. As a result, a download will be +available, but there will likely be errors in the visualizations in the report. +============ + `xpack.reporting.capture.maxAttempts`:: If capturing a report fails for any reason, Kibana will re-attempt othe reporting job, as many times as this setting. Defaults to `3`. diff --git a/x-pack/legacy/plugins/reporting/__snapshots__/index.test.js.snap b/x-pack/legacy/plugins/reporting/__snapshots__/index.test.js.snap index 469f5e6e7b3c6..757677f1d4f82 100644 --- a/x-pack/legacy/plugins/reporting/__snapshots__/index.test.js.snap +++ b/x-pack/legacy/plugins/reporting/__snapshots__/index.test.js.snap @@ -47,6 +47,11 @@ Object { }, "settleTime": 1000, "timeout": 20000, + "timeouts": Object { + "openUrl": 30000, + "renderComplete": 30000, + "waitForElements": 30000, + }, "viewport": Object { "height": 1200, "width": 1950, @@ -138,6 +143,11 @@ Object { }, "settleTime": 1000, "timeout": 20000, + "timeouts": Object { + "openUrl": 30000, + "renderComplete": 30000, + "waitForElements": 30000, + }, "viewport": Object { "height": 1200, "width": 1950, @@ -228,6 +238,11 @@ Object { }, "settleTime": 1000, "timeout": 20000, + "timeouts": Object { + "openUrl": 30000, + "renderComplete": 30000, + "waitForElements": 30000, + }, "viewport": Object { "height": 1200, "width": 1950, @@ -319,6 +334,11 @@ Object { }, "settleTime": 1000, "timeout": 20000, + "timeouts": Object { + "openUrl": 30000, + "renderComplete": 30000, + "waitForElements": 30000, + }, "viewport": Object { "height": 1200, "width": 1950, diff --git a/x-pack/legacy/plugins/reporting/config.ts b/x-pack/legacy/plugins/reporting/config.ts index 34fc1f452fbc0..211fa70301bbf 100644 --- a/x-pack/legacy/plugins/reporting/config.ts +++ b/x-pack/legacy/plugins/reporting/config.ts @@ -31,6 +31,17 @@ export async function config(Joi: any) { .default(120000), }).default(), capture: Joi.object({ + timeouts: Joi.object({ + openUrl: Joi.number() + .integer() + .default(30000), + waitForElements: Joi.number() + .integer() + .default(30000), + renderComplete: Joi.number() + .integer() + .default(30000), + }).default(), networkPolicy: Joi.object({ enabled: Joi.boolean().default(true), rules: Joi.array() diff --git a/x-pack/legacy/plugins/reporting/export_types/common/constants.ts b/x-pack/legacy/plugins/reporting/export_types/common/constants.ts index 02a3e787da750..254cfbaa878bd 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/constants.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/constants.ts @@ -9,4 +9,4 @@ export const LayoutTypes = { PRINT: 'print', }; -export const WAITFOR_SELECTOR = '.application'; +export const PAGELOAD_SELECTOR = '.application'; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts b/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts index 54fae60a0773c..2c43517dbcaa9 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts @@ -27,7 +27,6 @@ export interface LayoutSelectorDictionary { renderComplete: string; itemsCountAttribute: string; timefilterDurationAttribute: string; - toastHeader: string; } export interface PdfImageSize { @@ -40,7 +39,6 @@ export const getDefaultLayoutSelectors = (): LayoutSelectorDictionary => ({ renderComplete: '[data-shared-item]', itemsCountAttribute: 'data-shared-items-count', timefilterDurationAttribute: 'data-shared-timefilter-duration', - toastHeader: '[data-test-subj="euiToastHeader"]', }); export abstract class Layout { @@ -75,9 +73,11 @@ export interface LayoutParams { dimensions: Size; } -export type LayoutInstance = Layout & { +interface LayoutSelectors { // Fields that are not part of Layout: the instances // independently implement these fields on their own selectors: LayoutSelectorDictionary; positionElements?: (browser: HeadlessChromiumDriver, logger: LevelLogger) => Promise; -}; +} + +export type LayoutInstance = Layout & LayoutSelectors & Size; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/layouts/preserve_layout.ts b/x-pack/legacy/plugins/reporting/export_types/common/layouts/preserve_layout.ts index cfa421b6f66ab..07dbba7d25883 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/layouts/preserve_layout.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/layouts/preserve_layout.ts @@ -19,8 +19,8 @@ const ZOOM: number = 2; export class PreserveLayout extends Layout { public readonly selectors: LayoutSelectorDictionary = getDefaultLayoutSelectors(); public readonly groupCount = 1; - private readonly height: number; - private readonly width: number; + public readonly height: number; + public readonly width: number; private readonly scaledHeight: number; private readonly scaledWidth: number; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/check_for_toast.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/check_for_toast.ts deleted file mode 100644 index c888870bd2bc3..0000000000000 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/check_for_toast.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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; -import { ElementHandle } from 'puppeteer'; -import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; -import { LayoutInstance } from '../../layouts/layout'; -import { CONTEXT_CHECKFORTOASTMESSAGE } from './constants'; - -export const checkForToastMessage = async ( - browser: HeadlessBrowser, - layout: LayoutInstance, - logger: LevelLogger -): Promise> => { - return await browser - .waitForSelector(layout.selectors.toastHeader, { silent: true }, logger) - .then(async () => { - // Check for a toast message on the page. If there is one, capture the - // message and throw an error, to fail the screenshot. - const toastHeaderText: string = await browser.evaluate( - { - fn: selector => { - const nodeList = document.querySelectorAll(selector); - return nodeList.item(0).innerText; - }, - args: [layout.selectors.toastHeader], - }, - { context: CONTEXT_CHECKFORTOASTMESSAGE }, - logger - ); - - // Log an error to track the event in kibana server logs - logger.error( - i18n.translate( - 'xpack.reporting.exportTypes.printablePdf.screenshots.unexpectedErrorMessage', - { - defaultMessage: 'Encountered an unexpected message on the page: {toastHeaderText}', - values: { toastHeaderText }, - } - ) - ); - - // Throw an error to fail the screenshot job with a message - throw new Error( - i18n.translate( - 'xpack.reporting.exportTypes.printablePdf.screenshots.unexpectedErrorMessage', - { - defaultMessage: 'Encountered an unexpected message on the page: {toastHeaderText}', - values: { toastHeaderText }, - } - ) - ); - }); -}; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/constants.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/constants.ts index bbc97ca57940c..a3faf9337524e 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/constants.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/constants.ts @@ -9,6 +9,6 @@ export const CONTEXT_INJECTCSS = 'InjectCss'; export const CONTEXT_WAITFORRENDER = 'WaitForRender'; export const CONTEXT_GETTIMERANGE = 'GetTimeRange'; export const CONTEXT_ELEMENTATTRIBUTES = 'ElementPositionAndAttributes'; -export const CONTEXT_CHECKFORTOASTMESSAGE = 'CheckForToastMessage'; export const CONTEXT_WAITFORELEMENTSTOBEINDOM = 'WaitForElementsToBeInDOM'; export const CONTEXT_SKIPTELEMETRY = 'SkipTelemetry'; +export const CONTEXT_READMETADATA = 'ReadVisualizationsMetadata'; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts index 4302f4c631e3c..2f93765165e50 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; import { LayoutInstance } from '../../layouts/layout'; import { AttributesMap, ElementsPositionAndAttribute } from './types'; @@ -14,50 +15,58 @@ export const getElementPositionAndAttributes = async ( browser: HeadlessBrowser, layout: LayoutInstance, logger: Logger -): Promise => { - const elementsPositionAndAttributes: ElementsPositionAndAttribute[] = await browser.evaluate( - { - fn: (selector: string, attributes: any) => { - const elements: NodeListOf = document.querySelectorAll(selector); +): Promise => { + const { screenshot: screenshotSelector } = layout.selectors; // data-shared-items-container + let elementsPositionAndAttributes: ElementsPositionAndAttribute[] | null; + try { + elementsPositionAndAttributes = await browser.evaluate( + { + fn: (selector, attributes) => { + const elements: NodeListOf = document.querySelectorAll(selector); - // NodeList isn't an array, just an iterator, unable to use .map/.forEach - const results: ElementsPositionAndAttribute[] = []; - for (let i = 0; i < elements.length; i++) { - const element = elements[i]; - const boundingClientRect = element.getBoundingClientRect() as DOMRect; - results.push({ - position: { - boundingClientRect: { - // modern browsers support x/y, but older ones don't - top: boundingClientRect.y || boundingClientRect.top, - left: boundingClientRect.x || boundingClientRect.left, - width: boundingClientRect.width, - height: boundingClientRect.height, + // NodeList isn't an array, just an iterator, unable to use .map/.forEach + const results: ElementsPositionAndAttribute[] = []; + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + const boundingClientRect = element.getBoundingClientRect() as DOMRect; + results.push({ + position: { + boundingClientRect: { + // modern browsers support x/y, but older ones don't + top: boundingClientRect.y || boundingClientRect.top, + left: boundingClientRect.x || boundingClientRect.left, + width: boundingClientRect.width, + height: boundingClientRect.height, + }, + scroll: { + x: window.scrollX, + y: window.scrollY, + }, }, - scroll: { - x: window.scrollX, - y: window.scrollY, - }, - }, - attributes: Object.keys(attributes).reduce((result: AttributesMap, key) => { - const attribute = attributes[key]; - (result as any)[key] = element.getAttribute(attribute); - return result; - }, {} as AttributesMap), - }); - } - return results; + attributes: Object.keys(attributes).reduce((result: AttributesMap, key) => { + const attribute = attributes[key]; + (result as any)[key] = element.getAttribute(attribute); + return result; + }, {} as AttributesMap), + }); + } + return results; + }, + args: [screenshotSelector, { title: 'data-title', description: 'data-description' }], }, - args: [layout.selectors.screenshot, { title: 'data-title', description: 'data-description' }], - }, - { context: CONTEXT_ELEMENTATTRIBUTES }, - logger - ); - - if (elementsPositionAndAttributes.length === 0) { - throw new Error( - `No shared items containers were found on the page! Reporting requires a container element with the '${layout.selectors.screenshot}' attribute on the page.` + { context: CONTEXT_ELEMENTATTRIBUTES }, + logger ); + + if (!elementsPositionAndAttributes || elementsPositionAndAttributes.length === 0) { + throw new Error( + i18n.translate('xpack.reporting.screencapture.noElements', { + defaultMessage: `An error occurred while reading the page for visualization panels: no panels were found.`, + }) + ); + } + } catch (err) { + elementsPositionAndAttributes = null; } return elementsPositionAndAttributes; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts index 1beae719cd6b0..16eb433e8a75e 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts @@ -4,38 +4,72 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; import { LevelLogger } from '../../../../server/lib'; +import { ServerFacade } from '../../../../types'; import { LayoutInstance } from '../../layouts/layout'; -import { CONTEXT_GETNUMBEROFITEMS } from './constants'; +import { CONTEXT_GETNUMBEROFITEMS, CONTEXT_READMETADATA } from './constants'; export const getNumberOfItems = async ( + server: ServerFacade, browser: HeadlessBrowser, layout: LayoutInstance, logger: LevelLogger ): Promise => { - logger.debug('determining how many rendered items to wait for'); + const config = server.config(); + const { renderComplete: renderCompleteSelector, itemsCountAttribute } = layout.selectors; + let itemsCount: number; - // returns the value of the `itemsCountAttribute` if it's there, otherwise - // we just count the number of `itemSelector` - const itemsCount: number = await browser.evaluate( - { - fn: (selector, countAttribute) => { - const elementWithCount = document.querySelector(`[${countAttribute}]`); - if (elementWithCount && elementWithCount != null) { - const count = elementWithCount.getAttribute(countAttribute); - if (count && count != null) { - return parseInt(count, 10); + logger.debug( + i18n.translate('xpack.reporting.screencapture.logWaitingForElements', { + defaultMessage: 'waiting for elements or items count attribute; or not found to interrupt', + }) + ); + + try { + // the dashboard is using the `itemsCountAttribute` attribute to let us + // know how many items to expect since gridster incrementally adds panels + // we have to use this hint to wait for all of them + await browser.waitForSelector( + `${renderCompleteSelector},[${itemsCountAttribute}]`, + { timeout: config.get('xpack.reporting.capture.timeouts.waitForElements') }, + { context: CONTEXT_READMETADATA }, + logger + ); + + // returns the value of the `itemsCountAttribute` if it's there, otherwise + // we just count the number of `itemSelector`: the number of items already rendered + itemsCount = await browser.evaluate( + { + fn: (selector, countAttribute) => { + const elementWithCount = document.querySelector(`[${countAttribute}]`); + if (elementWithCount && elementWithCount != null) { + const count = elementWithCount.getAttribute(countAttribute); + if (count && count != null) { + return parseInt(count, 10); + } } - } - return document.querySelectorAll(selector).length; + return document.querySelectorAll(selector).length; + }, + args: [renderCompleteSelector, itemsCountAttribute], }, - args: [layout.selectors.renderComplete, layout.selectors.itemsCountAttribute], - }, - { context: CONTEXT_GETNUMBEROFITEMS }, - logger - ); + { context: CONTEXT_GETNUMBEROFITEMS }, + logger + ); + } catch (err) { + throw new Error( + i18n.translate('xpack.reporting.screencapture.readVisualizationsError', { + defaultMessage: `An error occurred when trying to read the page for visualization panel info. You may need to increase '{configKey}'. {error}`, + values: { + error: err, + configKey: 'xpack.reporting.capture.timeouts.waitForElements', + }, + }) + ); + itemsCount = 1; + } return itemsCount; }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts index b21d1e752ba3f..d50ac64743f07 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; import { LevelLogger } from '../../../../server/lib'; import { Screenshot, ElementsPositionAndAttribute } from './types'; @@ -12,21 +13,29 @@ const getAsyncDurationLogger = (logger: LevelLogger) => { return async (description: string, promise: Promise) => { const start = Date.now(); const result = await promise; - logger.debug(`${description} took ${Date.now() - start}ms`); + logger.debug( + i18n.translate('xpack.reporting.screencapture.asyncTook', { + defaultMessage: '{description} took {took}ms', + values: { + description, + took: Date.now() - start, + }, + }) + ); return result; }; }; -export const getScreenshots = async ({ - browser, - elementsPositionAndAttributes, - logger, -}: { - logger: LevelLogger; - browser: HeadlessBrowser; - elementsPositionAndAttributes: ElementsPositionAndAttribute[]; -}): Promise => { - logger.info(`taking screenshots`); +export const getScreenshots = async ( + browser: HeadlessBrowser, + elementsPositionAndAttributes: ElementsPositionAndAttribute[], + logger: LevelLogger +): Promise => { + logger.info( + i18n.translate('xpack.reporting.screencapture.takingScreenshots', { + defaultMessage: `taking screenshots`, + }) + ); const asyncDurationLogger = getAsyncDurationLogger(logger); const screenshots: Screenshot[] = []; @@ -45,7 +54,14 @@ export const getScreenshots = async ({ }); } - logger.info(`screenshots taken: ${screenshots.length}`); + logger.info( + i18n.translate('xpack.reporting.screencapture.screenshotsTaken', { + defaultMessage: `screenshots taken: {numScreenhots}`, + values: { + numScreenhots: screenshots.length, + }, + }) + ); return screenshots; }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts index 40204804a276f..cb2673e85186b 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import fs from 'fs'; import { promisify } from 'util'; import { LevelLogger } from '../../../../server/lib'; @@ -18,21 +19,34 @@ export const injectCustomCss = async ( layout: Layout, logger: LevelLogger ): Promise => { - logger.debug('injecting custom css'); + logger.debug( + i18n.translate('xpack.reporting.screencapture.injectingCss', { + defaultMessage: 'injecting custom css', + }) + ); const filePath = layout.getCssOverridesPath(); const buffer = await fsp.readFile(filePath); - await browser.evaluate( - { - fn: css => { - const node = document.createElement('style'); - node.type = 'text/css'; - node.innerHTML = css; // eslint-disable-line no-unsanitized/property - document.getElementsByTagName('head')[0].appendChild(node); + try { + await browser.evaluate( + { + fn: css => { + const node = document.createElement('style'); + node.type = 'text/css'; + node.innerHTML = css; // eslint-disable-line no-unsanitized/property + document.getElementsByTagName('head')[0].appendChild(node); + }, + args: [buffer.toString()], }, - args: [buffer.toString()], - }, - { context: CONTEXT_INJECTCSS }, - logger - ); + { context: CONTEXT_INJECTCSS }, + logger + ); + } catch (err) { + throw new Error( + i18n.translate('xpack.reporting.screencapture.injectCss', { + defaultMessage: `An error occurred when trying to update Kibana CSS for reporting. {error}`, + values: { error: err }, + }) + ); + } }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts index 9f8e218f4f614..13d07bcdd6baf 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts @@ -23,7 +23,6 @@ import { createMockBrowserDriverFactory, createMockLayoutInstance, createMockServer, - mockSelectors, } from '../../../../test_helpers'; import { ConditionalHeaders, HeadlessChromiumDriver } from '../../../../types'; import { screenshotsObservableFactory } from './observable'; @@ -61,6 +60,7 @@ describe('Screenshot Observable Pipeline', () => { expect(result).toMatchInlineSnapshot(` Array [ Object { + "error": undefined, "screenshots": Array [ Object { "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", @@ -98,6 +98,7 @@ describe('Screenshot Observable Pipeline', () => { expect(result).toMatchInlineSnapshot(` Array [ Object { + "error": undefined, "screenshots": Array [ Object { "base64EncodedData": "allyourBase64 screenshots", @@ -108,6 +109,7 @@ describe('Screenshot Observable Pipeline', () => { "timeRange": "Default GetTimeRange Result", }, Object { + "error": undefined, "screenshots": Array [ Object { "base64EncodedData": "allyourBase64 screenshots", @@ -122,15 +124,10 @@ describe('Screenshot Observable Pipeline', () => { }); describe('error handling', () => { - it('fails if error toast message is found', async () => { + it('recovers if waitForSelector fails', async () => { // mock implementations const mockWaitForSelector = jest.fn().mockImplementation((selectorArg: string) => { - const { toastHeader } = mockSelectors; - if (selectorArg === toastHeader) { - return Promise.resolve(true); - } - // make the error toast message get found before anything else - return Rx.interval(100).toPromise(); + throw new Error('Mock error!'); }); // mocks @@ -153,12 +150,35 @@ describe('Screenshot Observable Pipeline', () => { }).toPromise(); }; - await expect(getScreenshot()).rejects.toMatchInlineSnapshot( - `[Error: Encountered an unexpected message on the page: Toast Message]` - ); + await expect(getScreenshot()).resolves.toMatchInlineSnapshot(` + Array [ + Object { + "error": [Error: An error occurred when trying to read the page for visualization panel info. You may need to increase 'xpack.reporting.capture.timeouts.waitForElements'. Error: Mock error!], + "screenshots": Array [ + Object { + "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "description": undefined, + "title": undefined, + }, + ], + "timeRange": null, + }, + Object { + "error": [Error: An error occurred when trying to read the page for visualization panel info. You may need to increase 'xpack.reporting.capture.timeouts.waitForElements'. Error: Mock error!], + "screenshots": Array [ + Object { + "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "description": undefined, + "title": undefined, + }, + ], + "timeRange": null, + }, + ] + `); }); - it('fails if exit$ fires a timeout or error signal', async () => { + it('recovers if exit$ fires a timeout signal', async () => { // mocks const mockGetCreatePage = (driver: HeadlessChromiumDriver) => jest @@ -188,7 +208,21 @@ describe('Screenshot Observable Pipeline', () => { }).toPromise(); }; - await expect(getScreenshot()).rejects.toMatchInlineSnapshot(`"Instant timeout has fired!"`); + await expect(getScreenshot()).resolves.toMatchInlineSnapshot(` + Array [ + Object { + "error": "Instant timeout has fired!", + "screenshots": Array [ + Object { + "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "description": undefined, + "title": undefined, + }, + ], + "timeRange": null, + }, + ] + `); }); }); }); diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts index d429931602951..878a9d3b87393 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts @@ -5,19 +5,18 @@ */ import * as Rx from 'rxjs'; -import { concatMap, first, mergeMap, take, toArray } from 'rxjs/operators'; +import { catchError, concatMap, first, mergeMap, take, takeUntil, toArray } from 'rxjs/operators'; import { CaptureConfig, HeadlessChromiumDriverFactory, ServerFacade } from '../../../../types'; import { getElementPositionAndAttributes } from './get_element_position_data'; import { getNumberOfItems } from './get_number_of_items'; import { getScreenshots } from './get_screenshots'; import { getTimeRange } from './get_time_range'; -import { injectCustomCss } from './inject_css'; import { openUrl } from './open_url'; -import { scanPage } from './scan_page'; -import { ScreenshotObservableOpts, ScreenshotResults } from './types'; -import { waitForElementsToBeInDOM } from './wait_for_dom_elements'; -import { waitForRenderComplete } from './wait_for_render'; import { skipTelemetry } from './skip_telemetry'; +import { ScreenSetupData, ScreenshotObservableOpts, ScreenshotResults } from './types'; +import { waitForRenderComplete } from './wait_for_render'; +import { waitForVisualizations } from './wait_for_visualizations'; +import { injectCustomCss } from './inject_css'; export function screenshotsObservableFactory( server: ServerFacade, @@ -41,16 +40,16 @@ export function screenshotsObservableFactory( concatMap(url => { return create$.pipe( mergeMap(({ driver, exit$ }) => { - const screenshot$ = Rx.of(1).pipe( - mergeMap(() => openUrl(driver, url, conditionalHeaders, logger)), + const setup$: Rx.Observable = Rx.of(1).pipe( + takeUntil(exit$), + mergeMap(() => openUrl(server, driver, url, conditionalHeaders, logger)), mergeMap(() => skipTelemetry(driver, logger)), - mergeMap(() => scanPage(driver, layout, logger)), - mergeMap(() => getNumberOfItems(driver, layout, logger)), + mergeMap(() => getNumberOfItems(server, driver, layout, logger)), mergeMap(async itemsCount => { const viewport = layout.getViewport(itemsCount); await Promise.all([ driver.setViewport(viewport, logger), - waitForElementsToBeInDOM(driver, itemsCount, layout, logger), + waitForVisualizations(server, driver, itemsCount, layout, logger), ]); }), mergeMap(async () => { @@ -63,28 +62,35 @@ export function screenshotsObservableFactory( await layout.positionElements(driver, logger); } - await waitForRenderComplete(captureConfig, driver, layout, logger); + await waitForRenderComplete(driver, layout, captureConfig, logger); }), - mergeMap(() => getTimeRange(driver, layout, logger)), - mergeMap( - async (timeRange): Promise => { - const elementsPositionAndAttributes = await getElementPositionAndAttributes( - driver, - layout, - logger - ); - const screenshots = await getScreenshots({ - browser: driver, - elementsPositionAndAttributes, - logger, - }); + mergeMap(async () => { + return await Promise.all([ + getTimeRange(driver, layout, logger), + getElementPositionAndAttributes(driver, layout, logger), + ]).then(([timeRange, elementsPositionAndAttributes]) => ({ + elementsPositionAndAttributes, + timeRange, + })); + }), + catchError(err => { + logger.error(err); + return Rx.of({ elementsPositionAndAttributes: null, timeRange: null, error: err }); + }) + ); - return { timeRange, screenshots }; + return setup$.pipe( + mergeMap( + async (data: ScreenSetupData): Promise => { + const elements = data.elementsPositionAndAttributes + ? data.elementsPositionAndAttributes + : getDefaultElementPosition(layout.getViewport(1)); + const screenshots = await getScreenshots(driver, elements, logger); + const { timeRange, error: setupError } = data; + return { timeRange, screenshots, error: setupError }; } ) ); - - return Rx.race(screenshot$, exit$); }), first() ); @@ -94,3 +100,18 @@ export function screenshotsObservableFactory( ); }; } + +/* + * If an error happens setting up the page, we don't know if there actually + * are any visualizations showing. These defaults should help capture the page + * enough for the user to see the error themselves + */ +const getDefaultElementPosition = ({ height, width }: { height: number; width: number }) => [ + { + position: { + boundingClientRect: { top: 0, left: 0, height, width }, + scroll: { x: 0, y: 0 }, + }, + attributes: {}, + }, +]; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts index e465499f839f9..fbae1f91a7a6a 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts @@ -4,23 +4,40 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ConditionalHeaders } from '../../../../types'; +import { i18n } from '@kbn/i18n'; +import { ConditionalHeaders, ServerFacade } from '../../../../types'; import { LevelLogger } from '../../../../server/lib'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { WAITFOR_SELECTOR } from '../../constants'; +import { PAGELOAD_SELECTOR } from '../../constants'; export const openUrl = async ( + server: ServerFacade, browser: HeadlessBrowser, url: string, conditionalHeaders: ConditionalHeaders, logger: LevelLogger ): Promise => { - await browser.open( - url, - { - conditionalHeaders, - waitForSelector: WAITFOR_SELECTOR, - }, - logger - ); + const config = server.config(); + + try { + await browser.open( + url, + { + conditionalHeaders, + waitForSelector: PAGELOAD_SELECTOR, + timeout: config.get('xpack.reporting.capture.timeouts.openUrl'), + }, + logger + ); + } catch (err) { + throw new Error( + i18n.translate('xpack.reporting.screencapture.couldntLoadKibana', { + defaultMessage: `An error occurred when trying to open the Kibana URL. You may need to increase '{configKey}'. {error}`, + values: { + configKey: 'xpack.reporting.capture.timeouts.openUrl', + error: err, + }, + }) + ); + } }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/scan_page.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/scan_page.ts deleted file mode 100644 index 010ffe8f23afc..0000000000000 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/scan_page.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as Rx from 'rxjs'; -import { HeadlessChromiumDriver } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; -import { LayoutInstance } from '../../layouts/layout'; -import { checkForToastMessage } from './check_for_toast'; - -export function scanPage( - browser: HeadlessChromiumDriver, - layout: LayoutInstance, - logger: LevelLogger -) { - logger.debug('waiting for elements or items count attribute; or not found to interrupt'); - - // the dashboard is using the `itemsCountAttribute` attribute to let us - // know how many items to expect since gridster incrementally adds panels - // we have to use this hint to wait for all of them - const renderSuccess = browser.waitForSelector( - `${layout.selectors.renderComplete},[${layout.selectors.itemsCountAttribute}]`, - {}, - logger - ); - const renderError = checkForToastMessage(browser, layout, logger); - return Rx.race(Rx.from(renderSuccess), Rx.from(renderError)); -} diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts index 78cd42f0cae2f..ab81a952f345c 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts @@ -35,7 +35,14 @@ export interface Screenshot { description: string; } +export interface ScreenSetupData { + elementsPositionAndAttributes: ElementsPositionAndAttribute[] | null; + timeRange: TimeRange | null; + error?: Error; +} + export interface ScreenshotResults { timeRange: TimeRange | null; screenshots: Screenshot[]; + error?: Error; } diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_dom_elements.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_dom_elements.ts deleted file mode 100644 index c958585f78e0d..0000000000000 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_dom_elements.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; -import { LayoutInstance } from '../../layouts/layout'; -import { CONTEXT_WAITFORELEMENTSTOBEINDOM } from './constants'; - -export const waitForElementsToBeInDOM = async ( - browser: HeadlessBrowser, - itemsCount: number, - layout: LayoutInstance, - logger: LevelLogger -): Promise => { - logger.debug(`waiting for ${itemsCount} rendered elements to be in the DOM`); - - await browser.waitFor( - { - fn: selector => { - return document.querySelectorAll(selector).length; - }, - args: [layout.selectors.renderComplete], - toEqual: itemsCount, - }, - { context: CONTEXT_WAITFORELEMENTSTOBEINDOM }, - logger - ); - - logger.info(`found ${itemsCount} rendered elements in the DOM`); - return itemsCount; -}; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts index 632f008ca63bc..2f6dc2829dfd8 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import { CaptureConfig } from '../../../../types'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; import { LevelLogger } from '../../../../server/lib'; @@ -11,12 +12,16 @@ import { LayoutInstance } from '../../layouts/layout'; import { CONTEXT_WAITFORRENDER } from './constants'; export const waitForRenderComplete = async ( - captureConfig: CaptureConfig, browser: HeadlessBrowser, layout: LayoutInstance, + captureConfig: CaptureConfig, logger: LevelLogger ) => { - logger.debug('waiting for rendering to complete'); + logger.debug( + i18n.translate('xpack.reporting.screencapture.waitingForRenderComplete', { + defaultMessage: 'waiting for rendering to complete', + }) + ); return await browser .evaluate( @@ -66,6 +71,10 @@ export const waitForRenderComplete = async ( logger ) .then(() => { - logger.debug('rendering is complete'); + logger.debug( + i18n.translate('xpack.reporting.screencapture.renderIsComplete', { + defaultMessage: 'rendering is complete', + }) + ); }); }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts new file mode 100644 index 0000000000000..93ad40026dff8 --- /dev/null +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { ServerFacade } from '../../../../types'; +import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; +import { LevelLogger } from '../../../../server/lib'; +import { LayoutInstance } from '../../layouts/layout'; +import { CONTEXT_WAITFORELEMENTSTOBEINDOM } from './constants'; + +type SelectorArgs = Record; + +const getCompletedItemsCount = ({ renderCompleteSelector }: SelectorArgs) => { + return document.querySelectorAll(renderCompleteSelector).length; +}; + +/* + * 1. Wait for the visualization metadata to be found in the DOM + * 2. Read the metadata for the number of visualization items + * 3. Wait for the render complete event to be fired once for each item + */ +export const waitForVisualizations = async ( + server: ServerFacade, + browser: HeadlessBrowser, + itemsCount: number, + layout: LayoutInstance, + logger: LevelLogger +): Promise => { + const config = server.config(); + const { renderComplete: renderCompleteSelector } = layout.selectors; + + logger.debug( + i18n.translate('xpack.reporting.screencapture.waitingForRenderedElements', { + defaultMessage: `waiting for {itemsCount} rendered elements to be in the DOM`, + values: { itemsCount }, + }) + ); + + try { + await browser.waitFor( + { + fn: getCompletedItemsCount, + args: [{ renderCompleteSelector }], + toEqual: itemsCount, + timeout: config.get('xpack.reporting.capture.timeouts.renderComplete'), + }, + { context: CONTEXT_WAITFORELEMENTSTOBEINDOM }, + logger + ); + + logger.debug(`found ${itemsCount} rendered elements in the DOM`); + } catch (err) { + throw new Error( + i18n.translate('xpack.reporting.screencapture.couldntFinishRendering', { + defaultMessage: `An error occurred when trying to wait for {count} visualizations to finish rendering. You may need to increase '{configKey}'. {error}`, + values: { + count: itemsCount, + configKey: 'xpack.reporting.capture.timeouts.renderComplete', + error: err, + }, + }) + ); + } +}; diff --git a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.js b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.js index c0c21119e1d53..e2e6ba1b89096 100644 --- a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.js +++ b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.js @@ -114,7 +114,7 @@ test(`returns content of generatePng getBuffer base64 encoded`, async () => { const testContent = 'test content'; const generatePngObservable = generatePngObservableFactory(); - generatePngObservable.mockReturnValue(Rx.of(Buffer.from(testContent))); + generatePngObservable.mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) })); const executeJob = await executeJobFactory( mockReporting, diff --git a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts index 5cde245080914..8670f0027af89 100644 --- a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts +++ b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts @@ -4,17 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ -import * as Rx from 'rxjs'; import { ElasticsearchServiceSetup } from 'kibana/server'; +import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil } from 'rxjs/operators'; -import { ReportingCore } from '../../../../server'; import { PNG_JOB_TYPE } from '../../../../common/constants'; -import { ServerFacade, ExecuteJobFactory, ESQueueWorkerExecuteFn, Logger } from '../../../../types'; +import { ReportingCore } from '../../../../server'; +import { + ESQueueWorkerExecuteFn, + ExecuteJobFactory, + JobDocOutput, + Logger, + ServerFacade, +} from '../../../../types'; import { decryptJobHeaders, - omitBlacklistedHeaders, getConditionalHeaders, getFullUrls, + omitBlacklistedHeaders, } from '../../../common/execute_job/'; import { JobDocPayloadPNG } from '../../types'; import { generatePngObservableFactory } from '../lib/generate_png'; @@ -33,7 +39,7 @@ export const executeJobFactory: QueuedPngExecutorFactory = async function execut return function executeJob(jobId: string, job: JobDocPayloadPNG, cancellationToken: any) { const jobLogger = logger.clone([jobId]); - const process$ = Rx.of(1).pipe( + const process$: Rx.Observable = Rx.of(1).pipe( mergeMap(() => decryptJobHeaders({ server, job, logger })), map(decryptedHeaders => omitBlacklistedHeaders({ job, decryptedHeaders })), map(filteredHeaders => getConditionalHeaders({ server, job, filteredHeaders })), @@ -48,11 +54,12 @@ export const executeJobFactory: QueuedPngExecutorFactory = async function execut job.layout ); }), - map((buffer: Buffer) => { + map(({ buffer, warnings }) => { return { content_type: 'image/png', content: buffer.toString('base64'), size: buffer.byteLength, + warnings, }; }), catchError(err => { diff --git a/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts b/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts index 600762c451a79..88e91982adc63 100644 --- a/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts +++ b/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts @@ -7,10 +7,11 @@ import * as Rx from 'rxjs'; import { map } from 'rxjs/operators'; import { LevelLogger } from '../../../../server/lib'; -import { ServerFacade, HeadlessChromiumDriverFactory, ConditionalHeaders } from '../../../../types'; -import { screenshotsObservableFactory } from '../../../common/lib/screenshots'; -import { PreserveLayout } from '../../../common/layouts/preserve_layout'; +import { ConditionalHeaders, HeadlessChromiumDriverFactory, ServerFacade } from '../../../../types'; import { LayoutParams } from '../../../common/layouts/layout'; +import { PreserveLayout } from '../../../common/layouts/preserve_layout'; +import { screenshotsObservableFactory } from '../../../common/lib/screenshots'; +import { ScreenshotResults } from '../../../common/lib/screenshots/types'; export function generatePngObservableFactory( server: ServerFacade, @@ -24,7 +25,7 @@ export function generatePngObservableFactory( browserTimezone: string, conditionalHeaders: ConditionalHeaders, layoutParams: LayoutParams - ): Rx.Observable { + ): Rx.Observable<{ buffer: Buffer; warnings: string[] }> { if (!layoutParams || !layoutParams.dimensions) { throw new Error(`LayoutParams.Dimensions is undefined.`); } @@ -37,12 +38,16 @@ export function generatePngObservableFactory( layout, browserTimezone, }).pipe( - map(([{ screenshots }]) => { - if (screenshots.length !== 1) { - throw new Error(`Expected there to be 1 screenshot, but there are ${screenshots.length}`); - } - - return screenshots[0].base64EncodedData; + map((results: ScreenshotResults[]) => { + return { + buffer: results[0].screenshots[0].base64EncodedData, + warnings: results.reduce((found, current) => { + if (current.error) { + found.push(current.error.message); + } + return found; + }, [] as string[]), + }; }) ); diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.test.js b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.test.js index cc6b298bebdc5..484842ba18f2a 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.test.js +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.test.js @@ -82,7 +82,7 @@ test(`returns content of generatePdf getBuffer base64 encoded`, async () => { const testContent = 'test content'; const generatePdfObservable = generatePdfObservableFactory(); - generatePdfObservable.mockReturnValue(Rx.of(Buffer.from(testContent))); + generatePdfObservable.mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) })); const executeJob = await executeJobFactory( mockReporting, diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts index e8461862bee82..535c2dcd439a7 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts @@ -4,21 +4,27 @@ * you may not use this file except in compliance with the Elastic License. */ -import * as Rx from 'rxjs'; import { ElasticsearchServiceSetup } from 'kibana/server'; +import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil } from 'rxjs/operators'; -import { ReportingCore } from '../../../../server'; -import { ServerFacade, ExecuteJobFactory, ESQueueWorkerExecuteFn, Logger } from '../../../../types'; -import { JobDocPayloadPDF } from '../../types'; import { PDF_JOB_TYPE } from '../../../../common/constants'; -import { generatePdfObservableFactory } from '../lib/generate_pdf'; +import { ReportingCore } from '../../../../server'; +import { + ESQueueWorkerExecuteFn, + ExecuteJobFactory, + JobDocOutput, + Logger, + ServerFacade, +} from '../../../../types'; import { decryptJobHeaders, - omitBlacklistedHeaders, getConditionalHeaders, - getFullUrls, getCustomLogo, + getFullUrls, + omitBlacklistedHeaders, } from '../../../common/execute_job/'; +import { JobDocPayloadPDF } from '../../types'; +import { generatePdfObservableFactory } from '../lib/generate_pdf'; type QueuedPdfExecutorFactory = ExecuteJobFactory>; @@ -34,8 +40,7 @@ export const executeJobFactory: QueuedPdfExecutorFactory = async function execut return function executeJob(jobId: string, job: JobDocPayloadPDF, cancellationToken: any) { const jobLogger = logger.clone([jobId]); - - const process$ = Rx.of(1).pipe( + const process$: Rx.Observable = Rx.of(1).pipe( mergeMap(() => decryptJobHeaders({ server, job, logger })), map(decryptedHeaders => omitBlacklistedHeaders({ job, decryptedHeaders })), map(filteredHeaders => getConditionalHeaders({ server, job, filteredHeaders })), @@ -54,10 +59,11 @@ export const executeJobFactory: QueuedPdfExecutorFactory = async function execut logo ); }), - map((buffer: Buffer) => ({ + map(({ buffer, warnings }) => ({ content_type: 'application/pdf', content: buffer.toString('base64'), size: buffer.byteLength, + warnings, })), catchError(err => { jobLogger.error(err); diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts index 9a8db308bea79..d78effaa1fc2f 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts @@ -4,17 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ +import { groupBy } from 'lodash'; import * as Rx from 'rxjs'; import { mergeMap } from 'rxjs/operators'; -import { groupBy } from 'lodash'; import { LevelLogger } from '../../../../server/lib'; -import { ServerFacade, HeadlessChromiumDriverFactory, ConditionalHeaders } from '../../../../types'; -// @ts-ignore untyped module -import { pdf } from './pdf'; -import { screenshotsObservableFactory } from '../../../common/lib/screenshots'; +import { ConditionalHeaders, HeadlessChromiumDriverFactory, ServerFacade } from '../../../../types'; import { createLayout } from '../../../common/layouts'; -import { ScreenshotResults } from '../../../common/lib/screenshots/types'; import { LayoutInstance, LayoutParams } from '../../../common/layouts/layout'; +import { screenshotsObservableFactory } from '../../../common/lib/screenshots'; +import { ScreenshotResults } from '../../../common/lib/screenshots/types'; +// @ts-ignore untyped module +import { pdf } from './pdf'; const getTimeRange = (urlScreenshots: ScreenshotResults[]) => { const grouped = groupBy(urlScreenshots.map(u => u.timeRange)); @@ -40,7 +40,7 @@ export function generatePdfObservableFactory( conditionalHeaders: ConditionalHeaders, layoutParams: LayoutParams, logo?: string - ): Rx.Observable { + ): Rx.Observable<{ buffer: Buffer; warnings: string[] }> { const layout = createLayout(server, layoutParams) as LayoutInstance; const screenshots$ = screenshotsObservable({ logger, @@ -49,17 +49,17 @@ export function generatePdfObservableFactory( layout, browserTimezone, }).pipe( - mergeMap(async urlScreenshots => { + mergeMap(async (results: ScreenshotResults[]) => { const pdfOutput = pdf.create(layout, logo); if (title) { - const timeRange = getTimeRange(urlScreenshots); + const timeRange = getTimeRange(results); title += timeRange ? ` - ${timeRange.duration}` : ''; pdfOutput.setTitle(title); } - urlScreenshots.forEach(({ screenshots }) => { - screenshots.forEach(screenshot => { + results.forEach(r => { + r.screenshots.forEach(screenshot => { pdfOutput.addImage(screenshot.base64EncodedData, { title: screenshot.title, description: screenshot.description, @@ -68,7 +68,16 @@ export function generatePdfObservableFactory( }); pdfOutput.generate(); - return await pdfOutput.getBuffer(); + + return { + buffer: await pdfOutput.getBuffer(), + warnings: results.reduce((found, current) => { + if (current.error) { + found.push(current.error.message); + } + return found; + }, [] as string[]), + }; }) ); diff --git a/x-pack/legacy/plugins/reporting/public/components/report_info_button.tsx b/x-pack/legacy/plugins/reporting/public/components/report_info_button.tsx index 77869c40d3577..7f5d070948e50 100644 --- a/x-pack/legacy/plugins/reporting/public/components/report_info_button.tsx +++ b/x-pack/legacy/plugins/reporting/public/components/report_info_button.tsx @@ -86,95 +86,102 @@ export class ReportInfoButton extends Component { const maxAttempts = info.max_attempts ? info.max_attempts.toString() : NA; const priority = info.priority ? info.priority.toString() : NA; const timeout = info.timeout ? info.timeout.toString() : NA; + const warnings = info.output && info.output.warnings ? info.output.warnings.join(',') : null; + + const jobInfoDateTimes: JobInfo[] = [ + { + title: 'Created By', + description: info.created_by || NA, + }, + { + title: 'Created At', + description: info.created_at || NA, + }, + { + title: 'Started At', + description: info.started_at || NA, + }, + { + title: 'Completed At', + description: info.completed_at || NA, + }, + { + title: 'Processed By', + description: + info.kibana_name && info.kibana_id ? `${info.kibana_name} (${info.kibana_id})` : UNKNOWN, + }, + { + title: 'Browser Timezone', + description: get(info, 'payload.browserTimezone') || NA, + }, + ]; + const jobInfoPayload: JobInfo[] = [ + { + title: 'Title', + description: get(info, 'payload.title') || NA, + }, + { + title: 'Type', + description: get(info, 'payload.type') || NA, + }, + { + title: 'Layout', + description: get(info, 'meta.layout') || NA, + }, + { + title: 'Dimensions', + description: getDimensions(info), + }, + { + title: 'Job Type', + description: jobType, + }, + { + title: 'Content Type', + description: get(info, 'output.content_type') || NA, + }, + { + title: 'Size in Bytes', + description: get(info, 'output.size') || NA, + }, + ]; + const jobInfoStatus: JobInfo[] = [ + { + title: 'Attempts', + description: attempts, + }, + { + title: 'Max Attempts', + description: maxAttempts, + }, + { + title: 'Priority', + description: priority, + }, + { + title: 'Timeout', + description: timeout, + }, + { + title: 'Status', + description: info.status || NA, + }, + { + title: 'Browser Type', + description: USES_HEADLESS_JOB_TYPES.includes(jobType) ? info.browser_type || UNKNOWN : NA, + }, + ]; + if (warnings) { + jobInfoStatus.push({ + title: 'Errors', + description: warnings, + }); + } const jobInfoParts: JobInfoMap = { - datetimes: [ - { - title: 'Created By', - description: info.created_by || NA, - }, - { - title: 'Created At', - description: info.created_at || NA, - }, - { - title: 'Started At', - description: info.started_at || NA, - }, - { - title: 'Completed At', - description: info.completed_at || NA, - }, - { - title: 'Processed By', - description: - info.kibana_name && info.kibana_id - ? `${info.kibana_name} (${info.kibana_id})` - : UNKNOWN, - }, - { - title: 'Browser Timezone', - description: get(info, 'payload.browserTimezone') || NA, - }, - ], - payload: [ - { - title: 'Title', - description: get(info, 'payload.title') || NA, - }, - { - title: 'Type', - description: get(info, 'payload.type') || NA, - }, - { - title: 'Layout', - description: get(info, 'meta.layout') || NA, - }, - { - title: 'Dimensions', - description: getDimensions(info), - }, - { - title: 'Job Type', - description: jobType, - }, - { - title: 'Content Type', - description: get(info, 'output.content_type') || NA, - }, - { - title: 'Size in Bytes', - description: get(info, 'output.size') || NA, - }, - ], - status: [ - { - title: 'Attempts', - description: attempts, - }, - { - title: 'Max Attempts', - description: maxAttempts, - }, - { - title: 'Priority', - description: priority, - }, - { - title: 'Timeout', - description: timeout, - }, - { - title: 'Status', - description: info.status || NA, - }, - { - title: 'Browser Type', - description: USES_HEADLESS_JOB_TYPES.includes(jobType) - ? info.browser_type || UNKNOWN - : NA, - }, - ], + datetimes: jobInfoDateTimes, + payload: jobInfoPayload, + status: jobInfoStatus, }; return ( diff --git a/x-pack/legacy/plugins/reporting/public/components/report_listing.tsx b/x-pack/legacy/plugins/reporting/public/components/report_listing.tsx index 320f6220aa996..54061eda94dce 100644 --- a/x-pack/legacy/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/legacy/plugins/reporting/public/components/report_listing.tsx @@ -43,6 +43,7 @@ interface Job { attempts: number; max_attempts: number; csv_contains_formulas: boolean; + warnings: string[]; } interface Props { @@ -203,7 +204,7 @@ class ReportListingUi extends Component { return (
@@ -215,13 +216,27 @@ class ReportListingUi extends Component { maxSizeReached = ( ); } + let warnings; + if (record.warnings) { + warnings = ( + + + + + + ); + } + let statusTimestamp; if (status === JobStatuses.PROCESSING && record.started_at) { statusTimestamp = this.formatDate(record.started_at); @@ -242,7 +257,7 @@ class ReportListingUi extends Component { return (
{ }} /> {maxSizeReached} + {warnings}
); } @@ -259,6 +275,7 @@ class ReportListingUi extends Component {
{statusLabel} {maxSizeReached} + {warnings}
); }, @@ -437,6 +454,7 @@ class ReportListingUi extends Component { attempts: source.attempts, max_attempts: source.max_attempts, csv_contains_formulas: get(source, 'output.csv_contains_formulas'), + warnings: source.output ? source.output.warnings : undefined, }; } ), diff --git a/x-pack/legacy/plugins/reporting/public/lib/job_queue_client.ts b/x-pack/legacy/plugins/reporting/public/lib/job_queue_client.ts index 281a2e1cdf9a5..87d4174168b7f 100644 --- a/x-pack/legacy/plugins/reporting/public/lib/job_queue_client.ts +++ b/x-pack/legacy/plugins/reporting/public/lib/job_queue_client.ts @@ -31,6 +31,7 @@ export interface JobInfo { output: { content_type: string; size: number; + warnings: string[]; }; process_expiration: string; completed_at: string; diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts index 0592124b9897b..60799e3e918b8 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { trunc, map } from 'lodash'; +import { i18n } from '@kbn/i18n'; +import { map, trunc } from 'lodash'; import open from 'opn'; +import { ElementHandle, EvaluateFn, Page, SerializableOrJSHandle } from 'puppeteer'; import { parse as parseUrl } from 'url'; -import { Page, SerializableOrJSHandle, EvaluateFn } from 'puppeteer'; import { ViewZoomWidthHeight } from '../../../../export_types/common/layouts/layout'; import { LevelLogger } from '../../../../server/lib'; -import { allowRequest } from '../../network_policy'; import { ConditionalHeaders, ConditionalHeadersConditions, @@ -18,6 +18,7 @@ import { InterceptedRequest, NetworkPolicy, } from '../../../../types'; +import { allowRequest } from '../../network_policy'; export interface ChromiumDriverOptions { inspect: boolean; @@ -25,7 +26,7 @@ export interface ChromiumDriverOptions { } interface WaitForSelectorOpts { - silent?: boolean; + timeout: number; } interface EvaluateOpts { @@ -65,10 +66,15 @@ export class HeadlessChromiumDriver { url: string, { conditionalHeaders, - waitForSelector, - }: { conditionalHeaders: ConditionalHeaders; waitForSelector: string }, + waitForSelector: pageLoadSelector, + timeout, + }: { + conditionalHeaders: ConditionalHeaders; + waitForSelector: string; + timeout: number; + }, logger: LevelLogger - ) { + ): Promise { logger.info(`opening url ${url}`); // @ts-ignore const client = this.page._client; @@ -81,7 +87,7 @@ export class HeadlessChromiumDriver { // https://github.com/puppeteer/puppeteer/issues/5003 // Docs on this client/protocol can be found here: // https://chromedevtools.github.io/devtools-protocol/tot/Fetch - client.on('Fetch.requestPaused', (interceptedRequest: InterceptedRequest) => { + client.on('Fetch.requestPaused', async (interceptedRequest: InterceptedRequest) => { const { requestId, request: { url: interceptedUrl }, @@ -92,12 +98,17 @@ export class HeadlessChromiumDriver { // We should never ever let file protocol requests go through if (!allowed || !this.allowRequest(interceptedUrl)) { logger.error(`Got bad URL: "${interceptedUrl}", closing browser.`); - client.send('Fetch.failRequest', { + await client.send('Fetch.failRequest', { errorReason: 'Aborted', requestId, }); this.page.browser().close(); - throw new Error(`Received disallowed outgoing URL: "${interceptedUrl}", exiting`); + throw new Error( + i18n.translate('xpack.reporting.chromiumDriver.disallowedOutgoingUrl', { + defaultMessage: `Received disallowed outgoing URL: "{interceptedUrl}", exiting`, + values: { interceptedUrl }, + }) + ); } if (this._shouldUseCustomHeaders(conditionalHeaders.conditions, interceptedUrl)) { @@ -112,14 +123,33 @@ export class HeadlessChromiumDriver { value, }) ); - client.send('Fetch.continueRequest', { - requestId, - headers, - }); + + try { + await client.send('Fetch.continueRequest', { + requestId, + headers, + }); + } catch (err) { + logger.error( + i18n.translate('xpack.reporting.chromiumDriver.failedToCompleteRequestUsingHeaders', { + defaultMessage: 'Failed to complete a request using headers: {error}', + values: { error: err }, + }) + ); + } } else { const loggedUrl = isData ? this.truncateUrl(interceptedUrl) : interceptedUrl; logger.debug(`No custom headers for ${loggedUrl}`); - client.send('Fetch.continueRequest', { requestId }); + try { + await client.send('Fetch.continueRequest', { requestId }); + } catch (err) { + logger.error( + i18n.translate('xpack.reporting.chromiumDriver.failedToCompleteRequest', { + defaultMessage: 'Failed to complete a request: {error}', + values: { error: err }, + }) + ); + } } interceptedCount = interceptedCount + (isData ? 0 : 1); }); @@ -144,11 +174,16 @@ export class HeadlessChromiumDriver { await this.launchDebugger(); } - await this.waitForSelector(waitForSelector, {}, logger); + await this.waitForSelector( + pageLoadSelector, + { timeout }, + { context: 'waiting for page load selector' }, + logger + ); logger.info(`handled ${interceptedCount} page requests`); } - public async screenshot(elementPosition: ElementPosition) { + public async screenshot(elementPosition: ElementPosition): Promise { let clip; if (elementPosition) { const { boundingClientRect, scroll = { x: 0, y: 0 } } = elementPosition; @@ -176,63 +211,56 @@ export class HeadlessChromiumDriver { const result = await this.page.evaluate(fn, ...args); return result; } + public async waitForSelector( selector: string, - opts: WaitForSelectorOpts = {}, + opts: WaitForSelectorOpts, + context: EvaluateMetaOpts, logger: LevelLogger - ) { - const { silent = false } = opts; + ): Promise> { + const { timeout } = opts; logger.debug(`waitForSelector ${selector}`); - - let resp; - try { - resp = await this.page.waitFor(selector); - } catch (err) { - if (!silent) { - // Provide some troubleshooting info to see if we're on the login page, - // "Kibana could not load correctly", etc - logger.error(`waitForSelector ${selector} failed on ${this.page.url()}`); - const pageText = await this.evaluate( - { - fn: () => document.querySelector('body')!.innerText, - args: [], - }, - { context: `waitForSelector${selector}` }, - logger - ); - logger.debug(`Page plain text: ${pageText.replace(/\n/g, '\\n')}`); // replace newline with escaped for single log line - } - throw err; - } - + const resp = await this.page.waitFor(selector, { timeout }); // override default 30000ms logger.debug(`waitForSelector ${selector} resolved`); return resp; } - public async waitFor( + public async waitFor( { fn, args, toEqual, + timeout, }: { fn: EvaluateFn; args: SerializableOrJSHandle[]; - toEqual: T; + toEqual: number; + timeout: number; }, context: EvaluateMetaOpts, logger: LevelLogger - ) { + ): Promise { + const startTime = Date.now(); + while (true) { const result = await this.evaluate({ fn, args }, context, logger); if (result === toEqual) { return; } + if (Date.now() - startTime > timeout) { + throw new Error( + `Timed out waiting for the items selected to equal ${toEqual}. Found: ${result}. Context: ${context.context}` + ); + } await new Promise(r => setTimeout(r, WAIT_FOR_DELAY_MS)); } } - public async setViewport({ width, height, zoom }: ViewZoomWidthHeight, logger: LevelLogger) { + public async setViewport( + { width, height, zoom }: ViewZoomWidthHeight, + logger: LevelLogger + ): Promise { logger.debug(`Setting viewport to width: ${width}, height: ${height}, zoom: ${zoom}`); await this.page.setViewport({ diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts index 6fa46b893de8c..1a57408f41dd6 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts @@ -18,7 +18,7 @@ import * as Rx from 'rxjs'; import { ignoreElements, map, mergeMap, tap } from 'rxjs/operators'; import { InnerSubscriber } from 'rxjs/internal/InnerSubscriber'; -import { BrowserConfig, NetworkPolicy } from '../../../../types'; +import { BrowserConfig, CaptureConfig } from '../../../../types'; import { LevelLogger as Logger } from '../../../lib/level_logger'; import { HeadlessChromiumDriver } from '../driver'; import { safeChildProcess } from '../../safe_child_process'; @@ -27,30 +27,27 @@ import { getChromeLogLocation } from '../paths'; import { args } from './args'; type binaryPath = string; -type queueTimeout = number; +type ViewportConfig = BrowserConfig['viewport']; export class HeadlessChromiumDriverFactory { private binaryPath: binaryPath; + private captureConfig: CaptureConfig; private browserConfig: BrowserConfig; - private queueTimeout: queueTimeout; - private networkPolicy: NetworkPolicy; private userDataDir: string; - private getChromiumArgs: (viewport: BrowserConfig['viewport']) => string[]; + private getChromiumArgs: (viewport: ViewportConfig) => string[]; constructor( binaryPath: binaryPath, logger: Logger, browserConfig: BrowserConfig, - queueTimeout: queueTimeout, - networkPolicy: NetworkPolicy + captureConfig: CaptureConfig ) { this.binaryPath = binaryPath; this.browserConfig = browserConfig; - this.queueTimeout = queueTimeout; - this.networkPolicy = networkPolicy; + this.captureConfig = captureConfig; this.userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'chromium-')); - this.getChromiumArgs = (viewport: BrowserConfig['viewport']) => + this.getChromiumArgs = (viewport: ViewportConfig) => args({ userDataDir: this.userDataDir, viewport, @@ -88,7 +85,7 @@ export class HeadlessChromiumDriverFactory { * Return an observable to objects which will drive screenshot capture for a page */ createPage( - { viewport, browserTimezone }: { viewport: BrowserConfig['viewport']; browserTimezone: string }, + { viewport, browserTimezone }: { viewport: ViewportConfig; browserTimezone: string }, pLogger: Logger ): Rx.Observable<{ driver: HeadlessChromiumDriver; exit$: Rx.Observable }> { return Rx.Observable.create(async (observer: InnerSubscriber) => { @@ -113,11 +110,9 @@ export class HeadlessChromiumDriverFactory { page = await browser.newPage(); - // All navigation/waitFor methods default to 30 seconds, - // which can cause the job to fail even if we bump timeouts in - // the config. Help alleviate errors like - // "TimeoutError: waiting for selector ".application" failed: timeout 30000ms exceeded" - page.setDefaultTimeout(this.queueTimeout); + // Set the default timeout for all navigation methods to the openUrl timeout (30 seconds) + // All waitFor methods have their own timeout config passed in to them + page.setDefaultTimeout(this.captureConfig.timeouts.openUrl); logger.debug(`Browser page driver created`); } catch (err) { @@ -158,7 +153,7 @@ export class HeadlessChromiumDriverFactory { // HeadlessChromiumDriver: object to "drive" a browser page const driver = new HeadlessChromiumDriver(page, { inspect: this.browserConfig.inspect, - networkPolicy: this.networkPolicy, + networkPolicy: this.captureConfig.networkPolicy, }); // Rx.Observable: stream to interrupt page capture diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts index d5f7027e025d4..d32338ae3e311 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { BrowserConfig, NetworkPolicy } from '../../../types'; +import { BrowserConfig, CaptureConfig } from '../../../types'; import { LevelLogger } from '../../lib'; import { HeadlessChromiumDriverFactory } from './driver_factory'; @@ -14,14 +14,7 @@ export async function createDriverFactory( binaryPath: string, logger: LevelLogger, browserConfig: BrowserConfig, - queueTimeout: number, - networkPolicy: NetworkPolicy + captureConfig: CaptureConfig ): Promise { - return new HeadlessChromiumDriverFactory( - binaryPath, - logger, - browserConfig, - queueTimeout, - networkPolicy - ); + return new HeadlessChromiumDriverFactory(binaryPath, logger, browserConfig, captureConfig); } diff --git a/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts b/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts index 128df4d318c76..49c6222c9f276 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts @@ -22,8 +22,6 @@ export async function createBrowserDriverFactory( const browserType = captureConfig.browser.type; const browserAutoDownload = captureConfig.browser.autoDownload; const browserConfig = captureConfig.browser[BROWSER_TYPE]; - const networkPolicy = captureConfig.networkPolicy; - const reportingTimeout: number = config.get('xpack.reporting.queue.timeout'); if (browserConfig.disableSandbox) { logger.warning(`Enabling the Chromium sandbox provides an additional layer of protection.`); @@ -34,13 +32,7 @@ export async function createBrowserDriverFactory( try { const { binaryPath } = await installBrowser(logger, chromium, dataDir); - return chromium.createDriverFactory( - binaryPath, - logger, - browserConfig, - reportingTimeout, - networkPolicy - ); + return chromium.createDriverFactory(binaryPath, logger, browserConfig, captureConfig); } catch (error) { if (error.cause && ['EACCES', 'EEXIST'].includes(error.cause.code)) { logger.error( diff --git a/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js b/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js index 4373597942278..113059fa2fa47 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js +++ b/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js @@ -226,8 +226,10 @@ export class Worker extends events.EventEmitter { docOutput.content = output.content; docOutput.content_type = output.content_type || unknownMime; docOutput.max_size_reached = output.max_size_reached; - docOutput.size = output.size; docOutput.csv_contains_formulas = output.csv_contains_formulas; + docOutput.size = output.size; + docOutput.warnings = + output.warnings && output.warnings.length > 0 ? output.warnings : undefined; } else { docOutput.content = output || defaultOutput; docOutput.content_type = unknownMime; @@ -248,7 +250,11 @@ export class Worker extends events.EventEmitter { Promise.resolve(this.workerFn.call(null, job, jobSource.payload, cancellationToken)) .then(res => { // job execution was successful - this.info(`Job execution completed successfully`); + if (res && res.warnings && res.warnings.length > 0) { + this.warn(`Job execution completed with warnings`); + } else { + this.info(`Job execution completed successfully`); + } isResolved = true; resolve(res); diff --git a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts index 6d9ae2153255f..883276d43e27e 100644 --- a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts +++ b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts @@ -10,7 +10,7 @@ import * as contexts from '../export_types/common/lib/screenshots/constants'; import { ElementsPositionAndAttribute } from '../export_types/common/lib/screenshots/types'; import { HeadlessChromiumDriver, HeadlessChromiumDriverFactory } from '../server/browsers'; import { createDriverFactory } from '../server/browsers/chromium'; -import { BrowserConfig, Logger, NetworkPolicy } from '../types'; +import { BrowserConfig, CaptureConfig, Logger } from '../types'; interface CreateMockBrowserDriverFactoryOpts { evaluate: jest.Mock, any[]>; @@ -19,7 +19,7 @@ interface CreateMockBrowserDriverFactoryOpts { getCreatePage: (driver: HeadlessChromiumDriver) => jest.Mock; } -export const mockSelectors = { +const mockSelectors = { renderComplete: 'renderedSelector', itemsCountAttribute: 'itemsSelector', screenshot: 'screenshotSelector', @@ -73,9 +73,6 @@ mockBrowserEvaluate.mockImplementation(() => { if (mockCall === contexts.CONTEXT_ELEMENTATTRIBUTES) { return Promise.resolve(getMockElementsPositionAndAttributes('Default Mock Title', 'Default ')); } - if (mockCall === contexts.CONTEXT_CHECKFORTOASTMESSAGE) { - return Promise.resolve('Toast Message'); - } throw new Error(mockCall); }); const mockScreenshot = jest.fn(); @@ -105,19 +102,20 @@ export const createMockBrowserDriverFactory = async ( } as BrowserConfig; const binaryPath = '/usr/local/share/common/secure/'; - const queueTimeout = 55; - const networkPolicy = {} as NetworkPolicy; + const captureConfig = { networkPolicy: {}, timeouts: {} } as CaptureConfig; const mockBrowserDriverFactory = await createDriverFactory( binaryPath, logger, browserConfig, - queueTimeout, - networkPolicy + captureConfig ); const mockPage = {} as Page; - const mockBrowserDriver = new HeadlessChromiumDriver(mockPage, { inspect: true, networkPolicy }); + const mockBrowserDriver = new HeadlessChromiumDriver(mockPage, { + inspect: true, + networkPolicy: captureConfig.networkPolicy, + }); // mock the driver methods as either default mocks or passed-in mockBrowserDriver.waitForSelector = opts.waitForSelector ? opts.waitForSelector : defaultOpts.waitForSelector; // prettier-ignore diff --git a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts index a2eb03c3fe300..0250e6c0a9afd 100644 --- a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts +++ b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts @@ -19,7 +19,6 @@ export const createMockLayoutInstance = (__LEGACY: ServerFacade) => { itemsCountAttribute: 'itemsSelector', screenshot: 'screenshotSelector', timefilterDurationAttribute: 'timefilterDurationSelector', - toastHeader: 'toastHeaderSelector', }; return mockLayout; }; diff --git a/x-pack/legacy/plugins/reporting/test_helpers/index.ts b/x-pack/legacy/plugins/reporting/test_helpers/index.ts index 91c348ba1db3d..491d390c370b9 100644 --- a/x-pack/legacy/plugins/reporting/test_helpers/index.ts +++ b/x-pack/legacy/plugins/reporting/test_helpers/index.ts @@ -6,5 +6,5 @@ export { createMockServer } from './create_mock_server'; export { createMockReportingCore } from './create_mock_reportingplugin'; -export { createMockBrowserDriverFactory, mockSelectors } from './create_mock_browserdriverfactory'; +export { createMockBrowserDriverFactory } from './create_mock_browserdriverfactory'; export { createMockLayoutInstance } from './create_mock_layoutinstance'; diff --git a/x-pack/legacy/plugins/reporting/types.d.ts b/x-pack/legacy/plugins/reporting/types.d.ts index 38406186c8173..b4d49fd21f230 100644 --- a/x-pack/legacy/plugins/reporting/types.d.ts +++ b/x-pack/legacy/plugins/reporting/types.d.ts @@ -122,6 +122,11 @@ export interface CaptureConfig { maxAttempts: number; networkPolicy: NetworkPolicy; loadDelay: number; + timeouts: { + openUrl: number; + waitForElements: number; + renderComplet: number; + }; } export interface BrowserConfig { @@ -219,8 +224,9 @@ export interface JobSource { export interface JobDocOutput { content_type: string; content: string | null; - max_size_reached: boolean; size: number; + max_size_reached?: boolean; + warnings?: string[]; } export interface ESQueueWorker { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c57de95ecb82c..568108aff7503 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10151,7 +10151,6 @@ "xpack.reporting.exportTypes.printablePdf.documentStreamIsNotgeneratedErrorMessage": "ドキュメントストリームが生成されていません。", "xpack.reporting.exportTypes.printablePdf.logoDescription": "Elastic 提供", "xpack.reporting.exportTypes.printablePdf.pagingDescription": "{pageCount} ページ中 {currentPage} ページ目", - "xpack.reporting.exportTypes.printablePdf.screenshots.unexpectedErrorMessage": "ページで予期せぬメッセージが発生しました: {toastHeaderText}", "xpack.reporting.jobStatuses.cancelledText": "キャンセル済み", "xpack.reporting.jobStatuses.completedText": "完了", "xpack.reporting.jobStatuses.failedText": "失敗", @@ -10169,9 +10168,6 @@ "xpack.reporting.listing.tableColumns.createdAtTitle": "作成日時:", "xpack.reporting.listing.tableColumns.reportTitle": "レポート", "xpack.reporting.listing.tableColumns.statusTitle": "ステータス", - "xpack.reporting.listing.tableValue.createdAtDetail.maxSizeReachedText": " - 最大サイズに達成", - "xpack.reporting.listing.tableValue.createdAtDetail.pendingStatusReachedText": "保留中 - ジョブの処理持ち", - "xpack.reporting.listing.tableValue.createdAtDetail.statusTimestampText": "{statusTimestamp} 時点で {statusLabel}", "xpack.reporting.management.reportingTitle": "レポート", "xpack.reporting.panelContent.copyUrlButtonLabel": "POST URL をコピー", "xpack.reporting.panelContent.generateButtonLabel": "{reportingType} を生成", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f17f2eb509cf0..a91f55960e34f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -10151,7 +10151,6 @@ "xpack.reporting.exportTypes.printablePdf.documentStreamIsNotgeneratedErrorMessage": "尚未生成文档流", "xpack.reporting.exportTypes.printablePdf.logoDescription": "由 Elastic 提供支持", "xpack.reporting.exportTypes.printablePdf.pagingDescription": "第 {currentPage} 页,共 {pageCount} 页", - "xpack.reporting.exportTypes.printablePdf.screenshots.unexpectedErrorMessage": "在页面上出现意外消息:{toastHeaderText}", "xpack.reporting.jobStatuses.cancelledText": "已取消", "xpack.reporting.jobStatuses.completedText": "已完成", "xpack.reporting.jobStatuses.failedText": "失败", @@ -10169,9 +10168,6 @@ "xpack.reporting.listing.tableColumns.createdAtTitle": "创建于", "xpack.reporting.listing.tableColumns.reportTitle": "报告", "xpack.reporting.listing.tableColumns.statusTitle": "状态", - "xpack.reporting.listing.tableValue.createdAtDetail.maxSizeReachedText": " - 最大大小已达到", - "xpack.reporting.listing.tableValue.createdAtDetail.pendingStatusReachedText": "待处理 - 正在等候处理作业", - "xpack.reporting.listing.tableValue.createdAtDetail.statusTimestampText": "{statusTimestamp} 时为 {statusLabel}", "xpack.reporting.management.reportingTitle": "报告", "xpack.reporting.panelContent.copyUrlButtonLabel": "复制 POST URL", "xpack.reporting.panelContent.generateButtonLabel": "生成 {reportingType}", From 4db7f49608126d470bdfef98ee150eab1e1c1f71 Mon Sep 17 00:00:00 2001 From: Andrew Goldstein Date: Thu, 5 Mar 2020 23:08:56 -0700 Subject: [PATCH 24/25] [SIEM] Fixes dragging entries to the Timeline while data is loading may trigger a partial page reload (#59476) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [SIEM] Fixes dragging entries to the Timeline while data is loading may trigger a partial page reload The `react-beautiful-dnd` library, upgraded during the `7.6` stack release from `10.0.1` to `12.2.0`, includes a breaking change to the way [errors are handled](https://github.com/atlassian/react-beautiful-dnd/blob/v12.0.0/docs/guides/setup-problem-detection-and-error-recovery.md) and recovered. As a result of this change, an uncaught error may trigger a an effect that feels (from the perspective of a user) like a partial page reload. The most common condition where this can occur is when dragging entries to the Timeline while data is loading, per the animated gif below: ![refresh-error](https://user-images.githubusercontent.com/4459398/76016029-59755f80-5ed9-11ea-858d-cb1189d22ea9.gif) ## Reproduction steps 1. Navigate to the Hosts page 2. Open the Timeline 3. Drag a host to the Timeline 4. While data is still loading, drag a different host to the Timeline to create an `or` query **Expected Results** * The page does not appear to reload * In development mode, a single error is logged to the JS console **Actual Results** * The page appears to reload * In development mode, two errors are logged to the JS console **Error 1** ``` react-beautiful-dnd Invariant failed: Cannot find droppable entry with id [droppableId.content.event-details-value-default-draggable-plain-column-renderer-formatted-field-value-timeline-1-kLGooXABOOUskGlPiQw5-@timestamp-1583260131000]👷<200d> This is a development only message. It will be removed in production builds. in Draggable (created by ConnectFunction) in ConnectFunction (created by PrivateDraggable) in PrivateDraggable (created by PublicDraggable) in PublicDraggable (created by Droppable) in Droppable (created by ConnectFunction) in ConnectFunction ``` **Error 2** ``` react-beautiful-dnd Invariant failed: Cannot find droppable entry with id [droppableId.content.event-details-value-default-draggable-plain-column-renderer-formatted-field-value-timeline-1-kLGooXABOOUskGlPiQw5-@timestamp-1583260131000]👷<200d> This is a development only message. It will be removed in production builds. in ErrorBoundary (created by DragDropContext) in DragDropContext (created by Anonymous) in Anonymous ``` ### Desk testing Tested locally in: * Chrome `80.0.3987.122` * Firefox `73.0.1` * Safari `13.0.5` Fixes https://github.com/elastic/kibana/issues/59466 --- .../drag_and_drop/draggable_wrapper.tsx | 102 +++++++++++------- 1 file changed, 61 insertions(+), 41 deletions(-) diff --git a/x-pack/legacy/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx b/x-pack/legacy/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx index 4b80b9fff2740..b7d368639ed92 100644 --- a/x-pack/legacy/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx +++ b/x-pack/legacy/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx @@ -30,6 +30,24 @@ DragEffects.displayName = 'DragEffects'; export const DraggablePortalContext = createContext(false); export const useDraggablePortalContext = () => useContext(DraggablePortalContext); +/** + * Wraps the `react-beautiful-dnd` error boundary. See also: + * https://github.com/atlassian/react-beautiful-dnd/blob/v12.0.0/docs/guides/setup-problem-detection-and-error-recovery.md + * + * NOTE: This extends from `PureComponent` because, at the time of this + * writing, there's no hook equivalent for `componentDidCatch`, per + * https://reactjs.org/docs/hooks-faq.html#do-hooks-cover-all-use-cases-for-classes + */ +class DragDropErrorBoundary extends React.PureComponent { + componentDidCatch() { + this.forceUpdate(); // required for recovery + } + + render() { + return this.props.children; + } +} + const Wrapper = styled.div` display: inline-block; max-width: 100%; @@ -94,50 +112,52 @@ export const DraggableWrapper = React.memo( return ( - - {droppableProvided => ( -
- - {(provided, snapshot) => ( - - + + {droppableProvided => ( +
+ + {(provided, snapshot) => ( + - {truncate && !snapshot.isDragging ? ( - - {render(dataProvider, provided, snapshot)} - - ) : ( - - {render(dataProvider, provided, snapshot)} - - )} - - - )} - - {droppableProvided.placeholder} -
- )} -
+ + {truncate && !snapshot.isDragging ? ( + + {render(dataProvider, provided, snapshot)} + + ) : ( + + {render(dataProvider, provided, snapshot)} + + )} + +
+ )} +
+ {droppableProvided.placeholder} +
+ )} +
+
); }, From 8220999c12edf6de79c4a0859e4451679d54ea6c Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Fri, 6 Mar 2020 08:42:18 +0100 Subject: [PATCH 25/25] completes navigation test (#59141) Co-authored-by: Elastic Machine --- .../plugins/siem/cypress/integration/navigation.spec.ts | 7 ++++++- x-pack/legacy/plugins/siem/cypress/screens/siem_header.ts | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/siem/cypress/integration/navigation.spec.ts b/x-pack/legacy/plugins/siem/cypress/integration/navigation.spec.ts index 2c5a0e5eeea8a..bebd5f7d679cf 100644 --- a/x-pack/legacy/plugins/siem/cypress/integration/navigation.spec.ts +++ b/x-pack/legacy/plugins/siem/cypress/integration/navigation.spec.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { HOSTS, NETWORK, OVERVIEW, TIMELINES } from '../screens/siem_header'; +import { DETECTIONS, HOSTS, NETWORK, OVERVIEW, TIMELINES } from '../screens/siem_header'; import { loginAndWaitForPage } from '../tasks/login'; import { navigateFromHeaderTo } from '../tasks/siem_header'; @@ -29,6 +29,11 @@ describe('top-level navigation common to all pages in the SIEM app', () => { cy.url().should('include', '/siem#/network'); }); + it('navigates to the Detections page', () => { + navigateFromHeaderTo(DETECTIONS); + cy.url().should('include', '/siem#/detections'); + }); + it('navigates to the Timelines page', () => { navigateFromHeaderTo(TIMELINES); cy.url().should('include', '/siem#/timelines'); diff --git a/x-pack/legacy/plugins/siem/cypress/screens/siem_header.ts b/x-pack/legacy/plugins/siem/cypress/screens/siem_header.ts index cf1059269393a..c2dab051793c1 100644 --- a/x-pack/legacy/plugins/siem/cypress/screens/siem_header.ts +++ b/x-pack/legacy/plugins/siem/cypress/screens/siem_header.ts @@ -6,6 +6,8 @@ export const BREADCRUMBS = '[data-test-subj="breadcrumbs"] a'; +export const DETECTIONS = '[data-test-subj="navigation-detections"]'; + export const HOSTS = '[data-test-subj="navigation-hosts"]'; export const KQL_INPUT = '[data-test-subj="queryInput"]';