From 24c253e10b13eda21c959463a4e96fe922126a51 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Fri, 17 Apr 2020 18:58:35 -0400 Subject: [PATCH 01/15] [SIEM][Detections Engine] - Update rule.lists to be rule.exceptions_list (#63717) ### Summary [63717] This PR updates the rules lists param to be `exceptions_list`. This is done in an attempt to make the terminology less confusing as lists will generally be referring to the big lists values. It should also make it more clear that the `exceptions_list` logic is being applied as a double not. --- .../routes/__mocks__/request_responses.ts | 2 +- .../routes/__mocks__/utils.ts | 2 +- .../routes/rules/create_rules_bulk_route.ts | 4 +-- .../routes/rules/create_rules_route.ts | 4 +-- .../routes/rules/import_rules_route.ts | 6 ++-- .../routes/rules/update_rules_bulk_route.ts | 4 +-- .../routes/rules/update_rules_route.ts | 4 +-- .../detection_engine/routes/rules/utils.ts | 2 +- .../routes/rules/validate.test.ts | 2 +- .../add_prepackaged_rules_schema.test.ts | 24 ++++++++-------- .../schemas/add_prepackaged_rules_schema.ts | 2 +- .../schemas/create_rules_schema.test.ts | 24 ++++++++-------- .../routes/schemas/create_rules_schema.ts | 2 +- .../schemas/import_rules_schema.test.ts | 24 ++++++++-------- .../routes/schemas/import_rules_schema.ts | 2 +- .../routes/schemas/patch_rules_schema.test.ts | 28 +++++++++---------- .../routes/schemas/patch_rules_schema.ts | 2 +- .../schemas/response/__mocks__/utils.ts | 2 +- .../schemas/response/rules_schema.test.ts | 6 ++-- .../routes/schemas/response/rules_schema.ts | 4 +-- .../schemas/update_rules_schema.test.ts | 24 ++++++++-------- .../routes/schemas/update_rules_schema.ts | 2 +- .../detection_engine/rules/create_rules.ts | 8 +++--- .../create_rules_stream_from_ndjson.test.ts | 20 ++++++------- .../rules/get_export_all.test.ts | 2 +- .../rules/get_export_by_object_ids.test.ts | 4 +-- .../rules/install_prepacked_rules.ts | 4 +-- .../lib/detection_engine/rules/patch_rules.ts | 6 ++-- .../detection_engine/rules/update_rules.ts | 8 +++--- .../scripts/rules/patches/update_list.json | 2 +- .../rules/queries/lists/query_with_and.json | 2 +- .../queries/lists/query_with_excluded.json | 2 +- .../queries/lists/query_with_exists.json | 2 +- .../rules/queries/lists/query_with_list.json | 2 +- .../rules/queries/lists/query_with_match.json | 2 +- .../queries/lists/query_with_match_all.json | 2 +- .../rules/queries/lists/query_with_or.json | 2 +- .../scripts/rules/updates/update_list.json | 2 +- .../signals/__mocks__/es_results.ts | 2 +- .../signals/build_bulk_body.test.ts | 8 +++--- .../signals/build_exceptions_query.ts | 2 +- .../signals/build_rule.test.ts | 6 ++-- .../detection_engine/signals/build_rule.ts | 2 +- .../detection_engine/signals/get_filter.ts | 4 +-- .../signals/signal_params_schema.ts | 2 +- .../signals/signal_rule_alert_type.ts | 4 +-- .../siem/server/lib/detection_engine/types.ts | 2 +- .../security_and_spaces/tests/utils.ts | 4 +-- 48 files changed, 141 insertions(+), 141 deletions(-) diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 469f91c8211cc..8c97d4436a561 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -448,7 +448,7 @@ export const getResult = (): RuleAlertType => ({ references: ['http://www.example.com', 'https://ww.example.com'], note: '# Investigative notes', version: 1, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/utils.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/utils.ts index c929b0718207d..6f628170271f3 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/utils.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/utils.ts @@ -138,7 +138,7 @@ export const getOutputRuleAlertForRest = (): Omit< ], }, ], - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index a40952c078a37..2d7ddb79e5af5 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -86,7 +86,7 @@ export const createRulesBulkRoute = (router: IRouter) => { timeline_id: timelineId, timeline_title: timelineTitle, version, - lists, + exceptions_list, } = payloadRule; const ruleIdOrUuid = ruleId ?? uuid.v4(); try { @@ -143,7 +143,7 @@ export const createRulesBulkRoute = (router: IRouter) => { references, note, version, - lists, + exceptions_list, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is set to rule, otherwise we are a notification and should not enable it, }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 19c5d479deb72..1f0896686aca0 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -66,7 +66,7 @@ export const createRulesRoute = (router: IRouter): void => { type, references, note, - lists, + exceptions_list, } = request.body; const siemResponse = buildSiemResponse(response); @@ -131,7 +131,7 @@ export const createRulesRoute = (router: IRouter): void => { references, note, version: 1, - lists, + exceptions_list, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is rule, otherwise we are a notification and should not enable it, }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 58da27916c198..527fab786910f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -138,7 +138,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { timeline_id: timelineId, timeline_title: timelineTitle, version, - lists, + exceptions_list, } = parsedRule; try { @@ -195,7 +195,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { references, note, version, - lists, + exceptions_list, actions: [], // Actions are not imported nor exported at this time }); resolve({ rule_id: ruleId, status_code: 200 }); @@ -232,7 +232,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { references, note, version, - lists, + exceptions_list, anomalyThreshold, machineLearningJobId, }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 8f319063b2a9a..6db91d74294fc 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -81,7 +81,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { references, note, version, - lists, + exceptions_list, } = payloadRule; const finalIndex = outputIndex ?? siemClient.signalsIndex; const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; @@ -121,7 +121,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { references, note, version, - lists, + exceptions_list, actions, }); if (rule != null) { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 7d69af4bcbd9b..7dbbe5a22ab46 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -67,7 +67,7 @@ export const updateRulesRoute = (router: IRouter) => { references, note, version, - lists, + exceptions_list, } = request.body; const siemResponse = buildSiemResponse(response); @@ -117,7 +117,7 @@ export const updateRulesRoute = (router: IRouter) => { references, note, version, - lists, + exceptions_list, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is rule, otherwise we are a notification and should not enable it }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts index 49d40354e68af..67b0c4462655c 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts @@ -148,7 +148,7 @@ export const transformAlertToRule = ( last_failure_message: ruleStatus?.attributes.lastFailureMessage, last_success_message: ruleStatus?.attributes.lastSuccessMessage, // TODO: (LIST-FEATURE) Remove hasListsFeature() check once we have lists available for a release - lists: hasListsFeature() ? alert.params.lists : null, + exceptions_list: hasListsFeature() ? alert.params.exceptions_list : null, }); }; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/validate.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/validate.test.ts index 3de801a5b6b17..9069202d4d3aa 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/validate.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/validate.test.ts @@ -71,7 +71,7 @@ export const ruleOutput: RulesSchema = { }, }, ], - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts index 346da53736ad6..226dea7c20344 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts @@ -1542,8 +1542,8 @@ describe('add prepackaged rules schema', () => { // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('lists', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and lists] does validate', () => { + describe.skip('exceptions_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { expect( addPrepackagedRulesSchema.validate>({ rule_id: 'rule-1', @@ -1558,7 +1558,7 @@ describe('add prepackaged rules schema', () => { risk_score: 50, note: '# some markdown', version: 1, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -1594,7 +1594,7 @@ describe('add prepackaged rules schema', () => { ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty lists] does validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { expect( addPrepackagedRulesSchema.validate>({ rule_id: 'rule-1', @@ -1608,15 +1608,15 @@ describe('add prepackaged rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [], + exceptions_list: [], version: 1, }).error ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid lists] does NOT validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { expect( - addPrepackagedRulesSchema.validate>>({ + addPrepackagedRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1628,17 +1628,17 @@ describe('add prepackaged rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [{ invalid_value: 'invalid value' }], + exceptions_list: [{ invalid_value: 'invalid value' }], version: 1, }).error.message ).toEqual( - 'child "lists" fails because ["lists" at position 0 fails because [child "field" fails because ["field" is required]]]' + 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' ); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent lists] does validate with empty lists', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { expect( - addPrepackagedRulesSchema.validate>>({ + addPrepackagedRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1651,7 +1651,7 @@ describe('add prepackaged rules schema', () => { risk_score: 50, note: '# some markdown', version: 1, - }).value.lists + }).value.exceptions_list ).toEqual([]); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts index 006fc81e3ee87..0e82a9b979c7b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts @@ -114,5 +114,5 @@ export const addPrepackagedRulesSchema = Joi.object({ version: version.required(), // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - lists: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), + exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts index 0d7b562b97b2c..1e2941015b735 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts @@ -1510,8 +1510,8 @@ describe('create rules schema', () => { // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('lists', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and lists] does validate', () => { + describe.skip('exceptions_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { expect( createRulesSchema.validate>({ rule_id: 'rule-1', @@ -1525,7 +1525,7 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -1561,7 +1561,7 @@ describe('create rules schema', () => { ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty lists] does validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { expect( createRulesSchema.validate>({ rule_id: 'rule-1', @@ -1575,14 +1575,14 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [], + exceptions_list: [], }).error ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid lists] does NOT validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { expect( - createRulesSchema.validate>>({ + createRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1594,16 +1594,16 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [{ invalid_value: 'invalid value' }], + exceptions_list: [{ invalid_value: 'invalid value' }], }).error.message ).toEqual( - 'child "lists" fails because ["lists" at position 0 fails because [child "field" fails because ["field" is required]]]' + 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' ); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent lists] does validate with empty lists', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { expect( - createRulesSchema.validate>>({ + createRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1615,7 +1615,7 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - }).value.lists + }).value.exceptions_list ).toEqual([]); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.ts index 5213f3faaf486..dec8b5ccbc790 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/create_rules_schema.ts @@ -98,5 +98,5 @@ export const createRulesSchema = Joi.object({ version: version.default(1), // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - lists: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), + exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts index b8d601b743895..d28530ffb789e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts @@ -1729,8 +1729,8 @@ describe('import rules schema', () => { // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('lists', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and lists] does validate', () => { + describe.skip('exceptions_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { expect( importRulesSchema.validate>({ rule_id: 'rule-1', @@ -1744,7 +1744,7 @@ describe('import rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -1780,7 +1780,7 @@ describe('import rules schema', () => { ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty lists] does validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { expect( importRulesSchema.validate>({ rule_id: 'rule-1', @@ -1794,14 +1794,14 @@ describe('import rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [], + exceptions_list: [], }).error ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid lists] does NOT validate and lists is empty', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate and exceptions_list is empty', () => { expect( - importRulesSchema.validate>>({ + importRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1813,16 +1813,16 @@ describe('import rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [{ invalid_value: 'invalid value' }], + exceptions_list: [{ invalid_value: 'invalid value' }], }).error.message ).toEqual( - 'child "lists" fails because ["lists" at position 0 fails because [child "field" fails because ["field" is required]]]' + 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' ); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent lists] does validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate', () => { expect( - importRulesSchema.validate>>({ + importRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1834,7 +1834,7 @@ describe('import rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - }).value.lists + }).value.exceptions_list ).toEqual([]); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.ts index 56aa45659fda7..d3c728ebac1a9 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/import_rules_schema.ts @@ -119,7 +119,7 @@ export const importRulesSchema = Joi.object({ updated_by, // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - lists: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), + exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), }); export const importRulesQuerySchema = Joi.object({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts index 02655e3972d81..755c0b2ccaa3f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts @@ -1213,8 +1213,8 @@ describe('patch rules schema', () => { // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('lists', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and lists] does validate', () => { + describe.skip('exceptions_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { expect( patchRulesSchema.validate>({ rule_id: 'rule-1', @@ -1228,7 +1228,7 @@ describe('patch rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -1264,11 +1264,11 @@ describe('patch rules schema', () => { ).toBeFalsy(); }); - test('lists can be patched', () => { + test('exceptions_list can be patched', () => { expect( patchRulesSchema.validate>({ rule_id: 'some id', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -1301,7 +1301,7 @@ describe('patch rules schema', () => { ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty lists] does validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { expect( patchRulesSchema.validate>({ rule_id: 'rule-1', @@ -1315,14 +1315,14 @@ describe('patch rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [], + exceptions_list: [], }).error ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid lists] does NOT validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { expect( - patchRulesSchema.validate>>({ + patchRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1334,16 +1334,16 @@ describe('patch rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [{ invalid_value: 'invalid value' }], + exceptions_list: [{ invalid_value: 'invalid value' }], }).error.message ).toEqual( - 'child "lists" fails because ["lists" at position 0 fails because [child "field" fails because ["field" is required]]]' + 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' ); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent lists] does validate with empty lists', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { expect( - patchRulesSchema.validate>>({ + patchRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1355,7 +1355,7 @@ describe('patch rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - }).value.lists + }).value.exceptions_list ).toEqual([]); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts index 52aefa29884c3..503bc64df237c 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts @@ -78,5 +78,5 @@ export const patchRulesSchema = Joi.object({ version, // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - lists: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), + exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), }).xor('id', 'rule_id'); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/__mocks__/utils.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/__mocks__/utils.ts index d5ea950d163f5..21f18f9db55fb 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/__mocks__/utils.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/__mocks__/utils.ts @@ -63,7 +63,7 @@ export const getBaseResponsePayload = (anchorDate: string = ANCHOR_DATE): RulesS language: 'kuery', rule_id: 'query-rule-id', interval: '5m', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.test.ts index fb9ff2c28dc44..4bfc51c1a66aa 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.test.ts @@ -207,7 +207,7 @@ describe('rules_schema', () => { }); // TODO: (LIST-FEATURE) Remove this test once the feature flag is deployed - test('it should remove lists when we need it to be removed because the feature is off but there exists a list in the data', () => { + test('it should remove exceptions_list when we need it to be removed because the feature is off but there exists a list in the data', () => { const payload = getBaseResponsePayload(); const decoded = rulesSchema.decode(payload); const listRemoved = removeList(decoded); @@ -246,9 +246,9 @@ describe('rules_schema', () => { }); }); - test('it should work with lists that are not there and not cause invalidation or errors', () => { + test('it should work with exceptions_list that are not there and not cause invalidation or errors', () => { const payload = getBaseResponsePayload(); - const { lists, ...payloadWithoutLists } = payload; + const { exceptions_list, ...payloadWithoutLists } = payload; const decoded = rulesSchema.decode(payloadWithoutLists); const listRemoved = removeList(decoded); const message = pipe(listRemoved, foldLeftRight); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.ts index 1574e8f5aa6e1..fb1ee8e670e31 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/rules_schema.ts @@ -87,7 +87,7 @@ export const requiredRulesSchema = t.type({ updated_at, created_by, version, - lists: ListsDefaultArray, + exceptions_list: ListsDefaultArray, }); export type RequiredRulesSchema = t.TypeOf; @@ -172,7 +172,7 @@ export const removeList = ( ): Either => { const onLeft = (errors: t.Errors): Either => left(errors); const onRight = (decodedValue: RequiredRulesSchema): Either => { - delete decodedValue.lists; + delete decodedValue.exceptions_list; return right(decodedValue); }; const folded = fold(onLeft, onRight); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts index 78fa7d6cc71ad..b89df0fc0f3ab 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts @@ -1536,8 +1536,8 @@ describe('create rules schema', () => { // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('lists', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and lists] does validate', () => { + describe.skip('exceptions_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { expect( updateRulesSchema.validate>({ rule_id: 'rule-1', @@ -1551,7 +1551,7 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -1584,7 +1584,7 @@ describe('create rules schema', () => { ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty lists] does validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { expect( updateRulesSchema.validate>({ rule_id: 'rule-1', @@ -1598,14 +1598,14 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [], + exceptions_list: [], }).error ).toBeFalsy(); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid lists] does NOT validate', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { expect( - updateRulesSchema.validate>>({ + updateRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1617,16 +1617,16 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - lists: [{ invalid_value: 'invalid value' }], + exceptions_list: [{ invalid_value: 'invalid value' }], }).error.message ).toEqual( - 'child "lists" fails because ["lists" at position 0 fails because [child "field" fails because ["field" is required]]]' + 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' ); }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent lists] does validate with empty lists', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { expect( - updateRulesSchema.validate>>({ + updateRulesSchema.validate>>({ rule_id: 'rule-1', description: 'some description', from: 'now-5m', @@ -1638,7 +1638,7 @@ describe('create rules schema', () => { type: 'query', risk_score: 50, note: '# some markdown', - }).value.lists + }).value.exceptions_list ).toEqual([]); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.ts index f842c14f41ae6..b1b37801b644f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/update_rules_schema.ts @@ -107,5 +107,5 @@ export const updateRulesSchema = Joi.object({ version, // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - lists: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), + exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), }).xor('id', 'rule_id'); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules.ts index 76cfffdfe9f40..a007fe35b407e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules.ts @@ -42,11 +42,11 @@ export const createRules = async ({ references, note, version, - lists, + exceptions_list, actions, }: CreateRuleParams): Promise => { - // TODO: Remove this and use regular lists once the feature is stable for a release - const listsParam = hasListsFeature() ? { lists } : {}; + // TODO: Remove this and use regular exceptions_list once the feature is stable for a release + const exceptionsListParam = hasListsFeature() ? { exceptions_list } : {}; return alertsClient.create({ data: { name, @@ -79,7 +79,7 @@ export const createRules = async ({ references, note, version, - ...listsParam, + ...exceptionsListParam, }, schedule: { interval }, enabled, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts index 695057ccc2f70..8044692ab90b1 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts @@ -66,7 +66,7 @@ describe('create_rules_stream_from_ndjson', () => { immutable: false, query: '', language: 'kuery', - lists: [], + exceptions_list: [], max_signals: 100, tags: [], threat: [], @@ -92,7 +92,7 @@ describe('create_rules_stream_from_ndjson', () => { immutable: false, query: '', language: 'kuery', - lists: [], + exceptions_list: [], max_signals: 100, tags: [], threat: [], @@ -158,7 +158,7 @@ describe('create_rules_stream_from_ndjson', () => { language: 'kuery', max_signals: 100, tags: [], - lists: [], + exceptions_list: [], threat: [], throttle: null, references: [], @@ -183,7 +183,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, @@ -230,7 +230,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, @@ -256,7 +256,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, @@ -303,7 +303,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, @@ -330,7 +330,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, @@ -376,7 +376,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, @@ -405,7 +405,7 @@ describe('create_rules_stream_from_ndjson', () => { query: '', language: 'kuery', max_signals: 100, - lists: [], + exceptions_list: [], tags: [], threat: [], throttle: null, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts index df902854962b1..6df250f1cf513 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts @@ -79,7 +79,7 @@ describe('getExportAll', () => { throttle: 'no_actions', note: '# Investigative notes', version: 1, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts index ce6819462aa27..092a9a8faf395 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts @@ -87,7 +87,7 @@ describe('get_export_by_object_ids', () => { throttle: 'no_actions', note: '# Investigative notes', version: 1, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -215,7 +215,7 @@ describe('get_export_by_object_ids', () => { throttle: 'no_actions', note: '# Investigative notes', version: 1, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/install_prepacked_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/install_prepacked_rules.ts index 46d5b5fdf452e..3d3ed52b2feb2 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/install_prepacked_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/install_prepacked_rules.ts @@ -46,7 +46,7 @@ export const installPrepackagedRules = ( references, note, version, - lists, + exceptions_list, } = rule; return [ ...acc, @@ -82,7 +82,7 @@ export const installPrepackagedRules = ( references, note, version, - lists, + exceptions_list, actions: [], // At this time there is no pre-packaged actions }), ]; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts index 347b370c89e07..c23f539b58160 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts @@ -44,7 +44,7 @@ export const patchRules = async ({ references, note, version, - lists, + exceptions_list, anomalyThreshold, machineLearningJobId, }: PatchRuleParams): Promise => { @@ -78,7 +78,7 @@ export const patchRules = async ({ references, version, note, - lists, + exceptions_list, anomalyThreshold, machineLearningJobId, }); @@ -110,7 +110,7 @@ export const patchRules = async ({ references, note, version: calculatedVersion, - lists, + exceptions_list, anomalyThreshold, machineLearningJobId, } diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts index 183b81f3a3c77..7ddbbd76b0661 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts @@ -44,7 +44,7 @@ export const updateRules = async ({ references, version, note, - lists, + exceptions_list, anomalyThreshold, machineLearningJobId, actions, @@ -83,8 +83,8 @@ export const updateRules = async ({ machineLearningJobId, }); - // TODO: Remove this and use regular lists once the feature is stable for a release - const listsParam = hasListsFeature() ? { lists } : {}; + // TODO: Remove this and use regular exceptions_list once the feature is stable for a release + const exceptionsListParam = hasListsFeature() ? { exceptions_list } : {}; const update = await alertsClient.update({ id: rule.id, @@ -120,7 +120,7 @@ export const updateRules = async ({ version: calculatedVersion, anomalyThreshold, machineLearningJobId, - ...listsParam, + ...exceptionsListParam, }, }, }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/patches/update_list.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/patches/update_list.json index 4db8724db4e13..8d831f3a961d8 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/patches/update_list.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/patches/update_list.json @@ -1,6 +1,6 @@ { "rule_id": "query-with-list", - "lists": [ + "exceptions_list": [ { "field": "source.ip", "values_operator": "excluded", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_and.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_and.json index 33ae8df87e3c8..1575a712e2cba 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_and.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_and.json @@ -8,7 +8,7 @@ "query": "host.name: *", "interval": "30s", "language": "kuery", - "lists": [ + "exceptions_list": [ { "field": "event.module", "values_operator": "excluded", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_excluded.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_excluded.json index 8ce9440fce219..4e6d9403a276f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_excluded.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_excluded.json @@ -8,7 +8,7 @@ "query": "host.name: *", "interval": "30s", "language": "kuery", - "lists": [ + "exceptions_list": [ { "field": "event.module", "values_operator": "excluded", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_exists.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_exists.json index 4ec014422a61b..97beace37633f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_exists.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_exists.json @@ -8,7 +8,7 @@ "query": "host.name: *", "interval": "30s", "language": "kuery", - "lists": [ + "exceptions_list": [ { "field": "event.action", "values_operator": "included", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_list.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_list.json index ce4bf80b0a722..ad0585b5a2ec5 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_list.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_list.json @@ -8,7 +8,7 @@ "query": "host.name: *", "interval": "30s", "language": "kuery", - "lists": [ + "exceptions_list": [ { "field": "event.module", "values_operator": "excluded", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match.json index e1abac19b51e5..6e6880cc28f24 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match.json @@ -8,7 +8,7 @@ "query": "host.name: *", "interval": "30s", "language": "kuery", - "lists": [ + "exceptions_list": [ { "field": "event.module", "values_operator": "included", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match_all.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match_all.json index 1afbb1fee4785..44cc26ac3315e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match_all.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_match_all.json @@ -8,7 +8,7 @@ "query": "host.name: *", "interval": "30s", "language": "kuery", - "lists": [ + "exceptions_list": [ { "field": "event.module", "values_operator": "included", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_or.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_or.json index 08e38e9ffa53d..9c4eda559d5bc 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_or.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/queries/lists/query_with_or.json @@ -7,7 +7,7 @@ "type": "query", "query": "host.name: *", "interval": "30s", - "lists": [ + "exceptions_list": [ { "field": "event.module", "values_operator": "excluded", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/updates/update_list.json b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/updates/update_list.json index 66b198974f574..df22dff5c046e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/updates/update_list.json +++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/rules/updates/update_list.json @@ -6,7 +6,7 @@ "severity": "high", "type": "query", "query": "user.name: root or user.name: admin", - "lists": [ + "exceptions_list": [ { "field": "source.ip", "values_operator": "excluded", diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts index d361e424f01e3..8a5da8e859721 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -44,7 +44,7 @@ export const sampleRuleAlertParams = ( meta: undefined, threat: undefined, version: 1, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts index f1729e35ce1f0..bbd01cfaafc62 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts @@ -90,7 +90,7 @@ describe('buildBulkBody', () => { version: 1, created_at: fakeSignalSourceHit.signal.rule?.created_at, updated_at: fakeSignalSourceHit.signal.rule?.updated_at, - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -216,7 +216,7 @@ describe('buildBulkBody', () => { created_at: fakeSignalSourceHit.signal.rule?.created_at, updated_at: fakeSignalSourceHit.signal.rule?.updated_at, throttle: 'no_actions', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -340,7 +340,7 @@ describe('buildBulkBody', () => { created_at: fakeSignalSourceHit.signal.rule?.created_at, updated_at: fakeSignalSourceHit.signal.rule?.updated_at, throttle: 'no_actions', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -457,7 +457,7 @@ describe('buildBulkBody', () => { updated_at: fakeSignalSourceHit.signal.rule?.updated_at, created_at: fakeSignalSourceHit.signal.rule?.created_at, throttle: 'no_actions', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_exceptions_query.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_exceptions_query.ts index 22a57db87afb0..7a1564bb69546 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_exceptions_query.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_exceptions_query.ts @@ -185,7 +185,7 @@ export const buildQueryExceptions = ({ }: { query: string; language: Language; - lists: RuleAlertParams['lists']; + lists: RuleAlertParams['exceptions_list']; }): Query[] => { if (lists && lists !== null) { const exceptions = buildExceptions({ lists, language, query }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.test.ts index e5183ed4df7bd..b3586c884d0c7 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.test.ts @@ -79,7 +79,7 @@ describe('buildRule', () => { query: 'host.name: Braden', }, ], - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -162,7 +162,7 @@ describe('buildRule', () => { updated_at: rule.updated_at, created_at: rule.created_at, throttle: 'no_actions', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', @@ -244,7 +244,7 @@ describe('buildRule', () => { updated_at: rule.updated_at, created_at: rule.created_at, throttle: 'no_actions', - lists: [ + exceptions_list: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.ts index 9c375d7d45d5e..93d4e5e7719b2 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_rule.ts @@ -72,7 +72,7 @@ export const buildRule = ({ version: ruleParams.version, created_at: createdAt, updated_at: updatedAt, - lists: ruleParams.lists, + exceptions_list: ruleParams.exceptions_list, machine_learning_job_id: ruleParams.machineLearningJobId, anomaly_threshold: ruleParams.anomalyThreshold, }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/get_filter.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/get_filter.ts index c685ce4567afa..d8fdab55bddeb 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/get_filter.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/get_filter.ts @@ -22,7 +22,7 @@ export const getQueryFilter = ( language: Language, filters: PartialFilter[], index: string[], - lists: RuleAlertParams['lists'] + lists: RuleAlertParams['exceptions_list'] ) => { const indexPattern = { fields: [], @@ -53,7 +53,7 @@ interface GetFilterArgs { savedId: string | undefined | null; services: AlertServices; index: string[] | undefined | null; - lists: RuleAlertParams['lists']; + lists: RuleAlertParams['exceptions_list']; } interface QueryAttributes { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_params_schema.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_params_schema.ts index 58dd53b6447c5..81a6ce9b08f02 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_params_schema.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_params_schema.ts @@ -39,5 +39,5 @@ export const signalParamsSchema = () => type: schema.string(), references: schema.arrayOf(schema.string(), { defaultValue: [] }), version: schema.number({ defaultValue: 1 }), - lists: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), + exceptions_list: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts index efb1338fd480e..137603741dc8f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -66,7 +66,7 @@ export const signalRulesAlertType = ({ query, to, type, - lists, + exceptions_list, } = params; const searchAfterSize = Math.min(maxSignals, DEFAULT_SEARCH_AFTER_PAGE_SIZE); let hasError: boolean = false; @@ -201,7 +201,7 @@ export const signalRulesAlertType = ({ savedId, services, index: inputIndex, - lists, + lists: exceptions_list, }); const noReIndex = buildEventsSearchQuery({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/types.ts b/x-pack/plugins/siem/server/lib/detection_engine/types.ts index 357a2ab39e3fb..f2026804da51a 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/types.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/types.ts @@ -68,7 +68,7 @@ export interface RuleAlertParams { type: RuleType; version: number; throttle: string | undefined | null; - lists: ListsDefaultArraySchema | null | undefined; + exceptions_list: ListsDefaultArraySchema | null | undefined; } export type RuleTypeParams = Omit< diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts index cebe24dc5ccc2..e508cf1aaa2e0 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts @@ -154,7 +154,7 @@ export const getSimpleRuleOutput = (ruleId = 'rule-1'): Partial Date: Fri, 17 Apr 2020 16:16:53 -0700 Subject: [PATCH 02/15] skip flaky suite (#63747) --- .../security_and_spaces/tests/find_statuses.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts index 44847d5c8146c..afc76ce922218 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts @@ -21,7 +21,8 @@ export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); const es = getService('legacyEs'); - describe('find_statuses', () => { + // FLAKY: https://github.com/elastic/kibana/issues/63747 + describe.skip('find_statuses', () => { beforeEach(async () => { await createSignalsIndex(supertest); }); From 5bba0221d1f4f013773b95cf11bf065c8d4562e4 Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 17 Apr 2020 16:27:18 -0700 Subject: [PATCH 03/15] Revert "skip flaky suite (#63747)" This reverts commit 3405d54e3a722f9ea7c3e588d48036d690784ae4. --- .../security_and_spaces/tests/find_statuses.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts index afc76ce922218..44847d5c8146c 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts @@ -21,8 +21,7 @@ export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); const es = getService('legacyEs'); - // FLAKY: https://github.com/elastic/kibana/issues/63747 - describe.skip('find_statuses', () => { + describe('find_statuses', () => { beforeEach(async () => { await createSignalsIndex(supertest); }); From 2e45234eff233b9e42ea0367f2807f71587dee07 Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 17 Apr 2020 16:41:54 -0700 Subject: [PATCH 04/15] skip flaky suite (#63621) --- x-pack/test/functional_endpoint/apps/endpoint/host_list.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts index 9a4ffecf85d52..35843dc6a76db 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts @@ -12,7 +12,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); - describe('host list', function() { + // FLAKY: https://github.com/elastic/kibana/issues/63621 + describe.skip('host list', function() { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise(resolve => setTimeout(resolve, ms)); before(async () => { From 055d1fb7d4f44af01a4d305ca0832b5083a36d2e Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Fri, 17 Apr 2020 17:04:02 -0700 Subject: [PATCH 05/15] [Alerting] Documentation for how to pre-configure connectors. (#63807) * [Alerting] Documentation for how to pre-configure connectors. * small fix * Adjusted titles * Fixed wrong link * fixed warning * Fixed ci issues * [DOCS] Edits preconfigured connector docs * Replaced words 'pre-configured' with 'preconfigured' Co-authored-by: gchaps --- docs/user/alerting/action-types.asciidoc | 15 ++- ...ert-pre-configured-connectors-dropdown.png | Bin 0 -> 92273 bytes .../alert-pre-configured-slack-connector.png | Bin 0 -> 146428 bytes .../pre-configured-connectors-managing.png | Bin 0 -> 194854 bytes .../pre-configured-connectors-view-screen.png | Bin 0 -> 94078 bytes .../pre-configured-connectors.asciidoc | 88 ++++++++++++++++++ .../action_form.test.tsx | 2 +- .../action_connector_form/action_form.tsx | 2 +- .../connector_edit_flyout.test.tsx | 4 +- .../connector_edit_flyout.tsx | 4 +- .../components/actions_connectors_list.tsx | 2 +- .../apps/triggers_actions_ui/connectors.ts | 4 +- 12 files changed, 109 insertions(+), 12 deletions(-) create mode 100644 docs/user/alerting/images/alert-pre-configured-connectors-dropdown.png create mode 100644 docs/user/alerting/images/alert-pre-configured-slack-connector.png create mode 100644 docs/user/alerting/images/pre-configured-connectors-managing.png create mode 100644 docs/user/alerting/images/pre-configured-connectors-view-screen.png create mode 100644 docs/user/alerting/pre-configured-connectors.asciidoc diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc index 2913bf28dd765..49e7bd1d77743 100644 --- a/docs/user/alerting/action-types.asciidoc +++ b/docs/user/alerting/action-types.asciidoc @@ -34,14 +34,23 @@ a| <> [NOTE] ============================================== -Some action types are paid commercial features, while others are free. -For a comparison of the Elastic subscription levels, -see https://www.elastic.co/subscriptions[the subscription page]. +Some action types are paid commercial features, while others are free. +For a comparison of the Elastic subscription levels, +see https://www.elastic.co/subscriptions[the subscription page]. ============================================== +[float] +[[create-connectors]] +=== Connectors + +You can create connectors for actions in <> or via the action API. +For out-of-the-box and standardized connectors, you can <> +before {kib} starts. + include::action-types/email.asciidoc[] include::action-types/index.asciidoc[] include::action-types/pagerduty.asciidoc[] include::action-types/server-log.asciidoc[] include::action-types/slack.asciidoc[] include::action-types/webhook.asciidoc[] +include::pre-configured-connectors.asciidoc[] diff --git a/docs/user/alerting/images/alert-pre-configured-connectors-dropdown.png b/docs/user/alerting/images/alert-pre-configured-connectors-dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6c713298626f4f733e9e685815af168a95f77d GIT binary patch literal 92273 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

Snh{Ng41B}KT>M=1! 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 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/pre-configured-connectors-managing.png b/docs/user/alerting/images/pre-configured-connectors-managing.png new file mode 100644 index 0000000000000000000000000000000000000000..f97e93175fa368b6dca3a9f415cf43e0794ee8f6 GIT binary patch literal 194854 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

  • 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
      dhgv`LZ1BiVNC)BUd?Tn*dzsJ1}tuk*W|h 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 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/pre-configured-connectors.asciidoc b/docs/user/alerting/pre-configured-connectors.asciidoc new file mode 100644 index 0000000000000..3db13acfb423e --- /dev/null +++ b/docs/user/alerting/pre-configured-connectors.asciidoc @@ -0,0 +1,88 @@ +[role="xpack"] +[[pre-configured-connectors]] + +== Preconfigured connectors + +You can preconfigure an action connector to have all the information it needs prior to startup +by adding it to the `kibana.yml` file. +Sensitive configuration information, such as credentials, can use the {kib} keystore. + +Preconfigured connectors offer the following capabilities: + +- Require no setup. Configuration and credentials needed to execute an +action are predefined, including the connector name and ID. +- Appear in all spaces because they are not saved objects. +- Cannot be edited or deleted. + +[float] +[[preconfigured-connector-example]] +=== Example of a preconfigured connector + +The following example shows a valid configuration 2 out-of-the box connector. + +[source,console] +------------------------ + xpack.actions.preconfigured: + - id: 'my-slack1' <1> + actionTypeId: .slack <2> + name: 'Slack #xyz' <3> + config: <4> + webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' + - id: 'webhook-service' + actionTypeId: .webhook + name: 'Email service' + config: + url: 'https://email-alert-service.elastic.co' + method: post + headers: + header1: value1 + header2: value2 + secrets: <5> + user: elastic + password: changeme +------------------------ + +<1> `id` is the action connector identifier. +<2> `actionTypeId` is the action type identifier. +<3> `name` is the name of the preconfigured connector. +<4> `config` is the action type specific to the configuration. +<5> `secrets` is sensitive configuration, such as username, password, and keys. + +[NOTE] +============================================== +Sensitive properties, such as passwords, can also be stored in the {kib} keystore. +============================================== + +[float] +[[pre-configured-connector-alert-form]] +=== Creating an alert with a preconfigured connector + +When attaching an action to an alert, +select from a list of available action types, and +then select the Slack or Webhook type. Those action types were configured previously. +The preconfigured connector is installed and is automatically selected. + +[role="screenshot"] +image::images/alert-pre-configured-slack-connector.png[Create alert with selected Slack action type] + +The dropdown is populated with additional preconfigured Slack connectors. +The `preconfigured` label distinguishes them from space-aware connectors that use saved objects. + +[role="screenshot"] +image::images/alert-pre-configured-connectors-dropdown.png[Dropdown list with pre-cofigured connectors] + +[float] +[[managing-pre-configured-connectors]] +=== Managing preconfigured connectors + +Preconfigured connectors appear in the connector list, regardless of which space the user is in. +They are tagged as “preconfigured” and cannot be deleted. + +[role="screenshot"] +image::images/pre-configured-connectors-managing.png[Connectors managing tab with pre-cofigured] + +Clicking on a preconfigured connector shows the description, but not any of the configuration. +A message indicates that this is a preconfigured connector. + +[role="screenshot"] +image::images/pre-configured-connectors-view-screen.png[Pre-configured connector view details] 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 index 488db42f4e843..d4def86b07b1f 100644 --- 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 @@ -232,7 +232,7 @@ describe('action_form', () => { Object { "id": "test2", "key": "test2", - "label": "Test connector 2 (pre-configured)", + "label": "Test connector 2 (preconfigured)", }, ] `); 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 index 897b120508507..4199cfb7b4b7f 100644 --- 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 @@ -152,7 +152,7 @@ export const ActionForm = ({ const preconfiguredMessage = i18n.translate( 'xpack.triggersActionsUI.sections.actionForm.preconfiguredTitleMessage', { - defaultMessage: '(pre-configured)', + defaultMessage: '(preconfigured)', } ); const getSelectedOptions = (actionItemId: string) => { 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 6659888797679..4dba4c70f794f 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 @@ -96,13 +96,13 @@ describe('connector_edit_flyout', () => { expect(connectorNameField.first().prop('value')).toBe('action-connector'); }); - test('if pre-configured connector rendered correct in the edit form', () => { + test('if preconfigured connector rendered correct in the edit form', () => { const connector = { secrets: {}, id: 'test', actionTypeId: 'test-action-type-id', actionType: 'test-action-type-name', - name: 'pre-configured-connector', + name: 'preconfigured-connector', isPreconfigured: true, referencedByCount: 0, config: {}, 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 a81d6c285f460..690a64ef4f1f3 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 @@ -104,7 +104,7 @@ export const ConnectorEditFlyout = ({ />   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 bab342940e2d6..566a6030d72be 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 @@ -215,7 +215,7 @@ export const ActionsConnectorsList: React.FunctionComponent = () => { label={i18n.translate( 'xpack.triggersActionsUI.sections.alertForm.preconfiguredTitleMessage', { - defaultMessage: 'Pre-configured', + defaultMessage: 'Preconfigured', } )} tooltipContent="This connector can't be deleted." diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts index 0e6f991be24d0..562f64656319e 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/connectors.ts @@ -185,7 +185,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(searchResultsAfterDelete.length).to.eql(0); }); - it('should not be able to delete a pre-configured connector', async () => { + it('should not be able to delete a preconfigured connector', async () => { const preconfiguredConnectorName = 'xyz'; await pageObjects.triggersActionsUI.searchConnectors(preconfiguredConnectorName); @@ -196,7 +196,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(await testSubjects.exists('preConfiguredTitleMessage')).to.be(true); }); - it('should not be able to edit a pre-configured connector', async () => { + it('should not be able to edit a preconfigured connector', async () => { const preconfiguredConnectorName = 'xyz'; await pageObjects.triggersActionsUI.searchConnectors(preconfiguredConnectorName); From d538929ed96ff61df0d0d99b4065f881aee4ebcd Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 17 Apr 2020 17:14:11 -0700 Subject: [PATCH 06/15] [platform] serve plugins from /bundles/plugin:${id} --- src/core/public/plugins/plugin_loader.test.ts | 12 ++++++------ src/core/public/plugins/plugin_loader.ts | 2 +- src/legacy/ui/ui_render/bootstrap/template.js.hbs | 8 ++++---- src/optimize/bundles_route/bundles_route.js | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/public/plugins/plugin_loader.test.ts b/src/core/public/plugins/plugin_loader.test.ts index b4e2c3095f14a..18cc2d7a6f182 100644 --- a/src/core/public/plugins/plugin_loader.test.ts +++ b/src/core/public/plugins/plugin_loader.test.ts @@ -62,7 +62,7 @@ test('`loadPluginBundles` creates a script tag and loads initializer', async () const fakeScriptTag = createdScriptTags[0]; expect(fakeScriptTag.setAttribute).toHaveBeenCalledWith( 'src', - '/bundles/plugin/plugin-a/plugin-a.plugin.js' + '/bundles/plugin:plugin-a/plugin-a.plugin.js' ); expect(fakeScriptTag.setAttribute).toHaveBeenCalledWith('id', 'kbn-plugin-plugin-a'); expect(fakeScriptTag.onload).toBeInstanceOf(Function); @@ -85,7 +85,7 @@ test('`loadPluginBundles` includes the basePath', async () => { const fakeScriptTag = createdScriptTags[0]; expect(fakeScriptTag.setAttribute).toHaveBeenCalledWith( 'src', - '/mybasepath/bundles/plugin/plugin-a/plugin-a.plugin.js' + '/mybasepath/bundles/plugin:plugin-a/plugin-a.plugin.js' ); }); @@ -96,7 +96,7 @@ test('`loadPluginBundles` rejects if script.onerror is called', async () => { fakeScriptTag1.onerror(new Error('Whoa there!')); await expect(loadPromise).rejects.toThrowErrorMatchingInlineSnapshot( - `"Failed to load \\"plugin-a\\" bundle (/bundles/plugin/plugin-a/plugin-a.plugin.js)"` + `"Failed to load \\"plugin-a\\" bundle (/bundles/plugin:plugin-a/plugin-a.plugin.js)"` ); }); @@ -105,7 +105,7 @@ test('`loadPluginBundles` rejects if timeout is reached', async () => { // Override the timeout to 1 ms for testi. loadPluginBundle(addBasePath, 'plugin-a', { timeoutMs: 1 }) ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Timeout reached when loading \\"plugin-a\\" bundle (/bundles/plugin/plugin-a/plugin-a.plugin.js)"` + `"Timeout reached when loading \\"plugin-a\\" bundle (/bundles/plugin:plugin-a/plugin-a.plugin.js)"` ); }); @@ -115,11 +115,11 @@ test('`loadPluginBundles` rejects if bundle does attach an initializer to window const fakeScriptTag1 = createdScriptTags[0]; // Setup a fake initializer as if a plugin bundle had actually been loaded. - coreWindow.__kbnBundles__['plugin/plugin-a'] = undefined; + coreWindow.__kbnBundles__['plugin:plugin-a'] = undefined; // Call the onload callback fakeScriptTag1.onload(); await expect(loadPromise).rejects.toThrowErrorMatchingInlineSnapshot( - `"Definition of plugin \\"plugin-a\\" should be a function (/bundles/plugin/plugin-a/plugin-a.plugin.js)."` + `"Definition of plugin \\"plugin-a\\" should be a function (/bundles/plugin:plugin-a/plugin-a.plugin.js)."` ); }); diff --git a/src/core/public/plugins/plugin_loader.ts b/src/core/public/plugins/plugin_loader.ts index bf7711055e97b..9b35588dfe726 100644 --- a/src/core/public/plugins/plugin_loader.ts +++ b/src/core/public/plugins/plugin_loader.ts @@ -93,7 +93,7 @@ export const loadPluginBundle: LoadPluginBundle = < const script = document.createElement('script'); // Assumes that all plugin bundles get put into the bundles/plugins subdirectory - const bundlePath = addBasePath(`/bundles/plugin/${pluginName}/${pluginName}.plugin.js`); + const bundlePath = addBasePath(`/bundles/plugin:${pluginName}/${pluginName}.plugin.js`); script.setAttribute('src', bundlePath); script.setAttribute('id', `kbn-plugin-${pluginName}`); script.setAttribute('async', ''); diff --git a/src/legacy/ui/ui_render/bootstrap/template.js.hbs b/src/legacy/ui/ui_render/bootstrap/template.js.hbs index 1093153edbbf7..4557d911620a2 100644 --- a/src/legacy/ui/ui_render/bootstrap/template.js.hbs +++ b/src/legacy/ui/ui_render/bootstrap/template.js.hbs @@ -78,10 +78,10 @@ if (window.__kbnStrictCsp__ && window.__kbnCspNotEnforced__) { '{{this}}', {{/each}} '{{regularBundlePath}}/commons.bundle.js', - {{!-- '{{regularBundlePath}}/plugin/data/data.plugin.js', --}} - '{{regularBundlePath}}/plugin/kibanaUtils/kibanaUtils.plugin.js', - '{{regularBundlePath}}/plugin/esUiShared/esUiShared.plugin.js', - '{{regularBundlePath}}/plugin/kibanaReact/kibanaReact.plugin.js' + {{!-- '{{regularBundlePath}}/plugin:data/data.plugin.js', --}} + '{{regularBundlePath}}/plugin:kibanaUtils/kibanaUtils.plugin.js', + '{{regularBundlePath}}/plugin:esUiShared/esUiShared.plugin.js', + '{{regularBundlePath}}/plugin:kibanaReact/kibanaReact.plugin.js' ], function () { load([ '{{regularBundlePath}}/{{appId}}.bundle.js', diff --git a/src/optimize/bundles_route/bundles_route.js b/src/optimize/bundles_route/bundles_route.js index 0c2e98b5acd63..f4e3108f80a3b 100644 --- a/src/optimize/bundles_route/bundles_route.js +++ b/src/optimize/bundles_route/bundles_route.js @@ -79,8 +79,8 @@ export function createBundlesRoute({ ), ...npUiPluginPublicDirs.map(({ id, path }) => buildRouteForBundles( - `${basePublicPath}/bundles/plugin/${id}/`, - `/bundles/plugin/${id}/`, + `${basePublicPath}/bundles/plugin:${id}/`, + `/bundles/plugin:${id}/`, path, fileHashCache ) From 73548bd473ecfecb5d3340606418b9433ad13172 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Sat, 18 Apr 2020 10:34:17 +0200 Subject: [PATCH 07/15] [Drilldowns] Fix back button by removing panels from url in dashboard in view mode (#62415) * remove panels from url * review nits Co-authored-by: Elastic Machine --- .../application/dashboard_state_manager.ts | 19 ++++++-- src/plugins/dashboard/public/types.ts | 8 ++++ .../apps/dashboard/dashboard_back_button.ts | 47 +++++++++++++++++++ test/functional/apps/dashboard/index.js | 1 + .../apps/maps/embeddable/dashboard.js | 11 +++++ 5 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 test/functional/apps/dashboard/dashboard_back_button.ts diff --git a/src/plugins/dashboard/public/application/dashboard_state_manager.ts b/src/plugins/dashboard/public/application/dashboard_state_manager.ts index 13ba3c6d0b60d..b03ea95069a3d 100644 --- a/src/plugins/dashboard/public/application/dashboard_state_manager.ts +++ b/src/plugins/dashboard/public/application/dashboard_state_manager.ts @@ -34,6 +34,7 @@ import { FilterUtils } from './lib/filter_utils'; import { DashboardAppState, DashboardAppStateDefaults, + DashboardAppStateInUrl, DashboardAppStateTransitions, SavedDashboardPanel, } from '../types'; @@ -165,11 +166,12 @@ export class DashboardStateManager { }); // setup state syncing utils. state container will be synced with url into `this.STATE_STORAGE_KEY` query param - this.stateSyncRef = syncState({ + this.stateSyncRef = syncState({ storageKey: this.STATE_STORAGE_KEY, stateContainer: { ...this.stateContainer, - set: (state: DashboardAppState | null) => { + get: () => this.toUrlState(this.stateContainer.get()), + set: (state: DashboardAppStateInUrl | null) => { // sync state required state container to be able to handle null // overriding set() so it could handle null coming from url if (state) { @@ -558,9 +560,9 @@ export class DashboardStateManager { */ private saveState({ replace }: { replace: boolean }): boolean { // schedules setting current state to url - this.kbnUrlStateStorage.set( + this.kbnUrlStateStorage.set( this.STATE_STORAGE_KEY, - this.stateContainer.get() + this.toUrlState(this.stateContainer.get()) ); // immediately forces scheduled updates and changes location return this.kbnUrlStateStorage.flush({ replace }); @@ -620,4 +622,13 @@ export class DashboardStateManager { const current = _.omit(this.stateContainer.get(), propsToIgnore); return !_.isEqual(initial, current); } + + private toUrlState(state: DashboardAppState): DashboardAppStateInUrl { + if (state.viewMode === ViewMode.VIEW) { + const { panels, ...stateWithoutPanels } = state; + return stateWithoutPanels; + } + + return state; + } } diff --git a/src/plugins/dashboard/public/types.ts b/src/plugins/dashboard/public/types.ts index 7bccd3de6eca8..d96d2cdf75626 100644 --- a/src/plugins/dashboard/public/types.ts +++ b/src/plugins/dashboard/public/types.ts @@ -152,6 +152,14 @@ export type DashboardAppStateDefaults = DashboardAppState & { description?: string; }; +/** + * In URL panels are optional, + * Panels are not added to the URL when in "view" mode + */ +export type DashboardAppStateInUrl = Omit & { + panels?: SavedDashboardPanel[]; +}; + export interface DashboardAppStateTransitions { set: ( state: DashboardAppState diff --git a/test/functional/apps/dashboard/dashboard_back_button.ts b/test/functional/apps/dashboard/dashboard_back_button.ts new file mode 100644 index 0000000000000..8a488c1780fcc --- /dev/null +++ b/test/functional/apps/dashboard/dashboard_back_button.ts @@ -0,0 +1,47 @@ +/* + * 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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['dashboard', 'header', 'common', 'visualize', 'timePicker']); + const browser = getService('browser'); + + describe('dashboard back button', () => { + before(async () => { + await esArchiver.loadIfNeeded('dashboard/current/kibana'); + await kibanaServer.uiSettings.replace({ + defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c', + }); + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.preserveCrossAppState(); + }); + + it('after navigation from listing page to dashboard back button works', async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.loadSavedDashboard('dashboard with everything'); + await PageObjects.dashboard.waitForRenderComplete(); + await browser.goBack(); + expect(await PageObjects.dashboard.onDashboardLandingPage()).to.be(true); + }); + }); +} diff --git a/test/functional/apps/dashboard/index.js b/test/functional/apps/dashboard/index.js index 5e96a55b19014..6666ccc57d584 100644 --- a/test/functional/apps/dashboard/index.js +++ b/test/functional/apps/dashboard/index.js @@ -55,6 +55,7 @@ export default function({ getService, loadTestFile }) { loadTestFile(require.resolve('./dashboard_options')); loadTestFile(require.resolve('./data_shared_attributes')); loadTestFile(require.resolve('./embed_mode')); + loadTestFile(require.resolve('./dashboard_back_button')); // Note: This one must be last because it unloads some data for one of its tests! // No, this isn't ideal, but loading/unloading takes so much time and these are all bunched diff --git a/x-pack/test/functional/apps/maps/embeddable/dashboard.js b/x-pack/test/functional/apps/maps/embeddable/dashboard.js index 43d5cccb20905..9027bb5309ff8 100644 --- a/x-pack/test/functional/apps/maps/embeddable/dashboard.js +++ b/x-pack/test/functional/apps/maps/embeddable/dashboard.js @@ -13,6 +13,7 @@ export default function({ getPageObjects, getService }) { const dashboardPanelActions = getService('dashboardPanelActions'); const inspector = getService('inspector'); const testSubjects = getService('testSubjects'); + const browser = getService('browser'); describe('embed in dashboard', () => { before(async () => { @@ -111,5 +112,15 @@ export default function({ getPageObjects, getService }) { const afterRefreshTimerTimestamp = await getRequestTimestamp(); expect(beforeRefreshTimerTimestamp).not.to.equal(afterRefreshTimerTimestamp); }); + + // see https://github.com/elastic/kibana/issues/61596 on why it is specific to maps + it("dashboard's back button should navigate to previous page", async () => { + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.preserveCrossAppState(); + await PageObjects.dashboard.loadSavedDashboard('map embeddable example'); + await PageObjects.dashboard.waitForRenderComplete(); + await browser.goBack(); + expect(await PageObjects.dashboard.onDashboardLandingPage()).to.be(true); + }); }); } From c59320c7dd8ca8828d7ae80627dbfeb284d61e5d Mon Sep 17 00:00:00 2001 From: Shahzad Date: Sat, 18 Apr 2020 13:41:11 +0200 Subject: [PATCH 08/15] =?UTF-8?q?[Uptime]=20Refresh=20index=20and=20also?= =?UTF-8?q?=20show=20more=20info=20to=20user=20regardi=E2=80=A6=20(#62606)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refresh index and also show more info to user * updated type * updated type * updated test * updated formatting * update text * updated types * updated translation * update * fixed types * updated code * fixed types Co-authored-by: Elastic Machine --- .../connected/empty_state/empty_state.tsx | 22 +- .../__snapshots__/data_missing.test.tsx.snap | 52 - .../data_or_index_missing.test.tsx.snap | 92 + .../__snapshots__/empty_state.test.tsx.snap | 1542 +++++++++++------ .../__tests__/data_missing.test.tsx | 16 - .../__tests__/data_or_index_missing.test.tsx | 24 + .../__tests__/empty_state.test.tsx | 14 +- .../functional/empty_state/data_missing.tsx | 64 - .../empty_state/data_or_index_missing.tsx | 86 + .../functional/empty_state/empty_index.tsx | 67 - .../functional/empty_state/empty_state.tsx | 34 +- .../uptime/public/pages/page_header.tsx | 9 +- .../plugins/uptime/public/pages/settings.tsx | 2 +- .../public/state/actions/dynamic_settings.ts | 3 +- .../public/state/api/dynamic_settings.ts | 13 +- .../public/state/effects/dynamic_settings.ts | 6 +- .../translations/translations/ja-JP.json | 5 - .../translations/translations/zh-CN.json | 5 - 18 files changed, 1277 insertions(+), 779 deletions(-) delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_missing.test.tsx.snap create mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_missing.test.tsx create mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_or_index_missing.test.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_missing.tsx create mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_or_index_missing.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_index.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx b/x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx index 55c92e70b6066..b0868af70480a 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx @@ -7,26 +7,44 @@ import React, { useContext, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { indexStatusAction } from '../../../state/actions'; -import { indexStatusSelector } from '../../../state/selectors'; +import { indexStatusSelector, selectDynamicSettings } from '../../../state/selectors'; import { EmptyStateComponent } from '../../functional/empty_state/empty_state'; import { UptimeRefreshContext } from '../../../contexts'; +import { getDynamicSettings } from '../../../state/actions/dynamic_settings'; export const EmptyState: React.FC = ({ children }) => { const { data, loading, error } = useSelector(indexStatusSelector); const { lastRefresh } = useContext(UptimeRefreshContext); + const { settings } = useSelector(selectDynamicSettings); + + const heartbeatIndices = settings?.heartbeatIndices || ''; + const dispatch = useDispatch(); useEffect(() => { - dispatch(indexStatusAction.get()); + if (!data || data?.docCount === 0 || data?.indexExists === false) { + dispatch(indexStatusAction.get()); + } + // Don't add data , it will create endless loop + // eslint-disable-next-line react-hooks/exhaustive-deps }, [dispatch, lastRefresh]); + useEffect(() => { + dispatch(indexStatusAction.get()); + }, [dispatch, heartbeatIndices]); + + useEffect(() => { + dispatch(getDynamicSettings()); + }, [dispatch]); + return ( ); }; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_missing.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_missing.test.tsx.snap deleted file mode 100644 index 2182bfb4e656c..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_missing.test.tsx.snap +++ /dev/null @@ -1,52 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`DataMissing component renders basePath and headingMessage 1`] = ` - - - - - - - - , - } - } - /> -

      - } - iconType="uptimeApp" - title={ - -

      - bar -

      -
      - } - /> -
      -
      -
      -`; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap new file mode 100644 index 0000000000000..25ac5a1f0974e --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap @@ -0,0 +1,92 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DataOrIndexMissing component renders headingMessage 1`] = ` + + + + + + + + + + + + + + + + + } + body={ + +

      + +

      +

      + +

      +
      + } + iconType="logoUptime" + title={ + +

      + + heartbeat-* + , + } + } + /> +

      +
      + } + /> +
      +
      +
      +`; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap index 2d45bbd18a60c..d0e7af24e1c1b 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap +++ b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap @@ -1,7 +1,39 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`EmptyState component does not render empty state with appropriate base path and no docs 1`] = ` - - - , + } + } + /> + } > -
      - -
      - -
      - - -
      - - - - , - } - } - /> -

      - } - iconType="uptimeApp" - title={ - -

      - No uptime data found -

      -
      - } +
      + + +
      -
      + + + + + + + + + + + + } + body={ + +

      + +

      +

      + +

      +
      + } + iconType="logoUptime" + title={ + +

      + , + } + } + /> +

      +
      + } > - -
      + +
      + +
      + +
      + + + + `; exports[`EmptyState component doesn't render child components when count is falsy 1`] = ` - - - - - - -

      - Loading… -

      -
      - - } - > -
      + + + + + +

      + Loading… +

      +
      + + } > - - - -
      - - - - -
      - - + +
      -

      + + + +
      + + - Loading… -

      - -
      -
      - - -
      - - - +

      + Loading… +

      + +
      +
      +
      +
      +
      +
      +
      +
      + `; exports[`EmptyState component notifies when index does not exist 1`] = ` - - - , + } + } + /> + } > -
      - -
      - -
      - - -
      - - - - , - } - } - /> -

      - } - iconType="uptimeApp" - title={ - -

      - Uptime index not found -

      -
      - } +
      + + +
      -
      + + + + + + + + + + + + } + body={ + +

      + +

      +

      + +

      +
      + } + iconType="logoUptime" + title={ + +

      + , + } + } + /> +

      +
      + } > - -
      - - -
      - - - - - -

      + + +
      + + + + + - Uptime index not found -

      +

      + , + } + } + > + No indices found matching pattern + + +

      +
      - - -
      - - -
      -

      - + + +

      +

      + + If you have not setup heartbeat yet, you can setup heartbeat to start monitoring your services. + +

      +

      + + If you have setup heartbeat and confirmed data is being sent to Elasticsearch, update your index pattern settings and insure they are aligned with your Heartbeat config. + +

      +
      + + + + +
      + + +
      + + +
      + + + + +
      + - - - - Configure Heartbeat - - - - to start logging uptime data. - -

      -
      - - - -
      - -
      - -
      - -
      - - - + + Update index pattern settings + + + + + +
      + +
      + +
      + +
      + +
      + +
      + + + + `; exports[`EmptyState component renders child components when count is truthy 1`] = ` - -
      - Foo -
      -
      - Bar -
      -
      - Baz -
      -
      + + +
      + Foo +
      +
      + Bar +
      +
      + Baz +
      +
      +
      `; exports[`EmptyState component renders error message when an error occurs 1`] = ` - - - -
      - -
      - -
      - -

      - There was an error fetching your data. -

      - - } - iconColor="subdued" - iconType="securityApp" - title={ - -

      - Error -

      -
      - } +
      + +
      -
      +

      + There was an error fetching your data. +

      + + } + iconColor="subdued" + iconType="securityApp" + title={ + +

      + Error +

      +
      + } > - -
      - - -
      - - - - - -

      + + +
      + + + + + - Error -

      +

      + Error +

      +
      - - -
      - - -
      -

      + + +

      - There was an error fetching your data. -

      -
      - - - -
      - -
      - -
      - -
      - - - +

      + There was an error fetching your data. +

      +
      + + + +
      + +
      + +
      + +
      + + + + `; exports[`EmptyState component renders loading state if no errors or doc count 1`] = ` - - - - - - -

      - Loading… -

      -
      - - } - > -
      + + + + + +

      + Loading… +

      +
      + + } > - - - -
      - - - - -
      - - + +
      -

      - Loading… -

      - -
      -
      - - -
      - - - + + + +
      + + +

      + Loading… +

      +
      +
      + +
      + +
      +
      +
      + + `; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_missing.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_missing.test.tsx deleted file mode 100644 index 8605d2966aaae..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_missing.test.tsx +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { shallowWithIntl } from 'test_utils/enzyme_helpers'; -import React from 'react'; -import { DataMissing } from '../data_missing'; - -describe('DataMissing component', () => { - it('renders basePath and headingMessage', () => { - const component = shallowWithIntl(); - expect(component).toMatchSnapshot(); - }); -}); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_or_index_missing.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_or_index_missing.test.tsx new file mode 100644 index 0000000000000..333802962fd3e --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_or_index_missing.test.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { DataOrIndexMissing } from '../data_or_index_missing'; + +describe('DataOrIndexMissing component', () => { + it('renders headingMessage', () => { + const headingMessage = ( + heartbeat-*
      }} + /> + ); + const component = shallowWithIntl(); + expect(component).toMatchSnapshot(); + }); +}); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/empty_state.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/empty_state.test.tsx index a74ad543c3318..acfe2ada5b68d 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/empty_state.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/empty_state.test.tsx @@ -5,11 +5,11 @@ */ import React from 'react'; -import { mountWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers'; import { EmptyStateComponent } from '../empty_state'; import { StatesIndexStatus } from '../../../../../common/runtime_types'; import { IHttpFetchError } from '../../../../../../../../../target/types/core/public/http'; import { HttpFetchError } from '../../../../../../../../../src/core/public/http/http_fetch_error'; +import { mountWithRouter, shallowWithRouter } from '../../../../lib'; describe('EmptyState component', () => { let statesIndexStatus: StatesIndexStatus; @@ -22,7 +22,7 @@ describe('EmptyState component', () => { }); it('renders child components when count is truthy', () => { - const component = shallowWithIntl( + const component = shallowWithRouter(
      Foo
      Bar
      @@ -33,7 +33,7 @@ describe('EmptyState component', () => { }); it(`doesn't render child components when count is falsy`, () => { - const component = mountWithIntl( + const component = mountWithRouter(
      Shouldn't be rendered
      @@ -45,7 +45,7 @@ describe('EmptyState component', () => { const errors: IHttpFetchError[] = [ new HttpFetchError('There was an error fetching your data.', 'error', {} as any), ]; - const component = mountWithIntl( + const component = mountWithRouter(
      Shouldn't appear...
      @@ -54,7 +54,7 @@ describe('EmptyState component', () => { }); it('renders loading state if no errors or doc count', () => { - const component = mountWithIntl( + const component = mountWithRouter(
      Should appear even while loading...
      @@ -67,7 +67,7 @@ describe('EmptyState component', () => { docCount: 0, indexExists: true, }; - const component = mountWithIntl( + const component = mountWithRouter(
      If this is in the snapshot the test should fail
      @@ -77,7 +77,7 @@ describe('EmptyState component', () => { it('notifies when index does not exist', () => { statesIndexStatus.indexExists = false; - const component = mountWithIntl( + const component = mountWithRouter(
      This text should not render
      diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_missing.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_missing.tsx deleted file mode 100644 index 337c08774e8e8..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_missing.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - EuiFlexGroup, - EuiEmptyPrompt, - EuiFlexItem, - EuiSpacer, - EuiPanel, - EuiTitle, - EuiLink, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { useContext } from 'react'; -import { UptimeSettingsContext } from '../../../contexts'; - -interface DataMissingProps { - headingMessage: string; -} - -export const DataMissing = ({ headingMessage }: DataMissingProps) => { - const { basePath } = useContext(UptimeSettingsContext); - return ( - - - - - -

      {headingMessage}

      - - } - body={ -

      - - - - ), - }} - /> -

      - } - /> -
      -
      -
      - ); -}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_or_index_missing.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_or_index_missing.tsx new file mode 100644 index 0000000000000..88c0920138f68 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_or_index_missing.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiFlexGroup, + EuiEmptyPrompt, + EuiFlexItem, + EuiSpacer, + EuiPanel, + EuiTitle, + EuiButton, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useContext } from 'react'; +import { UptimeSettingsContext } from '../../../contexts'; +import { DynamicSettings } from '../../../../common/runtime_types'; + +interface DataMissingProps { + headingMessage: JSX.Element; + settings?: DynamicSettings; +} + +export const DataOrIndexMissing = ({ headingMessage, settings }: DataMissingProps) => { + const { basePath } = useContext(UptimeSettingsContext); + return ( + + + + + +

      {headingMessage}

      + + } + body={ + <> +

      + +

      +

      + +

      + + } + actions={ + + + + + + + + + + + + + } + /> +
      +
      +
      + ); +}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_index.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_index.tsx deleted file mode 100644 index 0141198ec15e0..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - EuiEmptyPrompt, - EuiFlexGroup, - EuiFlexItem, - EuiLink, - EuiPanel, - EuiSpacer, - EuiTitle, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { Fragment } from 'react'; - -interface EmptyIndexProps { - basePath: string; -} - -export const EmptyIndex = ({ basePath }: EmptyIndexProps) => ( - - - - - -

      - -

      - - } - body={ - -

      - - - - ), - }} - /> -

      -
      - } - /> -
      -
      -
      -); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state.tsx index ae6a1b892bc99..651103a34bf21 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state.tsx @@ -5,11 +5,11 @@ */ import React, { Fragment } from 'react'; -import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; import { EmptyStateError } from './empty_state_error'; import { EmptyStateLoading } from './empty_state_loading'; -import { DataMissing } from './data_missing'; -import { StatesIndexStatus } from '../../../../common/runtime_types'; +import { DataOrIndexMissing } from './data_or_index_missing'; +import { DynamicSettings, StatesIndexStatus } from '../../../../common/runtime_types'; import { IHttpFetchError } from '../../../../../../../../target/types/core/public/http'; interface EmptyStateProps { @@ -17,6 +17,7 @@ interface EmptyStateProps { statesIndexStatus: StatesIndexStatus | null; loading: boolean; errors?: IHttpFetchError[]; + settings?: DynamicSettings; } export const EmptyStateComponent = ({ @@ -24,6 +25,7 @@ export const EmptyStateComponent = ({ statesIndexStatus, loading, errors, + settings, }: EmptyStateProps) => { if (errors?.length) { return ; @@ -32,18 +34,28 @@ export const EmptyStateComponent = ({ const { indexExists, docCount } = statesIndexStatus; if (!indexExists) { return ( - {settings?.heartbeatIndices}
      }} + /> + } /> ); } else if (indexExists && docCount === 0) { return ( - {settings?.heartbeatIndices} }} + /> + } /> ); } diff --git a/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx b/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx index 821a70c85dc7c..49e6ddb56602c 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx @@ -17,7 +17,9 @@ interface PageHeaderProps { extraLinks?: boolean; datePicker?: boolean; } - +const SETTINGS_LINK_TEXT = i18n.translate('xpack.uptime.page_header.settingsLink', { + defaultMessage: 'Settings', +}); export const PageHeader = React.memo( ({ headingText, extraLinks = false, datePicker = true }: PageHeaderProps) => { const datePickerComponent = datePicker ? ( @@ -26,9 +28,6 @@ export const PageHeader = React.memo( ) : null; - const settingsLinkText = i18n.translate('xpack.uptime.page_header.settingsLink', { - defaultMessage: 'Settings', - }); const extraLinkComponents = !extraLinks ? null : ( @@ -37,7 +36,7 @@ export const PageHeader = React.memo( - {settingsLinkText} + {SETTINGS_LINK_TEXT} diff --git a/x-pack/legacy/plugins/uptime/public/pages/settings.tsx b/x-pack/legacy/plugins/uptime/public/pages/settings.tsx index 049dffecd3f2e..6defb96e0da3d 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/settings.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/settings.tsx @@ -67,7 +67,7 @@ export const SettingsPage = () => { const dispatch = useDispatch(); useEffect(() => { - dispatch(getDynamicSettings({})); + dispatch(getDynamicSettings()); }, [dispatch]); const [formFields, setFormFields] = useState(dss.settings || null); diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/dynamic_settings.ts b/x-pack/legacy/plugins/uptime/public/state/actions/dynamic_settings.ts index d78c725c4b599..3dbb1aa234621 100644 --- a/x-pack/legacy/plugins/uptime/public/state/actions/dynamic_settings.ts +++ b/x-pack/legacy/plugins/uptime/public/state/actions/dynamic_settings.ts @@ -6,7 +6,7 @@ import { createAction } from 'redux-actions'; import { DynamicSettings } from '../../../common/runtime_types'; -export const getDynamicSettings = createAction<{}>('GET_DYNAMIC_SETTINGS'); +export const getDynamicSettings = createAction('GET_DYNAMIC_SETTINGS'); export const getDynamicSettingsSuccess = createAction( 'GET_DYNAMIC_SETTINGS_SUCCESS' ); @@ -17,4 +17,3 @@ export const setDynamicSettingsSuccess = createAction( 'SET_DYNAMIC_SETTINGS_SUCCESS' ); export const setDynamicSettingsFail = createAction('SET_DYNAMIC_SETTINGS_FAIL'); -export const acknowledgeSetDynamicSettings = createAction<{}>('ACKNOWLEDGE_SET_DYNAMIC_SETTINGS'); diff --git a/x-pack/legacy/plugins/uptime/public/state/api/dynamic_settings.ts b/x-pack/legacy/plugins/uptime/public/state/api/dynamic_settings.ts index 8ade2aa4595dc..e52e40c53513c 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/dynamic_settings.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/dynamic_settings.ts @@ -14,22 +14,15 @@ import { apiService } from './utils'; const apiPath = '/api/uptime/dynamic_settings'; -interface BaseApiRequest { - basePath: string; -} - -type SaveApiRequest = BaseApiRequest & { +interface SaveApiRequest { settings: DynamicSettings; -}; +} -export const getDynamicSettings = async ({ - basePath, -}: BaseApiRequest): Promise => { +export const getDynamicSettings = async (): Promise => { return await apiService.get(apiPath, undefined, DynamicSettingsType); }; export const setDynamicSettings = async ({ - basePath, settings, }: SaveApiRequest): Promise => { return await apiService.post(apiPath, settings, DynamicSettingsSaveType); diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/dynamic_settings.ts b/x-pack/legacy/plugins/uptime/public/state/effects/dynamic_settings.ts index 9bc8bd95be68c..bee92813aa1f0 100644 --- a/x-pack/legacy/plugins/uptime/public/state/effects/dynamic_settings.ts +++ b/x-pack/legacy/plugins/uptime/public/state/effects/dynamic_settings.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { takeLatest, put, call, select } from 'redux-saga/effects'; +import { takeLatest, put, call } from 'redux-saga/effects'; import { Action } from 'redux-actions'; import { i18n } from '@kbn/i18n'; import { fetchEffectFactory } from './fetch_effect'; @@ -21,7 +21,6 @@ import { setDynamicSettings as setDynamicSettingsAPI, } from '../api'; import { DynamicSettings } from '../../../common/runtime_types'; -import { getBasePath } from '../selectors'; import { kibanaService } from '../kibana_service'; export function* fetchDynamicSettingsEffect() { @@ -46,8 +45,7 @@ export function* setDynamicSettingsEffect() { }); return; } - const basePath = yield select(getBasePath); - yield call(setDynamicSettingsAPI, { settings: action.payload, basePath }); + yield call(setDynamicSettingsAPI, { settings: action.payload }); yield put(setDynamicSettingsSuccess(action.payload)); kibanaService.core.notifications.toasts.addSuccess('Settings saved!'); } catch (err) { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 4e6e74aabc7e4..63d6850c0d0d7 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16231,12 +16231,7 @@ "xpack.uptime.components.embeddables.embeddedMap.embeddablePanelTitle": "オブザーバー位置情報マップを監視", "xpack.uptime.durationChart.emptyPrompt.description": "このモニターは選択された時間範囲で一度も {emphasizedText} していません。", "xpack.uptime.durationChart.emptyPrompt.title": "利用可能な期間データがありません", - "xpack.uptime.emptyState.configureHeartbeatLinkText": "Heartbeat を構成", - "xpack.uptime.emptyState.configureHeartbeatToGetStartedMessage": "アップタイムデータの収集を開始するには {configureHeartbeatLink}。", "xpack.uptime.emptyState.loadingMessage": "読み込み中…", - "xpack.uptime.emptyState.noDataMessage": "アップタイムデータが見つかりませんでした", - "xpack.uptime.emptyState.noDataTitle": "利用可能なアップタイムデータがありません", - "xpack.uptime.emptyState.noIndexTitle": "アップタイムインデックスが見つかりません", "xpack.uptime.emptyStateError.notAuthorized": "アップタイムデータの表示が承認されていません。システム管理者にお問い合わせください。", "xpack.uptime.emptyStateError.notFoundPage": "ページが見つかりません", "xpack.uptime.emptyStateError.title": "エラー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 70ec0ef2b0dac..59b9aeb54c695 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16236,12 +16236,7 @@ "xpack.uptime.components.embeddables.embeddedMap.embeddablePanelTitle": "监测观察者位置地图", "xpack.uptime.durationChart.emptyPrompt.description": "在选定时间范围内此监测从未{emphasizedText}。", "xpack.uptime.durationChart.emptyPrompt.title": "没有持续时间数据", - "xpack.uptime.emptyState.configureHeartbeatLinkText": "配置 Heartbeat", - "xpack.uptime.emptyState.configureHeartbeatToGetStartedMessage": "{configureHeartbeatLink}以开始收集运行时间数据。", "xpack.uptime.emptyState.loadingMessage": "正在加载……", - "xpack.uptime.emptyState.noDataMessage": "未找到任何运行时间数据", - "xpack.uptime.emptyState.noDataTitle": "没有可用的运行时间数据", - "xpack.uptime.emptyState.noIndexTitle": "找不到运行时间索引", "xpack.uptime.emptyStateError.notAuthorized": "您无权查看 Uptime 数据,请联系系统管理员。", "xpack.uptime.emptyStateError.notFoundPage": "未找到页面", "xpack.uptime.emptyStateError.title": "错误", From fe6b13b83cc010f722548cd5a0a8c2d5341a20dd Mon Sep 17 00:00:00 2001 From: spalger Date: Sat, 18 Apr 2020 12:35:04 -0700 Subject: [PATCH 09/15] skip flaky suite (#58692) --- test/examples/embeddables/adding_children.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/examples/embeddables/adding_children.ts b/test/examples/embeddables/adding_children.ts index 5fe88b5dd33f0..9ec4b6cffd31a 100644 --- a/test/examples/embeddables/adding_children.ts +++ b/test/examples/embeddables/adding_children.ts @@ -25,7 +25,8 @@ export default function({ getService }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); const flyout = getService('flyout'); - describe('creating and adding children', () => { + // FLAKY: https://github.com/elastic/kibana/issues/58692 + describe.skip('creating and adding children', () => { before(async () => { await testSubjects.click('embeddablePanelExamplae'); }); From 796421f600378bd82a01e2e586a44374976b3715 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Sun, 19 Apr 2020 17:58:45 +0300 Subject: [PATCH 10/15] [SEARCH] Cleanup fetch soon (#63320) * move old code to legacy folder * Use search service directly from search source * Move get search params to fetch folder * Delete search strategy folder * Doc update * Minor cleanups * Moved es client to legacy folder * Clean up some unused code (isViable, old search function) * Updated tests * strings update * Fix jest test * re-arrange runSearch function * re-arrange runSearch function * fix jest tests Co-authored-by: Elastic Machine --- .../kibana-plugin-plugins-data-public.md | 1 - ...s-data-public.searchstrategyprovider.id.md | 11 -- ...-public.searchstrategyprovider.isviable.md | 11 -- ...gins-data-public.searchstrategyprovider.md | 20 ---- ...ta-public.searchstrategyprovider.search.md | 11 -- .../lib/get_indices.test.ts | 2 +- src/plugins/data/public/index.ts | 1 - src/plugins/data/public/public.api.md | 45 +++----- .../aggs/test_helpers/mock_data_services.ts | 11 +- .../search/fetch/get_search_params.test.ts | 70 ++++++++++++ .../get_search_params.ts | 14 +-- src/plugins/data/public/search/fetch/index.ts | 13 ++- .../fetch/{errors.ts => request_error.ts} | 0 .../search_error.ts | 0 src/plugins/data/public/search/fetch/types.ts | 3 + src/plugins/data/public/search/index.ts | 12 +- .../{fetch => legacy}/call_client.test.ts | 11 +- .../search/{fetch => legacy}/call_client.ts | 7 +- .../default_search_strategy.test.ts | 24 +--- .../default_search_strategy.ts | 38 +------ .../{ => legacy}/es_client/get_es_client.ts | 0 .../search/{ => legacy}/es_client/index.ts | 2 +- .../search/{ => legacy}/es_client/types.ts | 3 +- .../{fetch => legacy}/fetch_soon.test.ts | 6 +- .../search/{fetch => legacy}/fetch_soon.ts | 4 +- .../get_msearch_params.test.ts} | 45 +------- .../search/legacy/get_msearch_params.ts | 29 +++++ .../{search_strategy => legacy}/index.ts | 7 +- .../{search_strategy => legacy}/types.ts | 13 +-- .../data/public/search/search_service.ts | 6 +- .../search_source/search_source.test.ts | 55 ++++++++- .../search/search_source/search_source.ts | 53 +++++++-- .../search_strategy/no_op_search_strategy.ts | 55 --------- src/plugins/data/public/search/types.ts | 11 +- .../public/search/rollup_search_strategy.ts | 104 ------------------ .../translations/translations/ja-JP.json | 8 +- .../translations/translations/zh-CN.json | 8 +- 37 files changed, 282 insertions(+), 432 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.id.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.isviable.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.search.md create mode 100644 src/plugins/data/public/search/fetch/get_search_params.test.ts rename src/plugins/data/public/search/{search_strategy => fetch}/get_search_params.ts (81%) rename src/plugins/data/public/search/fetch/{errors.ts => request_error.ts} (100%) rename src/plugins/data/public/search/{search_strategy => fetch}/search_error.ts (100%) rename src/plugins/data/public/search/{fetch => legacy}/call_client.test.ts (91%) rename src/plugins/data/public/search/{fetch => legacy}/call_client.ts (89%) rename src/plugins/data/public/search/{search_strategy => legacy}/default_search_strategy.test.ts (83%) rename src/plugins/data/public/search/{search_strategy => legacy}/default_search_strategy.ts (64%) rename src/plugins/data/public/search/{ => legacy}/es_client/get_es_client.ts (100%) rename src/plugins/data/public/search/{ => legacy}/es_client/index.ts (91%) rename src/plugins/data/public/search/{ => legacy}/es_client/types.ts (94%) rename src/plugins/data/public/search/{fetch => legacy}/fetch_soon.test.ts (96%) rename src/plugins/data/public/search/{fetch => legacy}/fetch_soon.ts (95%) rename src/plugins/data/public/search/{search_strategy/get_search_params.test.ts => legacy/get_msearch_params.test.ts} (60%) create mode 100644 src/plugins/data/public/search/legacy/get_msearch_params.ts rename src/plugins/data/public/search/{search_strategy => legacy}/index.ts (78%) rename src/plugins/data/public/search/{search_strategy => legacy}/types.ts (89%) delete mode 100644 src/plugins/data/public/search/search_strategy/no_op_search_strategy.ts delete mode 100644 x-pack/plugins/rollup/public/search/rollup_search_strategy.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index fc0dab94a0f65..bf29c883e4eb9 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -88,7 +88,6 @@ | [SavedQuery](./kibana-plugin-plugins-data-public.savedquery.md) | | | [SavedQueryService](./kibana-plugin-plugins-data-public.savedqueryservice.md) | | | [SearchSourceFields](./kibana-plugin-plugins-data-public.searchsourcefields.md) | | -| [SearchStrategyProvider](./kibana-plugin-plugins-data-public.searchstrategyprovider.md) | | | [TabbedAggColumn](./kibana-plugin-plugins-data-public.tabbedaggcolumn.md) | \* | | [TabbedTable](./kibana-plugin-plugins-data-public.tabbedtable.md) | \* | | [TimeRange](./kibana-plugin-plugins-data-public.timerange.md) | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.id.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.id.md deleted file mode 100644 index d60ffba6a05ca..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.id.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchStrategyProvider](./kibana-plugin-plugins-data-public.searchstrategyprovider.md) > [id](./kibana-plugin-plugins-data-public.searchstrategyprovider.id.md) - -## SearchStrategyProvider.id property - -Signature: - -```typescript -id: string; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.isviable.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.isviable.md deleted file mode 100644 index aa8ed49051ee9..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.isviable.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchStrategyProvider](./kibana-plugin-plugins-data-public.searchstrategyprovider.md) > [isViable](./kibana-plugin-plugins-data-public.searchstrategyprovider.isviable.md) - -## SearchStrategyProvider.isViable property - -Signature: - -```typescript -isViable: (indexPattern: IndexPattern) => boolean; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.md deleted file mode 100644 index b271a921906a7..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchStrategyProvider](./kibana-plugin-plugins-data-public.searchstrategyprovider.md) - -## SearchStrategyProvider interface - -Signature: - -```typescript -export interface SearchStrategyProvider -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [id](./kibana-plugin-plugins-data-public.searchstrategyprovider.id.md) | string | | -| [isViable](./kibana-plugin-plugins-data-public.searchstrategyprovider.isviable.md) | (indexPattern: IndexPattern) => boolean | | -| [search](./kibana-plugin-plugins-data-public.searchstrategyprovider.search.md) | (params: SearchStrategySearchParams) => SearchStrategyResponse | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.search.md deleted file mode 100644 index 6e2561c3b0ad0..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchstrategyprovider.search.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchStrategyProvider](./kibana-plugin-plugins-data-public.searchstrategyprovider.md) > [search](./kibana-plugin-plugins-data-public.searchstrategyprovider.search.md) - -## SearchStrategyProvider.search property - -Signature: - -```typescript -search: (params: SearchStrategySearchParams) => SearchStrategyResponse; -``` diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts index 40583af7177fe..b1500f8303b66 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/create_index_pattern_wizard/lib/get_indices.test.ts @@ -20,7 +20,7 @@ import { getIndices } from './get_indices'; import { IndexPatternCreationConfig } from '../../../../../../../../../plugins/index_pattern_management/public'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { LegacyApiCaller } from '../../../../../../../../../plugins/data/public/search'; +import { LegacyApiCaller } from '../../../../../../../../../plugins/data/public/search/legacy'; export const successfulResponse = { hits: { diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 06a46065baa84..b62b728beca35 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -363,7 +363,6 @@ export { SearchRequest, SearchResponse, SearchError, - SearchStrategyProvider, ISearchSource, SearchSource, createSearchSource, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 6e06d063e7ebe..427c4f7864554 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1724,21 +1724,6 @@ export interface SearchSourceFields { version?: boolean; } -// Warning: (ae-missing-release-tag) "SearchStrategyProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface SearchStrategyProvider { - // (undocumented) - id: string; - // (undocumented) - isViable: (indexPattern: IndexPattern) => boolean; - // Warning: (ae-forgotten-export) The symbol "SearchStrategySearchParams" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "SearchStrategyResponse" needs to be exported by the entry point index.d.ts - // - // (undocumented) - search: (params: SearchStrategySearchParams) => SearchStrategyResponse; -} - // Warning: (ae-missing-release-tag) "SortDirection" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1889,21 +1874,21 @@ export type TSearchStrategyProvider = (context: ISearc // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getRoutes" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "convertDateRangeToString" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:402:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:405:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:406:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:409:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:410:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:413:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "convertDateRangeToString" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:404:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:405:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:408:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:409:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:412:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromEvent" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/aggs/test_helpers/mock_data_services.ts b/src/plugins/data/public/search/aggs/test_helpers/mock_data_services.ts index d1d591771743c..e807e084c683a 100644 --- a/src/plugins/data/public/search/aggs/test_helpers/mock_data_services.ts +++ b/src/plugins/data/public/search/aggs/test_helpers/mock_data_services.ts @@ -18,8 +18,8 @@ */ // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { dataPluginMock } from '../../../../public/mocks'; +import { coreMock } from '../../../../../../core/public/mocks'; +import { dataPluginMock } from '../../../mocks'; import { setFieldFormats, setIndexPatterns, @@ -29,7 +29,7 @@ import { setQueryService, setSearchService, setUiSettings, -} from '../../../../public/services'; +} from '../../../services'; /** * Testing helper which calls all of the service setters used in the @@ -49,4 +49,9 @@ export function mockDataServices() { setQueryService(data.query); setSearchService(data.search); setUiSettings(core.uiSettings); + + return { + core, + data, + }; } diff --git a/src/plugins/data/public/search/fetch/get_search_params.test.ts b/src/plugins/data/public/search/fetch/get_search_params.test.ts new file mode 100644 index 0000000000000..edf18405e8ff7 --- /dev/null +++ b/src/plugins/data/public/search/fetch/get_search_params.test.ts @@ -0,0 +1,70 @@ +/* + * 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 { getSearchParams } from './get_search_params'; +import { IUiSettingsClient } from 'kibana/public'; + +function getConfigStub(config: any = {}) { + return { + get: key => config[key], + } as IUiSettingsClient; +} + +describe('getSearchParams', () => { + test('includes rest_total_hits_as_int', () => { + const config = getConfigStub(); + const searchParams = getSearchParams(config); + expect(searchParams.rest_total_hits_as_int).toBe(true); + }); + + test('includes ignore_unavailable', () => { + const config = getConfigStub(); + const searchParams = getSearchParams(config); + expect(searchParams.ignore_unavailable).toBe(true); + }); + + test('includes ignore_throttled according to search:includeFrozen', () => { + let config = getConfigStub({ 'search:includeFrozen': true }); + let searchParams = getSearchParams(config); + expect(searchParams.ignore_throttled).toBe(false); + + config = getConfigStub({ 'search:includeFrozen': false }); + searchParams = getSearchParams(config); + expect(searchParams.ignore_throttled).toBe(true); + }); + + test('includes max_concurrent_shard_requests according to courier:maxConcurrentShardRequests', () => { + let config = getConfigStub({ 'courier:maxConcurrentShardRequests': 0 }); + let searchParams = getSearchParams(config); + expect(searchParams.max_concurrent_shard_requests).toBe(undefined); + + config = getConfigStub({ 'courier:maxConcurrentShardRequests': 5 }); + searchParams = getSearchParams(config); + expect(searchParams.max_concurrent_shard_requests).toBe(5); + }); + + test('includes timeout according to esShardTimeout if greater than 0', () => { + const config = getConfigStub(); + let searchParams = getSearchParams(config, 0); + expect(searchParams.timeout).toBe(undefined); + + searchParams = getSearchParams(config, 100); + expect(searchParams.timeout).toBe('100ms'); + }); +}); diff --git a/src/plugins/data/public/search/search_strategy/get_search_params.ts b/src/plugins/data/public/search/fetch/get_search_params.ts similarity index 81% rename from src/plugins/data/public/search/search_strategy/get_search_params.ts rename to src/plugins/data/public/search/fetch/get_search_params.ts index 9fb8f2c728c6f..f0c43bd2e74cd 100644 --- a/src/plugins/data/public/search/search_strategy/get_search_params.ts +++ b/src/plugins/data/public/search/fetch/get_search_params.ts @@ -17,18 +17,10 @@ * under the License. */ -import { IUiSettingsClient } from '../../../../../core/public'; +import { IUiSettingsClient } from 'kibana/public'; const sessionId = Date.now(); -export function getMSearchParams(config: IUiSettingsClient) { - return { - rest_total_hits_as_int: true, - ignore_throttled: getIgnoreThrottled(config), - max_concurrent_shard_requests: getMaxConcurrentShardRequests(config), - }; -} - export function getSearchParams(config: IUiSettingsClient, esShardTimeout: number = 0) { return { rest_total_hits_as_int: true, @@ -40,11 +32,11 @@ export function getSearchParams(config: IUiSettingsClient, esShardTimeout: numbe }; } -function getIgnoreThrottled(config: IUiSettingsClient) { +export function getIgnoreThrottled(config: IUiSettingsClient) { return !config.get('search:includeFrozen'); } -function getMaxConcurrentShardRequests(config: IUiSettingsClient) { +export function getMaxConcurrentShardRequests(config: IUiSettingsClient) { const maxConcurrentShardRequests = config.get('courier:maxConcurrentShardRequests'); return maxConcurrentShardRequests > 0 ? maxConcurrentShardRequests : undefined; } diff --git a/src/plugins/data/public/search/fetch/index.ts b/src/plugins/data/public/search/fetch/index.ts index 8a80b716add32..39845ec31bfaa 100644 --- a/src/plugins/data/public/search/fetch/index.ts +++ b/src/plugins/data/public/search/fetch/index.ts @@ -18,5 +18,14 @@ */ export * from './types'; -export { fetchSoon } from './fetch_soon'; -export { RequestFailure } from './errors'; +export { + getSearchParams, + getPreference, + getTimeout, + getIgnoreThrottled, + getMaxConcurrentShardRequests, +} from './get_search_params'; + +export { SearchError, getSearchErrorType } from './search_error'; +export { RequestFailure } from './request_error'; +export { handleResponse } from './handle_response'; diff --git a/src/plugins/data/public/search/fetch/errors.ts b/src/plugins/data/public/search/fetch/request_error.ts similarity index 100% rename from src/plugins/data/public/search/fetch/errors.ts rename to src/plugins/data/public/search/fetch/request_error.ts diff --git a/src/plugins/data/public/search/search_strategy/search_error.ts b/src/plugins/data/public/search/fetch/search_error.ts similarity index 100% rename from src/plugins/data/public/search/search_strategy/search_error.ts rename to src/plugins/data/public/search/fetch/search_error.ts diff --git a/src/plugins/data/public/search/fetch/types.ts b/src/plugins/data/public/search/fetch/types.ts index e8de0576b8a72..475b2abbc019f 100644 --- a/src/plugins/data/public/search/fetch/types.ts +++ b/src/plugins/data/public/search/fetch/types.ts @@ -20,6 +20,9 @@ import { IUiSettingsClient } from '../../../../../core/public'; import { ISearchStart } from '../types'; +export type SearchRequest = any; +export type SearchResponse = any; + export interface FetchOptions { abortSignal?: AbortSignal; searchStrategyId?: string; diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index cce973d632f41..75c0eb8b6f022 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -44,9 +44,13 @@ export { esSearchStrategyProvider, getEsPreference } from './es_search'; export { IKibanaSearchResponse, IKibanaSearchRequest } from '../../common/search'; -export { LegacyApiCaller, SearchRequest, SearchResponse } from './es_client'; - -export { SearchError, SearchStrategyProvider, getSearchErrorType } from './search_strategy'; +export { + SearchError, + FetchOptions, + SearchRequest, + SearchResponse, + getSearchErrorType, +} from './fetch'; export { ISearchSource, @@ -59,5 +63,3 @@ export { export { SearchInterceptor } from './search_interceptor'; export { RequestTimeoutError } from './request_timeout_error'; - -export { FetchOptions } from './fetch'; diff --git a/src/plugins/data/public/search/fetch/call_client.test.ts b/src/plugins/data/public/search/legacy/call_client.test.ts similarity index 91% rename from src/plugins/data/public/search/fetch/call_client.test.ts rename to src/plugins/data/public/search/legacy/call_client.test.ts index 7a99b7c064515..f919187d46784 100644 --- a/src/plugins/data/public/search/fetch/call_client.test.ts +++ b/src/plugins/data/public/search/legacy/call_client.test.ts @@ -18,16 +18,17 @@ */ import { callClient } from './call_client'; -import { handleResponse } from './handle_response'; -import { FetchHandlers } from './types'; -import { SearchStrategySearchParams, defaultSearchStrategy } from '../search_strategy'; +import { SearchStrategySearchParams } from './types'; +import { defaultSearchStrategy } from './default_search_strategy'; +import { FetchHandlers } from '../fetch'; +import { handleResponse } from '../fetch/handle_response'; const mockAbortFn = jest.fn(); -jest.mock('./handle_response', () => ({ +jest.mock('../fetch/handle_response', () => ({ handleResponse: jest.fn((request, response) => response), })); -jest.mock('../search_strategy', () => { +jest.mock('./default_search_strategy', () => { return { defaultSearchStrategy: { search: jest.fn(({ searchRequests }: SearchStrategySearchParams) => { diff --git a/src/plugins/data/public/search/fetch/call_client.ts b/src/plugins/data/public/search/legacy/call_client.ts similarity index 89% rename from src/plugins/data/public/search/fetch/call_client.ts rename to src/plugins/data/public/search/legacy/call_client.ts index b3c4c682fa60c..c484c46aa4879 100644 --- a/src/plugins/data/public/search/fetch/call_client.ts +++ b/src/plugins/data/public/search/legacy/call_client.ts @@ -17,10 +17,9 @@ * under the License. */ -import { handleResponse } from './handle_response'; -import { FetchOptions, FetchHandlers } from './types'; -import { defaultSearchStrategy } from '../search_strategy'; -import { SearchRequest } from '..'; +import { FetchOptions, FetchHandlers, handleResponse } from '../fetch'; +import { defaultSearchStrategy } from './default_search_strategy'; +import { SearchRequest } from '../index'; export function callClient( searchRequests: SearchRequest[], diff --git a/src/plugins/data/public/search/search_strategy/default_search_strategy.test.ts b/src/plugins/data/public/search/legacy/default_search_strategy.test.ts similarity index 83% rename from src/plugins/data/public/search/search_strategy/default_search_strategy.test.ts rename to src/plugins/data/public/search/legacy/default_search_strategy.test.ts index 210a0e5fd1ac7..835b02b3cd5c7 100644 --- a/src/plugins/data/public/search/search_strategy/default_search_strategy.test.ts +++ b/src/plugins/data/public/search/legacy/default_search_strategy.test.ts @@ -17,10 +17,10 @@ * under the License. */ -import { IUiSettingsClient } from '../../../../../core/public'; -import { SearchStrategySearchParams } from './types'; +import { IUiSettingsClient } from 'kibana/public'; import { defaultSearchStrategy } from './default_search_strategy'; import { searchStartMock } from '../mocks'; +import { SearchStrategySearchParams } from './types'; const { search } = defaultSearchStrategy; @@ -38,12 +38,6 @@ const searchMockResponse: any = Promise.resolve([]); searchMockResponse.abort = jest.fn(); const searchMock = jest.fn().mockReturnValue(searchMockResponse); -const newSearchMockResponse: any = Promise.resolve([]); -newSearchMockResponse.abort = jest.fn(); -const newSearchMock = jest.fn().mockReturnValue({ - toPromise: () => searchMockResponse, -}); - describe('defaultSearchStrategy', function() { describe('search', function() { let searchArgs: MockedKeys>; @@ -58,7 +52,6 @@ describe('defaultSearchStrategy', function() { const searchService = searchStartMock; searchService.aggs.calculateAutoTimeExpression = jest.fn().mockReturnValue('1d'); - searchService.search = newSearchMock; searchService.__LEGACY.esClient.search = searchMock; searchService.__LEGACY.esClient.msearch = msearchMock; @@ -112,18 +105,5 @@ describe('defaultSearchStrategy', function() { search({ ...searchArgs, config }).abort(); expect(msearchMockResponse.abort).toHaveBeenCalled(); }); - - test('should call new search service', () => { - const config = getConfigStub(); - search({ ...searchArgs, config }); - expect(newSearchMock).toHaveBeenCalledTimes(1); - }); - - test('should properly abort with new search service', async () => { - const abortSpy = jest.spyOn(AbortController.prototype, 'abort'); - const config = getConfigStub({}); - search({ ...searchArgs, config }).abort(); - expect(abortSpy).toHaveBeenCalled(); - }); }); }); diff --git a/src/plugins/data/public/search/search_strategy/default_search_strategy.ts b/src/plugins/data/public/search/legacy/default_search_strategy.ts similarity index 64% rename from src/plugins/data/public/search/search_strategy/default_search_strategy.ts rename to src/plugins/data/public/search/legacy/default_search_strategy.ts index 2bd88f51587a8..1552410f9090c 100644 --- a/src/plugins/data/public/search/search_strategy/default_search_strategy.ts +++ b/src/plugins/data/public/search/legacy/default_search_strategy.ts @@ -17,23 +17,19 @@ * under the License. */ +import { getPreference, getTimeout } from '../fetch'; +import { getMSearchParams } from './get_msearch_params'; import { SearchStrategyProvider, SearchStrategySearchParams } from './types'; -import { isDefault } from '../../index_patterns'; -import { getSearchParams, getMSearchParams, getPreference, getTimeout } from './get_search_params'; +// @deprecated export const defaultSearchStrategy: SearchStrategyProvider = { id: 'default', search: params => { - return params.config.get('courier:batchSearches') ? msearch(params) : search(params); - }, - - isViable: indexPattern => { - return indexPattern && isDefault(indexPattern); + return msearch(params); }, }; -// @deprecated function msearch({ searchRequests, searchService, @@ -65,29 +61,3 @@ function msearch({ abort: searching.abort, }; } - -function search({ - searchRequests, - searchService, - config, - esShardTimeout, -}: SearchStrategySearchParams) { - const abortController = new AbortController(); - const searchParams = getSearchParams(config, esShardTimeout); - const promises = searchRequests.map(({ index, indexType, body }) => { - const params = { - index: index.title || index, - body, - ...searchParams, - }; - const { signal } = abortController; - return searchService - .search({ params, indexType }, { signal }) - .toPromise() - .then(({ rawResponse }) => rawResponse); - }); - return { - searching: Promise.all(promises), - abort: () => abortController.abort(), - }; -} diff --git a/src/plugins/data/public/search/es_client/get_es_client.ts b/src/plugins/data/public/search/legacy/es_client/get_es_client.ts similarity index 100% rename from src/plugins/data/public/search/es_client/get_es_client.ts rename to src/plugins/data/public/search/legacy/es_client/get_es_client.ts diff --git a/src/plugins/data/public/search/es_client/index.ts b/src/plugins/data/public/search/legacy/es_client/index.ts similarity index 91% rename from src/plugins/data/public/search/es_client/index.ts rename to src/plugins/data/public/search/legacy/es_client/index.ts index b1e0ce3116824..78ac83af642d8 100644 --- a/src/plugins/data/public/search/es_client/index.ts +++ b/src/plugins/data/public/search/legacy/es_client/index.ts @@ -18,4 +18,4 @@ */ export { getEsClient } from './get_es_client'; -export { SearchRequest, SearchResponse, LegacyApiCaller } from './types'; +export { LegacyApiCaller } from './types'; diff --git a/src/plugins/data/public/search/es_client/types.ts b/src/plugins/data/public/search/legacy/es_client/types.ts similarity index 94% rename from src/plugins/data/public/search/es_client/types.ts rename to src/plugins/data/public/search/legacy/es_client/types.ts index 3ca0513a14238..7a56b9b0cb00a 100644 --- a/src/plugins/data/public/search/es_client/types.ts +++ b/src/plugins/data/public/search/legacy/es_client/types.ts @@ -17,8 +17,7 @@ * under the License. */ -export type SearchRequest = any; -export type SearchResponse = any; +import { SearchRequest, SearchResponse } from '../../fetch'; export interface LegacyApiCaller { search: (searchRequest: SearchRequest) => LegacyApiCallerResponse; diff --git a/src/plugins/data/public/search/fetch/fetch_soon.test.ts b/src/plugins/data/public/search/legacy/fetch_soon.test.ts similarity index 96% rename from src/plugins/data/public/search/fetch/fetch_soon.test.ts rename to src/plugins/data/public/search/legacy/fetch_soon.test.ts index a8d593c8501f6..b2e17798ccc9f 100644 --- a/src/plugins/data/public/search/fetch/fetch_soon.test.ts +++ b/src/plugins/data/public/search/legacy/fetch_soon.test.ts @@ -19,9 +19,9 @@ import { fetchSoon } from './fetch_soon'; import { callClient } from './call_client'; -import { IUiSettingsClient } from '../../../../../core/public'; -import { FetchHandlers, FetchOptions } from './types'; -import { SearchRequest, SearchResponse } from '..'; +import { IUiSettingsClient } from 'kibana/public'; +import { FetchHandlers, FetchOptions } from '../fetch/types'; +import { SearchRequest, SearchResponse } from '../index'; function getConfigStub(config: any = {}) { return { diff --git a/src/plugins/data/public/search/fetch/fetch_soon.ts b/src/plugins/data/public/search/legacy/fetch_soon.ts similarity index 95% rename from src/plugins/data/public/search/fetch/fetch_soon.ts rename to src/plugins/data/public/search/legacy/fetch_soon.ts index b1405747426ee..18fa410a5bef0 100644 --- a/src/plugins/data/public/search/fetch/fetch_soon.ts +++ b/src/plugins/data/public/search/legacy/fetch_soon.ts @@ -18,8 +18,8 @@ */ import { callClient } from './call_client'; -import { FetchHandlers, FetchOptions } from './types'; -import { SearchRequest, SearchResponse } from '..'; +import { FetchHandlers, FetchOptions } from '../fetch/types'; +import { SearchRequest, SearchResponse } from '../index'; /** * This function introduces a slight delay in the request process to allow multiple requests to queue diff --git a/src/plugins/data/public/search/search_strategy/get_search_params.test.ts b/src/plugins/data/public/search/legacy/get_msearch_params.test.ts similarity index 60% rename from src/plugins/data/public/search/search_strategy/get_search_params.test.ts rename to src/plugins/data/public/search/legacy/get_msearch_params.test.ts index 76f3105d7f942..9f16d5b408178 100644 --- a/src/plugins/data/public/search/search_strategy/get_search_params.test.ts +++ b/src/plugins/data/public/search/legacy/get_msearch_params.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { getMSearchParams, getSearchParams } from './get_search_params'; +import { getMSearchParams } from './get_msearch_params'; import { IUiSettingsClient } from '../../../../../core/public'; function getConfigStub(config: any = {}) { @@ -64,46 +64,3 @@ describe('getMSearchParams', () => { expect(msearchParams.hasOwnProperty('timeout')).toBe(false); }); }); - -describe('getSearchParams', () => { - test('includes rest_total_hits_as_int', () => { - const config = getConfigStub(); - const searchParams = getSearchParams(config); - expect(searchParams.rest_total_hits_as_int).toBe(true); - }); - - test('includes ignore_unavailable', () => { - const config = getConfigStub(); - const searchParams = getSearchParams(config); - expect(searchParams.ignore_unavailable).toBe(true); - }); - - test('includes ignore_throttled according to search:includeFrozen', () => { - let config = getConfigStub({ 'search:includeFrozen': true }); - let searchParams = getSearchParams(config); - expect(searchParams.ignore_throttled).toBe(false); - - config = getConfigStub({ 'search:includeFrozen': false }); - searchParams = getSearchParams(config); - expect(searchParams.ignore_throttled).toBe(true); - }); - - test('includes max_concurrent_shard_requests according to courier:maxConcurrentShardRequests', () => { - let config = getConfigStub({ 'courier:maxConcurrentShardRequests': 0 }); - let searchParams = getSearchParams(config); - expect(searchParams.max_concurrent_shard_requests).toBe(undefined); - - config = getConfigStub({ 'courier:maxConcurrentShardRequests': 5 }); - searchParams = getSearchParams(config); - expect(searchParams.max_concurrent_shard_requests).toBe(5); - }); - - test('includes timeout according to esShardTimeout if greater than 0', () => { - const config = getConfigStub(); - let searchParams = getSearchParams(config, 0); - expect(searchParams.timeout).toBe(undefined); - - searchParams = getSearchParams(config, 100); - expect(searchParams.timeout).toBe('100ms'); - }); -}); diff --git a/src/plugins/data/public/search/legacy/get_msearch_params.ts b/src/plugins/data/public/search/legacy/get_msearch_params.ts new file mode 100644 index 0000000000000..48d13903c972f --- /dev/null +++ b/src/plugins/data/public/search/legacy/get_msearch_params.ts @@ -0,0 +1,29 @@ +/* + * 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 { IUiSettingsClient } from 'kibana/public'; +import { getIgnoreThrottled, getMaxConcurrentShardRequests } from '../fetch'; + +export function getMSearchParams(config: IUiSettingsClient) { + return { + rest_total_hits_as_int: true, + ignore_throttled: getIgnoreThrottled(config), + max_concurrent_shard_requests: getMaxConcurrentShardRequests(config), + }; +} diff --git a/src/plugins/data/public/search/search_strategy/index.ts b/src/plugins/data/public/search/legacy/index.ts similarity index 78% rename from src/plugins/data/public/search/search_strategy/index.ts rename to src/plugins/data/public/search/legacy/index.ts index e3de2ea46e3ec..e2ae72824f3f4 100644 --- a/src/plugins/data/public/search/search_strategy/index.ts +++ b/src/plugins/data/public/search/legacy/index.ts @@ -17,8 +17,5 @@ * under the License. */ -export { SearchError, getSearchErrorType } from './search_error'; - -export { SearchStrategyProvider, SearchStrategySearchParams } from './types'; - -export { defaultSearchStrategy } from './default_search_strategy'; +export { fetchSoon } from './fetch_soon'; +export { getEsClient, LegacyApiCaller } from './es_client'; diff --git a/src/plugins/data/public/search/search_strategy/types.ts b/src/plugins/data/public/search/legacy/types.ts similarity index 89% rename from src/plugins/data/public/search/search_strategy/types.ts rename to src/plugins/data/public/search/legacy/types.ts index 764370d8ff649..3812cec7a2aa2 100644 --- a/src/plugins/data/public/search/search_strategy/types.ts +++ b/src/plugins/data/public/search/legacy/types.ts @@ -17,21 +17,20 @@ * under the License. */ -import { IndexPattern } from '../..'; -import { FetchHandlers } from '../fetch/types'; +import { FetchHandlers } from '../fetch'; import { SearchRequest, SearchResponse } from '..'; +export interface SearchStrategySearchParams extends FetchHandlers { + searchRequests: SearchRequest[]; +} + +// @deprecated export interface SearchStrategyProvider { id: string; search: (params: SearchStrategySearchParams) => SearchStrategyResponse; - isViable: (indexPattern: IndexPattern) => boolean; } export interface SearchStrategyResponse { searching: Promise; abort: () => void; } - -export interface SearchStrategySearchParams extends FetchHandlers { - searchRequests: SearchRequest[]; -} diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index a539736991adb..916278a96659b 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -22,12 +22,12 @@ import { Plugin, CoreSetup, CoreStart, PackageInfo } from '../../../../core/publ import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; import { ISearchSetup, ISearchStart, TSearchStrategyProvider, TSearchStrategiesMap } from './types'; import { TStrategyTypes } from './strategy_types'; -import { getEsClient, LegacyApiCaller } from './es_client'; +import { getEsClient, LegacyApiCaller } from './legacy'; import { ES_SEARCH_STRATEGY, DEFAULT_SEARCH_STRATEGY } from '../../common/search'; -import { esSearchStrategyProvider } from './es_search/es_search_strategy'; +import { esSearchStrategyProvider } from './es_search'; import { IndexPatternsContract } from '../index_patterns/index_patterns'; import { createSearchSource } from './search_source'; -import { QuerySetup } from '../query/query_service'; +import { QuerySetup } from '../query'; import { GetInternalStartServicesFn } from '../types'; import { SearchInterceptor } from './search_interceptor'; import { diff --git a/src/plugins/data/public/search/search_source/search_source.test.ts b/src/plugins/data/public/search/search_source/search_source.test.ts index 6bad093d31402..6e878844664ad 100644 --- a/src/plugins/data/public/search/search_source/search_source.test.ts +++ b/src/plugins/data/public/search/search_source/search_source.test.ts @@ -20,8 +20,26 @@ import { SearchSource } from './search_source'; import { IndexPattern, SortDirection } from '../..'; import { mockDataServices } from '../aggs/test_helpers'; +import { setSearchService } from '../../services'; +import { searchStartMock } from '../mocks'; +import { fetchSoon } from '../legacy'; +import { CoreStart } from 'kibana/public'; +import { Observable } from 'rxjs'; -jest.mock('../fetch', () => ({ +// Setup search service mock +searchStartMock.search = jest.fn(() => { + return new Observable(subscriber => { + setTimeout(() => { + subscriber.next({ + rawResponse: '', + }); + subscriber.complete(); + }, 100); + }); +}) as any; +setSearchService(searchStartMock); + +jest.mock('../legacy', () => ({ fetchSoon: jest.fn().mockResolvedValue({}), })); @@ -44,8 +62,11 @@ const indexPattern2 = ({ } as unknown) as IndexPattern; describe('SearchSource', function() { + let uiSettingsMock: jest.Mocked; beforeEach(() => { - mockDataServices(); + const { core } = mockDataServices(); + uiSettingsMock = core.uiSettings; + jest.clearAllMocks(); }); describe('#setField()', function() { @@ -151,6 +172,36 @@ describe('SearchSource', function() { }); }); + describe('#legacy fetch()', () => { + beforeEach(() => { + uiSettingsMock.get.mockImplementation(() => { + return true; // batchSearches = true + }); + }); + + afterEach(() => { + uiSettingsMock.get.mockImplementation(() => { + return false; // batchSearches = false + }); + }); + + it('should call msearch', async () => { + const searchSource = new SearchSource({ index: indexPattern }); + const options = {}; + await searchSource.fetch(options); + expect(fetchSoon).toBeCalledTimes(1); + }); + }); + + describe('#search service fetch()', () => { + it('should call msearch', async () => { + const searchSource = new SearchSource({ index: indexPattern }); + const options = {}; + await searchSource.fetch(options); + expect(searchStartMock.search).toBeCalledTimes(1); + }); + }); + describe('#serialize', function() { it('should reference index patterns', () => { const indexPattern123 = { id: '123' } as IndexPattern; diff --git a/src/plugins/data/public/search/search_source/search_source.ts b/src/plugins/data/public/search/search_source/search_source.ts index c70db7bb82ef7..9d2bb889953cf 100644 --- a/src/plugins/data/public/search/search_source/search_source.ts +++ b/src/plugins/data/public/search/search_source/search_source.ts @@ -70,17 +70,19 @@ */ import _ from 'lodash'; +import { map } from 'rxjs/operators'; import { SavedObjectReference } from 'kibana/public'; import { normalizeSortRequest } from './normalize_sort_request'; import { filterDocvalueFields } from './filter_docvalue_fields'; import { fieldWildcardFilter } from '../../../../kibana_utils/public'; import { IIndexPattern, SearchRequest } from '../..'; import { SearchSourceOptions, SearchSourceFields } from './types'; -import { fetchSoon, FetchOptions, RequestFailure } from '../fetch'; +import { FetchOptions, RequestFailure, getSearchParams, handleResponse } from '../fetch'; import { getSearchService, getUiSettings, getInjectedMetadata } from '../../services'; import { getEsQueryConfig, buildEsQuery, Filter } from '../../../common'; import { getHighlightRequest } from '../../../common/field_formats'; +import { fetchSoon } from '../legacy'; export type ISearchSource = Pick; @@ -185,18 +187,29 @@ export class SearchSource { } /** - * Fetch this source and reject the returned Promise on error - * - * @async + * Run a search using the search service + * @return {Observable>} */ - async fetch(options: FetchOptions = {}) { - await this.requestIsStarting(options); - - const searchRequest = await this.flatten(); - this.history = [searchRequest]; + private fetch$(searchRequest: SearchRequest, signal?: AbortSignal) { + const esShardTimeout = getInjectedMetadata().getInjectedVar('esShardTimeout') as number; + const searchParams = getSearchParams(getUiSettings(), esShardTimeout); + const params = { + index: searchRequest.index.title || searchRequest.index, + body: searchRequest.body, + ...searchParams, + }; + return getSearchService() + .search({ params, indexType: searchRequest.indexType }, { signal }) + .pipe(map(({ rawResponse }) => handleResponse(searchRequest, rawResponse))); + } + /** + * Run a search using the search service + * @return {Promise>} + */ + private async legacyFetch(searchRequest: SearchRequest, options: FetchOptions) { const esShardTimeout = getInjectedMetadata().getInjectedVar('esShardTimeout') as number; - const response = await fetchSoon( + return await fetchSoon( searchRequest, { ...(this.searchStrategyId && { searchStrategyId: this.searchStrategyId }), @@ -208,6 +221,24 @@ export class SearchSource { esShardTimeout, } ); + } + /** + * Fetch this source and reject the returned Promise on error + * + * @async + */ + async fetch(options: FetchOptions = {}) { + await this.requestIsStarting(options); + + const searchRequest = await this.flatten(); + this.history = [searchRequest]; + + let response; + if (getUiSettings().get('courier:batchSearches')) { + response = await this.legacyFetch(searchRequest, options); + } else { + response = this.fetch$(searchRequest, options.abortSignal).toPromise(); + } if (response.error) { throw new RequestFailure(null, response); @@ -246,7 +277,6 @@ export class SearchSource { /** * Called by requests of this search source when they are started - * @param {Courier.Request} request * @param options * @return {Promise} */ @@ -430,7 +460,6 @@ export class SearchSource { * and `kibanaSavedObjectMeta.searchSourceJSON.filter[].meta.index`. * * Using `createSearchSource`, the instance can be re-created. - * @param searchSource The search source to serialize * @public */ public serialize() { const references: SavedObjectReference[] = []; diff --git a/src/plugins/data/public/search/search_strategy/no_op_search_strategy.ts b/src/plugins/data/public/search/search_strategy/no_op_search_strategy.ts deleted file mode 100644 index dc7331e614a0e..0000000000000 --- a/src/plugins/data/public/search/search_strategy/no_op_search_strategy.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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 { i18n } from '@kbn/i18n'; -import { SearchError } from './search_error'; -import { SearchStrategyProvider } from './types'; - -export const noOpSearchStrategy: SearchStrategyProvider = { - id: 'noOp', - - search: () => { - const searchError = new SearchError({ - status: '418', // "I'm a teapot" error - title: i18n.translate( - 'data.search.searchSource.noSearchStrategyRegisteredErrorMessageTitle', - { - defaultMessage: 'No search strategy registered', - } - ), - message: i18n.translate( - 'data.search.searchSource.noSearchStrategyRegisteredErrorMessageDescription', - { - defaultMessage: `Couldn't find a search strategy for the search request`, - } - ), - type: 'NO_OP_SEARCH_STRATEGY', - path: '', - }); - - return { - searching: Promise.reject(searchError), - abort: () => {}, - }; - }, - - isViable: () => { - return true; - }, -}; diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index ba6e44f47b75e..2122e4e82ec1d 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -22,7 +22,7 @@ import { createSearchSource } from './search_source'; import { SearchAggsSetup, SearchAggsStart, SearchAggsStartLegacy } from './aggs'; import { ISearch, ISearchGeneric } from './i_search'; import { TStrategyTypes } from './strategy_types'; -import { LegacyApiCaller } from './es_client'; +import { LegacyApiCaller } from './legacy/es_client'; import { SearchInterceptor } from './search_interceptor'; export interface ISearchContext { @@ -38,15 +38,6 @@ export interface ISearchStrategy { search: ISearch; } -/** - * Search strategy provider creates an instance of a search strategy with the request - * handler context bound to it. This way every search strategy can use - * whatever information they require from the request context. - */ -export type TSearchStrategyProviderEnhanced = ( - search: ISearchGeneric -) => Promise>; - export type TSearchStrategiesMap = { [K in TStrategyTypes]?: TSearchStrategyProvider; }; diff --git a/x-pack/plugins/rollup/public/search/rollup_search_strategy.ts b/x-pack/plugins/rollup/public/search/rollup_search_strategy.ts deleted file mode 100644 index d1c3b9cba5f9d..0000000000000 --- a/x-pack/plugins/rollup/public/search/rollup_search_strategy.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { HttpSetup } from 'kibana/public'; -import { - SearchError, - getSearchErrorType, - IIndexPattern, - SearchStrategyProvider, - SearchResponse, - SearchRequest, -} from '../../../../../src/plugins/data/public'; - -function serializeFetchParams(searchRequests: SearchRequest[]) { - return JSON.stringify( - searchRequests.map(searchRequestWithFetchParams => { - const indexPattern = - searchRequestWithFetchParams.index.title || searchRequestWithFetchParams.index; - const { - body: { size, aggs, query: _query }, - } = searchRequestWithFetchParams; - - const query = { - size, - aggregations: aggs, - query: _query, - }; - - return { index: indexPattern, query }; - }) - ); -} - -// Rollup search always returns 0 hits, but visualizations expect search responses -// to return hits > 0, otherwise they do not render. We fake the number of hits here -// by counting the number of aggregation buckets/values returned by rollup search. -function shimHitsInFetchResponse(response: SearchResponse[]) { - return response.map(result => { - const buckets = result.aggregations - ? Object.keys(result.aggregations).reduce((allBuckets, agg) => { - return allBuckets.concat( - result.aggregations[agg].buckets || [result.aggregations[agg].value] || [] - ); - }, []) - : []; - return buckets && buckets.length - ? { - ...result, - hits: { - ...result.hits, - total: buckets.length, - }, - } - : result; - }); -} - -export const getRollupSearchStrategy = (fetch: HttpSetup['fetch']): SearchStrategyProvider => ({ - id: 'rollup', - - search: ({ searchRequests }) => { - // Serialize the fetch params into a format suitable for the body of an ES query. - const serializedFetchParams = serializeFetchParams(searchRequests); - - const controller = new AbortController(); - const promise = fetch('../api/rollup/search', { - signal: controller.signal, - method: 'POST', - body: serializedFetchParams, - }); - - return { - searching: promise.then(shimHitsInFetchResponse).catch(error => { - const { - body: { statusCode, error: title, message }, - res: { url }, - } = error; - - // Format fetch error as a SearchError. - const searchError = new SearchError({ - status: statusCode, - title, - message: `Rollup search error: ${message}`, - path: url, - type: getSearchErrorType({ message }) || '', - }); - - return Promise.reject(searchError); - }), - abort: () => controller.abort(), - }; - }, - - isViable: (indexPattern: IIndexPattern) => { - if (!indexPattern) { - return false; - } - - return indexPattern.type === 'rollup'; - }, -}); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 63d6850c0d0d7..1170d270e42ac 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -847,8 +847,6 @@ "data.search.searchSource.indexPatternIdDescription": "{kibanaIndexPattern} インデックス内の ID です。", "data.search.searchSource.indexPatternIdLabel": "インデックスパターン ID", "data.search.searchSource.indexPatternLabel": "インデックスパターン", - "data.search.searchSource.noSearchStrategyRegisteredErrorMessageDescription": "検索リクエストの検索方法が見つかりませんでした", - "data.search.searchSource.noSearchStrategyRegisteredErrorMessageTitle": "検索方法が登録されていません", "data.search.searchSource.queryTimeDescription": "クエリの処理の所要時間です。リクエストの送信やブラウザでのパースの時間は含まれません。", "data.search.searchSource.queryTimeLabel": "クエリ時間", "data.search.searchSource.queryTimeValue": "{queryTime}ms", @@ -2464,13 +2462,13 @@ "management.breadcrumb": "管理", "management.connectDataDisplayName": "データに接続", "management.displayName": "管理", + "management.nav.label": "管理", + "management.nav.menu": "管理メニュー", + "management.stackManagement.managementDescription": "Elastic Stack の管理を行うセンターコンソールです。", "indexPatternManagement.editIndexPattern.createIndex.defaultButtonDescription": "すべてのデータに完全集約を実行", "indexPatternManagement.editIndexPattern.createIndex.defaultButtonText": "標準インデックスパターン", "indexPatternManagement.editIndexPattern.createIndex.defaultTypeName": "インデックスパターン", "indexPatternManagement.editIndexPattern.list.defaultIndexPatternListName": "デフォルト", - "management.nav.label": "管理", - "management.nav.menu": "管理メニュー", - "management.stackManagement.managementDescription": "Elastic Stack の管理を行うセンターコンソールです。", "newsfeed.emptyPrompt.noNewsText": "Kibanaインスタンスがインターネットにアクセスできない場合、管理者にこの機能を無効にするように依頼してください。そうでない場合は、ニュースを取り込み続けます。", "newsfeed.emptyPrompt.noNewsTitle": "ニュースがない場合", "newsfeed.flyoutList.closeButtonLabel": "閉じる", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 59b9aeb54c695..f86e03b6c10e1 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -848,8 +848,6 @@ "data.search.searchSource.indexPatternIdDescription": "{kibanaIndexPattern} 索引中的 ID。", "data.search.searchSource.indexPatternIdLabel": "索引模式 ID", "data.search.searchSource.indexPatternLabel": "索引模式", - "data.search.searchSource.noSearchStrategyRegisteredErrorMessageDescription": "无法为该搜索请求找到搜索策略", - "data.search.searchSource.noSearchStrategyRegisteredErrorMessageTitle": "未注册任何搜索策略", "data.search.searchSource.queryTimeDescription": "处理查询所花费的时间。不包括发送请求或在浏览器中解析它的时间。", "data.search.searchSource.queryTimeLabel": "查询时间", "data.search.searchSource.queryTimeValue": "{queryTime}ms", @@ -2465,13 +2463,13 @@ "management.breadcrumb": "管理", "management.connectDataDisplayName": "连接数据", "management.displayName": "管理", + "management.nav.label": "管理", + "management.nav.menu": "管理菜单", + "management.stackManagement.managementDescription": "您用于管理 Elastic Stack 的中心控制台。", "indexPatternManagement.editIndexPattern.createIndex.defaultButtonDescription": "对任何数据执行完全聚合", "indexPatternManagement.editIndexPattern.createIndex.defaultButtonText": "标准索引模式", "indexPatternManagement.editIndexPattern.createIndex.defaultTypeName": "索引模式", "indexPatternManagement.editIndexPattern.list.defaultIndexPatternListName": "默认值", - "management.nav.label": "管理", - "management.nav.menu": "管理菜单", - "management.stackManagement.managementDescription": "您用于管理 Elastic Stack 的中心控制台。", "newsfeed.emptyPrompt.noNewsText": "如果您的 Kibana 实例没有 Internet 连接,请让您的管理员禁用此功能。否则,我们将不断尝试获取新闻。", "newsfeed.emptyPrompt.noNewsTitle": "无新闻?", "newsfeed.flyoutList.closeButtonLabel": "鍏抽棴", From 7b57caf62beb33d06959ac6368a956a9e5f492aa Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 20 Apr 2020 09:32:03 +0300 Subject: [PATCH 11/15] [i18n] add localization section in CONTRIBUTING file (#63668) * add localization section * upadte TOC * Update CONTRIBUTING.md --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c745f1611cce..e4a9d87bc56fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,7 @@ A high level overview of our contributing guidelines. - [Setting Up SSL](#setting-up-ssl) - [Linting](#linting) - [Internationalization](#internationalization) + - [Localization](#localization) - [Testing and Building](#testing-and-building) - [Debugging server code](#debugging-server-code) - [Instrumenting with Elastic APM](#instrumenting-with-elastic-apm) @@ -408,6 +409,11 @@ ReactDOM.render( There are a number of tools created to support internationalization in Kibana that would allow one to validate internationalized labels, extract them to a `JSON` file or integrate translations back to Kibana. To know more, please read corresponding [readme](src/dev/i18n/README.md) file. +### Localization + +We cannot support accepting contributions to the translations from any source other than the translators we have engaged to do the work. +We are still to develop a proper process to accept any contributed translations. We certainly appreciate that people care enough about the localization effort to want to help improve the quality. We aim to build out a more comprehensive localization process for the future and will notify you once contributions can be supported, but for the time being, we are not able to incorporate suggestions. + ### Testing and Building To ensure that your changes will not break other functionality, please run the test suite and build process before submitting your Pull Request. From 7c7fbc70cd081bfe9b5dbdbe90e6773c1e3772d5 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 20 Apr 2020 11:12:17 +0200 Subject: [PATCH 12/15] [Uptime] Refactor folder structure (#63442) * update structure * update connected structure * update connected structure * update code structure * update types * update imports * update folder * update trans * fixed snapshot * updated code * refacto monitor list container * update types Co-authored-by: Elastic Machine --- .../common/constants/chart_format_limits.ts | 2 +- .../common/constants/context_defaults.ts | 2 +- .../plugins/uptime/common/graphql/types.ts | 0 .../uptime/common/runtime_types/common.ts | 1 - .../plugins/uptime/common/types/index.ts | 4 + .../plugins/uptime/public/apps/plugin.ts | 14 +- .../__snapshots__/location_link.test.tsx.snap | 0 .../uptime_date_picker.test.tsx.snap | 0 .../__tests__/location_link.test.tsx | 0 .../__tests__/uptime_date_picker.test.tsx | 0 .../chart_empty_state.test.tsx.snap | 0 .../__snapshots__/chart_wrapper.test.tsx.snap | 0 .../__snapshots__/donut_chart.test.tsx.snap | 0 .../donut_chart_legend.test.tsx.snap | 0 .../donut_chart_legend_row.test.tsx.snap | 0 .../duration_charts.test.tsx.snap | 1 - .../monitor_bar_series.test.tsx.snap | 0 .../ping_histogram.test.tsx.snap | 0 .../__tests__/chart_empty_state.test.tsx | 0 .../charts/__tests__/chart_wrapper.test.tsx | 2 +- .../charts/__tests__/donut_chart.test.tsx | 0 .../__tests__/donut_chart_legend.test.tsx | 0 .../__tests__/donut_chart_legend_row.test.tsx | 0 .../charts/__tests__/duration_charts.test.tsx | 1 - .../charts/__tests__/get_tick_format.test.ts | 0 .../__tests__/monitor_bar_series.test.tsx | 0 .../charts/__tests__/ping_histogram.test.tsx | 0 .../charts/annotation_tooltip.tsx | 0 .../charts/chart_empty_state.tsx | 0 .../charts/chart_wrapper/chart_wrapper.tsx | 0 .../charts/chart_wrapper/index.ts | 0 .../charts/donut_chart.tsx | 0 .../charts/donut_chart_legend.tsx | 0 .../charts/donut_chart_legend_row.tsx | 0 .../common/charts/duration_chart.tsx | 122 ++++++++++++++ .../charts/duration_line_bar_list.tsx | 0 .../charts/duration_line_series_list.tsx | 2 +- .../charts/get_tick_format.ts | 0 .../{functional => common}/charts/index.ts | 0 .../charts/monitor_bar_series.tsx | 0 .../charts/ping_histogram.tsx | 0 .../responsive_wrapper.test.tsx.snap | 0 .../__tests__/responsive_wrapper.test.tsx | 0 .../{ => common}/higher_order/index.ts | 0 .../higher_order/responsive_wrapper.tsx | 0 .../location_link.tsx | 0 .../uptime_date_picker.tsx | 2 +- .../connected/charts/ping_histogram.tsx | 82 --------- .../connected/charts/snapshot_container.tsx | 93 ----------- .../public/components/connected/index.ts | 19 --- .../monitor/status_bar_container.tsx | 71 -------- .../monitor/status_details_container.tsx | 63 ------- .../functional/charts/duration_chart.tsx | 155 ------------------ .../public/components/functional/index.ts | 20 --- .../monitor_status_bar/index.ts | 8 - .../components/functional/search_schema.ts | 17 -- .../monitor_charts.test.tsx.snap | 0 .../__tests__/monitor_charts.test.tsx | 0 .../uptime/public/components/monitor/index.ts | 12 ++ .../__snapshots__/location_map.test.tsx.snap | 0 .../location_missing.test.tsx.snap | 0 .../location_status_tags.test.tsx.snap | 0 .../__tests__/location_map.test.tsx | 0 .../__tests__/location_missing.test.tsx | 0 .../__tests__/location_status_tags.test.tsx | 3 +- .../embeddables/__tests__/__mocks__/mock.ts | 0 .../embeddables/__tests__/map_config.test.ts | 0 .../location_map/embeddables/embedded_map.tsx | 0 .../embeddables/low_poly_layer.json | 0 .../location_map/embeddables/map_config.ts | 2 +- .../location_map/embeddables/translations.ts | 0 .../location_map/index.tsx | 0 .../location_map/location_map.tsx | 0 .../location_map/location_missing.tsx | 2 +- .../location_map/location_status_tags.tsx | 0 .../confirm_delete.test.tsx.snap | 0 .../__snapshots__/license_info.test.tsx.snap | 0 .../__snapshots__/ml_flyout.test.tsx.snap | 0 .../ml_integerations.test.tsx.snap | 0 .../__snapshots__/ml_job_link.test.tsx.snap | 0 .../__snapshots__/ml_manage_job.test.tsx.snap | 0 .../ml/__tests__/confirm_delete.test.tsx | 0 .../ml/__tests__/license_info.test.tsx | 0 .../ml/__tests__/ml_flyout.test.tsx | 0 .../ml/__tests__/ml_integerations.test.tsx | 0 .../ml/__tests__/ml_job_link.test.tsx | 0 .../ml/__tests__/ml_manage_job.test.tsx | 0 .../ml/confirm_delete.tsx | 0 .../components/monitor/ml}/index.ts | 2 +- .../ml/license_info.tsx | 0 .../ml/manage_ml_job.tsx | 2 +- .../ml/ml_flyout.tsx | 0 .../ml/ml_flyout_container.tsx | 2 +- .../ml/ml_integeration.tsx | 2 +- .../ml/ml_job_link.tsx | 0 .../ml/translations.tsx | 7 - .../monitor_charts.tsx | 7 +- .../monitor/monitor_duration/index.ts | 8 + .../monitor_duration/monitor_duration.tsx | 66 ++++++++ .../monitor_duration_container.tsx} | 11 +- .../monitor_ssl_certificate.test.tsx.snap | 0 .../monitor_status.bar.test.tsx.snap | 0 .../status_by_location.test.tsx.snap | 0 .../__test__/monitor_ssl_certificate.test.tsx | 0 .../__test__/monitor_status.bar.test.tsx | 0 .../__test__/status_by_location.test.tsx | 2 +- .../monitor_status_details/index.ts | 5 +- .../monitor_status_bar/index.ts | 9 + .../monitor_status_bar/ssl_certificate.tsx} | 0 .../monitor_status_bar/status_bar.tsx} | 4 +- .../status_bar_container.tsx | 40 +++++ .../monitor_status_bar/status_by_location.tsx | 0 .../monitor_status_bar/translations.ts | 1 + .../status_details.tsx} | 2 +- .../status_details_container.tsx | 34 ++++ .../monitor_status_details/translations.ts | 1 + .../pings => monitor/ping_histogram}/index.ts | 2 +- .../ping_histogram_container.tsx | 48 ++++++ .../__snapshots__/doc_link_body.test.tsx.snap | 0 .../__snapshots__/expanded_row.test.tsx.snap | 0 .../__snapshots__/ping_list.test.tsx.snap | 0 .../__tests__/doc_link_body.test.tsx | 0 .../ping_list/__tests__/expanded_row.test.tsx | 0 .../ping_list/__tests__/ping_list.test.tsx | 2 +- .../ping_list/doc_link_body.tsx | 0 .../ping_list/expanded_row.tsx | 0 .../ping_list/index.tsx | 1 + .../ping_list/location_name.tsx | 0 .../ping_list/ping_list.tsx | 6 +- .../ping_list/ping_list_container.tsx} | 2 +- .../parsing_error_callout.test.tsx.snap} | 0 .../__snapshots__/snapshot.test.tsx.snap | 0 .../snapshot_heading.test.tsx.snap | 0 .../__tests__/parsing_error_callout.test.tsx} | 6 +- .../__tests__/snapshot.test.tsx | 2 +- .../__tests__/snapshot_heading.test.tsx | 2 +- .../__tests__/alert_monitor_status.test.tsx | 4 +- .../alerts/alert_monitor_status.tsx | 2 +- .../alert_monitor_status.tsx | 4 +- .../alerts/alerts_containers}/index.ts | 0 .../toggle_alert_flyout_button.tsx | 4 +- .../uptime_alerts_flyout_wrapper.tsx | 6 +- .../{functional => overview}/alerts/index.ts | 1 + .../alerts/toggle_alert_flyout_button.tsx | 0 .../alerts/uptime_alerts_context_provider.tsx | 0 .../alerts/uptime_alerts_flyout_wrapper.tsx | 0 .../data_or_index_missing.test.tsx.snap | 0 .../__snapshots__/empty_state.test.tsx.snap | 0 .../__tests__/data_or_index_missing.test.tsx | 0 .../__tests__/empty_state.test.tsx | 0 .../empty_state/data_or_index_missing.tsx | 0 .../empty_state/empty_state.tsx | 0 .../empty_state/empty_state_container.tsx} | 2 +- .../empty_state/empty_state_error.tsx | 0 .../empty_state/empty_state_loading.tsx | 0 .../components/overview/empty_state/index.ts | 8 + .../filter_popover.test.tsx.snap | 0 .../filter_status_button.test.tsx.snap | 0 .../parse_filter_map.test.ts.snap | 0 .../__tests__/filter_popover.test.tsx | 0 .../__tests__/filter_status_button.test.tsx | 2 +- .../__tests__/parse_filter_map.test.ts | 0 .../__tests__/toggle_selected_item.test.ts | 0 .../filter_group/filter_group.tsx | 0 .../filter_group/filter_group_container.tsx | 4 +- .../filter_group/filter_popover.tsx | 0 .../filter_group/filter_status_button.tsx | 0 .../filter_group/index.ts | 1 + .../filter_group/parse_filter_map.ts | 0 .../filter_group/toggle_selected_item.ts | 0 .../filter_group/uptime_filter_button.tsx | 0 .../public/components/overview/index.ts | 14 ++ .../components/overview/kuery_bar/index.ts | 8 + .../kuery_bar/kuery_bar.tsx | 0 .../kuery_bar}/kuery_bar_container.tsx | 2 +- .../kuery_bar/typeahead/click_outside.js | 0 .../kuery_bar/typeahead/index.d.ts | 2 +- .../kuery_bar/typeahead/index.js | 0 .../kuery_bar/typeahead/suggestion.js | 0 .../kuery_bar/typeahead/suggestions.js | 0 .../__snapshots__/monitor_list.test.tsx.snap | 0 .../monitor_list_status_column.test.tsx.snap | 0 .../monitor_page_link.test.tsx.snap | 0 .../__tests__/monitor_list.test.tsx | 0 .../monitor_list_page_size_select.test.tsx | 0 .../monitor_list_status_column.test.tsx | 0 .../__tests__/monitor_page_link.test.tsx | 0 .../__tests__/parse_timestamp.test.ts | 0 .../monitor_list/index.ts | 2 + .../monitor_list/monitor_list.tsx | 6 +- .../monitor_list/monitor_list_container.tsx} | 5 +- .../integration_group.test.tsx.snap | 0 .../integration_link.test.tsx.snap | 0 .../monitor_list_drawer.test.tsx.snap | 0 .../monitor_status_list.test.tsx.snap | 0 .../monitor_status_row.test.tsx.snap | 0 .../most_recent_error.test.tsx.snap | 0 .../monitor_list_drawer/__tests__/data.json | 0 .../__tests__/integration_group.test.tsx | 2 +- .../__tests__/integration_link.test.tsx | 2 +- .../__tests__/monitor_list_drawer.test.tsx | 0 .../__tests__/monitor_status_list.test.tsx | 0 .../__tests__/monitor_status_row.test.tsx | 0 .../__tests__/most_recent_error.test.tsx | 0 .../actions_popover/actions_popover.tsx} | 10 +- .../actions_popover_container.tsx} | 13 +- .../actions_popover}/integration_group.tsx | 6 +- .../actions_popover}/integration_link.tsx | 0 .../monitor_list/monitor_list_drawer/index.ts | 4 +- .../list_drawer_container.tsx | 14 +- .../monitor_list_drawer.tsx | 4 +- .../monitor_status_list.tsx | 2 +- .../monitor_status_row.tsx | 0 .../monitor_list_drawer/most_recent_error.tsx | 0 .../monitor_list_page_size_select.tsx | 0 .../monitor_list_status_column.tsx | 0 .../monitor_list/monitor_page_link.tsx | 0 .../monitor_list/overview_page_link.tsx | 0 .../monitor_list/parse_timestamp.ts | 0 .../monitor_list/translations.ts | 0 .../monitor_list/types.ts | 7 - .../pages => overview}/overview_container.tsx | 8 +- .../parsing_error_callout.tsx} | 6 +- .../components/overview/snapshot/index.ts} | 6 +- .../snapshot}/snapshot.tsx | 6 +- .../overview/snapshot/snapshot_container.tsx | 34 ++++ .../snapshot}/snapshot_heading.tsx | 0 .../{functional => overview}/status_panel.tsx | 3 +- .../contexts/uptime_settings_context.tsx | 2 +- .../hooks/__tests__/use_breadcrumbs.test.tsx | 2 +- .../uptime/public/lib/alert_types/index.ts | 2 +- .../public/lib/alert_types/monitor_status.tsx | 2 +- .../lib/helper/charts/get_chart_date_label.ts | 2 +- .../lib/helper/charts/get_label_format.ts | 2 +- .../public/lib/helper/convert_measurements.ts | 2 +- .../__tests__/parse_absolute_date.test.ts | 2 +- .../parse_autorefresh_interval.test.ts | 24 --- .../legacy/plugins/uptime/public/lib/lib.ts | 3 - .../plugins/uptime/public/pages/monitor.tsx | 5 +- .../plugins/uptime/public/pages/overview.tsx | 7 +- .../uptime/public/pages/page_header.tsx | 4 +- .../legacy/plugins/uptime/public/routes.tsx | 2 +- .../uptime/public/state/api/monitor.ts | 2 +- .../public/state/api/monitor_duration.ts | 2 +- .../public/state/api/overview_filters.ts | 4 +- .../plugins/uptime/public/state/api/ping.ts | 2 +- .../uptime/public/state/api/snapshot.ts | 2 +- .../public/state/reducers/monitor_status.ts | 4 +- .../uptime/public/state/reducers/ui.ts | 2 +- .../uptime/public/state/selectors/index.ts | 10 ++ .../plugins/uptime/public/uptime_app.tsx | 8 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 253 files changed, 560 insertions(+), 719 deletions(-) create mode 100644 x-pack/legacy/plugins/uptime/common/graphql/types.ts rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_list/monitor_list_drawer => common}/__tests__/__snapshots__/location_link.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_list/monitor_list_drawer => common}/__tests__/location_link.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/__tests__/uptime_date_picker.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap (99%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/chart_empty_state.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/chart_wrapper.test.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/donut_chart.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/donut_chart_legend.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/donut_chart_legend_row.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/duration_charts.test.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/get_tick_format.test.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/monitor_bar_series.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/__tests__/ping_histogram.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/annotation_tooltip.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/chart_empty_state.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/chart_wrapper/chart_wrapper.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/chart_wrapper/index.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/donut_chart.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/donut_chart_legend.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/donut_chart_legend_row.tsx (100%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/common/charts/duration_chart.tsx rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/duration_line_bar_list.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/duration_line_series_list.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/get_tick_format.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/index.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/monitor_bar_series.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/charts/ping_histogram.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{ => common}/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{ => common}/higher_order/__tests__/responsive_wrapper.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{ => common}/higher_order/index.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{ => common}/higher_order/responsive_wrapper.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_list/monitor_list_drawer => common}/location_link.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => common}/uptime_date_picker.tsx (100%) delete mode 100644 x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/connected/charts/snapshot_container.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/connected/index.ts delete mode 100644 x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_bar_container.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_details_container.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_chart.tsx delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/index.ts delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/index.ts delete mode 100644 x-pack/legacy/plugins/uptime/public/components/functional/search_schema.ts rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/__tests__/__snapshots__/monitor_charts.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/__tests__/monitor_charts.test.tsx (100%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/index.ts rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/__tests__/__snapshots__/location_map.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/__tests__/location_map.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/__tests__/location_missing.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/__tests__/location_status_tags.test.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/embeddables/__tests__/__mocks__/mock.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/embeddables/__tests__/map_config.test.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/embeddables/embedded_map.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/embeddables/low_poly_layer.json (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/embeddables/map_config.ts (98%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/embeddables/translations.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/index.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/location_map.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/location_missing.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/location_map/location_status_tags.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/__snapshots__/license_info.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/confirm_delete.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/license_info.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/ml_flyout.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/ml_integerations.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/ml_job_link.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/__tests__/ml_manage_job.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/confirm_delete.tsx (100%) rename x-pack/legacy/plugins/uptime/{common/domain_types => public/components/monitor/ml}/index.ts (81%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/license_info.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/manage_ml_job.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/ml_flyout.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/ml_flyout_container.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/ml_integeration.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/ml_job_link.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{monitor_details => monitor}/ml/translations.tsx (95%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_charts.tsx (68%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/index.ts create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx rename x-pack/legacy/plugins/uptime/public/components/{connected/charts/monitor_duration.tsx => monitor/monitor_duration/monitor_duration_container.tsx} (91%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/__test__/__snapshots__/monitor_ssl_certificate.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/__test__/__snapshots__/monitor_status.bar.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/__test__/__snapshots__/status_by_location.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/__test__/monitor_ssl_certificate.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/__test__/monitor_status.bar.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/__test__/status_by_location.test.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/index.ts (64%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_status_details/monitor_status_bar/monitor_ssl_certificate.tsx => monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx} (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_status_details/monitor_status_bar/monitor_status_bar.tsx => monitor/monitor_status_details/monitor_status_bar/status_bar.tsx} (95%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/monitor_status_bar/status_by_location.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/monitor_status_bar/translations.ts (99%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_status_details/monitor_status_details.tsx => monitor/monitor_status_details/status_details.tsx} (97%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/monitor_status_details/translations.ts (99%) rename x-pack/legacy/plugins/uptime/public/components/{connected/pings => monitor/ping_histogram}/index.ts (80%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/__tests__/doc_link_body.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/__tests__/expanded_row.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/__tests__/ping_list.test.tsx (99%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/doc_link_body.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/expanded_row.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/index.tsx (85%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/location_name.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => monitor}/ping_list/ping_list.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{connected/pings/ping_list.tsx => monitor/ping_list/ping_list_container.tsx} (96%) rename x-pack/legacy/plugins/uptime/public/components/{functional/__tests__/__snapshots__/overview_page_parsing_error_callout.test.tsx.snap => overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap} (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/__tests__/__snapshots__/snapshot.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/__tests__/__snapshots__/snapshot_heading.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional/__tests__/overview_page_parsing_error_callout.test.tsx => overview/__tests__/parsing_error_callout.test.tsx} (76%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/__tests__/snapshot.test.tsx (92%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/__tests__/snapshot_heading.test.tsx (93%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/alerts/__tests__/alert_monitor_status.test.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/alerts/alert_monitor_status.tsx (99%) rename x-pack/legacy/plugins/uptime/public/components/{connected/alerts => overview/alerts/alerts_containers}/alert_monitor_status.tsx (86%) rename x-pack/legacy/plugins/uptime/public/components/{connected/alerts => overview/alerts/alerts_containers}/index.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{connected/alerts => overview/alerts/alerts_containers}/toggle_alert_flyout_button.tsx (80%) rename x-pack/legacy/plugins/uptime/public/components/{connected/alerts => overview/alerts/alerts_containers}/uptime_alerts_flyout_wrapper.tsx (83%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/alerts/index.ts (93%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/alerts/toggle_alert_flyout_button.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/alerts/uptime_alerts_context_provider.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/alerts/uptime_alerts_flyout_wrapper.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/__tests__/data_or_index_missing.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/__tests__/empty_state.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/data_or_index_missing.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/empty_state.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{connected/empty_state/empty_state.tsx => overview/empty_state/empty_state_container.tsx} (95%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/empty_state_error.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/empty_state/empty_state_loading.tsx (100%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/overview/empty_state/index.ts rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/filter_popover.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/filter_status_button.test.tsx (93%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/parse_filter_map.test.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/__tests__/toggle_selected_item.test.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/filter_group.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{connected => overview}/filter_group/filter_group_container.tsx (94%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/filter_popover.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/filter_status_button.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/index.ts (84%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/parse_filter_map.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/toggle_selected_item.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/filter_group/uptime_filter_button.tsx (100%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/overview/index.ts create mode 100644 x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/index.ts rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/kuery_bar/kuery_bar.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{connected/kuerybar => overview/kuery_bar}/kuery_bar_container.tsx (90%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/kuery_bar/typeahead/click_outside.js (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/kuery_bar/typeahead/index.d.ts (95%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/kuery_bar/typeahead/index.js (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/kuery_bar/typeahead/suggestion.js (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/kuery_bar/typeahead/suggestions.js (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/monitor_list.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/monitor_list_page_size_select.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/monitor_list_status_column.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/monitor_page_link.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/__tests__/parse_timestamp.test.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/index.ts (69%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{connected/monitor/monitor_list.tsx => overview/monitor_list/monitor_list_container.tsx} (93%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/data.json (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx (94%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx (93%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_list/monitor_list_drawer/monitor_list_actions_popover.tsx => overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx} (89%) rename x-pack/legacy/plugins/uptime/public/components/{connected/monitor/drawer_popover_container.tsx => overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx} (63%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_list/monitor_list_drawer => overview/monitor_list/monitor_list_drawer/actions_popover}/integration_group.tsx (98%) rename x-pack/legacy/plugins/uptime/public/components/{functional/monitor_list/monitor_list_drawer => overview/monitor_list/monitor_list_drawer/actions_popover}/integration_link.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/index.ts (63%) rename x-pack/legacy/plugins/uptime/public/components/{connected/monitor => overview/monitor_list/monitor_list_drawer}/list_drawer_container.tsx (72%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx (93%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/monitor_status_list.tsx (97%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/monitor_status_row.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_drawer/most_recent_error.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_page_size_select.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_list_status_column.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/monitor_page_link.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/overview_page_link.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/parse_timestamp.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/translations.ts (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/monitor_list/types.ts (83%) rename x-pack/legacy/plugins/uptime/public/components/{connected/pages => overview}/overview_container.tsx (74%) rename x-pack/legacy/plugins/uptime/public/components/{functional/overview_page_parsing_error_callout.tsx => overview/parsing_error_callout.tsx} (89%) rename x-pack/legacy/plugins/uptime/{common/domain_types/monitors.ts => public/components/overview/snapshot/index.ts} (71%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview/snapshot}/snapshot.tsx (85%) create mode 100644 x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx rename x-pack/legacy/plugins/uptime/public/components/{functional => overview/snapshot}/snapshot_heading.tsx (100%) rename x-pack/legacy/plugins/uptime/public/components/{functional => overview}/status_panel.tsx (87%) delete mode 100644 x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_autorefresh_interval.test.ts diff --git a/x-pack/legacy/plugins/uptime/common/constants/chart_format_limits.ts b/x-pack/legacy/plugins/uptime/common/constants/chart_format_limits.ts index f291450ab2a7a..3bd204a003c9d 100644 --- a/x-pack/legacy/plugins/uptime/common/constants/chart_format_limits.ts +++ b/x-pack/legacy/plugins/uptime/common/constants/chart_format_limits.ts @@ -11,7 +11,7 @@ const WEEK = DAY * 7; const MONTH = WEEK * 4; /** - * These contsants are used by the charting code to determine + * These constants are used by the charting code to determine * what label should be applied to chart axes so as to help users * understand the timeseries data they're being shown. */ diff --git a/x-pack/legacy/plugins/uptime/common/constants/context_defaults.ts b/x-pack/legacy/plugins/uptime/common/constants/context_defaults.ts index c6b79afd9043b..0c493326add72 100644 --- a/x-pack/legacy/plugins/uptime/common/constants/context_defaults.ts +++ b/x-pack/legacy/plugins/uptime/common/constants/context_defaults.ts @@ -11,7 +11,7 @@ import { CursorDirection, SortOrder } from '../runtime_types'; */ export const CONTEXT_DEFAULTS = { /** - * The application cannot assume a basepath. + * The application cannot assume a basePath. */ BASE_PATH: '', diff --git a/x-pack/legacy/plugins/uptime/common/graphql/types.ts b/x-pack/legacy/plugins/uptime/common/graphql/types.ts new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/common.ts b/x-pack/legacy/plugins/uptime/common/runtime_types/common.ts index 9018f4acaa320..e07c46fa01cfe 100644 --- a/x-pack/legacy/plugins/uptime/common/runtime_types/common.ts +++ b/x-pack/legacy/plugins/uptime/common/runtime_types/common.ts @@ -33,7 +33,6 @@ export const DateRangeType = t.type({ }); export type Summary = t.TypeOf; -export type CheckGeo = t.TypeOf; export type Location = t.TypeOf; export type StatesIndexStatus = t.TypeOf; export type DateRange = t.TypeOf; diff --git a/x-pack/legacy/plugins/uptime/common/types/index.ts b/x-pack/legacy/plugins/uptime/common/types/index.ts index fcbb92caf26d5..a32eabd49a3e5 100644 --- a/x-pack/legacy/plugins/uptime/common/types/index.ts +++ b/x-pack/legacy/plugins/uptime/common/types/index.ts @@ -35,3 +35,7 @@ export interface MonitorDurationResult { /** The average values for the monitor duration. */ locationDurationLines: LocationDurationLine[]; } + +export interface MonitorIdParam { + monitorId: string; +} diff --git a/x-pack/legacy/plugins/uptime/public/apps/plugin.ts b/x-pack/legacy/plugins/uptime/public/apps/plugin.ts index eec49418910f8..e73598c44c9f0 100644 --- a/x-pack/legacy/plugins/uptime/public/apps/plugin.ts +++ b/x-pack/legacy/plugins/uptime/public/apps/plugin.ts @@ -4,23 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - LegacyCoreStart, - LegacyCoreSetup, - PluginInitializerContext, - AppMountParameters, -} from 'src/core/public'; -import { PluginsStart, PluginsSetup } from 'ui/new_platform/new_platform'; +import { LegacyCoreSetup, PluginInitializerContext, AppMountParameters } from 'src/core/public'; +import { PluginsSetup } from 'ui/new_platform/new_platform'; import { FeatureCatalogueCategory } from '../../../../../../src/plugins/home/public'; import { UMFrontendLibs } from '../lib/lib'; import { PLUGIN } from '../../common/constants'; import { getKibanaFrameworkAdapter } from '../lib/adapters/framework/new_platform_adapter'; -export interface StartObject { - core: LegacyCoreStart; - plugins: PluginsStart; -} - export interface SetupObject { core: LegacyCoreSetup; plugins: PluginsSetup; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/location_link.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/location_link.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/location_link.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/location_link.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/location_link.test.tsx b/x-pack/legacy/plugins/uptime/public/components/common/__tests__/location_link.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/location_link.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/__tests__/location_link.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/uptime_date_picker.test.tsx b/x-pack/legacy/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/uptime_date_picker.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap similarity index 99% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap index 6c38f3e338cfd..96918ab68f716 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap +++ b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap @@ -53,7 +53,6 @@ exports[`MonitorCharts component renders the component without errors 1`] = ` > { const component = shallowWithRouter( diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/get_tick_format.test.ts b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/get_tick_format.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/get_tick_format.test.ts rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/get_tick_format.test.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/monitor_bar_series.test.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/monitor_bar_series.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/ping_histogram.test.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/ping_histogram.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/annotation_tooltip.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/annotation_tooltip.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/chart_empty_state.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/chart_empty_state.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/chart_empty_state.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/chart_empty_state.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/chart_wrapper/chart_wrapper.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/chart_wrapper/chart_wrapper.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/chart_wrapper/index.ts b/x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/chart_wrapper/index.ts rename to x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart_legend.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart_legend.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart_legend_row.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/donut_chart_legend_row.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_chart.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_chart.tsx new file mode 100644 index 0000000000000..c82b2a1cf9fe2 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_chart.tsx @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import moment from 'moment'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { Axis, Chart, Position, timeFormatter, Settings, SeriesIdentifier } from '@elastic/charts'; +import { getChartDateLabel } from '../../../lib/helper'; +import { LocationDurationLine } from '../../../../common/types'; +import { DurationLineSeriesList } from './duration_line_series_list'; +import { ChartWrapper } from './chart_wrapper'; +import { useUrlParams } from '../../../hooks'; +import { getTickFormat } from './get_tick_format'; +import { ChartEmptyState } from './chart_empty_state'; +import { DurationAnomaliesBar } from './duration_line_bar_list'; +import { AnomalyRecords } from '../../../state/actions'; + +interface DurationChartProps { + /** + * Timeseries data that is used to express an average line series + * on the duration chart. One entry per location + */ + locationDurationLines: LocationDurationLine[]; + + /** + * To represent the loading spinner on chart + */ + loading: boolean; + + anomalies: AnomalyRecords | null; +} + +/** + * This chart is intended to visualize monitor duration performance over time to + * the users in a helpful way. Its x-axis is based on a timeseries, the y-axis is in + * milliseconds. + * @param props The props required for this component to render properly + */ +export const DurationChartComponent = ({ + locationDurationLines, + anomalies, + loading, +}: DurationChartProps) => { + const hasLines = locationDurationLines.length > 0; + const [getUrlParams, updateUrlParams] = useUrlParams(); + const { absoluteDateRangeStart: min, absoluteDateRangeEnd: max } = getUrlParams(); + + const [hiddenLegends, setHiddenLegends] = useState([]); + + const onBrushEnd = (minX: number, maxX: number) => { + updateUrlParams({ + dateRangeStart: moment(minX).toISOString(), + dateRangeEnd: moment(maxX).toISOString(), + }); + }; + + const legendToggleVisibility = (legendItem: SeriesIdentifier | null) => { + if (legendItem) { + setHiddenLegends(prevState => { + if (prevState.includes(legendItem.specId)) { + return [...prevState.filter(item => item !== legendItem.specId)]; + } else { + return [...prevState, legendItem.specId]; + } + }); + } + }; + + return ( + + {hasLines ? ( + + + + getTickFormat(d)} + title={i18n.translate('xpack.uptime.monitorCharts.durationChart.leftAxis.title', { + defaultMessage: 'Duration ms', + })} + /> + + + + ) : ( + up }} + /> + } + title={i18n.translate('xpack.uptime.durationChart.emptyPrompt.title', { + defaultMessage: 'No duration data available', + })} + /> + )} + + ); +}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_line_bar_list.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_line_bar_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_line_series_list.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_line_series_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx index 912bc5bb0501b..4223e918393b6 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_line_series_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx @@ -21,7 +21,7 @@ export const DurationLineSeriesList = ({ lines }: Props) => ( // this id is used for the line chart representing the average duration length data={line.map(({ x, y }) => [x, microsToMillis(y || null)])} id={`loc-avg-${name}`} - key={`locline-${name}`} + key={`loc-line-${name}`} name={name} xAccessor={0} xScaleType="time" diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/get_tick_format.ts b/x-pack/legacy/plugins/uptime/public/components/common/charts/get_tick_format.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/get_tick_format.ts rename to x-pack/legacy/plugins/uptime/public/components/common/charts/get_tick_format.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/index.ts b/x-pack/legacy/plugins/uptime/public/components/common/charts/index.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/index.ts rename to x-pack/legacy/plugins/uptime/public/components/common/charts/index.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/monitor_bar_series.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/monitor_bar_series.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/ping_histogram.tsx b/x-pack/legacy/plugins/uptime/public/components/common/charts/ping_histogram.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/charts/ping_histogram.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/charts/ping_histogram.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/higher_order/__tests__/responsive_wrapper.test.tsx b/x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/responsive_wrapper.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/higher_order/__tests__/responsive_wrapper.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/responsive_wrapper.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/higher_order/index.ts b/x-pack/legacy/plugins/uptime/public/components/common/higher_order/index.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/higher_order/index.ts rename to x-pack/legacy/plugins/uptime/public/components/common/higher_order/index.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/higher_order/responsive_wrapper.tsx b/x-pack/legacy/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/higher_order/responsive_wrapper.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/location_link.tsx b/x-pack/legacy/plugins/uptime/public/components/common/location_link.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/location_link.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/location_link.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/uptime_date_picker.tsx b/x-pack/legacy/plugins/uptime/public/components/common/uptime_date_picker.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/uptime_date_picker.tsx rename to x-pack/legacy/plugins/uptime/public/components/common/uptime_date_picker.tsx index 7d2123af8ff9c..4254004dba4e0 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/uptime_date_picker.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/common/uptime_date_picker.tsx @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiSuperDatePicker } from '@elastic/eui'; import React, { useContext } from 'react'; +import { EuiSuperDatePicker } from '@elastic/eui'; import { useUrlParams } from '../../hooks'; import { CLIENT_DEFAULTS } from '../../../common/constants'; import { UptimeRefreshContext, UptimeSettingsContext } from '../../contexts'; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx b/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx deleted file mode 100644 index cf35dbf4e5206..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/connected/charts/ping_histogram.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { useEffect } from 'react'; -import { connect } from 'react-redux'; -import { AppState } from '../../../state'; -import { - PingHistogramComponent, - PingHistogramComponentProps, -} from '../../functional/charts/ping_histogram'; -import { getPingHistogram } from '../../../state/actions'; -import { selectPingHistogram } from '../../../state/selectors'; -import { withResponsiveWrapper, ResponsiveWrapperProps } from '../../higher_order'; -import { GetPingHistogramParams, HistogramResult } from '../../../../common/runtime_types'; -import { useGetUrlParams } from '../../../hooks'; - -type Props = ResponsiveWrapperProps & - Pick & - DispatchProps & { lastRefresh: number; monitorId?: string; esKuery?: string }; - -const PingHistogramContainer: React.FC = ({ - data, - loadData, - monitorId, - lastRefresh, - height, - loading, - esKuery, -}) => { - const { - absoluteDateRangeStart, - absoluteDateRangeEnd, - dateRangeStart: dateStart, - dateRangeEnd: dateEnd, - statusFilter, - } = useGetUrlParams(); - - useEffect(() => { - loadData({ monitorId, dateStart, dateEnd, statusFilter, filters: esKuery }); - }, [loadData, dateStart, dateEnd, monitorId, statusFilter, lastRefresh, esKuery]); - return ( - - ); -}; - -interface StateProps { - data: HistogramResult | null; - loading: boolean; - lastRefresh: number; - esKuery: string; -} - -interface DispatchProps { - loadData: typeof getPingHistogram; -} - -const mapStateToProps = (state: AppState): StateProps => ({ ...selectPingHistogram(state) }); - -const mapDispatchToProps = (dispatch: any): DispatchProps => ({ - loadData: (params: GetPingHistogramParams) => { - return dispatch(getPingHistogram(params)); - }, -}); - -export const PingHistogram = connect< - StateProps, - DispatchProps, - Pick, - AppState ->( - mapStateToProps, - mapDispatchToProps -)(withResponsiveWrapper(PingHistogramContainer)); diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/charts/snapshot_container.tsx b/x-pack/legacy/plugins/uptime/public/components/connected/charts/snapshot_container.tsx deleted file mode 100644 index 39ead242527f8..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/connected/charts/snapshot_container.tsx +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { useEffect } from 'react'; -import { connect } from 'react-redux'; -import { useGetUrlParams } from '../../../hooks'; -import { AppState } from '../../../state'; -import { getSnapshotCountAction } from '../../../state/actions'; -import { SnapshotComponent } from '../../functional/snapshot'; -import { Snapshot as SnapshotType } from '../../../../common/runtime_types'; -import { SnapShotQueryParams } from '../../../state/api'; - -/** - * Props expected from parent components. - */ -interface OwnProps { - /** - * Height is needed, since by default charts takes height of 100% - */ - height?: string; -} - -/** - * Props given by the Redux store based on action input. - */ -interface StoreProps { - count: SnapshotType; - lastRefresh: number; - loading: boolean; - esKuery: string; -} - -/** - * Contains functions that will dispatch actions used - * for this component's life cycle - */ -interface DispatchProps { - loadSnapshotCount: typeof getSnapshotCountAction; -} - -/** - * Props used to render the Snapshot component. - */ -type Props = OwnProps & StoreProps & DispatchProps; - -export const Container: React.FC = ({ - count, - height, - lastRefresh, - loading, - esKuery, - loadSnapshotCount, -}: Props) => { - const { dateRangeStart, dateRangeEnd, statusFilter } = useGetUrlParams(); - - useEffect(() => { - loadSnapshotCount({ dateRangeStart, dateRangeEnd, filters: esKuery, statusFilter }); - }, [dateRangeStart, dateRangeEnd, esKuery, lastRefresh, loadSnapshotCount, statusFilter]); - return ; -}; - -/** - * Provides state to connected component. - * @param state the root app state - */ -const mapStateToProps = ({ - snapshot: { count, loading }, - ui: { lastRefresh, esKuery }, -}: AppState): StoreProps => ({ - count, - lastRefresh, - loading, - esKuery, -}); - -/** - * Used for fetching snapshot counts. - * @param dispatch redux-provided action dispatcher - */ -const mapDispatchToProps = (dispatch: any) => ({ - loadSnapshotCount: (params: SnapShotQueryParams): DispatchProps => { - return dispatch(getSnapshotCountAction(params)); - }, -}); - -export const Snapshot = connect( - // @ts-ignore connect is expecting null | undefined for some reason - mapStateToProps, - mapDispatchToProps -)(Container); diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/index.ts b/x-pack/legacy/plugins/uptime/public/components/connected/index.ts deleted file mode 100644 index 94e2529a46a00..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/connected/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { AlertMonitorStatus, ToggleAlertFlyoutButton, UptimeAlertsFlyoutWrapper } from './alerts'; -export { PingHistogram } from './charts/ping_histogram'; -export { Snapshot } from './charts/snapshot_container'; -export { KueryBar } from './kuerybar/kuery_bar_container'; -export { FilterGroup } from './filter_group/filter_group_container'; -export { MonitorStatusDetails } from './monitor/status_details_container'; -export { MonitorStatusBar } from './monitor/status_bar_container'; -export { MonitorList } from './monitor/monitor_list'; -export { MonitorListDrawer } from './monitor/list_drawer_container'; -export { MonitorListActionsPopover } from './monitor/drawer_popover_container'; -export { PingList, PingListProps } from './pings'; -export { DurationChart } from './charts/monitor_duration'; -export { EmptyState } from './empty_state/empty_state'; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_bar_container.tsx b/x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_bar_container.tsx deleted file mode 100644 index 3a96aa7c0275b..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_bar_container.tsx +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { useContext, useEffect } from 'react'; -import { connect } from 'react-redux'; -import { Dispatch } from 'redux'; -import { AppState } from '../../../state'; -import { monitorLocationsSelector, monitorStatusSelector } from '../../../state/selectors'; -import { MonitorStatusBarComponent } from '../../functional/monitor_status_details/monitor_status_bar'; -import { getMonitorStatusAction } from '../../../state/actions'; -import { useGetUrlParams } from '../../../hooks'; -import { Ping } from '../../../../common/runtime_types'; -import { MonitorLocations } from '../../../../common/runtime_types/monitor'; -import { UptimeRefreshContext } from '../../../contexts'; - -interface StateProps { - monitorStatus: Ping; - monitorLocations: MonitorLocations; -} - -interface DispatchProps { - loadMonitorStatus: typeof getMonitorStatusAction; -} - -interface OwnProps { - monitorId: string; -} - -type Props = OwnProps & StateProps & DispatchProps; - -const Container: React.FC = ({ - loadMonitorStatus, - monitorId, - monitorStatus, - monitorLocations, -}: Props) => { - const { lastRefresh } = useContext(UptimeRefreshContext); - - const { dateRangeStart: dateStart, dateRangeEnd: dateEnd } = useGetUrlParams(); - - useEffect(() => { - loadMonitorStatus({ dateStart, dateEnd, monitorId }); - }, [monitorId, dateStart, dateEnd, loadMonitorStatus, lastRefresh]); - - return ( - - ); -}; - -const mapStateToProps = (state: AppState, ownProps: OwnProps) => ({ - monitorStatus: monitorStatusSelector(state), - monitorLocations: monitorLocationsSelector(state, ownProps.monitorId), -}); - -const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => ({ - loadMonitorStatus: params => dispatch(getMonitorStatusAction(params)), -}); - -// @ts-ignore TODO: Investigate typescript issues here -export const MonitorStatusBar = connect( - // @ts-ignore TODO: Investigate typescript issues here - mapStateToProps, - mapDispatchToProps -)(Container); diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_details_container.tsx b/x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_details_container.tsx deleted file mode 100644 index 9d2e48830fbfe..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/status_details_container.tsx +++ /dev/null @@ -1,63 +0,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 React, { useContext, useEffect } from 'react'; -import { connect } from 'react-redux'; -import { Dispatch } from 'redux'; -import { useGetUrlParams } from '../../../hooks'; -import { AppState } from '../../../state'; -import { monitorLocationsSelector } from '../../../state/selectors'; -import { getMonitorLocationsAction, MonitorLocationsPayload } from '../../../state/actions/monitor'; -import { MonitorStatusDetailsComponent } from '../../functional/monitor_status_details'; -import { MonitorLocations } from '../../../../common/runtime_types'; -import { UptimeRefreshContext } from '../../../contexts'; - -interface OwnProps { - monitorId: string; -} - -interface StoreProps { - monitorLocations: MonitorLocations; -} - -interface DispatchProps { - loadMonitorLocations: typeof getMonitorLocationsAction; -} - -type Props = OwnProps & StoreProps & DispatchProps; - -export const Container: React.FC = ({ - loadMonitorLocations, - monitorLocations, - monitorId, -}: Props) => { - const { lastRefresh } = useContext(UptimeRefreshContext); - - const { dateRangeStart: dateStart, dateRangeEnd: dateEnd } = useGetUrlParams(); - - useEffect(() => { - loadMonitorLocations({ dateStart, dateEnd, monitorId }); - }, [loadMonitorLocations, monitorId, dateStart, dateEnd, lastRefresh]); - - return ( - - ); -}; -const mapStateToProps = (state: AppState, { monitorId }: OwnProps) => ({ - monitorLocations: monitorLocationsSelector(state, monitorId), -}); - -const mapDispatchToProps = (dispatch: Dispatch) => ({ - loadMonitorLocations: (params: MonitorLocationsPayload) => { - dispatch(getMonitorLocationsAction(params)); - }, -}); - -export const MonitorStatusDetails = connect( - // @ts-ignore TODO: Investigate typescript issues here - mapStateToProps, - mapDispatchToProps -)(Container); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_chart.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_chart.tsx deleted file mode 100644 index ec2081d715554..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/duration_chart.tsx +++ /dev/null @@ -1,155 +0,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 React, { useState } from 'react'; -import { i18n } from '@kbn/i18n'; -import moment from 'moment'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle } from '@elastic/eui'; -import { Axis, Chart, Position, timeFormatter, Settings, SeriesIdentifier } from '@elastic/charts'; -import { getChartDateLabel } from '../../../lib/helper'; -import { LocationDurationLine } from '../../../../common/types'; -import { DurationLineSeriesList } from './duration_line_series_list'; -import { ChartWrapper } from './chart_wrapper'; -import { useUrlParams } from '../../../hooks'; -import { getTickFormat } from './get_tick_format'; -import { ChartEmptyState } from './chart_empty_state'; -import { DurationAnomaliesBar } from './duration_line_bar_list'; -import { MLIntegrationComponent } from '../../monitor_details/ml/ml_integeration'; -import { AnomalyRecords } from '../../../state/actions'; - -interface DurationChartProps { - /** - * Timeseries data that is used to express an average line series - * on the duration chart. One entry per location - */ - locationDurationLines: LocationDurationLine[]; - - /** - * To represent the loading spinner on chart - */ - loading: boolean; - - hasMLJob: boolean; - - anomalies: AnomalyRecords | null; -} - -/** - * This chart is intended to visualize monitor duration performance over time to - * the users in a helpful way. Its x-axis is based on a timeseries, the y-axis is in - * milliseconds. - * @param props The props required for this component to render properly - */ -export const DurationChartComponent = ({ - locationDurationLines, - anomalies, - loading, - hasMLJob, -}: DurationChartProps) => { - const hasLines = locationDurationLines.length > 0; - const [getUrlParams, updateUrlParams] = useUrlParams(); - const { absoluteDateRangeStart: min, absoluteDateRangeEnd: max } = getUrlParams(); - - const [hiddenLegends, setHiddenLegends] = useState([]); - - const onBrushEnd = (minX: number, maxX: number) => { - updateUrlParams({ - dateRangeStart: moment(minX).toISOString(), - dateRangeEnd: moment(maxX).toISOString(), - }); - }; - - const legendToggleVisibility = (legendItem: SeriesIdentifier | null) => { - if (legendItem) { - setHiddenLegends(prevState => { - if (prevState.includes(legendItem.specId)) { - return [...prevState.filter(item => item !== legendItem.specId)]; - } else { - return [...prevState, legendItem.specId]; - } - }); - } - }; - - return ( - <> - - - - -

      - {hasMLJob ? ( - - ) : ( - - )} -

      -
      -
      - - - -
      - - - {hasLines ? ( - - - - getTickFormat(d)} - title={i18n.translate('xpack.uptime.monitorCharts.durationChart.leftAxis.title', { - defaultMessage: 'Duration ms', - })} - /> - - - - ) : ( - up }} - /> - } - title={i18n.translate('xpack.uptime.durationChart.emptyPrompt.title', { - defaultMessage: 'No duration data available', - })} - /> - )} - -
      - - ); -}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/index.ts b/x-pack/legacy/plugins/uptime/public/components/functional/index.ts deleted file mode 100644 index 07809561c31b7..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { - ToggleAlertFlyoutButtonComponent, - UptimeAlertsContextProvider, - UptimeAlertsFlyoutWrapperComponent, -} from './alerts'; -export * from './alerts'; -export { DonutChart } from './charts/donut_chart'; -export { KueryBarComponent } from './kuery_bar/kuery_bar'; -export { MonitorCharts } from './monitor_charts'; -export { MonitorListComponent } from './monitor_list'; -export { OverviewPageParsingErrorCallout } from './overview_page_parsing_error_callout'; -export { PingListComponent } from './ping_list'; -export { PingHistogramComponent } from './charts'; -export { StatusPanel } from './status_panel'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/index.ts b/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/index.ts deleted file mode 100644 index 0cb11587eee48..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { MonitorSSLCertificate } from './monitor_ssl_certificate'; -export { MonitorStatusBarComponent } from './monitor_status_bar'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/search_schema.ts b/x-pack/legacy/plugins/uptime/public/components/functional/search_schema.ts deleted file mode 100644 index bd451a9835288..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/components/functional/search_schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const filterBarSearchSchema = { - strict: true, - fields: { - 'monitor.id': { type: 'string' }, - 'monitor.status': { type: 'string' }, - 'monitor.ip': { type: 'string' }, - 'monitor.host': { type: 'string' }, - 'monitor.scheme': { type: 'string' }, - 'url.port': { type: 'number' }, - }, -}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/monitor_charts.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/__snapshots__/monitor_charts.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/monitor_charts.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/__snapshots__/monitor_charts.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/monitor_charts.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/monitor_charts.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/monitor_charts.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/monitor_charts.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/index.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/index.ts new file mode 100644 index 0000000000000..cb7b27afded02 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './ml'; +export * from './ping_list'; +export * from './location_map'; +export * from './monitor_status_details'; +export * from './ping_histogram'; +export * from './monitor_charts'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/__snapshots__/location_map.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_map.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/__snapshots__/location_map.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_map.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_map.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_map.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_map.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_map.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_missing.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_missing.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_missing.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_missing.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_status_tags.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_status_tags.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx index 2359938dbbc35..7dde38af99fc3 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/__tests__/location_status_tags.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx @@ -8,9 +8,8 @@ import React from 'react'; import moment from 'moment'; import { renderWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers'; import { MonitorLocation } from '../../../../../common/runtime_types/monitor'; -import { LocationStatusTags } from '../'; +import { LocationStatusTags } from '../index'; -// Failing: https://github.com/elastic/kibana/issues/54818 describe('LocationStatusTags component', () => { let monitorLocations: MonitorLocation[]; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/__tests__/__mocks__/mock.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/__mocks__/mock.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/__tests__/__mocks__/mock.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/__mocks__/mock.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/__tests__/map_config.test.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/map_config.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/__tests__/map_config.test.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/map_config.test.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/embedded_map.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/embedded_map.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/low_poly_layer.json b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/low_poly_layer.json similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/low_poly_layer.json rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/low_poly_layer.json diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/map_config.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts similarity index 98% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/map_config.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts index a43edae438252..ddb52e119fa87 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/map_config.ts +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts @@ -5,7 +5,7 @@ */ import lowPolyLayerFeatures from './low_poly_layer.json'; -import { LocationPoint } from './embedded_map.js'; +import { LocationPoint } from './embedded_map'; import { UptimeAppColors } from '../../../../uptime_app'; /** diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/translations.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/translations.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/embeddables/translations.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/translations.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/index.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/index.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/index.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/index.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_map.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_map.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_map.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_map.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_missing.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_missing.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_missing.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_missing.tsx index a20889f6cc653..6ce31e4cc8243 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_missing.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_missing.tsx @@ -16,7 +16,7 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n/react'; -import { LocationLink } from '../monitor_list/monitor_list_drawer'; +import { LocationLink } from '../../common/location_link'; const EuiPopoverRight = styled(EuiFlexItem)` margin-left: auto; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_status_tags.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_status_tags.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/location_map/location_status_tags.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_status_tags.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/license_info.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/license_info.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/license_info.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/license_info.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/confirm_delete.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/confirm_delete.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/confirm_delete.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/confirm_delete.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/license_info.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/license_info.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/license_info.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/license_info.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_flyout.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_flyout.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_integerations.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_integerations.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_integerations.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_integerations.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_job_link.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_job_link.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_job_link.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_job_link.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_manage_job.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_manage_job.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/__tests__/ml_manage_job.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_manage_job.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/confirm_delete.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/confirm_delete.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx diff --git a/x-pack/legacy/plugins/uptime/common/domain_types/index.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/index.ts similarity index 81% rename from x-pack/legacy/plugins/uptime/common/domain_types/index.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/index.ts index 1cf72ca2dac0b..c644c94d13878 100644 --- a/x-pack/legacy/plugins/uptime/common/domain_types/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export * from './monitors'; +export { ManageMLJobComponent } from './manage_ml_job'; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/license_info.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/license_info.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/license_info.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/license_info.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/manage_ml_job.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/manage_ml_job.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx index ec3e8bb2b9f68..46ac24e9455e5 100644 --- a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/manage_ml_job.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx @@ -13,7 +13,7 @@ import { UptimeSettingsContext } from '../../../contexts'; import * as labels from './translations'; import { getMLJobLinkHref } from './ml_job_link'; import { useGetUrlParams } from '../../../hooks'; -import { useMonitorId } from '../../../hooks/use_monitor'; +import { useMonitorId } from '../../../hooks'; interface Props { hasMLJob: boolean; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_flyout.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_flyout.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_flyout_container.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx similarity index 98% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_flyout_container.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx index a13de192cc443..c3e8579ca4837 100644 --- a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_flyout_container.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx @@ -25,7 +25,7 @@ import { ML_JOB_ID } from '../../../../common/constants'; import { UptimeRefreshContext, UptimeSettingsContext } from '../../../contexts'; import { useGetUrlParams } from '../../../hooks'; import { getDynamicSettings } from '../../../state/actions/dynamic_settings'; -import { useMonitorId } from '../../../hooks/use_monitor'; +import { useMonitorId } from '../../../hooks'; interface Props { onClose: () => void; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_integeration.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx similarity index 98% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_integeration.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx index e053ca733cb8c..4963a901f0ecc 100644 --- a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_integeration.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx @@ -21,7 +21,7 @@ import * as labels from './translations'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { ManageMLJobComponent } from './manage_ml_job'; import { JobStat } from '../../../../../../../plugins/ml/common/types/data_recognizer'; -import { useMonitorId } from '../../../hooks/use_monitor'; +import { useMonitorId } from '../../../hooks'; export const MLIntegrationComponent = () => { const [isMlFlyoutOpen, setIsMlFlyoutOpen] = useState(false); diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_job_link.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/ml_job_link.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/translations.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/translations.tsx similarity index 95% rename from x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/translations.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ml/translations.tsx index 32374674771e8..bcc3fca770652 100644 --- a/x-pack/legacy/plugins/uptime/public/components/monitor_details/ml/translations.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ml/translations.tsx @@ -96,13 +96,6 @@ export const MANAGE_ANOMALY_DETECTION = i18n.translate( } ); -export const VIEW_EXISTING_JOB = i18n.translate( - 'xpack.uptime.ml.enableAnomalyDetectionPanel.callout.jobExistsDescription.viewJobLinkText', - { - defaultMessage: 'View existing job', - } -); - export const ML_MANAGEMENT_PAGE = i18n.translate( 'xpack.uptime.ml.enableAnomalyDetectionPanel.manageMLJobDescription.mlJobsPageLinkText', { diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_charts.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_charts.tsx similarity index 68% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_charts.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_charts.tsx index c5edd0fd85977..f9cc1aa52b902 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_charts.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_charts.tsx @@ -6,7 +6,8 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { PingHistogram, DurationChart } from '../connected'; +import { PingHistogram } from './ping_histogram/ping_histogram_container'; +import { MonitorDuration } from './monitor_duration/monitor_duration_container'; interface MonitorChartsProps { monitorId: string; @@ -16,10 +17,10 @@ export const MonitorCharts = ({ monitorId }: MonitorChartsProps) => { return ( - + - + ); diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/index.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/index.ts new file mode 100644 index 0000000000000..aa3230a3f9bc0 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/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 { MonitorDuration } from './monitor_duration_container'; +export { MonitorDurationComponent } from './monitor_duration'; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx new file mode 100644 index 0000000000000..af1c8dbdc49e3 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle } from '@elastic/eui'; +import { LocationDurationLine } from '../../../../common/types'; +import { MLIntegrationComponent } from '../ml/ml_integeration'; +import { AnomalyRecords } from '../../../state/actions'; +import { DurationChartComponent } from '../../common/charts'; + +interface DurationChartProps { + loading: boolean; + hasMLJob: boolean; + anomalies: AnomalyRecords | null; + locationDurationLines: LocationDurationLine[]; +} + +/** + * This chart is intended to visualize monitor duration performance over time to + * the users in a helpful way. Its x-axis is based on a timeseries, the y-axis is in + * milliseconds. + * @param props The props required for this component to render properly + */ +export const MonitorDurationComponent = ({ + locationDurationLines, + anomalies, + loading, + hasMLJob, +}: DurationChartProps) => { + return ( + + + + +

      + {hasMLJob ? ( + + ) : ( + + )} +

      +
      +
      + + + +
      + +
      + ); +}; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/charts/monitor_duration.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx similarity index 91% rename from x-pack/legacy/plugins/uptime/public/components/connected/charts/monitor_duration.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx index 40480905350af..7e39b977f1271 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/charts/monitor_duration.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx @@ -12,7 +12,6 @@ import { getMLCapabilitiesAction, getMonitorDurationAction, } from '../../../state/actions'; -import { DurationChartComponent } from '../../functional/charts'; import { anomaliesSelector, hasMLFeatureAvailable, @@ -22,12 +21,10 @@ import { import { UptimeRefreshContext } from '../../../contexts'; import { getMLJobId } from '../../../state/api/ml_anomaly'; import { JobStat } from '../../../../../../../plugins/ml/common/types/data_recognizer'; +import { MonitorDurationComponent } from './monitor_duration'; +import { MonitorIdParam } from '../../../../common/types'; -interface Props { - monitorId: string; -} - -export const DurationChart: React.FC = ({ monitorId }: Props) => { +export const MonitorDuration: React.FC = ({ monitorId }) => { const { dateRangeStart, dateRangeEnd, @@ -75,7 +72,7 @@ export const DurationChart: React.FC = ({ monitorId }: Props) => { }, [dispatch]); return ( - { let monitorLocations: MonitorLocation[]; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/index.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/index.ts similarity index 64% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/index.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/index.ts index 385788cc825a0..e95f14472e9e8 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/index.ts @@ -5,5 +5,8 @@ */ export { MonitorStatusBarComponent } from './monitor_status_bar'; -export { MonitorStatusDetailsComponent } from './monitor_status_details'; +export { MonitorStatusDetailsComponent } from './status_details'; export { StatusByLocations } from './monitor_status_bar/status_by_location'; + +export { MonitorStatusDetails } from './status_details_container'; +export { MonitorStatusBar } from './monitor_status_bar/status_bar_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts new file mode 100644 index 0000000000000..3c861412a39e9 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/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 { MonitorSSLCertificate } from './ssl_certificate'; +export { MonitorStatusBarComponent } from './status_bar'; +export { MonitorStatusBar } from './status_bar_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/monitor_ssl_certificate.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/monitor_ssl_certificate.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/monitor_status_bar.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx similarity index 95% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/monitor_status_bar.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx index ac3cedc517995..36159dc29eccd 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/monitor_status_bar.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx @@ -14,7 +14,7 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; -import { MonitorSSLCertificate } from './monitor_ssl_certificate'; +import { MonitorSSLCertificate } from './ssl_certificate'; import * as labels from './translations'; import { StatusByLocations } from './status_by_location'; import { Ping } from '../../../../../common/runtime_types'; @@ -22,7 +22,7 @@ import { MonitorLocations } from '../../../../../common/runtime_types'; interface MonitorStatusBarProps { monitorId: string; - monitorStatus: Ping; + monitorStatus: Ping | null; monitorLocations: MonitorLocations; } diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx new file mode 100644 index 0000000000000..9562295437515 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useContext, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { monitorLocationsSelector, monitorStatusSelector } from '../../../../state/selectors'; +import { MonitorStatusBarComponent } from './index'; +import { getMonitorStatusAction } from '../../../../state/actions'; +import { useGetUrlParams } from '../../../../hooks'; +import { UptimeRefreshContext } from '../../../../contexts'; +import { MonitorIdParam } from '../../../../../common/types'; +import { AppState } from '../../../../state'; + +export const MonitorStatusBar: React.FC = ({ monitorId }) => { + const { lastRefresh } = useContext(UptimeRefreshContext); + + const { dateRangeStart: dateStart, dateRangeEnd: dateEnd } = useGetUrlParams(); + + const dispatch = useDispatch(); + + const monitorStatus = useSelector(monitorStatusSelector); + const monitorLocations = useSelector((state: AppState) => + monitorLocationsSelector(state, monitorId) + ); + + useEffect(() => { + dispatch(getMonitorStatusAction({ dateStart, dateEnd, monitorId })); + }, [monitorId, dateStart, dateEnd, lastRefresh, dispatch]); + + return ( + + ); +}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/status_by_location.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_by_location.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/status_by_location.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_by_location.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/translations.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.ts similarity index 99% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/translations.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.ts index 1c2844f4f6ccf..f60a1ceeaafb8 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_bar/translations.ts +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.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 { i18n } from '@kbn/i18n'; export const healthStatusMessageAriaLabel = i18n.translate( diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_details.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_details.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx index 7dea73da7bba0..ebd16b05ecb4a 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/monitor_status_details.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx @@ -10,7 +10,7 @@ import styled from 'styled-components'; import { LocationMap } from '../location_map'; import { UptimeRefreshContext } from '../../../contexts'; import { MonitorLocations } from '../../../../common/runtime_types'; -import { MonitorStatusBar } from '../../connected'; +import { MonitorStatusBar } from './monitor_status_bar'; interface MonitorStatusDetailsProps { monitorId: string; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx new file mode 100644 index 0000000000000..251f3562f9d1a --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx @@ -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 React, { useContext, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useGetUrlParams } from '../../../hooks'; +import { monitorLocationsSelector } from '../../../state/selectors'; +import { getMonitorLocationsAction } from '../../../state/actions/monitor'; +import { MonitorStatusDetailsComponent } from './index'; +import { UptimeRefreshContext } from '../../../contexts'; +import { AppState } from '../../../state'; +import { MonitorIdParam } from '../../../../common/types'; + +export const MonitorStatusDetails: React.FC = ({ monitorId }) => { + const { lastRefresh } = useContext(UptimeRefreshContext); + + const { dateRangeStart: dateStart, dateRangeEnd: dateEnd } = useGetUrlParams(); + + const dispatch = useDispatch(); + const monitorLocations = useSelector((state: AppState) => + monitorLocationsSelector(state, monitorId) + ); + + useEffect(() => { + dispatch(getMonitorLocationsAction({ dateStart, dateEnd, monitorId })); + }, [monitorId, dateStart, dateEnd, lastRefresh, dispatch]); + + return ( + + ); +}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/translations.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/translations.ts similarity index 99% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/translations.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/translations.ts index 1c2844f4f6ccf..f60a1ceeaafb8 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_status_details/translations.ts +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/translations.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 { i18n } from '@kbn/i18n'; export const healthStatusMessageAriaLabel = i18n.translate( diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/pings/index.ts b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/index.ts similarity index 80% rename from x-pack/legacy/plugins/uptime/public/components/connected/pings/index.ts rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/index.ts index 95ced104e5188..c980b41167d0c 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/pings/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { PingList, PingListProps } from './ping_list'; +export { PingHistogram } from './ping_histogram_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx new file mode 100644 index 0000000000000..c0e17966f5b9f --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { PingHistogramComponent } from '../../common/charts'; +import { getPingHistogram } from '../../../state/actions'; +import { selectPingHistogram } from '../../../state/selectors'; +import { useGetUrlParams } from '../../../hooks'; +import { useMonitorId } from '../../../hooks'; +import { ResponsiveWrapperProps, withResponsiveWrapper } from '../../common/higher_order'; + +interface Props { + height: string; +} + +const Container: React.FC = ({ height }) => { + const { + statusFilter, + absoluteDateRangeStart, + absoluteDateRangeEnd, + dateRangeStart: dateStart, + dateRangeEnd: dateEnd, + } = useGetUrlParams(); + + const dispatch = useDispatch(); + const monitorId = useMonitorId(); + + const { loading, data, esKuery, lastRefresh } = useSelector(selectPingHistogram); + + useEffect(() => { + dispatch(getPingHistogram({ monitorId, dateStart, dateEnd, statusFilter, filters: esKuery })); + }, [dateStart, dateEnd, monitorId, statusFilter, lastRefresh, esKuery, dispatch]); + return ( + + ); +}; + +export const PingHistogram = withResponsiveWrapper(Container); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/doc_link_body.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/doc_link_body.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/doc_link_body.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/doc_link_body.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/expanded_row.test.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/expanded_row.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/expanded_row.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/expanded_row.test.tsx 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/monitor/ping_list/__tests__/ping_list.test.tsx similarity index 99% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/__tests__/ping_list.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/ping_list.test.tsx index ec256a886aa16..cb8413ba08a81 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/monitor/ping_list/__tests__/ping_list.test.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; import { PingListComponent, toggleDetails } from '../ping_list'; -import { ExpandedRowMap } from '../../monitor_list/types'; import { Ping, PingsResponse } from '../../../../../common/runtime_types'; +import { ExpandedRowMap } from '../../../overview/monitor_list/types'; describe('PingList component', () => { let response: PingsResponse; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/doc_link_body.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/doc_link_body.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/expanded_row.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/expanded_row.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/index.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/index.tsx similarity index 85% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/index.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/index.tsx index 808f3f90ef015..7fc19bbc9622b 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/index.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/index.tsx @@ -5,3 +5,4 @@ */ export { PingListComponent } from './ping_list'; +export { PingList } from './ping_list_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/location_name.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/location_name.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/location_name.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/location_name.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx similarity index 98% rename from x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx index 934dfd961f9e0..5dfc1c0647430 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/ping_list/ping_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx @@ -26,9 +26,9 @@ import styled from 'styled-components'; import { Ping, GetPingsParams, DateRange } from '../../../../common/runtime_types'; import { convertMicrosecondsToMilliseconds as microsToMillis } from '../../../lib/helper'; import { LocationName } from './location_name'; -import { Pagination } from './../monitor_list'; +import { Pagination } from '../../overview/monitor_list'; import { PingListExpandedRowComponent } from './expanded_row'; -import { PingListProps } from '../../connected/pings'; +import { PingListProps } from './ping_list_container'; export const AllLocationOption = { 'data-test-subj': 'xpack.uptime.pingList.locationOptions.all', @@ -139,7 +139,7 @@ export const PingListComponent = (props: Props) => { })) ); - const hasStatus: boolean = pings.reduce( + const hasStatus = pings.reduce( (hasHttpStatus: boolean, currentPing) => hasHttpStatus || !!currentPing.http?.response?.status_code, false diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/pings/ping_list.tsx b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx similarity index 96% rename from x-pack/legacy/plugins/uptime/public/components/connected/pings/ping_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx index 5b32a623495f1..3c3caab365e3a 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/pings/ping_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx @@ -10,7 +10,7 @@ import { selectPingList } from '../../../state/selectors'; import { getPings } from '../../../state/actions'; import { GetPingsParams } from '../../../../common/runtime_types'; import { UptimeSettingsContext } from '../../../contexts'; -import { PingListComponent } from '../../functional'; +import { PingListComponent } from './index'; export interface PingListProps { monitorId: string; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/overview_page_parsing_error_callout.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/overview_page_parsing_error_callout.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/snapshot.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/snapshot.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/snapshot_heading.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot_heading.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/__snapshots__/snapshot_heading.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot_heading.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/overview_page_parsing_error_callout.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx similarity index 76% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/overview_page_parsing_error_callout.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx index fbe55dfedc2fc..01204c33b79d5 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/overview_page_parsing_error_callout.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx @@ -6,13 +6,13 @@ import React from 'react'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; -import { OverviewPageParsingErrorCallout } from '../overview_page_parsing_error_callout'; +import { ParsingErrorCallout } from '../parsing_error_callout'; describe('OverviewPageParsingErrorCallout', () => { it('renders without errors when a valid error is provided', () => { expect( shallowWithIntl( - ) @@ -21,6 +21,6 @@ describe('OverviewPageParsingErrorCallout', () => { it('renders without errors when an error with no message is provided', () => { const error: any = {}; - expect(shallowWithIntl()).toMatchSnapshot(); + expect(shallowWithIntl()).toMatchSnapshot(); }); }); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/snapshot.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx similarity index 92% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/snapshot.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx index 214b0394369f7..cfcab673dcb35 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/snapshot.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; import { Snapshot } from '../../../../common/runtime_types'; -import { SnapshotComponent } from '../snapshot'; +import { SnapshotComponent } from '../snapshot/snapshot'; describe('Snapshot component', () => { const snapshot: Snapshot = { diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/snapshot_heading.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx similarity index 93% rename from x-pack/legacy/plugins/uptime/public/components/functional/__tests__/snapshot_heading.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx index 70d082b26d653..805c116ef538a 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/__tests__/snapshot_heading.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx @@ -6,7 +6,7 @@ import { shallowWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; -import { SnapshotHeading } from '../snapshot_heading'; +import { SnapshotHeading } from '../snapshot/snapshot_heading'; describe('SnapshotHeading', () => { it('renders custom heading for no down monitors', () => { diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/__tests__/alert_monitor_status.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx similarity index 98% rename from x-pack/legacy/plugins/uptime/public/components/functional/alerts/__tests__/alert_monitor_status.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx index af8d17d1fc242..8f33b6f652b9d 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/__tests__/alert_monitor_status.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx @@ -14,8 +14,8 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; describe('alert monitor status component', () => { describe('handleAlertFieldNumberChange', () => { - let mockSetIsInvalid: jest.Mock; - let mockSetFieldValue: jest.Mock; + let mockSetIsInvalid: jest.Mock; + let mockSetFieldValue: jest.Mock; beforeEach(() => { mockSetIsInvalid = jest.fn(); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/alert_monitor_status.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx similarity index 99% rename from x-pack/legacy/plugins/uptime/public/components/functional/alerts/alert_monitor_status.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx index b86e85f35b17d..83892bf23dced 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/alert_monitor_status.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx @@ -19,7 +19,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { DataPublicPluginSetup } from 'src/plugins/data/public'; -import { KueryBar } from '../../connected/kuerybar/kuery_bar_container'; +import { KueryBar } from '..'; interface AlertFieldNumberProps { 'aria-label': string; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/alert_monitor_status.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx similarity index 86% rename from x-pack/legacy/plugins/uptime/public/components/connected/alerts/alert_monitor_status.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx index 1529ab6db8875..9dd27db0be607 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/alert_monitor_status.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { useSelector } from 'react-redux'; import { DataPublicPluginSetup } from 'src/plugins/data/public'; -import { selectMonitorStatusAlert } from '../../../state/selectors'; -import { AlertMonitorStatusComponent } from '../../functional/alerts/alert_monitor_status'; +import { selectMonitorStatusAlert } from '../../../../state/selectors'; +import { AlertMonitorStatusComponent } from '../index'; interface Props { autocomplete: DataPublicPluginSetup['autocomplete']; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/connected/alerts/index.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/toggle_alert_flyout_button.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx similarity index 80% rename from x-pack/legacy/plugins/uptime/public/components/connected/alerts/toggle_alert_flyout_button.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx index 43b0be45365a1..45ba72d76fba6 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/toggle_alert_flyout_button.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { useDispatch } from 'react-redux'; -import { ToggleAlertFlyoutButtonComponent } from '../../functional'; -import { setAlertFlyoutVisible } from '../../../state/actions'; +import { setAlertFlyoutVisible } from '../../../../state/actions'; +import { ToggleAlertFlyoutButtonComponent } from '../index'; export const ToggleAlertFlyoutButton = () => { const dispatch = useDispatch(); diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/uptime_alerts_flyout_wrapper.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx similarity index 83% rename from x-pack/legacy/plugins/uptime/public/components/connected/alerts/uptime_alerts_flyout_wrapper.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx index a49468ad3dd06..7bfd44a762455 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/alerts/uptime_alerts_flyout_wrapper.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx @@ -6,9 +6,9 @@ import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { UptimeAlertsFlyoutWrapperComponent } from '../../functional'; -import { setAlertFlyoutVisible } from '../../../state/actions'; -import { selectAlertFlyoutVisibility } from '../../../state/selectors'; +import { setAlertFlyoutVisible } from '../../../../state/actions'; +import { selectAlertFlyoutVisibility } from '../../../../state/selectors'; +import { UptimeAlertsFlyoutWrapperComponent } from '../index'; interface Props { alertTypeId?: string; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/index.ts similarity index 93% rename from x-pack/legacy/plugins/uptime/public/components/functional/alerts/index.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/index.ts index 275333b60c5ee..5ca0f4c3fe8a7 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/index.ts @@ -8,3 +8,4 @@ export { AlertMonitorStatusComponent } from './alert_monitor_status'; export { ToggleAlertFlyoutButtonComponent } from './toggle_alert_flyout_button'; export { UptimeAlertsContextProvider } from './uptime_alerts_context_provider'; export { UptimeAlertsFlyoutWrapperComponent } from './uptime_alerts_flyout_wrapper'; +export * from './alerts_containers'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/toggle_alert_flyout_button.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/alerts/toggle_alert_flyout_button.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/uptime_alerts_context_provider.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/alerts/uptime_alerts_context_provider.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/alerts/uptime_alerts_flyout_wrapper.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/alerts/uptime_alerts_flyout_wrapper.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_or_index_missing.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/data_or_index_missing.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/data_or_index_missing.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/data_or_index_missing.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/empty_state.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/empty_state.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/__tests__/empty_state.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/empty_state.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_or_index_missing.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/data_or_index_missing.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx similarity index 95% rename from x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx index b0868af70480a..9a62cb9cdaeee 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/empty_state/empty_state.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx @@ -8,7 +8,7 @@ import React, { useContext, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { indexStatusAction } from '../../../state/actions'; import { indexStatusSelector, selectDynamicSettings } from '../../../state/selectors'; -import { EmptyStateComponent } from '../../functional/empty_state/empty_state'; +import { EmptyStateComponent } from './index'; import { UptimeRefreshContext } from '../../../contexts'; import { getDynamicSettings } from '../../../state/actions/dynamic_settings'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state_error.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state_error.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state_loading.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/empty_state/empty_state_loading.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/index.ts new file mode 100644 index 0000000000000..9f2a668f4c3a5 --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/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 { EmptyStateComponent } from './empty_state'; +export { EmptyState } from './empty_state_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/filter_popover.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_popover.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/filter_popover.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_popover.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/filter_status_button.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx similarity index 93% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/filter_status_button.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx index 1813229a97d1b..2ad4d971cf3b0 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/filter_status_button.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { FilterStatusButton, FilterStatusButtonProps } from '../filter_status_button'; -import { shallowWithRouter } from '../../../../lib/'; +import { shallowWithRouter } from '../../../../lib'; describe('FilterStatusButton', () => { let props: FilterStatusButtonProps; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/parse_filter_map.test.ts b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/parse_filter_map.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/parse_filter_map.test.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/parse_filter_map.test.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/toggle_selected_item.test.ts b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/toggle_selected_item.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/__tests__/toggle_selected_item.test.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/toggle_selected_item.test.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/filter_group.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/filter_group.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/filter_group/filter_group_container.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx similarity index 94% rename from x-pack/legacy/plugins/uptime/public/components/connected/filter_group/filter_group_container.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx index 569c6bb883cbd..3612604fdf116 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/filter_group/filter_group_container.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx @@ -7,10 +7,10 @@ import React, { useContext, useEffect } from 'react'; import { connect } from 'react-redux'; import { useUrlParams } from '../../../hooks'; -import { parseFiltersMap } from '../../functional/filter_group/parse_filter_map'; +import { parseFiltersMap } from './parse_filter_map'; import { AppState } from '../../../state'; import { fetchOverviewFilters, GetOverviewFiltersPayload } from '../../../state/actions'; -import { FilterGroupComponent } from '../../functional/filter_group'; +import { FilterGroupComponent } from './index'; import { OverviewFilters } from '../../../../common/runtime_types/overview_filters'; import { UptimeRefreshContext } from '../../../contexts'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/filter_popover.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/filter_popover.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/filter_status_button.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_status_button.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/filter_status_button.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_status_button.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/index.ts similarity index 84% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/index.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/index.ts index 2aae026144d8f..933fddf1cde27 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/index.ts @@ -5,3 +5,4 @@ */ export { FilterGroupComponent } from './filter_group'; +export { FilterGroup } from './filter_group_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/parse_filter_map.ts b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/parse_filter_map.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/parse_filter_map.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/parse_filter_map.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/toggle_selected_item.ts b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/toggle_selected_item.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/toggle_selected_item.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/toggle_selected_item.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/filter_group/uptime_filter_button.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/uptime_filter_button.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/filter_group/uptime_filter_button.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/filter_group/uptime_filter_button.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/index.ts new file mode 100644 index 0000000000000..ac293e9233c8c --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/overview/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. + */ + +export * from './monitor_list'; +export * from './empty_state'; +export * from './filter_group'; +export * from './alerts'; +export * from './snapshot'; +export * from './kuery_bar'; + +export { ParsingErrorCallout } from './parsing_error_callout'; diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/index.ts new file mode 100644 index 0000000000000..60801a0ab705a --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/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 { KueryBarComponent } from './kuery_bar'; +export { KueryBar } from './kuery_bar_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/kuery_bar.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/kuery_bar.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/kuerybar/kuery_bar_container.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx similarity index 90% rename from x-pack/legacy/plugins/uptime/public/components/connected/kuerybar/kuery_bar_container.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx index 132ae57b5154f..5e1e184b2d6e6 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/kuerybar/kuery_bar_container.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx @@ -8,7 +8,7 @@ import { connect } from 'react-redux'; import { AppState } from '../../../state'; import { selectIndexPattern } from '../../../state/selectors'; import { getIndexPattern } from '../../../state/actions'; -import { KueryBarComponent } from '../../functional/kuery_bar/kuery_bar'; +import { KueryBarComponent } from './kuery_bar'; const mapStateToProps = (state: AppState) => ({ ...selectIndexPattern(state) }); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/click_outside.js b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/click_outside.js rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/index.d.ts b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts similarity index 95% rename from x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/index.d.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts index c9f43b3a620bd..defde6203a8c5 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/index.d.ts +++ b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Component } from 'react'; +import React from 'react'; interface TypeaheadProps { onChange: (inputValue: string, selectionStart: number) => void; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/index.js b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/index.js rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/suggestion.js b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/suggestion.js rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/suggestions.js b/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/typeahead/suggestions.js rename to x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_list.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_list.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_list_page_size_select.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_page_size_select.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_list_page_size_select.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_page_size_select.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_list_status_column.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_status_column.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_list_status_column.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_status_column.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_page_link.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_page_link.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/monitor_page_link.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_page_link.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/parse_timestamp.test.ts b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/parse_timestamp.test.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/__tests__/parse_timestamp.test.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/parse_timestamp.test.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/index.ts similarity index 69% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/index.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/index.ts index 2dc43050f9515..45e8822a317a4 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/index.ts @@ -7,3 +7,5 @@ export { MonitorListComponent } from './monitor_list'; export { Criteria, Pagination } from './types'; export { LocationLink } from './monitor_list_drawer'; +export { MonitorListDrawer } from './monitor_list_drawer/list_drawer_container'; +export { ActionsPopover } from './monitor_list_drawer/actions_popover/actions_popover_container'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx index 6705101ccd572..18e2e2437e147 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx @@ -22,13 +22,13 @@ import { HistogramPoint, FetchMonitorStatesQueryArgs } from '../../../../common/ import { MonitorSummary } from '../../../../common/runtime_types'; import { MonitorListStatusColumn } from './monitor_list_status_column'; import { ExpandedRowMap } from './types'; -import { MonitorBarSeries } from '../charts'; +import { MonitorBarSeries } from '../../common/charts'; import { MonitorPageLink } from './monitor_page_link'; import { OverviewPageLink } from './overview_page_link'; import * as labels from './translations'; -import { MonitorListDrawer } from '../../connected'; import { MonitorListPageSizeSelect } from './monitor_list_page_size_select'; -import { MonitorListProps } from '../../connected/monitor/monitor_list'; +import { MonitorListDrawer } from './monitor_list_drawer/list_drawer_container'; +import { MonitorListProps } from './monitor_list_container'; import { MonitorList } from '../../../state/reducers/monitor_list'; import { useUrlParams } from '../../../hooks'; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/monitor_list.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx similarity index 93% rename from x-pack/legacy/plugins/uptime/public/components/connected/monitor/monitor_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx index c9457664566b7..5bfe6ff0c5b4f 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/monitor_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx @@ -9,7 +9,7 @@ import { useSelector, useDispatch } from 'react-redux'; import { getMonitorList } from '../../../state/actions'; import { FetchMonitorStatesQueryArgs } from '../../../../common/runtime_types'; import { monitorListSelector } from '../../../state/selectors'; -import { MonitorListComponent } from '../../functional/monitor_list'; +import { MonitorListComponent } from './index'; export interface MonitorListProps { filters?: string; @@ -18,13 +18,16 @@ export interface MonitorListProps { export const MonitorList: React.FC = props => { const dispatch = useDispatch(); + const dispatchCallback = useCallback( (params: FetchMonitorStatesQueryArgs) => { dispatch(getMonitorList(params)); }, [dispatch] ); + const monitorListState = useSelector(monitorListSelector); + return ( ); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/data.json b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/data.json similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/data.json rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/data.json diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx similarity index 94% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx index 48fa2c9766681..25cf400bcd0fd 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { MonitorSummary } from '../../../../../../common/runtime_types'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; -import { IntegrationGroup } from '../integration_group'; +import { IntegrationGroup } from '../actions_popover/integration_group'; describe('IntegrationGroup', () => { let summary: MonitorSummary; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx similarity index 93% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx index ba313f255f13d..8ee83bc38957b 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { IntegrationLink } from '../integration_link'; +import { IntegrationLink } from '../actions_popover/integration_link'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; describe('IntegrationLink component', () => { diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_list_actions_popover.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx similarity index 89% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_list_actions_popover.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx index c57ecbaa4d3ed..e86e6b309214f 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_list_actions_popover.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx @@ -9,20 +9,20 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { EuiPopover, EuiButton } from '@elastic/eui'; import { IntegrationGroup } from './integration_group'; -import { MonitorSummary } from '../../../../../common/runtime_types'; -import { toggleIntegrationsPopover, PopoverState } from '../../../../state/actions'; +import { MonitorSummary } from '../../../../../../common/runtime_types'; +import { toggleIntegrationsPopover, PopoverState } from '../../../../../state/actions'; -interface MonitorListActionsPopoverProps { +interface ActionsPopoverProps { summary: MonitorSummary; popoverState: PopoverState | null; togglePopoverIsVisible: typeof toggleIntegrationsPopover; } -export const MonitorListActionsPopoverComponent = ({ +export const ActionsPopoverComponent = ({ summary, popoverState, togglePopoverIsVisible, -}: MonitorListActionsPopoverProps) => { +}: ActionsPopoverProps) => { const popoverId = `${summary.monitor_id}_popover`; const monitorUrl: string | undefined = get(summary, 'state.url.full', undefined); diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/drawer_popover_container.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx similarity index 63% rename from x-pack/legacy/plugins/uptime/public/components/connected/monitor/drawer_popover_container.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx index be29e12f716a9..b1c25ddd7a338 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/drawer_popover_container.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx @@ -5,10 +5,10 @@ */ import { connect } from 'react-redux'; -import { AppState } from '../../../state'; -import { isIntegrationsPopupOpen } from '../../../state/selectors'; -import { PopoverState, toggleIntegrationsPopover } from '../../../state/actions'; -import { MonitorListActionsPopoverComponent } from '../../functional/monitor_list/monitor_list_drawer'; +import { AppState } from '../../../../../state'; +import { isIntegrationsPopupOpen } from '../../../../../state/selectors'; +import { PopoverState, toggleIntegrationsPopover } from '../../../../../state/actions'; +import { ActionsPopoverComponent } from '../index'; const mapStateToProps = (state: AppState) => ({ popoverState: isIntegrationsPopupOpen(state), @@ -20,7 +20,4 @@ const mapDispatchToProps = (dispatch: any) => ({ }, }); -export const MonitorListActionsPopover = connect( - mapStateToProps, - mapDispatchToProps -)(MonitorListActionsPopoverComponent); +export const ActionsPopover = connect(mapStateToProps, mapDispatchToProps)(ActionsPopoverComponent); diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/integration_group.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx similarity index 98% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/integration_group.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx index cc06b9a2306c7..bbcba7238748d 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/integration_group.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx @@ -18,9 +18,9 @@ import { getLoggingContainerHref, getLoggingIpHref, getLoggingKubernetesHref, -} from '../../../../lib/helper'; -import { MonitorSummary } from '../../../../../common/runtime_types'; -import { UptimeSettingsContext } from '../../../../contexts'; +} from '../../../../../lib/helper'; +import { MonitorSummary } from '../../../../../../common/runtime_types'; +import { UptimeSettingsContext } from '../../../../../contexts'; interface IntegrationGroupProps { summary: MonitorSummary; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/integration_link.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/integration_link.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/index.ts b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts similarity index 63% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/index.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts index 2933a71c2240b..32c722b806f2b 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/index.ts +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts @@ -4,5 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { LocationLink } from './location_link'; -export { MonitorListActionsPopoverComponent } from './monitor_list_actions_popover'; +export { LocationLink } from '../../../common/location_link'; +export { ActionsPopoverComponent } from './actions_popover/actions_popover'; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/list_drawer_container.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx similarity index 72% rename from x-pack/legacy/plugins/uptime/public/components/connected/monitor/list_drawer_container.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx index 37a96ba0396aa..bec32ace27f2b 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/monitor/list_drawer_container.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx @@ -6,13 +6,13 @@ import React, { useEffect } from 'react'; import { connect } from 'react-redux'; -import { AppState } from '../../../state'; -import { monitorDetailsSelector } from '../../../state/selectors'; -import { MonitorDetailsActionPayload } from '../../../state/actions/types'; -import { getMonitorDetailsAction } from '../../../state/actions/monitor'; -import { MonitorListDrawerComponent } from '../../functional/monitor_list/monitor_list_drawer/monitor_list_drawer'; -import { useGetUrlParams } from '../../../hooks'; -import { MonitorDetails, MonitorSummary } from '../../../../common/runtime_types'; +import { AppState } from '../../../../state'; +import { monitorDetailsSelector } from '../../../../state/selectors'; +import { MonitorDetailsActionPayload } from '../../../../state/actions/types'; +import { getMonitorDetailsAction } from '../../../../state/actions/monitor'; +import { MonitorListDrawerComponent } from './monitor_list_drawer'; +import { useGetUrlParams } from '../../../../hooks'; +import { MonitorDetails, MonitorSummary } from '../../../../../common/runtime_types'; interface ContainerProps { summary: MonitorSummary; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx similarity index 93% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx index 6dc9ebbef1287..8e97ce4d692d7 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx @@ -10,7 +10,7 @@ import { EuiLink, EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText } from import { MostRecentError } from './most_recent_error'; import { MonitorStatusList } from './monitor_status_list'; import { MonitorDetails, MonitorSummary } from '../../../../../common/runtime_types'; -import { MonitorListActionsPopover } from '../../../connected'; +import { ActionsPopover } from './actions_popover/actions_popover_container'; const ContainerDiv = styled.div` padding: 10px; @@ -48,7 +48,7 @@ export function MonitorListDrawerComponent({ summary, monitorDetails }: MonitorL
      - +
      diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_status_list.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx similarity index 97% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_status_list.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx index 8a46167dcd3bc..cd1a5a95b8adb 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_status_list.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { get, capitalize } from 'lodash'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { LocationLink } from './location_link'; +import { LocationLink } from '../../../common/location_link'; import { MonitorStatusRow } from './monitor_status_row'; import { Check } from '../../../../../common/runtime_types'; import { STATUS, UNNAMED_LOCATION } from '../../../../../common/constants'; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_status_row.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/monitor_status_row.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/most_recent_error.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_drawer/most_recent_error.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_page_size_select.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_page_size_select.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_status_column.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_list_status_column.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_page_link.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_page_link.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/monitor_page_link.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_page_link.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/overview_page_link.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/overview_page_link.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/parse_timestamp.ts b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/parse_timestamp.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/translations.ts b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/translations.ts similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/translations.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/translations.ts diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/types.ts b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/types.ts similarity index 83% rename from x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/types.ts rename to x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/types.ts index a25603d3603d9..6a6cee4a7d96d 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/monitor_list/types.ts +++ b/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/types.ts @@ -4,13 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export interface CondensedCheck { - childStatuses: CondensedCheckStatus[]; - location: string | null; - status: string; - timestamp: string; -} - export interface CondensedCheckStatus { ip?: string | null; status: string; diff --git a/x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/overview_container.tsx similarity index 74% rename from x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/overview_container.tsx index 79aaa071507e1..d64e489c48076 100644 --- a/x-pack/legacy/plugins/uptime/public/components/connected/pages/overview_container.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/overview_container.tsx @@ -5,10 +5,10 @@ */ import { connect } from 'react-redux'; -import { OverviewPageComponent } from '../../../pages/overview'; -import { selectIndexPattern } from '../../../state/selectors'; -import { AppState } from '../../../state'; -import { setEsKueryString } from '../../../state/actions'; +import { OverviewPageComponent } from '../../pages/overview'; +import { selectIndexPattern } from '../../state/selectors'; +import { AppState } from '../../state'; +import { setEsKueryString } from '../../state/actions'; interface DispatchProps { setEsKueryFilters: typeof setEsKueryString; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/overview_page_parsing_error_callout.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/parsing_error_callout.tsx similarity index 89% rename from x-pack/legacy/plugins/uptime/public/components/functional/overview_page_parsing_error_callout.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/parsing_error_callout.tsx index b71a4f2f8646a..96ea14cdf9f37 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/overview_page_parsing_error_callout.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/parsing_error_callout.tsx @@ -13,13 +13,11 @@ interface HasMessage { message: string; } -interface OverviewPageParsingErrorCalloutProps { +interface ParsingErrorCalloutProps { error: HasMessage; } -export const OverviewPageParsingErrorCallout = ({ - error, -}: OverviewPageParsingErrorCalloutProps) => ( +export const ParsingErrorCallout = ({ error }: ParsingErrorCalloutProps) => ( = ({ height }: Props) => { + const { dateRangeStart, dateRangeEnd, statusFilter } = useGetUrlParams(); + + const { count, lastRefresh, loading, esKuery } = useSelector(snapshotDataSelector); + + const dispatch = useDispatch(); + + useEffect(() => { + dispatch( + getSnapshotCountAction({ dateRangeStart, dateRangeEnd, filters: esKuery, statusFilter }) + ); + }, [dateRangeStart, dateRangeEnd, esKuery, lastRefresh, statusFilter, dispatch]); + return ; +}; diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/snapshot_heading.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx similarity index 100% rename from x-pack/legacy/plugins/uptime/public/components/functional/snapshot_heading.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/status_panel.tsx b/x-pack/legacy/plugins/uptime/public/components/overview/status_panel.tsx similarity index 87% rename from x-pack/legacy/plugins/uptime/public/components/functional/status_panel.tsx rename to x-pack/legacy/plugins/uptime/public/components/overview/status_panel.tsx index 2c0be2aa15d6f..9edcb08a6d5b1 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/status_panel.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/overview/status_panel.tsx @@ -6,7 +6,8 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; -import { PingHistogram, Snapshot } from '../connected'; +import { PingHistogram } from '../monitor'; +import { Snapshot } from './snapshot/snapshot_container'; const STATUS_CHART_HEIGHT = '160px'; diff --git a/x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx b/x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx index c5a0ec4831798..137846de103b4 100644 --- a/x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx +++ b/x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx @@ -7,7 +7,7 @@ import React, { createContext, useMemo } from 'react'; import { UptimeAppProps } from '../uptime_app'; import { CLIENT_DEFAULTS, CONTEXT_DEFAULTS } from '../../common/constants'; -import { CommonlyUsedRange } from '../components/functional/uptime_date_picker'; +import { CommonlyUsedRange } from '../components/common/uptime_date_picker'; import { useGetUrlParams } from '../hooks'; import { ILicense } from '../../../../../plugins/licensing/common/types'; diff --git a/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx b/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx index 85961003fce72..1ce00fe7ce3af 100644 --- a/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx @@ -11,7 +11,7 @@ import { mountWithRouter } from '../../lib'; import { OVERVIEW_ROUTE } from '../../../common/constants'; import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; import { UptimeUrlParams, getSupportedUrlParams } from '../../lib/helper'; -import { makeBaseBreadcrumb, useBreadcrumbs } from '../../hooks/use_breadcrumbs'; +import { makeBaseBreadcrumb, useBreadcrumbs } from '../use_breadcrumbs'; describe('useBreadcrumbs', () => { it('sets the given breadcrumbs', () => { diff --git a/x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts b/x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts index f764505a6d683..74160577cb0b1 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts +++ b/x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts @@ -6,7 +6,7 @@ // TODO: after NP migration is complete we should be able to remove this lint ignore comment // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { AlertTypeModel } from '../../../../../../plugins/triggers_actions_ui/public/types'; +import { AlertTypeModel } from '../../../../../../plugins/triggers_actions_ui/public'; import { initMonitorStatusAlertType } from './monitor_status'; export type AlertTypeInitializer = (dependenies: { autocomplete: any }) => AlertTypeModel; diff --git a/x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx index d059274159c7f..0624d20b197c0 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx +++ b/x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx @@ -16,7 +16,7 @@ import { } from '../../../../../../plugins/triggers_actions_ui/public/types'; import { AlertTypeInitializer } from '.'; import { StatusCheckExecutorParamsType } from '../../../common/runtime_types'; -import { AlertMonitorStatus } from '../../components/connected/alerts'; +import { AlertMonitorStatus } from '../../components/overview/alerts/alerts_containers'; export const validate = (alertParams: any): ValidationResult => { const errors: Record = {}; diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts b/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts index 126b1d85f749f..aa5a2b0f60e4f 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts +++ b/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts @@ -11,7 +11,7 @@ import { CHART_FORMAT_LIMITS } from '../../../../common/constants'; /** * Generates an appropriate date formatting string intended for the y-axis * label of timeseries charts. The function will return day/month values for shorter - * timespans that cross the local date threshold, otherwise it estimates an appropriate + * time spans that cross the local date threshold, otherwise it estimates an appropriate * label for several different stops. * @param dateRangeStart the beginning of the date range * @param dateRangeEnd the end of the date range diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_label_format.ts b/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_label_format.ts index 668147fee8055..5957123e9257d 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_label_format.ts +++ b/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_label_format.ts @@ -49,7 +49,7 @@ const dateStops: Array<{ key: number; value: string }> = [ ]; /** - * Returns an appropriate label format bbased on pre-defined intervals. + * Returns an appropriate label format based on pre-defined intervals. * @param delta The length of the timespan in milliseconds */ export const getLabelFormat = (delta: number): string => { diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/convert_measurements.ts b/x-pack/legacy/plugins/uptime/public/lib/helper/convert_measurements.ts index 4ad9b81b9e660..da97b6400a9a5 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/helper/convert_measurements.ts +++ b/x-pack/legacy/plugins/uptime/public/lib/helper/convert_measurements.ts @@ -8,7 +8,7 @@ const NUM_MICROSECONDS_IN_MILLISECOND = 1000; /** * This simply converts microseconds to milliseconds. People tend to prefer ms to us - * when visualizaing request duration times. + * when visualizing request duration times. */ export const convertMicrosecondsToMilliseconds = (microseconds: number | null): number | null => { if (!microseconds && microseconds !== 0) return null; diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts b/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts index 691b38bdf9ca2..16888aec21cfe 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts +++ b/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts @@ -24,7 +24,7 @@ describe('parseAbsoluteDate', () => { it('returns the default value if the parser provides `undefined`', () => { dateMathSpy.mockReturnValue(undefined); - const result = parseAbsoluteDate('this is not a valid datae', 12345); + const result = parseAbsoluteDate('this is not a valid date', 12345); expect(result).toBe(12345); }); }); diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_autorefresh_interval.test.ts b/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_autorefresh_interval.test.ts deleted file mode 100644 index a5c2168378089..0000000000000 --- a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_autorefresh_interval.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { parseUrlInt } from '../parse_url_int'; - -describe('parseUrlInt', () => { - it('parses a number', () => { - const result = parseUrlInt('23', 50); - expect(result).toBe(23); - }); - - it('returns default value for empty string', () => { - const result = parseUrlInt('', 50); - expect(result).toBe(50); - }); - - it('returns default value for non-numeric string', () => { - const result = parseUrlInt('abc', 50); - expect(result).toBe(50); - }); -}); diff --git a/x-pack/legacy/plugins/uptime/public/lib/lib.ts b/x-pack/legacy/plugins/uptime/public/lib/lib.ts index 6b6191441c931..7dd3aa9eed5ce 100644 --- a/x-pack/legacy/plugins/uptime/public/lib/lib.ts +++ b/x-pack/legacy/plugins/uptime/public/lib/lib.ts @@ -5,7 +5,6 @@ */ import { ReactElement } from 'react'; -import { ChromeBreadcrumb } from 'src/core/public'; import { UMBadge } from '../badge'; import { UptimeAppProps } from '../uptime_app'; @@ -13,8 +12,6 @@ export interface UMFrontendLibs { framework: UMFrameworkAdapter; } -export type UMUpdateBreadcrumbs = (breadcrumbs: ChromeBreadcrumb[]) => void; - export type UMUpdateBadge = (badge: UMBadge) => void; export type BootstrapUptimeApp = (props: UptimeAppProps) => ReactElement; diff --git a/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx b/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx index 683af81239c99..4495be9b24dc1 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx @@ -8,12 +8,13 @@ import { EuiSpacer } from '@elastic/eui'; import React from 'react'; import { useSelector } from 'react-redux'; import { useTrackPageview } from '../../../../../plugins/observability/public'; -import { MonitorStatusDetails, PingList } from '../components/connected'; import { monitorStatusSelector } from '../state/selectors'; import { PageHeader } from './page_header'; -import { MonitorCharts } from '../components/functional'; import { useBreadcrumbs } from '../hooks/use_breadcrumbs'; import { useMonitorId, useUptimeTelemetry, UptimePage } from '../hooks'; +import { MonitorCharts } from '../components/monitor'; +import { MonitorStatusDetails } from '../components/monitor'; +import { PingList } from '../components/monitor'; export const MonitorPage: React.FC = () => { const monitorId = useMonitorId(); diff --git a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx b/x-pack/legacy/plugins/uptime/public/pages/overview.tsx index 5b51a208a4c37..adc36efa6f7db 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/overview.tsx @@ -8,15 +8,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import React, { useEffect } from 'react'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; -import { OverviewPageParsingErrorCallout, StatusPanel } from '../components/functional'; import { useUptimeTelemetry, UptimePage, useGetUrlParams } from '../hooks'; import { stringifyUrlParams } from '../lib/helper/stringify_url_params'; import { useTrackPageview } from '../../../../../plugins/observability/public'; import { DataPublicPluginSetup, IIndexPattern } from '../../../../../../src/plugins/data/public'; -import { EmptyState, FilterGroup, KueryBar, MonitorList } from '../components/connected'; import { useUpdateKueryString } from '../hooks'; import { PageHeader } from './page_header'; import { useBreadcrumbs } from '../hooks/use_breadcrumbs'; +import { MonitorList } from '../components/overview/monitor_list/monitor_list_container'; +import { EmptyState, FilterGroup, KueryBar, ParsingErrorCallout } from '../components/overview'; +import { StatusPanel } from '../components/overview/status_panel'; interface OverviewPageProps { autocomplete: DataPublicPluginSetup['autocomplete']; @@ -75,7 +76,7 @@ export const OverviewPageComponent = ({ autocomplete, indexPattern, setEsKueryFi - {error && } + {error && } diff --git a/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx b/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx index 49e6ddb56602c..b10bc6ba44f8a 100644 --- a/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx +++ b/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx @@ -8,9 +8,9 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer, EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Link } from 'react-router-dom'; -import { UptimeDatePicker } from '../components/functional/uptime_date_picker'; +import { UptimeDatePicker } from '../components/common/uptime_date_picker'; import { SETTINGS_ROUTE } from '../../common/constants'; -import { ToggleAlertFlyoutButton } from '../components/connected'; +import { ToggleAlertFlyoutButton } from '../components/overview/alerts/alerts_containers'; interface PageHeaderProps { headingText: string; diff --git a/x-pack/legacy/plugins/uptime/public/routes.tsx b/x-pack/legacy/plugins/uptime/public/routes.tsx index bb0700287dbf1..b5e20ef8a70a9 100644 --- a/x-pack/legacy/plugins/uptime/public/routes.tsx +++ b/x-pack/legacy/plugins/uptime/public/routes.tsx @@ -7,7 +7,7 @@ import React, { FC } from 'react'; import { Route, Switch } from 'react-router-dom'; import { DataPublicPluginSetup } from '../../../../../src/plugins/data/public'; -import { OverviewPage } from './components/connected/pages/overview_container'; +import { OverviewPage } from './components/overview/overview_container'; import { MONITOR_ROUTE, OVERVIEW_ROUTE, SETTINGS_ROUTE } from '../common/constants'; import { MonitorPage, NotFoundPage, SettingsPage } from './pages'; diff --git a/x-pack/legacy/plugins/uptime/public/state/api/monitor.ts b/x-pack/legacy/plugins/uptime/public/state/api/monitor.ts index b36eccca98da9..c3d0a0180cf51 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/monitor.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/monitor.ts @@ -8,7 +8,7 @@ import { BaseParams } from './types'; import { MonitorDetailsType, MonitorLocationsType } from '../../../common/runtime_types'; import { QueryParams } from '../actions/types'; import { apiService } from './utils'; -import { API_URLS } from '../../../common/constants/rest_api'; +import { API_URLS } from '../../../common/constants'; interface ApiRequest { monitorId: string; diff --git a/x-pack/legacy/plugins/uptime/public/state/api/monitor_duration.ts b/x-pack/legacy/plugins/uptime/public/state/api/monitor_duration.ts index daf725119fcf3..91034f1784b15 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/monitor_duration.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/monitor_duration.ts @@ -6,7 +6,7 @@ import { BaseParams } from './types'; import { apiService } from './utils'; -import { API_URLS } from '../../../common/constants/rest_api'; +import { API_URLS } from '../../../common/constants'; export const fetchMonitorDuration = async ({ monitorId, dateStart, dateEnd }: BaseParams) => { const queryParams = { diff --git a/x-pack/legacy/plugins/uptime/public/state/api/overview_filters.ts b/x-pack/legacy/plugins/uptime/public/state/api/overview_filters.ts index 9943bc27f11f0..6330d8a912210 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/overview_filters.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/overview_filters.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { GetOverviewFiltersPayload } from '../actions/overview_filters'; +import { GetOverviewFiltersPayload } from '../actions'; import { OverviewFiltersType } from '../../../common/runtime_types'; import { apiService } from './utils'; -import { API_URLS } from '../../../common/constants/rest_api'; +import { API_URLS } from '../../../common/constants'; export const fetchOverviewFilters = async ({ dateRangeStart, diff --git a/x-pack/legacy/plugins/uptime/public/state/api/ping.ts b/x-pack/legacy/plugins/uptime/public/state/api/ping.ts index bbd3ddf399dcc..6de27879a49f5 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/ping.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/ping.ts @@ -13,7 +13,7 @@ import { HistogramResult, } from '../../../common/runtime_types'; import { apiService } from './utils'; -import { API_URLS } from '../../../common/constants/rest_api'; +import { API_URLS } from '../../../common/constants'; export const fetchPings: APIFn = async ({ dateRange: { from, to }, diff --git a/x-pack/legacy/plugins/uptime/public/state/api/snapshot.ts b/x-pack/legacy/plugins/uptime/public/state/api/snapshot.ts index e663d0241d688..9ee53dd2cbcef 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/snapshot.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/snapshot.ts @@ -6,7 +6,7 @@ import { SnapshotType, Snapshot } from '../../../common/runtime_types'; import { apiService } from './utils'; -import { API_URLS } from '../../../common/constants/rest_api'; +import { API_URLS } from '../../../common/constants'; export interface SnapShotQueryParams { dateRangeStart: string; diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_status.ts b/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_status.ts index fa3e377b5ebf4..a98e89a27a711 100644 --- a/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_status.ts +++ b/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_status.ts @@ -26,7 +26,7 @@ type MonitorStatusPayload = QueryParams & Ping; export const monitorStatusReducer = handleActions( { - [String(getMonitorStatusAction)]: (state, action: Action) => ({ + [String(getMonitorStatusAction)]: state => ({ ...state, loading: true, }), @@ -43,7 +43,7 @@ export const monitorStatusReducer = handleActions) => ({ + [String(getMonitorStatusActionFail)]: state => ({ ...state, loading: false, }), diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/ui.ts b/x-pack/legacy/plugins/uptime/public/state/reducers/ui.ts index 702d314250521..c533f293fc940 100644 --- a/x-pack/legacy/plugins/uptime/public/state/reducers/ui.ts +++ b/x-pack/legacy/plugins/uptime/public/state/reducers/ui.ts @@ -13,7 +13,7 @@ import { triggerAppRefresh, UiPayload, setAlertFlyoutVisible, -} from '../actions/ui'; +} from '../actions'; export interface UiState { alertFlyoutVisible: boolean; diff --git a/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts b/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts index dc5df3f93804d..7260c61f44147 100644 --- a/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts +++ b/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts @@ -46,6 +46,16 @@ export const selectPingList = ({ pingList, ui: { lastRefresh } }: AppState) => ( lastRefresh, }); +export const snapshotDataSelector = ({ + snapshot: { count, loading }, + ui: { lastRefresh, esKuery }, +}: AppState) => ({ + count, + lastRefresh, + loading, + esKuery, +}); + const mlCapabilitiesSelector = (state: AppState) => state.ml.mlCapabilities.data; export const hasMLFeatureAvailable = createSelector( diff --git a/x-pack/legacy/plugins/uptime/public/uptime_app.tsx b/x-pack/legacy/plugins/uptime/public/uptime_app.tsx index 556e5b9bf299e..92775a2663863 100644 --- a/x-pack/legacy/plugins/uptime/public/uptime_app.tsx +++ b/x-pack/legacy/plugins/uptime/public/uptime_app.tsx @@ -18,12 +18,14 @@ import { UptimeSettingsContextProvider, UptimeThemeContextProvider, } from './contexts'; -import { CommonlyUsedRange } from './components/functional/uptime_date_picker'; +import { CommonlyUsedRange } from './components/common/uptime_date_picker'; import { store } from './state'; import { setBasePath } from './state/actions'; import { PageRouter } from './routes'; -import { UptimeAlertsFlyoutWrapper } from './components/connected'; -import { UptimeAlertsContextProvider } from './components/functional/alerts'; +import { + UptimeAlertsContextProvider, + UptimeAlertsFlyoutWrapper, +} from './components/overview/alerts'; import { kibanaService } from './state/kibana_service'; export interface UptimeAppColors { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 1170d270e42ac..4e1217ac9e7b5 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16254,7 +16254,6 @@ "xpack.uptime.locationName.helpLinkAnnotation": "場所を追加", "xpack.uptime.ml.durationChart.exploreInMlApp": "ML アプリで探索", "xpack.uptime.ml.enableAnomalyDetectionPanel.anomalyDetectionTitle": "異常検知", - "xpack.uptime.ml.enableAnomalyDetectionPanel.callout.jobExistsDescription.viewJobLinkText": "既存のジョブを表示", "xpack.uptime.ml.enableAnomalyDetectionPanel.createMLJobDescription": "ここでは稼働状況監視の応答時間について異常スコアを計算する機械学習ジョブを作成できます。\n 有効にすると、詳細ページの監視期間チャートに予想範囲が表示され、グラフに異常の注釈が付きます。\n 地理的な地域にわたって遅延が増える期間を特定することもできます。", "xpack.uptime.ml.enableAnomalyDetectionPanel.createNewJobButtonLabel": "新規ジョブを作成", "xpack.uptime.ml.enableAnomalyDetectionPanel.disableAnomalyDetectionTitle": "異常検知を無効にする", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f86e03b6c10e1..bfdcc8b865313 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16259,7 +16259,6 @@ "xpack.uptime.locationName.helpLinkAnnotation": "添加位置", "xpack.uptime.ml.durationChart.exploreInMlApp": "在 ML 应用中浏览", "xpack.uptime.ml.enableAnomalyDetectionPanel.anomalyDetectionTitle": "异常检测", - "xpack.uptime.ml.enableAnomalyDetectionPanel.callout.jobExistsDescription.viewJobLinkText": "查看现有作业", "xpack.uptime.ml.enableAnomalyDetectionPanel.createMLJobDescription": "在此处可以创建 Machine Learning 作业,以便为运行时间监测计算\n 响应持续时间的异常分数。启用后,详情页面上的监测持续时间图表\n 将显示预期边界并使用异常标注图表。您还可能\n 识别在所有地理区域的延迟增长时段。", "xpack.uptime.ml.enableAnomalyDetectionPanel.createNewJobButtonLabel": "创建新作业", "xpack.uptime.ml.enableAnomalyDetectionPanel.disableAnomalyDetectionTitle": "禁用异常检测", From 9226d4cc94d54b2caaf0b12f98758c0d2df2234b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Mon, 20 Apr 2020 12:43:34 +0100 Subject: [PATCH 13/15] [Telemetry] Use staging if it's not a distributable release (#63875) * [Telemetry] Use staging if it's not a distributable release (instead of 'dev' vs. 'prod' approach) * Rename isProd to isDistributable and useProdKey --- src/plugins/telemetry/server/config.ts | 8 ++++---- .../server/encryption/encrypt.test.ts | 18 +++++++++--------- .../server/encryption/encrypt.ts | 11 +++++++---- .../server/plugin.ts | 10 ++++------ .../server/types.ts | 1 - .../telemetry_collection/get_all_stats.test.ts | 2 -- .../get_stats_with_xpack.test.ts | 1 - 7 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/plugins/telemetry/server/config.ts b/src/plugins/telemetry/server/config.ts index 9621a8b5619b2..99dde0c3b3d96 100644 --- a/src/plugins/telemetry/server/config.ts +++ b/src/plugins/telemetry/server/config.ts @@ -36,8 +36,8 @@ export const configSchema = schema.object({ config: schema.string({ defaultValue: getConfigPath() }), banner: schema.boolean({ defaultValue: true }), url: schema.conditional( - schema.contextRef('dev'), - schema.literal(true), + schema.contextRef('dist'), + schema.literal(false), // Point to staging if it's not a distributable release schema.string({ defaultValue: `https://telemetry-staging.elastic.co/xpack/${ENDPOINT_VERSION}/send`, }), @@ -46,8 +46,8 @@ export const configSchema = schema.object({ }) ), optInStatusUrl: schema.conditional( - schema.contextRef('dev'), - schema.literal(true), + schema.contextRef('dist'), + schema.literal(false), // Point to staging if it's not a distributable release schema.string({ defaultValue: `https://telemetry-staging.elastic.co/opt_in_status/${ENDPOINT_VERSION}/send`, }), diff --git a/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts b/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts index c04625eb1dd42..6d64268569e06 100644 --- a/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts +++ b/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts @@ -22,14 +22,14 @@ import { encryptTelemetry, getKID } from './encrypt'; describe('getKID', () => { it(`returns 'kibana_dev' kid for development`, async () => { - const isProd = false; - const kid = getKID(isProd); + const useProdKey = false; + const kid = getKID(useProdKey); expect(kid).toBe('kibana_dev'); }); it(`returns 'kibana_prod' kid for development`, async () => { - const isProd = true; - const kid = getKID(isProd); + const useProdKey = true; + const kid = getKID(useProdKey); expect(kid).toBe('kibana'); }); }); @@ -41,19 +41,19 @@ describe('encryptTelemetry', () => { it('encrypts payload', async () => { const payload = { some: 'value' }; - await encryptTelemetry(payload, { isProd: true }); + await encryptTelemetry(payload, { useProdKey: true }); expect(createRequestEncryptor).toBeCalledWith(telemetryJWKS); }); - it('uses kibana kid on { isProd: true }', async () => { + it('uses kibana kid on { useProdKey: true }', async () => { const payload = { some: 'value' }; - await encryptTelemetry(payload, { isProd: true }); + await encryptTelemetry(payload, { useProdKey: true }); expect(mockEncrypt).toBeCalledWith('kibana', payload); }); - it('uses kibana_dev kid on { isProd: false }', async () => { + it('uses kibana_dev kid on { useProdKey: false }', async () => { const payload = { some: 'value' }; - await encryptTelemetry(payload, { isProd: false }); + await encryptTelemetry(payload, { useProdKey: false }); expect(mockEncrypt).toBeCalledWith('kibana_dev', payload); }); }); diff --git a/src/plugins/telemetry_collection_manager/server/encryption/encrypt.ts b/src/plugins/telemetry_collection_manager/server/encryption/encrypt.ts index 44f053064cfcb..89f34d794f059 100644 --- a/src/plugins/telemetry_collection_manager/server/encryption/encrypt.ts +++ b/src/plugins/telemetry_collection_manager/server/encryption/encrypt.ts @@ -20,12 +20,15 @@ import { createRequestEncryptor } from '@elastic/request-crypto'; import { telemetryJWKS } from './telemetry_jwks'; -export function getKID(isProd = false): string { - return isProd ? 'kibana' : 'kibana_dev'; +export function getKID(useProdKey = false): string { + return useProdKey ? 'kibana' : 'kibana_dev'; } -export async function encryptTelemetry(payload: any, { isProd = false } = {}): Promise { - const kid = getKID(isProd); +export async function encryptTelemetry( + payload: any, + { useProdKey = false } = {} +): Promise { + const kid = getKID(useProdKey); const encryptor = await createRequestEncryptor(telemetryJWKS); const clusters = [].concat(payload); return Promise.all(clusters.map((cluster: any) => encryptor.encrypt(kid, cluster))); diff --git a/src/plugins/telemetry_collection_manager/server/plugin.ts b/src/plugins/telemetry_collection_manager/server/plugin.ts index f2f20e215c535..0b57fae83c0fb 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.ts @@ -50,12 +50,12 @@ export class TelemetryCollectionManagerPlugin private readonly collections: Array> = []; private usageGetterMethodPriority = -1; private usageCollection?: UsageCollectionSetup; - private readonly isDev: boolean; + private readonly isDistributable: boolean; private readonly version: string; constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); - this.isDev = initializerContext.env.mode.dev; + this.isDistributable = initializerContext.env.packageInfo.dist; this.version = initializerContext.env.packageInfo.version; } @@ -158,7 +158,7 @@ export class TelemetryCollectionManagerPlugin if (config.unencrypted) { return optInStats; } - return encryptTelemetry(optInStats, { isProd: !this.isDev }); + return encryptTelemetry(optInStats, { useProdKey: this.isDistributable }); } } catch (err) { this.logger.debug(`Failed to collect any opt in stats with registered collections.`); @@ -176,7 +176,6 @@ export class TelemetryCollectionManagerPlugin ) => { const context: StatsCollectionContext = { logger: this.logger.get(collection.title), - isDev: this.isDev, version: this.version, ...collection.customContext, }; @@ -206,7 +205,7 @@ export class TelemetryCollectionManagerPlugin return usageData; } - return encryptTelemetry(usageData, { isProd: !this.isDev }); + return encryptTelemetry(usageData, { useProdKey: this.isDistributable }); } } catch (err) { this.logger.debug( @@ -225,7 +224,6 @@ export class TelemetryCollectionManagerPlugin ): Promise { const context: StatsCollectionContext = { logger: this.logger.get(collection.title), - isDev: this.isDev, version: this.version, ...collection.customContext, }; diff --git a/src/plugins/telemetry_collection_manager/server/types.ts b/src/plugins/telemetry_collection_manager/server/types.ts index e23d6a4c388f4..d3a47694d38a7 100644 --- a/src/plugins/telemetry_collection_manager/server/types.ts +++ b/src/plugins/telemetry_collection_manager/server/types.ts @@ -101,7 +101,6 @@ export interface ESLicense { export interface StatsCollectionContext { logger: Logger; - isDev: boolean; version: string; } diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts index 1a9f2a4da32c2..f0ad6399c6c72 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_all_stats.test.ts @@ -182,7 +182,6 @@ describe('get_all_stats', () => { }, { logger: coreMock.createPluginInitializerContext().logger.get('test'), - isDev: true, version: 'version', maxBucketSize: 1, } @@ -208,7 +207,6 @@ describe('get_all_stats', () => { }, { logger: coreMock.createPluginInitializerContext().logger.get('test'), - isDev: true, version: 'version', maxBucketSize: 1, } diff --git a/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.test.ts b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.test.ts index f2a9995098e59..5dfe3d3e99a7f 100644 --- a/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.test.ts +++ b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.test.ts @@ -31,7 +31,6 @@ const kibana = { const getContext = () => ({ version: '8675309-snapshot', - isDev: true, logger: coreMock.createPluginInitializerContext().logger.get('test'), }); From 21dda535ebfa31b794cc0a1ba608570bcd6a2256 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Mon, 20 Apr 2020 14:08:04 +0200 Subject: [PATCH 14/15] =?UTF-8?q?Upgrade=20`papaparse`=20dependency=20(`4.?= =?UTF-8?q?6.3`=20=E2=86=92=20`5.2.0`).=20(#63879)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- x-pack/package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index a4fdb17f52fe5..3c6146b491f60 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -85,7 +85,7 @@ "@types/node-fetch": "^2.5.0", "@types/nodemailer": "^6.2.1", "@types/object-hash": "^1.3.0", - "@types/papaparse": "^4.5.11", + "@types/papaparse": "^5.0.3", "@types/pngjs": "^3.3.2", "@types/prop-types": "^15.5.3", "@types/proper-lockfile": "^3.0.1", @@ -290,7 +290,7 @@ "oboe": "^2.1.4", "oppsy": "^2.0.0", "p-retry": "^4.2.0", - "papaparse": "^4.6.3", + "papaparse": "^5.2.0", "pdfmake": "^0.1.63", "pluralize": "3.1.0", "pngjs": "3.4.0", diff --git a/yarn.lock b/yarn.lock index 45540cd2675b7..b47befbf9057b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4477,10 +4477,10 @@ dependencies: "@types/node" "*" -"@types/papaparse@^4.5.11": - version "4.5.11" - resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-4.5.11.tgz#dcd4f64da55f768c2e2cf92ccac1973c67a73890" - integrity sha512-zOw6K7YyA/NuZ2yZ8lzZFe2U3fn+vFfcRfiQp4ZJHG6y8WYWy2SYFbq6mp4yUgpIruJHBjKZtgyE0vvCoWEq+A== +"@types/papaparse@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.0.3.tgz#7cedc1ebc9484819af8306a8b42f9f08ca9bdb44" + integrity sha512-SgWGWnBGxl6XgjKDM2eoDg163ZFQtH6m6C2aOuaAf1T2gUB3rjaiPDDARbY9WlacRgZqieRG9imAfJaJ+5ouDA== dependencies: "@types/node" "*" @@ -22585,10 +22585,10 @@ pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== -papaparse@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.6.3.tgz#742e5eaaa97fa6c7e1358d2934d8f18f44aee781" - integrity sha512-LRq7BrHC2kHPBYSD50aKuw/B/dGcg29omyJbKWY3KsYUZU69RKwaBHu13jGmCYBtOc4odsLCrFyk6imfyNubJQ== +papaparse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.2.0.tgz#97976a1b135c46612773029153dc64995caa3b7b" + integrity sha512-ylq1wgUSnagU+MKQtNeVqrPhZuMYBvOSL00DHycFTCxownF95gpLAk1HiHdUW77N8yxRq1qHXLdlIPyBSG9NSA== parallel-transform@^1.1.0: version "1.1.0" From 8f7bb05169d148751fc66e235dfe77ab0315dee0 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Mon, 20 Apr 2020 15:04:14 +0200 Subject: [PATCH 15/15] [Discuss] Remove expressions plugin's dependency on inspector plugin (#63841) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 💡 use inspector service in visualizations to open it * refactor: 💡 remove expressions plugin dependency on inspector * test: 💍 fix Jest mock * fix: 🐛 remove Inspectore from Expressions plugin dependency inf * docs: ✏️ add JSDocs for createStartServicesGetter() method * test: 💍 fix TypeScript errors in expressions mocks --- src/plugins/expressions/kibana.json | 3 +- src/plugins/expressions/public/loader.ts | 16 ++----- src/plugins/expressions/public/mocks.tsx | 3 -- src/plugins/expressions/public/plugin.ts | 9 +--- .../public/react_expression_renderer.tsx | 3 +- src/plugins/expressions/public/render.ts | 3 +- src/plugins/expressions/public/services.ts | 3 -- .../core/create_start_service_getter.ts | 42 +++++++++++++++++++ src/plugins/visualizations/kibana.json | 2 +- .../create_vis_embeddable_from_object.ts | 4 +- .../public/embeddable/visualize_embeddable.ts | 17 ++++++-- .../visualize_embeddable_factory.tsx | 13 ++++-- src/plugins/visualizations/public/mocks.ts | 5 ++- src/plugins/visualizations/public/plugin.ts | 34 ++++++++++----- 14 files changed, 107 insertions(+), 50 deletions(-) diff --git a/src/plugins/expressions/kibana.json b/src/plugins/expressions/kibana.json index cba693dd4bc20..5d2112103e94d 100644 --- a/src/plugins/expressions/kibana.json +++ b/src/plugins/expressions/kibana.json @@ -4,7 +4,6 @@ "server": true, "ui": true, "requiredPlugins": [ - "bfetch", - "inspector" + "bfetch" ] } diff --git a/src/plugins/expressions/public/loader.ts b/src/plugins/expressions/public/loader.ts index fbe2f37c648d6..418ff6fdf8614 100644 --- a/src/plugins/expressions/public/loader.ts +++ b/src/plugins/expressions/public/loader.ts @@ -19,13 +19,14 @@ import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; -import { Adapters, InspectorSession } from '../../inspector/public'; -import { ExpressionRenderHandler } from './render'; +import { Adapters } from '../../inspector/public'; import { IExpressionLoaderParams } from './types'; import { ExpressionAstExpression } from '../common'; -import { getInspector, getExpressionsService } from './services'; import { ExecutionContract } from '../common/execution/execution_contract'; +import { ExpressionRenderHandler } from './render'; +import { getExpressionsService } from './services'; + type Data = any; export class ExpressionLoader { @@ -120,15 +121,6 @@ export class ExpressionLoader { return this.renderHandler.getElement(); } - openInspector(title: string): InspectorSession | undefined { - const inspector = this.inspect(); - if (inspector) { - return getInspector().open(inspector, { - title, - }); - } - } - inspect(): Adapters | undefined { return this.execution ? (this.execution.inspect() as Adapters) : undefined; } diff --git a/src/plugins/expressions/public/mocks.tsx b/src/plugins/expressions/public/mocks.tsx index cb7089f814643..b8f2f693e9c77 100644 --- a/src/plugins/expressions/public/mocks.tsx +++ b/src/plugins/expressions/public/mocks.tsx @@ -22,7 +22,6 @@ import { ExpressionsSetup, ExpressionsStart, plugin as pluginInitializer } from /* eslint-disable */ import { coreMock } from '../../../core/public/mocks'; -import { inspectorPluginMock } from '../../inspector/public/mocks'; import { bfetchPluginMock } from '../../bfetch/public/mocks'; /* eslint-enable */ @@ -89,7 +88,6 @@ const createPlugin = async () => { const plugin = pluginInitializer(pluginInitializerContext); const setup = await plugin.setup(coreSetup, { bfetch: bfetchPluginMock.createSetupContract(), - inspector: inspectorPluginMock.createSetupContract(), }); return { @@ -101,7 +99,6 @@ const createPlugin = async () => { doStart: async () => await plugin.start(coreStart, { bfetch: bfetchPluginMock.createStartContract(), - inspector: inspectorPluginMock.createStartContract(), }), }; }; diff --git a/src/plugins/expressions/public/plugin.ts b/src/plugins/expressions/public/plugin.ts index 7c0de271b7706..720c3b701d504 100644 --- a/src/plugins/expressions/public/plugin.ts +++ b/src/plugins/expressions/public/plugin.ts @@ -29,11 +29,9 @@ import { ExpressionsServiceStart, ExecutionContext, } from '../common'; -import { Setup as InspectorSetup, Start as InspectorStart } from '../../inspector/public'; import { BfetchPublicSetup, BfetchPublicStart } from '../../bfetch/public'; import { setCoreStart, - setInspector, setInterpreter, setRenderersRegistry, setNotifications, @@ -45,12 +43,10 @@ import { render, ExpressionRenderHandler } from './render'; export interface ExpressionsSetupDeps { bfetch: BfetchPublicSetup; - inspector: InspectorSetup; } export interface ExpressionsStartDeps { bfetch: BfetchPublicStart; - inspector: InspectorStart; } export interface ExpressionsSetup extends ExpressionsServiceSetup { @@ -120,7 +116,7 @@ export class ExpressionsPublicPlugin }); } - public setup(core: CoreSetup, { inspector, bfetch }: ExpressionsSetupDeps): ExpressionsSetup { + public setup(core: CoreSetup, { bfetch }: ExpressionsSetupDeps): ExpressionsSetup { this.configureExecutor(core); const { expressions } = this; @@ -180,9 +176,8 @@ export class ExpressionsPublicPlugin return Object.freeze(setup); } - public start(core: CoreStart, { inspector, bfetch }: ExpressionsStartDeps): ExpressionsStart { + public start(core: CoreStart, { bfetch }: ExpressionsStartDeps): ExpressionsStart { setCoreStart(core); - setInspector(inspector); setNotifications(core.notifications); const { expressions } = this; diff --git a/src/plugins/expressions/public/react_expression_renderer.tsx b/src/plugins/expressions/public/react_expression_renderer.tsx index 242a49c6d6639..2c99f173c9f33 100644 --- a/src/plugins/expressions/public/react_expression_renderer.tsx +++ b/src/plugins/expressions/public/react_expression_renderer.tsx @@ -17,8 +17,7 @@ * under the License. */ -import { useRef, useEffect, useState, useLayoutEffect } from 'react'; -import React from 'react'; +import React, { useRef, useEffect, useState, useLayoutEffect } from 'react'; import classNames from 'classnames'; import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; diff --git a/src/plugins/expressions/public/render.ts b/src/plugins/expressions/public/render.ts index ad4d16bcd1323..4aaf0da60fc60 100644 --- a/src/plugins/expressions/public/render.ts +++ b/src/plugins/expressions/public/render.ts @@ -21,10 +21,11 @@ import * as Rx from 'rxjs'; import { Observable } from 'rxjs'; import { filter } from 'rxjs/operators'; import { RenderError, RenderErrorHandlerFnType, IExpressionLoaderParams } from './types'; -import { getRenderersRegistry } from './services'; import { renderErrorHandler as defaultRenderErrorHandler } from './render_error_handler'; import { IInterpreterRenderHandlers, ExpressionAstExpression } from '../common'; +import { getRenderersRegistry } from './services'; + export type IExpressionRendererExtraHandlers = Record; export interface ExpressionRenderHandlerParams { diff --git a/src/plugins/expressions/public/services.ts b/src/plugins/expressions/public/services.ts index a203e87414571..016456c956666 100644 --- a/src/plugins/expressions/public/services.ts +++ b/src/plugins/expressions/public/services.ts @@ -20,14 +20,11 @@ import { NotificationsStart } from 'kibana/public'; import { createKibanaUtilsCore, createGetterSetter } from '../../kibana_utils/public'; import { ExpressionInterpreter } from './types'; -import { Start as IInspector } from '../../inspector/public'; import { ExpressionsSetup } from './plugin'; import { ExpressionsService } from '../common'; export const { getCoreStart, setCoreStart } = createKibanaUtilsCore(); -export const [getInspector, setInspector] = createGetterSetter('Inspector'); - export const [getInterpreter, setInterpreter] = createGetterSetter( 'Interpreter' ); diff --git a/src/plugins/kibana_utils/public/core/create_start_service_getter.ts b/src/plugins/kibana_utils/public/core/create_start_service_getter.ts index e507d1ae778e5..5e385eb5ed473 100644 --- a/src/plugins/kibana_utils/public/core/create_start_service_getter.ts +++ b/src/plugins/kibana_utils/public/core/create_start_service_getter.ts @@ -30,6 +30,48 @@ export type StartServicesGetter = () = OwnContract >; +/** + * Use this utility to create a synchronous *start* service getter in *setup* + * life-cycle of your plugin. + * + * Below is a usage example in a Kibana plugin. + * + * ```ts + * export interface MyPluginStartDeps { + * data: DataPublicPluginStart; + * expressions: ExpressionsStart; + * inspector: InspectorStart; + * uiActions: UiActionsStart; + * } + * + * class MyPlugin implements Plugin { + * setup(core: CoreSetup, plugins) { + * const start = createStartServicesGetter(core.getStartServices); + * plugins.expressions.registerFunction(myExpressionFunction(start)); + * } + * + * start(core, plugins: MyPluginStartDeps) { + * + * } + * } + * ``` + * + * In `myExpressionFunction` you can make sure you are picking only the dependencies + * your function needs using the `Pick` type. + * + * ```ts + * const myExpressionFunction = + * (start: StartServicesGetter>) => { + * + * start().plugins.indexPatterns.something(123); + * } + * ``` + * + * @param accessor Asynchronous start service accessor provided by platform. + * @returns Returns a function which synchronously returns *start* core services + * and plugin contracts. If you call this function before the *start* life-cycle + * has started it will throw. + */ export const createStartServicesGetter = ( accessor: StartServicesAccessor ): StartServicesGetter => { diff --git a/src/plugins/visualizations/kibana.json b/src/plugins/visualizations/kibana.json index cd22b1375ae1b..f3f9cbd8341ec 100644 --- a/src/plugins/visualizations/kibana.json +++ b/src/plugins/visualizations/kibana.json @@ -3,5 +3,5 @@ "version": "kibana", "server": true, "ui": true, - "requiredPlugins": ["data", "expressions", "uiActions", "embeddable", "usageCollection"] + "requiredPlugins": ["data", "expressions", "uiActions", "embeddable", "usageCollection", "inspector"] } diff --git a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts b/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts index bf2d174f594b2..8e51bd4ac5d4f 100644 --- a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts +++ b/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts @@ -28,8 +28,9 @@ import { getTimeFilter, getCapabilities, } from '../services'; +import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory'; -export const createVisEmbeddableFromObject = async ( +export const createVisEmbeddableFromObject = (deps: VisualizeEmbeddableFactoryDeps) => async ( vis: Vis, input: Partial & { id: string }, parent?: IContainer @@ -58,6 +59,7 @@ export const createVisEmbeddableFromObject = async ( indexPatterns, editUrl, editable, + deps, }, input, parent diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index e64d200251797..ffb028ff131b3 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -42,6 +42,7 @@ import { buildPipeline } from '../legacy/build_pipeline'; import { Vis } from '../vis'; import { getExpressions, getUiActions } from '../services'; import { VIS_EVENT_TO_TRIGGER } from './events'; +import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory'; const getKeys = (o: T): Array => Object.keys(o) as Array; @@ -50,6 +51,7 @@ export interface VisualizeEmbeddableConfiguration { indexPatterns?: IIndexPattern[]; editUrl: string; editable: boolean; + deps: VisualizeEmbeddableFactoryDeps; } export interface VisualizeInput extends EmbeddableInput { @@ -84,10 +86,11 @@ export class VisualizeEmbeddable extends Embeddable { - if (this.handler) { - return this.handler.openInspector(this.getTitle() || ''); - } + if (!this.handler) return; + + const adapters = this.handler.inspect(); + if (!adapters) return; + + this.deps.start().plugins.inspector.open(adapters, { + title: this.getTitle() || '', + }); }; /** diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx index 4b7d01ae3b246..6ab1c98645988 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx @@ -25,7 +25,7 @@ import { EmbeddableOutput, ErrorEmbeddable, IContainer, -} from '../../../../plugins/embeddable/public'; +} from '../../../embeddable/public'; import { DisabledLabEmbeddable } from './disabled_lab_embeddable'; import { VisualizeEmbeddable, VisualizeInput, VisualizeOutput } from './visualize_embeddable'; import { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; @@ -39,11 +39,17 @@ import { import { showNewVisModal } from '../wizard'; import { convertToSerializedVis } from '../saved_visualizations/_saved_vis'; import { createVisEmbeddableFromObject } from './create_vis_embeddable_from_object'; +import { StartServicesGetter } from '../../../kibana_utils/public'; +import { VisualizationsStartDeps } from '../plugin'; interface VisualizationAttributes extends SavedObjectAttributes { visState: string; } +export interface VisualizeEmbeddableFactoryDeps { + start: StartServicesGetter>; +} + export class VisualizeEmbeddableFactory implements EmbeddableFactoryDefinition< @@ -79,7 +85,8 @@ export class VisualizeEmbeddableFactory return visType.stage !== 'experimental'; }, }; - constructor() {} + + constructor(private readonly deps: VisualizeEmbeddableFactoryDeps) {} public async isEditable() { return getCapabilities().visualize.save as boolean; @@ -101,7 +108,7 @@ export class VisualizeEmbeddableFactory try { const savedObject = await savedVisualizations.get(savedObjectId); const vis = new Vis(savedObject.visState.type, await convertToSerializedVis(savedObject)); - return createVisEmbeddableFromObject(vis, input, parent); + return createVisEmbeddableFromObject(this.deps)(vis, input, parent); } catch (e) { console.error(e); // eslint-disable-line no-console return new ErrorEmbeddable(e, input, parent); diff --git a/src/plugins/visualizations/public/mocks.ts b/src/plugins/visualizations/public/mocks.ts index 2aa346423297a..d6eeffdb01459 100644 --- a/src/plugins/visualizations/public/mocks.ts +++ b/src/plugins/visualizations/public/mocks.ts @@ -26,6 +26,7 @@ import { expressionsPluginMock } from '../../../plugins/expressions/public/mocks import { dataPluginMock } from '../../../plugins/data/public/mocks'; import { usageCollectionPluginMock } from '../../../plugins/usage_collection/public/mocks'; import { uiActionsPluginMock } from '../../../plugins/ui_actions/public/mocks'; +import { inspectorPluginMock } from '../../../plugins/inspector/public/mocks'; const createSetupContract = (): VisualizationsSetup => ({ createBaseVisualization: jest.fn(), @@ -53,14 +54,16 @@ const createInstance = async () => { const setup = plugin.setup(coreMock.createSetup(), { data: dataPluginMock.createSetupContract(), - expressions: expressionsPluginMock.createSetupContract(), embeddable: embeddablePluginMock.createSetupContract(), + expressions: expressionsPluginMock.createSetupContract(), + inspector: inspectorPluginMock.createSetupContract(), usageCollection: usageCollectionPluginMock.createSetupContract(), }); const doStart = () => plugin.start(coreMock.createStart(), { data: dataPluginMock.createStartContract(), expressions: expressionsPluginMock.createStartContract(), + inspector: inspectorPluginMock.createStartContract(), uiActions: uiActionsPluginMock.createStartContract(), }); diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index 8fcb84b19a9be..b3e8c9b5b61b3 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -43,18 +43,23 @@ import { VisualizeEmbeddableFactory, createVisEmbeddableFromObject, } from './embeddable'; -import { ExpressionsSetup, ExpressionsStart } from '../../../plugins/expressions/public'; -import { EmbeddableSetup } from '../../../plugins/embeddable/public'; +import { ExpressionsSetup, ExpressionsStart } from '../../expressions/public'; +import { EmbeddableSetup } from '../../embeddable/public'; import { visualization as visualizationFunction } from './expressions/visualization_function'; import { visualization as visualizationRenderer } from './expressions/visualization_renderer'; import { range as rangeExpressionFunction } from './expression_functions/range'; import { visDimension as visDimensionExpressionFunction } from './expression_functions/vis_dimension'; import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../plugins/data/public'; -import { UsageCollectionSetup } from '../../../plugins/usage_collection/public'; +import { + Setup as InspectorSetup, + Start as InspectorStart, +} from '../../../plugins/inspector/public'; +import { UsageCollectionSetup } from '../../usage_collection/public'; +import { createStartServicesGetter, StartServicesGetter } from '../../kibana_utils/public'; import { createSavedVisLoader, SavedVisualizationsLoader } from './saved_visualizations'; import { SerializedVis, Vis } from './vis'; import { showNewVisModal } from './wizard'; -import { UiActionsStart } from '../../../plugins/ui_actions/public'; +import { UiActionsStart } from '../../ui_actions/public'; import { convertFromSerializedVis, convertToSerializedVis, @@ -74,19 +79,21 @@ export interface VisualizationsStart extends TypesStart { convertToSerializedVis: typeof convertToSerializedVis; convertFromSerializedVis: typeof convertFromSerializedVis; showNewVisModal: typeof showNewVisModal; - __LEGACY: { createVisEmbeddableFromObject: typeof createVisEmbeddableFromObject }; + __LEGACY: { createVisEmbeddableFromObject: ReturnType }; } export interface VisualizationsSetupDeps { - expressions: ExpressionsSetup; + data: DataPublicPluginSetup; embeddable: EmbeddableSetup; + expressions: ExpressionsSetup; + inspector: InspectorSetup; usageCollection: UsageCollectionSetup; - data: DataPublicPluginSetup; } export interface VisualizationsStartDeps { data: DataPublicPluginStart; expressions: ExpressionsStart; + inspector: InspectorStart; uiActions: UiActionsStart; } @@ -107,13 +114,16 @@ export class VisualizationsPlugin VisualizationsStartDeps > { private readonly types: TypesService = new TypesService(); + private getStartServicesOrDie?: StartServicesGetter; constructor(initializerContext: PluginInitializerContext) {} public setup( - core: CoreSetup, + core: CoreSetup, { expressions, embeddable, usageCollection, data }: VisualizationsSetupDeps ): VisualizationsSetup { + const start = (this.getStartServicesOrDie = createStartServicesGetter(core.getStartServices)); + setUISettings(core.uiSettings); setUsageCollector(usageCollection); @@ -122,7 +132,7 @@ export class VisualizationsPlugin expressions.registerFunction(rangeExpressionFunction); expressions.registerFunction(visDimensionExpressionFunction); - const embeddableFactory = new VisualizeEmbeddableFactory(); + const embeddableFactory = new VisualizeEmbeddableFactory({ start }); embeddable.registerEmbeddableFactory(VISUALIZE_EMBEDDABLE_TYPE, embeddableFactory); return { @@ -171,7 +181,11 @@ export class VisualizationsPlugin convertToSerializedVis, convertFromSerializedVis, savedVisualizationsLoader, - __LEGACY: { createVisEmbeddableFromObject }, + __LEGACY: { + createVisEmbeddableFromObject: createVisEmbeddableFromObject({ + start: this.getStartServicesOrDie!, + }), + }, }; }