diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 8b77e987524f6..47c6cab47b052 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -74,7 +74,11 @@ enabled: - test/functional/apps/dashboard/group4/config.ts - test/functional/apps/dashboard/group5/config.ts - test/functional/apps/dashboard/group6/config.ts - - test/functional/apps/discover/config.ts + - test/functional/apps/discover/ccs_compatibility/config.ts + - test/functional/apps/discover/classic/config.ts + - test/functional/apps/discover/embeddable/config.ts + - test/functional/apps/discover/group1/config.ts + - test/functional/apps/discover/group2/config.ts - test/functional/apps/getting_started/config.ts - test/functional/apps/home/config.ts - test/functional/apps/kibana_overview/config.ts diff --git a/.buildkite/scripts/steps/cloud/purge_deployments.ts b/.buildkite/scripts/steps/cloud/purge_deployments.ts index cbd058799d5bb..8589d776e884f 100644 --- a/.buildkite/scripts/steps/cloud/purge_deployments.ts +++ b/.buildkite/scripts/steps/cloud/purge_deployments.ts @@ -45,6 +45,7 @@ for (const deployment of prDeployments) { } catch (ex) { console.error(ex.toString()); // deploymentsToPurge.push(deployment); // TODO should we delete on error? + process.exitCode = 1; } } @@ -57,5 +58,6 @@ for (const deployment of deploymentsToPurge) { }); } catch (ex) { console.error(ex.toString()); + process.exitCode = 1; } } diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 51060cfa56a34..d06ac6fa72851 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github summary: API docs for the actions plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index b17623078ceec..04c10338d6942 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github summary: API docs for the advancedSettings plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 3955d2f0c7250..2bb07c252dbe0 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github summary: API docs for the aiops plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 9eb7da44afab9..72ea6a0c340a9 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github summary: API docs for the alerting plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 08059b680afba..456d53e9ad9a2 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github summary: API docs for the apm plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 5b48c672105f2..23f8e9c672586 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github summary: API docs for the banners plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index fcb07a6dead60..3f39c6292ee43 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github summary: API docs for the bfetch plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index addea499616f5..f2c20ab5d5cfb 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github summary: API docs for the canvas plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index eb4fb278796ad..7e0206c895224 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github summary: API docs for the cases plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index a3dafa500f849..095d1d05fad70 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github summary: API docs for the charts plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index df8f8bb213dfd..25502a38f5ab7 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloud plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 0fa4fcad94b41..7e9f899b3a512 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloudSecurityPosture plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/console.mdx b/api_docs/console.mdx index e402c7271cc86..66cbef42a81f9 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github summary: API docs for the console plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index a2bec1c4a7b32..fff34c5db3c15 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github summary: API docs for the controls plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/core.devdocs.json b/api_docs/core.devdocs.json index ffc85bbac538d..dc72756cac3a8 100644 --- a/api_docs/core.devdocs.json +++ b/api_docs/core.devdocs.json @@ -12,23 +12,11 @@ "\nMethods for adding and removing global toast messages." ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastsApi", - "text": "ToastsApi" - }, + "ToastsApi", " implements ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - } + "IToasts" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -41,7 +29,7 @@ "signature": [ "any" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -51,7 +39,7 @@ "tags": [], "label": "deps", "description": [], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -64,7 +52,7 @@ "signature": [ "IUiSettingsClient" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false } ] @@ -85,16 +73,10 @@ "() => ", "Observable", "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, + "Toast", "[]>" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [], "returnComment": [] @@ -110,23 +92,11 @@ ], "signature": [ "(toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, + "ToastInput", ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -139,15 +109,9 @@ "- a {@link ToastInput }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - } + "ToastInput" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true } @@ -167,16 +131,10 @@ ], "signature": [ "(toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, + "Toast", ") => void" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -190,15 +148,9 @@ ], "signature": [ "string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true } @@ -216,31 +168,13 @@ ], "signature": [ "(toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, + "ToastInput", ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -253,15 +187,9 @@ "- a {@link ToastInput }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - } + "ToastInput" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true }, @@ -275,16 +203,10 @@ "- a {@link ToastOptions }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": false } @@ -304,31 +226,13 @@ ], "signature": [ "(toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, + "ToastInput", ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -341,15 +245,9 @@ "- a {@link ToastInput }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - } + "ToastInput" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true }, @@ -363,16 +261,10 @@ "- a {@link ToastOptions }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": false } @@ -392,31 +284,13 @@ ], "signature": [ "(toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, + "ToastInput", ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -429,15 +303,9 @@ "- a {@link ToastInput }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - } + "ToastInput" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true }, @@ -451,16 +319,10 @@ "- a {@link ToastOptions }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": false } @@ -480,31 +342,13 @@ ], "signature": [ "(toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, + "ToastInput", ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -517,15 +361,9 @@ "- a {@link ToastInput }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - } + "ToastInput" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true }, @@ -539,16 +377,10 @@ "- a {@link ToastOptions }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, + "ToastOptions", " | undefined" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": false } @@ -568,23 +400,11 @@ ], "signature": [ "(error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, + "ErrorToastOptions", ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - } + "Toast" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "children": [ { @@ -599,7 +419,7 @@ "signature": [ "Error" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true }, @@ -613,15 +433,9 @@ "- {@link ErrorToastOptions }" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - } + "ErrorToastOptions" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser-internal/index.d.ts", "deprecated": false, "isRequired": true } @@ -1297,13 +1111,7 @@ "{@link NotificationsSetup}" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsSetup", - "text": "NotificationsSetup" - } + "NotificationsSetup" ], "path": "src/core/public/index.ts", "deprecated": false @@ -1562,13 +1370,7 @@ "{@link NotificationsStart}" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsStart", - "text": "NotificationsStart" - } + "NotificationsStart" ], "path": "src/core/public/index.ts", "deprecated": false @@ -1945,23 +1747,11 @@ "\nOptions available for {@link IToasts} error APIs." ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, + "ErrorToastOptions", " extends ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - } + "ToastOptions" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { @@ -1973,7 +1763,7 @@ "description": [ "\nThe title of the toast and the dialog when expanding the message." ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false }, { @@ -1988,7 +1778,7 @@ "signature": [ "string | undefined" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false } ], @@ -4510,174 +4300,192 @@ }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient", + "id": "def-public.IToasts", "type": "Interface", "tags": [], - "label": "IUiSettingsClient", + "label": "IToasts", "description": [ - "\nClient-side client that provides access to the advanced settings stored in elasticsearch.\nThe settings provide control over the behavior of the Kibana application.\nFor example, a user can specify how to display numeric or date fields.\nUsers can adjust the settings via Management UI.\n{@link IUiSettingsClient}\n" + "\nMethods for adding and removing global toast messages. See {@link ToastsApi}." ], "signature": [ - "IUiSettingsClient" + "IToasts" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.get", + "id": "def-public.IToasts.get$", "type": "Function", "tags": [], - "label": "get", - "description": [ - "\nGets the value for a specific uiSetting. If this setting has no user-defined value\nthen the `defaultOverride` parameter is returned (and parsed if setting is of type\n\"json\" or \"number). If the parameter is not defined and the key is not registered\nby any plugin then an error is thrown, otherwise reads the default value defined by a plugin." + "label": "get$", + "description": [], + "signature": [ + "() => ", + "Observable", + "<", + "Toast", + "[]>" ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IToasts.add", + "type": "Function", + "tags": [], + "label": "add", + "description": [], "signature": [ - "(key: string, defaultOverride?: T | undefined) => T" + "(toastOrTitle: ", + "ToastInput", + ") => ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.get.$1", - "type": "string", + "id": "def-public.IToasts.add.$1", + "type": "CompoundType", "tags": [], - "label": "key", + "label": "toastOrTitle", "description": [], "signature": [ - "string" + "ToastInput" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true - }, + } + ], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IToasts.remove", + "type": "Function", + "tags": [], + "label": "remove", + "description": [], + "signature": [ + "(toastOrId: string | ", + "Toast", + ") => void" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.get.$2", - "type": "Uncategorized", + "id": "def-public.IToasts.remove.$1", + "type": "CompoundType", "tags": [], - "label": "defaultOverride", + "label": "toastOrId", "description": [], "signature": [ - "T | undefined" + "string | ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, - "isRequired": false + "isRequired": true } ], "returnComment": [] }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.get$", + "id": "def-public.IToasts.addInfo", "type": "Function", "tags": [], - "label": "get$", - "description": [ - "\nGets an observable of the current value for a config key, and all updates to that config\nkey in the future. Providing a `defaultOverride` argument behaves the same as it does in #get()" - ], + "label": "addInfo", + "description": [], "signature": [ - "(key: string, defaultOverride?: T | undefined) => ", - "Observable", - "" + "(toastOrTitle: ", + "ToastInput", + ", options?: any) => ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.get$.$1", - "type": "string", + "id": "def-public.IToasts.addInfo.$1", + "type": "CompoundType", "tags": [], - "label": "key", + "label": "toastOrTitle", "description": [], "signature": [ - "string" + "ToastInput" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.get$.$2", - "type": "Uncategorized", + "id": "def-public.IToasts.addInfo.$2", + "type": "Any", "tags": [], - "label": "defaultOverride", + "label": "options", "description": [], "signature": [ - "T | undefined" + "any" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, - "isRequired": false + "isRequired": true } ], "returnComment": [] }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.getAll", - "type": "Function", - "tags": [], - "label": "getAll", - "description": [ - "\nGets the metadata about all uiSettings, including the type, default value, and user value\nfor each key." - ], - "signature": [ - "() => Readonly>>" - ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.set", + "id": "def-public.IToasts.addSuccess", "type": "Function", "tags": [], - "label": "set", - "description": [ - "\nSets the value for a uiSetting. If the setting is not registered by any plugin\nit will be stored as a custom setting. The new value will be synchronously available via\nthe `get()` method and sent to the server in the background. If the request to the\nserver fails then a updateErrors$ will be notified and the setting will be\nreverted to its value before `set()` was called." - ], + "label": "addSuccess", + "description": [], "signature": [ - "(key: string, value: any) => Promise" + "(toastOrTitle: ", + "ToastInput", + ", options?: any) => ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.set.$1", - "type": "string", + "id": "def-public.IToasts.addSuccess.$1", + "type": "CompoundType", "tags": [], - "label": "key", + "label": "toastOrTitle", "description": [], "signature": [ - "string" + "ToastInput" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.set.$2", + "id": "def-public.IToasts.addSuccess.$2", "type": "Any", "tags": [], - "label": "value", + "label": "options", "description": [], "signature": [ "any" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true } @@ -4686,30 +4494,45 @@ }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.remove", + "id": "def-public.IToasts.addWarning", "type": "Function", "tags": [], - "label": "remove", - "description": [ - "\nRemoves the user-defined value for a setting, causing it to revert to the default. This\nmethod behaves the same as calling `set(key, null)`, including the synchronization, custom\nsetting, and error behavior of that method." - ], + "label": "addWarning", + "description": [], "signature": [ - "(key: string) => Promise" + "(toastOrTitle: ", + "ToastInput", + ", options?: any) => ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.remove.$1", - "type": "string", + "id": "def-public.IToasts.addWarning.$1", + "type": "CompoundType", "tags": [], - "label": "key", + "label": "toastOrTitle", "description": [], "signature": [ - "string" + "ToastInput" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.IToasts.addWarning.$2", + "type": "Any", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true } @@ -4718,30 +4541,45 @@ }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isDeclared", + "id": "def-public.IToasts.addDanger", "type": "Function", "tags": [], - "label": "isDeclared", - "description": [ - "\nReturns true if the key is a \"known\" uiSetting, meaning it is either registered\nby any plugin or was previously added as a custom setting via the `set()` method." - ], + "label": "addDanger", + "description": [], "signature": [ - "(key: string) => boolean" + "(toastOrTitle: ", + "ToastInput", + ", options?: any) => ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isDeclared.$1", - "type": "string", + "id": "def-public.IToasts.addDanger.$1", + "type": "CompoundType", "tags": [], - "label": "key", + "label": "toastOrTitle", "description": [], "signature": [ - "string" + "ToastInput" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.IToasts.addDanger.$2", + "type": "Any", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true } @@ -4750,54 +4588,87 @@ }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isDefault", + "id": "def-public.IToasts.addError", "type": "Function", "tags": [], - "label": "isDefault", - "description": [ - "\nReturns true if the setting has no user-defined value or is unknown" - ], + "label": "addError", + "description": [], "signature": [ - "(key: string) => boolean" + "(error: Error, options: ", + "ErrorToastOptions", + ") => ", + "Toast" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isDefault.$1", - "type": "string", + "id": "def-public.IToasts.addError.$1", + "type": "Object", "tags": [], - "label": "key", + "label": "error", "description": [], "signature": [ - "string" + "Error" ], - "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.IToasts.addError.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "ErrorToastOptions" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "isRequired": true } ], "returnComment": [] - }, + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient", + "type": "Interface", + "tags": [], + "label": "IUiSettingsClient", + "description": [ + "\nClient-side client that provides access to the advanced settings stored in elasticsearch.\nThe settings provide control over the behavior of the Kibana application.\nFor example, a user can specify how to display numeric or date fields.\nUsers can adjust the settings via Management UI.\n{@link IUiSettingsClient}\n" + ], + "signature": [ + "IUiSettingsClient" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isCustom", + "id": "def-public.IUiSettingsClient.get", "type": "Function", "tags": [], - "label": "isCustom", + "label": "get", "description": [ - "\nReturns true if the setting wasn't registered by any plugin, but was either\nadded directly via `set()`, or is an unknown setting found in the uiSettings saved\nobject" + "\nGets the value for a specific uiSetting. If this setting has no user-defined value\nthen the `defaultOverride` parameter is returned (and parsed if setting is of type\n\"json\" or \"number). If the parameter is not defined and the key is not registered\nby any plugin then an error is thrown, otherwise reads the default value defined by a plugin." ], "signature": [ - "(key: string) => boolean" + "(key: string, defaultOverride?: T | undefined) => T" ], "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isCustom.$1", + "id": "def-public.IUiSettingsClient.get.$1", "type": "string", "tags": [], "label": "key", @@ -4808,28 +4679,44 @@ "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.get.$2", + "type": "Uncategorized", + "tags": [], + "label": "defaultOverride", + "description": [], + "signature": [ + "T | undefined" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": false } ], "returnComment": [] }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isOverridden", + "id": "def-public.IUiSettingsClient.get$", "type": "Function", "tags": [], - "label": "isOverridden", + "label": "get$", "description": [ - "\nShows whether the uiSettings value set by the user." + "\nGets an observable of the current value for a config key, and all updates to that config\nkey in the future. Providing a `defaultOverride` argument behaves the same as it does in #get()" ], "signature": [ - "(key: string) => boolean" + "(key: string, defaultOverride?: T | undefined) => ", + "Observable", + "" ], "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", "deprecated": false, "children": [ { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.isOverridden.$1", + "id": "def-public.IUiSettingsClient.get$.$1", "type": "string", "tags": [], "label": "key", @@ -4840,23 +4727,39 @@ "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.get$.$2", + "type": "Uncategorized", + "tags": [], + "label": "defaultOverride", + "description": [], + "signature": [ + "T | undefined" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": false } ], "returnComment": [] }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.getUpdate$", + "id": "def-public.IUiSettingsClient.getAll", "type": "Function", "tags": [], - "label": "getUpdate$", + "label": "getAll", "description": [ - "\nReturns an Observable that notifies subscribers of each update to the uiSettings,\nincluding the key, newValue, and oldValue of the setting that changed." + "\nGets the metadata about all uiSettings, including the type, default value, and user value\nfor each key." ], "signature": [ - "() => ", - "Observable", - "<{ key: string; newValue: T; oldValue: T; }>" + "() => Readonly>>" ], "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", "deprecated": false, @@ -4865,369 +4768,308 @@ }, { "parentPluginId": "core", - "id": "def-public.IUiSettingsClient.getUpdateErrors$", + "id": "def-public.IUiSettingsClient.set", "type": "Function", "tags": [], - "label": "getUpdateErrors$", + "label": "set", "description": [ - "\nReturns an Observable that notifies subscribers of each error while trying to update\nthe settings, containing the actual Error class." + "\nSets the value for a uiSetting. If the setting is not registered by any plugin\nit will be stored as a custom setting. The new value will be synchronously available via\nthe `get()` method and sent to the server in the background. If the request to the\nserver fails then a updateErrors$ will be notified and the setting will be\nreverted to its value before `set()` was called." ], "signature": [ - "() => ", - "Observable", - "" + "(key: string, value: any) => Promise" ], "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", "deprecated": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-public.NotificationsSetup", - "type": "Interface", - "tags": [], - "label": "NotificationsSetup", - "description": [], - "path": "src/core/public/notifications/notifications_service.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "core", - "id": "def-public.NotificationsSetup.toasts", - "type": "Object", + "children": [ + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.set.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.set.$2", + "type": "Any", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.remove", + "type": "Function", "tags": [], - "label": "toasts", + "label": "remove", "description": [ - "{@link ToastsSetup}" + "\nRemoves the user-defined value for a setting, causing it to revert to the default. This\nmethod behaves the same as calling `set(key, null)`, including the synchronization, custom\nsetting, and error behavior of that method." ], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", + "(key: string) => Promise" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [ { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.remove.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + } ], - "path": "src/core/public/notifications/notifications_service.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-public.NotificationsStart", - "type": "Interface", - "tags": [], - "label": "NotificationsStart", - "description": [], - "path": "src/core/public/notifications/notifications_service.ts", - "deprecated": false, - "children": [ + "returnComment": [] + }, { "parentPluginId": "core", - "id": "def-public.NotificationsStart.toasts", - "type": "Object", + "id": "def-public.IUiSettingsClient.isDeclared", + "type": "Function", "tags": [], - "label": "toasts", + "label": "isDeclared", "description": [ - "{@link ToastsStart}" + "\nReturns true if the key is a \"known\" uiSetting, meaning it is either registered\nby any plugin or was previously added as a custom setting via the `set()` method." ], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", + "(key: string) => boolean" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [ { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isDeclared.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isDefault", + "type": "Function", + "tags": [], + "label": "isDefault", + "description": [ + "\nReturns true if the setting has no user-defined value or is unknown" + ], + "signature": [ + "(key: string) => boolean" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [ { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isDefault.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isCustom", + "type": "Function", + "tags": [], + "label": "isCustom", + "description": [ + "\nReturns true if the setting wasn't registered by any plugin, but was either\nadded directly via `set()`, or is an unknown setting found in the uiSettings saved\nobject" + ], + "signature": [ + "(key: string) => boolean" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [ { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isCustom.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isOverridden", + "type": "Function", + "tags": [], + "label": "isOverridden", + "description": [ + "\nShows whether the uiSettings value set by the user." + ], + "signature": [ + "(key: string) => boolean" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [ { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.isOverridden.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.getUpdate$", + "type": "Function", + "tags": [], + "label": "getUpdate$", + "description": [ + "\nReturns an Observable that notifies subscribers of each update to the uiSettings,\nincluding the key, newValue, and oldValue of the setting that changed." + ], + "signature": [ + "() => ", + "Observable", + "<{ key: string; newValue: T; oldValue: T; }>" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "core", + "id": "def-public.IUiSettingsClient.getUpdateErrors$", + "type": "Function", + "tags": [], + "label": "getUpdateErrors$", + "description": [ + "\nReturns an Observable that notifies subscribers of each error while trying to update\nthe settings, containing the actual Error class." + ], + "signature": [ + "() => ", + "Observable", + "" + ], + "path": "node_modules/@types/kbn__core-ui-settings-browser/index.d.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-public.NotificationsSetup", + "type": "Interface", + "tags": [], + "label": "NotificationsSetup", + "description": [], + "signature": [ + "NotificationsSetup" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-public.NotificationsSetup.toasts", + "type": "Object", + "tags": [], + "label": "toasts", + "description": [ + "{@link ToastsSetup}" + ], + "signature": [ + "IToasts" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-public.NotificationsStart", + "type": "Interface", + "tags": [], + "label": "NotificationsStart", + "description": [], + "signature": [ + "NotificationsStart" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-public.NotificationsStart.toasts", + "type": "Object", + "tags": [], + "label": "toasts", + "description": [ + "{@link ToastsStart}" + ], + "signature": [ + "IToasts" ], - "path": "src/core/public/notifications/notifications_service.ts", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false } ], @@ -9450,7 +9292,10 @@ "description": [ "\nOptions available for {@link IToasts} APIs." ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "signature": [ + "ToastOptions" + ], + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "children": [ { @@ -9465,7 +9310,7 @@ "signature": [ "number | undefined" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false } ], @@ -9894,222 +9739,60 @@ "tags": [], "label": "EventType", "description": [ - "\nEvent Type used for indexed structures. Only used to improve the readability of the types" - ], - "signature": [ - "string" - ], - "path": "node_modules/@types/kbn__analytics-client/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-public.ExecutionContextStart", - "type": "Type", - "tags": [], - "label": "ExecutionContextStart", - "description": [ - "\nSee {@link ExecutionContextSetup}." - ], - "signature": [ - "ExecutionContextSetup" - ], - "path": "node_modules/@types/kbn__core-execution-context-browser/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-public.FatalErrorsStart", - "type": "Type", - "tags": [], - "label": "FatalErrorsStart", - "description": [ - "\nFatalErrors stop the Kibana Public Core and displays a fatal error screen\nwith details about the Kibana build and the error.\n" - ], - "signature": [ - "FatalErrorsSetup" - ], - "path": "node_modules/@types/kbn__core-fatal-errors-browser/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-public.HttpStart", - "type": "Type", - "tags": [], - "label": "HttpStart", - "description": [ - "\nSee {@link HttpSetup}" - ], - "signature": [ - "HttpSetup" - ], - "path": "node_modules/@types/kbn__core-http-browser/index.d.ts", - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "core", - "id": "def-public.IToasts", - "type": "Type", - "tags": [], - "label": "IToasts", - "description": [ - "\nMethods for adding and removing global toast messages. See {@link ToastsApi}." - ], - "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "\nEvent Type used for indexed structures. Only used to improve the readability of the types" + ], + "signature": [ + "string" + ], + "path": "node_modules/@types/kbn__analytics-client/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-public.ExecutionContextStart", + "type": "Type", + "tags": [], + "label": "ExecutionContextStart", + "description": [ + "\nSee {@link ExecutionContextSetup}." + ], + "signature": [ + "ExecutionContextSetup" + ], + "path": "node_modules/@types/kbn__core-execution-context-browser/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-public.FatalErrorsStart", + "type": "Type", + "tags": [], + "label": "FatalErrorsStart", + "description": [ + "\nFatalErrors stop the Kibana Public Core and displays a fatal error screen\nwith details about the Kibana build and the error.\n" + ], + "signature": [ + "FatalErrorsSetup" + ], + "path": "node_modules/@types/kbn__core-fatal-errors-browser/index.d.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "core", + "id": "def-public.HttpStart", + "type": "Type", + "tags": [], + "label": "HttpStart", + "description": [ + "\nSee {@link HttpSetup}" + ], + "signature": [ + "HttpSetup" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-http-browser/index.d.ts", "deprecated": false, "initialIsOpen": false }, @@ -10420,7 +10103,7 @@ "MountPoint", " | undefined; } & { id: string; }" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "initialIsOpen": false }, @@ -10435,15 +10118,9 @@ ], "signature": [ "string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInputFields", - "text": "ToastInputFields" - } + "ToastInputFields" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "initialIsOpen": false }, @@ -10465,7 +10142,7 @@ "MountPoint", " | undefined; }" ], - "path": "src/core/public/notifications/toasts/toasts_api.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "initialIsOpen": false }, @@ -10479,155 +10156,9 @@ "\n{@link IToasts}" ], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "IToasts" ], - "path": "src/core/public/notifications/toasts/toasts_service.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "initialIsOpen": false }, @@ -10641,155 +10172,9 @@ "\n{@link IToasts}" ], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "IToasts" ], - "path": "src/core/public/notifications/toasts/toasts_service.tsx", + "path": "node_modules/@types/kbn__core-notifications-browser/index.d.ts", "deprecated": false, "initialIsOpen": false }, diff --git a/api_docs/core.mdx b/api_docs/core.mdx index 5f6983fb08334..ca5e3f2e97586 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github summary: API docs for the core plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2504 | 2 | 303 | 6 | +| 2524 | 2 | 297 | 6 | ## Client diff --git a/api_docs/core_application.mdx b/api_docs/core_application.mdx index 89f154a952360..3554ec1f1ee96 100644 --- a/api_docs/core_application.mdx +++ b/api_docs/core_application.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-application title: "core.application" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.application plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.application'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2504 | 2 | 303 | 6 | +| 2524 | 2 | 297 | 6 | ## Client diff --git a/api_docs/core_chrome.mdx b/api_docs/core_chrome.mdx index 09aa1597315cb..31dc1892a6cc0 100644 --- a/api_docs/core_chrome.mdx +++ b/api_docs/core_chrome.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-chrome title: "core.chrome" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.chrome plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.chrome'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2504 | 2 | 303 | 6 | +| 2524 | 2 | 297 | 6 | ## Client diff --git a/api_docs/core_saved_objects.mdx b/api_docs/core_saved_objects.mdx index 017298a22e0e1..c15f6bcdd6509 100644 --- a/api_docs/core_saved_objects.mdx +++ b/api_docs/core_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-savedObjects title: "core.savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.savedObjects plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.savedObjects'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- @@ -18,7 +18,7 @@ Contact [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) for que | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2504 | 2 | 303 | 6 | +| 2524 | 2 | 297 | 6 | ## Client diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 3c2d003a5e204..d101c3a8e08e9 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github summary: API docs for the customIntegrations plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 1d5f2f0a73f32..752e20b59bb3e 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboard plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 18847e2d413a0..e77bb7b2a0259 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboardEnhanced plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index a72ff2cccf82e..a218f7d6e6973 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -7121,13 +7121,7 @@ "label": "notifications", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsStart", - "text": "NotificationsStart" - } + "NotificationsStart" ], "path": "src/plugins/data/public/types.ts", "deprecated": false diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 07dfb0822c72c..efc0a059c8b4f 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github summary: API docs for the data plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 8c8cba6ae0215..cd29acebacd90 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.query plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index aefeaa99b6cb0..662b8aff44750 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.search plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index d7dea2baf99fa..7f287175200fd 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewEditor plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 45023cdd7197b..2fc3a98f45d43 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewFieldEditor plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index ac13b43a400b0..fa7c873f7f153 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewManagement plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 64ca08b80a64b..1cdb9bfdd01a8 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -16285,13 +16285,7 @@ ], "signature": [ "(toastInputFields: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInputFields", - "text": "ToastInputFields" - }, + "ToastInputFields", ", key: string) => void" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -16340,13 +16334,7 @@ ], "signature": [ "(error: Error, toastInputFields: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, + "ErrorToastOptions", ", key: string) => void" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -16374,13 +16362,7 @@ "label": "toastInputFields", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - } + "ErrorToastOptions" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false @@ -19998,13 +19980,7 @@ ], "signature": [ "(error: Error, toastInputFields: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, + "ErrorToastOptions", ", key: string) => void" ], "path": "src/plugins/data_views/common/types.ts", @@ -20036,13 +20012,7 @@ "Toast notif config" ], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - } + "ErrorToastOptions" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false @@ -20073,13 +20043,7 @@ ], "signature": [ "(toastInputFields: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInputFields", - "text": "ToastInputFields" - }, + "ToastInputFields", ", key: string) => void" ], "path": "src/plugins/data_views/common/types.ts", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 5aa73bbc80a54..cc9ba4dca7577 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViews plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 4a9a3ba062ffd..1ff99ea9da356 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataVisualizer plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 5e007d00bac7f..d00d4e159b165 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 578ff19356d97..e4808e964a684 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 61b33563f0d25..466eaa7c415b4 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team summary: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 3e5f08c39e7aa..d75e1eb30a634 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github summary: API docs for the devTools plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 1a5aacaa04f9d..0b0a037a44bfa 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github summary: API docs for the discover plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index e7437fd9ca914..0327447849b6e 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the discoverEnhanced plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/elastic_apm_synthtrace.mdx b/api_docs/elastic_apm_synthtrace.mdx index 41053ec3de2d6..c433b7f7b8e94 100644 --- a/api_docs/elastic_apm_synthtrace.mdx +++ b/api_docs/elastic_apm_synthtrace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/elastic-apm-synthtrace title: "@elastic/apm-synthtrace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @elastic/apm-synthtrace plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@elastic/apm-synthtrace'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 5ae299a246eed..ed0bc94fae658 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -227,13 +227,7 @@ "label": "notifications", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsStart", - "text": "NotificationsStart" - } + "NotificationsStart" ], "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", "deprecated": false, @@ -490,13 +484,7 @@ "label": "toasts", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - } + "IToasts" ], "path": "src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx", "deprecated": false, @@ -5453,13 +5441,7 @@ ">>; overlays: ", "OverlayStart", "; notifications: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsStart", - "text": "NotificationsStart" - }, + "NotificationsStart", "; SavedObjectFinder: React.ComponentType; showCreateNewMenu?: boolean | undefined; reportUiCounter?: ((appName: string, type: string, eventNames: string | string[], count?: number | undefined) => void) | undefined; theme: ", "ThemeServiceStart", "; }) => ", @@ -5684,13 +5666,7 @@ "label": "notifications", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsStart", - "text": "NotificationsStart" - } + "NotificationsStart" ], "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", "deprecated": false diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index ab320b80c973f..a4edec9095789 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddable plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 9efbac34c598f..35b6a2c452221 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddableEnhanced plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index cee6edb7ff07b..d978951dc5757 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the encryptedSavedObjects plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index ce4edbc18ad5a..d0d9356f0064d 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the enterpriseSearch plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 45aa29eed1284..33e5c12434af8 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github summary: API docs for the esUiShared plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index c40f82f0c2d4b..284ad3aba11d0 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventAnnotation plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/event_log.devdocs.json b/api_docs/event_log.devdocs.json index f5e74c98899b9..c31770f76221c 100644 --- a/api_docs/event_log.devdocs.json +++ b/api_docs/event_log.devdocs.json @@ -1123,7 +1123,7 @@ "label": "data", "description": [], "signature": [ - "(Readonly<{ error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; kibana?: Readonly<{ version?: string | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; es_search_duration_ms?: string | number | undefined; total_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; version?: string | undefined; description?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; original?: string | undefined; outcome?: string | undefined; created?: string | undefined; category?: string[] | undefined; url?: string | undefined; duration?: string | number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; severity?: string | number | undefined; dataset?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined)[]" + "(Readonly<{ error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; kibana?: Readonly<{ version?: string | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; es_search_duration_ms?: string | number | undefined; total_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; version?: string | undefined; description?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; original?: string | undefined; outcome?: string | undefined; created?: string | undefined; category?: string[] | undefined; duration?: string | number | undefined; code?: string | undefined; url?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; severity?: string | number | undefined; dataset?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined)[]" ], "path": "x-pack/plugins/event_log/server/es/cluster_client_adapter.ts", "deprecated": false @@ -1142,7 +1142,7 @@ "label": "IEvent", "description": [], "signature": [ - "DeepPartial | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; kibana?: Readonly<{ version?: string | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; es_search_duration_ms?: string | number | undefined; total_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; version?: string | undefined; description?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; original?: string | undefined; outcome?: string | undefined; created?: string | undefined; category?: string[] | undefined; url?: string | undefined; duration?: string | number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; severity?: string | number | undefined; dataset?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}>>> | undefined" + "DeepPartial | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; kibana?: Readonly<{ version?: string | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; es_search_duration_ms?: string | number | undefined; total_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; version?: string | undefined; description?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; original?: string | undefined; outcome?: string | undefined; created?: string | undefined; category?: string[] | undefined; duration?: string | number | undefined; code?: string | undefined; url?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; severity?: string | number | undefined; dataset?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}>>> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, @@ -1156,7 +1156,7 @@ "label": "IValidatedEvent", "description": [], "signature": [ - "Readonly<{ error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; kibana?: Readonly<{ version?: string | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; es_search_duration_ms?: string | number | undefined; total_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; version?: string | undefined; description?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; original?: string | undefined; outcome?: string | undefined; created?: string | undefined; category?: string[] | undefined; url?: string | undefined; duration?: string | number | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; severity?: string | number | undefined; dataset?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined" + "Readonly<{ error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; kibana?: Readonly<{ version?: string | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; execution?: Readonly<{ status?: string | undefined; metrics?: Readonly<{ number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_searches?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; es_search_duration_ms?: string | number | undefined; total_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; } & {}> | undefined; uuid?: string | undefined; status_order?: string | number | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; } & {}> | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; space_ids?: string[] | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; rule?: Readonly<{ id?: string | undefined; name?: string | undefined; version?: string | undefined; description?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; end?: string | undefined; original?: string | undefined; outcome?: string | undefined; created?: string | undefined; category?: string[] | undefined; duration?: string | number | undefined; code?: string | undefined; url?: string | undefined; action?: string | undefined; kind?: string | undefined; hash?: string | undefined; severity?: string | number | undefined; dataset?: string | undefined; ingested?: string | undefined; module?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; timezone?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; } & {}> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 3655183052e64..e50486e6e5231 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventLog plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index d301ea08dbb9a..5f754adf18440 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionError plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 90626319ae460..d98398812d82d 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionGauge plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 2042d19e61a7d..aa05c05e9a0e0 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionHeatmap plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index d922ca06e84cf..612baac6a6a9f 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionImage plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 6850fe5c05eed..81e1adad1323f 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionLegacyMetricVis plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 1c00a001d178a..25130d3d0b4fc 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetric plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 0d4db754982c4..eb999a8a66e61 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetricVis plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index acc8ebaf61ece..c61ac3a4259d7 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionPartitionVis plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 47665a2d3f9aa..fb9a4a4422c70 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRepeatImage plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 8260f1c798604..c3d8a1f9d652d 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRevealImage plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 6847d101abdea..00781d63a30cc 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionShape plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 124ea2c398cf7..b400b9312fa5e 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionTagcloud plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 84e42dafcbe2a..68b451ca8792d 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionXY plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index cf16c5849021f..0dc1eac769a1d 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressions plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 22926c287c381..407a5f5f20864 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github summary: API docs for the features plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 6ce3814fba5e3..9bb8ab63ac900 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github summary: API docs for the fieldFormats plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 16598805c0717..54da46ea37fc6 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github summary: API docs for the fileUpload plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 8a974e5519bec..b00d8173445b6 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github summary: API docs for the fleet plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index f67ca818b19c7..89a10946005aa 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the globalSearch plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 6f148fdb70e5f..8e820dc7bbb78 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github summary: API docs for the home plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 20dcf312b9954..ab7707ae8e977 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexLifecycleManagement plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index f63895e6a49e5..b5148d5f4d597 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexManagement plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 1ef063c216be0..abdf0a4af4537 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github summary: API docs for the infra plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index af4a853b99f55..bc16a847d27d4 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github summary: API docs for the inspector plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a07de0e53ea55..0c0b9be762f2f 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github summary: API docs for the interactiveSetup plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 4aa5b2d803cf3..5588146875bfa 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ace plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 69caf2f1c6423..a00d393681076 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-components plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 372823a7f7dbf..396c7e08ff29e 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index b59ad913baeb6..73711f104158b 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/alerts plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 4edfd8751a2b6..28f7c691b15e0 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index de3157df6e734..3c3723419acac 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-client plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 787f8529e1962..94a220feb7b9c 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 18a776272b814..a11583953352d 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 214b8f6dc2f0d..15bfa2fc9fb97 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 465693e0e11b6..ae6440ff275ed 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 0acdd79bcd325..f8c7d872f8146 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-config-loader plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 188f050a09839..83e1aaf0860fd 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index ea56098b1d9b0..2f820a9aca436 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/axe-config plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_bazel_packages.mdx b/api_docs/kbn_bazel_packages.mdx index e3a037886282b..118dc57256ab9 100644 --- a/api_docs/kbn_bazel_packages.mdx +++ b/api_docs/kbn_bazel_packages.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-bazel-packages title: "@kbn/bazel-packages" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/bazel-packages plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bazel-packages'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 8ec0989689968..d02de9302dc69 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-core plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 0ff83f5e2e782..90150789f5302 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 6d339dcdd922d..ae0cdf6cb213a 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 6894fe8b8f9fb..fc01da9ad6e52 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/cli-dev-mode plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index ba7dc8ddda267..390932d254e11 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/coloring plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index a25c2110a48ea..542721fe3875e 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index c2c15b6e4b561..aa7a247c154f6 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 93d4386a73c05..a504007b70560 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-schema plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 98b18c42fdaf9..598219f5775c7 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 700923be5b90c..0f17032f0c713 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index ba5dc86adc53b..67a170f223a88 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index b586130973892..2976e6e45ed69 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index bd0a9a9c08301..6ebadd052a416 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 9e7cc13d062a3..7b09c00f2cffa 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index d2cbec7759d3f..014f006c04fcf 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 9bf165e2bd9b3..af3a66cfdea79 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 15b0413dac423..09fcd38b7c61c 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 65eb3e1dcc00d..aec4d7538ed0b 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index c164e2c3ee800..a2f99aa2997eb 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-capabilities-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 6434a2a8ee081..545a96657ea92 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-capabilities-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 3b329fbe5a073..040e99b0933d7 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 3f31feb46f68d..7aafbd4f31b9a 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-config-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 1862d16b30774..cf5bd68a412d9 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 3fd073c6b8f80..d7ca3e6031ce0 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 32308d1901a85..c63cbe896a7b2 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 4d5b3a5988a26..c51507ce817a6 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 193aabbbe425c..a77080ac0166a 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index e0cb0e57b4195..48adeca75b1ca 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 0b36183ec3710..407a4474f80d2 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index bd3ac04f660a5..9fe075b2b34ab 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 6c68208317a3a..18fa3b0d123d5 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 738f8c40ffe88..c73921cf4a500 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index f368bf20969e3..4950796b15e34 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 10265ed9dc278..2c7d2f18e869a 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 6d1ebec165923..fda54b6181a05 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 45b350cdbc9f8..705e919b62eda 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 05d920c3b5d7d..ab5d995a900e9 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 727e1f4583284..91c630a8bd97b 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 0811f567dbd06..257ae4ece9d9c 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index ec01e94257bff..f791c2d89f834 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 7daf58bc398e8..8707ba4376b74 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 1c1ea0eb4016a..71c4562ecf653 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index ef63b3dc01123..9fd7a4996ee7f 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 189d625e41eb1..46edacf0cbb41 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index a25d27d6bf6e2..00d5d89dfe83a 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 89c75364ab79d..0cbf9bce01899 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 3b07a896f8606..b40359b85b0ec 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index fecf990463ed9..c353112964ef3 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index aca09e43891d0..12a827634f0f9 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 88996df514236..39068e5ab6f3d 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 3e12c832fb751..ea68a12cf82e5 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 6fb1e687d467a..da358e7559346 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 78b18c99e183f..88190b342d71e 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 0f81f4c1aa8f6..76278dc94f1a1 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 86d8965baa62d..cca0b4fe7c288 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index f102e297080f3..2ec281b7467b1 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 1953770e5948f..4c768c560e445 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index abf6ab9c5a437..ea39fc6b540c8 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index e72c904288607..f0d1b5249b6ff 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index c33f8421168e7..560b3616e2ebb 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 57e2863163e49..8c4efc7006c3d 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index a480c9eec92f0..ec7fad0ab942b 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 9a80dd528175e..1af3cb18cb84f 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index f68bcfa189c10..7d4643c8e0e7c 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 90996c9fca18d..4e170c839f16e 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 10b39e4aa6ada..f57b934fb84f4 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index c23a016876fc3..ee73272614945 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 0e6dccb51337c..c6f38730a59bb 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-metrics-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index da618567be470..6525e199da995 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-metrics-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index e3ec448f42940..9e541daf72d6c 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 43de0c58d95c9..e86b14d3d9d93 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-mount-utils-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_mount_utils_browser_internal.mdx b/api_docs/kbn_core_mount_utils_browser_internal.mdx index 300a5132bc473..257175c99343c 100644 --- a/api_docs/kbn_core_mount_utils_browser_internal.mdx +++ b/api_docs/kbn_core_mount_utils_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser-internal title: "@kbn/core-mount-utils-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-mount-utils-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index ffb95a1343e52..56f314592e549 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index e5163c197b6e2..f4a9c188606f7 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index bab1dd0e56ead..694933531c0b7 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_notifications_browser.devdocs.json b/api_docs/kbn_core_notifications_browser.devdocs.json new file mode 100644 index 0000000000000..f0a942c2a5226 --- /dev/null +++ b/api_docs/kbn_core_notifications_browser.devdocs.json @@ -0,0 +1,756 @@ +{ + "id": "@kbn/core-notifications-browser", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ErrorToastOptions", + "type": "Interface", + "tags": [], + "label": "ErrorToastOptions", + "description": [ + "\nOptions available for {@link IToasts} error APIs." + ], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ErrorToastOptions", + "text": "ErrorToastOptions" + }, + " extends ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastOptions", + "text": "ToastOptions" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ErrorToastOptions.title", + "type": "string", + "tags": [], + "label": "title", + "description": [ + "\nThe title of the toast and the dialog when expanding the message." + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ErrorToastOptions.toastMessage", + "type": "string", + "tags": [], + "label": "toastMessage", + "description": [ + "\nThe message to be shown in the toast. If this is not specified the error's\nmessage will be shown in the toast instead. Overwriting that message can\nbe used to provide more user-friendly toasts. If you specify this, the error\nmessage will still be shown in the detailed error modal." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts", + "type": "Interface", + "tags": [], + "label": "IToasts", + "description": [ + "\nMethods for adding and removing global toast messages. See {@link ToastsApi}." + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.get$", + "type": "Function", + "tags": [], + "label": "get$", + "description": [], + "signature": [ + "() => ", + "Observable", + "<", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + }, + "[]>" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.add", + "type": "Function", + "tags": [], + "label": "add", + "description": [], + "signature": [ + "(toastOrTitle: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + }, + ") => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.add.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.remove", + "type": "Function", + "tags": [], + "label": "remove", + "description": [], + "signature": [ + "(toastOrId: string | ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + }, + ") => void" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.remove.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrId", + "description": [], + "signature": [ + "string | ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addInfo", + "type": "Function", + "tags": [], + "label": "addInfo", + "description": [], + "signature": [ + "(toastOrTitle: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + }, + ", options?: any) => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addInfo.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addInfo.$2", + "type": "Any", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addSuccess", + "type": "Function", + "tags": [], + "label": "addSuccess", + "description": [], + "signature": [ + "(toastOrTitle: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + }, + ", options?: any) => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addSuccess.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addSuccess.$2", + "type": "Any", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addWarning", + "type": "Function", + "tags": [], + "label": "addWarning", + "description": [], + "signature": [ + "(toastOrTitle: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + }, + ", options?: any) => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addWarning.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addWarning.$2", + "type": "Any", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addDanger", + "type": "Function", + "tags": [], + "label": "addDanger", + "description": [], + "signature": [ + "(toastOrTitle: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + }, + ", options?: any) => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addDanger.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addDanger.$2", + "type": "Any", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addError", + "type": "Function", + "tags": [], + "label": "addError", + "description": [], + "signature": [ + "(error: Error, options: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ErrorToastOptions", + "text": "ErrorToastOptions" + }, + ") => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addError.$1", + "type": "Object", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "Error" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.IToasts.addError.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ErrorToastOptions", + "text": "ErrorToastOptions" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.NotificationsSetup", + "type": "Interface", + "tags": [], + "label": "NotificationsSetup", + "description": [], + "path": "packages/core/notifications/core-notifications-browser/src/contracts.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.NotificationsSetup.toasts", + "type": "Object", + "tags": [], + "label": "toasts", + "description": [ + "{@link ToastsSetup}" + ], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.IToasts", + "text": "IToasts" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/contracts.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.NotificationsStart", + "type": "Interface", + "tags": [], + "label": "NotificationsStart", + "description": [], + "path": "packages/core/notifications/core-notifications-browser/src/contracts.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.NotificationsStart.toasts", + "type": "Object", + "tags": [], + "label": "toasts", + "description": [ + "{@link ToastsStart}" + ], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.IToasts", + "text": "IToasts" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/contracts.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ToastOptions", + "type": "Interface", + "tags": [], + "label": "ToastOptions", + "description": [ + "\nOptions available for {@link IToasts} APIs." + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ToastOptions.toastLifeTimeMs", + "type": "number", + "tags": [], + "label": "toastLifeTimeMs", + "description": [ + "\nHow long should the toast remain on screen." + ], + "signature": [ + "number | undefined" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.Toast", + "type": "Type", + "tags": [], + "label": "Toast", + "description": [], + "signature": [ + "Pick<", + "Toast", + ", \"children\" | \"color\" | \"className\" | \"lang\" | \"style\" | \"role\" | \"tabIndex\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChange\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"hidden\" | \"security\" | \"defaultValue\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"translate\" | \"radioGroup\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"toastLifeTimeMs\" | \"iconType\" | \"onClose\"> & { title?: string | ", + "MountPoint", + " | undefined; text?: string | ", + "MountPoint", + " | undefined; } & { id: string; }" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ToastInput", + "type": "Type", + "tags": [], + "label": "ToastInput", + "description": [ + "\nInputs for {@link IToasts} APIs." + ], + "signature": [ + "string | ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInputFields", + "text": "ToastInputFields" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ToastInputFields", + "type": "Type", + "tags": [], + "label": "ToastInputFields", + "description": [ + "\nAllowed fields for {@link ToastInput}.\n" + ], + "signature": [ + "Pick<", + "Toast", + ", \"children\" | \"color\" | \"className\" | \"lang\" | \"style\" | \"role\" | \"tabIndex\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChange\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"hidden\" | \"security\" | \"defaultValue\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"translate\" | \"radioGroup\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"toastLifeTimeMs\" | \"iconType\" | \"onClose\"> & { title?: string | ", + "MountPoint", + " | undefined; text?: string | ", + "MountPoint", + " | undefined; }" + ], + "path": "packages/core/notifications/core-notifications-browser/src/types.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ToastsSetup", + "type": "Type", + "tags": [], + "label": "ToastsSetup", + "description": [ + "\n{@link IToasts}" + ], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.IToasts", + "text": "IToasts" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/contracts.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser", + "id": "def-common.ToastsStart", + "type": "Type", + "tags": [], + "label": "ToastsStart", + "description": [ + "\n{@link IToasts}" + ], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.IToasts", + "text": "IToasts" + } + ], + "path": "packages/core/notifications/core-notifications-browser/src/contracts.ts", + "deprecated": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx new file mode 100644 index 0000000000000..63917fc25e0d6 --- /dev/null +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -0,0 +1,30 @@ +--- +id: kibKbnCoreNotificationsBrowserPluginApi +slug: /kibana-dev-docs/api/kbn-core-notifications-browser +title: "@kbn/core-notifications-browser" +image: https://source.unsplash.com/400x175/?github +summary: API docs for the @kbn/core-notifications-browser plugin +date: 2022-08-02 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] +warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. +--- +import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; + + + +Contact [Owner missing] for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 35 | 4 | 23 | 0 | + +## Common + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_core_notifications_browser_internal.devdocs.json b/api_docs/kbn_core_notifications_browser_internal.devdocs.json new file mode 100644 index 0000000000000..55ef2da0b44e6 --- /dev/null +++ b/api_docs/kbn_core_notifications_browser_internal.devdocs.json @@ -0,0 +1,611 @@ +{ + "id": "@kbn/core-notifications-browser-internal", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService", + "type": "Class", + "tags": [], + "label": "NotificationsService", + "description": [], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService.setup", + "type": "Function", + "tags": [], + "label": "setup", + "description": [], + "signature": [ + "({ uiSettings }: ", + "SetupDeps", + ") => ", + "NotificationsSetup" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService.setup.$1", + "type": "Object", + "tags": [], + "label": "{ uiSettings }", + "description": [], + "signature": [ + "SetupDeps" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "({ i18n: i18nDep, overlays, theme, targetDomElement, }: ", + "StartDeps", + ") => ", + "NotificationsStart" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService.start.$1", + "type": "Object", + "tags": [], + "label": "{\n i18n: i18nDep,\n overlays,\n theme,\n targetDomElement,\n }", + "description": [], + "signature": [ + "StartDeps" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsService.stop", + "type": "Function", + "tags": [], + "label": "stop", + "description": [], + "signature": [ + "() => void" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi", + "type": "Class", + "tags": [], + "label": "ToastsApi", + "description": [ + "\nMethods for adding and removing global toast messages." + ], + "signature": [ + { + "pluginId": "@kbn/core-notifications-browser-internal", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserInternalPluginApi", + "section": "def-common.ToastsApi", + "text": "ToastsApi" + }, + " implements ", + "IToasts" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "deps", + "description": [], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.Unnamed.$1.uiSettings", + "type": "Object", + "tags": [], + "label": "uiSettings", + "description": [], + "signature": [ + "IUiSettingsClient" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.get$", + "type": "Function", + "tags": [], + "label": "get$", + "description": [ + "Observable of the toast messages to show to the user." + ], + "signature": [ + "() => ", + "Observable", + "<", + "Toast", + "[]>" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.add", + "type": "Function", + "tags": [], + "label": "add", + "description": [ + "\nAdds a new toast to current array of toast.\n" + ], + "signature": [ + "(toastOrTitle: ", + "ToastInput", + ") => ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.add.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [ + "- a {@link ToastInput }" + ], + "signature": [ + "ToastInput" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [ + "a {@link Toast }" + ] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.remove", + "type": "Function", + "tags": [], + "label": "remove", + "description": [ + "\nRemoves a toast from the current array of toasts if present." + ], + "signature": [ + "(toastOrId: string | ", + "Toast", + ") => void" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.remove.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrId", + "description": [ + "- a {@link Toast } returned by {@link ToastsApi.add } or its id" + ], + "signature": [ + "string | ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addInfo", + "type": "Function", + "tags": [], + "label": "addInfo", + "description": [ + "\nAdds a new toast pre-configured with the info color and info icon.\n" + ], + "signature": [ + "(toastOrTitle: ", + "ToastInput", + ", options?: ", + "ToastOptions", + " | undefined) => ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addInfo.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [ + "- a {@link ToastInput }" + ], + "signature": [ + "ToastInput" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addInfo.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "- a {@link ToastOptions }" + ], + "signature": [ + "ToastOptions", + " | undefined" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [ + "a {@link Toast }" + ] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addSuccess", + "type": "Function", + "tags": [], + "label": "addSuccess", + "description": [ + "\nAdds a new toast pre-configured with the success color and check icon.\n" + ], + "signature": [ + "(toastOrTitle: ", + "ToastInput", + ", options?: ", + "ToastOptions", + " | undefined) => ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addSuccess.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [ + "- a {@link ToastInput }" + ], + "signature": [ + "ToastInput" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addSuccess.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "- a {@link ToastOptions }" + ], + "signature": [ + "ToastOptions", + " | undefined" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [ + "a {@link Toast }" + ] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addWarning", + "type": "Function", + "tags": [], + "label": "addWarning", + "description": [ + "\nAdds a new toast pre-configured with the warning color and help icon.\n" + ], + "signature": [ + "(toastOrTitle: ", + "ToastInput", + ", options?: ", + "ToastOptions", + " | undefined) => ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addWarning.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [ + "- a {@link ToastInput }" + ], + "signature": [ + "ToastInput" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addWarning.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "- a {@link ToastOptions }" + ], + "signature": [ + "ToastOptions", + " | undefined" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [ + "a {@link Toast }" + ] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addDanger", + "type": "Function", + "tags": [], + "label": "addDanger", + "description": [ + "\nAdds a new toast pre-configured with the danger color and alert icon.\n" + ], + "signature": [ + "(toastOrTitle: ", + "ToastInput", + ", options?: ", + "ToastOptions", + " | undefined) => ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addDanger.$1", + "type": "CompoundType", + "tags": [], + "label": "toastOrTitle", + "description": [ + "- a {@link ToastInput }" + ], + "signature": [ + "ToastInput" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addDanger.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "- a {@link ToastOptions }" + ], + "signature": [ + "ToastOptions", + " | undefined" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [ + "a {@link Toast }" + ] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addError", + "type": "Function", + "tags": [], + "label": "addError", + "description": [ + "\nAdds a new toast that displays an exception message with a button to open the full stacktrace in a modal.\n" + ], + "signature": [ + "(error: Error, options: ", + "ErrorToastOptions", + ") => ", + "Toast" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addError.$1", + "type": "Object", + "tags": [], + "label": "error", + "description": [ + "- an `Error` instance." + ], + "signature": [ + "Error" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.ToastsApi.addError.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "- {@link ErrorToastOptions }" + ], + "signature": [ + "ErrorToastOptions" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [ + "a {@link Toast }" + ] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/core-notifications-browser-internal", + "id": "def-common.NotificationsServiceContract", + "type": "Type", + "tags": [], + "label": "NotificationsServiceContract", + "description": [], + "signature": [ + "{ setup: ({ uiSettings }: ", + "SetupDeps", + ") => ", + "NotificationsSetup", + "; start: ({ i18n: i18nDep, overlays, theme, targetDomElement, }: ", + "StartDeps", + ") => ", + "NotificationsStart", + "; stop: () => void; }" + ], + "path": "packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts", + "deprecated": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx new file mode 100644 index 0000000000000..b78200300e7cb --- /dev/null +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -0,0 +1,30 @@ +--- +id: kibKbnCoreNotificationsBrowserInternalPluginApi +slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal +title: "@kbn/core-notifications-browser-internal" +image: https://source.unsplash.com/400x175/?github +summary: API docs for the @kbn/core-notifications-browser-internal plugin +date: 2022-08-02 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] +warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. +--- +import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; + + + +Contact [Owner missing] for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 32 | 0 | 11 | 2 | + +## Common + +### Classes + + +### Consts, variables and types + + diff --git a/api_docs/kbn_core_notifications_browser_mocks.devdocs.json b/api_docs/kbn_core_notifications_browser_mocks.devdocs.json new file mode 100644 index 0000000000000..80fc3b1e2eb1a --- /dev/null +++ b/api_docs/kbn_core_notifications_browser_mocks.devdocs.json @@ -0,0 +1,96 @@ +{ + "id": "@kbn/core-notifications-browser-mocks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/core-notifications-browser-mocks", + "id": "def-server.notificationServiceMock", + "type": "Object", + "tags": [], + "label": "notificationServiceMock", + "description": [], + "path": "packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-notifications-browser-mocks", + "id": "def-server.notificationServiceMock.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "() => jest.Mocked<", + "NotificationsServiceContract", + ">" + ], + "path": "packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-mocks", + "id": "def-server.notificationServiceMock.createSetupContract", + "type": "Function", + "tags": [], + "label": "createSetupContract", + "description": [], + "signature": [ + "() => ", + "MockedKeys", + "<", + "NotificationsSetup", + ">" + ], + "path": "packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-notifications-browser-mocks", + "id": "def-server.notificationServiceMock.createStartContract", + "type": "Function", + "tags": [], + "label": "createStartContract", + "description": [], + "signature": [ + "() => ", + "MockedKeys", + "<", + "NotificationsStart", + ">" + ], + "path": "packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [] + } + ], + "initialIsOpen": false + } + ] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx new file mode 100644 index 0000000000000..a3a98e2c923e5 --- /dev/null +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -0,0 +1,27 @@ +--- +id: kibKbnCoreNotificationsBrowserMocksPluginApi +slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks +title: "@kbn/core-notifications-browser-mocks" +image: https://source.unsplash.com/400x175/?github +summary: API docs for the @kbn/core-notifications-browser-mocks plugin +date: 2022-08-02 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] +warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. +--- +import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; + + + +Contact [Owner missing] for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 4 | 0 | 4 | 0 | + +## Server + +### Objects + + diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 0fc9eb3bf4d68..3a661a5a092a9 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-overlays-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index c5e1919b235e1..83f5ad61b3b78 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index f195afbef710d..ed26b77c36983 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 976f1b2810cde..ca4ea2038d06d 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index db9aa2b1e6bd6..25c4c5a4c3129 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 5eb683773bfc8..c8784983fa110 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index e1f5bb0c6ee32..baa340ca7b52a 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 37b7766cfbcf7..d57535b3861fb 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-saved-objects-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 07c2ac3c34d0b..6a04089f7b320 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-saved-objects-server plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index be722ceddbe62..3e32cc7c4f63e 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 50149afe5e32e..3b51cf778279b 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index ecd40a16edb4c..e2923fdf40f24 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 45047a479760d..abfaac420e01f 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index e2c467e0147ac..e5fb7152fa13b 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index e8431425aa6e6..4e607a7ef56d4 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index bc82063191432..14543fe7c8734 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index b0ecedf6671b1..42d04a81f22e1 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 0646bc93ffba3..36f0fd22fd008 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 1fcba2399f3fa..77d20f0058d0f 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto-browser plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index bd8a40c27334c..4e91dc461996f 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/datemath plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index dabcb21a1cf8c..2db87fa12ffbf 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-errors plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 7f15298e29481..354c5dbbededc 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-runner plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 2adf0ddb820dd..662c732d89690 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-proc-runner plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index bf539824982c8..b57c692054dc6 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 2fd52514b9230..81d4176e98ae4 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/doc-links plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 93cbf8a633a45..3a85e633385f6 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/docs-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index da40e0ba4d875..336656dbf230d 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-archiver plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 5d885a0f14e24..9fa4aeb58db10 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-errors plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 2d53bf742d7ef..db4b9fe8d0cb8 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-query plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 310959d5d1c23..946191ce4944d 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index bcd98df6efe44..c16a05a23dbc5 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/field-types plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 005d8d18a795b..5feaea3a0249a 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/find-used-node-modules plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index c1df1f7509b40..4522fd86eb235 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/generate plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 0eecae16f008f..f4f105de1d277 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/get-repo-files plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index dc1d97a114e31..739432ec40528 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/handlebars plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index bf90e911d43bc..0ff27740e9731 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/hapi-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 21324ffa97343..bac0a5507a541 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/home-sample-data-card plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index d2400b51779a5..252925467f774 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/home-sample-data-tab plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index acaa7c4c4f6d1..cfb041617e975 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/i18n plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 328ec405bdf19..6153579fe7d3f 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/import-resolver plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 44215429df990..d4bb39876220a 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/interpreter plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 906ca58daabb9..eed1940b196a4 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/io-ts-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index b40f692c4d64a..01608c461ddec 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/jest-serializers plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_kibana_json_schema.mdx b/api_docs/kbn_kibana_json_schema.mdx index 6c371efaedcd9..6379951c7a08b 100644 --- a/api_docs/kbn_kibana_json_schema.mdx +++ b/api_docs/kbn_kibana_json_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-json-schema title: "@kbn/kibana-json-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/kibana-json-schema plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-json-schema'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 004c4dba185a8..aa569a6e6529f 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 48260404cfebd..6e97f3146b8b0 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 31e74a808a0db..8ca2f3b697bde 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/mapbox-gl plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 1cac5cd11d99e..8f277f36b8cfa 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-agg-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index c8bf113c3b49e..fa826510f6cb7 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 69a7d3d05f88f..74a8d981a7454 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-string-hash plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index ff62ac71be988..fb5cf53ee7b8a 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/monaco plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 5c7ebc17e7821..17052141d6c61 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index c42df5df5b26a..32dbf4dbbbfd6 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index ace1d1514f938..64d7f4c46e15f 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 35aa8f9895a5c..053ce9325a7b7 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-generator plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 63fd5ef7ccbcd..d1579a315c549 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-helpers plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index c192052ca283c..7f48f69d12ff3 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/react-field plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 83a6160a066a4..676bddec457ac 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/repo-source-classifier plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 939b237dd7e6d..f0d3d4531c81e 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/rule-data-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_scalability_simulation_generator.mdx b/api_docs/kbn_scalability_simulation_generator.mdx index 50b012a50db26..2c7bbea082ad4 100644 --- a/api_docs/kbn_scalability_simulation_generator.mdx +++ b/api_docs/kbn_scalability_simulation_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-scalability-simulation-generator title: "@kbn/scalability-simulation-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/scalability-simulation-generator plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scalability-simulation-generator'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index c3a20ad31a02b..2dae79544cf1d 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 0ea9159b42092..e5ca86c45a07a 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index ac80245913787..1518939df4b69 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 786f2660e2182..7cb67cdf82f84 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 09bf112ace0dc..0c7bb8a840f77 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index db1c5c645a785..895c18df1104b 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 1f420bf58e6a3..7a59ed0283b78 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 8feb4dd0c5a56..68745358c9c54 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index c399ce82626c9..1628676a4d465 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 33cacf53731eb..23b83e3fbe6f7 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 6190d4dfdab85..eba38a460a025 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 37fa1da7aaf98..566bfdd3c977f 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-rules plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_t_grid.devdocs.json b/api_docs/kbn_securitysolution_t_grid.devdocs.json index 123770c3ebbc6..f7aca912ab1e7 100644 --- a/api_docs/kbn_securitysolution_t_grid.devdocs.json +++ b/api_docs/kbn_securitysolution_t_grid.devdocs.json @@ -1726,7 +1726,7 @@ "label": "'threat.enrichments'", "description": [], "signature": [ - "({ 'matched.field': string[]; 'indicator.first_seen': string[]; 'indicator.provider': string[]; 'indicator.type': string[]; 'matched.atomic': string[]; lazer: { 'great.field': string[]; }[]; } | { 'matched.field': string[]; 'indicator.first_seen': string[]; 'indicator.provider': string[]; 'indicator.type': string[]; 'matched.atomic': string[]; lazer: { 'great.field': { wowoe: { fooooo: string[]; }[]; astring: string; aNumber: number; neat: boolean; }[]; }[]; })[]" + "({ 'matched.field': string[]; 'indicator.first_seen': string[]; 'indicator.provider': string[]; 'indicator.type': string[]; 'matched.atomic': string[]; lazer: { 'great.field': string[]; }[]; } | { 'matched.field': string[]; 'indicator.first_seen': string[]; 'indicator.provider': string[]; 'indicator.type': string[]; 'matched.atomic': string[]; lazer: { 'great.field': { wowoe: { fooooo: string[]; }[]; astring: string; aNumber: number; neat: boolean; }[]; }[]; } | { 'matched.field': string[]; 'matched.index': string[]; 'matched.type': string[]; 'matched.id': string[]; 'matched.atomic': string[]; })[]" ], "path": "packages/kbn-securitysolution-t-grid/src/mock/mock_event_details.ts", "deprecated": false diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 2b669ace558df..d3d35271eb3d3 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index f9b662e0c75ab..d5a21aed89d74 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index faae3c989f4b2..be5e1b5370b99 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-http-tools plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 7fec40a207626..f13fdaabfeecb 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-route-repository plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index 42bd03c25a468..bab18a59851da 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 639a638dbb9af..9507470b2e34c 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 4bf1eb9ac9978..aa1f3bfa046f6 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index b25d9705dc8eb..15da20d8a778e 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_components.mdx b/api_docs/kbn_shared_ux_components.mdx index 901400d915187..a6b3878d7111f 100644 --- a/api_docs/kbn_shared_ux_components.mdx +++ b/api_docs/kbn_shared_ux_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-components title: "@kbn/shared-ux-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-components plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-components'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index a85070981a948..6d03413da7c65 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 6e6e5bd2c294a..6b4460ce451b9 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 1b3036d2307e9..a8e7b36da63c8 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 031a5fea17fdc..9f29dea1ae182 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index dfaa83f2cc0ad..54ceae04e733c 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 4f0ddffb3aec0..0c79eb2174041 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 2b66dd3908a4b..4f0b11411bd43 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 609a0840787ac..c2ff3cd605c38 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_services.mdx b/api_docs/kbn_shared_ux_services.mdx index 55d451889ccf8..79789acf734b9 100644 --- a/api_docs/kbn_shared_ux_services.mdx +++ b/api_docs/kbn_shared_ux_services.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-services title: "@kbn/shared-ux-services" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-services plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-services'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_storybook.mdx b/api_docs/kbn_shared_ux_storybook.mdx index a586cc0ed70a9..0feff9b4cb25d 100644 --- a/api_docs/kbn_shared_ux_storybook.mdx +++ b/api_docs/kbn_shared_ux_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook title: "@kbn/shared-ux-storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-storybook plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index c42a5f5499e11..70621e0ac0206 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index ac0d1f1b80c4f..8c98ac2f8c217 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-utility plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index ac67d802711d7..0a158f307838c 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/some-dev-log plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 4e2fef83f9018..2b40ecc7ca2a8 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/sort-package-json plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 1475b212c28d5..a3234f9883791 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/std plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index b4b43f869cf79..095ed1cacf1c3 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 51a1088e390cf..a13f8dbb1b859 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/storybook plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 9170241078909..cb94062a977bd 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/telemetry-tools plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 38585dcb6d7bc..89cc5668897d6 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 1bf89163f6294..24330c0481802 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test-jest-helpers plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 4cae30f0ee335..a11209af702f0 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/tooling-log plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index b480fc03d0a41..0a1735ea2bad0 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index afd784d5fcdcf..7ad53b3c723ac 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer-core plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 8b9718543df2f..74d101d2ec44a 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/typed-react-router-config plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 6e11c1792ef8b..d310b539e5a17 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ui-theme plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 2c297f4243a46..dc6a54ef0608d 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 675b0ec0e8801..db315734a8e2d 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types-jest plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 8a611b3909d42..f41c6e5a64aee 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 9064fb1c7d036..c89930f973ae6 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 39af205896623..cad0c7ded2598 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaOverview plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index b898545971f4a..d0fe7574aed78 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3386,153 +3386,7 @@ "label": "toastNotifications", "description": [], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "IToasts" ], "path": "src/plugins/kibana_react/public/table_list_view/table_list_view.tsx", "deprecated": false @@ -4271,13 +4125,7 @@ " | undefined; i18n?: ", "I18nStart", " | undefined; notifications?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.NotificationsStart", - "text": "NotificationsStart" - }, + "NotificationsStart", " | undefined; overlays?: ", "OverlayStart", " | undefined; uiSettings?: ", diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index a17b784adcec1..9681ffa02cd7b 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaReact plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kibana_utils.devdocs.json b/api_docs/kibana_utils.devdocs.json index c9e6811dda262..3839c7eb3e7c4 100644 --- a/api_docs/kibana_utils.devdocs.json +++ b/api_docs/kibana_utils.devdocs.json @@ -1856,13 +1856,7 @@ "text": "AppUpdater" }, ">; toastNotifications: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - }, + "IToasts", "; history?: ", "History", " | undefined; getHistory?: (() => ", @@ -1970,153 +1964,7 @@ "\nToast notifications service to show toasts in error cases." ], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "IToasts" ], "path": "src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts", "deprecated": false @@ -3362,13 +3210,7 @@ " | undefined) => Promise; basePath: ", "IBasePath", "; mapping: string | Mapping; toastNotifications: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - }, + "IToasts", "; onBeforeRedirect?: ((error: ", { "pluginId": "kibanaUtils", @@ -3508,153 +3350,7 @@ "\nToast notifications service to show toasts in error cases." ], "signature": [ - "{ add: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; get$: () => ", - "Observable", - "<", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "[]>; remove: (toastOrId: string | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - ") => void; addSuccess: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addWarning: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addDanger: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addError: (error: Error, options: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ErrorToastOptions", - "text": "ErrorToastOptions" - }, - ") => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; addInfo: (toastOrTitle: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastInput", - "text": "ToastInput" - }, - ", options?: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.ToastOptions", - "text": "ToastOptions" - }, - " | undefined) => ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.Toast", - "text": "Toast" - }, - "; }" + "IToasts" ], "path": "src/plugins/kibana_utils/public/history/redirect_when_missing.tsx", "deprecated": false @@ -4389,13 +4085,7 @@ ], "signature": [ "(toasts: ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - }, + "IToasts", ") => { onGetError: (error: Error) => void; onSetError: (error: Error) => void; }" ], "path": "src/plugins/kibana_utils/public/state_management/url/errors.ts", @@ -4409,13 +4099,7 @@ "label": "toasts", "description": [], "signature": [ - { - "pluginId": "core", - "scope": "public", - "docId": "kibCorePluginApi", - "section": "def-public.IToasts", - "text": "IToasts" - } + "IToasts" ], "path": "src/plugins/kibana_utils/public/state_management/url/errors.ts", "deprecated": false, diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index f2252261cc9cf..46731521b5e47 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaUtils plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index fa87719a9e7e1..c3793063e42dd 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github summary: API docs for the kubernetesSecurity plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 2a139499ac8c4..a69f700c79a0b 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github summary: API docs for the lens plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 1979e4c675077..8fefb55c1a3d2 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseApiGuard plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index d38dd5494fc11..29b6a9f69c5f7 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseManagement plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 50977d9167ff6..9835b2fc10f16 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github summary: API docs for the licensing plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 9719efdb8ca30..e5bd56a335b87 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github summary: API docs for the lists plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 9be9b298ebadd..aca48e83dd9da 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github summary: API docs for the management plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 3f03fa86dd7fd..3676c5b23e0bf 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github summary: API docs for the maps plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 96165591fda43..69816cc6c7dbc 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github summary: API docs for the mapsEms plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 2bf0d6fc77aa1..b21bc41069cce 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github summary: API docs for the ml plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 62eb7c5aabfdb..e8b86219e5102 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoring plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 9db8e4708a8f1..fc310d9976218 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoringCollection plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 0baba786cdecb..d5beaa10d9c50 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github summary: API docs for the navigation plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 428c8f9c2dca3..69e2b42351ca1 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github summary: API docs for the newsfeed plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 4e2057964771d..3cbe5b374a867 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github summary: API docs for the observability plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 09c914f381b71..b6e9be3a78047 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github summary: API docs for the osquery plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index c1b974b19c6e5..5a3d052bc1ef1 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -3,7 +3,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory summary: Directory of public APIs available through plugins or packages. -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- @@ -12,13 +12,13 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 388 | 324 | 37 | +| 391 | 327 | 37 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 28647 | 171 | 19504 | 906 | +| 28740 | 175 | 19538 | 908 | ## Plugin Directory @@ -38,7 +38,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-posture-security) | The cloud security posture plugin | 18 | 0 | 2 | 3 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 13 | 0 | 13 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 207 | 0 | 199 | 7 | -| | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2504 | 2 | 303 | 6 | +| | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2524 | 2 | 297 | 6 | | crossClusterReplication | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 102 | 0 | 83 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 143 | 0 | 141 | 12 | @@ -139,7 +139,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 31 | 0 | 26 | 6 | | | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 1 | 0 | 1 | 0 | | | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 11 | 0 | 10 | 0 | -| | [Protections Experience Team](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 3 | 0 | 3 | 0 | +| | [Protections Experience Team](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 5 | 0 | 5 | 0 | | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 447 | 1 | 342 | 32 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [Kibana Localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | @@ -262,6 +262,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Owner missing] | - | 5 | 0 | 0 | 0 | | | [Owner missing] | - | 3 | 0 | 3 | 0 | | | [Owner missing] | - | 3 | 0 | 3 | 0 | +| | [Owner missing] | - | 35 | 4 | 23 | 0 | +| | [Owner missing] | - | 32 | 0 | 11 | 2 | +| | [Owner missing] | - | 4 | 0 | 4 | 0 | | | [Owner missing] | - | 63 | 0 | 35 | 0 | | | [Owner missing] | - | 1 | 0 | 1 | 0 | | | [Owner missing] | - | 3 | 0 | 3 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index cb4809b31517b..7cd378431dd60 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github summary: API docs for the presentationUtil plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index a0c20ee1a94a3..8c30734212309 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github summary: API docs for the remoteClusters plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 1ac6b99893282..1c426b834829e 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github summary: API docs for the reporting plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 3a15db4fbbeb1..1c4ff3d82a649 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github summary: API docs for the rollup plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index c8c66479018eb..f209b99ccf596 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github summary: API docs for the ruleRegistry plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 699cae826f9cb..96d76e5d76277 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github summary: API docs for the runtimeFields plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 18f525f0d6240..0c6f4e1fba94b 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjects plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index edae7e21230c4..df40d5365a388 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsManagement plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index d1df713bfb5c6..22fee3b96039d 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTagging plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 774746a82bb35..dc42937342426 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTaggingOss plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index ec6746c992b00..3a5fbf14172bf 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotMode plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 2d07c81433c6e..892c196a0d9c1 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotting plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 0b35e12e15248..b75b08420bcd0 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github summary: API docs for the security plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 1cb268f4d0d45..dd0f2971cc7f8 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github summary: API docs for the securitySolution plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index d11ca862d03f9..96b0c75810a45 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github summary: API docs for the sessionView plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/share.mdx b/api_docs/share.mdx index de01379d6885a..73a080ada1e9c 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github summary: API docs for the share plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/shared_u_x.mdx b/api_docs/shared_u_x.mdx index 41e418214f248..2dbb60229c381 100644 --- a/api_docs/shared_u_x.mdx +++ b/api_docs/shared_u_x.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sharedUX title: "sharedUX" image: https://source.unsplash.com/400x175/?github summary: API docs for the sharedUX plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sharedUX'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index f8e9c0ffbfd45..acabb0890ba8e 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github summary: API docs for the snapshotRestore plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index fd5e5fefd2425..49fdd96ed5fc3 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github summary: API docs for the spaces plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 94800ab38062c..9106b26b79402 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the stackAlerts plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 16e6868dd2067..0a353c8043158 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the taskManager plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 7209dec92deff..6d154f84284c7 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetry plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index e0cb6c67ccd3c..7842dbc6bc024 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionManager plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 4915719cba2f8..9b5bc25f99d17 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionXpack plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index ea18c4b484361..8b43a8360ba2a 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryManagementSection plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/threat_intelligence.devdocs.json b/api_docs/threat_intelligence.devdocs.json index dc72fbcc1107c..5676ee6eef155 100644 --- a/api_docs/threat_intelligence.devdocs.json +++ b/api_docs/threat_intelligence.devdocs.json @@ -34,7 +34,43 @@ "label": "getComponent", "description": [], "signature": [ - "() => React.VFC<{}>" + "() => (props: { securitySolutionContext: ", + { + "pluginId": "threatIntelligence", + "scope": "public", + "docId": "kibThreatIntelligencePluginApi", + "section": "def-public.ThreatIntelligenceSecuritySolutionContext", + "text": "ThreatIntelligenceSecuritySolutionContext" + }, + "; }) => React.ReactElement>" + ], + "path": "x-pack/plugins/threat_intelligence/public/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "threatIntelligence", + "id": "def-public.ThreatIntelligenceSecuritySolutionContext", + "type": "Interface", + "tags": [], + "label": "ThreatIntelligenceSecuritySolutionContext", + "description": [], + "path": "x-pack/plugins/threat_intelligence/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "threatIntelligence", + "id": "def-public.ThreatIntelligenceSecuritySolutionContext.getFiltersGlobalComponent", + "type": "Function", + "tags": [], + "label": "getFiltersGlobalComponent", + "description": [], + "signature": [ + "() => React.ComponentType<{ children: React.ReactNode; }>" ], "path": "x-pack/plugins/threat_intelligence/public/types.ts", "deprecated": false, diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index ef4c58e1821c2..3e401042b6e58 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github summary: API docs for the threatIntelligence plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- @@ -18,7 +18,7 @@ Contact [Protections Experience Team](https://github.com/orgs/elastic/teams/prot | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3 | 0 | 3 | 0 | +| 5 | 0 | 5 | 0 | ## Client diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 439fe1f5a8873..b5b2c2b530831 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github summary: API docs for the timelines plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 237b34d2afd03..86a163268356d 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github summary: API docs for the transform plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index b7a895e6aaf0b..0de01c3c23b40 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github summary: API docs for the triggersActionsUi plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 56860d7d3ed16..8d04f49730fab 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActions plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index f90ca9588eb0a..f05f207b17121 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActionsEnhanced plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 694f946f990a6..917a9cc64da89 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index b5db54cff6d61..0167cb5e9ef1b 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch.autocomplete plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 7f4eaa55323ea..bd000ec6910fb 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github summary: API docs for the urlForwarding plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index a8109800b46f2..62d03e6b20738 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the usageCollection plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index b3085640788f5..70cc5975a4787 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github summary: API docs for the ux plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 7d742fb32d347..227ccdaa94710 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the visDefaultEditor plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 190fe6a9c2caa..8f4fd1429c0d2 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeGauge plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 65d189e2dd1aa..bac959822e77a 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeHeatmap plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index f7f67227e7357..9edef645513d1 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypePie plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index b753d38083047..ead28e18e800c 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTable plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index ea824309f645f..92b710e1ad8af 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimelion plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index dcb5927061484..1df367c2fdf47 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimeseries plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index e5bb64d51cff9..9ee6b0dba2a2a 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVega plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 50377e9a6eea9..100450c5990f3 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVislib plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 710574f0dbec8..9f08fedb1e0b2 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeXy plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 251a801a956b1..919c8e3c600cb 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github summary: API docs for the visualizations plugin -date: 2022-08-01 +date: 2022-08-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- diff --git a/examples/search_examples/README.md b/examples/search_examples/README.md index 0ffd4b6cf96c6..15d7f079d1123 100644 --- a/examples/search_examples/README.md +++ b/examples/search_examples/README.md @@ -1,7 +1,10 @@ # search_examples - > An awesome Kibana plugin +Small demos of search functionality. + +To run this example, ensure you have data to search against (for example, the sample datasets) and start kibana with the `--run-examples` flag. + --- ## Development diff --git a/examples/search_examples/public/search/app.tsx b/examples/search_examples/public/search/app.tsx index c409403c47259..a84f39e75f671 100644 --- a/examples/search_examples/public/search/app.tsx +++ b/examples/search_examples/public/search/app.tsx @@ -34,7 +34,7 @@ import { import { lastValueFrom } from 'rxjs'; import { CoreStart } from '@kbn/core/public'; -import { mountReactNode } from '@kbn/core/public/utils'; +import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; import { @@ -232,7 +232,7 @@ export const SearchExamplesApp = ({ notifications.toasts.addSuccess( { title: 'Query result', - text: mountReactNode(message), + text: toMountPoint(message), }, { toastLifeTimeMs: 300000, @@ -241,7 +241,7 @@ export const SearchExamplesApp = ({ if (res.warning) { notifications.toasts.addWarning({ title: 'Warning', - text: mountReactNode(res.warning), + text: toMountPoint(res.warning), }); } } else if (isErrorResponse(res)) { @@ -315,7 +315,7 @@ export const SearchExamplesApp = ({ notifications.toasts.addSuccess( { title: 'Query result', - text: mountReactNode(message), + text: toMountPoint(message), }, { toastLifeTimeMs: 300000, diff --git a/package.json b/package.json index 204389c0d73d6..5c1c447c6db90 100644 --- a/package.json +++ b/package.json @@ -223,6 +223,9 @@ "@kbn/core-node-server": "link:bazel-bin/packages/core/node/core-node-server", "@kbn/core-node-server-internal": "link:bazel-bin/packages/core/node/core-node-server-internal", "@kbn/core-node-server-mocks": "link:bazel-bin/packages/core/node/core-node-server-mocks", + "@kbn/core-notifications-browser": "link:bazel-bin/packages/core/notifications/core-notifications-browser", + "@kbn/core-notifications-browser-internal": "link:bazel-bin/packages/core/notifications/core-notifications-browser-internal", + "@kbn/core-notifications-browser-mocks": "link:bazel-bin/packages/core/notifications/core-notifications-browser-mocks", "@kbn/core-overlays-browser": "link:bazel-bin/packages/core/overlays/core-overlays-browser", "@kbn/core-overlays-browser-internal": "link:bazel-bin/packages/core/overlays/core-overlays-browser-internal", "@kbn/core-overlays-browser-mocks": "link:bazel-bin/packages/core/overlays/core-overlays-browser-mocks", @@ -850,6 +853,9 @@ "@types/kbn__core-node-server": "link:bazel-bin/packages/core/node/core-node-server/npm_module_types", "@types/kbn__core-node-server-internal": "link:bazel-bin/packages/core/node/core-node-server-internal/npm_module_types", "@types/kbn__core-node-server-mocks": "link:bazel-bin/packages/core/node/core-node-server-mocks/npm_module_types", + "@types/kbn__core-notifications-browser": "link:bazel-bin/packages/core/notifications/core-notifications-browser/npm_module_types", + "@types/kbn__core-notifications-browser-internal": "link:bazel-bin/packages/core/notifications/core-notifications-browser-internal/npm_module_types", + "@types/kbn__core-notifications-browser-mocks": "link:bazel-bin/packages/core/notifications/core-notifications-browser-mocks/npm_module_types", "@types/kbn__core-overlays-browser": "link:bazel-bin/packages/core/overlays/core-overlays-browser/npm_module_types", "@types/kbn__core-overlays-browser-internal": "link:bazel-bin/packages/core/overlays/core-overlays-browser-internal/npm_module_types", "@types/kbn__core-overlays-browser-mocks": "link:bazel-bin/packages/core/overlays/core-overlays-browser-mocks/npm_module_types", @@ -1039,7 +1045,7 @@ "@types/resolve": "^1.20.1", "@types/rrule": "^2.2.9", "@types/seedrandom": ">=2.0.0 <4.0.0", - "@types/selenium-webdriver": "^4.1.1", + "@types/selenium-webdriver": "^4.1.2", "@types/semver": "^7", "@types/set-value": "^2.0.0", "@types/sinon": "^7.0.13", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 539c8d1412798..ad1c6d019d7a5 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -91,6 +91,9 @@ filegroup( "//packages/core/node/core-node-server-internal:build", "//packages/core/node/core-node-server-mocks:build", "//packages/core/node/core-node-server:build", + "//packages/core/notifications/core-notifications-browser-internal:build", + "//packages/core/notifications/core-notifications-browser-mocks:build", + "//packages/core/notifications/core-notifications-browser:build", "//packages/core/overlays/core-overlays-browser-internal:build", "//packages/core/overlays/core-overlays-browser-mocks:build", "//packages/core/overlays/core-overlays-browser:build", @@ -343,6 +346,9 @@ filegroup( "//packages/core/node/core-node-server-internal:build_types", "//packages/core/node/core-node-server-mocks:build_types", "//packages/core/node/core-node-server:build_types", + "//packages/core/notifications/core-notifications-browser-internal:build_types", + "//packages/core/notifications/core-notifications-browser-mocks:build_types", + "//packages/core/notifications/core-notifications-browser:build_types", "//packages/core/overlays/core-overlays-browser-internal:build_types", "//packages/core/overlays/core-overlays-browser-mocks:build_types", "//packages/core/overlays/core-overlays-browser:build_types", diff --git a/packages/core/notifications/core-notifications-browser-internal/BUILD.bazel b/packages/core/notifications/core-notifications-browser-internal/BUILD.bazel new file mode 100644 index 0000000000000..abd56b4433c75 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-internal/BUILD.bazel @@ -0,0 +1,134 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-notifications-browser-internal" +PKG_REQUIRE_NAME = "@kbn/core-notifications-browser-internal" + +SOURCE_FILES = glob( + [ + "src/**/*.ts", + "src/**/*.tsx", + ], + exclude = [ + "**/*.test.*", + "**/*.stories.*", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ + "@npm//react", + "@npm//react-dom", + "@npm//rxjs", + "@npm//lodash", + "@npm//@elastic/eui", + "@npm//enzyme", + "//packages/kbn-i18n", + "//packages/kbn-i18n-react", + "//packages/core/theme/core-theme-browser-internal", + "//packages/core/overlays/core-overlays-browser-mocks", + "//packages/core/theme/core-theme-browser-mocks", + "//packages/core/ui-settings/core-ui-settings-browser-mocks", + "//packages/core/mount-utils/core-mount-utils-browser-internal", +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//@types/react", + "@npm//@types/react-dom", + "@npm//rxjs", + "@npm//lodash", + "@npm//@elastic/eui", + "@npm//enzyme", + "//packages/kbn-i18n-react:npm_module_types", + "//packages/kbn-i18n:npm_module_types", + "//packages/kbn-utility-types:npm_module_types", + "//packages/core/theme/core-theme-browser:npm_module_types", + "//packages/core/theme/core-theme-browser-internal:npm_module_types", + "//packages/core/i18n/core-i18n-browser:npm_module_types", + "//packages/core/ui-settings/core-ui-settings-browser:npm_module_types", + "//packages/core/overlays/core-overlays-browser:npm_module_types", + "//packages/core/notifications/core-notifications-browser:npm_module_types", + "//packages/core/mount-utils/core-mount-utils-browser-internal:npm_module_types", +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +jsts_transpiler( + name = "target_web", + srcs = SRCS, + build_pkg_name = package_name(), + web = True, +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + root_dir = "src", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node", ":target_web"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/notifications/core-notifications-browser-internal/README.md b/packages/core/notifications/core-notifications-browser-internal/README.md new file mode 100644 index 0000000000000..53b526413d266 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-internal/README.md @@ -0,0 +1,3 @@ +# @kbn/core-notifications-browser-internal + +This package contains the implementation and internal types for core's browser-side notifications service. diff --git a/packages/core/notifications/core-notifications-browser-internal/jest.config.js b/packages/core/notifications/core-notifications-browser-internal/jest.config.js new file mode 100644 index 0000000000000..d9207a258dc6d --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-internal/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/core/notifications/core-notifications-browser-internal'], +}; diff --git a/packages/core/notifications/core-notifications-browser-internal/package.json b/packages/core/notifications/core-notifications-browser-internal/package.json new file mode 100644 index 0000000000000..c31bff466d522 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-internal/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-notifications-browser-internal", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "browser": "./target_web/index.js", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/src/core/public/notifications/index.ts b/packages/core/notifications/core-notifications-browser-internal/src/index.ts similarity index 52% rename from src/core/public/notifications/index.ts rename to packages/core/notifications/core-notifications-browser-internal/src/index.ts index e93ff5c751399..976caa1e10bb5 100644 --- a/src/core/public/notifications/index.ts +++ b/packages/core/notifications/core-notifications-browser-internal/src/index.ts @@ -5,16 +5,5 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -export { NotificationsService } from './notifications_service'; -export type { - ErrorToastOptions, - ToastOptions, - Toast, - ToastInput, - IToasts, - ToastsApi, - ToastInputFields, - ToastsSetup, - ToastsStart, -} from './toasts'; -export type { NotificationsSetup, NotificationsStart } from './notifications_service'; +export { NotificationsService, type NotificationsServiceContract } from './notifications_service'; +export type { ToastsApi } from './toasts'; diff --git a/src/core/public/notifications/notifications_service.ts b/packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts similarity index 87% rename from src/core/public/notifications/notifications_service.ts rename to packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts index 14137d81edf95..01d23f13784d4 100644 --- a/src/core/public/notifications/notifications_service.ts +++ b/packages/core/notifications/core-notifications-browser-internal/src/notifications_service.ts @@ -13,7 +13,9 @@ import type { ThemeServiceStart } from '@kbn/core-theme-browser'; import type { I18nStart } from '@kbn/core-i18n-browser'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { OverlayStart } from '@kbn/core-overlays-browser'; -import { ToastsService, ToastsSetup, ToastsStart } from './toasts'; +import type { NotificationsSetup, NotificationsStart } from '@kbn/core-notifications-browser'; +import type { PublicMethodsOf } from '@kbn/utility-types'; +import { ToastsService } from './toasts'; export interface SetupDeps { uiSettings: IUiSettingsClient; @@ -84,14 +86,7 @@ export class NotificationsService { } } -/** @public */ -export interface NotificationsSetup { - /** {@link ToastsSetup} */ - toasts: ToastsSetup; -} - -/** @public */ -export interface NotificationsStart { - /** {@link ToastsStart} */ - toasts: ToastsStart; -} +/** + * @public {@link NotificationsService} + */ +export type NotificationsServiceContract = PublicMethodsOf; diff --git a/src/core/public/notifications/toasts/__snapshots__/error_toast.test.tsx.snap b/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/error_toast.test.tsx.snap similarity index 100% rename from src/core/public/notifications/toasts/__snapshots__/error_toast.test.tsx.snap rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/error_toast.test.tsx.snap diff --git a/src/core/public/notifications/toasts/__snapshots__/global_toast_list.test.tsx.snap b/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/global_toast_list.test.tsx.snap similarity index 100% rename from src/core/public/notifications/toasts/__snapshots__/global_toast_list.test.tsx.snap rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/global_toast_list.test.tsx.snap diff --git a/src/core/public/notifications/toasts/__snapshots__/toasts_service.test.tsx.snap b/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/toasts_service.test.tsx.snap similarity index 100% rename from src/core/public/notifications/toasts/__snapshots__/toasts_service.test.tsx.snap rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/toasts_service.test.tsx.snap diff --git a/src/core/public/notifications/toasts/error_toast.test.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.test.tsx similarity index 100% rename from src/core/public/notifications/toasts/error_toast.test.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.test.tsx diff --git a/src/core/public/notifications/toasts/error_toast.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx similarity index 98% rename from src/core/public/notifications/toasts/error_toast.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx index bef4833d0097d..75db975d93721 100644 --- a/src/core/public/notifications/toasts/error_toast.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx @@ -21,7 +21,7 @@ import { import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import type { I18nStart } from '@kbn/core-i18n-browser'; -import { OverlayStart } from '../..'; +import type { OverlayStart } from '@kbn/core-overlays-browser'; interface ErrorToastProps { title: string; diff --git a/src/core/public/notifications/toasts/global_toast_list.test.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.test.tsx similarity index 85% rename from src/core/public/notifications/toasts/global_toast_list.test.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.test.tsx index 25cab35d0d120..77430aa951b11 100644 --- a/src/core/public/notifications/toasts/global_toast_list.test.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.test.tsx @@ -9,12 +9,12 @@ import { EuiGlobalToastList } from '@elastic/eui'; import { shallow } from 'enzyme'; import React from 'react'; -import * as Rx from 'rxjs'; +import { Observable, from, EMPTY } from 'rxjs'; import { GlobalToastList } from './global_toast_list'; function render(props: Partial = {}) { - return ; + return ; } it('renders matching snapshot', () => { @@ -29,7 +29,7 @@ it('subscribes to toasts$ on mount and unsubscribes on unmount', () => { }); const component = render({ - toasts$: new Rx.Observable(subscribeSpy), + toasts$: new Observable(subscribeSpy), }); expect(subscribeSpy).not.toHaveBeenCalled(); @@ -46,7 +46,7 @@ it('subscribes to toasts$ on mount and unsubscribes on unmount', () => { it('passes latest value from toasts$ to ', () => { const el = shallow( render({ - toasts$: Rx.from([[], [{ id: '1' }], [{ id: '1' }, { id: '2' }]]) as any, + toasts$: from([[], [{ id: '1' }], [{ id: '1' }, { id: '2' }]]) as any, }) ); diff --git a/src/core/public/notifications/toasts/global_toast_list.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx similarity index 87% rename from src/core/public/notifications/toasts/global_toast_list.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx index 6e1ab11601d7e..db700da12cf0a 100644 --- a/src/core/public/notifications/toasts/global_toast_list.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx @@ -8,14 +8,14 @@ import { EuiGlobalToastList, EuiGlobalToastListToast as EuiToast } from '@elastic/eui'; import React from 'react'; -import * as Rx from 'rxjs'; +import { Observable, type Subscription } from 'rxjs'; import { i18n } from '@kbn/i18n'; -import { MountWrapper } from '../../utils'; -import { Toast } from './toasts_api'; +import type { Toast } from '@kbn/core-notifications-browser'; +import { MountWrapper } from '@kbn/core-mount-utils-browser-internal'; interface Props { - toasts$: Rx.Observable; + toasts$: Observable; dismissToast: (toastId: string) => void; } @@ -34,7 +34,7 @@ export class GlobalToastList extends React.Component { toasts: [], }; - private subscription?: Rx.Subscription; + private subscription?: Subscription; public componentDidMount() { this.subscription = this.props.toasts$.subscribe((toasts) => { diff --git a/packages/core/notifications/core-notifications-browser-internal/src/toasts/index.ts b/packages/core/notifications/core-notifications-browser-internal/src/toasts/index.ts new file mode 100644 index 0000000000000..1d4dd09e67899 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { ToastsService } from './toasts_service'; +export type { ToastsApi } from './toasts_api'; diff --git a/src/core/public/notifications/toasts/toasts_api.test.ts b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.test.ts similarity index 100% rename from src/core/public/notifications/toasts/toasts_api.test.ts rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.test.ts diff --git a/src/core/public/notifications/toasts/toasts_api.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx similarity index 78% rename from src/core/public/notifications/toasts/toasts_api.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx index 3a75ab4323976..43e95b68ade20 100644 --- a/src/core/public/notifications/toasts/toasts_api.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_api.tsx @@ -6,70 +6,24 @@ * Side Public License, v 1. */ -import { EuiGlobalToastListToast as EuiToast } from '@elastic/eui'; import React from 'react'; import * as Rx from 'rxjs'; import { omitBy, isUndefined } from 'lodash'; import type { I18nStart } from '@kbn/core-i18n-browser'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; -import type { MountPoint } from '@kbn/core-mount-utils-browser'; import type { OverlayStart } from '@kbn/core-overlays-browser'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; +import type { + ErrorToastOptions, + IToasts, + Toast, + ToastInput, + ToastInputFields, + ToastOptions, +} from '@kbn/core-notifications-browser'; import { ErrorToast } from './error_toast'; -/** - * Allowed fields for {@link ToastInput}. - * - * @remarks - * `id` cannot be specified. - * - * @public - */ -export type ToastInputFields = Pick> & { - title?: string | MountPoint; - text?: string | MountPoint; -}; - -export type Toast = ToastInputFields & { - id: string; -}; - -/** - * Inputs for {@link IToasts} APIs. - * @public - */ -export type ToastInput = string | ToastInputFields; - -/** - * Options available for {@link IToasts} APIs. - * @public - */ -export interface ToastOptions { - /** - * How long should the toast remain on screen. - */ - toastLifeTimeMs?: number; -} - -/** - * Options available for {@link IToasts} error APIs. - * @public - */ -export interface ErrorToastOptions extends ToastOptions { - /** - * The title of the toast and the dialog when expanding the message. - */ - title: string; - /** - * The message to be shown in the toast. If this is not specified the error's - * message will be shown in the toast instead. Overwriting that message can - * be used to provide more user-friendly toasts. If you specify this, the error - * message will still be shown in the detailed error modal. - */ - toastMessage?: string; -} - const normalizeToast = (toastOrTitle: ToastInput): ToastInputFields => { if (typeof toastOrTitle === 'string') { return { @@ -79,15 +33,6 @@ const normalizeToast = (toastOrTitle: ToastInput): ToastInputFields => { return omitBy(toastOrTitle, isUndefined); }; -/** - * Methods for adding and removing global toast messages. See {@link ToastsApi}. - * @public - */ -export type IToasts = Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' | 'addInfo' ->; - /** * Methods for adding and removing global toast messages. * @public diff --git a/src/core/public/notifications/toasts/toasts_service.test.mocks.ts b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.test.mocks.ts similarity index 100% rename from src/core/public/notifications/toasts/toasts_service.test.mocks.ts rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.test.mocks.ts diff --git a/src/core/public/notifications/toasts/toasts_service.test.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.test.tsx similarity index 100% rename from src/core/public/notifications/toasts/toasts_service.test.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.test.tsx diff --git a/src/core/public/notifications/toasts/toasts_service.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.tsx similarity index 90% rename from src/core/public/notifications/toasts/toasts_service.tsx rename to packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.tsx index 40021e3654ce9..18c4804ca6066 100644 --- a/src/core/public/notifications/toasts/toasts_service.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/toasts_service.tsx @@ -15,7 +15,7 @@ import { CoreContextProvider } from '@kbn/core-theme-browser-internal'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { OverlayStart } from '@kbn/core-overlays-browser'; import { GlobalToastList } from './global_toast_list'; -import { ToastsApi, IToasts } from './toasts_api'; +import { ToastsApi } from './toasts_api'; interface SetupDeps { uiSettings: IUiSettingsClient; @@ -28,18 +28,6 @@ interface StartDeps { targetDomElement: HTMLElement; } -/** - * {@link IToasts} - * @public - */ -export type ToastsSetup = IToasts; - -/** - * {@link IToasts} - * @public - */ -export type ToastsStart = IToasts; - export class ToastsService { private api?: ToastsApi; private targetDomElement?: HTMLElement; diff --git a/packages/core/notifications/core-notifications-browser-internal/tsconfig.json b/packages/core/notifications/core-notifications-browser-internal/tsconfig.json new file mode 100644 index 0000000000000..d10eb479b3697 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-internal/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "rootDir": "src", + "stripInternal": false, + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "src/**/*" + ] +} diff --git a/packages/core/notifications/core-notifications-browser-mocks/BUILD.bazel b/packages/core/notifications/core-notifications-browser-mocks/BUILD.bazel new file mode 100644 index 0000000000000..374f15293b3ee --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-mocks/BUILD.bazel @@ -0,0 +1,103 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-notifications-browser-mocks" +PKG_REQUIRE_NAME = "@kbn/core-notifications-browser-mocks" + +SOURCE_FILES = glob( + [ + "src/**/*.ts", + ], + exclude = [ + "**/*.test.*", + "**/*.stories.*", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ + "@npm//rxjs", + "//packages/core/notifications/core-notifications-browser-internal", +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//rxjs", + "//packages/kbn-utility-types-jest:npm_module_types", + "//packages/core/notifications/core-notifications-browser:npm_module_types", + "//packages/core/notifications/core-notifications-browser-internal:npm_module_types" +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + root_dir = "src", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/notifications/core-notifications-browser-mocks/README.md b/packages/core/notifications/core-notifications-browser-mocks/README.md new file mode 100644 index 0000000000000..51054a5759eac --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-mocks/README.md @@ -0,0 +1,3 @@ +# @kbn/core-notifications-browser-mocks + +This package contains the mocks for core's browser-side notifications service. diff --git a/packages/core/notifications/core-notifications-browser-mocks/jest.config.js b/packages/core/notifications/core-notifications-browser-mocks/jest.config.js new file mode 100644 index 0000000000000..5ac9ef9af3f02 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-mocks/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/notifications/core-notifications-browser-mocks'], +}; diff --git a/packages/core/notifications/core-notifications-browser-mocks/package.json b/packages/core/notifications/core-notifications-browser-mocks/package.json new file mode 100644 index 0000000000000..08d2958e3c5eb --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-mocks/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/core-notifications-browser-mocks", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/core/notifications/core-notifications-browser-mocks/src/index.ts b/packages/core/notifications/core-notifications-browser-mocks/src/index.ts new file mode 100644 index 0000000000000..ec493cd01435a --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-mocks/src/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { notificationServiceMock } from './notifications_service.mock'; diff --git a/src/core/public/notifications/notifications_service.mock.ts b/packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts similarity index 81% rename from src/core/public/notifications/notifications_service.mock.ts rename to packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts index 01a2a4a1d5ac9..93520e227778a 100644 --- a/src/core/public/notifications/notifications_service.mock.ts +++ b/packages/core/notifications/core-notifications-browser-mocks/src/notifications_service.mock.ts @@ -6,14 +6,10 @@ * Side Public License, v 1. */ -import type { PublicMethodsOf } from '@kbn/utility-types'; import type { MockedKeys } from '@kbn/utility-types-jest'; -import { - NotificationsService, - NotificationsSetup, - NotificationsStart, -} from './notifications_service'; -import { toastsServiceMock } from './toasts/toasts_service.mock'; +import type { NotificationsSetup, NotificationsStart } from '@kbn/core-notifications-browser'; +import type { NotificationsServiceContract } from '@kbn/core-notifications-browser-internal'; +import { toastsServiceMock } from './toasts_service.mock'; const createSetupContractMock = () => { const setupContract: MockedKeys = { @@ -31,7 +27,6 @@ const createStartContractMock = () => { return startContract; }; -type NotificationsServiceContract = PublicMethodsOf; const createMock = () => { const mocked: jest.Mocked = { setup: jest.fn(), diff --git a/src/core/public/notifications/toasts/toasts_service.mock.ts b/packages/core/notifications/core-notifications-browser-mocks/src/toasts_service.mock.ts similarity index 93% rename from src/core/public/notifications/toasts/toasts_service.mock.ts rename to packages/core/notifications/core-notifications-browser-mocks/src/toasts_service.mock.ts index 19d88f590de2f..be1fbc348bf9a 100644 --- a/src/core/public/notifications/toasts/toasts_service.mock.ts +++ b/packages/core/notifications/core-notifications-browser-mocks/src/toasts_service.mock.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import type { IToasts } from '@kbn/core-notifications-browser'; import { Observable } from 'rxjs'; -import { IToasts } from './toasts_api'; const createToastsApiMock = () => { const api: jest.Mocked = { diff --git a/packages/core/notifications/core-notifications-browser-mocks/tsconfig.json b/packages/core/notifications/core-notifications-browser-mocks/tsconfig.json new file mode 100644 index 0000000000000..39d3c7097814a --- /dev/null +++ b/packages/core/notifications/core-notifications-browser-mocks/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "rootDir": "src", + "stripInternal": false, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "src/**/*" + ] +} diff --git a/packages/core/notifications/core-notifications-browser/BUILD.bazel b/packages/core/notifications/core-notifications-browser/BUILD.bazel new file mode 100644 index 0000000000000..32c20d28b3e78 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/BUILD.bazel @@ -0,0 +1,108 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-notifications-browser" +PKG_REQUIRE_NAME = "@kbn/core-notifications-browser" + +SOURCE_FILES = glob( + [ + "src/**/*.ts", + "src/**/*.tsx", + ], + exclude = [ + "**/*.test.*", + "**/*.stories.*", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//rxjs", + "@npm//@elastic/eui", + "//packages/core/mount-utils/core-mount-utils-browser:npm_module_types" +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +jsts_transpiler( + name = "target_web", + srcs = SRCS, + build_pkg_name = package_name(), + web = True, +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + root_dir = "src", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node", ":target_web"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/notifications/core-notifications-browser/README.md b/packages/core/notifications/core-notifications-browser/README.md new file mode 100644 index 0000000000000..9b72649544f89 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/README.md @@ -0,0 +1,3 @@ +# @kbn/core-notifications-browser + +This package contains the public types for core's browser-side notifications service. diff --git a/packages/core/notifications/core-notifications-browser/jest.config.js b/packages/core/notifications/core-notifications-browser/jest.config.js new file mode 100644 index 0000000000000..2f2e84fbf8f33 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/core/notifications/core-notifications-browser'], +}; diff --git a/packages/core/notifications/core-notifications-browser/package.json b/packages/core/notifications/core-notifications-browser/package.json new file mode 100644 index 0000000000000..c38afd1db5d49 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-notifications-browser", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "browser": "./target_web/index.js", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/core/notifications/core-notifications-browser/src/contracts.ts b/packages/core/notifications/core-notifications-browser/src/contracts.ts new file mode 100644 index 0000000000000..c89b4dc226e2b --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/src/contracts.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { IToasts } from './types'; + +/** + * {@link IToasts} + * @public + */ +export type ToastsSetup = IToasts; + +/** + * {@link IToasts} + * @public + */ +export type ToastsStart = IToasts; + +/** @public */ +export interface NotificationsSetup { + /** {@link ToastsSetup} */ + toasts: ToastsSetup; +} + +/** @public */ +export interface NotificationsStart { + /** {@link ToastsStart} */ + toasts: ToastsStart; +} diff --git a/src/core/public/notifications/toasts/index.ts b/packages/core/notifications/core-notifications-browser/src/index.ts similarity index 75% rename from src/core/public/notifications/toasts/index.ts rename to packages/core/notifications/core-notifications-browser/src/index.ts index 6681ca4a8e8f3..f64a7d56c65dc 100644 --- a/src/core/public/notifications/toasts/index.ts +++ b/packages/core/notifications/core-notifications-browser/src/index.ts @@ -6,14 +6,12 @@ * Side Public License, v 1. */ -export { ToastsService } from './toasts_service'; -export type { ToastsSetup, ToastsStart } from './toasts_service'; export type { ErrorToastOptions, ToastOptions, - ToastsApi, + Toast, ToastInput, IToasts, ToastInputFields, - Toast, -} from './toasts_api'; +} from './types'; +export type { ToastsSetup, ToastsStart, NotificationsSetup, NotificationsStart } from './contracts'; diff --git a/packages/core/notifications/core-notifications-browser/src/types.ts b/packages/core/notifications/core-notifications-browser/src/types.ts new file mode 100644 index 0000000000000..3b971df71fb62 --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/src/types.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import type { Observable } from 'rxjs'; +import type { EuiGlobalToastListToast as EuiToast } from '@elastic/eui'; +import type { MountPoint } from '@kbn/core-mount-utils-browser'; + +/** + * Allowed fields for {@link ToastInput}. + * + * @remarks + * `id` cannot be specified. + * + * @public + */ +export type ToastInputFields = Pick> & { + title?: string | MountPoint; + text?: string | MountPoint; +}; + +export type Toast = ToastInputFields & { + id: string; +}; + +/** + * Inputs for {@link IToasts} APIs. + * @public + */ +export type ToastInput = string | ToastInputFields; + +/** + * Options available for {@link IToasts} APIs. + * @public + */ +export interface ToastOptions { + /** + * How long should the toast remain on screen. + */ + toastLifeTimeMs?: number; +} + +/** + * Options available for {@link IToasts} error APIs. + * @public + */ +export interface ErrorToastOptions extends ToastOptions { + /** + * The title of the toast and the dialog when expanding the message. + */ + title: string; + /** + * The message to be shown in the toast. If this is not specified the error's + * message will be shown in the toast instead. Overwriting that message can + * be used to provide more user-friendly toasts. If you specify this, the error + * message will still be shown in the detailed error modal. + */ + toastMessage?: string; +} + +/** + * Methods for adding and removing global toast messages. See {@link ToastsApi}. + * @public + */ +export interface IToasts { + get$: () => Observable; + add: (toastOrTitle: ToastInput) => Toast; + remove: (toastOrId: Toast | string) => void; + addInfo: (toastOrTitle: ToastInput, options?: any) => Toast; + addSuccess: (toastOrTitle: ToastInput, options?: any) => Toast; + addWarning: (toastOrTitle: ToastInput, options?: any) => Toast; + addDanger: (toastOrTitle: ToastInput, options?: any) => Toast; + addError: (error: Error, options: ErrorToastOptions) => Toast; +} diff --git a/packages/core/notifications/core-notifications-browser/tsconfig.json b/packages/core/notifications/core-notifications-browser/tsconfig.json new file mode 100644 index 0000000000000..4c665fe2ba49a --- /dev/null +++ b/packages/core/notifications/core-notifications-browser/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "rootDir": "src", + "stripInternal": false, + "types": [ + "jest", + "node", + ] + }, + "include": [ + "src/**/*" + ] +} diff --git a/packages/elastic-apm-synthtrace/src/lib/utils/get_synthtrace_environment.ts b/packages/elastic-apm-synthtrace/src/lib/utils/get_synthtrace_environment.ts new file mode 100644 index 0000000000000..b7456be994b8b --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/lib/utils/get_synthtrace_environment.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import path from 'path'; + +export function getSynthtraceEnvironment(filename: string) { + return `Synthtrace: ${path.parse(filename).name}`; +} diff --git a/packages/elastic-apm-synthtrace/src/scenarios/aws_lambda.ts b/packages/elastic-apm-synthtrace/src/scenarios/aws_lambda.ts index 60d006b48340e..fb872afa44345 100644 --- a/packages/elastic-apm-synthtrace/src/scenarios/aws_lambda.ts +++ b/packages/elastic-apm-synthtrace/src/scenarios/aws_lambda.ts @@ -11,8 +11,9 @@ import { ApmFields } from '../lib/apm/apm_fields'; import { Scenario } from '../cli/scenario'; import { getLogger } from '../cli/utils/get_common_services'; import { RunOptions } from '../cli/utils/parse_run_cli_flags'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -const ENVIRONMENT = __filename; +const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions: RunOptions) => { const logger = getLogger(runOptions); diff --git a/packages/elastic-apm-synthtrace/src/scenarios/low_throughput.ts b/packages/elastic-apm-synthtrace/src/scenarios/low_throughput.ts index 0c4ff32418f9a..086fe9de5a027 100644 --- a/packages/elastic-apm-synthtrace/src/scenarios/low_throughput.ts +++ b/packages/elastic-apm-synthtrace/src/scenarios/low_throughput.ts @@ -13,8 +13,9 @@ import { Instance } from '../lib/apm/instance'; import { Scenario } from '../cli/scenario'; import { getLogger } from '../cli/utils/get_common_services'; import { RunOptions } from '../cli/utils/parse_run_cli_flags'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -const ENVIRONMENT = __filename; +const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions: RunOptions) => { const logger = getLogger(runOptions); diff --git a/packages/elastic-apm-synthtrace/src/scenarios/many_services.ts b/packages/elastic-apm-synthtrace/src/scenarios/many_services.ts index fbc73f58303f1..7651b0328c9af 100644 --- a/packages/elastic-apm-synthtrace/src/scenarios/many_services.ts +++ b/packages/elastic-apm-synthtrace/src/scenarios/many_services.ts @@ -7,14 +7,16 @@ */ import { random } from 'lodash'; + import { apm, timerange } from '..'; import { Instance } from '../lib/apm/instance'; import { Scenario } from '../cli/scenario'; import { getLogger } from '../cli/utils/get_common_services'; import { RunOptions } from '../cli/utils/parse_run_cli_flags'; import { ApmFields } from '../lib/apm/apm_fields'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -const ENVIRONMENT = __filename; +const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions: RunOptions) => { const logger = getLogger(runOptions); diff --git a/packages/elastic-apm-synthtrace/src/scenarios/simple_trace.ts b/packages/elastic-apm-synthtrace/src/scenarios/simple_trace.ts index 61b3fdcdba6ca..cccfc8becec24 100644 --- a/packages/elastic-apm-synthtrace/src/scenarios/simple_trace.ts +++ b/packages/elastic-apm-synthtrace/src/scenarios/simple_trace.ts @@ -12,8 +12,9 @@ import { Instance } from '../lib/apm/instance'; import { Scenario } from '../cli/scenario'; import { getLogger } from '../cli/utils/get_common_services'; import { RunOptions } from '../cli/utils/parse_run_cli_flags'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -const ENVIRONMENT = __filename; +const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions: RunOptions) => { const logger = getLogger(runOptions); diff --git a/packages/elastic-apm-synthtrace/src/scenarios/span_links.ts b/packages/elastic-apm-synthtrace/src/scenarios/span_links.ts index af0cd17f73d42..1f56a72570be2 100644 --- a/packages/elastic-apm-synthtrace/src/scenarios/span_links.ts +++ b/packages/elastic-apm-synthtrace/src/scenarios/span_links.ts @@ -10,8 +10,9 @@ import { compact, shuffle } from 'lodash'; import { apm, ApmFields, EntityArrayIterable, timerange } from '..'; import { generateLongId, generateShortId } from '../lib/utils/generate_id'; import { Scenario } from '../cli/scenario'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -const ENVIRONMENT = __filename; +const ENVIRONMENT = getSynthtraceEnvironment(__filename); function generateExternalSpanLinks() { // randomly creates external span links 0 - 10 diff --git a/packages/kbn-securitysolution-t-grid/src/mock/mock_event_details.ts b/packages/kbn-securitysolution-t-grid/src/mock/mock_event_details.ts index 8f756842e4b5b..3a20fb61a0023 100644 --- a/packages/kbn-securitysolution-t-grid/src/mock/mock_event_details.ts +++ b/packages/kbn-securitysolution-t-grid/src/mock/mock_event_details.ts @@ -78,6 +78,41 @@ export const eventHit = { }, ], }, + { + 'matched.field': ['host.name'], + 'matched.index': ['im'], + 'matched.type': ['indicator_match_rule'], + 'matched.id': ['FFEtSYIBZ61VHL7LvV2j'], + 'matched.atomic': ['MacBook-Pro-de-Gloria.local'], + }, + { + 'matched.field': ['host.hostname'], + 'matched.index': ['im'], + 'matched.type': ['indicator_match_rule'], + 'matched.id': ['E1EtSYIBZ61VHL7Ltl3m'], + 'matched.atomic': ['MacBook-Pro-de-Gloria.local'], + }, + { + 'matched.field': ['host.architecture'], + 'matched.index': ['im'], + 'matched.type': ['indicator_match_rule'], + 'matched.id': ['E1EtSYIBZ61VHL7Ltl3m'], + 'matched.atomic': ['x86_64'], + }, + { + 'matched.field': ['host.name'], + 'matched.index': ['im'], + 'matched.type': ['indicator_match_rule'], + 'matched.id': ['E1EtSYIBZ61VHL7Ltl3m'], + 'matched.atomic': ['MacBook-Pro-de-Gloria.local'], + }, + { + 'matched.field': ['host.hostname'], + 'matched.index': ['im'], + 'matched.type': ['indicator_match_rule'], + 'matched.id': ['CFErSYIBZ61VHL7LIV1N'], + 'matched.atomic': ['MacBook-Pro-de-Gloria.local'], + }, ], }, _source: {}, @@ -258,51 +293,109 @@ export const eventDetailsFormattedFields = [ { category: 'threat', field: 'threat.enrichments.matched.field', - values: ['matched_field', 'other_matched_field', 'matched_field_2'], - originalValue: ['matched_field', 'other_matched_field', 'matched_field_2'], isObjectArray: false, + originalValue: [ + 'matched_field', + 'other_matched_field', + 'matched_field_2', + 'host.name', + 'host.hostname', + 'host.architecture', + ], + values: [ + 'matched_field', + 'other_matched_field', + 'matched_field_2', + 'host.name', + 'host.hostname', + 'host.architecture', + ], }, { category: 'threat', field: 'threat.enrichments.indicator.first_seen', - values: ['2021-02-22T17:29:25.195Z'], - originalValue: ['2021-02-22T17:29:25.195Z'], isObjectArray: false, + originalValue: ['2021-02-22T17:29:25.195Z'], + values: ['2021-02-22T17:29:25.195Z'], }, { category: 'threat', field: 'threat.enrichments.indicator.provider', - values: ['yourself', 'other_you'], - originalValue: ['yourself', 'other_you'], isObjectArray: false, + originalValue: ['yourself', 'other_you'], + values: ['yourself', 'other_you'], }, { category: 'threat', field: 'threat.enrichments.indicator.type', - values: ['custom'], - originalValue: ['custom'], isObjectArray: false, + originalValue: ['custom'], + values: ['custom'], }, { category: 'threat', field: 'threat.enrichments.matched.atomic', - values: ['matched_atomic', 'matched_atomic_2'], - originalValue: ['matched_atomic', 'matched_atomic_2'], isObjectArray: false, + originalValue: ['matched_atomic', 'matched_atomic_2', 'MacBook-Pro-de-Gloria.local', 'x86_64'], + values: ['matched_atomic', 'matched_atomic_2', 'MacBook-Pro-de-Gloria.local', 'x86_64'], }, { category: 'threat', field: 'threat.enrichments.lazer', - values: [ + isObjectArray: true, + originalValue: [ '{"great.field":["grrrrr"]}', '{"great.field":["grrrrr_2"]}', '{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}', ], - originalValue: [ + values: [ '{"great.field":["grrrrr"]}', '{"great.field":["grrrrr_2"]}', '{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}', ], + }, + { + category: 'threat', + field: 'threat.enrichments.matched.index', + isObjectArray: false, + originalValue: ['im'], + values: ['im'], + }, + { + category: 'threat', + field: 'threat.enrichments.matched.type', + isObjectArray: false, + originalValue: ['indicator_match_rule'], + values: ['indicator_match_rule'], + }, + { + category: 'threat', + field: 'threat.enrichments.matched.id', + isObjectArray: false, + originalValue: ['FFEtSYIBZ61VHL7LvV2j', 'E1EtSYIBZ61VHL7Ltl3m', 'CFErSYIBZ61VHL7LIV1N'], + values: ['FFEtSYIBZ61VHL7LvV2j', 'E1EtSYIBZ61VHL7Ltl3m', 'CFErSYIBZ61VHL7LIV1N'], + }, + { + category: 'threat', + field: 'threat.enrichments', isObjectArray: true, + originalValue: [ + '{"matched.field":["matched_field","other_matched_field"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["yourself"],"indicator.type":["custom"],"matched.atomic":["matched_atomic"],"lazer":[{"great.field":["grrrrr"]},{"great.field":["grrrrr_2"]}]}', + '{"matched.field":["matched_field_2"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["other_you"],"indicator.type":["custom"],"matched.atomic":["matched_atomic_2"],"lazer":[{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["FFEtSYIBZ61VHL7LvV2j"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.architecture"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["x86_64"]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["CFErSYIBZ61VHL7LIV1N"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + ], + values: [ + '{"matched.field":["matched_field","other_matched_field"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["yourself"],"indicator.type":["custom"],"matched.atomic":["matched_atomic"],"lazer":[{"great.field":["grrrrr"]},{"great.field":["grrrrr_2"]}]}', + '{"matched.field":["matched_field_2"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["other_you"],"indicator.type":["custom"],"matched.atomic":["matched_atomic_2"],"lazer":[{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["FFEtSYIBZ61VHL7LvV2j"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.architecture"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["x86_64"]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["CFErSYIBZ61VHL7LIV1N"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + ], }, ]; diff --git a/packages/kbn-ui-framework/dist/kui_dark.min.css b/packages/kbn-ui-framework/dist/kui_dark.min.css new file mode 100644 index 0000000000000..a868c06c9b018 --- /dev/null +++ b/packages/kbn-ui-framework/dist/kui_dark.min.css @@ -0,0 +1 @@ +main{display:block}.kuiBar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px}.kuiBar,.kuiBarSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiBarSection{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiBarSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiBarSection:first-child{margin-left:0}.kuiBarSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiBarSection:only-child{margin-left:auto}.kuiBarSection>*+*{margin-left:10px}.kuiButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:4px;cursor:pointer;display:inline-block;font-size:16px;font-weight:400;height:30px;line-height:1.5;padding:4px 12px 5px;text-decoration:none}.kuiButton:disabled,a.kuiButton.kuiButton-isDisabled{cursor:not-allowed;opacity:.5}.kuiButton:enabled:active,a.kuiButton:not(.kuiButton-isDisabled):active{-webkit-transform:translateY(1px);transform:translateY(1px)}.kuiButton__inner{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiButton--small{font-size:12px;height:22px;padding:2px 8px 3px}.kuiButton--fullWidth{text-align:center;width:100%}.kuiButton--iconText .kuiButton__icon:first-child:not(:only-child){margin-right:8px}.kuiButton--iconText .kuiButton__icon:last-child:not(:only-child){margin-left:8px}.kuiButton--iconText.kuiButton--small .kuiButton__icon:first-child:not(:only-child){margin-right:4px}.kuiButton--iconText.kuiButton--small .kuiButton__icon:last-child:not(:only-child){margin-left:4px}.kuiButton--basic{background-color:#25262e;color:#dfe5ef}.kuiButton--basic:not(a):enabled:focus,a.kuiButton--basic:not(.kuiButton-isDisabled):focus{color:#dfe5ef}.kuiButton--basic:enabled:active,.kuiButton--basic:enabled:hover,a.kuiButton--basic:not(.kuiButton-isDisabled):active,a.kuiButton--basic:not(.kuiButton-isDisabled):hover{background-color:#0e0f12!important}.kuiButton--primary{background-color:#1ba9f5;color:#fff}.kuiButton--primary:not(a):enabled:focus,a.kuiButton--primary:not(.kuiButton-isDisabled):focus{color:#fff}.kuiButton--primary:enabled:active,.kuiButton--primary:enabled:hover,a.kuiButton--primary:not(.kuiButton-isDisabled):active,a.kuiButton--primary:not(.kuiButton-isDisabled):hover{background-color:#098dd4;color:#fff!important}.kuiButton--success{background-color:#7de2d1;color:#fff}.kuiButton--success:not(a):enabled:focus,a.kuiButton--success:not(.kuiButton-isDisabled):focus{color:#fff}.kuiButton--success:enabled:active,.kuiButton--success:enabled:hover,a.kuiButton--success:not(.kuiButton-isDisabled):active,a.kuiButton--success:not(.kuiButton-isDisabled):hover{background-color:#53d9c2;color:#fff!important}.kuiButton--danger{border:1px solid #f66;color:#f66}.kuiButton--danger:not(a):enabled:focus,a.kuiButton--danger:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #1d1e24,0 0 0 2px #f66;box-shadow:0 0 0 1px #1d1e24,0 0 0 2px #f66;color:#f66;outline:none!important;z-index:1}.kuiButton--danger:enabled:active,.kuiButton--danger:enabled:hover,a.kuiButton--danger:not(.kuiButton-isDisabled):active,a.kuiButton--danger:not(.kuiButton-isDisabled):hover{background-color:#ff66661a;border:1px solid #f33;color:#f33!important}.kuiButton--warning{background-color:#ffce7a;color:#fff}.kuiButton--warning:not(a):enabled:focus,a.kuiButton--warning:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #1d1e24,0 0 0 2px #ffce7a;box-shadow:0 0 0 1px #1d1e24,0 0 0 2px #ffce7a;color:#fff;outline:none!important;z-index:1}.kuiButton--warning:enabled:active,.kuiButton--warning:enabled:hover,a.kuiButton--warning:not(.kuiButton-isDisabled):active,a.kuiButton--warning:not(.kuiButton-isDisabled):hover{background-color:#ffbb47;color:#fff!important}.kuiButton--warning:disabled,a.kuiButton--warning.kuiButton-isDisabled{background-color:#ffe1ad}.kuiButton--hollow{background-color:initial;color:#1ba9f5!important}.kuiButton--hollow:enabled:active,.kuiButton--hollow:enabled:hover,a.kuiButton--hollow:not(.kuiButton-isDisabled):active,a.kuiButton--hollow:not(.kuiButton-isDisabled):hover{color:#098dd4!important;text-decoration:underline}.kuiButton--secondary{border:1px solid #1ba9f5;color:#1ba9f5!important}.kuiButton--secondary:enabled:active,.kuiButton--secondary:enabled:hover,a.kuiButton--secondary:not(.kuiButton-isDisabled):active,a.kuiButton--secondary:not(.kuiButton-isDisabled):hover{background-color:#1ba9f51a;border:1px solid #098dd4;color:#098dd4!important;text-decoration:underline}.kuiButtonGroup{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiButtonGroup .kuiButton+.kuiButton{margin-left:4px}.kuiButtonGroup--united>.kuiButton:not(:first-child):not(:last-child){border-radius:0}.kuiButtonGroup--united>.kuiButton:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.kuiButtonGroup--united>.kuiButton:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.kuiButtonGroup--united>.kuiButton:only-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px}.kuiButtonGroup--united .kuiButton+.kuiButton{margin-left:0}.kuiButtonGroup--fullWidth{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiButtonGroup--fullWidth>.kuiButton{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.eui-textCenter>.kuiButtonGroup,.text-center>.kuiButtonGroup{display:inline-block}.kuiCollapseButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;color:#dfe5ef!important;cursor:pointer;font-size:16px;line-height:1;opacity:.35;padding:4px}.kuiCollapseButton:hover{opacity:1}.kuiAssistedInput{display:inline-block;position:relative}.kuiAssistedInput__assistance{position:absolute;right:12px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.kuiCheckBox{-webkit-appearance:none;background-color:#16171c;border:1px solid #ffffff1a;border-radius:4px;font:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol!important;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol!important;font-size:10px!important;height:16px;line-height:1.5!important;margin:0!important;-webkit-transition:background-color .1s linear;transition:background-color .1s linear;width:16px}.kuiCheckBox:before{color:#fff;content:"\F00C";font-family:FontAwesome;font-size:1em;left:.25em;opacity:0;position:relative;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.kuiCheckBox:checked{background-color:#1ba9f5;border-color:#1ba9f5}.kuiCheckBox:checked:before{opacity:1}.kuiCheckBox:focus{-webkit-box-shadow:0 0 0 1px #1d1e24,0 0 0 2px #1ba9f5;box-shadow:0 0 0 1px #1d1e24,0 0 0 2px #1ba9f5;outline:none!important;z-index:1}.kuiCheckBox:disabled{background-color:#202128!important;border-color:#202128!important;cursor:not-allowed!important}.kuiCheckBoxLabel{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-weight:400!important;line-height:1.5}.kuiCheckBoxLabel__text{font-size:16px;margin-left:8px}.kuiLabel{font-weight:700;margin-bottom:0}.kuiLabel,.kuiSearchInput{font-size:16px;line-height:1.5}.kuiSearchInput{display:inline-block;position:relative;width:180px}.kuiSearchInput.kuiSearchInput-isInvalid .kuiSearchInput__input{border-color:#f66}.kuiSearchInput__icon{color:#535966;font-size:1em;left:.7em;position:absolute;top:.5em}.kuiSearchInput__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#16171c;border:1px solid #ffffff1a;border-radius:4px;color:#dfe5ef;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 12px 4px 28px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;width:100%}.kuiSearchInput__input:invalid{border-color:#f66}.kuiSearchInput__input:focus{border-color:#1ba9f5;outline:none}.kuiSearchInput__input:disabled{cursor:not-allowed;opacity:.4}.kuiSearchInput--small{width:60px}.kuiSearchInput--large{width:400px}.kuiSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#16171c;background-image:url('data:image/svg+xml;utf8,');background-position:calc(100% - 8px);background-repeat:no-repeat;background-size:14px;border:1px solid #ffffff1a;border-radius:4px;color:#dfe5ef;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 30px 4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiSelect:invalid{border-color:#f66}.kuiSelect:disabled{cursor:not-allowed;opacity:.4}.kuiSelect:-moz-focusring{text-shadow:0 0 0}.kuiSelect.kuiSelect-isInvalid{border-color:#f66}.kuiSelect:focus{border-color:#1ba9f5;-webkit-box-shadow:none;box-shadow:none;outline:none}.kuiSelect--small{width:60px}.kuiSelect--medium{width:180px}.kuiSelect--large{width:400px}.kuiStaticInput{background-color:initial;border:1px solid #0000}.kuiStaticInput,.kuiTextArea{-webkit-appearance:none;-moz-appearance:none;appearance:none;color:#dfe5ef;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;padding:4px 12px;width:180px}.kuiTextArea{background-color:#16171c;border:1px solid #ffffff1a;border-radius:4px;min-height:32px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiTextArea:invalid{border-color:#f66}.kuiTextArea:disabled{cursor:not-allowed;opacity:.4}.kuiTextArea:focus{border-color:#1ba9f5;-webkit-box-shadow:none;box-shadow:none;outline:none}.kuiTextArea.kuiTextArea-isInvalid{border-color:#f66}.kuiTextArea--nonResizable{resize:none}.kuiTextArea--small{width:60px}.kuiTextArea--large{width:400px}.kuiTextInput{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#16171c;border:1px solid #ffffff1a;border-radius:4px;color:#dfe5ef;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;width:180px}.kuiTextInput:invalid{border-color:#f66}.kuiTextInput:focus{border-color:#1ba9f5;outline:none}.kuiTextInput:disabled{cursor:not-allowed;opacity:.4}.kuiTextInput.kuiTextInput-isInvalid{border-color:#f66}.kuiTextInput--small{width:60px}.kuiTextInput--large{width:400px}.kuiFieldGroup{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiFieldGroup--alignTop{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.kuiFieldGroupSection{line-height:1.5}.kuiFieldGroupSection+.kuiFieldGroupSection{margin-left:10px}.kuiFieldGroupSection--wide{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.kuiFieldGroupSection--wide>*{width:100%}.kuiIcon{text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit}.kuiIcon--info{color:#1ba9f5}.kuiIcon--success{color:#7de2d1}.kuiIcon--warning{color:#ffce7a}.kuiIcon--error{color:#f66}.kuiIcon--inactive{color:#343741}.kuiIcon--basic{color:#98a2b3}.kuiInfoPanel{border:2px solid;line-height:1.5;padding:14px 20px 18px}.kuiInfoPanel--info{border-color:#1ba9f540}.kuiInfoPanel--success{border-color:#7de2d140}.kuiInfoPanel--warning{border-color:#ffce7a40}.kuiInfoPanel--error{border-color:#ff666640}.kuiInfoPanelHeader{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;align-items:baseline;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiInfoPanelHeader__icon{font-size:16px;line-height:1.5;margin-right:10px}.kuiInfoPanelHeader__title{font-size:16px;font-weight:700;line-height:1.5}.kuiInfoPanelBody,.kuiInfoPanelBody>*+*{margin-top:8px}.kuiInfoPanelBody__message{font-size:16px;line-height:1.5}.kuiLink{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;cursor:pointer;font-size:inherit;line-height:inherit;text-decoration:none}.kuiLink,.kuiLink:active,.kuiLink:visited{color:#1ba9f5}.kuiLink:hover{color:#098dd4;text-decoration:underline}.kuiLocalBreadcrumbs{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-ms-flex-positive:1;-ms-flex-preferred-size:100%;-webkit-align-items:center;align-items:center;background-color:#1d1e24;border-bottom:1px solid #343741;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;flex-basis:100%;-webkit-flex-grow:1;flex-grow:1;padding:12px 8px}.kuiLocalBreadcrumb{font-size:14px;font-weight:400;margin:0}.kuiLocalBreadcrumb+.kuiLocalBreadcrumb{margin-left:6px}.kuiLocalBreadcrumb+.kuiLocalBreadcrumb:before{color:#343741;content:"/";margin-right:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kuiLocalBreadcrumb__link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;color:#1ba9f5;cursor:pointer;font-size:inherit;font-size:16px;line-height:inherit;text-decoration:none}.kuiLocalBreadcrumb__link:active,.kuiLocalBreadcrumb__link:visited{color:#1ba9f5}.kuiLocalBreadcrumb__link:hover{color:#098dd4;text-decoration:underline}.kuiLocalBreadcrumb__emphasis{font-weight:700}.kuiDatePicker{background-color:initial;border-collapse:collapse;border-spacing:0;line-height:1.5}.kuiDatePickerNavigationCell{padding:0}.kuiDatePickerNavigation{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;justify-content:space-between;margin-bottom:4px}.kuiDatePickerNavigationButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;border-radius:4px;color:#dfe5ef;font-size:14px;padding:3px 6px}.kuiDatePickerNavigationButton:active,.kuiDatePickerNavigationButton:hover{background-color:#1ba9f5;color:#25262e;cursor:pointer}.kuiDatePickerNavigationButton:focus{-webkit-box-shadow:0 0 0 1px #0000,0 0 0 2px #1ba9f5;box-shadow:0 0 0 1px #0000,0 0 0 2px #1ba9f5;color:#dfe5ef;outline:none!important;z-index:1}.kuiDatePickerHeaderCell{color:#dfe5ef;font-size:14px;font-weight:700;line-height:1.2;padding:9px 0;text-align:center}.kuiDatePickerRowCell{padding:0;text-align:center}.kuiDatePickerRowCell.kuiDatePickerRowCell-isBlocked{cursor:not-allowed}.kuiDatePickerRowCell.kuiDatePickerRowCell-isBlocked .kuiDatePickerRowCellContent{pointer-events:none}.kuiDatePickerRowCellContent{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:1px solid #0000;border-radius:4px;color:#dfe5ef;font-size:14px;line-height:1.2;padding:8px;width:100%}.kuiDatePickerRowCellContent:focus{-webkit-box-shadow:0 0 0 1px #0000,0 0 0 2px #1ba9f5;box-shadow:0 0 0 1px #0000,0 0 0 2px #1ba9f5;color:#dfe5ef;outline:none!important;z-index:1}.kuiDatePickerRowCellContent:disabled{opacity:.5;pointer-events:none}.kuiDatePickerRowCellContent.kuiDatePickerRowCellContent-isOtherMonth{pointer-events:none;visibility:hidden}.kuiDatePickerRowCellContent.kuiDatePickerRowCellContent-isCurrent{color:#1ba9f5}.kuiDatePickerRowCellContent.kuiDatePickerRowCellContent-isSelected{background-color:#98a2b3;color:#dfe5ef}.kuiDatePickerRowCellContent:active,.kuiDatePickerRowCellContent:hover{background-color:#1ba9f5;color:#25262e;cursor:pointer}.kuiLocalDropdown{background-color:initial;line-height:20px;margin-bottom:10px;padding:10px 8px 14px;position:relative}.kuiLocalDropdownCloseButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;color:#dfe5ef!important;cursor:pointer;font-size:16px;line-height:1;opacity:.35;padding:4px;position:absolute;right:5px;top:1px}.kuiLocalDropdownCloseButton:hover{opacity:1}.kuiLocalDropdownPanels{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalDropdownPanel{-webkit-box-flex:1;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%}.kuiLocalDropdownPanel--left{margin-right:30px}.kuiLocalDropdownPanel--right{margin-left:30px}.kuiLocalDropdownTitle{color:#dfe5ef;font-size:18px;margin-bottom:12px;margin-top:0}.kuiLocalDropdownSection{margin-bottom:16px}.kuiLocalDropdownSection:last-child{margin-bottom:0}.kuiLocalDropdownHeader{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;justify-content:space-between;margin-bottom:6px}.kuiLocalDropdownHeader__label{color:#dfe5ef;font-size:14px;font-weight:700;margin-bottom:0}.kuiLocalDropdownHeader__actions{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalDropdownHeader__action{color:#1ba9f5;cursor:pointer;font-size:12px;text-decoration:none}.kuiLocalDropdownHeader__action+.kuiLocalDropdownHeader__action{margin-left:10px}.kuiLocalDropdownHeader__action:active,.kuiLocalDropdownHeader__action:hover{color:#098dd4}.kuiLocalDropdownInput{background-color:#16171c;border:1px solid #ffffff1a;border-radius:4px;color:#dfe5ef;display:block;font-size:14px;margin-bottom:12px;padding:5px 15px;width:100%}.kuiLocalDropdownInput:focus{border-color:#1ba9f5}.kuiLocalDropdownFormNote{color:#98a2b3;font-size:14px}.kuiLocalDropdownWarning{background-color:#1d1e24;border-left:2px solid #f66;color:#dfe5ef;font-size:14px;margin-bottom:16px;padding:6px 10px}.kuiLocalDropdownHelpText{color:#98a2b3;font-size:14px;margin-bottom:16px}.kuiLocalMenu{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;padding-bottom:8px;padding-top:8px}.kuiLocalMenu,.kuiLocalMenuItem{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalMenuItem{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:initial;border:0;border-bottom:2px solid #0000;color:#dfe5ef;cursor:pointer;font-size:16px;padding:2px 8px}.kuiLocalMenuItem:focus,.kuiLocalMenuItem:hover{background-color:#1ba9f526;text-decoration:underline}.kuiLocalMenuItem.kuiLocalMenuItem-isSelected{background-color:initial;border-color:#1ba9f5;color:#1ba9f5;z-index:2}.kuiLocalMenuItem.kuiLocalMenuItem-isSelected:focus,.kuiLocalMenuItem.kuiLocalMenuItem-isSelected:hover{text-decoration:none}.kuiLocalMenuItem.kuiLocalMenuItem-isDisabled{cursor:not-allowed;opacity:.5}.kuiLocalMenuItem.kuiLocalMenuItem-isDisabled:hover{background-color:initial;text-decoration:none}.kuiLocalMenuItem__icon{margin-bottom:-1px;margin-right:5px}.kuiLocalNav{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:#1d1e24;border-bottom:1px solid #343741;color:#dfe5ef;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;line-height:1.5;min-height:69px}.kuiLocalNav,.kuiLocalNavRow{-webkit-box-pack:justify;-ms-flex-pack:justify;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;justify-content:space-between}.kuiLocalNavRow,.kuiLocalNavRow__section{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.kuiLocalNavRow__section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalNavRow--secondary{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;padding:0 8px}.kuiLocalSearch{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:8px;width:100%}.kuiLocalSearchInput{-webkit-box-flex:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#16171c;border:1px solid #343741;border-radius:4px;border-radius:4px 0 0 4px;color:#dfe5ef;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiLocalSearchInput:invalid{border-color:#f66}.kuiLocalSearchInput:focus{border-color:#1ba9f5;outline:none}.kuiLocalSearchInput:disabled{cursor:not-allowed;opacity:.4}.kuiLocalSearchInput:focus{-webkit-box-shadow:none;box-shadow:none}.kuiLocalSearchInput.kuiLocalSearchInput-isInvalid{border-color:#f66}.kuiLocalSearchInput--secondary{-webkit-box-flex:0;border-left-width:0;border-radius:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;height:32px}.kuiLocalSearchAssistedInput{-webkit-box-flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;position:relative}.kuiLocalSearchAssistedInput__input,.kuiLocalSearchInput{padding-right:6em}.kuiLocalSearchAssistedInput__assistance{position:absolute;right:6px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:2}.kuiLocalSearchSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#16171c;background-image:url('data:image/svg+xml;utf8,');background-position:calc(100% - 8px);background-repeat:no-repeat;background-size:14px;border:1px solid #ffffff1a;border-left-width:0;border-radius:4px;border-radius:0;color:#dfe5ef;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 30px 4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiLocalSearchSelect:invalid{border-color:#f66}.kuiLocalSearchSelect:focus{border-color:#1ba9f5;outline:none}.kuiLocalSearchSelect:disabled{cursor:not-allowed;opacity:.4}.kuiLocalSearchSelect:-moz-focusring{text-shadow:0 0 0}.kuiLocalSearchButton{background-color:#1ba9f5;border:0;border-radius:0 4px 4px 0;color:#fff;font-size:16px;height:32px;line-height:0;width:43px}.kuiLocalSearchButton:focus{-webkit-box-shadow:0 0 0 1px #343741,0 0 0 2px #1ba9f5;box-shadow:0 0 0 1px #343741,0 0 0 2px #1ba9f5;outline:none!important;z-index:1}.kuiLocalTabs{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%}.kuiLocalTab{border-bottom:2px solid #0000;color:#d4dae5;cursor:pointer;font-size:18px;margin-bottom:0!important;margin-top:0!important;padding:5px 0 6px;text-decoration:none}.kuiLocalTab:active:not(.kuiLocalTab-isDisabled),.kuiLocalTab:hover:not(.kuiLocalTab-isDisabled){color:#1ba9f5}.kuiLocalTab.kuiLocalTab-isSelected{border-bottom-color:#1ba9f5;color:#1ba9f5;cursor:default}.kuiLocalTab.kuiLocalTab-isDisabled{cursor:default;opacity:.5}.kuiLocalTab+.kuiLocalTab{margin-left:15px}.kuiLocalTitle{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-ms-flex-positive:1;-ms-flex-preferred-size:100%;-webkit-align-items:center;align-items:center;background-color:#1d1e24;border-bottom:1px solid #343741;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;flex-basis:100%;-webkit-flex-grow:1;flex-grow:1;font-size:16px;font-weight:700;padding:12px 8px}.kuiLocalTitle:empty{display:none;padding:0}.kuiPager{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiPager>*+*{margin-left:10px}.kuiPagerText{color:#98a2b3;font-size:16px;line-height:1.5;white-space:nowrap}.kuiPanel{background-color:#1d1e24;border:1px solid #343741;border-radius:4px;-webkit-box-shadow:0 2px 2px -1px #0000004d,0 1px 5px -2px #0000004d;box-shadow:0 2px 2px -1px #0000004d,0 1px 5px -2px #0000004d}.kuiPanel--prompt{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;min-height:300px;text-align:center}.kuiPanel--prompt .kuiPanelBody{max-width:500px;padding:30px}.kuiPanel--noBorder{border:none}.kuiPanel--withToolBar{border-radius:0;border-top:none}.kuiPanel--centered{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiPanel--centered,.kuiPanelHeader{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiPanelHeader{-webkit-box-pack:justify;-ms-flex-pack:justify;border-bottom:1px solid #343741;height:50px;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px;padding:10px}.kuiPanelHeader .kuiButton:not(a):enabled:focus,a.kuiPanelHeader .kuiButton:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #343741,0 0 0 2px #1ba9f5;box-shadow:0 0 0 1px #343741,0 0 0 2px #1ba9f5;outline:none!important;z-index:1}.kuiPanelHeader .kuiButton--danger:not(a):enabled:focus,a.kuiPanelHeader .kuiButton--danger:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #343741,0 0 0 2px #f66;box-shadow:0 0 0 1px #343741,0 0 0 2px #f66;outline:none!important;z-index:1}.kuiPanelHeader .kuiSelect{border-color:#16171c}.kuiPanelHeader .kuiSelect:not(a):enabled:focus,a.kuiPanelHeader .kuiSelect:not(.kuiButton-isDisabled):focus{border-color:#1ba9f5;outline:none}.kuiPanelHeader__title{font-size:20px;line-height:1.5;margin:0}.kuiPanelHeaderSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiPanelHeaderSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiPanelHeaderSection:first-child{margin-left:0}.kuiPanelHeaderSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiPanelHeaderSection:only-child{margin-left:auto}.kuiPanelHeaderSection>*+*{margin-left:10px}.kuiPanelHeaderSection:only-child{margin-left:0;margin-right:auto}.kuiPanelBody{padding:10px}.kuiEmptyTablePrompt{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:30px}.kuiEmptyTablePrompt__message{color:#98a2b3;font-size:20px;line-height:1.5}.kuiEmptyTablePrompt__actions{margin-top:10px}.kuiStatusText{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;align-items:baseline;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.kuiStatusText--info{color:#1ba9f5}.kuiStatusText--success{color:#7de2d1}.kuiStatusText--warning{color:#ffce7a}.kuiStatusText--error{color:#f66}.kuiStatusText__icon{margin-right:6px;max-height:1.15em;width:1.15em}.kuiControlledTable{background:#1d1e24}.kuiControlledTable .kuiMenu--contained,.kuiControlledTable .kuiTable,.kuiControlledTable .kuiToolBarFooter{border-top:none}.kuiTable{background-color:#1d1e24;border:1px solid #343741;border-collapse:collapse;width:100%}.kuiTable--fluid{width:auto}.kuiTable--fluid .kuiTableHeaderCell,.kuiTable--fluid .kuiTableRowCell{max-width:none}.kuiTableHeaderCell{color:#98a2b3;font-size:16px;font-weight:400;line-height:1.5;max-width:20px;text-align:left}.kuiTableHeaderCell__liner{display:inline-block;padding:7px 8px 8px}.kuiTableHeaderCellButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;line-height:inherit;padding:0;text-align:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.kuiTableHeaderCellButton:hover .kuiTableSortIcon{display:block;opacity:1}.kuiTableHeaderCellButton .kuiTableHeaderCell__liner{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiTableHeaderCell--alignRight{text-align:right}.kuiTableSortIcon{display:none;margin-left:4px;pointer-events:none}.kuiTableHeaderCellButton-isSorted .kuiTableSortIcon{display:block;opacity:.4}.kuiTableRow:hover .kuiTableRowHoverReveal{display:inline-block}.kuiTableRowHoverReveal{display:none}.kuiTableRowCell{border-top:1px solid #343741;color:#dfe5ef;font-size:16px;font-weight:400;max-width:20px;text-align:left;vertical-align:middle}.kuiTableRowCell__liner{line-height:1.5;overflow:hidden;padding:7px 8px 8px;text-overflow:ellipsis;white-space:nowrap}.kuiTableRowCell__liner>*{vertical-align:middle}.kuiTableRowCell--wrap .kuiTableRowCell__liner{white-space:normal}.kuiTableRowCell--overflowingContent .kuiTableRowCell__liner{overflow:visible;white-space:normal}.kuiTableRowCell--expanded{border-top-color:#1d1e24}.kuiTableRowCell--alignRight,.kuiTableRowCell--alignRight .kuiTableRowCell__liner{text-align:right}.kuiTableHeaderCell--checkBox,.kuiTableRowCell--checkBox{line-height:1;width:28px}.kuiTableHeaderCell--checkBox .kuiTableRowCell__liner,.kuiTableRowCell--checkBox .kuiTableRowCell__liner{overflow:visible}.kuiTableHeaderCell--checkBox .kuiTableHeaderCell__liner,.kuiTableHeaderCell--checkBox .kuiTableRowCell__liner,.kuiTableRowCell--checkBox .kuiTableHeaderCell__liner,.kuiTableRowCell--checkBox .kuiTableRowCell__liner{padding-right:0}.kuiTableInfo{color:#98a2b3;font-size:20px;line-height:1.5;padding:30px}.kuiTabs{border-bottom:1px solid #343741;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiTab{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:1px solid #343741;border-radius:0;color:#98a2b3;cursor:pointer;font-size:16px;margin-bottom:-1px;padding:10px 30px}.kuiTab+.kuiTab{border-left:none}.kuiTab+.kuiTab:focus:not(.kuiTab-isSelected):not(:active){margin-left:-1px}.kuiTab:active{-webkit-box-shadow:none;box-shadow:none;outline:none!important}.kuiTab:focus{outline:none}.kuiTab:focus:not(.kuiTab-isSelected):not(:active){border:1px solid #1ba9f5!important;color:#1ba9f5;z-index:1}.kuiTab:hover:not(.kuiTab-isSelected){background-color:#25262e;color:#098dd4}.kuiTab.kuiTab-isSelected{background-color:initial;border-bottom-color:#0000;color:#dfe5ef;cursor:default}.kuiToolBar{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-align-items:center;align-items:center;background-color:initial;border:1px solid #343741;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:50px;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px;padding:10px}.kuiToolBar .kuiButton:not(a):enabled:focus,a.kuiToolBar .kuiButton:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #343741,0 0 0 2px #1ba9f5;box-shadow:0 0 0 1px #343741,0 0 0 2px #1ba9f5;outline:none!important;z-index:1}.kuiToolBar .kuiButton--danger:not(a):enabled:focus,a.kuiToolBar .kuiButton--danger:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #343741,0 0 0 2px #f66;box-shadow:0 0 0 1px #343741,0 0 0 2px #f66;outline:none!important;z-index:1}.kuiToolBar .kuiSelect{border-color:#16171c}.kuiToolBar .kuiSelect:not(a):enabled:focus,a.kuiToolBar .kuiSelect:not(.kuiButton-isDisabled):focus{border-color:#1ba9f5;outline:none}.kuiToolBarSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiToolBarSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiToolBarSection:first-child{margin-left:0}.kuiToolBarSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiToolBarSection:only-child{margin-left:auto}.kuiToolBarSection>*+*{margin-left:10px}.kuiToolBar--searchOnly .kuiToolBarSearch{margin-left:0!important}.kuiToolBarFooter{-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:#1d1e24;height:40px;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px;padding:10px}.kuiToolBarFooter,.kuiToolBarFooterSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiToolBarFooterSection{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiToolBarFooterSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiToolBarFooterSection:first-child{margin-left:0}.kuiToolBarFooterSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiToolBarFooterSection:only-child{margin-left:auto}.kuiToolBarFooterSection>*+*{margin-left:10px}.kuiToolBarSearch{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;line-height:1.5;margin-left:25px;margin-right:25px;max-width:100%}.kuiToolBarSearch:first-child{margin-left:0}.kuiToolBarSearch:last-child{margin-right:0}.kuiToolBarSearch>*+*{margin-left:10px}.kuiToolBarSearchBox{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;font-size:16px;max-width:800px;position:relative}.kuiToolBarSearchBox__icon{color:#acacac;font-size:1em;left:.7em;position:absolute;top:.5em}.kuiToolBarSearchBox__input{background-color:#1d1e24;border:1px solid #343741;border-radius:4px;color:#dfe5ef;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;line-height:normal;min-width:200px;padding:4px 12px 5px 28px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;width:100%}.kuiToolBarSearchBox__input:focus{border-color:#1ba9f5;outline:none}.kuiToolBarText{color:#98a2b3;font-size:16px;line-height:1.5;white-space:nowrap}.kuiTitle{font-size:24px}.kuiSubTitle,.kuiTitle{font-weight:400;margin:0}.kuiSubTitle{font-size:20px}.kuiTextTitle{font-weight:700}.kuiText,.kuiTextTitle{font-size:16px;line-height:1.5;margin:0}.kuiSubText,.kuiText{font-weight:400}.kuiSubText{font-size:14px;line-height:1.5;margin:0}.kuiSubduedText{color:#98a2b3!important}.kuiVerticalRhythm+.kuiVerticalRhythm{margin-top:16px}.kuiVerticalRhythmSmall+.kuiVerticalRhythmSmall{margin-top:8px}.kuiVerticalRhythmLarge+.kuiVerticalRhythmLarge{margin-top:24px}.kuiVerticalRhythmXLarge+.kuiVerticalRhythmXLarge{margin-top:32px}.kuiView{-webkit-box-flex:1;background-color:#fff;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.kuiViewContent{padding-bottom:20px;padding-top:20px;width:100%}.kuiViewContent--constrainedWidth{margin-left:auto;margin-right:auto;max-width:1100px;width:100%}.kuiViewContentItem{padding-left:20px;padding-right:20px} \ No newline at end of file diff --git a/packages/kbn-ui-framework/dist/kui_light.min.css b/packages/kbn-ui-framework/dist/kui_light.min.css new file mode 100644 index 0000000000000..ab63567db2212 --- /dev/null +++ b/packages/kbn-ui-framework/dist/kui_light.min.css @@ -0,0 +1 @@ +main{display:block}.kuiBar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px}.kuiBar,.kuiBarSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiBarSection{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiBarSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiBarSection:first-child{margin-left:0}.kuiBarSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiBarSection:only-child{margin-left:auto}.kuiBarSection>*+*{margin-left:10px}.kuiButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:4px;cursor:pointer;display:inline-block;font-size:16px;font-weight:400;height:30px;line-height:1.5;padding:4px 12px 5px;text-decoration:none}.kuiButton:disabled,a.kuiButton.kuiButton-isDisabled{cursor:not-allowed;opacity:.5}.kuiButton:enabled:active,a.kuiButton:not(.kuiButton-isDisabled):active{-webkit-transform:translateY(1px);transform:translateY(1px)}.kuiButton__inner{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiButton--small{font-size:12px;height:22px;padding:2px 8px 3px}.kuiButton--fullWidth{text-align:center;width:100%}.kuiButton--iconText .kuiButton__icon:first-child:not(:only-child){margin-right:8px}.kuiButton--iconText .kuiButton__icon:last-child:not(:only-child){margin-left:8px}.kuiButton--iconText.kuiButton--small .kuiButton__icon:first-child:not(:only-child){margin-right:4px}.kuiButton--iconText.kuiButton--small .kuiButton__icon:last-child:not(:only-child){margin-left:4px}.kuiButton--basic{background-color:#f5f7fa;color:#343741}.kuiButton--basic:not(a):enabled:focus,a.kuiButton--basic:not(.kuiButton-isDisabled):focus{color:#343741}.kuiButton--basic:enabled:active,.kuiButton--basic:enabled:hover,a.kuiButton--basic:not(.kuiButton-isDisabled):active,a.kuiButton--basic:not(.kuiButton-isDisabled):hover{background-color:#d3dce9!important}.kuiButton--primary{background-color:#006bb4;color:#fff}.kuiButton--primary:not(a):enabled:focus,a.kuiButton--primary:not(.kuiButton-isDisabled):focus{color:#fff}.kuiButton--primary:enabled:active,.kuiButton--primary:enabled:hover,a.kuiButton--primary:not(.kuiButton-isDisabled):active,a.kuiButton--primary:not(.kuiButton-isDisabled):hover{background-color:#004d81;color:#fff!important}.kuiButton--success{background-color:#017d73;color:#fff}.kuiButton--success:not(a):enabled:focus,a.kuiButton--success:not(.kuiButton-isDisabled):focus{color:#fff}.kuiButton--success:enabled:active,.kuiButton--success:enabled:hover,a.kuiButton--success:not(.kuiButton-isDisabled):active,a.kuiButton--success:not(.kuiButton-isDisabled):hover{background-color:#014a44;color:#fff!important}.kuiButton--danger{border:1px solid #bd271e;color:#bd271e}.kuiButton--danger:not(a):enabled:focus,a.kuiButton--danger:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px #bd271e;box-shadow:0 0 0 1px #fff,0 0 0 2px #bd271e;color:#bd271e;outline:none!important;z-index:1}.kuiButton--danger:enabled:active,.kuiButton--danger:enabled:hover,a.kuiButton--danger:not(.kuiButton-isDisabled):active,a.kuiButton--danger:not(.kuiButton-isDisabled):hover{background-color:#bd271e1a;border:1px solid #911e17;color:#911e17!important}.kuiButton--warning{background-color:#f5a700;color:#fff}.kuiButton--warning:not(a):enabled:focus,a.kuiButton--warning:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px #f5a700;box-shadow:0 0 0 1px #fff,0 0 0 2px #f5a700;color:#fff;outline:none!important;z-index:1}.kuiButton--warning:enabled:active,.kuiButton--warning:enabled:hover,a.kuiButton--warning:not(.kuiButton-isDisabled):active,a.kuiButton--warning:not(.kuiButton-isDisabled):hover{background-color:#c28400;color:#fff!important}.kuiButton--warning:disabled,a.kuiButton--warning.kuiButton-isDisabled{background-color:#ffbb29}.kuiButton--hollow{background-color:initial;color:#006bb4!important}.kuiButton--hollow:enabled:active,.kuiButton--hollow:enabled:hover,a.kuiButton--hollow:not(.kuiButton-isDisabled):active,a.kuiButton--hollow:not(.kuiButton-isDisabled):hover{color:#004d81!important;text-decoration:underline}.kuiButton--secondary{border:1px solid #006bb4;color:#006bb4!important}.kuiButton--secondary:enabled:active,.kuiButton--secondary:enabled:hover,a.kuiButton--secondary:not(.kuiButton-isDisabled):active,a.kuiButton--secondary:not(.kuiButton-isDisabled):hover{background-color:#006bb41a;border:1px solid #004d81;color:#004d81!important;text-decoration:underline}.kuiButtonGroup{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiButtonGroup .kuiButton+.kuiButton{margin-left:4px}.kuiButtonGroup--united>.kuiButton:not(:first-child):not(:last-child){border-radius:0}.kuiButtonGroup--united>.kuiButton:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.kuiButtonGroup--united>.kuiButton:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.kuiButtonGroup--united>.kuiButton:only-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px}.kuiButtonGroup--united .kuiButton+.kuiButton{margin-left:0}.kuiButtonGroup--fullWidth{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiButtonGroup--fullWidth>.kuiButton{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.eui-textCenter>.kuiButtonGroup,.text-center>.kuiButtonGroup{display:inline-block}.kuiCollapseButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;color:#343741!important;cursor:pointer;font-size:16px;line-height:1;opacity:.35;padding:4px}.kuiCollapseButton:hover{opacity:1}.kuiAssistedInput{display:inline-block;position:relative}.kuiAssistedInput__assistance{position:absolute;right:12px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.kuiCheckBox{-webkit-appearance:none;background-color:#fbfcfd;border:1px solid #0f27761a;border-radius:4px;font:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol!important;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol!important;font-size:10px!important;height:16px;line-height:1.5!important;margin:0!important;-webkit-transition:background-color .1s linear;transition:background-color .1s linear;width:16px}.kuiCheckBox:before{color:#fff;content:"\F00C";font-family:FontAwesome;font-size:1em;left:.25em;opacity:0;position:relative;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.kuiCheckBox:checked{background-color:#006bb4;border-color:#006bb4}.kuiCheckBox:checked:before{opacity:1}.kuiCheckBox:focus{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px #006bb4;box-shadow:0 0 0 1px #fff,0 0 0 2px #006bb4;outline:none!important;z-index:1}.kuiCheckBox:disabled{background-color:#eef2f7!important;border-color:#eef2f7!important;cursor:not-allowed!important}.kuiCheckBoxLabel{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-weight:400!important;line-height:1.5}.kuiCheckBoxLabel__text{font-size:16px;margin-left:8px}.kuiLabel{font-weight:700;margin-bottom:0}.kuiLabel,.kuiSearchInput{font-size:16px;line-height:1.5}.kuiSearchInput{display:inline-block;position:relative;width:180px}.kuiSearchInput.kuiSearchInput-isInvalid .kuiSearchInput__input{border-color:#bd271e}.kuiSearchInput__icon{color:#98a2b3;font-size:1em;left:.7em;position:absolute;top:.5em}.kuiSearchInput__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fbfcfd;border:1px solid #0f27761a;border-radius:4px;color:#343741;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 12px 4px 28px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;width:100%}.kuiSearchInput__input:invalid{border-color:#bd271e}.kuiSearchInput__input:focus{border-color:#006bb4;outline:none}.kuiSearchInput__input:disabled{cursor:not-allowed;opacity:.4}.kuiSearchInput--small{width:60px}.kuiSearchInput--large{width:400px}.kuiSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fbfcfd;background-image:url('data:image/svg+xml;utf8,');background-position:calc(100% - 8px);background-repeat:no-repeat;background-size:14px;border:1px solid #0f27761a;border-radius:4px;color:#343741;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 30px 4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiSelect:invalid{border-color:#bd271e}.kuiSelect:disabled{cursor:not-allowed;opacity:.4}.kuiSelect:-moz-focusring{text-shadow:0 0 0}.kuiSelect.kuiSelect-isInvalid{border-color:#bd271e}.kuiSelect:focus{border-color:#006bb4;-webkit-box-shadow:none;box-shadow:none;outline:none}.kuiSelect--small{width:60px}.kuiSelect--medium{width:180px}.kuiSelect--large{width:400px}.kuiStaticInput{background-color:initial;border:1px solid #0000}.kuiStaticInput,.kuiTextArea{-webkit-appearance:none;-moz-appearance:none;appearance:none;color:#343741;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;padding:4px 12px;width:180px}.kuiTextArea{background-color:#fbfcfd;border:1px solid #0f27761a;border-radius:4px;min-height:32px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiTextArea:invalid{border-color:#bd271e}.kuiTextArea:disabled{cursor:not-allowed;opacity:.4}.kuiTextArea:focus{border-color:#006bb4;-webkit-box-shadow:none;box-shadow:none;outline:none}.kuiTextArea.kuiTextArea-isInvalid{border-color:#bd271e}.kuiTextArea--nonResizable{resize:none}.kuiTextArea--small{width:60px}.kuiTextArea--large{width:400px}.kuiTextInput{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fbfcfd;border:1px solid #0f27761a;border-radius:4px;color:#343741;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;width:180px}.kuiTextInput:invalid{border-color:#bd271e}.kuiTextInput:focus{border-color:#006bb4;outline:none}.kuiTextInput:disabled{cursor:not-allowed;opacity:.4}.kuiTextInput.kuiTextInput-isInvalid{border-color:#bd271e}.kuiTextInput--small{width:60px}.kuiTextInput--large{width:400px}.kuiFieldGroup{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiFieldGroup--alignTop{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.kuiFieldGroupSection{line-height:1.5}.kuiFieldGroupSection+.kuiFieldGroupSection{margin-left:10px}.kuiFieldGroupSection--wide{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.kuiFieldGroupSection--wide>*{width:100%}.kuiIcon{text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit}.kuiIcon--info{color:#006bb4}.kuiIcon--success{color:#017d73}.kuiIcon--warning{color:#f5a700}.kuiIcon--error{color:#bd271e}.kuiIcon--inactive{color:#d3dae6}.kuiIcon--basic{color:#69707d}.kuiInfoPanel{border:2px solid;line-height:1.5;padding:14px 20px 18px}.kuiInfoPanel--info{border-color:#006bb440}.kuiInfoPanel--success{border-color:#017d7340}.kuiInfoPanel--warning{border-color:#f5a70040}.kuiInfoPanel--error{border-color:#bd271e40}.kuiInfoPanelHeader{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;align-items:baseline;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiInfoPanelHeader__icon{font-size:16px;line-height:1.5;margin-right:10px}.kuiInfoPanelHeader__title{font-size:16px;font-weight:700;line-height:1.5}.kuiInfoPanelBody,.kuiInfoPanelBody>*+*{margin-top:8px}.kuiInfoPanelBody__message{font-size:16px;line-height:1.5}.kuiLink{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;cursor:pointer;font-size:inherit;line-height:inherit;text-decoration:none}.kuiLink,.kuiLink:active,.kuiLink:visited{color:#006bb4}.kuiLink:hover{color:#004d81;text-decoration:underline}.kuiLocalBreadcrumbs{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-ms-flex-positive:1;-ms-flex-preferred-size:100%;-webkit-align-items:center;align-items:center;background-color:#fff;border-bottom:1px solid #d3dae6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;flex-basis:100%;-webkit-flex-grow:1;flex-grow:1;padding:12px 8px}.kuiLocalBreadcrumb{font-size:14px;font-weight:400;margin:0}.kuiLocalBreadcrumb+.kuiLocalBreadcrumb{margin-left:6px}.kuiLocalBreadcrumb+.kuiLocalBreadcrumb:before{color:#d3dae6;content:"/";margin-right:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kuiLocalBreadcrumb__link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;color:#006bb4;cursor:pointer;font-size:inherit;font-size:16px;line-height:inherit;text-decoration:none}.kuiLocalBreadcrumb__link:active,.kuiLocalBreadcrumb__link:visited{color:#006bb4}.kuiLocalBreadcrumb__link:hover{color:#004d81;text-decoration:underline}.kuiLocalBreadcrumb__emphasis{font-weight:700}.kuiDatePicker{background-color:initial;border-collapse:collapse;border-spacing:0;line-height:1.5}.kuiDatePickerNavigationCell{padding:0}.kuiDatePickerNavigation{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;justify-content:space-between;margin-bottom:4px}.kuiDatePickerNavigationButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;border-radius:4px;color:#343741;font-size:14px;padding:3px 6px}.kuiDatePickerNavigationButton:active,.kuiDatePickerNavigationButton:hover{background-color:#006bb4;color:#f5f7fa;cursor:pointer}.kuiDatePickerNavigationButton:focus{-webkit-box-shadow:0 0 0 1px #0000,0 0 0 2px #006bb4;box-shadow:0 0 0 1px #0000,0 0 0 2px #006bb4;color:#343741;outline:none!important;z-index:1}.kuiDatePickerHeaderCell{color:#343741;font-size:14px;font-weight:700;line-height:1.2;padding:9px 0;text-align:center}.kuiDatePickerRowCell{padding:0;text-align:center}.kuiDatePickerRowCell.kuiDatePickerRowCell-isBlocked{cursor:not-allowed}.kuiDatePickerRowCell.kuiDatePickerRowCell-isBlocked .kuiDatePickerRowCellContent{pointer-events:none}.kuiDatePickerRowCellContent{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:1px solid #0000;border-radius:4px;color:#343741;font-size:14px;line-height:1.2;padding:8px;width:100%}.kuiDatePickerRowCellContent:focus{-webkit-box-shadow:0 0 0 1px #0000,0 0 0 2px #006bb4;box-shadow:0 0 0 1px #0000,0 0 0 2px #006bb4;color:#343741;outline:none!important;z-index:1}.kuiDatePickerRowCellContent:disabled{opacity:.5;pointer-events:none}.kuiDatePickerRowCellContent.kuiDatePickerRowCellContent-isOtherMonth{pointer-events:none;visibility:hidden}.kuiDatePickerRowCellContent.kuiDatePickerRowCellContent-isCurrent{color:#006bb4}.kuiDatePickerRowCellContent.kuiDatePickerRowCellContent-isSelected{background-color:#69707d;color:#343741}.kuiDatePickerRowCellContent:active,.kuiDatePickerRowCellContent:hover{background-color:#006bb4;color:#f5f7fa;cursor:pointer}.kuiLocalDropdown{background-color:initial;line-height:20px;margin-bottom:10px;padding:10px 8px 14px;position:relative}.kuiLocalDropdownCloseButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:none;color:#343741!important;cursor:pointer;font-size:16px;line-height:1;opacity:.35;padding:4px;position:absolute;right:5px;top:1px}.kuiLocalDropdownCloseButton:hover{opacity:1}.kuiLocalDropdownPanels{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalDropdownPanel{-webkit-box-flex:1;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%}.kuiLocalDropdownPanel--left{margin-right:30px}.kuiLocalDropdownPanel--right{margin-left:30px}.kuiLocalDropdownTitle{color:#343741;font-size:18px;margin-bottom:12px;margin-top:0}.kuiLocalDropdownSection{margin-bottom:16px}.kuiLocalDropdownSection:last-child{margin-bottom:0}.kuiLocalDropdownHeader{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;justify-content:space-between;margin-bottom:6px}.kuiLocalDropdownHeader__label{color:#343741;font-size:14px;font-weight:700;margin-bottom:0}.kuiLocalDropdownHeader__actions{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalDropdownHeader__action{color:#006bb4;cursor:pointer;font-size:12px;text-decoration:none}.kuiLocalDropdownHeader__action+.kuiLocalDropdownHeader__action{margin-left:10px}.kuiLocalDropdownHeader__action:active,.kuiLocalDropdownHeader__action:hover{color:#004d81}.kuiLocalDropdownInput{background-color:#fbfcfd;border:1px solid #0f27761a;border-radius:4px;color:#343741;display:block;font-size:14px;margin-bottom:12px;padding:5px 15px;width:100%}.kuiLocalDropdownInput:focus{border-color:#006bb4}.kuiLocalDropdownFormNote{color:#69707d;font-size:14px}.kuiLocalDropdownWarning{background-color:#fff;border-left:2px solid #bd271e;color:#343741;font-size:14px;margin-bottom:16px;padding:6px 10px}.kuiLocalDropdownHelpText{color:#69707d;font-size:14px;margin-bottom:16px}.kuiLocalMenu{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;padding-bottom:8px;padding-top:8px}.kuiLocalMenu,.kuiLocalMenuItem{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalMenuItem{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background-color:initial;border:0;border-bottom:2px solid #0000;color:#343741;cursor:pointer;font-size:16px;padding:2px 8px}.kuiLocalMenuItem:focus,.kuiLocalMenuItem:hover{background-color:#006bb426;text-decoration:underline}.kuiLocalMenuItem.kuiLocalMenuItem-isSelected{background-color:initial;border-color:#006bb4;color:#006bb4;z-index:2}.kuiLocalMenuItem.kuiLocalMenuItem-isSelected:focus,.kuiLocalMenuItem.kuiLocalMenuItem-isSelected:hover{text-decoration:none}.kuiLocalMenuItem.kuiLocalMenuItem-isDisabled{cursor:not-allowed;opacity:.5}.kuiLocalMenuItem.kuiLocalMenuItem-isDisabled:hover{background-color:initial;text-decoration:none}.kuiLocalMenuItem__icon{margin-bottom:-1px;margin-right:5px}.kuiLocalNav{-webkit-box-orient:vertical;-webkit-box-direction:normal;background-color:#fff;border-bottom:1px solid #d3dae6;color:#343741;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;line-height:1.5;min-height:69px}.kuiLocalNav,.kuiLocalNavRow{-webkit-box-pack:justify;-ms-flex-pack:justify;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;justify-content:space-between}.kuiLocalNavRow,.kuiLocalNavRow__section{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.kuiLocalNavRow__section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiLocalNavRow--secondary{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;padding:0 8px}.kuiLocalSearch{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:8px;width:100%}.kuiLocalSearchInput{-webkit-box-flex:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fbfcfd;border:1px solid #d3dae6;border-radius:4px;border-radius:4px 0 0 4px;color:#343741;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiLocalSearchInput:invalid{border-color:#bd271e}.kuiLocalSearchInput:focus{border-color:#006bb4;outline:none}.kuiLocalSearchInput:disabled{cursor:not-allowed;opacity:.4}.kuiLocalSearchInput:focus{-webkit-box-shadow:none;box-shadow:none}.kuiLocalSearchInput.kuiLocalSearchInput-isInvalid{border-color:#bd271e}.kuiLocalSearchInput--secondary{-webkit-box-flex:0;border-left-width:0;border-radius:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;height:32px}.kuiLocalSearchAssistedInput{-webkit-box-flex:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;position:relative}.kuiLocalSearchAssistedInput__input,.kuiLocalSearchInput{padding-right:6em}.kuiLocalSearchAssistedInput__assistance{position:absolute;right:6px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:2}.kuiLocalSearchSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fbfcfd;background-image:url('data:image/svg+xml;utf8,');background-position:calc(100% - 8px);background-repeat:no-repeat;background-size:14px;border:1px solid #0f27761a;border-left-width:0;border-radius:4px;border-radius:0;color:#343741;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;font-weight:400;line-height:1.5;min-height:32px;padding:4px 30px 4px 12px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear}.kuiLocalSearchSelect:invalid{border-color:#bd271e}.kuiLocalSearchSelect:focus{border-color:#006bb4;outline:none}.kuiLocalSearchSelect:disabled{cursor:not-allowed;opacity:.4}.kuiLocalSearchSelect:-moz-focusring{text-shadow:0 0 0}.kuiLocalSearchButton{background-color:#006bb4;border:0;border-radius:0 4px 4px 0;color:#fff;font-size:16px;height:32px;line-height:0;width:43px}.kuiLocalSearchButton:focus{-webkit-box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #006bb4;box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #006bb4;outline:none!important;z-index:1}.kuiLocalTabs{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%}.kuiLocalTab{border-bottom:2px solid #0000;color:#343741;cursor:pointer;font-size:18px;margin-bottom:0!important;margin-top:0!important;padding:5px 0 6px;text-decoration:none}.kuiLocalTab:active:not(.kuiLocalTab-isDisabled),.kuiLocalTab:hover:not(.kuiLocalTab-isDisabled){color:#006bb4}.kuiLocalTab.kuiLocalTab-isSelected{border-bottom-color:#006bb4;color:#006bb4;cursor:default}.kuiLocalTab.kuiLocalTab-isDisabled{cursor:default;opacity:.5}.kuiLocalTab+.kuiLocalTab{margin-left:15px}.kuiLocalTitle{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-ms-flex-positive:1;-ms-flex-preferred-size:100%;-webkit-align-items:center;align-items:center;background-color:#fff;border-bottom:1px solid #d3dae6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;flex-basis:100%;-webkit-flex-grow:1;flex-grow:1;font-size:16px;font-weight:700;padding:12px 8px}.kuiLocalTitle:empty{display:none;padding:0}.kuiPager{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiPager>*+*{margin-left:10px}.kuiPagerText{color:#69707d;font-size:16px;line-height:1.5;white-space:nowrap}.kuiPanel{background-color:#fff;border:1px solid #d3dae6;border-radius:4px;-webkit-box-shadow:0 2px 2px -1px #98a2b34d,0 1px 5px -2px #98a2b34d;box-shadow:0 2px 2px -1px #98a2b34d,0 1px 5px -2px #98a2b34d}.kuiPanel--prompt{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;min-height:300px;text-align:center}.kuiPanel--prompt .kuiPanelBody{max-width:500px;padding:30px}.kuiPanel--noBorder{border:none}.kuiPanel--withToolBar{border-radius:0;border-top:none}.kuiPanel--centered{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiPanel--centered,.kuiPanelHeader{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiPanelHeader{-webkit-box-pack:justify;-ms-flex-pack:justify;border-bottom:1px solid #d3dae6;height:50px;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px;padding:10px}.kuiPanelHeader .kuiButton:not(a):enabled:focus,a.kuiPanelHeader .kuiButton:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #006bb4;box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #006bb4;outline:none!important;z-index:1}.kuiPanelHeader .kuiButton--danger:not(a):enabled:focus,a.kuiPanelHeader .kuiButton--danger:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #bd271e;box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #bd271e;outline:none!important;z-index:1}.kuiPanelHeader .kuiSelect{border-color:#fbfcfd}.kuiPanelHeader .kuiSelect:not(a):enabled:focus,a.kuiPanelHeader .kuiSelect:not(.kuiButton-isDisabled):focus{border-color:#006bb4;outline:none}.kuiPanelHeader__title{font-size:20px;line-height:1.5;margin:0}.kuiPanelHeaderSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiPanelHeaderSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiPanelHeaderSection:first-child{margin-left:0}.kuiPanelHeaderSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiPanelHeaderSection:only-child{margin-left:auto}.kuiPanelHeaderSection>*+*{margin-left:10px}.kuiPanelHeaderSection:only-child{margin-left:0;margin-right:auto}.kuiPanelBody{padding:10px}.kuiEmptyTablePrompt{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:30px}.kuiEmptyTablePrompt__message{color:#69707d;font-size:20px;line-height:1.5}.kuiEmptyTablePrompt__actions{margin-top:10px}.kuiStatusText{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;align-items:baseline;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.kuiStatusText--info{color:#006bb4}.kuiStatusText--success{color:#017d73}.kuiStatusText--warning{color:#f5a700}.kuiStatusText--error{color:#bd271e}.kuiStatusText__icon{margin-right:6px;max-height:1.15em;width:1.15em}.kuiControlledTable{background:#fff}.kuiControlledTable .kuiMenu--contained,.kuiControlledTable .kuiTable,.kuiControlledTable .kuiToolBarFooter{border-top:none}.kuiTable{background-color:#fff;border:1px solid #d3dae6;border-collapse:collapse;width:100%}.kuiTable--fluid{width:auto}.kuiTable--fluid .kuiTableHeaderCell,.kuiTable--fluid .kuiTableRowCell{max-width:none}.kuiTableHeaderCell{color:#69707d;font-size:16px;font-weight:400;line-height:1.5;max-width:20px;text-align:left}.kuiTableHeaderCell__liner{display:inline-block;padding:7px 8px 8px}.kuiTableHeaderCellButton{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;line-height:inherit;padding:0;text-align:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.kuiTableHeaderCellButton:hover .kuiTableSortIcon{display:block;opacity:1}.kuiTableHeaderCellButton .kuiTableHeaderCell__liner{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiTableHeaderCell--alignRight{text-align:right}.kuiTableSortIcon{display:none;margin-left:4px;pointer-events:none}.kuiTableHeaderCellButton-isSorted .kuiTableSortIcon{display:block;opacity:.4}.kuiTableRow:hover .kuiTableRowHoverReveal{display:inline-block}.kuiTableRowHoverReveal{display:none}.kuiTableRowCell{border-top:1px solid #d3dae6;color:#343741;font-size:16px;font-weight:400;max-width:20px;text-align:left;vertical-align:middle}.kuiTableRowCell__liner{line-height:1.5;overflow:hidden;padding:7px 8px 8px;text-overflow:ellipsis;white-space:nowrap}.kuiTableRowCell__liner>*{vertical-align:middle}.kuiTableRowCell--wrap .kuiTableRowCell__liner{white-space:normal}.kuiTableRowCell--overflowingContent .kuiTableRowCell__liner{overflow:visible;white-space:normal}.kuiTableRowCell--expanded{border-top-color:#fff}.kuiTableRowCell--alignRight,.kuiTableRowCell--alignRight .kuiTableRowCell__liner{text-align:right}.kuiTableHeaderCell--checkBox,.kuiTableRowCell--checkBox{line-height:1;width:28px}.kuiTableHeaderCell--checkBox .kuiTableRowCell__liner,.kuiTableRowCell--checkBox .kuiTableRowCell__liner{overflow:visible}.kuiTableHeaderCell--checkBox .kuiTableHeaderCell__liner,.kuiTableHeaderCell--checkBox .kuiTableRowCell__liner,.kuiTableRowCell--checkBox .kuiTableHeaderCell__liner,.kuiTableRowCell--checkBox .kuiTableRowCell__liner{padding-right:0}.kuiTableInfo{color:#69707d;font-size:20px;line-height:1.5;padding:30px}.kuiTabs{border-bottom:1px solid #d3dae6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiTab{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:initial;border:1px solid #d3dae6;border-radius:0;color:#69707d;cursor:pointer;font-size:16px;margin-bottom:-1px;padding:10px 30px}.kuiTab+.kuiTab{border-left:none}.kuiTab+.kuiTab:focus:not(.kuiTab-isSelected):not(:active){margin-left:-1px}.kuiTab:active{-webkit-box-shadow:none;box-shadow:none;outline:none!important}.kuiTab:focus{outline:none}.kuiTab:focus:not(.kuiTab-isSelected):not(:active){border:1px solid #006bb4!important;color:#006bb4;z-index:1}.kuiTab:hover:not(.kuiTab-isSelected){background-color:#f5f7fa;color:#004d81}.kuiTab.kuiTab-isSelected{background-color:initial;border-bottom-color:#0000;color:#343741;cursor:default}.kuiToolBar{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-align-items:center;align-items:center;background-color:initial;border:1px solid #d3dae6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:50px;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px;padding:10px}.kuiToolBar .kuiButton:not(a):enabled:focus,a.kuiToolBar .kuiButton:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #006bb4;box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #006bb4;outline:none!important;z-index:1}.kuiToolBar .kuiButton--danger:not(a):enabled:focus,a.kuiToolBar .kuiButton--danger:not(.kuiButton-isDisabled):focus{-webkit-box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #bd271e;box-shadow:0 0 0 1px #d3dae6,0 0 0 2px #bd271e;outline:none!important;z-index:1}.kuiToolBar .kuiSelect{border-color:#fbfcfd}.kuiToolBar .kuiSelect:not(a):enabled:focus,a.kuiToolBar .kuiSelect:not(.kuiButton-isDisabled):focus{border-color:#006bb4;outline:none}.kuiToolBarSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiToolBarSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiToolBarSection:first-child{margin-left:0}.kuiToolBarSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiToolBarSection:only-child{margin-left:auto}.kuiToolBarSection>*+*{margin-left:10px}.kuiToolBar--searchOnly .kuiToolBarSearch{margin-left:0!important}.kuiToolBarFooter{-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:#fff;height:40px;-webkit-justify-content:space-between;justify-content:space-between;min-height:30px;padding:10px}.kuiToolBarFooter,.kuiToolBarFooterSection{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.kuiToolBarFooterSection{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-left:25px;margin-right:25px}.kuiToolBarFooterSection:not(:first-child):not(:last-child):not(:only-child){-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.kuiToolBarFooterSection:first-child{margin-left:0}.kuiToolBarFooterSection:last-child{-webkit-box-flex:0;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-justify-content:flex-end;justify-content:flex-end;margin-right:0}.kuiToolBarFooterSection:only-child{margin-left:auto}.kuiToolBarFooterSection>*+*{margin-left:10px}.kuiToolBarSearch{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;line-height:1.5;margin-left:25px;margin-right:25px;max-width:100%}.kuiToolBarSearch:first-child{margin-left:0}.kuiToolBarSearch:last-child{margin-right:0}.kuiToolBarSearch>*+*{margin-left:10px}.kuiToolBarSearchBox{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;font-size:16px;max-width:800px;position:relative}.kuiToolBarSearchBox__icon{color:#acacac;font-size:1em;left:.7em;position:absolute;top:.5em}.kuiToolBarSearchBox__input{background-color:#fff;border:1px solid #d3dae6;border-radius:4px;color:#343741;font-family:Inter UI,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;line-height:normal;min-width:200px;padding:4px 12px 5px 28px;-webkit-transition:border-color .1s linear;transition:border-color .1s linear;width:100%}.kuiToolBarSearchBox__input:focus{border-color:#006bb4;outline:none}.kuiToolBarText{color:#69707d;font-size:16px;line-height:1.5;white-space:nowrap}.kuiTitle{font-size:24px}.kuiSubTitle,.kuiTitle{font-weight:400;margin:0}.kuiSubTitle{font-size:20px}.kuiTextTitle{font-weight:700}.kuiText,.kuiTextTitle{font-size:16px;line-height:1.5;margin:0}.kuiSubText,.kuiText{font-weight:400}.kuiSubText{font-size:14px;line-height:1.5;margin:0}.kuiSubduedText{color:#69707d!important}.kuiVerticalRhythm+.kuiVerticalRhythm{margin-top:16px}.kuiVerticalRhythmSmall+.kuiVerticalRhythmSmall{margin-top:8px}.kuiVerticalRhythmLarge+.kuiVerticalRhythmLarge{margin-top:24px}.kuiVerticalRhythmXLarge+.kuiVerticalRhythmXLarge{margin-top:32px}.kuiView{-webkit-box-flex:1;background-color:#fff;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.kuiViewContent{padding-bottom:20px;padding-top:20px;width:100%}.kuiViewContent--constrainedWidth{margin-left:auto;margin-right:auto;max-width:1100px;width:100%}.kuiViewContentItem{padding-left:20px;padding-right:20px} \ No newline at end of file diff --git a/scripts/dev_docs.sh b/scripts/dev_docs.sh index 55d8f4d51e8dc..202d3d84df5ff 100755 --- a/scripts/dev_docs.sh +++ b/scripts/dev_docs.sh @@ -1,6 +1,10 @@ #!/bin/bash set -euo pipefail +# Increment this number to cause everyone's docs project to be reset on their next run +# This is so that we can somewhat automatically fix people's projects when the upstream docs project has a breaking change that requires resetting the project +RESET_VERSION=1 + KIBANA_DIR=$(cd "$(dirname "$0")"/.. && pwd) WORKSPACE=$(cd "$KIBANA_DIR/.." && pwd)/kibana-docs export NVM_DIR="$WORKSPACE/.nvm" @@ -21,6 +25,8 @@ fi mkdir -p "$WORKSPACE" cd "$WORKSPACE" +touch "$WORKSPACE/.version" +RESET_VERSION_FROM_FILE=$(cat "$WORKSPACE/.version") if [[ ! -d "$NVM_DIR" ]]; then echo "Installing a separate copy of nvm" @@ -37,6 +43,10 @@ if [[ ! -d "$DOCS_DIR" ]]; then else cd "$DOCS_DIR" git pull + if [[ "$RESET_VERSION" != "$RESET_VERSION_FROM_FILE" ]]; then + echo "Resetting docs.elastic.dev repo..." + git clean -fdxq + fi cd "$WORKSPACE" fi @@ -59,23 +69,33 @@ else fi # The minimum sources required to build kibana docs -cat << EOF > "$DOCS_DIR/sources-dev.json" -{ - "sources": [ - { - "type": "file", - "location": "$KIBANA_DIR" - }, - { - "type": "file", - "location": "$DEV_DIR" - }, - { - "type": "file", - "location": "$TEAM_DIR" +cat << EOF > "$DOCS_DIR/config/content-dev.js" +module.exports = { + "content": { + "sources": [ + { + "type": "file", + "location": "$KIBANA_DIR" + }, + { + "type": "file", + "location": "$DEV_DIR" + }, + { + "type": "file", + "location": "$TEAM_DIR" + } + ], + "nav": { + "structure": [ + "nav-elastic-developer-guide", + "nav-kibana-team", + "nav-kibana-dev" + ], + "default": "nav-kibana-dev" } - ] -} + } +}; EOF cd "$DOCS_DIR" @@ -96,6 +116,8 @@ echo "The docs.elastic.dev project is located at:" echo "$DOCS_DIR" echo "" +echo $RESET_VERSION > "$WORKSPACE/.version" + if [[ "${1:-}" ]]; then yarn "$@" else diff --git a/src/core/public/chrome/chrome_service.test.ts b/src/core/public/chrome/chrome_service.test.ts index 737b561bed8e3..c6eae3009dfff 100644 --- a/src/core/public/chrome/chrome_service.test.ts +++ b/src/core/public/chrome/chrome_service.test.ts @@ -15,7 +15,7 @@ import { docLinksServiceMock } from '@kbn/core-doc-links-browser-mocks'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; import { App, PublicAppInfo } from '../application'; import { applicationServiceMock } from '../application/application_service.mock'; -import { notificationServiceMock } from '../notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; import { ChromeService } from './chrome_service'; import { getAppInfo } from '../application/utils'; diff --git a/src/core/public/chrome/chrome_service.tsx b/src/core/public/chrome/chrome_service.tsx index 97e9bce2ff245..281bafe7a4249 100644 --- a/src/core/public/chrome/chrome_service.tsx +++ b/src/core/public/chrome/chrome_service.tsx @@ -16,8 +16,8 @@ import type { InternalInjectedMetadataStart } from '@kbn/core-injected-metadata- import type { DocLinksStart } from '@kbn/core-doc-links-browser'; import type { HttpStart } from '@kbn/core-http-browser'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; +import type { NotificationsStart } from '@kbn/core-notifications-browser'; import type { InternalApplicationStart } from '../application'; -import type { NotificationsStart } from '../notifications'; import { KIBANA_ASK_ELASTIC_LINK } from './constants'; import { type ChromeDocTitle, DocTitleService } from './doc_title'; import { type ChromeNavControls, NavControlsService } from './nav_controls'; diff --git a/src/core/public/core_app/core_app.ts b/src/core/public/core_app/core_app.ts index d834ece6e76cf..1b013b792f627 100644 --- a/src/core/public/core_app/core_app.ts +++ b/src/core/public/core_app/core_app.ts @@ -12,13 +12,13 @@ import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata- import type { DocLinksStart } from '@kbn/core-doc-links-browser'; import type { HttpSetup, HttpStart } from '@kbn/core-http-browser'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; +import type { NotificationsSetup, NotificationsStart } from '@kbn/core-notifications-browser'; import { type InternalApplicationSetup, type InternalApplicationStart, AppNavLinkStatus, type AppMountParameters, } from '../application'; -import type { NotificationsSetup, NotificationsStart } from '../notifications'; import { renderApp as renderErrorApp, setupPublicBaseUrlConfigWarning, diff --git a/src/core/public/core_app/errors/public_base_url.test.tsx b/src/core/public/core_app/errors/public_base_url.test.tsx index aa01058010a6e..edcdc18740664 100644 --- a/src/core/public/core_app/errors/public_base_url.test.tsx +++ b/src/core/public/core_app/errors/public_base_url.test.tsx @@ -9,7 +9,7 @@ import { docLinksServiceMock } from '@kbn/core-doc-links-browser-mocks'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; -import { notificationServiceMock } from '../../notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { setupPublicBaseUrlConfigWarning } from './public_base_url'; describe('publicBaseUrl warning', () => { diff --git a/src/core/public/core_app/errors/url_overflow.test.ts b/src/core/public/core_app/errors/url_overflow.test.ts index e68b80931d2ec..bdf8bdf0abc6a 100644 --- a/src/core/public/core_app/errors/url_overflow.test.ts +++ b/src/core/public/core_app/errors/url_overflow.test.ts @@ -10,9 +10,9 @@ import { createMemoryHistory, History } from 'history'; import type { IBasePath } from '@kbn/core-http-browser'; import { BasePath } from '@kbn/core-http-browser-internal'; -import { notificationServiceMock } from '../../notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; -import type { IToasts } from '../../notifications'; +import type { IToasts } from '@kbn/core-notifications-browser'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import { setupUrlOverflowDetection, URL_MAX_LENGTH, URL_WARNING_LENGTH } from './url_overflow'; diff --git a/src/core/public/core_app/errors/url_overflow.tsx b/src/core/public/core_app/errors/url_overflow.tsx index 9b71dbf882059..4557ad3658524 100644 --- a/src/core/public/core_app/errors/url_overflow.tsx +++ b/src/core/public/core_app/errors/url_overflow.tsx @@ -15,7 +15,7 @@ import type { IBasePath } from '@kbn/core-http-browser'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; -import { IToasts } from '../../notifications'; +import type { IToasts } from '@kbn/core-notifications-browser'; const IE_REGEX = /(; ?MSIE |Edge\/\d|Trident\/[\d+\.]+;.*rv:*11\.\d+)/; export const IS_IE = IE_REGEX.test(window.navigator.userAgent); diff --git a/src/core/public/core_app/status/lib/load_status.test.ts b/src/core/public/core_app/status/lib/load_status.test.ts index 348e796e615e6..f14e250fec4b5 100644 --- a/src/core/public/core_app/status/lib/load_status.test.ts +++ b/src/core/public/core_app/status/lib/load_status.test.ts @@ -8,7 +8,7 @@ import { httpServiceMock } from '@kbn/core-http-browser-mocks'; import type { StatusResponse } from '../../../../types/status'; -import { notificationServiceMock } from '../../../notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { mocked } from '@kbn/core-metrics-collectors-server-mocks'; import { loadStatus } from './load_status'; diff --git a/src/core/public/core_app/status/lib/load_status.ts b/src/core/public/core_app/status/lib/load_status.ts index d8ebf9510ca9a..6a5dfa7ad3e45 100644 --- a/src/core/public/core_app/status/lib/load_status.ts +++ b/src/core/public/core_app/status/lib/load_status.ts @@ -8,8 +8,8 @@ import { i18n } from '@kbn/i18n'; import type { HttpSetup } from '@kbn/core-http-browser'; +import type { NotificationsSetup } from '@kbn/core-notifications-browser'; import type { StatusResponse, ServiceStatus, ServiceStatusLevel } from '../../../../types/status'; -import type { NotificationsSetup } from '../../../notifications'; import type { DataType } from '.'; interface MetricMeta { diff --git a/src/core/public/core_app/status/render_app.tsx b/src/core/public/core_app/status/render_app.tsx index 545ebcf6c47e7..da28ed0ee9f84 100644 --- a/src/core/public/core_app/status/render_app.tsx +++ b/src/core/public/core_app/status/render_app.tsx @@ -11,8 +11,8 @@ import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n-react'; import { CoreThemeProvider } from '@kbn/core-theme-browser-internal'; import type { HttpSetup } from '@kbn/core-http-browser'; +import type { NotificationsSetup } from '@kbn/core-notifications-browser'; import type { AppMountParameters } from '../../application'; -import type { NotificationsSetup } from '../../notifications'; import { StatusApp } from './status_app'; interface Deps { diff --git a/src/core/public/core_app/status/status_app.tsx b/src/core/public/core_app/status/status_app.tsx index deb993343ec7e..43e388ad170a8 100644 --- a/src/core/public/core_app/status/status_app.tsx +++ b/src/core/public/core_app/status/status_app.tsx @@ -11,7 +11,7 @@ import { EuiLoadingSpinner, EuiText, EuiPage, EuiPageBody, EuiSpacer } from '@el import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import type { HttpSetup } from '@kbn/core-http-browser'; -import type { NotificationsSetup } from '../../notifications'; +import type { NotificationsSetup } from '@kbn/core-notifications-browser'; import { loadStatus, type ProcessedServerResponse } from './lib'; import { MetricTiles, ServerStatus, StatusSection, VersionHeader } from './components'; diff --git a/src/core/public/core_system.test.mocks.ts b/src/core/public/core_system.test.mocks.ts index 45c37f2cfb04b..845a43f5b492a 100644 --- a/src/core/public/core_system.test.mocks.ts +++ b/src/core/public/core_system.test.mocks.ts @@ -15,7 +15,7 @@ import { chromeServiceMock } from './chrome/chrome_service.mock'; import { fatalErrorsServiceMock } from '@kbn/core-fatal-errors-browser-mocks'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; import { i18nServiceMock } from '@kbn/core-i18n-browser-mocks'; -import { notificationServiceMock } from './notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { overlayServiceMock } from '@kbn/core-overlays-browser-mocks'; import { pluginsServiceMock } from './plugins/plugins_service.mock'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; @@ -62,7 +62,7 @@ export const MockNotificationsService = notificationServiceMock.create(); export const NotificationServiceConstructor = jest .fn() .mockImplementation(() => MockNotificationsService); -jest.doMock('./notifications', () => ({ +jest.doMock('@kbn/core-notifications-browser-internal', () => ({ NotificationsService: NotificationServiceConstructor, })); diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 761016e4b6647..0ba7d4f1fc285 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -28,9 +28,9 @@ import { DeprecationsService } from '@kbn/core-deprecations-browser-internal'; import { IntegrationsService } from '@kbn/core-integrations-browser-internal'; import { OverlayService } from '@kbn/core-overlays-browser-internal'; import { KBN_LOAD_MARKS } from '@kbn/core-mount-utils-browser-internal'; +import { NotificationsService } from '@kbn/core-notifications-browser-internal'; import { CoreSetup, CoreStart } from '.'; import { ChromeService } from './chrome'; -import { NotificationsService } from './notifications'; import { PluginsService } from './plugins'; import { ApplicationService } from './application'; import { RenderingService } from './rendering'; diff --git a/src/core/public/index.ts b/src/core/public/index.ts index cb105adb76e13..fe18a711123e6 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -46,6 +46,7 @@ import type { UiSettingsState, IUiSettingsClient } from '@kbn/core-ui-settings-b import type { DeprecationsServiceStart } from '@kbn/core-deprecations-browser'; import type { Capabilities } from '@kbn/core-capabilities-common'; import type { OverlayStart } from '@kbn/core-overlays-browser'; +import type { NotificationsSetup, NotificationsStart } from '@kbn/core-notifications-browser'; import type { ChromeBadge, ChromeBreadcrumb, @@ -68,7 +69,6 @@ import type { NavType, ChromeHelpMenuActions, } from './chrome'; -import type { NotificationsSetup, NotificationsStart } from './notifications'; import type { Plugin, PluginInitializer, @@ -206,13 +206,14 @@ export type { Toast, ToastInput, IToasts, - ToastsApi, ToastInputFields, ToastsSetup, ToastsStart, ToastOptions, ErrorToastOptions, -} from './notifications'; +} from '@kbn/core-notifications-browser'; + +export type { ToastsApi } from '@kbn/core-notifications-browser-internal'; export type { ThemeServiceSetup, ThemeServiceStart, CoreTheme } from '@kbn/core-theme-browser'; diff --git a/src/core/public/mocks.ts b/src/core/public/mocks.ts index 1824efc31fcf4..38d9431e6d0e6 100644 --- a/src/core/public/mocks.ts +++ b/src/core/public/mocks.ts @@ -20,12 +20,12 @@ import { httpServiceMock } from '@kbn/core-http-browser-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; import { deprecationsServiceMock } from '@kbn/core-deprecations-browser-mocks'; import { overlayServiceMock } from '@kbn/core-overlays-browser-mocks'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import type { PluginInitializerContext, AppMountParameters } from '.'; // Import values from their individual modules instead. import { ScopedHistory } from './application'; import { applicationServiceMock } from './application/application_service.mock'; import { chromeServiceMock } from './chrome/chrome_service.mock'; -import { notificationServiceMock } from './notifications/notifications_service.mock'; import { savedObjectsServiceMock } from './saved_objects/saved_objects_service.mock'; export { injectedMetadataServiceMock } from '@kbn/core-injected-metadata-browser-mocks'; @@ -37,7 +37,7 @@ export { executionContextServiceMock } from '@kbn/core-execution-context-browser export { fatalErrorsServiceMock } from '@kbn/core-fatal-errors-browser-mocks'; export { httpServiceMock } from '@kbn/core-http-browser-mocks'; export { i18nServiceMock } from '@kbn/core-i18n-browser-mocks'; -export { notificationServiceMock } from './notifications/notifications_service.mock'; +export { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; export { overlayServiceMock } from '@kbn/core-overlays-browser-mocks'; export { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; export { savedObjectsServiceMock } from './saved_objects/saved_objects_service.mock'; diff --git a/src/core/public/plugins/plugins_service.test.ts b/src/core/public/plugins/plugins_service.test.ts index 48a8a31703216..bd2c5f5fb9705 100644 --- a/src/core/public/plugins/plugins_service.test.ts +++ b/src/core/public/plugins/plugins_service.test.ts @@ -29,7 +29,7 @@ import { } from './plugins_service'; import type { InjectedMetadataPlugin } from '@kbn/core-injected-metadata-common-internal'; -import { notificationServiceMock } from '../notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { applicationServiceMock } from '../application/application_service.mock'; import { overlayServiceMock } from '@kbn/core-overlays-browser-mocks'; import { chromeServiceMock } from '../chrome/chrome_service.mock'; diff --git a/src/core/server/core_app/assets/legacy_dark_theme.min.css b/src/core/server/core_app/assets/legacy_dark_theme.min.css new file mode 100644 index 0000000000000..052b0ee255004 --- /dev/null +++ b/src/core/server/core_app/assets/legacy_dark_theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:15px;padding-right:15px;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}.table{font-size:14px;margin-bottom:20px;max-width:100%;width:100%}.table thead{font-size:12px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #343741;line-height:1.42857143;padding:8px;vertical-align:top}.table>thead>tr>th{border-bottom:1px solid #343741;vertical-align:bottom}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #343741}.table .table{background-color:#1d1e24}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{font-size:12px;padding:5px}.table-bordered{border:1px solid #343741}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-hover>tbody>tr:hover,.table-striped>tbody>tr:nth-of-type(odd){background-color:#343741}table col[class*=col-]{display:table-column;float:none;position:static}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none;position:static}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#343741}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#292b33}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#7de2d1}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#68ddca}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#1ba9f5}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#0a9dec}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#ff977a}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#ff8361}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f66}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ff4c4c}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #343741;margin-bottom:15px;overflow-y:hidden;width:100%}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.form-control{background-color:#1a1a20;background-image:none;border:1px solid #343741;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#f5f7fa;display:block;font-size:14px;height:32px;line-height:1.42857143;padding:5px 15px;-webkit-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.form-control:focus{border-color:#1ba9f5;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px #1ba9f599;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px #1ba9f599;outline:0}.form-control::-moz-placeholder{color:#535966;opacity:1}.form-control:-ms-input-placeholder{color:#535966}.form-control::-webkit-input-placeholder{color:#535966}.form-control::-ms-expand{background-color:initial;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#343741;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}.form-group:not(:empty){margin-bottom:15px}.checkbox,.radio{display:block;margin-bottom:10px;margin-top:10px;position:relative}.checkbox label,.radio label{cursor:pointer;font-weight:400;margin-bottom:0;min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-left:-20px;margin-top:4px\9;position:absolute}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{cursor:pointer;display:inline-block;font-weight:400;margin-bottom:0;padding-left:20px;position:relative;vertical-align:middle}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-left:10px;margin-top:0}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline{cursor:not-allowed}.form-control-static{margin-bottom:0;min-height:34px;padding-bottom:6px;padding-top:6px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{border-radius:4px;font-size:12px;height:32px;line-height:1.5;padding:6px 9px}select.input-sm{height:32px;line-height:32px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{border-radius:4px;font-size:12px;height:32px;line-height:1.5;padding:6px 9px}.form-group-sm select.form-control{height:32px;line-height:32px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{font-size:12px;height:32px;line-height:1.5;min-height:32px;padding:7px 9px}.input-lg{border-radius:4px;font-size:18px;height:62px;line-height:1.3333333;padding:18px 27px}select.input-lg{height:62px;line-height:62px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{border-radius:4px;font-size:18px;height:62px;line-height:1.3333333;padding:18px 27px}.form-group-lg select.form-control{height:62px;line-height:62px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{font-size:18px;height:62px;line-height:1.3333333;min-height:38px;padding:19px 27px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{display:block;height:32px;line-height:32px;pointer-events:none;position:absolute;right:0;text-align:center;top:0;width:32px;z-index:2}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{height:62px;line-height:62px;width:62px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{height:32px;line-height:32px;width:32px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#1d1e24}.has-success .form-control{border-color:#1d1e24;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#060608;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #4b4d5c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #4b4d5c}.has-success .input-group-addon{background-color:#7de2d1;border-color:#1d1e24;color:#1d1e24}.has-success .form-control-feedback,.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#1d1e24}.has-warning .form-control{border-color:#1d1e24;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#060608;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #4b4d5c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #4b4d5c}.has-warning .input-group-addon{background-color:#ff977a;border-color:#1d1e24;color:#1d1e24}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label,.has-warning .form-control-feedback{color:#1d1e24}.has-error .form-control{border-color:#1d1e24;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#060608;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #4b4d5c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #4b4d5c}.has-error .input-group-addon{background-color:#f66;border-color:#1d1e24;color:#1d1e24}.has-error .form-control-feedback{color:#1d1e24}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{color:#fff;display:block;margin-bottom:10px;margin-top:5px}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-bottom:0;margin-top:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{margin-left:0;position:relative}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-bottom:0;margin-top:0;padding-top:6px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:26px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{margin-bottom:0;padding-top:6px;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{font-size:18px;padding-top:19px}.form-horizontal .form-group-sm .control-label{font-size:12px;padding-top:7px}}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-muted{color:#3e434d}.text-primary{color:#f5f7fa}a.text-primary:focus,a.text-primary:hover{color:#d3dce9}.text-success{color:#1d1e24}a.text-success:focus,a.text-success:hover{color:#060608}.text-info{color:#1d1e24}a.text-info:focus,a.text-info:hover{color:#060608}.text-warning{color:#1d1e24}a.text-warning:focus,a.text-warning:hover{color:#060608}.text-danger{color:#1d1e24}a.text-danger:focus,a.text-danger:hover{color:#060608}.bg-info{background-color:#1ba9f5}a.bg-info:focus,a.bg-info:hover{background-color:#098dd4}.list-unstyled{list-style:none;padding-left:0}@media (min-width:0){.dl-horizontal dt{clear:left;float:left;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:160px}.dl-horizontal dd{margin-left:180px}}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;position:relative;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-timing-function:ease;transition-timing-function:ease}.btn{background-image:none;border:1px solid #0000;border-radius:4px;cursor:pointer;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin-bottom:0;padding:5px 15px;text-align:center;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{box-shadow:0 0 0 1px #fff,0 0 0 2px #0079a5}.btn.focus,.btn:focus,.btn:hover{color:#1d1e24;text-decoration:none}.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125);outline:0}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{-webkit-box-shadow:none;box-shadow:none;cursor:not-allowed;filter:alpha(opacity=65);opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{background-color:#1ba9f5;border-color:#1ba9f5;color:#1d1e24}.btn-default.focus,.btn-default:focus{background-color:#098dd4;border-color:#065c8a;color:#1d1e24}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{background-color:#098dd4;border-color:#0987ca;color:#1d1e24}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{background-color:#0876b2;border-color:#065c8a;color:#1d1e24}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#1ba9f5;border-color:#1ba9f5}.btn-default .badge{background-color:#1d1e24;color:#1ba9f5}.btn-primary{background-color:#1ba9f5;border-color:#1ba9f5;color:#1d1e24}.btn-primary.focus,.btn-primary:focus{background-color:#098dd4;border-color:#065c8a;color:#1d1e24}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{background-color:#098dd4;border-color:#0987ca;color:#1d1e24}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{background-color:#0876b2;border-color:#065c8a;color:#1d1e24}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#1ba9f5;border-color:#1ba9f5}.btn-primary .badge{background-color:#1d1e24;color:#1ba9f5}.btn-xs{border-radius:4px;font-size:12px;line-height:1.5;padding:1px 5px}.navbar{border:1px solid #0000;margin-bottom:0;min-height:45px;position:relative}@media (min-width:0){.navbar{border-radius:4px}.navbar-header{float:left}}.navbar-collapse{-webkit-overflow-scrolling:touch;border-top:1px solid #0000;box-shadow:inset 0 1px 0 #ffffff1a;overflow-x:visible;padding-left:10px;padding-right:10px}.navbar-collapse.in{overflow-y:auto}@media (min-width:0){.navbar-collapse{border-top:0;box-shadow:none;width:auto}.navbar-collapse.collapse{display:block!important;height:auto!important;overflow:visible!important;padding-bottom:0}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-left:-10px;margin-right:-10px}@media (min-width:0){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-left:0;margin-right:0}}.navbar-fixed-bottom,.navbar-fixed-top{left:0;position:fixed;right:0;z-index:1050}@media (min-width:0){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{border-width:0 0 1px;top:0}.navbar-fixed-bottom{border-width:1px 0 0;bottom:0;margin-bottom:0}.navbar-brand{float:left;font-size:18px;height:45px;line-height:20px;padding:12.5px 10px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:0){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{background-color:initial;background-image:none;border:1px solid #0000;border-radius:4px;float:right;margin-bottom:5.5px;margin-right:10px;margin-top:5.5px;padding:9px 10px;position:relative}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{border-radius:1px;display:block;height:2px;width:22px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:0){.navbar-toggle{display:none}}.navbar-nav{margin:6.25px -10px}.navbar-nav>li>a{line-height:20px;padding-bottom:10px;padding-top:10px}@media (max-width:-1){.navbar-nav .open .dropdown-menu{background-color:initial;border:0;box-shadow:none;float:none;margin-top:0;position:static;width:auto}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:0){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-bottom:12.5px;padding-top:12.5px}}.navbar-form{border-bottom:1px solid #0000;border-top:1px solid #0000;-webkit-box-shadow:inset 0 1px 0 #ffffff1a,0 1px 0 #ffffff1a;box-shadow:inset 0 1px 0 #ffffff1a,0 1px 0 #ffffff1a;margin:6.5px -10px;padding:10px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;vertical-align:middle;width:auto}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-bottom:0;margin-top:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{margin-left:0;position:relative}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:-1){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:0){.navbar-form{border:0;-webkit-box-shadow:none;box-shadow:none;margin-left:0;margin-right:0;padding-bottom:0;padding-top:0;width:auto}}.navbar-nav>li>.dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:4px;border-top-right-radius:4px;margin-bottom:0}.navbar-text{margin-bottom:12.5px;margin-top:12.5px}@media (min-width:0){.navbar-text{float:left;margin-left:10px;margin-right:10px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-10px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#000;border-color:#0000}.navbar-default .navbar-brand{color:#d4dae5}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{background-color:initial;color:#d4dae5}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#d4dae5}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{background-color:initial;color:#d4dae5}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{background-color:initial;color:#f5f7fa}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{background-color:initial;color:#d4dae5}.navbar-default .navbar-toggle{border-color:#000}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#000}.navbar-default .navbar-toggle .icon-bar{background-color:#1d1e24}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#0000}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:initial;color:#f5f7fa}@media (max-width:-1){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#d4dae5}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{background-color:initial;color:#d4dae5}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{background-color:initial;color:#f5f7fa}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{background-color:initial;color:#d4dae5}}.navbar-default .navbar-link,.navbar-default .navbar-link:hover{color:#d4dae5}.navbar-inverse{background-color:#f5f7fa;border-color:#d3dce9}.navbar-inverse .navbar-brand{color:#1d1e24}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{background-color:#fff;color:#1d1e24}.navbar-inverse .navbar-text{color:#1d1e24}.navbar-inverse .navbar-nav>li>a{color:#343741}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{background-color:#fff;color:#1d1e24}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{background-color:#d4dae5;color:#1d1e24}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{background-color:initial;color:#3e434d}.navbar-inverse .navbar-toggle{border-color:#d3dce9}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#d3dce9}.navbar-inverse .navbar-toggle .icon-bar{background-color:#1d1e24}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#dde4ee}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#d4dae5;color:#1d1e24}@media (max-width:-1){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#d3dce9}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#d3dce9}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#343741}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{background-color:#fff;color:#1d1e24}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{background-color:#d4dae5;color:#1d1e24}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{background-color:initial;color:#3e434d}}.navbar-inverse .navbar-link{color:#343741}.navbar-inverse .navbar-link:hover{color:#1d1e24}.close{color:#fff;filter:alpha(opacity=20);float:right;font-size:21px;font-weight:700;line-height:1;opacity:.2;text-shadow:none}.close:focus,.close:hover{color:#fff;cursor:pointer;filter:alpha(opacity=50);opacity:.5;text-decoration:none}button.close{-webkit-appearance:none;background:#0000;border:0;cursor:pointer;padding:0}.modal,.modal-open{overflow:hidden}.modal{-webkit-overflow-scrolling:touch;bottom:0;display:none;left:0;outline:0;position:fixed;right:0;top:0;z-index:1070}.modal.fade .modal-dialog{-webkit-transform:translateY(-25%);-ms-transform:translateY(-25%);-o-transform:translateY(-25%);transform:translateY(-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{margin:10px;position:relative;width:auto}.modal-content{background-clip:padding-box;background-color:#1d1e24;border:1px solid #0003;border-radius:4px;-webkit-box-shadow:0 3px 9px #00000080;box-shadow:0 3px 9px #00000080;outline:0;position:relative}.modal-backdrop{background-color:#fff;bottom:0;left:0;position:fixed;right:0;top:0;z-index:1060}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{border-bottom:1px solid #e5e5e5;padding:15px}.modal-header .close{margin-top:-2px}.modal-title{line-height:1.42857143;margin:0}.modal-body{padding:15px;position:relative}.modal-footer{border-top:1px solid #e5e5e5;padding:15px;text-align:right}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:768px){.modal-dialog{margin:30px auto;width:600px}.modal-content{-webkit-box-shadow:0 5px 15px #00000080;box-shadow:0 5px 15px #00000080}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}@-webkit-keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.progress{background-color:#2d3039;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px #0000001a;box-shadow:inset 0 1px 2px #0000001a;height:20px;margin-bottom:20px;overflow:hidden}.progress-bar{background-color:#54b399;color:#1d1e24;float:left;font-size:12px;height:100%;line-height:20px;text-align:center;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease;width:0}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#7de2d1}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.progress-bar-info{background-color:#1ba9f5}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.progress-bar-warning{background-color:#ff977a}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.progress-bar-danger{background-color:#f66}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{background-color:#1d1e24;border:1px solid #343741;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;margin-bottom:0}.list-group-item--noBorder{border-top:0}a.list-group-item,button.list-group-item{color:#d4dae5}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#f5f7fa}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{background-color:#25262e;color:#d4dae5;text-decoration:none}button.list-group-item{text-align:left;width:100%}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#343741;color:#3e434d;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#3e434d}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{background-color:#f5f7fa;border-color:#f5f7fa;color:#f5f7fa;z-index:2}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#fff}.list-group-item-success{background-color:#7de2d1;color:#1d1e24}a.list-group-item-success,button.list-group-item-success{color:#1d1e24}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{background-color:#68ddca;color:#1d1e24}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{background-color:#1d1e24;border-color:#1d1e24;color:#fff}.list-group-item-info{background-color:#1ba9f5;color:#1d1e24}a.list-group-item-info,button.list-group-item-info{color:#1d1e24}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{background-color:#0a9dec;color:#1d1e24}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{background-color:#1d1e24;border-color:#1d1e24;color:#fff}.list-group-item-warning{background-color:#ff977a;color:#1d1e24}a.list-group-item-warning,button.list-group-item-warning{color:#1d1e24}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{background-color:#ff8361;color:#1d1e24}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{background-color:#1d1e24;border-color:#1d1e24;color:#fff}.list-group-item-danger{background-color:#f66;color:#1d1e24}a.list-group-item-danger,button.list-group-item-danger{color:#1d1e24}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{background-color:#ff4c4c;color:#1d1e24}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{background-color:#1d1e24;border-color:#1d1e24;color:#fff}.list-group-item-heading{margin-bottom:5px;margin-top:0}.list-group-item-text{line-height:1.3;margin-bottom:0}.nav{list-style:none;margin-bottom:0;padding-left:0}.nav>li,.nav>li>a{display:block;position:relative}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{background-color:#343741;text-decoration:none}.nav>li.disabled>a{color:#3e434d}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{background-color:initial;color:#3e434d;cursor:not-allowed;text-decoration:none}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#343741;border-color:#1ba9f5}.nav .nav-divider{background-color:#e5e5e5;height:1px;margin:9px 0;overflow:hidden}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #343741}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{border:1px solid #0000;border-radius:4px 4px 0 0;line-height:1.42857143;margin-right:2px}.nav-tabs>li>a:hover{background-color:#1d1e24;border-color:#343741}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{background-color:#1d1e24;border:1px solid #343741;border-bottom-color:#0000;color:#f5f7fa;cursor:default}.nav-tabs.nav-justified{border-bottom:0;width:100%}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{border-radius:4px;margin-right:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #1d1e24}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #1d1e24;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#1d1e24}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{background-color:#1ba9f5;color:#1d1e24}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-left:0;margin-top:2px}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{border-radius:4px;margin-right:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #1d1e24}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #1d1e24;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#1d1e24}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.alert{border:1px solid #0000;border-radius:4px;margin-bottom:20px;padding:15px}.alert h4{color:inherit;margin-top:0}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{color:inherit;position:relative;right:-21px;top:-2px}.alert-success{background-color:#7de2d1;border-color:#53d9c2;color:#1d1e24}.alert-success hr{border-top-color:#3ed4bb}.alert-success .alert-link{color:#060608}.alert-info{background-color:#1ba9f5;border-color:#098dd4;color:#1d1e24}.alert-info hr{border-top-color:#087dbb}.alert-info .alert-link{color:#060608}.alert-warning{background-color:#ff977a;border-color:#ff6f47;color:#1d1e24}.alert-warning hr{border-top-color:#ff5b2e}.alert-warning .alert-link{color:#060608}.alert-danger{background-color:#f66;border-color:#f33;color:#1d1e24}.alert-danger hr{border-top-color:#ff1919}.alert-danger .alert-link{color:#060608}.bsTooltip{word-wrap:normal;display:block;filter:alpha(opacity=0);font-family:Open Sans,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1040}.bsTooltip.in{filter:alpha(opacity=80);opacity:.8}.bsTooltip.top{margin-top:-3px;padding:5px 0}.bsTooltip.right{margin-left:3px;padding:0 5px}.bsTooltip.bottom{margin-top:3px;padding:5px 0}.bsTooltip.left{margin-left:-3px;padding:0 5px}.bsTooltip-inner{background-color:#000;border-radius:4px;color:#fff;max-width:200px;padding:3px 8px;text-align:center}.bsTooltip-arrow{border-color:#0000;border-style:solid;height:0;position:absolute;width:0}.bsTooltip.top .bsTooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;left:50%;margin-left:-5px}.bsTooltip.top-left .bsTooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;margin-bottom:-5px;right:5px}.bsTooltip.top-right .bsTooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;left:5px;margin-bottom:-5px}.bsTooltip.right .bsTooltip-arrow{border-right-color:#000;border-width:5px 5px 5px 0;left:0;margin-top:-5px;top:50%}.bsTooltip.left .bsTooltip-arrow{border-left-color:#000;border-width:5px 0 5px 5px;margin-top:-5px;right:0;top:50%}.bsTooltip.bottom .bsTooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;left:50%;margin-left:-5px;top:0}.bsTooltip.bottom-left .bsTooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;margin-top:-5px;right:5px;top:0}.bsTooltip.bottom-right .bsTooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;left:5px;margin-top:-5px;top:0}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.caret{border-left:4px solid #0000;border-right:4px solid #0000;border-top:4px dashed;border-top:4px solid\9;display:inline-block;height:0;margin-left:2px;vertical-align:middle;width:0}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{background-clip:padding-box;background-color:#1d1e24;border:1px solid #343741;border-radius:4px;box-shadow:0 4px 8px 0 #0000001a;display:none;float:left;font-size:14px;left:0;list-style:none;margin:2px 0 0;min-width:160px;padding:5px 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu.pull-right{left:auto;right:0}.dropdown-menu .divider{background-color:#343741;height:1px;margin:9px 0;overflow:hidden}.dropdown-menu>li>a,.dropdown-menu>li>button{clear:both;color:#ababab;display:block;font-weight:400;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-menu>li>button{appearance:none;background:none;border:none;text-align:left;width:100%}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-menu>li>button:focus,.dropdown-menu>li>button:hover{background-color:#f5f7fa;color:#1d1e24;text-decoration:none}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>button,.dropdown-menu>.active>button:focus,.dropdown-menu>.active>button:hover{background-color:#f5f7fa;color:#1d1e24;outline:0;text-decoration:none}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#535966}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{background-color:initial;background-image:none;cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);text-decoration:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{color:#535966;display:block;font-size:12px;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-backdrop{bottom:0;left:0;position:fixed;right:0;top:0;z-index:990}.pull-right>.dropdown-menu{left:auto;right:0}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-bottom:4px dashed;border-bottom:4px solid\9;border-top:0;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{bottom:100%;margin-bottom:2px;top:auto}@media (min-width:0){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{border-collapse:initial;display:table;position:relative}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;margin-bottom:0;position:relative;width:100%;z-index:2}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon{border-radius:4px;font-size:18px;height:62px;line-height:1.3333333;padding:18px 27px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon{height:62px;line-height:62px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon{border-radius:4px;font-size:12px;height:32px;line-height:1.5;padding:6px 9px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon{height:32px;line-height:32px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon{height:auto}.input-group .form-control,.input-group-addon{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child){border-radius:0}.input-group-addon{background-color:#343741;border:1px solid #343741;border-radius:4px;color:#f5f7fa;font-size:14px;font-weight:400;line-height:1;padding:5px 15px;text-align:center;vertical-align:middle;white-space:nowrap;width:1%}.input-group-addon.input-sm{border-radius:4px;font-size:12px;padding:6px 9px}.input-group-addon.input-lg{border-radius:4px;font-size:18px;padding:18px 27px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.pagination{border-radius:4px;display:inline-block;margin:20px 0;padding-left:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{background-color:initial;border:1px solid #0000;color:#1ba9f5;float:left;line-height:1.42857143;margin-left:-1px;padding:5px 15px;position:relative;text-decoration:none}.pagination>li:first-child>a,.pagination>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px;margin-left:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{background-color:#0000;border-color:#0000;color:#1ba9f5;z-index:2}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{background-color:#0000;border-color:#0000;color:#f5f7fa;cursor:default;z-index:3}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{background-color:#26262600;border-color:#0000;color:#f5f7fa;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;line-height:1.3333333;padding:18px 27px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;line-height:1.5;padding:6px 9px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pager{list-style:none;margin:20px 0;padding-left:0;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{background-color:initial;border:1px solid #0000;border-radius:0;display:inline-block;padding:5px 14px}.pager li>a:focus,.pager li>a:hover{background-color:#0000;text-decoration:none}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{background-color:initial;color:#1d1e24;cursor:not-allowed}.label{border-radius:.25em;color:#1d1e24;display:inline;font-size:75%;font-weight:700;line-height:1;padding:.2em .6em .3em;text-align:center;vertical-align:initial;white-space:nowrap}a.label:focus,a.label:hover{color:#1d1e24;cursor:pointer;text-decoration:none}.label:empty{display:none}.label-default{background-color:#1ba9f5}.label-default[href]:focus,.label-default[href]:hover{background-color:#098dd4}.label-primary{background-color:#f5f7fa}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#d3dce9}.label-success{background-color:#7de2d1}.label-success[href]:focus,.label-success[href]:hover{background-color:#53d9c2}.label-info{background-color:#1ba9f5}.label-info[href]:focus,.label-info[href]:hover{background-color:#098dd4}.label-warning{background-color:#ff977a}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ff6f47}.label-danger{background-color:#f66}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#f33}.panel{background-color:#1d1e24;border:1px solid #0000;border-radius:4px;-webkit-box-shadow:0 1px 1px #0000000d;box-shadow:0 1px 1px #0000000d;margin-bottom:20px}.panel-body{padding:15px}.panel-heading{border-bottom:1px solid #0000;border-top-left-radius:3px;border-top-right-radius:3px;padding:10px 15px}.panel-heading>.dropdown .dropdown-toggle,.panel-title{color:inherit}.panel-title{font-size:16px;margin-bottom:0;margin-top:0}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{background-color:#25262e;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #343741;padding:10px 15px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-radius:0;border-width:1px 0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #343741}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{border-radius:4px;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #343741}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #343741}.panel-default{border-color:#343741}.panel-default>.panel-heading{background-color:#25262e;border-color:#343741;color:#ababab}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#343741}.panel-default>.panel-heading .badge{background-color:#ababab;color:#25262e}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#343741}.panel-primary{border-color:#f5f7fa}.panel-primary>.panel-heading{background-color:#f5f7fa;border-color:#f5f7fa;color:#1d1e24}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f5f7fa}.panel-primary>.panel-heading .badge{background-color:#1d1e24;color:#f5f7fa}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f5f7fa}.panel-success{border-color:#53d9c2}.panel-success>.panel-heading{background-color:#7de2d1;border-color:#53d9c2;color:#1d1e24}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#53d9c2}.panel-success>.panel-heading .badge{background-color:#1d1e24;color:#7de2d1}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#53d9c2}.panel-info{border-color:#098dd4}.panel-info>.panel-heading{background-color:#1ba9f5;border-color:#098dd4;color:#1d1e24}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#098dd4}.panel-info>.panel-heading .badge{background-color:#1d1e24;color:#1ba9f5}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#098dd4}.panel-warning{border-color:#ff6f47}.panel-warning>.panel-heading{background-color:#ff977a;border-color:#ff6f47;color:#1d1e24}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ff6f47}.panel-warning>.panel-heading .badge{background-color:#1d1e24;color:#ff977a}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ff6f47}.panel-danger{border-color:#f33}.panel-danger>.panel-heading{background-color:#f66;border-color:#f33;color:#1d1e24}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f33}.panel-danger>.panel-heading .badge{background-color:#1d1e24;color:#f66}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f33}.popover{word-wrap:normal;background-clip:padding-box;background-color:#1d1e24;border:1px solid #343741;border-radius:4px;box-shadow:0 4px 8px 0 #0000001a;display:none;font-family:Open Sans,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;max-width:276px;padding:1px;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1010}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{background-color:#16171c;border-bottom:1px solid #0b0b0d;border-radius:3px 3px 0 0;font-size:14px;margin:0;padding:8px 14px}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{border-color:#0000;border-style:solid;display:block;height:0;position:absolute;width:0}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{border-bottom-width:0;border-top-color:#343741;bottom:-11px;left:50%;margin-left:-11px}.popover.top>.arrow:after{border-bottom-width:0;border-top-color:#1d1e24;bottom:1px;content:" ";margin-left:-10px}.popover.right>.arrow{border-left-width:0;border-right-color:#343741;left:-11px;margin-top:-11px;top:50%}.popover.right>.arrow:after{border-left-width:0;border-right-color:#1d1e24;bottom:-10px;content:" ";left:1px}.popover.bottom>.arrow{border-bottom-color:#343741;border-top-width:0;left:50%;margin-left:-11px;top:-11px}.popover.bottom>.arrow:after{border-bottom-color:#1d1e24;border-top-width:0;content:" ";margin-left:-10px;top:1px}.popover.left>.arrow{border-left-color:#343741;border-right-width:0;margin-top:-11px;right:-11px;top:50%}.popover.left>.arrow:after{border-left-color:#1d1e24;border-right-width:0;bottom:-10px;content:" ";right:1px}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{background-color:initial;border:0;color:#0000;font:0/0 a;text-shadow:none}.hidden{display:none!important}.affix{position:fixed}.navbar>.container-fluid>.navbar-form:not(.pull-right):first-child,.navbar>.container-fluid>.navbar-nav:not(.pull-right):first-child{margin-left:-15px;margin-top:4px}.navbar{border-width:0}.navbar-btn-link{border-radius:0;margin:0}@media (max-width:768px){.navbar-btn-link{text-align:left;width:100%}}.navbar-default .badge{background-color:#1d1e24;color:#000}.navbar-inverse .kbnGlobalNav__logoBrand{background-color:#fff;height:45px;width:252px}.navbar-inverse .kbnGlobalNav__smallLogoBrand{background-color:#fff;height:45px;width:45px}.navbar-inverse .badge{background-color:#1d1e24;color:#fff}.navbar-brand{cursor:default;font-size:1.8em;user-select:none}.navbar-nav{font-size:12px}.navbar-nav>.active>a{background-color:initial;border-bottom-color:#ababab}.navbar-toggle{margin-top:4px}.text-primary,.text-primary:hover{color:#f5f7fa}.text-success,.text-success:hover{color:#7de2d1}.text-danger,.text-danger:hover{color:#f66}.text-warning,.text-warning:hover{color:#ff977a}.text-info,.text-info:hover{color:#1ba9f5}.table .danger,.table .danger a,.table .info,.table .info a,.table .success,.table .success a,.table .warning,.table .warning a,table .danger,table .danger a,table .info,table .info a,table .success,table .success a,table .warning,table .warning a{color:#1d1e24}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #343741}.form-control,input{border-width:1px}.form-control,.form-control:focus,input,input:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#ff977a}.has-warning .form-control,.has-warning .form-control:focus{border:1px solid #ff977a}.has-warning .input-group-addon{border-color:#ff977a}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#f66}.has-error .form-control,.has-error .form-control:focus{border:1px solid #f66}.has-error .input-group-addon{border-color:#f66}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#7de2d1}.has-success .form-control,.has-success .form-control:focus{border:solid #7de2d1}.has-success .input-group-addon{border-color:#7de2d1}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{border-color:#0000}.pager a,.pager a:hover{color:#1d1e24}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{background-color:#26262600}.panel{border-radius:0;-webkit-box-shadow:0 0 0 #0000;box-shadow:0 0 0 #0000}.progress{-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none} \ No newline at end of file diff --git a/src/core/server/core_app/assets/legacy_light_theme.min.css b/src/core/server/core_app/assets/legacy_light_theme.min.css new file mode 100644 index 0000000000000..3dece6ea03d7e --- /dev/null +++ b/src/core/server/core_app/assets/legacy_light_theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{min-height:1px;padding-left:15px;padding-right:15px;position:relative}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}.table{font-size:14px;margin-bottom:20px;max-width:100%;width:100%}.table thead{font-size:12px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #d3dae6;line-height:1.42857143;padding:8px;vertical-align:top}.table>thead>tr>th{border-bottom:1px solid #d3dae6;vertical-align:bottom}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #d3dae6}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{font-size:12px;padding:5px}.table-bordered{border:1px solid #d3dae6}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-hover>tbody>tr:hover,.table-striped>tbody>tr:nth-of-type(odd){background-color:#d3dae6}table col[class*=col-]{display:table-column;float:none;position:static}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none;position:static}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#d3dae6}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#c3ccdd}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#017d73}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#01645c}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#006bb4}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#005c9b}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#f5a700}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#dc9600}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#bd271e}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#a7221b}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #d3dae6;margin-bottom:15px;overflow-y:hidden;width:100%}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.form-control{background-color:#fafbfd;background-image:none;border:1px solid #d3dae6;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#343741;display:block;font-size:14px;height:32px;line-height:1.42857143;padding:5px 15px;-webkit-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-o-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.form-control:focus{border-color:#006bb4;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px #006bb499;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px #006bb499;outline:0}.form-control::-moz-placeholder{color:#98a2b3;opacity:1}.form-control:-ms-input-placeholder{color:#98a2b3}.form-control::-webkit-input-placeholder{color:#98a2b3}.form-control::-ms-expand{background-color:initial;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#d3dae6;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}.form-group:not(:empty){margin-bottom:15px}.checkbox,.radio{display:block;margin-bottom:10px;margin-top:10px;position:relative}.checkbox label,.radio label{cursor:pointer;font-weight:400;margin-bottom:0;min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-left:-20px;margin-top:4px\9;position:absolute}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{cursor:pointer;display:inline-block;font-weight:400;margin-bottom:0;padding-left:20px;position:relative;vertical-align:middle}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-left:10px;margin-top:0}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline{cursor:not-allowed}.form-control-static{margin-bottom:0;min-height:34px;padding-bottom:6px;padding-top:6px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{border-radius:4px;font-size:12px;height:32px;line-height:1.5;padding:6px 9px}select.input-sm{height:32px;line-height:32px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{border-radius:4px;font-size:12px;height:32px;line-height:1.5;padding:6px 9px}.form-group-sm select.form-control{height:32px;line-height:32px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{font-size:12px;height:32px;line-height:1.5;min-height:32px;padding:7px 9px}.input-lg{border-radius:4px;font-size:18px;height:62px;line-height:1.3333333;padding:18px 27px}select.input-lg{height:62px;line-height:62px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{border-radius:4px;font-size:18px;height:62px;line-height:1.3333333;padding:18px 27px}.form-group-lg select.form-control{height:62px;line-height:62px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{font-size:18px;height:62px;line-height:1.3333333;min-height:38px;padding:19px 27px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{display:block;height:32px;line-height:32px;pointer-events:none;position:absolute;right:0;text-align:center;top:0;width:32px;z-index:2}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{height:62px;line-height:62px;width:62px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{height:32px;line-height:32px;width:32px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#fff}.has-success .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff}.has-success .input-group-addon{background-color:#017d73;border-color:#fff;color:#fff}.has-success .form-control-feedback,.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#fff}.has-warning .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff}.has-warning .input-group-addon{background-color:#f5a700;border-color:#fff;color:#fff}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label,.has-warning .form-control-feedback{color:#fff}.has-error .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #fff}.has-error .input-group-addon{background-color:#bd271e;border-color:#fff;color:#fff}.has-error .form-control-feedback{color:#fff}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{color:#6d7388;display:block;margin-bottom:10px;margin-top:5px}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-bottom:0;margin-top:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{margin-left:0;position:relative}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-bottom:0;margin-top:0;padding-top:6px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:26px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{margin-bottom:0;padding-top:6px;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{font-size:18px;padding-top:19px}.form-horizontal .form-group-sm .control-label{font-size:12px;padding-top:7px}}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-muted{color:#b2bac6}.text-primary{color:#343741}a.text-primary:focus,a.text-primary:hover{color:#1d1f25}.text-success{color:#fff}a.text-success:focus,a.text-success:hover{color:#e6e6e6}.text-info{color:#fff}a.text-info:focus,a.text-info:hover{color:#e6e6e6}.text-warning{color:#fff}a.text-warning:focus,a.text-warning:hover{color:#e6e6e6}.text-danger{color:#fff}a.text-danger:focus,a.text-danger:hover{color:#e6e6e6}.bg-info{background-color:#006bb4}a.bg-info:focus,a.bg-info:hover{background-color:#004d81}.list-unstyled{list-style:none;padding-left:0}@media (min-width:0){.dl-horizontal dt{clear:left;float:left;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:160px}.dl-horizontal dd{margin-left:180px}}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;position:relative;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-timing-function:ease;transition-timing-function:ease}.btn{background-image:none;border:1px solid #0000;border-radius:4px;cursor:pointer;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin-bottom:0;padding:5px 15px;text-align:center;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{box-shadow:0 0 0 1px #fff,0 0 0 2px #0079a5}.btn.focus,.btn:focus,.btn:hover{color:#fff;text-decoration:none}.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125);outline:0}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{-webkit-box-shadow:none;box-shadow:none;cursor:not-allowed;filter:alpha(opacity=65);opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{background-color:#006bb4;border-color:#006bb4;color:#fff}.btn-default.focus,.btn-default:focus{background-color:#004d81;border-color:#001f35;color:#fff}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{background-color:#004d81;border-color:#004777;color:#fff}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{background-color:#00375d;border-color:#001f35;color:#fff}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#006bb4;border-color:#006bb4}.btn-default .badge{background-color:#fff;color:#006bb4}.btn-primary{background-color:#006bb4;border-color:#006bb4;color:#fff}.btn-primary.focus,.btn-primary:focus{background-color:#004d81;border-color:#001f35;color:#fff}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{background-color:#004d81;border-color:#004777;color:#fff}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{background-color:#00375d;border-color:#001f35;color:#fff}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#006bb4;border-color:#006bb4}.btn-primary .badge{background-color:#fff;color:#006bb4}.btn-xs{border-radius:4px;font-size:12px;line-height:1.5;padding:1px 5px}.navbar{border:1px solid #0000;margin-bottom:0;min-height:45px;position:relative}@media (min-width:0){.navbar{border-radius:4px}.navbar-header{float:left}}.navbar-collapse{-webkit-overflow-scrolling:touch;border-top:1px solid #0000;box-shadow:inset 0 1px 0 #ffffff1a;overflow-x:visible;padding-left:10px;padding-right:10px}.navbar-collapse.in{overflow-y:auto}@media (min-width:0){.navbar-collapse{border-top:0;box-shadow:none;width:auto}.navbar-collapse.collapse{display:block!important;height:auto!important;overflow:visible!important;padding-bottom:0}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-left:-10px;margin-right:-10px}@media (min-width:0){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-left:0;margin-right:0}}.navbar-fixed-bottom,.navbar-fixed-top{left:0;position:fixed;right:0;z-index:1050}@media (min-width:0){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{border-width:0 0 1px;top:0}.navbar-fixed-bottom{border-width:1px 0 0;bottom:0;margin-bottom:0}.navbar-brand{float:left;font-size:18px;height:45px;line-height:20px;padding:12.5px 10px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:0){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{background-color:initial;background-image:none;border:1px solid #0000;border-radius:4px;float:right;margin-bottom:5.5px;margin-right:10px;margin-top:5.5px;padding:9px 10px;position:relative}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{border-radius:1px;display:block;height:2px;width:22px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:0){.navbar-toggle{display:none}}.navbar-nav{margin:6.25px -10px}.navbar-nav>li>a{line-height:20px;padding-bottom:10px;padding-top:10px}@media (max-width:-1){.navbar-nav .open .dropdown-menu{background-color:initial;border:0;box-shadow:none;float:none;margin-top:0;position:static;width:auto}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:0){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-bottom:12.5px;padding-top:12.5px}}.navbar-form{border-bottom:1px solid #0000;border-top:1px solid #0000;-webkit-box-shadow:inset 0 1px 0 #ffffff1a,0 1px 0 #ffffff1a;box-shadow:inset 0 1px 0 #ffffff1a,0 1px 0 #ffffff1a;margin:6.5px -10px;padding:10px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;vertical-align:middle;width:auto}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-bottom:0;margin-top:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{margin-left:0;position:relative}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:-1){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:0){.navbar-form{border:0;-webkit-box-shadow:none;box-shadow:none;margin-left:0;margin-right:0;padding-bottom:0;padding-top:0;width:auto}}.navbar-nav>li>.dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:4px;border-top-right-radius:4px;margin-bottom:0}.navbar-text{margin-bottom:12.5px;margin-top:12.5px}@media (min-width:0){.navbar-text{float:left;margin-left:10px;margin-right:10px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-10px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f5f7fa;border-color:#0000}.navbar-default .navbar-brand{color:#69707d}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{background-color:initial;color:#69707d}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#69707d}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{background-color:initial;color:#69707d}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{background-color:initial;color:#343741}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{background-color:initial;color:#69707d}.navbar-default .navbar-toggle{border-color:#d3dce9}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#d3dce9}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#0000}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:initial;color:#343741}@media (max-width:-1){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#69707d}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{background-color:initial;color:#69707d}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{background-color:initial;color:#343741}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{background-color:initial;color:#69707d}}.navbar-default .navbar-link,.navbar-default .navbar-link:hover{color:#69707d}.navbar-inverse{background-color:#343741;border-color:#1d1f25}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{background-color:#4b4f5d;color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a{color:#d3dae6}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{background-color:#61677a;color:#fff}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{background-color:#69707d;color:#fff}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{background-color:initial;color:#b2bac6}.navbar-inverse .navbar-toggle{border-color:#1d1f25}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#1d1f25}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#24262d}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#69707d;color:#fff}@media (max-width:-1){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#1d1f25}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#1d1f25}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#d3dae6}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{background-color:#61677a;color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{background-color:#69707d;color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{background-color:initial;color:#b2bac6}}.navbar-inverse .navbar-link{color:#d3dae6}.navbar-inverse .navbar-link:hover{color:#fff}.close{color:#000;filter:alpha(opacity=20);float:right;font-size:21px;font-weight:700;line-height:1;opacity:.2;text-shadow:none}.close:focus,.close:hover{color:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;text-decoration:none}button.close{-webkit-appearance:none;background:#0000;border:0;cursor:pointer;padding:0}.modal,.modal-open{overflow:hidden}.modal{-webkit-overflow-scrolling:touch;bottom:0;display:none;left:0;outline:0;position:fixed;right:0;top:0;z-index:1070}.modal.fade .modal-dialog{-webkit-transform:translateY(-25%);-ms-transform:translateY(-25%);-o-transform:translateY(-25%);transform:translateY(-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{margin:10px;position:relative;width:auto}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid #0003;border-radius:4px;-webkit-box-shadow:0 3px 9px #00000080;box-shadow:0 3px 9px #00000080;outline:0;position:relative}.modal-backdrop{background-color:#000;bottom:0;left:0;position:fixed;right:0;top:0;z-index:1060}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{border-bottom:1px solid #e5e5e5;padding:15px}.modal-header .close{margin-top:-2px}.modal-title{line-height:1.42857143;margin:0}.modal-body{padding:15px;position:relative}.modal-footer{border-top:1px solid #e5e5e5;padding:15px;text-align:right}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:768px){.modal-dialog{margin:30px auto;width:600px}.modal-content{-webkit-box-shadow:0 5px 15px #00000080;box-shadow:0 5px 15px #00000080}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}@-webkit-keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.progress{background-color:#b8bec8;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px #0000001a;box-shadow:inset 0 1px 2px #0000001a;height:20px;margin-bottom:20px;overflow:hidden}.progress-bar{background-color:#54b399;color:#fff;float:left;font-size:12px;height:100%;line-height:20px;text-align:center;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease;width:0}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#017d73}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.progress-bar-info{background-color:#006bb4}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.progress-bar-warning{background-color:#f5a700}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.progress-bar-danger{background-color:#bd271e}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-image:-o-linear-gradient(45deg,#ffffff26 25%,#0000 25%,#0000 50%,#ffffff26 50%,#ffffff26 75%,#0000 75%,#0000);background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000)}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{background-color:#fff;border:1px solid #d3dae6;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;margin-bottom:0}.list-group-item--noBorder{border-top:0}a.list-group-item,button.list-group-item{color:#69707d}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#343741}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{background-color:#f5f7fa;color:#69707d;text-decoration:none}button.list-group-item{text-align:left;width:100%}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#d3dae6;color:#b2bac6;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#b2bac6}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{background-color:#343741;border-color:#343741;color:#343741;z-index:2}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#969bab}.list-group-item-success{background-color:#017d73;color:#fff}a.list-group-item-success,button.list-group-item-success{color:#fff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{background-color:#01645c;color:#fff}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{background-color:#fff;border-color:#fff;color:#fff}.list-group-item-info{background-color:#006bb4;color:#fff}a.list-group-item-info,button.list-group-item-info{color:#fff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{background-color:#005c9b;color:#fff}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{background-color:#fff;border-color:#fff;color:#fff}.list-group-item-warning{background-color:#f5a700;color:#fff}a.list-group-item-warning,button.list-group-item-warning{color:#fff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{background-color:#dc9600;color:#fff}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{background-color:#fff;border-color:#fff;color:#fff}.list-group-item-danger{background-color:#bd271e;color:#fff}a.list-group-item-danger,button.list-group-item-danger{color:#fff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{background-color:#a7221b;color:#fff}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{background-color:#fff;border-color:#fff;color:#fff}.list-group-item-heading{margin-bottom:5px;margin-top:0}.list-group-item-text{line-height:1.3;margin-bottom:0}.nav{list-style:none;margin-bottom:0;padding-left:0}.nav>li,.nav>li>a{display:block;position:relative}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{background-color:#d3dae6;text-decoration:none}.nav>li.disabled>a{color:#b2bac6}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{background-color:initial;color:#b2bac6;cursor:not-allowed;text-decoration:none}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#d3dae6;border-color:#006bb4}.nav .nav-divider{background-color:#e5e5e5;height:1px;margin:9px 0;overflow:hidden}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #d3dae6}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{border:1px solid #0000;border-radius:4px 4px 0 0;line-height:1.42857143;margin-right:2px}.nav-tabs>li>a:hover{background-color:#fff;border-color:#d3dae6}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{background-color:#fff;border:1px solid #d3dae6;border-bottom-color:#0000;color:#343741;cursor:default}.nav-tabs.nav-justified{border-bottom:0;width:100%}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{border-radius:4px;margin-right:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #fff}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #fff;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{background-color:#006bb4;color:#fff}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-left:0;margin-top:2px}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{border-radius:4px;margin-right:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #fff}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #fff;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.alert{border:1px solid #0000;border-radius:4px;margin-bottom:20px;padding:15px}.alert h4{color:inherit;margin-top:0}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{color:inherit;position:relative;right:-21px;top:-2px}.alert-success{background-color:#017d73;border-color:#014a44;color:#fff}.alert-success hr{border-top-color:#00312d}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#006bb4;border-color:#004d81;color:#fff}.alert-info hr{border-top-color:#003e68}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f5a700;border-color:#c28400;color:#fff}.alert-warning hr{border-top-color:#a97300}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#bd271e;border-color:#911e17;color:#fff}.alert-danger hr{border-top-color:#7b1914}.alert-danger .alert-link{color:#e6e6e6}.bsTooltip{word-wrap:normal;display:block;filter:alpha(opacity=0);font-family:Open Sans,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1040}.bsTooltip.in{filter:alpha(opacity=80);opacity:.8}.bsTooltip.top{margin-top:-3px;padding:5px 0}.bsTooltip.right{margin-left:3px;padding:0 5px}.bsTooltip.bottom{margin-top:3px;padding:5px 0}.bsTooltip.left{margin-left:-3px;padding:0 5px}.bsTooltip-inner{background-color:#000;border-radius:4px;color:#fff;max-width:200px;padding:3px 8px;text-align:center}.bsTooltip-arrow{border-color:#0000;border-style:solid;height:0;position:absolute;width:0}.bsTooltip.top .bsTooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;left:50%;margin-left:-5px}.bsTooltip.top-left .bsTooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;margin-bottom:-5px;right:5px}.bsTooltip.top-right .bsTooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;left:5px;margin-bottom:-5px}.bsTooltip.right .bsTooltip-arrow{border-right-color:#000;border-width:5px 5px 5px 0;left:0;margin-top:-5px;top:50%}.bsTooltip.left .bsTooltip-arrow{border-left-color:#000;border-width:5px 0 5px 5px;margin-top:-5px;right:0;top:50%}.bsTooltip.bottom .bsTooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;left:50%;margin-left:-5px;top:0}.bsTooltip.bottom-left .bsTooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;margin-top:-5px;right:5px;top:0}.bsTooltip.bottom-right .bsTooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;left:5px;margin-top:-5px;top:0}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.caret{border-left:4px solid #0000;border-right:4px solid #0000;border-top:4px dashed;border-top:4px solid\9;display:inline-block;height:0;margin-left:2px;vertical-align:middle;width:0}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid #d3dae6;border-radius:4px;box-shadow:0 4px 8px 0 #0000001a;display:none;float:left;font-size:14px;left:0;list-style:none;margin:2px 0 0;min-width:160px;padding:5px 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu.pull-right{left:auto;right:0}.dropdown-menu .divider{background-color:#d3dae6;height:1px;margin:9px 0;overflow:hidden}.dropdown-menu>li>a,.dropdown-menu>li>button{clear:both;color:#7b7b7b;display:block;font-weight:400;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-menu>li>button{appearance:none;background:none;border:none;text-align:left;width:100%}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-menu>li>button:focus,.dropdown-menu>li>button:hover{background-color:#343741;color:#fff;text-decoration:none}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>button,.dropdown-menu>.active>button:focus,.dropdown-menu>.active>button:hover{background-color:#343741;color:#fff;outline:0;text-decoration:none}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#98a2b3}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{background-color:initial;background-image:none;cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);text-decoration:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{color:#98a2b3;display:block;font-size:12px;line-height:1.42857143;padding:3px 20px;white-space:nowrap}.dropdown-backdrop{bottom:0;left:0;position:fixed;right:0;top:0;z-index:990}.pull-right>.dropdown-menu{left:auto;right:0}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-bottom:4px dashed;border-bottom:4px solid\9;border-top:0;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{bottom:100%;margin-bottom:2px;top:auto}@media (min-width:0){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{border-collapse:initial;display:table;position:relative}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;margin-bottom:0;position:relative;width:100%;z-index:2}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon{border-radius:4px;font-size:18px;height:62px;line-height:1.3333333;padding:18px 27px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon{height:62px;line-height:62px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon{border-radius:4px;font-size:12px;height:32px;line-height:1.5;padding:6px 9px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon{height:32px;line-height:32px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon{height:auto}.input-group .form-control,.input-group-addon{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child){border-radius:0}.input-group-addon{background-color:#d3dae6;border:1px solid #d3dae6;border-radius:4px;color:#343741;font-size:14px;font-weight:400;line-height:1;padding:5px 15px;text-align:center;vertical-align:middle;white-space:nowrap;width:1%}.input-group-addon.input-sm{border-radius:4px;font-size:12px;padding:6px 9px}.input-group-addon.input-lg{border-radius:4px;font-size:18px;padding:18px 27px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.pagination{border-radius:4px;display:inline-block;margin:20px 0;padding-left:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{background-color:initial;border:1px solid #0000;color:#006bb4;float:left;line-height:1.42857143;margin-left:-1px;padding:5px 15px;position:relative;text-decoration:none}.pagination>li:first-child>a,.pagination>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px;margin-left:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{background-color:#0000;border-color:#0000;color:#006bb4;z-index:2}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{background-color:#0000;border-color:#0000;color:#343741;cursor:default;z-index:3}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{background-color:#26262600;border-color:#0000;color:#343741;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;line-height:1.3333333;padding:18px 27px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;line-height:1.5;padding:6px 9px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pager{list-style:none;margin:20px 0;padding-left:0;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{background-color:initial;border:1px solid #0000;border-radius:0;display:inline-block;padding:5px 14px}.pager li>a:focus,.pager li>a:hover{background-color:#0000;text-decoration:none}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{background-color:initial;color:#fff;cursor:not-allowed}.label{border-radius:.25em;color:#fff;display:inline;font-size:75%;font-weight:700;line-height:1;padding:.2em .6em .3em;text-align:center;vertical-align:initial;white-space:nowrap}a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label:empty{display:none}.label-default{background-color:#006bb4}.label-default[href]:focus,.label-default[href]:hover{background-color:#004d81}.label-primary{background-color:#343741}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#1d1f25}.label-success{background-color:#017d73}.label-success[href]:focus,.label-success[href]:hover{background-color:#014a44}.label-info{background-color:#006bb4}.label-info[href]:focus,.label-info[href]:hover{background-color:#004d81}.label-warning{background-color:#f5a700}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#c28400}.label-danger{background-color:#bd271e}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#911e17}.panel{background-color:#fff;border:1px solid #0000;border-radius:4px;-webkit-box-shadow:0 1px 1px #0000000d;box-shadow:0 1px 1px #0000000d;margin-bottom:20px}.panel-body{padding:15px}.panel-heading{border-bottom:1px solid #0000;border-top-left-radius:3px;border-top-right-radius:3px;padding:10px 15px}.panel-heading>.dropdown .dropdown-toggle,.panel-title{color:inherit}.panel-title{font-size:16px;margin-bottom:0;margin-top:0}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{background-color:#f5f7fa;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #d3dae6;padding:10px 15px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-radius:0;border-width:1px 0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #d3dae6}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{border-radius:4px;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #d3dae6}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #d3dae6}.panel-default{border-color:#d3dae6}.panel-default>.panel-heading{background-color:#f5f7fa;border-color:#d3dae6;color:#7b7b7b}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d3dae6}.panel-default>.panel-heading .badge{background-color:#7b7b7b;color:#f5f7fa}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d3dae6}.panel-primary{border-color:#343741}.panel-primary>.panel-heading{background-color:#343741;border-color:#343741;color:#fff}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#343741}.panel-primary>.panel-heading .badge{background-color:#fff;color:#343741}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#343741}.panel-success{border-color:#014a44}.panel-success>.panel-heading{background-color:#017d73;border-color:#014a44;color:#fff}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#014a44}.panel-success>.panel-heading .badge{background-color:#fff;color:#017d73}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#014a44}.panel-info{border-color:#004d81}.panel-info>.panel-heading{background-color:#006bb4;border-color:#004d81;color:#fff}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#004d81}.panel-info>.panel-heading .badge{background-color:#fff;color:#006bb4}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#004d81}.panel-warning{border-color:#c28400}.panel-warning>.panel-heading{background-color:#f5a700;border-color:#c28400;color:#fff}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c28400}.panel-warning>.panel-heading .badge{background-color:#fff;color:#f5a700}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c28400}.panel-danger{border-color:#911e17}.panel-danger>.panel-heading{background-color:#bd271e;border-color:#911e17;color:#fff}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#911e17}.panel-danger>.panel-heading .badge{background-color:#fff;color:#bd271e}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#911e17}.popover{word-wrap:normal;background-clip:padding-box;background-color:#fff;border:1px solid #d3dae6;border-radius:4px;box-shadow:0 4px 8px 0 #0000001a;display:none;font-family:Open Sans,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;max-width:276px;padding:1px;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1010}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:3px 3px 0 0;font-size:14px;margin:0;padding:8px 14px}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{border-color:#0000;border-style:solid;display:block;height:0;position:absolute;width:0}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{border-bottom-width:0;border-top-color:#d3dae6;bottom:-11px;left:50%;margin-left:-11px}.popover.top>.arrow:after{border-bottom-width:0;border-top-color:#fff;bottom:1px;content:" ";margin-left:-10px}.popover.right>.arrow{border-left-width:0;border-right-color:#d3dae6;left:-11px;margin-top:-11px;top:50%}.popover.right>.arrow:after{border-left-width:0;border-right-color:#fff;bottom:-10px;content:" ";left:1px}.popover.bottom>.arrow{border-bottom-color:#d3dae6;border-top-width:0;left:50%;margin-left:-11px;top:-11px}.popover.bottom>.arrow:after{border-bottom-color:#fff;border-top-width:0;content:" ";margin-left:-10px;top:1px}.popover.left>.arrow{border-left-color:#d3dae6;border-right-width:0;margin-top:-11px;right:-11px;top:50%}.popover.left>.arrow:after{border-left-color:#fff;border-right-width:0;bottom:-10px;content:" ";right:1px}.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{background-color:initial;border:0;color:#0000;font:0/0 a;text-shadow:none}.hidden{display:none!important}.affix{position:fixed}.navbar>.container-fluid>.navbar-form:not(.pull-right):first-child,.navbar>.container-fluid>.navbar-nav:not(.pull-right):first-child{margin-left:-15px;margin-top:4px}.navbar{border-width:0}.navbar-btn-link{border-radius:0;margin:0}@media (max-width:768px){.navbar-btn-link{text-align:left;width:100%}}.navbar-default .badge{background-color:#fff;color:#f5f7fa}.navbar-inverse .kbnGlobalNav__logoBrand{background-color:#4b4f5d;height:45px;width:252px}.navbar-inverse .kbnGlobalNav__smallLogoBrand{background-color:#4b4f5d;height:45px;width:45px}.navbar-inverse .badge{background-color:#fff;color:#4b4f5d}.navbar-brand{cursor:default;font-size:1.8em;user-select:none}.navbar-nav{font-size:12px}.navbar-nav>.active>a{background-color:initial;border-bottom-color:#7b7b7b}.navbar-toggle{margin-top:4px}.text-primary,.text-primary:hover{color:#343741}.text-success,.text-success:hover{color:#017d73}.text-danger,.text-danger:hover{color:#bd271e}.text-warning,.text-warning:hover{color:#f5a700}.text-info,.text-info:hover{color:#006bb4}.table .danger,.table .danger a,.table .info,.table .info a,.table .success,.table .success a,.table .warning,.table .warning a,table .danger,table .danger a,table .info,table .info a,table .success,table .success a,table .warning,table .warning a{color:#fff}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #d3dae6}.form-control,input{border-width:1px}.form-control,.form-control:focus,input,input:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#f5a700}.has-warning .form-control,.has-warning .form-control:focus{border:1px solid #f5a700}.has-warning .input-group-addon{border-color:#f5a700}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#bd271e}.has-error .form-control,.has-error .form-control:focus{border:1px solid #bd271e}.has-error .input-group-addon{border-color:#bd271e}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#017d73}.has-success .form-control,.has-success .form-control:focus{border:solid #017d73}.has-success .input-group-addon{border-color:#017d73}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{border-color:#0000}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{background-color:#26262600}.panel{border-radius:0;-webkit-box-shadow:0 0 0 #0000;box-shadow:0 0 0 #0000}.progress{-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none} \ No newline at end of file diff --git a/src/core/server/rendering/render_utils.test.ts b/src/core/server/rendering/render_utils.test.ts index c8ebd6de4f854..b8acdfb96e367 100644 --- a/src/core/server/rendering/render_utils.test.ts +++ b/src/core/server/rendering/render_utils.test.ts @@ -23,8 +23,8 @@ describe('getStylesheetPaths', () => { Array [ "/base-path/17/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.v8.dark.css", "/base-path/17/bundles/kbn-ui-shared-deps-src/kbn-ui-shared-deps-src.css", - "/base-path/node_modules/@kbn/ui-framework/dist/kui_dark.css", - "/base-path/ui/legacy_dark_theme.css", + "/base-path/node_modules/@kbn/ui-framework/dist/kui_dark.min.css", + "/base-path/ui/legacy_dark_theme.min.css", ] `); }); @@ -44,8 +44,8 @@ describe('getStylesheetPaths', () => { Array [ "/base-path/69/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.v8.light.css", "/base-path/69/bundles/kbn-ui-shared-deps-src/kbn-ui-shared-deps-src.css", - "/base-path/node_modules/@kbn/ui-framework/dist/kui_light.css", - "/base-path/ui/legacy_light_theme.css", + "/base-path/node_modules/@kbn/ui-framework/dist/kui_light.min.css", + "/base-path/ui/legacy_light_theme.min.css", ] `); }); diff --git a/src/core/server/rendering/render_utils.ts b/src/core/server/rendering/render_utils.ts index b24f5968e4ee9..0482d5eff6df5 100644 --- a/src/core/server/rendering/render_utils.ts +++ b/src/core/server/rendering/render_utils.ts @@ -41,16 +41,16 @@ export const getStylesheetPaths = ({ themeVersion )}`, `${regularBundlePath}/kbn-ui-shared-deps-src/${UiSharedDepsSrc.cssDistFilename}`, - `${basePath}/node_modules/@kbn/ui-framework/dist/kui_dark.css`, - `${basePath}/ui/legacy_dark_theme.css`, + `${basePath}/node_modules/@kbn/ui-framework/dist/kui_dark.min.css`, + `${basePath}/ui/legacy_dark_theme.min.css`, ] : [ `${regularBundlePath}/kbn-ui-shared-deps-npm/${UiSharedDepsNpm.lightCssDistFilename( themeVersion )}`, `${regularBundlePath}/kbn-ui-shared-deps-src/${UiSharedDepsSrc.cssDistFilename}`, - `${basePath}/node_modules/@kbn/ui-framework/dist/kui_light.css`, - `${basePath}/ui/legacy_light_theme.css`, + `${basePath}/node_modules/@kbn/ui-framework/dist/kui_light.min.css`, + `${basePath}/ui/legacy_light_theme.min.css`, ]), ]; }; diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index 876dbe220de6a..893985926bd78 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -82,6 +82,7 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions await run(Tasks.GeneratePackagesOptimizedAssets); await run(Tasks.DeleteBazelPackagesFromBuildRoot); await run(Tasks.CreateNoticeFile); + await run(Tasks.CreateXPackNoticeFile); await run(Tasks.UpdateLicenseFile); await run(Tasks.RemovePackageJsonDeps); await run(Tasks.CleanPackageManagerRelatedFiles); diff --git a/src/dev/build/tasks/notice_file_task.ts b/src/dev/build/tasks/notice_file_task.ts index 2a446e73723e8..2b38e379bc9da 100644 --- a/src/dev/build/tasks/notice_file_task.ts +++ b/src/dev/build/tasks/notice_file_task.ts @@ -52,3 +52,23 @@ export const CreateNoticeFile: Task = { await write(build.resolvePath('NOTICE.txt'), notice); }, }; + +export const CreateXPackNoticeFile: Task = { + description: 'Generating x-pack NOTICE.txt file', + + async run(config, log, build) { + log.info('Generating x-pack notice from source'); + const noticeFromSource = await log.indent( + 4, + async () => + await generateNoticeFromSource({ + productName: 'Kibana X-Pack', + directory: build.resolvePath('x-pack'), + log, + }) + ); + + log.info('Writing notice to x-pack/NOTICE.txt'); + await write(build.resolvePath('x-pack/NOTICE.txt'), noticeFromSource); + }, +}; diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx index 7ecc379b2abc6..31a12f702ae2a 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx @@ -29,6 +29,8 @@ const mockDeserialize = jest.fn((params) => { const converter = params.id === 'terms' ? (val: string) => (val === '__other__' ? 'Other' : val) + : params.id === 'string' + ? (val: string) => (val === '' ? '(empty)' : val) : () => 'formatted duration'; return { getConverterFor: jest.fn(() => converter) }; }); @@ -1077,8 +1079,8 @@ describe('MetricVisComponent', function () { describe('metric value formatting', () => { const getFormattedMetrics = ( - value: number, - secondaryValue: number, + value: number | string, + secondaryValue: number | string, fieldFormatter: SerializedFieldFormat ) => { const config: Props['config'] = { @@ -1130,6 +1132,12 @@ describe('MetricVisComponent', function () { expect(secondary).toBe('983.12K'); }); + it('correctly formats strings', () => { + const { primary, secondary } = getFormattedMetrics('', '', { id: 'string' }); + expect(primary).toBe('(empty)'); + expect(secondary).toBe('(empty)'); + }); + it('correctly formats currency', () => { const { primary, secondary } = getFormattedMetrics(1000.839, 11.2, { id: 'currency' }); expect(primary).toBe('$1.00K'); diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx index 5473d98d85c18..94fd86ea43daa 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx @@ -81,7 +81,9 @@ const getMetricFormatter = ( const serializedFieldFormat = getFormatByAccessor(accessor, columns); const formatId = serializedFieldFormat?.id ?? 'number'; - if (!['number', 'currency', 'percent', 'bytes', 'duration'].includes(formatId)) { + if ( + !['number', 'currency', 'percent', 'bytes', 'duration', 'string', 'null'].includes(formatId) + ) { throw new Error( i18n.translate('expressionMetricVis.errors.unsupportedColumnFormat', { defaultMessage: 'Metric visualization expression - Unsupported column format: "{id}"', @@ -92,6 +94,11 @@ const getMetricFormatter = ( ); } + // this formats are coming when formula is empty + if (formatId === 'string') { + return getFormatService().deserialize(serializedFieldFormat).getConverterFor('text'); + } + if (formatId === 'duration') { const formatter = getFormatService().deserialize({ ...serializedFieldFormat, @@ -297,7 +304,7 @@ export const MetricVis = ({ // In the editor, we constrain the maximum size of the tiles for aesthetic reasons const maxTileSideLength = metricConfigs.flat().length > 1 ? 200 : 300; pixelHeight = grid.length * maxTileSideLength; - pixelWidth = grid[0].length * maxTileSideLength; + pixelWidth = grid[0]?.length * maxTileSideLength; } // force chart to re-render to circumvent a charts bug diff --git a/src/plugins/chart_expressions/expression_metric/public/expression_renderers/metric_vis_renderer.tsx b/src/plugins/chart_expressions/expression_metric/public/expression_renderers/metric_vis_renderer.tsx index 3979f2f563af2..bb140b1957cb9 100644 --- a/src/plugins/chart_expressions/expression_metric/public/expression_renderers/metric_vis_renderer.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/expression_renderers/metric_vis_renderer.tsx @@ -61,11 +61,13 @@ export const getMetricVisRenderer = ( unmountComponentAtNode(domNode); }); - const filterable = await metricFilterable( - visConfig.dimensions, - visData, - handlers.hasCompatibleActions?.bind(handlers) - ); + const filterable = visData.rows.length + ? await metricFilterable( + visConfig.dimensions, + visData, + handlers.hasCompatibleActions?.bind(handlers) + ) + : false; const renderComplete = () => { const executionContext = handlers.getExecutionContext(); const containerType = extractContainerType(executionContext); diff --git a/src/plugins/data/public/query/filter_manager/lib/generate_filter.test.ts b/src/plugins/data/public/query/filter_manager/lib/generate_filter.test.ts index af181d2d94fda..c038d5b5e4ea0 100644 --- a/src/plugins/data/public/query/filter_manager/lib/generate_filter.test.ts +++ b/src/plugins/data/public/query/filter_manager/lib/generate_filter.test.ts @@ -199,4 +199,56 @@ describe('Generate filters', () => { [FIELD.name]: ANOTHER_PHRASE, }); }); + + it('should genereate a range filter when date type field is provided', () => { + const filters = generateFilters( + mockFilterManager, + { + ...FIELD, + type: 'date', + } as DataViewFieldBase, + '2022-08-01', + '+', + MOCKED_INDEX + ) as RangeFilter[]; + expect(filters).toHaveLength(1); + const [filter] = filters; + expect(filter.meta.index === INDEX_NAME); + expect(filter.meta.negate).toBeFalsy(); + expect(isRangeFilter(filter)).toBeTruthy(); + expect(filter.query.range).toEqual({ + [FIELD.name]: { + format: 'date_time', + gte: expect.stringContaining('2022-08-01T00:00:00'), + lte: expect.stringContaining('2022-08-01T00:00:00'), + }, + }); + }); + + it('should update an existing date range filter', () => { + const [filter] = generateFilters( + mockFilterManager, + { + ...FIELD, + type: 'date', + } as DataViewFieldBase, + '2022-08-01', + '+', + MOCKED_INDEX + ) as RangeFilter[]; + filtersArray.push(filter); + + generateFilters( + mockFilterManager, + { + ...FIELD, + type: 'date', + } as DataViewFieldBase, + '2022-08-01', + '-', + MOCKED_INDEX + ) as RangeFilter[]; + + expect(filter).toHaveProperty('meta.negate', true); + }); }); diff --git a/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts b/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts index 8b405a2a6ae4b..4bff599d846d5 100644 --- a/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts +++ b/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts @@ -7,22 +7,30 @@ */ import _ from 'lodash'; +import moment from 'moment'; import { Filter, isExistsFilter, isPhraseFilter, getPhraseFilterValue, getPhraseFilterField, + getFilterField, + isRangeFilter, isScriptedPhraseFilter, buildFilter, FilterStateStore, FILTERS, DataViewFieldBase, DataViewBase, + RangeFilterParams, } from '@kbn/es-query'; +import { KBN_FIELD_TYPES } from '@kbn/field-types'; +import type { Serializable } from '@kbn/utility-types'; import { FilterManager } from '../filter_manager'; +const DATE_FORMAT = 'YYYY-MM-DDTHH:mm:ss.SSSZ'; + function getExistingFilter( appFilters: Filter[], fieldName: string, @@ -45,6 +53,12 @@ function getExistingFilter( filter.meta.field === fieldName && filter.query?.script?.script?.params?.value === value ); } + + if (isRangeFilter(filter)) { + return ( + getFilterField(filter) === fieldName && _.isEqual(filter.query.range[fieldName], value) + ); + } }) as any; } @@ -75,28 +89,17 @@ export function generateFilters( index: DataViewBase ): Filter[] { values = Array.isArray(values) ? _.uniq(values) : [values]; - const fieldObj = ( - _.isObject(field) - ? field - : { - name: field, - } - ) as DataViewFieldBase; + + const fieldObj = (_.isObject(field) ? field : { name: field }) as DataViewFieldBase; const fieldName = fieldObj.name; - const newFilters: Filter[] = []; const appFilters = filterManager.getAppFilters(); - const negate = operation === '-'; - let filter; - _.each(values, function (value) { - const existing = getExistingFilter(appFilters, fieldName, value); + function generateFilter(value: Serializable) { + const isRange = fieldObj.type?.includes('range') || fieldObj.type === KBN_FIELD_TYPES.DATE; - if (existing) { - updateExistingFilter(existing, negate); - filter = existing; - } else if (fieldObj.type?.includes('range') && value && typeof value === 'object') { - filter = buildFilter( + if (isRange && _.isObjectLike(value)) { + return buildFilter( index, fieldObj, FILTERS.RANGE_FROM_VALUE, @@ -106,29 +109,53 @@ export function generateFilters( null, FilterStateStore.APP_STATE ); - } else { - // exists filter special case: fieldname = '_exists' and value = fieldname - const filterType = fieldName === '_exists_' ? FILTERS.EXISTS : FILTERS.PHRASE; - const actualFieldObj = - fieldName === '_exists_' ? ({ name: value } as DataViewFieldBase) : fieldObj; + } - // Fix for #7189 - if value is empty, phrase filters become exists filters. - const isNullFilter = value === null || value === undefined; + // exists filter special case: fieldname = '_exists' and value = fieldname + const filterType = fieldName === '_exists_' ? FILTERS.EXISTS : FILTERS.PHRASE; + const actualFieldObj = + fieldName === '_exists_' ? ({ name: value } as DataViewFieldBase) : fieldObj; - filter = buildFilter( - index, - actualFieldObj, - isNullFilter ? FILTERS.EXISTS : filterType, - isNullFilter ? !negate : negate, - false, - value, - null, - FilterStateStore.APP_STATE - ); + // Fix for #7189 - if value is empty, phrase filters become exists filters. + const isNullFilter = value === null || value === undefined; + + return buildFilter( + index, + actualFieldObj, + isNullFilter ? FILTERS.EXISTS : filterType, + isNullFilter ? !negate : negate, + false, + value, + null, + FilterStateStore.APP_STATE + ); + } + + function castValue(value: unknown) { + if (fieldObj.type === KBN_FIELD_TYPES.DATE && typeof value === 'string') { + const parsedValue = moment(value); + + return parsedValue.isValid() + ? ({ + format: 'date_time', + gte: parsedValue.format(DATE_FORMAT), + lte: parsedValue.format(DATE_FORMAT), + } as RangeFilterParams) + : value; } - newFilters.push(filter); - }); + return value; + } + + return _.chain(values) + .map(castValue) + .map((value) => { + const existing = getExistingFilter(appFilters, fieldName, value); + if (existing) { + updateExistingFilter(existing, negate); + } - return newFilters; + return existing ?? generateFilter(value as Serializable); + }) + .value(); } diff --git a/src/plugins/data/public/search/fetch/handle_response.test.ts b/src/plugins/data/public/search/fetch/handle_response.test.ts index 30fdd67394873..b7a37cf1d5217 100644 --- a/src/plugins/data/public/search/fetch/handle_response.test.ts +++ b/src/plugins/data/public/search/fetch/handle_response.test.ts @@ -9,7 +9,7 @@ import { handleResponse } from './handle_response'; // Temporary disable eslint, will be removed after moving to new platform folder -import { notificationServiceMock } from '@kbn/core/public/notifications/notifications_service.mock'; +import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { setNotifications } from '../../services'; import { IKibanaSearchResponse } from '../../../common'; import { themeServiceMock } from '@kbn/core/public/mocks'; diff --git a/src/plugins/data_views/common/types.ts b/src/plugins/data_views/common/types.ts index 40a70e3c1f547..ee39678761023 100644 --- a/src/plugins/data_views/common/types.ts +++ b/src/plugins/data_views/common/types.ts @@ -12,7 +12,7 @@ import type { SavedObjectsCreateOptions, SavedObjectsUpdateOptions, } from '@kbn/core/public'; -import type { ErrorToastOptions, ToastInputFields } from '@kbn/core/public/notifications'; +import type { ErrorToastOptions, ToastInputFields } from '@kbn/core-notifications-browser'; import type { DataViewFieldBase } from '@kbn/es-query'; import type { SerializedFieldFormat } from '@kbn/field-formats-plugin/common'; import { RUNTIME_FIELD_TYPES } from './constants'; diff --git a/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx b/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx index bd1bb210935b9..faf1f063e9e8d 100644 --- a/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx +++ b/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx @@ -86,7 +86,9 @@ const services = { }, }, navigation: NavigationPlugin.start({} as CoreStart, { - unifiedSearch: { ui: { SearchBar } } as unknown as UnifiedSearchPublicPluginStart, + unifiedSearch: { + ui: { SearchBar, AggregateQuerySearchBar: SearchBar }, + } as unknown as UnifiedSearchPublicPluginStart, }), theme: { useChartsTheme: () => ({ diff --git a/src/plugins/discover/public/application/main/components/document_explorer_callout/document_explorer_callout.scss b/src/plugins/discover/public/application/main/components/document_explorer_callout/document_explorer_callout.scss index 76024629da2c3..2327b7b451f42 100644 --- a/src/plugins/discover/public/application/main/components/document_explorer_callout/document_explorer_callout.scss +++ b/src/plugins/discover/public/application/main/components/document_explorer_callout/document_explorer_callout.scss @@ -1,5 +1,7 @@ .dscDocumentExplorerCallout { .euiCallOutHeader__title { + display: flex; + align-items: center; width: 100%; } } diff --git a/src/plugins/discover/public/application/main/components/layout/__stories__/get_services.tsx b/src/plugins/discover/public/application/main/components/layout/__stories__/get_services.tsx deleted file mode 100644 index a3bc71cf7f6d4..0000000000000 --- a/src/plugins/discover/public/application/main/components/layout/__stories__/get_services.tsx +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { action } from '@storybook/addon-actions'; -import { TopNavMenu } from '@kbn/navigation-plugin/public'; -import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; -import { LIGHT_THEME } from '@elastic/charts'; -import { FieldFormat } from '@kbn/field-formats-plugin/common'; -import { identity } from 'lodash'; -import { IUiSettingsClient } from '@kbn/core/public'; -import { - DEFAULT_COLUMNS_SETTING, - DOC_TABLE_LEGACY, - MAX_DOC_FIELDS_DISPLAYED, - ROW_HEIGHT_OPTION, - SAMPLE_SIZE_SETTING, - SAMPLE_ROWS_PER_PAGE_SETTING, - SEARCH_FIELDS_FROM_SOURCE, - SHOW_MULTIFIELDS, -} from '../../../../../../common'; -import { SIDEBAR_CLOSED_KEY } from '../discover_layout'; -import { LocalStorageMock } from '../../../../../__mocks__/local_storage_mock'; -import { DiscoverServices } from '../../../../../build_services'; - -export const uiSettingsMock = { - get: (key: string) => { - if (key === MAX_DOC_FIELDS_DISPLAYED) { - return 3; - } else if (key === SAMPLE_SIZE_SETTING) { - return 10; - } else if (key === SAMPLE_ROWS_PER_PAGE_SETTING) { - return 100; - } else if (key === DEFAULT_COLUMNS_SETTING) { - return ['default_column']; - } else if (key === DOC_TABLE_LEGACY) { - return false; - } else if (key === SEARCH_FIELDS_FROM_SOURCE) { - return false; - } else if (key === SHOW_MULTIFIELDS) { - return false; - } else if (key === ROW_HEIGHT_OPTION) { - return 3; - } else if (key === 'dateFormat:tz') { - return true; - } - }, - isDefault: () => { - return true; - }, -} as unknown as IUiSettingsClient; - -export function getServices() { - return { - core: { http: { basePath: { prepend: () => void 0 } } }, - storage: new LocalStorageMock({ - [SIDEBAR_CLOSED_KEY]: false, - }) as unknown as Storage, - data: { - query: { - timefilter: { - timefilter: { - setTime: action('Set timefilter time'), - getAbsoluteTime: () => { - return { from: '2020-05-14T11:05:13.590', to: '2020-05-14T11:20:13.590' }; - }, - }, - }, - }, - dataViews: { - getIdsWithTitle: () => Promise.resolve([]), - }, - }, - uiSettings: uiSettingsMock, - dataViewFieldEditor: { - openEditor: () => void 0, - userPermissions: { - editIndexPattern: () => void 0, - }, - }, - navigation: { - ui: { TopNavMenu }, - }, - theme: { - useChartsTheme: () => ({ - ...EUI_CHARTS_THEME_LIGHT.theme, - chartPaddings: { - top: 0, - left: 0, - bottom: 0, - right: 0, - }, - heatmap: { xAxisLabel: { rotation: {} } }, - }), - useChartsBaseTheme: () => LIGHT_THEME, - }, - capabilities: { - visualize: { - show: true, - }, - discover: { - save: false, - }, - advancedSettings: { - save: true, - }, - }, - docLinks: { links: { discover: {} } }, - addBasePath: (path: string) => path, - filterManager: { - getGlobalFilters: () => [], - getAppFilters: () => [], - }, - history: () => ({}), - fieldFormats: { - deserialize: () => { - const DefaultFieldFormat = FieldFormat.from(identity); - return new DefaultFieldFormat(); - }, - }, - toastNotifications: { - addInfo: action('add toast'), - }, - } as unknown as DiscoverServices; -} diff --git a/src/plugins/unified_search/public/query_string_input/text_based_languages_editor/index.tsx b/src/plugins/unified_search/public/query_string_input/text_based_languages_editor/index.tsx index fa2323430eb37..09f04081d383d 100644 --- a/src/plugins/unified_search/public/query_string_input/text_based_languages_editor/index.tsx +++ b/src/plugins/unified_search/public/query_string_input/text_based_languages_editor/index.tsx @@ -9,8 +9,10 @@ import React, { useRef, memo, useEffect, useState, useCallback } from 'react'; import classNames from 'classnames'; import { EsqlLang, monaco } from '@kbn/monaco'; +import { IDataPluginServices } from '@kbn/data-plugin/public'; import type { AggregateQuery } from '@kbn/es-query'; import { getAggregateQueryMode } from '@kbn/es-query'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; import { i18n } from '@kbn/i18n'; import { @@ -94,6 +96,8 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ Array<{ startLineNumber: number; message: string }> >([]); const [documentationSections, setDocumentationSections] = useState(); + const kibana = useKibana(); + const { uiSettings } = kibana.services; const styles = textBasedLanguagedEditorStyles( euiTheme, @@ -103,6 +107,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ Boolean(errors?.length), isCodeEditorExpandedFocused ); + const isDark = uiSettings.get('theme:darkMode'); const editorModel = useRef(); const editor1 = useRef(); const containerRef = useRef(null); @@ -301,7 +306,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ minimap: { enabled: false }, wordWrap: isWordWrapped ? 'on' : 'off', lineNumbers: showLineNumbers ? 'on' : 'off', - theme: 'vs', + theme: isDark ? 'vs-dark' : 'vs', lineDecorationsWidth: 12, autoIndent: 'none', wrappingIndent: 'none', diff --git a/src/plugins/vis_types/vislib/public/vis_controller.tsx b/src/plugins/vis_types/vislib/public/vis_controller.tsx index 713bceefb1458..af9dda7ccf01f 100644 --- a/src/plugins/vis_types/vislib/public/vis_controller.tsx +++ b/src/plugins/vis_types/vislib/public/vis_controller.tsx @@ -10,7 +10,7 @@ import $ from 'jquery'; import React, { RefObject } from 'react'; import { METRIC_TYPE } from '@kbn/analytics'; -import { mountReactNode } from '@kbn/core/public/utils'; +import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import { ChartsPluginSetup } from '@kbn/charts-plugin/public'; import type { PersistedState } from '@kbn/visualizations-plugin/public'; import { IInterpreterRenderHandlers } from '@kbn/expressions-plugin/public'; @@ -163,7 +163,7 @@ export const createVislibVisController = ( uiState?: PersistedState ) { const { legendPosition } = visParams; - this.unmountLegend = mountReactNode( + this.unmountLegend = toMountPoint( any; - getPageObjects: (pageObjects: string[]) => any; -}) { +export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('discover data grid tests', function describeDiscoverDataGrid() { const esArchiver = getService('esArchiver'); const PageObjects = getPageObjects(['common', 'discover', 'timePicker']); diff --git a/test/functional/apps/discover/_data_grid_context.ts b/test/functional/apps/discover/group2/_data_grid_context.ts similarity index 98% rename from test/functional/apps/discover/_data_grid_context.ts rename to test/functional/apps/discover/group2/_data_grid_context.ts index c2628026dfdda..0a5fd5d4994e4 100644 --- a/test/functional/apps/discover/_data_grid_context.ts +++ b/test/functional/apps/discover/group2/_data_grid_context.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; const TEST_COLUMN_NAMES = ['@message']; const TEST_FILTER_COLUMN_NAMES = [ diff --git a/test/functional/apps/discover/_data_grid_copy_to_clipboard.ts b/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts similarity index 98% rename from test/functional/apps/discover/_data_grid_copy_to_clipboard.ts rename to test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts index ec359e3c569db..784358ab08d11 100644 --- a/test/functional/apps/discover/_data_grid_copy_to_clipboard.ts +++ b/test/functional/apps/discover/group2/_data_grid_copy_to_clipboard.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); diff --git a/test/functional/apps/discover/_data_grid_doc_navigation.ts b/test/functional/apps/discover/group2/_data_grid_doc_navigation.ts similarity index 97% rename from test/functional/apps/discover/_data_grid_doc_navigation.ts rename to test/functional/apps/discover/group2/_data_grid_doc_navigation.ts index 3c5c8b3967cb0..91b4aafeb0fa4 100644 --- a/test/functional/apps/discover/_data_grid_doc_navigation.ts +++ b/test/functional/apps/discover/group2/_data_grid_doc_navigation.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const filterBar = getService('filterBar'); diff --git a/test/functional/apps/discover/_data_grid_doc_table.ts b/test/functional/apps/discover/group2/_data_grid_doc_table.ts similarity index 99% rename from test/functional/apps/discover/_data_grid_doc_table.ts rename to test/functional/apps/discover/group2/_data_grid_doc_table.ts index 6918edc8285d8..5ce78676684e3 100644 --- a/test/functional/apps/discover/_data_grid_doc_table.ts +++ b/test/functional/apps/discover/group2/_data_grid_doc_table.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const find = getService('find'); diff --git a/test/functional/apps/discover/_data_grid_field_data.ts b/test/functional/apps/discover/group2/_data_grid_field_data.ts similarity index 98% rename from test/functional/apps/discover/_data_grid_field_data.ts rename to test/functional/apps/discover/group2/_data_grid_field_data.ts index 84d1c81f8ee68..64c40a7a2d83d 100644 --- a/test/functional/apps/discover/_data_grid_field_data.ts +++ b/test/functional/apps/discover/group2/_data_grid_field_data.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); diff --git a/test/functional/apps/discover/_data_grid_pagination.ts b/test/functional/apps/discover/group2/_data_grid_pagination.ts similarity index 98% rename from test/functional/apps/discover/_data_grid_pagination.ts rename to test/functional/apps/discover/group2/_data_grid_pagination.ts index fa0e2a0b430ff..d1752df492cb9 100644 --- a/test/functional/apps/discover/_data_grid_pagination.ts +++ b/test/functional/apps/discover/group2/_data_grid_pagination.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); diff --git a/test/functional/apps/discover/_data_grid_row_navigation.ts b/test/functional/apps/discover/group2/_data_grid_row_navigation.ts similarity index 97% rename from test/functional/apps/discover/_data_grid_row_navigation.ts rename to test/functional/apps/discover/group2/_data_grid_row_navigation.ts index d2f91cb97ac59..dc59b9a122c76 100644 --- a/test/functional/apps/discover/_data_grid_row_navigation.ts +++ b/test/functional/apps/discover/group2/_data_grid_row_navigation.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); diff --git a/test/functional/apps/discover/_date_nested.ts b/test/functional/apps/discover/group2/_date_nested.ts similarity index 96% rename from test/functional/apps/discover/_date_nested.ts rename to test/functional/apps/discover/group2/_date_nested.ts index 83b9bdd44a5be..9760645fe11c7 100644 --- a/test/functional/apps/discover/_date_nested.ts +++ b/test/functional/apps/discover/group2/_date_nested.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/test/functional/apps/discover/_discover_fields_api.ts b/test/functional/apps/discover/group2/_discover_fields_api.ts similarity index 98% rename from test/functional/apps/discover/_discover_fields_api.ts rename to test/functional/apps/discover/group2/_discover_fields_api.ts index e64280c1977b5..d981eebae1406 100644 --- a/test/functional/apps/discover/_discover_fields_api.ts +++ b/test/functional/apps/discover/group2/_discover_fields_api.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from './ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); diff --git a/test/functional/apps/discover/_hide_announcements.ts b/test/functional/apps/discover/group2/_hide_announcements.ts similarity index 96% rename from test/functional/apps/discover/_hide_announcements.ts rename to test/functional/apps/discover/group2/_hide_announcements.ts index d23cb9bfa0786..577966c128cb7 100644 --- a/test/functional/apps/discover/_hide_announcements.ts +++ b/test/functional/apps/discover/group2/_hide_announcements.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/test/functional/apps/discover/_huge_fields.ts b/test/functional/apps/discover/group2/_huge_fields.ts similarity index 97% rename from test/functional/apps/discover/_huge_fields.ts rename to test/functional/apps/discover/group2/_huge_fields.ts index 3cca75234675b..085788f1139d0 100644 --- a/test/functional/apps/discover/_huge_fields.ts +++ b/test/functional/apps/discover/group2/_huge_fields.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/test/functional/apps/discover/_indexpattern_with_unmapped_fields.ts b/test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts similarity index 97% rename from test/functional/apps/discover/_indexpattern_with_unmapped_fields.ts rename to test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts index c3982ba72824b..d5d45d227d685 100644 --- a/test/functional/apps/discover/_indexpattern_with_unmapped_fields.ts +++ b/test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/test/functional/apps/discover/_indexpattern_without_timefield.ts b/test/functional/apps/discover/group2/_indexpattern_without_timefield.ts similarity index 98% rename from test/functional/apps/discover/_indexpattern_without_timefield.ts rename to test/functional/apps/discover/group2/_indexpattern_without_timefield.ts index 10f52a330774c..4ce16d24ef703 100644 --- a/test/functional/apps/discover/_indexpattern_without_timefield.ts +++ b/test/functional/apps/discover/group2/_indexpattern_without_timefield.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); diff --git a/test/functional/apps/discover/_runtime_fields_editor.ts b/test/functional/apps/discover/group2/_runtime_fields_editor.ts similarity index 99% rename from test/functional/apps/discover/_runtime_fields_editor.ts rename to test/functional/apps/discover/group2/_runtime_fields_editor.ts index 79adcaef8d930..1a50ce4c1004c 100644 --- a/test/functional/apps/discover/_runtime_fields_editor.ts +++ b/test/functional/apps/discover/group2/_runtime_fields_editor.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from './ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); diff --git a/test/functional/apps/discover/_search_on_page_load.ts b/test/functional/apps/discover/group2/_search_on_page_load.ts similarity index 98% rename from test/functional/apps/discover/_search_on_page_load.ts rename to test/functional/apps/discover/group2/_search_on_page_load.ts index b9aa2df2a315f..de2755c20a514 100644 --- a/test/functional/apps/discover/_search_on_page_load.ts +++ b/test/functional/apps/discover/group2/_search_on_page_load.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); diff --git a/test/functional/apps/discover/_sql_view.ts b/test/functional/apps/discover/group2/_sql_view.ts similarity index 98% rename from test/functional/apps/discover/_sql_view.ts rename to test/functional/apps/discover/group2/_sql_view.ts index 2643fc163d488..175014e23aa58 100644 --- a/test/functional/apps/discover/_sql_view.ts +++ b/test/functional/apps/discover/group2/_sql_view.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/test/functional/apps/discover/group2/config.ts b/test/functional/apps/discover/group2/config.ts new file mode 100644 index 0000000000000..a70a190ca63f8 --- /dev/null +++ b/test/functional/apps/discover/group2/config.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/test/functional/apps/discover/group2/index.ts b/test/functional/apps/discover/group2/index.ts new file mode 100644 index 0000000000000..5a97ec4cc34bb --- /dev/null +++ b/test/functional/apps/discover/group2/index.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + + describe('discover app', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_indexpattern_without_timefield')); + loadTestFile(require.resolve('./_discover_fields_api')); + loadTestFile(require.resolve('./_data_grid')); + loadTestFile(require.resolve('./_data_grid_context')); + loadTestFile(require.resolve('./_data_grid_field_data')); + loadTestFile(require.resolve('./_data_grid_doc_navigation')); + loadTestFile(require.resolve('./_data_grid_row_navigation')); + loadTestFile(require.resolve('./_data_grid_doc_table')); + loadTestFile(require.resolve('./_data_grid_copy_to_clipboard')); + loadTestFile(require.resolve('./_data_grid_pagination')); + loadTestFile(require.resolve('./_sql_view')); + loadTestFile(require.resolve('./_indexpattern_with_unmapped_fields')); + loadTestFile(require.resolve('./_runtime_fields_editor')); + loadTestFile(require.resolve('./_huge_fields')); + loadTestFile(require.resolve('./_date_nested')); + loadTestFile(require.resolve('./_search_on_page_load')); + loadTestFile(require.resolve('./_chart_hidden')); + loadTestFile(require.resolve('./_context_encoded_url_params')); + loadTestFile(require.resolve('./_hide_announcements')); + }); +} diff --git a/test/functional/apps/discover/index.ts b/test/functional/apps/discover/index.ts deleted file mode 100644 index 2c08d122f9247..0000000000000 --- a/test/functional/apps/discover/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getService, loadTestFile }: FtrProviderContext) { - const esArchiver = getService('esArchiver'); - const browser = getService('browser'); - const config = getService('config'); - - describe('discover app', function () { - before(async function () { - await browser.setWindowSize(1300, 800); - }); - - after(async function unloadMakelogs() { - await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); - }); - - if (config.get('esTestCluster.ccs')) { - loadTestFile(require.resolve('./_data_view_editor')); - loadTestFile(require.resolve('./_saved_queries')); - } else { - loadTestFile(require.resolve('./_no_data')); - loadTestFile(require.resolve('./_saved_queries')); - loadTestFile(require.resolve('./_discover')); - loadTestFile(require.resolve('./_discover_accessibility')); - loadTestFile(require.resolve('./_discover_histogram')); - loadTestFile(require.resolve('./_doc_accessibility')); - loadTestFile(require.resolve('./classic/_doc_table')); - loadTestFile(require.resolve('./classic/_doc_table_newline')); - loadTestFile(require.resolve('./_filter_editor')); - loadTestFile(require.resolve('./_errors')); - loadTestFile(require.resolve('./_field_data')); - loadTestFile(require.resolve('./classic/_field_data')); - loadTestFile(require.resolve('./_field_data_with_fields_api')); - loadTestFile(require.resolve('./classic/_field_data_with_fields_api')); - loadTestFile(require.resolve('./_shared_links')); - loadTestFile(require.resolve('./_sidebar')); - loadTestFile(require.resolve('./_source_filters')); - loadTestFile(require.resolve('./_large_string')); - loadTestFile(require.resolve('./_inspector')); - loadTestFile(require.resolve('./classic/_classic_table_doc_navigation')); - loadTestFile(require.resolve('./_date_nanos')); - loadTestFile(require.resolve('./_date_nanos_mixed')); - loadTestFile(require.resolve('./_indexpattern_without_timefield')); - loadTestFile(require.resolve('./classic/_discover_fields_api')); - loadTestFile(require.resolve('./_discover_fields_api')); - loadTestFile(require.resolve('./_data_grid')); - loadTestFile(require.resolve('./_data_grid_context')); - loadTestFile(require.resolve('./_data_grid_field_data')); - loadTestFile(require.resolve('./_data_grid_doc_navigation')); - loadTestFile(require.resolve('./_data_grid_row_navigation')); - loadTestFile(require.resolve('./_data_grid_doc_table')); - loadTestFile(require.resolve('./_data_grid_copy_to_clipboard')); - loadTestFile(require.resolve('./_data_grid_pagination')); - loadTestFile(require.resolve('./_sql_view')); - loadTestFile(require.resolve('./_indexpattern_with_unmapped_fields')); - loadTestFile(require.resolve('./_runtime_fields_editor')); - loadTestFile(require.resolve('./_huge_fields')); - loadTestFile(require.resolve('./_date_nested')); - loadTestFile(require.resolve('./_search_on_page_load')); - loadTestFile(require.resolve('./_chart_hidden')); - loadTestFile(require.resolve('./_context_encoded_url_params')); - loadTestFile(require.resolve('./_data_view_editor')); - loadTestFile(require.resolve('./_hide_announcements')); - loadTestFile(require.resolve('./classic/_hide_announcements')); - loadTestFile(require.resolve('./embeddable/saved_search_embeddable')); - } - }); -} diff --git a/test/functional/config.ccs.ts b/test/functional/config.ccs.ts index dfa61f654e092..6e3f92ac37b8e 100644 --- a/test/functional/config.ccs.ts +++ b/test/functional/config.ccs.ts @@ -19,7 +19,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { testFiles: [ require.resolve('./apps/dashboard/group3'), - require.resolve('./apps/discover'), + require.resolve('./apps/discover/ccs_compatibility'), require.resolve('./apps/console/_console_ccs'), ], diff --git a/test/functional/config.firefox.js b/test/functional/config.firefox.js index 79a757b1f1116..87811f8ee80be 100644 --- a/test/functional/config.firefox.js +++ b/test/functional/config.firefox.js @@ -16,7 +16,9 @@ export default async function ({ readConfigFile }) { require.resolve('./apps/console'), require.resolve('./apps/dashboard/group4/dashboard_save'), require.resolve('./apps/dashboard_elements'), - require.resolve('./apps/discover'), + require.resolve('./apps/discover/classic'), + require.resolve('./apps/discover/group1'), + require.resolve('./apps/discover/group2'), require.resolve('./apps/home'), require.resolve('./apps/visualize/group5'), ], diff --git a/versions.json b/versions.json index 4472f5ca75f10..0a3bd4225a713 100644 --- a/versions.json +++ b/versions.json @@ -14,7 +14,7 @@ "previousMinor": true }, { - "version": "8.3.3", + "version": "8.3.4", "branch": "8.3", "currentMajor": true }, diff --git a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx index 63d065cb15d5e..a6a2a6808dbaf 100644 --- a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx +++ b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx @@ -106,8 +106,7 @@ export const ExplainLogRateSpikesPage: FC = ({ }, [pinnedChangePoint, selectedChangePoint]); const { - overallDocStats, - selectedDocStats, + documentStats, timefilter, earliest, latest, @@ -121,9 +120,7 @@ export const ExplainLogRateSpikesPage: FC = ({ currentSelectedChangePoint ); - const totalCount = currentSelectedChangePoint - ? overallDocStats.totalCount + selectedDocStats.totalCount - : overallDocStats.totalCount; + const { totalCount, documentCountStats, documentCountStatsCompare } = documentStats; useEffect( // TODO: Consolidate this hook/function with with Data visualizer's @@ -221,15 +218,15 @@ export const ExplainLogRateSpikesPage: FC = ({ setSearchParams={setSearchParams} /> - {overallDocStats?.totalCount !== undefined && ( + {documentCountStats !== undefined && ( { - return fieldStatsRequest + return fieldStatsRequest && selectedChangePoint ? { ...fieldStatsRequest, selectedChangePoint, includeSelectedChangePoint: true } : undefined; }, [fieldStatsRequest, selectedChangePoint]); - const { docStats: overallDocStats } = useDocumentCountStats(overallStatsRequest, lastRefresh); - const { docStats: selectedDocStats } = useDocumentCountStats( + const documentStats = useDocumentCountStats( + overallStatsRequest, selectedChangePointStatsRequest, lastRefresh ); @@ -177,8 +177,7 @@ export const useData = ( }, [searchString, JSON.stringify(searchQuery)]); return { - overallDocStats, - selectedDocStats, + documentStats, timefilter, /** Start timestamp filter */ earliest: fieldStatsRequest?.earliest, diff --git a/x-pack/plugins/aiops/public/hooks/use_document_count_stats.ts b/x-pack/plugins/aiops/public/hooks/use_document_count_stats.ts index 237be187288fa..48929c25e800a 100644 --- a/x-pack/plugins/aiops/public/hooks/use_document_count_stats.ts +++ b/x-pack/plugins/aiops/public/hooks/use_document_count_stats.ts @@ -5,10 +5,13 @@ * 2.0. */ -import { useCallback, useEffect, useState, useMemo } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { lastValueFrom } from 'rxjs'; + import { i18n } from '@kbn/i18n'; import type { ToastsStart } from '@kbn/core/public'; +import { stringHash } from '@kbn/ml-string-hash'; + import { useAiOpsKibana } from '../kibana_context'; import { extractErrorProperties } from '../application/utils/error_utils'; import { @@ -21,6 +24,7 @@ import { export interface DocumentStats { totalCount: number; documentCountStats?: DocumentCountStats; + documentCountStatsCompare?: DocumentCountStats; } function displayError(toastNotifications: ToastsStart, index: string, err: any) { @@ -51,10 +55,9 @@ function displayError(toastNotifications: ToastsStart, index: string, err: any) export function useDocumentCountStats( searchParams: TParams | undefined, + searchParamsCompare: TParams | undefined, lastRefresh: number -): { - docStats: DocumentStats; -} { +): DocumentStats { const { services: { data, @@ -62,41 +65,91 @@ export function useDocumentCountStats({ + const abortCtrl = useRef(new AbortController()); + + const [documentStats, setDocumentStats] = useState({ totalCount: 0, }); + const [documentStatsCache, setDocumentStatsCache] = useState>({}); + const fetchDocumentCountData = useCallback(async () => { if (!searchParams) return; + const cacheKey = stringHash( + `${JSON.stringify(searchParams)}_${JSON.stringify(searchParamsCompare)}` + ); + + if (documentStatsCache[cacheKey]) { + setDocumentStats(documentStatsCache[cacheKey]); + return; + } + try { + abortCtrl.current = new AbortController(); + const resp = await lastValueFrom( - data.search.search({ - params: getDocumentCountStatsRequest(searchParams), - }) + data.search.search( + { + params: getDocumentCountStatsRequest(searchParams), + }, + { abortSignal: abortCtrl.current.signal } + ) ); + const documentCountStats = processDocumentCountStats(resp?.rawResponse, searchParams); const totalCount = documentCountStats?.totalCount ?? 0; - setStats({ + + const newStats: DocumentStats = { documentCountStats, totalCount, + }; + + if (searchParamsCompare) { + const respCompare = await lastValueFrom( + data.search.search( + { + params: getDocumentCountStatsRequest(searchParamsCompare), + }, + { abortSignal: abortCtrl.current.signal } + ) + ); + + const documentCountStatsCompare = processDocumentCountStats( + respCompare?.rawResponse, + searchParamsCompare + ); + const totalCountCompare = documentCountStatsCompare?.totalCount ?? 0; + + newStats.documentCountStatsCompare = documentCountStatsCompare; + newStats.totalCount = totalCount + totalCountCompare; + } + + setDocumentStats(newStats); + setDocumentStatsCache({ + ...documentStatsCache, + [cacheKey]: newStats, }); } catch (error) { - displayError(toasts, searchParams!.index, extractErrorProperties(error)); + // An `AbortError` gets triggered when a user cancels a request by navigating away, we need to ignore these errors. + if (error.name !== 'AbortError') { + displayError(toasts, searchParams!.index, extractErrorProperties(error)); + } } - }, [data?.search, searchParams, toasts]); + }, [data?.search, documentStatsCache, searchParams, searchParamsCompare, toasts]); useEffect( function getDocumentCountData() { fetchDocumentCountData(); + return () => abortCtrl.current.abort(); }, - [fetchDocumentCountData] + [fetchDocumentCountData, lastRefresh] ); - return useMemo( - () => ({ - docStats: stats, - }), - [stats] - ); + // Clear the document count stats cache when the outer page (date picker/search bar) triggers a refresh. + useEffect(() => { + setDocumentStatsCache({}); + }, [lastRefresh]); + + return documentStats; } diff --git a/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts b/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts index 65ed2065d7ade..cb0911e1c53be 100644 --- a/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts +++ b/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts @@ -7,6 +7,7 @@ import { chunk } from 'lodash'; +import { i18n } from '@kbn/i18n'; import { asyncForEach } from '@kbn/std'; import type { IRouter } from '@kbn/core/server'; import { KBN_FIELD_TYPES } from '@kbn/field-types'; @@ -81,7 +82,12 @@ export const defineExplainLogRateSpikesRoute = ( updateLoadingStateAction({ ccsWarning: false, loaded, - loadingState: 'Loading field candidates.', + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.loadingFieldCandidates', + { + defaultMessage: 'Loading field candidates.', + } + ), }) ); @@ -104,7 +110,16 @@ export const defineExplainLogRateSpikesRoute = ( updateLoadingStateAction({ ccsWarning: false, loaded, - loadingState: `Identified ${fieldCandidates.length} field candidates.`, + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates', + { + defaultMessage: + 'Identified {fieldCandidatesCount, plural, one {# field candidate} other {# field candidates}}.', + values: { + fieldCandidatesCount: fieldCandidates.length, + }, + } + ), }) ); @@ -144,9 +159,16 @@ export const defineExplainLogRateSpikesRoute = ( updateLoadingStateAction({ ccsWarning: false, loaded, - loadingState: `Identified ${ - changePoints?.length ?? 0 - } significant field/value pairs.`, + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs', + { + defaultMessage: + 'Identified {fieldValuePairsCount, plural, one {# significant field/value pair} other {# significant field/value pairs}}.', + values: { + fieldValuePairsCount: changePoints?.length ?? 0, + }, + } + ), }) ); @@ -157,14 +179,6 @@ export const defineExplainLogRateSpikesRoute = ( } if (changePoints?.length === 0) { - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded: 1, - loadingState: `Done.`, - }) - ); - end(); return; } @@ -239,7 +253,12 @@ export const defineExplainLogRateSpikesRoute = ( updateLoadingStateAction({ ccsWarning: false, loaded, - loadingState: `Loading histogram data.`, + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData', + { + defaultMessage: 'Loading histogram data.', + } + ), }) ); push( @@ -255,6 +274,19 @@ export const defineExplainLogRateSpikesRoute = ( }); } + push( + updateLoadingStateAction({ + ccsWarning: false, + loaded: 1, + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.doneMessage', + { + defaultMessage: 'Done.', + } + ), + }) + ); + end(); })(); diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/transaction_tabs.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/transaction_tabs.tsx index bdef27722c2a0..44ac77180d67c 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/transaction_tabs.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/transaction_tabs.tsx @@ -128,7 +128,7 @@ function LogsTabContent({ transaction }: { transaction: Transaction }) { logView={{ type: 'log-view-reference', logViewId: 'default' }} startTimestamp={startTimestamp - framePaddingMs} endTimestamp={endTimestamp + framePaddingMs} - query={`trace.id:"${transaction.trace.id}" OR "${transaction.trace.id}"`} + query={`trace.id:"${transaction.trace.id}" OR (not trace.id:* AND "${transaction.trace.id})"`} height={640} columns={[ { type: 'timestamp' }, diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/java_agent_version_input.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/java_agent_version_input.tsx index a570f6a382dee..f1b3d294a0ac7 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/java_agent_version_input.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/java_agent_version_input.tsx @@ -16,7 +16,7 @@ import { RuntimeAttachmentSettings } from '.'; interface Props { isValid: boolean; - version: string | null; + version: string; onChange: (nextVersion: RuntimeAttachmentSettings['version']) => void; } @@ -31,24 +31,13 @@ export function JavaAgentVersionInput({ isValid, version, onChange }: Props) { return callApmApi('GET /internal/apm/fleet/java_agent_versions'); }, []); - useEffect(() => { - // When version is not available on the fleet package sets it to "latest" - if (version === null) { - // This is necessary due to a possible bug in Fleet where even thought the form is valid - // the save button is still disabled: https://github.com/elastic/kibana/issues/135131 - setTimeout(() => { - onChange('latest'); - }, 1); - } - }, [version, onChange]); - const isLoading = status === FETCH_STATUS.LOADING; const agentJavaVersions = !isLoading && data?.versions ? data.versions.map((label) => ({ label })) : []; const hasOptions = !!agentJavaVersions.length; - const selectedOption = [{ label: version || '' }]; + const selectedOption = [{ label: version }]; const comboProps = !hasOptions ? { diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.tsx index dbf6cc249595c..8ae285a952688 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.tsx @@ -27,6 +27,8 @@ import { EditDiscoveryRule } from './edit_discovery_rule'; import { IDiscoveryRuleList, Operation, RuntimeAttachmentSettings } from '.'; import { JavaAgentVersionInput } from './java_agent_version_input'; +const DEFAULT_AGENT_VERSION = 'latest'; + interface Props { isEnabled: boolean; onToggleEnable: () => void; @@ -116,7 +118,7 @@ export function RuntimeAttachment({ {isEnabled && ( diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/supported_agents/java_runtime_attachment.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/supported_agents/java_runtime_attachment.tsx index 2d8f238049edc..ecce77f2e1c3a 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/supported_agents/java_runtime_attachment.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/supported_agents/java_runtime_attachment.tsx @@ -27,6 +27,8 @@ interface Props { onChange: PackagePolicyEditExtensionComponentProps['onChange']; } +const DEFAULT_AGENT_VERSION = 'latest'; + const excludeOptions = [ { value: 'main', @@ -197,7 +199,9 @@ export function JavaRuntimeAttachment({ newPolicy, onChange }: Props) { apmVars?.java_attacher_discovery_rules?.value ?? '[]\n', [initialDiscoveryRule] )} - version={apmVars?.java_attacher_agent_version?.value || null} + version={ + apmVars?.java_attacher_agent_version?.value || DEFAULT_AGENT_VERSION + } invalidatePackagePolicy={invalidatePackagePolicy} /> ); diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts index 2b3a08028ccec..c0b67dfc02e33 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts @@ -55,7 +55,7 @@ describe('Transaction action menu', () => { { key: 'traceLogs', label: 'Trace logs', - href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', + href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20(not%20trace.id:*%20AND%20%22123%22)', condition: true, }, ], @@ -122,7 +122,7 @@ describe('Transaction action menu', () => { { key: 'traceLogs', label: 'Trace logs', - href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', + href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20(not%20trace.id:*%20AND%20%22123%22)', condition: true, }, ], @@ -188,7 +188,7 @@ describe('Transaction action menu', () => { { key: 'traceLogs', label: 'Trace logs', - href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', + href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20(not%20trace.id:*%20AND%20%22123%22)', condition: true, }, ], diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts index 29db2d09b3bcf..144658746175f 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts @@ -168,7 +168,7 @@ export const getSections = ({ path: `/link-to/logs`, query: { time, - filter: `trace.id:"${transaction.trace.id}" OR "${transaction.trace.id}"`, + filter: `trace.id:"${transaction.trace.id}" OR (not trace.id:* AND "${transaction.trace.id}")`, }, }), condition: true, diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx index 9c5dd2bbe03b6..25e1277ebe0c3 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.test.tsx @@ -88,7 +88,7 @@ describe('TransactionActionMenu component', () => { expect( (getByText('Trace logs').parentElement as HTMLAnchorElement).href ).toEqual( - 'http://localhost/basepath/app/logs/link-to/logs?time=1545092070952&filter=trace.id:%228b60bd32ecc6e1506735a8b6cfcf175c%22%20OR%20%228b60bd32ecc6e1506735a8b6cfcf175c%22' + 'http://localhost/basepath/app/logs/link-to/logs?time=1545092070952&filter=trace.id:%228b60bd32ecc6e1506735a8b6cfcf175c%22%20OR%20(not%20trace.id:*%20AND%20%228b60bd32ecc6e1506735a8b6cfcf175c%22)' ); }); diff --git a/x-pack/plugins/cases/server/client/utils.test.ts b/x-pack/plugins/cases/server/client/utils.test.ts index 09ac6f5443a68..9c7d3e77cbd38 100644 --- a/x-pack/plugins/cases/server/client/utils.test.ts +++ b/x-pack/plugins/cases/server/client/utils.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { buildRangeFilter, constructQueryOptions, sortToSnake } from './utils'; +import { arraysDifference, buildRangeFilter, constructQueryOptions, sortToSnake } from './utils'; import { toElasticsearchQuery } from '@kbn/es-query'; import { CaseStatuses } from '../../common'; import { CaseSeverity } from '../../common/api'; @@ -489,4 +489,181 @@ describe('utils', () => { `); }); }); + + describe('arraysDifference', () => { + it('returns null if originalValue is null', () => { + expect(arraysDifference(null, [])).toBeNull(); + }); + + it('returns null if originalValue is undefined', () => { + expect(arraysDifference(undefined, [])).toBeNull(); + }); + + it('returns null if originalValue is not an array', () => { + // @ts-expect-error passing a string instead of an array + expect(arraysDifference('a string', [])).toBeNull(); + }); + + it('returns null if updatedValue is null', () => { + expect(arraysDifference([], null)).toBeNull(); + }); + + it('returns null if updatedValue is undefined', () => { + expect(arraysDifference([], undefined)).toBeNull(); + }); + + it('returns null if updatedValue is not an array', () => { + expect(arraysDifference([], 'a string' as unknown as string[])).toBeNull(); + }); + + it('returns null if the arrays are both empty', () => { + expect(arraysDifference([], [])).toBeNull(); + }); + + describe('object arrays', () => { + it('returns null if the arrays are both equal with single string', () => { + expect(arraysDifference([{ uid: 'a' }], [{ uid: 'a' }])).toBeNull(); + }); + + it('returns null if the arrays are both equal with multiple strings', () => { + expect( + arraysDifference([{ uid: 'a' }, { uid: 'b' }], [{ uid: 'a' }, { uid: 'b' }]) + ).toBeNull(); + }); + + it("returns 'b' in the added items when the updated value contains an added value", () => { + expect(arraysDifference([{ uid: 'a' }], [{ uid: 'a' }, { uid: 'b' }])) + .toMatchInlineSnapshot(` + Object { + "addedItems": Array [ + Object { + "uid": "b", + }, + ], + "deletedItems": Array [], + } + `); + }); + + it("returns 'b' in the deleted items when the updated value removes an item", () => { + expect(arraysDifference([{ uid: 'a' }, { uid: 'b' }], [{ uid: 'a' }])) + .toMatchInlineSnapshot(` + Object { + "addedItems": Array [], + "deletedItems": Array [ + Object { + "uid": "b", + }, + ], + } + `); + }); + + it("returns 'a' and 'b' in the added items when the updated value adds both", () => { + expect(arraysDifference([], [{ uid: 'a' }, { uid: 'b' }])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [ + Object { + "uid": "a", + }, + Object { + "uid": "b", + }, + ], + "deletedItems": Array [], + } + `); + }); + + it("returns 'a' and 'b' in the deleted items when the updated value removes both", () => { + expect(arraysDifference([{ uid: 'a' }, { uid: 'b' }], [])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [], + "deletedItems": Array [ + Object { + "uid": "a", + }, + Object { + "uid": "b", + }, + ], + } + `); + }); + + it('returns the added and deleted values if the type of objects are different', () => { + expect(arraysDifference([{ uid: 'a' }], [{ uid: 'a', hi: '1' }])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [ + Object { + "hi": "1", + "uid": "a", + }, + ], + "deletedItems": Array [ + Object { + "uid": "a", + }, + ], + } + `); + }); + }); + + describe('string arrays', () => { + it('returns null if the arrays are both equal with single string', () => { + expect(arraysDifference(['a'], ['a'])).toBeNull(); + }); + + it('returns null if the arrays are both equal with multiple strings', () => { + expect(arraysDifference(['a', 'b'], ['a', 'b'])).toBeNull(); + }); + + it("returns 'b' in the added items when the updated value contains an added value", () => { + expect(arraysDifference(['a'], ['a', 'b'])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [ + "b", + ], + "deletedItems": Array [], + } + `); + }); + + it("returns 'b' in the deleted items when the updated value removes an item", () => { + expect(arraysDifference(['a', 'b'], ['a'])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [], + "deletedItems": Array [ + "b", + ], + } + `); + }); + + it("returns 'a' and 'b' in the added items when the updated value adds both", () => { + expect(arraysDifference([], ['a', 'b'])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [ + "a", + "b", + ], + "deletedItems": Array [], + } + `); + }); + + it("returns 'a' and 'b' in the deleted items when the updated value removes both", () => { + expect(arraysDifference(['a', 'b'], [])).toMatchInlineSnapshot(` + Object { + "addedItems": Array [], + "deletedItems": Array [ + "a", + "b", + ], + } + `); + }); + }); + }); }); diff --git a/x-pack/plugins/cases/server/client/utils.ts b/x-pack/plugins/cases/server/client/utils.ts index 570bba9f4fefd..786c0ad582980 100644 --- a/x-pack/plugins/cases/server/client/utils.ts +++ b/x-pack/plugins/cases/server/client/utils.ts @@ -6,7 +6,7 @@ */ import { badRequest } from '@hapi/boom'; -import { get, isPlainObject } from 'lodash'; +import { get, isPlainObject, differenceWith, isEqual } from 'lodash'; import deepEqual from 'fast-deep-equal'; import { fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; @@ -313,48 +313,29 @@ export const constructQueryOptions = ({ }; }; -interface CompareArrays { - addedItems: string[]; - deletedItems: string[]; +interface CompareArrays { + addedItems: T[]; + deletedItems: T[]; } -export const compareArrays = ({ - originalValue, - updatedValue, -}: { - originalValue: string[]; - updatedValue: string[]; -}): CompareArrays => { - const result: CompareArrays = { - addedItems: [], - deletedItems: [], - }; - originalValue.forEach((origVal) => { - if (!updatedValue.includes(origVal)) { - result.deletedItems = [...result.deletedItems, origVal]; - } - }); - updatedValue.forEach((updatedVal) => { - if (!originalValue.includes(updatedVal)) { - result.addedItems = [...result.addedItems, updatedVal]; - } - }); - - return result; -}; -export const isTwoArraysDifference = ( - originalValue: unknown, - updatedValue: unknown -): CompareArrays | null => { +export const arraysDifference = ( + originalValue: T[] | undefined | null, + updatedValue: T[] | undefined | null +): CompareArrays | null => { if ( originalValue != null && updatedValue != null && Array.isArray(updatedValue) && Array.isArray(originalValue) ) { - const compObj = compareArrays({ originalValue, updatedValue }); - if (compObj.addedItems.length > 0 || compObj.deletedItems.length > 0) { - return compObj; + const addedItems = differenceWith(updatedValue, originalValue, isEqual); + const deletedItems = differenceWith(originalValue, updatedValue, isEqual); + + if (addedItems.length > 0 || deletedItems.length > 0) { + return { + addedItems, + deletedItems, + }; } } return null; @@ -374,7 +355,7 @@ export const getCaseToUpdate = ( (acc, [key, value]) => { const currentValue = get(currentCase, key); if (Array.isArray(currentValue) && Array.isArray(value)) { - if (isTwoArraysDifference(value, currentValue)) { + if (arraysDifference(value, currentValue)) { return { ...acc, [key]: value, diff --git a/x-pack/plugins/cases/server/services/user_actions/index.ts b/x-pack/plugins/cases/server/services/user_actions/index.ts index f0bdc0f44ddea..4135352bbc641 100644 --- a/x-pack/plugins/cases/server/services/user_actions/index.ts +++ b/x-pack/plugins/cases/server/services/user_actions/index.ts @@ -52,13 +52,14 @@ import { PUSH_CONNECTOR_ID_REFERENCE_NAME, } from '../../common/constants'; import { findConnectorIdReference } from '../transform'; -import { buildFilter, combineFilters, isTwoArraysDifference } from '../../client/utils'; +import { buildFilter, combineFilters, arraysDifference } from '../../client/utils'; import { BuilderParameters, BuilderReturnValue, CommonArguments, CreateUserAction } from './types'; import { BuilderFactory } from './builder_factory'; import { defaultSortField, isCommentRequestTypeExternalReferenceSO } from '../../common/utils'; import { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; import { injectPersistableReferencesToSO } from '../../attachment_framework/so_references'; import { IndexRefresh } from '../types'; +import { isStringArray } from './type_guards'; interface GetCaseUserActionArgs extends ClientArgs { caseId: string; @@ -131,9 +132,9 @@ export class CaseUserActionService { return []; } - if (field === ActionTypes.tags) { + if (field === ActionTypes.tags && isStringArray(originalValue) && isStringArray(newValue)) { const tagsUserActionBuilder = this.builderFactory.getBuilder(ActionTypes.tags); - const compareValues = isTwoArraysDifference(originalValue, newValue); + const compareValues = arraysDifference(originalValue, newValue); const userActions = []; if (compareValues && compareValues.addedItems.length > 0) { diff --git a/x-pack/plugins/cases/server/services/user_actions/type_guards.test.ts b/x-pack/plugins/cases/server/services/user_actions/type_guards.test.ts new file mode 100644 index 0000000000000..566693ec11299 --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/type_guards.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isObjectArray, isStringArray } from './type_guards'; + +describe('type_guards', () => { + describe('isStringArray', () => { + it('returns true when the value is an empty array', () => { + expect(isStringArray([])).toBeTruthy(); + }); + + it('returns true when the value is an array of a single string', () => { + expect(isStringArray(['a'])).toBeTruthy(); + }); + + it('returns true when the value is an array of multiple strings', () => { + expect(isStringArray(['a', 'b'])).toBeTruthy(); + }); + + it('returns false when the value is an array of strings and numbers', () => { + expect(isStringArray(['a', 1])).toBeFalsy(); + }); + + it('returns false when the value is an array of strings and objects', () => { + expect(isStringArray(['a', {}])).toBeFalsy(); + }); + }); + + describe('isObjectArray', () => { + it('returns true when the value is an empty array', () => { + expect(isObjectArray([])).toBeTruthy(); + }); + + it('returns true when the value is an array of a single string', () => { + expect(isObjectArray([{ a: '1' }])).toBeTruthy(); + }); + + it('returns true when the value is an array of multiple strings', () => { + expect(isObjectArray([{ a: 'a' }, { b: 'b' }])).toBeTruthy(); + }); + + it('returns false when the value is an array of strings and numbers', () => { + expect(isObjectArray([{ a: 'a' }, 1])).toBeFalsy(); + }); + + it('returns false when the value is an array of strings and objects', () => { + expect(isObjectArray(['a', {}])).toBeFalsy(); + }); + }); +}); diff --git a/x-pack/plugins/cases/server/services/user_actions/type_guards.ts b/x-pack/plugins/cases/server/services/user_actions/type_guards.ts new file mode 100644 index 0000000000000..25c9341b47363 --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/type_guards.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isPlainObject, isString } from 'lodash'; + +export const isStringArray = (value: unknown): value is string[] => { + return Array.isArray(value) && value.every((val) => isString(val)); +}; + +export const isObjectArray = (value: unknown): value is Array> => { + return Array.isArray(value) && value.every((val) => isPlainObject(val)); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts index bb20e0e639aa2..630d6f1b85a5d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts @@ -48,8 +48,16 @@ describe('CrawlCustomSettingsFlyoutLogic', () => { describe('fetchDomainConfigData', () => { it('updates logic with data that has been converted from server to client', async () => { jest.spyOn(CrawlCustomSettingsFlyoutLogic.actions, 'onRecieveDomainConfigData'); + http.get.mockReturnValueOnce( Promise.resolve({ + meta: { + page: { + current: 1, + size: 1, + total_pages: 2, + }, + }, results: [ { id: '1234', @@ -61,12 +69,50 @@ describe('CrawlCustomSettingsFlyoutLogic', () => { }) ); + http.get.mockReturnValueOnce( + Promise.resolve({ + meta: { + page: { + current: 2, + size: 1, + total_pages: 2, + }, + }, + results: [ + { + id: '5678', + name: 'https://www.swiftype.com', + seed_urls: [], + sitemap_urls: [], + }, + ], + }) + ); + CrawlCustomSettingsFlyoutLogic.actions.fetchDomainConfigData(); await nextTick(); - expect(http.get).toHaveBeenCalledWith( - '/internal/app_search/engines/some-engine/crawler/domain_configs' + expect(http.get).toHaveBeenNthCalledWith( + 1, + '/internal/enterprise_search/engines/some-engine/crawler/domain_configs', + { + query: { + 'page[current]': 1, + 'page[size]': 100, + }, + } + ); + expect(http.get).toHaveBeenNthCalledWith( + 2, + '/internal/enterprise_search/engines/some-engine/crawler/domain_configs', + { + query: { + 'page[current]': 2, + 'page[size]': 1, + }, + } ); + expect( CrawlCustomSettingsFlyoutLogic.actions.onRecieveDomainConfigData ).toHaveBeenCalledWith([ @@ -76,6 +122,12 @@ describe('CrawlCustomSettingsFlyoutLogic', () => { seedUrls: [], sitemapUrls: [], }, + { + id: '5678', + name: 'https://www.swiftype.com', + seedUrls: [], + sitemapUrls: [], + }, ]); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts index 3b04e1b28c17e..1f4003741e347 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts @@ -7,10 +7,10 @@ import { kea, MakeLogicType } from 'kea'; +import { Meta } from '../../../../../../../common/types'; import { flashAPIErrors } from '../../../../../shared/flash_messages'; import { HttpLogic } from '../../../../../shared/http'; import { EngineLogic } from '../../../engine'; - import { CrawlerLogic, CrawlRequestOverrides } from '../../crawler_logic'; import { DomainConfig, DomainConfigFromServer } from '../../types'; import { domainConfigServerToClient } from '../../utils'; @@ -198,12 +198,29 @@ export const CrawlCustomSettingsFlyoutLogic = kea< const { http } = HttpLogic.values; const { engineName } = EngineLogic.values; + let domainConfigs: DomainConfig[] = []; + let nextPage: number = 1; + let totalPages: number = 1; + let pageSize: number = 100; try { - const { results } = await http.get<{ - results: DomainConfigFromServer[]; - }>(`/internal/app_search/engines/${engineName}/crawler/domain_configs`); + while (nextPage <= totalPages) { + const { + results, + meta: { page }, + } = await http.get<{ + meta: Meta; + results: DomainConfigFromServer[]; + }>(`/internal/enterprise_search/engines/${engineName}/crawler/domain_configs`, { + query: { 'page[current]': nextPage, 'page[size]': pageSize }, + }); + + domainConfigs = [...domainConfigs, ...results.map(domainConfigServerToClient)]; + + nextPage = page.current + 1; + totalPages = page.total_pages; + pageSize = page.size; + } - const domainConfigs = results.map(domainConfigServerToClient); actions.onRecieveDomainConfigData(domainConfigs); } catch (e) { flashAPIErrors(e); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts index 0876bbdd827b7..25753312ba8db 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts @@ -6,13 +6,12 @@ */ import { LogicMounter, mockFlashMessageHelpers } from '../../../../__mocks__/kea_logic'; - import { connectorIndex } from '../../../__mocks__/view_index.mock'; import { ConnectorConfigurationApiLogic } from '../../../api/connector_package/update_connector_configuration_api_logic'; import { FetchIndexApiLogic } from '../../../api/index/fetch_index_api_logic'; -import '../_mocks_/index_name_logic.mock'; +import { IndexNameLogic } from '../index_name_logic'; import { IndexViewLogic } from '../index_view_logic'; import { ConnectorConfigurationLogic } from './connector_configuration_logic'; @@ -28,12 +27,14 @@ const DEFAULT_VALUES = { describe('ConnectorConfigurationLogic', () => { const { mount } = new LogicMounter(ConnectorConfigurationLogic); + const { mount: mountIndexNameLogic } = new LogicMounter(IndexNameLogic); const { mount: mountFetchIndexApiLogic } = new LogicMounter(FetchIndexApiLogic); const { mount: mountIndexViewLogic } = new LogicMounter(IndexViewLogic); const { clearFlashMessages, flashAPIErrors, flashSuccessToast } = mockFlashMessageHelpers; beforeEach(() => { jest.clearAllMocks(); + mountIndexNameLogic({ indexName: 'index-name' }, { indexName: 'index-name' }); mountFetchIndexApiLogic(); mountIndexViewLogic({ index: 'index' }); mount(); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts index eff81c832f317..41686d1b001a7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.test.ts @@ -10,7 +10,6 @@ import '../../_mocks_/index_name_logic.mock'; import { nextTick } from '@kbn/test-jest-helpers'; import { itShowsServerErrorAsFlashMessage } from '../../../../../test_helpers'; - import { DomainConfig } from '../../../../api/crawler/types'; import { CrawlerLogic } from '../crawler_logic'; @@ -49,8 +48,16 @@ describe('CrawlCustomSettingsFlyoutLogic', () => { describe('fetchDomainConfigData', () => { it('updates logic with data that has been converted from server to client', async () => { jest.spyOn(CrawlCustomSettingsFlyoutLogic.actions, 'onRecieveDomainConfigData'); + http.get.mockReturnValueOnce( Promise.resolve({ + meta: { + page: { + current: 1, + size: 1, + total_pages: 2, + }, + }, results: [ { id: '1234', @@ -62,11 +69,48 @@ describe('CrawlCustomSettingsFlyoutLogic', () => { }) ); + http.get.mockReturnValueOnce( + Promise.resolve({ + meta: { + page: { + current: 2, + size: 1, + total_pages: 2, + }, + }, + results: [ + { + id: '5678', + name: 'https://www.swiftype.com', + seed_urls: [], + sitemap_urls: [], + }, + ], + }) + ); + CrawlCustomSettingsFlyoutLogic.actions.fetchDomainConfigData(); await nextTick(); - expect(http.get).toHaveBeenCalledWith( - '/internal/enterprise_search/indices/index-name/crawler/domain_configs' + expect(http.get).toHaveBeenNthCalledWith( + 1, + '/internal/enterprise_search/indices/index-name/crawler/domain_configs', + { + query: { + 'page[current]': 1, + 'page[size]': 100, + }, + } + ); + expect(http.get).toHaveBeenNthCalledWith( + 2, + '/internal/enterprise_search/indices/index-name/crawler/domain_configs', + { + query: { + 'page[current]': 2, + 'page[size]': 1, + }, + } ); expect( CrawlCustomSettingsFlyoutLogic.actions.onRecieveDomainConfigData @@ -77,6 +121,12 @@ describe('CrawlCustomSettingsFlyoutLogic', () => { seedUrls: [], sitemapUrls: [], }, + { + id: '5678', + name: 'https://www.swiftype.com', + seedUrls: [], + sitemapUrls: [], + }, ]); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts index 7c0e2fcc33cc3..ae2f0fef68567 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_logic.ts @@ -7,6 +7,7 @@ import { kea, MakeLogicType } from 'kea'; +import { Meta } from '../../../../../../../common/types'; import { flashAPIErrors } from '../../../../../shared/flash_messages'; import { HttpLogic } from '../../../../../shared/http'; import { GetCrawlerApiLogic } from '../../../../api/crawler/get_crawler_api_logic'; @@ -202,12 +203,31 @@ export const CrawlCustomSettingsFlyoutLogic = kea< fetchDomainConfigData: async () => { const { http } = HttpLogic.values; const { indexName } = IndexNameLogic.values; + + let domainConfigs: DomainConfig[] = []; + let totalPages: number = 1; + let nextPage: number = 1; + let pageSize: number = 100; + try { - const { results } = await http.get<{ - results: DomainConfigFromServer[]; - }>(`/internal/enterprise_search/indices/${indexName}/crawler/domain_configs`); + while (nextPage <= totalPages) { + const { + results, + meta: { page }, + } = await http.get<{ + meta: Meta; + results: DomainConfigFromServer[]; + }>(`/internal/enterprise_search/indices/${indexName}/crawler/domain_configs`, { + query: { 'page[current]': nextPage, 'page[size]': pageSize }, + }); + + domainConfigs = [...domainConfigs, ...results.map(domainConfigServerToClient)]; + + nextPage = page.current + 1; + totalPages = page.total_pages; + pageSize = page.size; + } - const domainConfigs = results.map(domainConfigServerToClient); actions.onRecieveDomainConfigData(domainConfigs); } catch (e) { flashAPIErrors(e); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_logic.ts index 1b9d30985c4d9..7b664de1e24cc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_logic.ts @@ -22,15 +22,6 @@ import { } from '../../../api/crawler/types'; import { IndexNameLogic } from '../index_name_logic'; -const POLLING_DURATION = 1000; -const POLLING_DURATION_ON_FAILURE = 5000; -const ACTIVE_STATUSES = [ - CrawlerStatus.Pending, - CrawlerStatus.Starting, - CrawlerStatus.Running, - CrawlerStatus.Canceling, -]; - export interface CrawlRequestOverrides { domain_allowlist?: string[]; max_crawl_depth?: number; @@ -53,7 +44,6 @@ export type CrawlerActions = Pick< Actions, 'apiError' | 'apiSuccess' > & { - clearTimeoutId(): void; createNewTimeoutForCrawlerData(duration: number): { duration: number }; fetchCrawlerData(): void; onCreateNewTimeout(timeoutId: NodeJS.Timeout): { timeoutId: NodeJS.Timeout }; @@ -63,73 +53,24 @@ export type CrawlerActions = Pick< }; export const CrawlerLogic = kea>({ - path: ['enterprise_search', 'crawler_logic'], - connect: { - actions: [GetCrawlerApiLogic, ['apiError', 'apiSuccess']], - values: [GetCrawlerApiLogic, ['status', 'data']], - }, actions: { - clearTimeoutId: true, - createNewTimeoutForCrawlerData: (duration) => ({ duration }), fetchCrawlerData: true, - onCreateNewTimeout: (timeoutId) => ({ timeoutId }), reApplyCrawlRules: (domain) => ({ domain }), startCrawl: (overrides) => ({ overrides }), stopCrawl: () => null, }, - reducers: { - dataLoading: [ - true, - { - apiError: () => false, - apiSuccess: () => false, - }, - ], - timeoutId: [ - null, - { - apiError: () => null, - apiSuccess: () => null, - onCreateNewTimeout: (_, { timeoutId }) => timeoutId, - }, - ], + connect: { + actions: [GetCrawlerApiLogic, ['apiError', 'apiSuccess']], + values: [GetCrawlerApiLogic, ['status', 'data']], }, - selectors: ({ selectors }) => ({ - domains: [() => [selectors.data], (data: CrawlerValues['data']) => data?.domains ?? []], - events: [() => [selectors.data], (data: CrawlerValues['data']) => data?.events ?? []], - mostRecentCrawlRequest: [ - () => [selectors.data], - (data: CrawlerValues['data']) => data?.mostRecentCrawlRequest ?? null, - ], - mostRecentCrawlRequestStatus: [ - () => [selectors.mostRecentCrawlRequest], - (crawlRequest: CrawlerValues['mostRecentCrawlRequest']) => crawlRequest?.status ?? null, - ], - }), - listeners: ({ actions, values }) => ({ + listeners: ({ actions }) => ({ apiError: (error) => { flashAPIErrors(error); - actions.createNewTimeoutForCrawlerData(POLLING_DURATION_ON_FAILURE); }, - apiSuccess: ({ mostRecentCrawlRequest }) => { - const continuePoll = - mostRecentCrawlRequest && ACTIVE_STATUSES.includes(mostRecentCrawlRequest.status); - - if (continuePoll) { - actions.createNewTimeoutForCrawlerData(POLLING_DURATION); - } - }, - - createNewTimeoutForCrawlerData: ({ duration }) => { - if (values.timeoutId) { - clearTimeout(values.timeoutId); - } - - const timeoutIdId = setTimeout(() => { - actions.fetchCrawlerData(); - }, duration); + fetchCrawlerData: () => { + const { indexName } = IndexNameLogic.values; - actions.onCreateNewTimeout(timeoutIdId); + GetCrawlerApiLogic.actions.makeRequest({ indexName }); }, reApplyCrawlRules: async ({ domain }) => { const { indexName } = IndexNameLogic.values; @@ -159,14 +100,6 @@ export const CrawlerLogic = kea>({ flashAPIErrors(e); } }, - fetchCrawlerData: () => { - const { indexName } = IndexNameLogic.values; - - if (values.timeoutId) { - clearTimeout(values.timeoutId); - } - GetCrawlerApiLogic.actions.makeRequest({ indexName }); - }, startCrawl: async ({ overrides = {} }) => { const { indexName } = IndexNameLogic.values; const { http } = HttpLogic.values; @@ -194,14 +127,26 @@ export const CrawlerLogic = kea>({ } }, }), - events: ({ actions, values }) => ({ - afterMount: () => { - actions.fetchCrawlerData(); - }, - beforeUnmount: () => { - if (values.timeoutId) { - clearTimeout(values.timeoutId); - } - }, + path: ['enterprise_search', 'crawler_logic'], + reducers: { + dataLoading: [ + true, + { + apiError: () => false, + apiSuccess: () => false, + }, + ], + }, + selectors: ({ selectors }) => ({ + domains: [() => [selectors.data], (data: CrawlerValues['data']) => data?.domains ?? []], + events: [() => [selectors.data], (data: CrawlerValues['data']) => data?.events ?? []], + mostRecentCrawlRequest: [ + () => [selectors.data], + (data: CrawlerValues['data']) => data?.mostRecentCrawlRequest ?? null, + ], + mostRecentCrawlRequestStatus: [ + () => [selectors.mostRecentCrawlRequest], + (crawlRequest: CrawlerValues['mostRecentCrawlRequest']) => crawlRequest?.status ?? null, + ], }), }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_name_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_name_logic.ts index d11034335d2b3..b18f1dc6a15b3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_name_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_name_logic.ts @@ -25,7 +25,8 @@ export const IndexNameLogic = kea ({ indexName: [ - props.indexName, + // Short-circuiting this to empty string is necessary to enable testing logics relying on this + props.indexName ?? '', { setIndexName: (_, { indexName }) => indexName, }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts index 8e19cacaafd50..2191f788b024a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts @@ -6,8 +6,7 @@ */ import { LogicMounter, mockFlashMessageHelpers } from '../../../__mocks__/kea_logic'; -import { apiIndex, connectorIndex } from '../../__mocks__/view_index.mock'; -import './_mocks_/index_name_logic.mock'; +import { apiIndex, connectorIndex, crawlerIndex } from '../../__mocks__/view_index.mock'; import { nextTick } from '@kbn/test-jest-helpers'; @@ -21,12 +20,15 @@ import { IngestionMethod, IngestionStatus } from '../../types'; import { indexToViewIndex } from '../../utils/indices'; -import { IndexViewLogic, IndexViewValues } from './index_view_logic'; +import { IndexNameLogic } from './index_name_logic'; +import { IndexViewLogic } from './index_view_logic'; -const DEFAULT_VALUES: IndexViewValues = { +// We can't test fetchTimeOutId because this will get set whenever the logic is created +// And the timeoutId is non-deterministic. We use expect.object.containing throughout this test file +const DEFAULT_VALUES = { data: undefined, - fetchIndexTimeoutId: null, index: undefined, + indexName: '', ingestionMethod: IngestionMethod.API, ingestionStatus: IngestionStatus.CONNECTED, isSyncing: false, @@ -48,18 +50,20 @@ const CONNECTOR_VALUES = { describe('IndexViewLogic', () => { const { mount: apiLogicMount } = new LogicMounter(StartSyncApiLogic); const { mount: fetchIndexMount } = new LogicMounter(FetchIndexApiLogic); + const indexNameLogic = new LogicMounter(IndexNameLogic); const { mount } = new LogicMounter(IndexViewLogic); beforeEach(() => { jest.clearAllMocks(); jest.useRealTimers(); + indexNameLogic.mount({ indexName: 'index-name' }, { indexName: 'index-name' }); apiLogicMount(); fetchIndexMount(); mount(); }); it('has expected default values', () => { - expect(IndexViewLogic.values).toEqual(DEFAULT_VALUES); + expect(IndexViewLogic.values).toEqual(expect.objectContaining(DEFAULT_VALUES)); }); describe('actions', () => { @@ -74,36 +78,59 @@ describe('IndexViewLogic', () => { connector: { ...connectorIndex.connector!, sync_now: true }, }); - expect(IndexViewLogic.values).toEqual({ - ...CONNECTOR_VALUES, - data: { - ...CONNECTOR_VALUES.data, - connector: { ...CONNECTOR_VALUES.data.connector, sync_now: true }, - }, - index: { - ...CONNECTOR_VALUES.index, - connector: { ...CONNECTOR_VALUES.index.connector, sync_now: true }, - }, - isWaitingForSync: true, - localSyncNowValue: true, - syncStatus: SyncStatus.COMPLETED, - }); + expect(IndexViewLogic.values).toEqual( + expect.objectContaining({ + ...CONNECTOR_VALUES, + data: { + ...CONNECTOR_VALUES.data, + connector: { ...CONNECTOR_VALUES.data.connector, sync_now: true }, + }, + index: { + ...CONNECTOR_VALUES.index, + connector: { ...CONNECTOR_VALUES.index.connector, sync_now: true }, + }, + isWaitingForSync: true, + localSyncNowValue: true, + syncStatus: SyncStatus.COMPLETED, + }) + ); }); it('should update values with no connector', () => { FetchIndexApiLogic.actions.apiSuccess(apiIndex); - expect(IndexViewLogic.values).toEqual({ - ...DEFAULT_VALUES, - data: apiIndex, - index: apiIndex, - }); + expect(IndexViewLogic.values).toEqual( + expect.objectContaining({ + ...DEFAULT_VALUES, + data: apiIndex, + index: apiIndex, + }) + ); }); it('should call createNewFetchIndexTimeout', () => { + IndexViewLogic.actions.fetchCrawlerData = jest.fn(); + IndexNameLogic.actions.setIndexName('api'); FetchIndexApiLogic.actions.apiSuccess(apiIndex); expect(IndexViewLogic.actions.createNewFetchIndexTimeout).toHaveBeenCalled(); + expect(IndexViewLogic.actions.fetchCrawlerData).not.toHaveBeenCalled(); + }); + it('should call fetchCrawler if index is a crawler ', () => { + IndexViewLogic.actions.fetchCrawlerData = jest.fn(); + IndexNameLogic.actions.setIndexName('crawler'); + FetchIndexApiLogic.actions.apiSuccess(crawlerIndex); + + expect(IndexViewLogic.actions.createNewFetchIndexTimeout).toHaveBeenCalled(); + expect(IndexViewLogic.actions.fetchCrawlerData).toHaveBeenCalled(); + }); + it('should not call fetchCrawler if index is a crawler but indexName does not match', () => { + IndexViewLogic.actions.fetchCrawlerData = jest.fn(); + IndexNameLogic.actions.setIndexName('api'); + FetchIndexApiLogic.actions.apiSuccess(crawlerIndex); + + expect(IndexViewLogic.actions.createNewFetchIndexTimeout).toHaveBeenCalled(); + expect(IndexViewLogic.actions.fetchCrawlerData).not.toHaveBeenCalled(); }); }); @@ -148,6 +175,26 @@ describe('IndexViewLogic', () => { }); }); + describe('clearTimeoutId', () => { + it('should clear timeout Id', () => { + IndexViewLogic.actions.startFetchIndexPoll(); + expect(IndexViewLogic.values.fetchIndexTimeoutId).not.toEqual(null); + IndexViewLogic.actions.clearFetchIndexTimeout(); + expect(IndexViewLogic.values.fetchIndexTimeoutId).toEqual(null); + }); + }); + describe('createNewFetchIndexTimeout', () => { + it('should trigger fetchIndex after timeout', async () => { + IndexViewLogic.actions.fetchIndex = jest.fn(); + jest.useFakeTimers(); + IndexViewLogic.actions.createNewFetchIndexTimeout(1); + expect(IndexViewLogic.actions.fetchIndex).not.toHaveBeenCalled(); + jest.advanceTimersByTime(2); + await nextTick(); + expect(IndexViewLogic.actions.fetchIndex).toHaveBeenCalled(); + }); + }); + describe('listeners', () => { it('calls clearFlashMessages on makeStartSyncRequest', () => { IndexViewLogic.actions.makeStartSyncRequest({ connectorId: 'connectorId' }); @@ -159,5 +206,13 @@ describe('IndexViewLogic', () => { expect(mockFlashMessageHelpers.flashAPIErrors).toHaveBeenCalledTimes(1); expect(mockFlashMessageHelpers.flashAPIErrors).toHaveBeenCalledWith({}); }); + it('calls makeFetchIndexRequest on fetchIndex', () => { + IndexViewLogic.actions.makeFetchIndexRequest = jest.fn(); + IndexNameLogic.actions.setIndexName('indexName'); + IndexViewLogic.actions.fetchIndex(); + expect(IndexViewLogic.actions.makeFetchIndexRequest).toHaveBeenCalledWith({ + indexName: 'indexName', + }); + }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts index 0505b1ae23bdd..6f7e4f871e723 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts @@ -29,11 +29,13 @@ import { getLastUpdated, indexToViewIndex, isConnectorIndex, + isCrawlerIndex, } from '../../utils/indices'; +import { CrawlerLogic } from './crawler/crawler_logic'; import { IndexNameLogic } from './index_name_logic'; -const FETCH_INDEX_POLLING_DURATION = 5000; // 5 seconds +const FETCH_INDEX_POLLING_DURATION = 1000; // 1 seconds const FETCH_INDEX_POLLING_DURATION_ON_FAILURE = 30000; // 30 seconds type FetchIndexApiValues = Actions; @@ -42,6 +44,8 @@ type StartSyncApiValues = Actions; export interface IndexViewActions { clearFetchIndexTimeout(): void; createNewFetchIndexTimeout(duration: number): { duration: number }; + fetchCrawlerData: () => void; + fetchIndex: () => void; fetchIndexApiSuccess: FetchIndexApiValues['apiSuccess']; makeFetchIndexRequest: FetchIndexApiValues['makeRequest']; makeStartSyncRequest: StartSyncApiValues['makeRequest']; @@ -58,6 +62,7 @@ export interface IndexViewValues { data: typeof FetchIndexApiLogic.values.data; fetchIndexTimeoutId: NodeJS.Timeout | null; index: ElasticsearchViewIndex | undefined; + indexName: string; ingestionMethod: IngestionMethod; ingestionStatus: IngestionStatus; isSyncing: boolean; @@ -71,6 +76,7 @@ export const IndexViewLogic = kea ({ duration }), + fetchIndex: true, setFetchIndexTimeoutId: (timeoutId) => ({ timeoutId }), startFetchIndexPoll: true, startSync: true, @@ -91,31 +97,58 @@ export const IndexViewLogic = kea ({ + afterMount: () => { + actions.startFetchIndexPoll(); + }, + beforeUnmount: () => { + if (values.fetchIndexTimeoutId) { + clearTimeout(values.fetchIndexTimeoutId); + } + }, + }), listeners: ({ actions, values }) => ({ createNewFetchIndexTimeout: ({ duration }) => { if (values.fetchIndexTimeoutId) { clearTimeout(values.fetchIndexTimeoutId); } - const { indexName } = IndexNameLogic.values; const timeoutId = setTimeout(() => { - actions.makeFetchIndexRequest({ indexName }); + actions.fetchIndex(); }, duration); actions.setFetchIndexTimeoutId(timeoutId); }, + fetchIndex: () => { + const { indexName } = IndexNameLogic.values; + actions.makeFetchIndexRequest({ indexName }); + }, fetchIndexApiError: () => { actions.createNewFetchIndexTimeout(FETCH_INDEX_POLLING_DURATION_ON_FAILURE); }, - fetchIndexApiSuccess: () => { + fetchIndexApiSuccess: (index) => { actions.createNewFetchIndexTimeout(FETCH_INDEX_POLLING_DURATION); + if (isCrawlerIndex(index) && index.name === values.indexName) { + actions.fetchCrawlerData(); + } }, makeStartSyncRequest: () => clearFlashMessages(), + setIndexName: () => { + if (values.fetchIndexTimeoutId) { + clearTimeout(values.fetchIndexTimeoutId); + } + actions.clearFetchIndexTimeout(); + actions.resetFetchIndexApi(); + actions.fetchIndex(); + }, startFetchIndexPoll: () => { - const { indexName } = IndexNameLogic.values; // we rely on listeners for fetchIndexApiError and fetchIndexApiSuccess to handle reccuring polling - actions.makeFetchIndexRequest({ indexName }); + actions.fetchIndex(); }, startSync: () => { if (isConnectorIndex(values.data)) { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx index 6b23a3c68a1ee..4bc2206715c15 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx @@ -5,11 +5,11 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React from 'react'; import { useParams } from 'react-router-dom'; -import { useActions, useValues } from 'kea'; +import { useValues } from 'kea'; import { EuiTabbedContent, EuiTabbedContentTab } from '@elastic/eui'; @@ -36,7 +36,6 @@ import { SearchIndexDomainManagement } from './crawler/domain_management/domain_ import { SearchIndexDocuments } from './documents'; import { SearchIndexIndexMappings } from './index_mappings'; import { IndexNameLogic } from './index_name_logic'; -import { IndexViewLogic } from './index_view_logic'; import { SearchIndexOverview } from './overview'; export enum SearchIndexTabId { @@ -53,7 +52,6 @@ export enum SearchIndexTabId { export const SearchIndex: React.FC = () => { const { data: indexData, status: indexApiStatus } = useValues(FetchIndexApiLogic); - const { startFetchIndexPoll, stopFetchIndexPoll } = useActions(IndexViewLogic); const { isCalloutVisible } = useValues(IndexCreatedCalloutLogic); const { tabId = SearchIndexTabId.OVERVIEW } = useParams<{ tabId?: string; @@ -61,11 +59,6 @@ export const SearchIndex: React.FC = () => { const { indexName } = useValues(IndexNameLogic); - useEffect(() => { - startFetchIndexPoll(); - return stopFetchIndexPoll; - }, [indexName]); - const ALL_INDICES_TABS: EuiTabbedContentTab[] = [ { content: , @@ -158,7 +151,9 @@ export const SearchIndex: React.FC = () => { > <> {isCalloutVisible && } - + {indexName === indexData?.name && ( + + )} {isCrawlerIndex(indexData) && } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index_router.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index_router.tsx index c5acd80aaf6bc..2dc5ff8d059c9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index_router.tsx @@ -19,6 +19,7 @@ import { import { CrawlerDomainDetail } from '../crawler_domain_detail/crawler_domain_detail'; import { IndexNameLogic } from './index_name_logic'; +import { IndexViewLogic } from './index_view_logic'; import { SearchIndex } from './search_index'; export const SearchIndexRouter: React.FC = () => { @@ -26,6 +27,17 @@ export const SearchIndexRouter: React.FC = () => { const indexNameLogic = IndexNameLogic({ indexName }); const { setIndexName } = useActions(indexNameLogic); + const { stopFetchIndexPoll } = useActions(IndexViewLogic); + useEffect(() => { + const unmountName = indexNameLogic.mount(); + const unmountView = IndexViewLogic.mount(); + return () => { + stopFetchIndexPoll(); + unmountName(); + unmountView(); + }; + }, []); + useEffect(() => {}, []); useEffect(() => { setIndexName(indexName); diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.test.ts index 3e56b75d01e93..2684f9d9732a4 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.test.ts @@ -698,11 +698,16 @@ describe('crawler routes', () => { }); it('validates correctly with name', () => { - const request = { params: { name: 'some-engine' } }; + const request = { params: { name: 'some-engine' }, query: { 'page[current]': 4 } }; mockRouter.shouldValidate(request); }); - it('fails validation without name', () => { + it('validates correctly with page[current]', () => { + const request = { params: { name: 'some-engine' }, query: { 'page[size]': 100 } }; + mockRouter.shouldValidate(request); + }); + + it('fails validation without page[size]', () => { const request = { params: {} }; mockRouter.shouldThrow(request); }); diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.ts index 00aabc02a7586..4e8f6ab527e85 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler.ts @@ -283,6 +283,10 @@ export function registerCrawlerRoutes({ params: schema.object({ name: schema.string(), }), + query: schema.object({ + 'page[current]': schema.maybe(schema.number()), + 'page[size]': schema.maybe(schema.number()), + }), }, }, enterpriseSearchRequestHandler.createRequest({ diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts index 2207257b016ec..03b02fb0e2841 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts @@ -689,6 +689,16 @@ describe('crawler routes', () => { mockRouter.shouldValidate(request); }); + it('validates correctly with page[current]', () => { + const request = { params: { indexName: 'index-name' }, query: { 'page[current]': 4 } }; + mockRouter.shouldValidate(request); + }); + + it('validates correctly with page[size]', () => { + const request = { params: { indexName: 'index-name' }, query: { 'page[size]': 100 } }; + mockRouter.shouldValidate(request); + }); + it('fails validation without name', () => { const request = { params: {} }; mockRouter.shouldThrow(request); diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts index 91895cc190893..eec442fcaef7a 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts @@ -274,6 +274,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { params: schema.object({ indexName: schema.string(), }), + query: schema.object({ + 'page[current]': schema.maybe(schema.number()), + 'page[size]': schema.maybe(schema.number()), + }), }, }, enterpriseSearchRequestHandler.createRequest({ diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx index 5e53b775526a4..a37052944ddb5 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx @@ -169,23 +169,14 @@ export const AgentUpgradeAgentModal: React.FunctionComponent { ...props.state.layers.first.columns, col2: expect.objectContaining({ timeScale: 'h', - label: 'Value count of bytes per hour', + label: 'Count of bytes per hour', }), }, }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts index dae677663d289..c9b3d03a8b361 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts @@ -211,7 +211,7 @@ describe('time scale transition', () => { ).toEqual( expect.objectContaining({ timeScale: undefined, - label: 'Value count of bytesLabel', + label: 'Count of bytesLabel', }) ); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx index d3c0b9700379c..b7d806807b6b7 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx @@ -53,7 +53,7 @@ function ofName( return adjustTimeScaleLabelSuffix( field?.type !== 'document' ? i18n.translate('xpack.lens.indexPattern.valueCountOf', { - defaultMessage: 'Value count of {name}', + defaultMessage: 'Count of {name}', values: { name: field?.displayName || '-', }, diff --git a/x-pack/plugins/lens/public/visualization_container.scss b/x-pack/plugins/lens/public/visualization_container.scss index ba74fb711d967..a20bcef82e17b 100644 --- a/x-pack/plugins/lens/public/visualization_container.scss +++ b/x-pack/plugins/lens/public/visualization_container.scss @@ -11,6 +11,8 @@ height: 100%; display: flex; overflow: auto; + // important for visualizations with no padding + border-radius: $euiBorderRadius; .lnsExpressionRenderer__component { position: static; // Let the progress indicator position itself against the outer parent diff --git a/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.test.js b/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.test.js index 096f5370ca3b9..49996b61ba6c6 100644 --- a/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.test.js +++ b/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.test.js @@ -360,6 +360,14 @@ describe('geoPointToGeometry', () => { expect(points[0].coordinates).toEqual([lon, lat]); }); + it('Should convert runtime geo_point value', () => { + const points = []; + geoPointToGeometry(`${lat},${lon}`, points); + expect(points.length).toBe(1); + expect(points[0].type).toBe('Point'); + expect(points[0].coordinates).toEqual([lon, lat]); + }); + it('Should convert array of values', () => { const lat2 = 30; const lon2 = -60; diff --git a/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.ts b/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.ts index 3e49497678744..964a88a8b1a93 100644 --- a/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.ts +++ b/x-pack/plugins/maps/common/elasticsearch_util/elasticsearch_geo_utils.ts @@ -129,7 +129,7 @@ export function hitsToGeoJson( // Parse geo_point fields API response export function geoPointToGeometry( - value: Point[] | Point | undefined, + value: Point[] | Point | string | undefined, accumulator: Geometry[] ): void { if (!value) { @@ -143,6 +143,20 @@ export function geoPointToGeometry( return; } + // runtime geo_point field returns value as "lat,lon" string instead of GeoJSON + // This is a workaround for a bug - https://github.com/elastic/elasticsearch/issues/85245 + if (typeof value === 'string') { + const commaSplit = value.split(','); + const lat = parseFloat(commaSplit[0]); + const lon = parseFloat(commaSplit[1]); + accumulator.push({ + type: GEO_JSON_TYPE.POINT, + coordinates: [lon, lat], + } as Point); + return; + } + + // geo_point fields API returns GeoJSON accumulator.push(value as Point); } diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap b/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap index 60d7be79d35e3..1edbdec242722 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap @@ -52,7 +52,6 @@ exports[`should enable sort order select when sort field provided 1`] = ` > @@ -201,10 +201,12 @@ exports[`should render update source editor 1`] = ` clusteringDisabledReason={null} filterByMapBounds={true} indexPatternId="indexPattern1" + mvtDisabledReason={null} numberOfJoins={0} onChange={[Function]} scalingType="LIMIT" supportsClustering={false} + supportsMvt={true} /> | null) => void; +} + +interface State { + indexPattern: DataView | undefined; + geoFields: DataViewField[] | undefined; + geoFieldName: string | undefined; +} + +const RESET_INDEX_PATTERN_STATE: State = { indexPattern: undefined, geoFields: undefined, geoFieldName: undefined, }; -export class CreateSourceEditor extends Component { - static propTypes = { - onSourceConfigChange: PropTypes.func.isRequired, - }; - - state = { +export class CreateSourceEditor extends Component { + state: State = { ...RESET_INDEX_PATTERN_STATE, }; - _onIndexPatternSelect = (indexPattern) => { + _onIndexPatternSelect = (indexPattern: DataView) => { const geoFields = getGeoFields(indexPattern.fields); this.setState( @@ -54,7 +62,7 @@ export class CreateSourceEditor extends Component { ); }; - _onGeoFieldSelect = (geoFieldName) => { + _onGeoFieldSelect = (geoFieldName?: string) => { this.setState( { geoFieldName, @@ -66,12 +74,14 @@ export class CreateSourceEditor extends Component { _previewLayer = () => { const { indexPattern, geoFieldName } = this.state; + const field = geoFieldName && indexPattern?.getFieldByName(geoFieldName); + const sourceConfig = indexPattern && geoFieldName ? { indexPatternId: indexPattern.id, geoField: geoFieldName, - scalingType: SCALING_TYPES.MVT, + scalingType: field && field.isRuntimeField ? SCALING_TYPES.LIMIT : SCALING_TYPES.MVT, } : null; this.props.onSourceConfigChange(sourceConfig); @@ -92,7 +102,7 @@ export class CreateSourceEditor extends Component { placeholder={i18n.translate('xpack.maps.source.esSearch.selectLabel', { defaultMessage: 'Select geo field', })} - value={this.state.geoFieldName} + value={this.state.geoFieldName ? this.state.geoFieldName : null} onChange={this._onGeoFieldSelect} fields={this.state.geoFields} /> @@ -104,7 +114,9 @@ export class CreateSourceEditor extends Component { return ( diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx index 92580f92f0279..72a0539be6b08 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx @@ -7,7 +7,6 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; -// @ts-ignore import { CreateSourceEditor } from './create_source_editor'; import { LayerWizard, RenderWizardArguments } from '../../layers'; import { ESSearchSource, sourceTitle } from './es_search_source'; @@ -43,7 +42,7 @@ export const esDocumentsLayerWizardConfig: LayerWizard = { }), icon: DocumentsLayerIcon, renderWizard: ({ previewLayers, mapColors }: RenderWizardArguments) => { - const onSourceConfigChange = (sourceConfig: Partial) => { + const onSourceConfigChange = (sourceConfig: Partial | null) => { if (!sourceConfig) { previewLayers([]); return; diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx index 62c05c1e5c563..b99903423376e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx @@ -30,7 +30,6 @@ import { TotalHits, } from '../../../../common/elasticsearch_util'; import { encodeMvtResponseBody } from '../../../../common/mvt_request_body'; -// @ts-expect-error import { UpdateSourceEditor } from './update_source_editor'; import { DEFAULT_MAX_BUCKETS_LIMIT, diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx similarity index 76% rename from x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx index 7addffc286bd0..2c8dca0f1cdf6 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx @@ -5,45 +5,61 @@ * 2.0. */ -import React, { Fragment, Component } from 'react'; -import PropTypes from 'prop-types'; +import React, { ChangeEvent, Component, Fragment } from 'react'; import { EuiFormRow, EuiSelect, EuiTitle, EuiPanel, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { SortDirection, indexPatterns } from '@kbn/data-plugin/public'; +import { DataViewField } from '@kbn/data-views-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; import { getDataViewNotFoundMessage } from '../../../../common/i18n_getters'; -import { FIELD_ORIGIN } from '../../../../common/constants'; +import { FIELD_ORIGIN, SCALING_TYPES } from '../../../../common/constants'; import { SingleFieldSelect } from '../../../components/single_field_select'; import { TooltipSelector } from '../../../components/tooltip_selector'; import { getIndexPatternService } from '../../../kibana_services'; -import { i18n } from '@kbn/i18n'; import { getGeoTileAggNotSupportedReason, getSourceFields, supportsGeoTileAgg, } from '../../../index_pattern_util'; -import { SortDirection, indexPatterns } from '@kbn/data-plugin/public'; import { ESDocField } from '../../fields/es_doc_field'; -import { FormattedMessage } from '@kbn/i18n-react'; - +import { IESSource } from '../es_source'; +import { OnSourceChangeArgs } from '../source'; +import { IField } from '../../fields/field'; import { ScalingForm } from './util/scaling_form'; -export class UpdateSourceEditor extends Component { - static propTypes = { - indexPatternId: PropTypes.string.isRequired, - onChange: PropTypes.func.isRequired, - tooltipFields: PropTypes.arrayOf(PropTypes.object).isRequired, - sortField: PropTypes.string, - sortOrder: PropTypes.string.isRequired, - scalingType: PropTypes.string.isRequired, - source: PropTypes.object, - numberOfJoins: PropTypes.number.isRequired, - }; +interface Props { + indexPatternId: string; + onChange(...args: OnSourceChangeArgs[]): void; + tooltipFields: ESDocField[]; + sortField: string; + sortOrder: SortDirection; + scalingType: SCALING_TYPES; + source: IESSource; + numberOfJoins: number; + getGeoField(): Promise; + filterByMapBounds: boolean; +} + +interface State { + loadError?: string; + sourceFields: IField[] | null; + sortFields: DataViewField[] | undefined; + supportsClustering: boolean; + clusteringDisabledReason: string | null; + supportsMvt: boolean; + mvtDisabledReason: string | null; +} - state = { +export class UpdateSourceEditor extends Component { + _isMounted: boolean = false; + state: State = { sourceFields: null, - sortFields: null, + sortFields: undefined, supportsClustering: false, - mvtDisabledReason: null, clusteringDisabledReason: null, + supportsMvt: true, + mvtDisabledReason: null, }; componentDidMount() { @@ -82,7 +98,7 @@ export class UpdateSourceEditor extends Component { return; } - //todo move this all to the source + // todo move this all to the source const rawTooltipFields = getSourceFields(indexPattern.fields); const sourceFields = rawTooltipFields.map((field) => { return new ESDocField({ @@ -95,22 +111,28 @@ export class UpdateSourceEditor extends Component { this.setState({ supportsClustering: supportsGeoTileAgg(geoField), clusteringDisabledReason: getGeoTileAggNotSupportedReason(geoField), - mvtDisabledReason: null, - sourceFields: sourceFields, + supportsMvt: !geoField.isRuntimeField, + mvtDisabledReason: geoField.isRuntimeField + ? i18n.translate('xpack.maps.source.esSearch.mvtDisableReason', { + defaultMessage: 'Vector tile API does not support runtime {type} field', + values: { type: geoField.type }, + }) + : null, + sourceFields, sortFields: indexPattern.fields.filter( (field) => field.sortable && !indexPatterns.isNestedField(field) - ), //todo change sort fields to use fields + ), // todo change sort fields to use fields }); } - _onTooltipPropertiesChange = (propertyNames) => { + _onTooltipPropertiesChange = (propertyNames: string[]) => { this.props.onChange({ propName: 'tooltipProperties', value: propertyNames }); }; - _onSortFieldChange = (sortField) => { + _onSortFieldChange = (sortField?: string) => { this.props.onChange({ propName: 'sortField', value: sortField }); }; - _onSortOrderChange = (e) => { + _onSortOrderChange = (e: ChangeEvent) => { this.props.onChange({ propName: 'sortOrder', value: e.target.value }); }; @@ -206,6 +228,8 @@ export class UpdateSourceEditor extends Component { scalingType={this.props.scalingType} supportsClustering={this.state.supportsClustering} clusteringDisabledReason={this.state.clusteringDisabledReason} + supportsMvt={this.state.supportsMvt} + mvtDisabledReason={this.state.mvtDisabledReason} numberOfJoins={this.props.numberOfJoins} /> diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/__snapshots__/scaling_form.test.tsx.snap b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/__snapshots__/scaling_form.test.tsx.snap index f8c5951e95e04..0c77be62179c2 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/__snapshots__/scaling_form.test.tsx.snap +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/__snapshots__/scaling_form.test.tsx.snap @@ -34,6 +34,7 @@ exports[`scaling form should disable clusters option when clustering is not supp
{}, scalingType: SCALING_TYPES.LIMIT, supportsClustering: true, + supportsMvt: true, termFields: [], numberOfJoins: 0, }; diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx index ccd3b3913a085..fd0c23a98df45 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx @@ -35,6 +35,8 @@ interface Props { scalingType: SCALING_TYPES; supportsClustering: boolean; clusteringDisabledReason?: string | null; + supportsMvt: boolean; + mvtDisabledReason?: string | null; numberOfJoins: number; } @@ -186,6 +188,26 @@ export class ScalingForm extends Component { ); } + _renderMvtRadio() { + const radio = ( + this._onScalingTypeSelect(SCALING_TYPES.MVT)} + disabled={!this.props.supportsMvt} + /> + ); + + return this.props.mvtDisabledReason ? ( + + {radio} + + ) : ( + radio + ); + } + _renderClusteringRadio() { const clusteringRadio = ( {
- this._onScalingTypeSelect(SCALING_TYPES.MVT)} - /> + {this._renderMvtRadio()} {this._renderClusteringRadio()} ; const { title, description } = attributes; diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_common_state.ts b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_common_state.ts index 2bed3763c70a3..725cc2ba71d63 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_common_state.ts +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_common_state.ts @@ -6,7 +6,7 @@ */ import { BehaviorSubject, Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, map, shareReplay, skipWhile } from 'rxjs/operators'; +import { distinctUntilChanged, map, shareReplay, filter } from 'rxjs/operators'; import { isEqual } from 'lodash'; import type { ExplorerJob } from './explorer_utils'; import type { InfluencersFilterQuery } from '../../../common/types/es_client'; @@ -68,7 +68,7 @@ export class AnomalyExplorerCommonStateService extends StateService { public getSelectedJobs$(): Observable { return this._selectedJobs$.pipe( - skipWhile((v) => !v || !v.length), + filter((v) => Array.isArray(v) && v.length > 0), distinctUntilChanged(isEqual), shareReplay(1) ); diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts index 696e729423a95..1252451f1cee7 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline_state_service.ts @@ -224,7 +224,7 @@ export class AnomalyTimelineStateService extends StateService { switchMap(([selectedJobs, severity, bucketInterval]) => { return from( this.anomalyTimelineService.loadOverallData( - selectedJobs!, + selectedJobs, undefined, bucketInterval!, severity diff --git a/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx b/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx index 40d39fefc1b86..a64625959e1b5 100644 --- a/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx +++ b/x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx @@ -153,8 +153,8 @@ export const ExplorerQueryBar: FC = ({ return ( setErrorMessage(undefined)} + css={{ 'max-width': '100%' }} + closePopover={setErrorMessage.bind(null, undefined)} input={ = ({ - {noInfluencersConfigured === false && - influencers !== undefined && - indexPattern && - updateLanguage ? ( + {indexPattern && updateLanguage ? ( <> = ({ queryString={queryString} updateLanguage={updateLanguage} > + + {noInfluencersConfigured ? ( @@ -618,8 +617,6 @@ export const Explorer: FC = ({ ) : (
- - { cy.contains('Save and deploy changes'); findAndClickButton('Save and deploy changes'); cy.contains(PACK_NAME); + cy.contains(`Successfully created "${PACK_NAME}" pack`); }); it('to click the edit button and edit pack', () => { diff --git a/x-pack/plugins/osquery/public/actions/actions_table.tsx b/x-pack/plugins/osquery/public/actions/actions_table.tsx index 25c35d09e1ba0..9c50bc07c1c34 100644 --- a/x-pack/plugins/osquery/public/actions/actions_table.tsx +++ b/x-pack/plugins/osquery/public/actions/actions_table.tsx @@ -19,10 +19,13 @@ import { import React, { useState, useCallback, useMemo } from 'react'; import { useHistory } from 'react-router-dom'; -import { useAllActions } from './use_all_actions'; +import { useAllLiveQueries } from './use_all_live_queries'; +import type { SearchHit } from '../../common/search_strategy'; import { Direction } from '../../common/search_strategy'; import { useRouterNavigate, useKibana } from '../common/lib/kibana'; +const EMPTY_ARRAY: SearchHit[] = []; + interface ActionTableResultsButtonProps { actionId: string; } @@ -41,7 +44,7 @@ const ActionsTableComponent = () => { const [pageIndex, setPageIndex] = useState(0); const [pageSize, setPageSize] = useState(20); - const { data: actionsData } = useAllActions({ + const { data: actionsData } = useAllLiveQueries({ activePage: pageIndex, limit: pageSize, direction: Direction.desc, @@ -129,7 +132,7 @@ const ActionsTableComponent = () => { [push] ); const isPlayButtonAvailable = useCallback( - () => permissions.runSavedQueries || permissions.writeLiveQueries, + () => !!(permissions.runSavedQueries || permissions.writeLiveQueries), [permissions.runSavedQueries, permissions.writeLiveQueries] ); @@ -199,16 +202,15 @@ const ActionsTableComponent = () => { () => ({ pageIndex, pageSize, - totalItemCount: actionsData?.total ?? 0, + totalItemCount: actionsData?.data?.total ?? 0, pageSizeOptions: [20, 50, 100], }), - [actionsData?.total, pageIndex, pageSize] + [actionsData, pageIndex, pageSize] ); return ( { - const { data } = useKibana().services; - const setErrorToast = useErrorToast(); - - return useQuery( - ['actions', { activePage, direction, limit, sortField }], - async () => { - const responseData = await lastValueFrom( - data.search.search( - { - factoryQueryType: OsqueryQueries.actions, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - sort: { - direction, - field: sortField, - }, - }, - { - strategy: 'osquerySearchStrategy', - } - ) - ); - - return { - ...responseData, - actions: responseData.edges, - inspect: getInspectResponse(responseData, {} as InspectResponse), - }; - }, - { - keepPreviousData: true, - enabled: !skip, - onSuccess: () => setErrorToast(), - onError: (error: Error) => - setErrorToast(error, { - title: i18n.translate('xpack.osquery.all_actions.fetchError', { - defaultMessage: 'Error while fetching actions', - }), - }), - } - ); -}; diff --git a/x-pack/plugins/osquery/public/actions/use_all_live_queries.ts b/x-pack/plugins/osquery/public/actions/use_all_live_queries.ts new file mode 100644 index 0000000000000..f0fb0cd35ead6 --- /dev/null +++ b/x-pack/plugins/osquery/public/actions/use_all_live_queries.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { i18n } from '@kbn/i18n'; +import { createFilter } from '../common/helpers'; +import { useKibana } from '../common/lib/kibana'; +import type { ActionEdges, ActionsStrategyResponse, Direction } from '../../common/search_strategy'; +import type { ESTermQuery } from '../../common/typed_json'; + +import { useErrorToast } from '../common/hooks/use_error_toast'; + +interface UseAllLiveQueries { + activePage: number; + direction: Direction; + limit: number; + sortField: string; + filterQuery?: ESTermQuery | string; + skip?: boolean; +} + +export const useAllLiveQueries = ({ + activePage, + direction, + limit, + sortField, + filterQuery, + skip = false, +}: UseAllLiveQueries) => { + const { http } = useKibana().services; + const setErrorToast = useErrorToast(); + + return useQuery( + ['actions', { activePage, direction, limit, sortField }], + () => + http.get<{ data: Omit & { items: ActionEdges } }>( + '/api/osquery/live_queries', + { + query: { + filterQuery: createFilter(filterQuery), + page: activePage, + pageSize: limit, + sort: sortField, + sortOrder: direction, + }, + } + ), + { + keepPreviousData: true, + enabled: !skip, + onSuccess: () => setErrorToast(), + onError: (error: Error) => + setErrorToast(error, { + title: i18n.translate('xpack.osquery.live_queries_all.fetchError', { + defaultMessage: 'Error while fetching live queries', + }), + }), + } + ); +}; diff --git a/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx b/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx index 8da13f72a077d..ccb3be55d1eea 100644 --- a/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx +++ b/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx @@ -14,18 +14,44 @@ export interface LogsDataView extends DataView { id: string; } -export const useLogsDataView = () => { +interface UseLogsDataView { + skip?: boolean; +} + +export const useLogsDataView = (payload?: UseLogsDataView) => { const dataViews = useKibana().services.data.dataViews; - return useQuery(['logsDataView'], async () => { - let dataView = (await dataViews.find('logs-osquery_manager.result*', 1))[0]; - if (!dataView && dataViews.getCanSaveSync()) { - dataView = await dataViews.createAndSave({ - title: 'logs-osquery_manager.result*', - timeFieldName: '@timestamp', - }); - } + return useQuery( + ['logsDataView'], + async () => { + try { + await dataViews.getFieldsForWildcard({ + pattern: 'logs-osquery_manager.result*', + }); + } catch (e) { + return undefined; + } - return dataView as LogsDataView; - }); + let dataView; + try { + const data = await dataViews.find('logs-osquery_manager.result*', 1); + if (data.length) { + dataView = data[0]; + } + } catch (e) { + if (dataViews.getCanSaveSync()) { + dataView = await dataViews.createAndSave({ + title: 'logs-osquery_manager.result*', + timeFieldName: '@timestamp', + }); + } + } + + return dataView as LogsDataView; + }, + { + enabled: !payload?.skip, + retry: 1, + } + ); }; diff --git a/x-pack/plugins/osquery/public/live_queries/form/index.tsx b/x-pack/plugins/osquery/public/live_queries/form/index.tsx index f7cb1e602dbbb..89ac00720d6f4 100644 --- a/x-pack/plugins/osquery/public/live_queries/form/index.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/index.tsx @@ -17,7 +17,7 @@ import { EuiCard, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import { pickBy, isEmpty, map, find } from 'lodash'; @@ -122,7 +122,14 @@ const LiveQueryFormComponent: React.FC = ({ const handleShowSaveQueryFlyout = useCallback(() => setShowSavedQueryFlyout(true), []); const handleCloseSaveQueryFlyout = useCallback(() => setShowSavedQueryFlyout(false), []); - const { data, isLoading, mutateAsync, isError, isSuccess } = useCreateLiveQuery({ onSuccess }); + const { + data, + isLoading, + mutateAsync, + isError, + isSuccess, + reset: cleanupLiveQuery, + } = useCreateLiveQuery({ onSuccess }); const { data: liveQueryDetails } = useLiveQueryDetails({ actionId: data?.action_id, @@ -271,6 +278,13 @@ const LiveQueryFormComponent: React.FC = ({ [permissions.readSavedQueries, permissions.runSavedQueries] ); + const { data: packsData } = usePacks({}); + + const selectedPackData = useMemo( + () => (packId?.length ? find(packsData?.data, { id: packId[0] }) : null), + [packId, packsData] + ); + const submitButtonContent = useMemo( () => ( @@ -300,7 +314,8 @@ const LiveQueryFormComponent: React.FC = ({ !enabled || !agentSelected || (queryType === 'query' && !queryValueProvided) || - (queryType === 'pack' && !packId) || + (queryType === 'pack' && + (!packId || !selectedPackData?.attributes.queries.length)) || isSubmitting } onClick={submit} @@ -325,6 +340,7 @@ const LiveQueryFormComponent: React.FC = ({ queryType, queryValueProvided, resultsStatus, + selectedPackData, submit, ] ); @@ -426,13 +442,6 @@ const LiveQueryFormComponent: React.FC = ({ } }, [defaultValue, updateFieldValues]); - const { data: packsData } = usePacks({}); - - const selectedPackData = useMemo( - () => (packId?.length ? find(packsData?.data, { id: packId[0] }) : null), - [packId, packsData] - ); - const queryCardSelectable = useMemo( () => ({ onClick: () => setQueryType('query'), @@ -452,11 +461,12 @@ const LiveQueryFormComponent: React.FC = ({ ); const canRunPacks = useMemo( - () => !!(permissions.runSavedQueries && permissions.readPacks), + () => + !!((permissions.runSavedQueries || permissions.writeLiveQueries) && permissions.readPacks), [permissions] ); - useLayoutEffect(() => { + useEffect(() => { if (defaultValue?.packId) { setQueryType('pack'); const selectedPackOption = find(packsData?.data, ['id', defaultValue.packId]); @@ -468,10 +478,12 @@ const LiveQueryFormComponent: React.FC = ({ } }, [defaultValue, packsData, updateFieldValues]); - useLayoutEffect(() => { + useEffect(() => { setIsLive(() => !(liveQueryDetails?.status === 'completed')); }, [liveQueryDetails?.status]); + useEffect(() => cleanupLiveQuery(), [queryType, packId, cleanupLiveQuery]); + return ( <>
@@ -544,18 +556,19 @@ const LiveQueryFormComponent: React.FC = ({ {submitButtonContent} - {(liveQueryDetails?.queries?.length || - selectedPackData?.attributes?.queries?.length) && ( + {liveQueryDetails?.queries?.length || + selectedPackData?.attributes?.queries?.length ? ( <> - )} + ) : null} ) : ( <> diff --git a/x-pack/plugins/osquery/public/live_queries/form/pack_queries_status_table.tsx b/x-pack/plugins/osquery/public/live_queries/form/pack_queries_status_table.tsx index eb687303588eb..1b49abf2cbdcf 100644 --- a/x-pack/plugins/osquery/public/live_queries/form/pack_queries_status_table.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/pack_queries_status_table.tsx @@ -6,7 +6,8 @@ */ import { get } from 'lodash'; -import React, { useCallback, useEffect, useLayoutEffect, useState, useMemo } from 'react'; +import type { ReactElement } from 'react'; +import React, { useCallback, useEffect, useState, useMemo } from 'react'; import { EuiBasicTable, EuiButtonEmpty, @@ -42,6 +43,16 @@ import type { PackItem } from '../../packs/types'; import type { LogsDataView } from '../../common/hooks/use_logs_data_view'; import { useLogsDataView } from '../../common/hooks/use_logs_data_view'; +const TruncateTooltipText = styled.div` + width: 100%; + + > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +`; + const EMPTY_ARRAY: PackQueryStatusItem[] = []; // @ts-expect-error TS2769 @@ -224,7 +235,7 @@ const ViewResultsInLensActionComponent: React.FC { const lensService = useKibana().services.lens; const isLensAvailable = lensService?.canUseEditor(); - const { data: logsDataView } = useLogsDataView(); + const { data: logsDataView } = useLogsDataView({ skip: !actionId }); const handleClick = useCallback( (event) => { @@ -290,7 +301,7 @@ const ViewResultsInDiscoverActionComponent: React.FC(''); @@ -519,16 +530,30 @@ interface PackQueriesStatusTableProps { data?: PackQueryStatusItem[]; startDate?: string; expirationDate?: string; + addToTimeline?: (payload: { query: [string, string]; isIcon?: true }) => ReactElement; } const PackQueriesStatusTableComponent: React.FC = ({ + actionId, agentIds, data, startDate, expirationDate, + addToTimeline, }) => { const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState>({}); + const renderIDColumn = useCallback( + (id: string) => ( + + + <>{id} + + + ), + [] + ); + const renderQueryColumn = useCallback((query: string, item) => { const singleLine = removeMultilines(query); const content = singleLine.length > 55 ? `${singleLine.substring(0, 55)}...` : singleLine; @@ -588,6 +613,7 @@ const PackQueriesStatusTableComponent: React.FC = ( endDate={expirationDate} agentIds={agentIds} failedAgentsCount={item?.failed ?? 0} + addToTimeline={addToTimeline} /> @@ -597,12 +623,12 @@ const PackQueriesStatusTableComponent: React.FC = ( return itemIdToExpandedRowMapValues; }); }, - [agentIds, expirationDate, startDate] + [agentIds, expirationDate, startDate, addToTimeline] ); const renderToggleResultsAction = useCallback( (item) => - item?.action_id ? ( + item?.action_id && data?.length && data.length > 1 ? ( = ( ) : ( <> ), - [getHandleErrorsToggle, itemIdToExpandedRowMap] + [data, getHandleErrorsToggle, itemIdToExpandedRowMap] ); const getItemId = useCallback((item: PackItem) => get(item, 'id'), []); @@ -624,7 +650,7 @@ const PackQueriesStatusTableComponent: React.FC = ( defaultMessage: 'ID', }), width: '15%', - truncateText: true, + render: renderIDColumn, }, { field: 'query', @@ -638,12 +664,14 @@ const PackQueriesStatusTableComponent: React.FC = ( name: i18n.translate('xpack.osquery.pack.queriesTable.docsResultsColumnTitle', { defaultMessage: 'Docs', }), + width: '80px', render: renderDocsColumn, }, { name: i18n.translate('xpack.osquery.pack.queriesTable.agentsResultsColumnTitle', { defaultMessage: 'Agents', }), + width: '160px', render: renderAgentsColumn, }, { @@ -673,6 +701,7 @@ const PackQueriesStatusTableComponent: React.FC = ( }, ], [ + renderIDColumn, renderQueryColumn, renderDocsColumn, renderAgentsColumn, @@ -692,7 +721,12 @@ const PackQueriesStatusTableComponent: React.FC = ( [] ); - useLayoutEffect(() => { + useEffect(() => { + // reset the expanded row map when the data changes + setItemIdToExpandedRowMap({}); + }, [actionId]); + + useEffect(() => { if ( data?.length === 1 && agentIds?.length && diff --git a/x-pack/plugins/osquery/public/live_queries/form/packs_combobox_field.tsx b/x-pack/plugins/osquery/public/live_queries/form/packs_combobox_field.tsx index 41b0bdc919993..e9cf7fa6f9e85 100644 --- a/x-pack/plugins/osquery/public/live_queries/form/packs_combobox_field.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/packs_combobox_field.tsx @@ -64,6 +64,7 @@ export const PacksComboBoxField = ({ field, euiFieldProps = {}, idAria, ...rest (newSelectedOptions) => { if (!newSelectedOptions.length) { setSelectedOptions(newSelectedOptions); + field.setValue([]); return; } diff --git a/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx b/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx index c09c5385478c4..c698db405add4 100644 --- a/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx +++ b/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx @@ -211,7 +211,7 @@ const ViewResultsInLensActionComponent: React.FC { const lensService = useKibana().services.lens; const isLensAvailable = lensService?.canUseEditor(); - const { data: logsDataView } = useLogsDataView(); + const { data: logsDataView } = useLogsDataView({ skip: !actionId }); const handleClick = useCallback( (event) => { @@ -274,7 +274,7 @@ const ViewResultsInDiscoverActionComponent: React.FC(''); diff --git a/x-pack/plugins/osquery/public/packs/packs_table.tsx b/x-pack/plugins/osquery/public/packs/packs_table.tsx index 6a62d0945d517..77fdf4569e85d 100644 --- a/x-pack/plugins/osquery/public/packs/packs_table.tsx +++ b/x-pack/plugins/osquery/public/packs/packs_table.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import type { EuiBasicTableColumn } from '@elastic/eui'; +import type { EuiBasicTableColumn, EuiTableActionsColumnType } from '@elastic/eui'; +import { EuiButtonIcon } from '@elastic/eui'; import { EuiButtonEmpty, EuiText, @@ -20,7 +21,8 @@ import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; -import { useRouterNavigate } from '../common/lib/kibana'; +import { useHistory } from 'react-router-dom'; +import { useKibana, useRouterNavigate } from '../common/lib/kibana'; import { usePacks } from './use_packs'; import { ActiveStateSwitch } from './active_state_switch'; import { AgentsPolicyLink } from '../agent_policies/agents_policy_link'; @@ -85,6 +87,8 @@ export const AgentPoliciesPopover = ({ agentPolicyIds = [] }: { agentPolicyIds?: }; const PacksTableComponent = () => { + const permissions = useKibana().services.application.capabilities.osquery; + const { push } = useHistory(); const { data, isLoading } = usePacks({}); const renderAgentPolicy = useCallback( @@ -116,6 +120,23 @@ const PacksTableComponent = () => { ); }, []); + const handlePlayClick = useCallback<(item: PackSavedObject) => () => void>( + (item) => () => + push('/live_queries/new', { + form: { + packId: item.id, + }, + }), + [push] + ); + + const renderPlayAction = useCallback( + (item, enabled) => ( + + ), + [handlePlayClick] + ); + const columns: Array> = useMemo( () => [ { @@ -167,8 +188,28 @@ const PacksTableComponent = () => { width: '80px', render: renderActive, }, + { + name: i18n.translate('xpack.osquery.pack.queriesTable.actionsColumnTitle', { + defaultMessage: 'Actions', + }), + width: '80px', + actions: [ + { + render: renderPlayAction, + enabled: () => permissions.writeLiveQueries || permissions.runSavedQueries, + }, + ], + } as EuiTableActionsColumnType, ], - [renderActive, renderAgentPolicy, renderQueries, renderUpdatedAt] + [ + permissions.runSavedQueries, + permissions.writeLiveQueries, + renderActive, + renderAgentPolicy, + renderPlayAction, + renderQueries, + renderUpdatedAt, + ] ); const sorting = useMemo( diff --git a/x-pack/plugins/osquery/public/packs/use_create_pack.ts b/x-pack/plugins/osquery/public/packs/use_create_pack.ts index 3dcd7bfc11201..b536f50075a86 100644 --- a/x-pack/plugins/osquery/public/packs/use_create_pack.ts +++ b/x-pack/plugins/osquery/public/packs/use_create_pack.ts @@ -28,7 +28,11 @@ export const useCreatePack = ({ withRedirect }: UseCreatePackProps) => { } = useKibana().services; const setErrorToast = useErrorToast(); - return useMutation( + return useMutation< + { data: PackSavedObject }, + { body: { error: string; message: string } }, + PackSavedObject + >( (payload) => http.post('/api/osquery/packs', { body: JSON.stringify(payload), @@ -47,7 +51,7 @@ export const useCreatePack = ({ withRedirect }: UseCreatePackProps) => { i18n.translate('xpack.osquery.newPack.successToastMessageText', { defaultMessage: 'Successfully created "{packName}" pack', values: { - packName: payload.attributes?.name ?? '', + packName: payload.data.attributes?.name ?? '', }, }) ); diff --git a/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts b/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts index dd31356171aed..1e57af58c46b4 100644 --- a/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts +++ b/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts @@ -26,7 +26,7 @@ export const usePackQueryErrors = ({ skip = false, }: UsePackQueryErrorsProps) => { const data = useKibana().services.data; - const { data: logsDataView } = useLogsDataView(); + const { data: logsDataView } = useLogsDataView({ skip }); return useQuery( ['scheduledQueryErrors', { actionId, interval }], diff --git a/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts b/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts index 5dd8746898e24..28b474530f4bc 100644 --- a/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts +++ b/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts @@ -29,7 +29,7 @@ export const usePackQueryLastResults = ({ skip = false, }: UsePackQueryLastResultsProps) => { const data = useKibana().services.data; - const { data: logsDataView } = useLogsDataView(); + const { data: logsDataView } = useLogsDataView({ skip }); return useQuery( ['scheduledQueryLastResults', { actionId }], diff --git a/x-pack/plugins/osquery/public/routes/live_queries/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/index.tsx index 5096a22e85ba1..9eefba4cb67a2 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/index.tsx @@ -27,7 +27,7 @@ const LiveQueriesComponent = () => { return ( - {(permissions.runSavedQueries && permissions.readSavedQueries) || + {(permissions.runSavedQueries && (permissions.readSavedQueries || permissions.readPacks)) || permissions.writeLiveQueries ? ( ) : ( diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx index 094d1380eb30c..c8e57f4f5db23 100644 --- a/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx +++ b/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx @@ -7,6 +7,7 @@ import { EuiTabbedContent, EuiNotificationBadge } from '@elastic/eui'; import React, { useMemo } from 'react'; +import type { ReactElement } from 'react'; import { ResultsTable } from '../../../results/results_table'; import { ActionResultsSummary } from '../../../action_results/action_results_summary'; @@ -18,7 +19,7 @@ interface ResultTabsProps { ecsMapping?: Record; failedAgentsCount?: number; endDate?: string; - addToTimeline?: (payload: { query: [string, string]; isIcon?: true }) => React.ReactElement; + addToTimeline?: (payload: { query: [string, string]; isIcon?: true }) => ReactElement; } const ResultTabsComponent: React.FC = ({ diff --git a/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts b/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts index 5f63a3f615c9e..edd32ab645e56 100644 --- a/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts +++ b/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts @@ -6,7 +6,7 @@ */ import moment from 'moment-timezone'; -import { filter, omit } from 'lodash'; +import { filter, omit, some } from 'lodash'; import { schema } from '@kbn/config-schema'; import { asyncForEach } from '@kbn/std'; import deepmerge from 'deepmerge'; @@ -102,9 +102,14 @@ export const updateAssetsRoute = (router: IRouter, osqueryContext: OsqueryAppCon filter: `${packSavedObjectType}.attributes.name: "${packAssetSavedObject.attributes.name}"`, }); - const name = conflictingEntries.saved_objects.length - ? `${packAssetSavedObject.attributes.name}-elastic` - : packAssetSavedObject.attributes.name; + const name = + conflictingEntries.saved_objects.length && + some(conflictingEntries.saved_objects, [ + 'attributes.name', + packAssetSavedObject.attributes.name, + ]) + ? `${packAssetSavedObject.attributes.name}-elastic` + : packAssetSavedObject.attributes.name; await savedObjectsClient.create( packSavedObjectType, diff --git a/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts b/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts index 07f9b31270822..52741eb692b4c 100644 --- a/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts @@ -51,7 +51,10 @@ export const createLiveQueryRoute = (router: IRouter, osqueryContext: OsqueryApp osquery: { writeLiveQueries, runSavedQueries }, } = await coreStartServices.capabilities.resolveCapabilities(request); - const isInvalid = !(writeLiveQueries || (runSavedQueries && request.body.saved_query_id)); + const isInvalid = !( + writeLiveQueries || + (runSavedQueries && (request.body.saved_query_id || request.body.pack_id)) + ); if (isInvalid) { return response.forbidden(); diff --git a/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts b/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts new file mode 100644 index 0000000000000..5186de9ce67be --- /dev/null +++ b/x-pack/plugins/osquery/server/routes/live_query/find_live_query_route.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import type { IRouter } from '@kbn/core/server'; +import { omit } from 'lodash'; +import type { Observable } from 'rxjs'; +import { lastValueFrom } from 'rxjs'; +import type { DataRequestHandlerContext } from '@kbn/data-plugin/server'; +import { PLUGIN_ID } from '../../../common'; + +import type { + ActionsRequestOptions, + ActionsStrategyResponse, + Direction, +} from '../../../common/search_strategy'; +import { OsqueryQueries } from '../../../common/search_strategy'; +import { createFilter, generateTablePaginationOptions } from '../../../common/utils/build_query'; + +export const findLiveQueryRoute = (router: IRouter) => { + router.get( + { + path: '/api/osquery/live_queries', + validate: { + query: schema.object( + { + filterQuery: schema.maybe(schema.string()), + page: schema.maybe(schema.number()), + pageSize: schema.maybe(schema.number()), + sort: schema.maybe(schema.string()), + sortOrder: schema.maybe(schema.oneOf([schema.literal('asc'), schema.literal('desc')])), + }, + { unknowns: 'allow' } + ), + }, + options: { tags: [`access:${PLUGIN_ID}-read`] }, + }, + async (context, request, response) => { + const abortSignal = getRequestAbortedSignal(request.events.aborted$); + + try { + const search = await context.search; + const res = await lastValueFrom( + search.search( + { + factoryQueryType: OsqueryQueries.actions, + filterQuery: createFilter(request.query.filterQuery), + pagination: generateTablePaginationOptions( + request.query.page ?? 0, + request.query.pageSize ?? 100 + ), + sort: { + direction: (request.query.sortOrder ?? 'desc') as Direction, + field: request.query.sort ?? 'created_at', + }, + }, + { abortSignal, strategy: 'osquerySearchStrategy' } + ) + ); + + return response.ok({ + body: { + data: { + ...omit(res, 'edges'), + items: res.edges, + }, + }, + }); + } catch (e) { + return response.customError({ + statusCode: e.statusCode ?? 500, + body: { + message: e.message, + }, + }); + } + } + ); +}; + +function getRequestAbortedSignal(aborted$: Observable): AbortSignal { + const controller = new AbortController(); + aborted$.subscribe(() => controller.abort()); + + return controller.signal; +} diff --git a/x-pack/plugins/osquery/server/routes/live_query/get_live_query_results_route.ts b/x-pack/plugins/osquery/server/routes/live_query/get_live_query_results_route.ts index 7fefcd40e9c68..c47772bbc7039 100644 --- a/x-pack/plugins/osquery/server/routes/live_query/get_live_query_results_route.ts +++ b/x-pack/plugins/osquery/server/routes/live_query/get_live_query_results_route.ts @@ -28,10 +28,10 @@ export const getLiveQueryResultsRoute = (router: IRouter, context: OsqueryAppContext ) => { + findLiveQueryRoute(router); createLiveQueryRoute(router, context); getLiveQueryDetailsRoute(router); getLiveQueryResultsRoute(router); diff --git a/x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts b/x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts index dc13fda223da9..ed1ffbcbccd7a 100644 --- a/x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts +++ b/x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts @@ -6,7 +6,7 @@ */ import moment from 'moment-timezone'; -import { has, mapKeys, set, unset, find } from 'lodash'; +import { has, mapKeys, set, unset, find, some } from 'lodash'; import { schema } from '@kbn/config-schema'; import { produce } from 'immer'; import type { PackagePolicy } from '@kbn/fleet-plugin/common'; @@ -80,7 +80,10 @@ export const createPackRoute = (router: IRouter, osqueryContext: OsqueryAppConte filter: `${packSavedObjectType}.attributes.name: "${name}"`, }); - if (conflictingEntries.saved_objects.length) { + if ( + conflictingEntries.saved_objects.length && + some(conflictingEntries.saved_objects, ['attributes.name', name]) + ) { return response.conflict({ body: `Pack with name "${name}" already exists.` }); } diff --git a/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts b/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts index 0da8012eb4fc0..ea7e22f3ca9aa 100644 --- a/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts +++ b/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts @@ -6,7 +6,7 @@ */ import moment from 'moment-timezone'; -import { set, unset, has, difference, filter, find, map, mapKeys, uniq } from 'lodash'; +import { set, unset, has, difference, filter, find, map, mapKeys, uniq, some } from 'lodash'; import { schema } from '@kbn/config-schema'; import { produce } from 'immer'; import type { PackagePolicy } from '@kbn/fleet-plugin/common'; @@ -95,11 +95,10 @@ export const updatePackRoute = (router: IRouter, osqueryContext: OsqueryAppConte }); if ( - filter( - conflictingEntries.saved_objects, - (packSO) => - packSO.id !== currentPackSO.id && packSO.attributes.name.length === name.length - ).length + some( + filter(conflictingEntries.saved_objects, (packSO) => packSO.id !== currentPackSO.id), + ['attributes.name', name] + ) ) { return response.conflict({ body: `Pack with name "${name}" already exists.` }); } diff --git a/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts index d3cb415988345..8ee9cef33477f 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { isEmpty, pickBy } from 'lodash'; +import { isEmpty, pickBy, some } from 'lodash'; import type { IRouter } from '@kbn/core/server'; import { PLUGIN_ID } from '../../../common'; import type { CreateSavedQueryRequestSchemaDecoded } from '../../../common/schemas/routes/saved_query/create_saved_query_request_schema'; @@ -41,7 +41,10 @@ export const createSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAp filter: `${savedQuerySavedObjectType}.attributes.id: "${id}"`, }); - if (conflictingEntries.saved_objects.length) { + if ( + conflictingEntries.saved_objects.length && + some(conflictingEntries.saved_objects, ['attributes.id', id]) + ) { return response.conflict({ body: `Saved query with id "${id}" already exists.` }); } diff --git a/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts index 7b6ab0f2a897d..8f8af10e79760 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { filter } from 'lodash'; +import { filter, some } from 'lodash'; import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core/server'; @@ -76,8 +76,10 @@ export const updateSavedQueryRoute = (router: IRouter, osqueryContext: OsqueryAp }); if ( - filter(conflictingEntries.saved_objects, (soObject) => soObject.id !== request.params.id) - .length + some( + filter(conflictingEntries.saved_objects, (soObject) => soObject.id !== request.params.id), + ['attributes.id', id] + ) ) { return response.conflict({ body: `Saved query with id "${id}" already exists.` }); } diff --git a/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts b/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts index bdfc8455aca2c..c11b1fe85da57 100644 --- a/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts +++ b/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts @@ -989,5 +989,89 @@ describe('UserProfileService', () => { kibana: ['privilege-1', 'privilege-2'], }); }); + + it('properly handles privileges checks when privileges have to be checked in multiple steps and user requested less users than have required privileges', async () => { + // In this test we'd like to simulate the following case: + // 1. User requests 2 results with privileges check + // 2. Kibana will fetch 10 (min batch) results + // 3. Only UID-0, UID-1 and UID-8 profiles will have necessary privileges + mockStartParams.clusterClient.asInternalUser.security.suggestUserProfiles.mockResolvedValue({ + profiles: Array.from({ length: 10 }).map((_, index) => + userProfileMock.createWithSecurity({ + uid: `UID-${index}`, + data: { some: 'data', kibana: { some: `kibana-data-${index}` } }, + }) + ), + } as unknown as SecuritySuggestUserProfilesResponse); + + const mockAtSpacePrivilegeCheck = { atSpace: jest.fn() }; + mockAtSpacePrivilegeCheck.atSpace.mockResolvedValue({ + hasPrivilegeUids: ['UID-0', 'UID-1', 'UID-8'], + errorUids: [], + }); + mockAuthz.checkUserProfilesPrivileges.mockReturnValue(mockAtSpacePrivilegeCheck); + + const startContract = userProfileService.start(mockStartParams); + await expect( + startContract.suggest({ + name: 'some', + size: 2, + dataPath: '*', + requiredPrivileges: { + spaceId: 'some-space', + privileges: { kibana: ['privilege-1', 'privilege-2'] }, + }, + }) + ).resolves.toMatchInlineSnapshot(` + Array [ + Object { + "data": Object { + "some": "kibana-data-0", + }, + "enabled": true, + "uid": "UID-0", + "user": Object { + "display_name": undefined, + "email": "some@email", + "full_name": undefined, + "username": "some-username", + }, + }, + Object { + "data": Object { + "some": "kibana-data-1", + }, + "enabled": true, + "uid": "UID-1", + "user": Object { + "display_name": undefined, + "email": "some@email", + "full_name": undefined, + "username": "some-username", + }, + }, + ] + `); + expect( + mockStartParams.clusterClient.asInternalUser.security.suggestUserProfiles + ).toHaveBeenCalledTimes(1); + expect( + mockStartParams.clusterClient.asInternalUser.security.suggestUserProfiles + ).toHaveBeenCalledWith({ + name: 'some', + size: 10, + data: 'kibana.*', + }); + + expect(mockAuthz.checkUserProfilesPrivileges).toHaveBeenCalledTimes(1); + expect(mockAuthz.checkUserProfilesPrivileges).toHaveBeenCalledWith( + new Set(Array.from({ length: 10 }).map((_, index) => `UID-${index}`)) + ); + + expect(mockAtSpacePrivilegeCheck.atSpace).toHaveBeenCalledTimes(1); + expect(mockAtSpacePrivilegeCheck.atSpace).toHaveBeenCalledWith('some-space', { + kibana: ['privilege-1', 'privilege-2'], + }); + }); }); }); diff --git a/x-pack/plugins/security/server/user_profile/user_profile_service.ts b/x-pack/plugins/security/server/user_profile/user_profile_service.ts index a5880be9c1cdb..aa8174ef24095 100644 --- a/x-pack/plugins/security/server/user_profile/user_profile_service.ts +++ b/x-pack/plugins/security/server/user_profile/user_profile_service.ts @@ -489,7 +489,9 @@ export class UserProfileService { const unknownUids = []; for (const profileUid of response.hasPrivilegeUids) { const filteredProfile = profilesBatch.get(profileUid); - if (filteredProfile) { + // We check privileges in batches and the batch can have more users than requested. We ignore "excessive" users, + // but still iterate through entire batch to collect and report all unknown uids. + if (filteredProfile && filteredProfiles.length < requiredSize) { filteredProfiles.push(filteredProfile); } else { unknownUids.push(profileUid); diff --git a/x-pack/plugins/security_solution/common/search_strategy/common/index.ts b/x-pack/plugins/security_solution/common/search_strategy/common/index.ts index 87165a1277708..d8ef64fe1b5a4 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/common/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/common/index.ts @@ -55,6 +55,7 @@ export interface Hits { export interface GenericBuckets { key: string; + key_as_string?: string; // contains, for example, formatted dates doc_count: number; } diff --git a/x-pack/plugins/security_solution/common/utils/field_formatters.ts b/x-pack/plugins/security_solution/common/utils/field_formatters.ts index 635a82004516d..65fc3871c7fc3 100644 --- a/x-pack/plugins/security_solution/common/utils/field_formatters.ts +++ b/x-pack/plugins/security_solution/common/utils/field_formatters.ts @@ -9,6 +9,7 @@ import { ecsFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/ import { experimentalRuleFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/experimental_rule_field_map'; import { technicalRuleFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/technical_rule_field_map'; import { isEmpty } from 'lodash/fp'; +import { ENRICHMENT_DESTINATION_PATH } from '../constants'; import type { EventHit, TimelineEventsDetailsItem } from '../search_strategy'; import { toObjectArrayOfStrings, toStringArray } from './to_array'; @@ -41,6 +42,9 @@ export const formatGeoLocation = (item: unknown[]) => { export const isGeoField = (field: string) => field.includes('geo.location') || field.includes('geoip.location'); +export const isThreatEnrichmentFieldOrSubfield = (field: string, prependField?: string) => + prependField?.includes(ENRICHMENT_DESTINATION_PATH) || field === ENRICHMENT_DESTINATION_PATH; + export const getDataFromFieldsHits = ( fields: EventHit['fields'], prependField?: string, @@ -88,6 +92,18 @@ export const getDataFromFieldsHits = ( ]; } + const threatEnrichmentObject = isThreatEnrichmentFieldOrSubfield(field, prependField) + ? [ + { + category: fieldCategory, + field: dotField, + values: strArr, + originalValue: strArr, + isObjectArray, + }, + ] + : []; + // format nested fields const nestedFields = Array.isArray(item) ? item @@ -99,6 +115,7 @@ export const getDataFromFieldsHits = ( const flat: Record = [ ...accumulator, ...nestedFields, + ...threatEnrichmentObject, ].reduce( (acc, f) => ({ ...acc, diff --git a/x-pack/plugins/security_solution/cypress/cypress.json b/x-pack/plugins/security_solution/cypress/cypress.json index 55206c918ba1c..ab350ecad739f 100644 --- a/x-pack/plugins/security_solution/cypress/cypress.json +++ b/x-pack/plugins/security_solution/cypress/cypress.json @@ -1,21 +1,12 @@ { - "baseUrl": "http://localhost:5601", - "defaultCommandTimeout": 120000, - "execTimeout": 120000, - "pageLoadTimeout": 120000, + "defaultCommandTimeout": 20000, + "execTimeout": 20000, + "pageLoadTimeout": 20000, "nodeVersion": "system", - "retries": { - "runMode": 2 - }, "screenshotsFolder": "../../../target/kibana-security-solution/cypress/screenshots", "trashAssetsBeforeRuns": false, "video": false, "videosFolder": "../../../target/kibana-security-solution/cypress/videos", "viewportHeight": 946, - "viewportWidth": 1680, - "env": { - "protocol": "http", - "hostname": "localhost", - "configport": "5601" - } + "viewportWidth": 1680 } diff --git a/x-pack/plugins/security_solution/cypress/cypress_ci.json b/x-pack/plugins/security_solution/cypress/cypress_ci.json new file mode 100644 index 0000000000000..36ba5eb10b26c --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/cypress_ci.json @@ -0,0 +1,16 @@ +{ + "defaultCommandTimeout": 120000, + "execTimeout": 120000, + "pageLoadTimeout": 120000, + "nodeVersion": "system", + "numTestsKeptInMemory": 0, + "retries": { + "runMode": 2 + }, + "screenshotsFolder": "../../../target/kibana-security-solution/cypress/screenshots", + "trashAssetsBeforeRuns": false, + "video": false, + "videosFolder": "../../../target/kibana-security-solution/cypress/videos", + "viewportHeight": 946, + "viewportWidth": 1680 +} diff --git a/x-pack/plugins/security_solution/package.json b/x-pack/plugins/security_solution/package.json index 8853cb9aa582c..92a934f2dd674 100644 --- a/x-pack/plugins/security_solution/package.json +++ b/x-pack/plugins/security_solution/package.json @@ -16,7 +16,7 @@ "cypress:run:spec": "yarn cypress:run:reporter --browser chrome --spec ${SPEC_LIST:-'./cypress/integration/**/*.spec.ts'}; status=$?; yarn junit:merge && exit $status", "cypress:run:cases": "yarn cypress:run:reporter --browser chrome --spec './cypress/integration/cases/*.spec.ts'; status=$?; yarn junit:merge && exit $status", "cypress:run:firefox": "yarn cypress:run:reporter --browser firefox --spec './cypress/integration/**/*.spec.ts'; status=$?; yarn junit:merge && exit $status", - "cypress:run:reporter": "yarn cypress run --config-file ./cypress/cypress.json --reporter ../../../node_modules/cypress-multi-reporters --reporter-options configFile=./cypress/reporter_config.json", + "cypress:run:reporter": "yarn cypress run --config-file ./cypress/cypress_ci.json --reporter ../../../node_modules/cypress-multi-reporters --reporter-options configFile=./cypress/reporter_config.json", "cypress:run:respops": "yarn cypress:run:reporter --browser chrome --spec ./cypress/integration/detection_alerts/*.spec.ts,./cypress/integration/detection_rules/*.spec.ts,./cypress/integration/exceptions/*.spec.ts; status=$?; yarn junit:merge && exit $status", "cypress:run:ccs": "yarn cypress:run:reporter --browser chrome --config integrationFolder=./cypress/ccs_integration; status=$?; yarn junit:merge && exit $status", "cypress:run-as-ci": "node --max-old-space-size=2048 ../../../scripts/functional_tests --config ../../test/security_solution_cypress/cli_config_parallel.ts", diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.test.tsx index aeb96c3a7239d..8f53a3f226ce6 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.test.tsx @@ -6,12 +6,15 @@ */ import { render, screen } from '@testing-library/react'; +import { Settings } from '@elastic/charts'; import React from 'react'; import { TestProviders } from '../../mock'; import { mockAlertSearchResponse, mockNoDataAlertSearchResponse, + mockNoStackByField1Response, + mockOnlyStackByField0Response, } from './lib/mocks/mock_alert_search_response'; import * as i18n from './translations'; import type { Props } from '.'; @@ -25,9 +28,19 @@ const defaultProps: Props = { stackByField1: 'host.name', }; +jest.mock('@elastic/charts', () => { + const actual = jest.requireActual('@elastic/charts'); + return { + ...actual, + Settings: jest.fn().mockReturnValue(null), + }; +}); + describe('AlertsTreemap', () => { describe('when the response has data', () => { beforeEach(() => { + jest.clearAllMocks(); + render( @@ -42,6 +55,10 @@ describe('AlertsTreemap', () => { test('it renders the legend with the expected overflow-y style', () => { expect(screen.getByTestId('draggable-legend')).toHaveClass('eui-yScroll'); }); + + test('it uses a theme with the expected `minFontSize` to show more labels at various screen resolutions', () => { + expect((Settings as jest.Mock).mock.calls[0][0].theme[0].partition.minFontSize).toEqual(4); + }); }); describe('when the response does NOT have data', () => { @@ -65,4 +82,64 @@ describe('AlertsTreemap', () => { expect(screen.getByText(i18n.NO_DATA_LABEL)).toBeInTheDocument(); }); }); + + describe('when the user has specified a `stackByField1`, and the response has data for `stackByField0`, but `stackByField1` is not present in the response', () => { + const stackByField1 = 'Ransomware.version'; // this non-ECS field is requested + + beforeEach(() => { + render( + + + + ); + }); + + test('it renders the "no data" message', () => { + expect(screen.getByText(i18n.NO_DATA_LABEL)).toBeInTheDocument(); + }); + + test('it renders an additional reason label with the `stackByField1` field', () => { + expect(screen.getByText(i18n.NO_DATA_REASON_LABEL(stackByField1))).toBeInTheDocument(); + }); + + test('it still renders the legend, because we have values for stackByField0', () => { + expect(screen.getByTestId('draggable-legend')).toBeInTheDocument(); + }); + }); + + describe('when the user has NOT specified a `stackByField1`, and the response has data for `stackByField0`', () => { + const stackByField1 = ''; // the user has NOT specified a `stackByField1` + + beforeEach(() => { + render( + + + + ); + }); + + test('it renders the treemap', () => { + expect(screen.getByTestId('treemap').querySelector('.echChart')).toBeInTheDocument(); + }); + + test('it does NOT render the "no data" message', () => { + expect(screen.queryByText(i18n.NO_DATA_LABEL)).not.toBeInTheDocument(); + }); + + test('it does NOT render an additional reason label with the `stackByField1` field, which was not requested', () => { + expect(screen.queryByText(i18n.NO_DATA_REASON_LABEL(stackByField1))).not.toBeInTheDocument(); + }); + + test('it renders the legend, because we have values for stackByField0', () => { + expect(screen.getByTestId('draggable-legend')).toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.tsx index 143b702cfb71b..fc6edda0c90b9 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/index.tsx @@ -28,6 +28,7 @@ import { import { getLayersMultiDimensional, getLayersOneDimension } from './lib/layers'; import { getFirstGroupLegendItems } from './lib/legend'; import { NoData } from './no_data'; +import { NO_DATA_REASON_LABEL } from './translations'; import type { AlertsTreeMapAggregation, FlattenedBucket, RawBucket } from './types'; export const DEFAULT_MIN_CHART_HEIGHT = 370; // px @@ -68,7 +69,7 @@ const AlertsTreemapComponent: React.FC = ({ fillLabel: { valueFont: { fontWeight: 700 } }, idealFontSizeJump: 1.15, maxFontSize: 16, - minFontSize: 8, + minFontSize: 4, sectorLineStroke: fillColor, // draws the light or dark "lines" between partitions sectorLineWidth: 1.5, }, @@ -167,21 +168,25 @@ const AlertsTreemapComponent: React.FC = ({
- - - - + {stackByField1 != null && !isEmpty(stackByField1) && normalizedData.length === 0 ? ( + + ) : ( + + + + + )} diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.test.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.test.ts index 141d73c923bb8..763ecc4e3df60 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.test.ts @@ -11,6 +11,7 @@ import { bucketsWithoutStackByField1, maxRiskSubAggregations, } from './mocks/mock_buckets'; +import type { RawBucket } from '../../types'; describe('flattenBucket', () => { it(`returns the expected flattened buckets when stackByField1 has buckets`, () => { @@ -46,6 +47,63 @@ describe('flattenBucket', () => { ]); }); + it(`it prefers to populate 'key' using the RawBucket's 'key_as_string' when available, because it contains formatted dates`, () => { + const bucketWithOptionalKeyAsString: RawBucket = { + key: '1658955590866', + key_as_string: '2022-07-27T20:59:50.866Z', // <-- should be preferred over `key` when present + doc_count: 1, + maxRiskSubAggregation: { value: 21 }, + stackByField1: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: 'Host-vmdx1cnu3m', doc_count: 1 }], + }, + }; + + expect( + flattenBucket({ bucket: bucketWithOptionalKeyAsString, maxRiskSubAggregations }) + ).toEqual([ + { + doc_count: 1, + key: bucketWithOptionalKeyAsString.key_as_string, // <-- uses the preferred `key_as_string` + maxRiskSubAggregation: { value: 21 }, + stackByField1DocCount: 1, + stackByField1Key: 'Host-vmdx1cnu3m', + }, + ]); + }); + + it(`it prefers to populate 'stackByField1Key' using the 'stackByField1.buckets[n].key_as_string' when available, because it contains formatted dates`, () => { + const keyAsString = '2022-07-27T09:33:19.329Z'; + + const bucketWithKeyAsString: RawBucket = { + key: 'Threshold rule', + doc_count: 1, + maxRiskSubAggregation: { value: 99 }, + stackByField1: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: '1658914399329', + key_as_string: keyAsString, // <-- should be preferred over `stackByField1.buckets[n].key` when present + doc_count: 1, + }, + ], + }, + }; + + expect(flattenBucket({ bucket: bucketWithKeyAsString, maxRiskSubAggregations })).toEqual([ + { + doc_count: 1, + key: 'Threshold rule', + maxRiskSubAggregation: { value: 99 }, + stackByField1DocCount: 1, + stackByField1Key: keyAsString, // <-- uses the preferred `stackByField1.buckets[n].key_as_string` + }, + ]); + }); + it(`returns an empty array when there's nothing to flatten, because stackByField1 is undefined`, () => { expect( flattenBucket({ bucket: bucketsWithoutStackByField1[0], maxRiskSubAggregations }) diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.ts index aa7966e7f79cd..ef15178cbc256 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/flatten/flatten_bucket.ts @@ -16,8 +16,8 @@ export const flattenBucket = ({ }): FlattenedBucket[] => bucket.stackByField1?.buckets?.map((x) => ({ doc_count: bucket.doc_count, - key: bucket.key, + key: bucket.key_as_string ?? bucket.key, // prefer key_as_string when available, because it contains a formatted date maxRiskSubAggregation: bucket.maxRiskSubAggregation, - stackByField1Key: x.key, + stackByField1Key: x.key_as_string ?? x.key, stackByField1DocCount: x.doc_count, })) ?? []; diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.test.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.test.ts index 514b2743504d4..303cca251f417 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.test.ts @@ -16,12 +16,24 @@ import { getLegendItemFromFlattenedBucket, getLegendMap, } from '.'; -import type { FlattenedBucket } from '../../types'; +import type { FlattenedBucket, RawBucket } from '../../types'; describe('legend', () => { const colorPalette = getRiskScorePalette(RISK_SCORE_STEPS); describe('getLegendItemFromRawBucket', () => { + const bucket: RawBucket = { + key: '1658955590866', + key_as_string: '2022-07-27T20:59:50.866Z', // <-- should be preferred over `key` when present + doc_count: 1, + maxRiskSubAggregation: { value: 21 }, + stackByField1: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [{ key: 'Host-vmdx1cnu3m', doc_count: 1 }], + }, + }; + it('returns an undefined color when showColor is false', () => { expect( getLegendItemFromRawBucket({ @@ -70,6 +82,30 @@ describe('legend', () => { ).toContain('draggable-legend-item-treemap-kibana_alert_rule_name-matches everything-'); }); + it('renders the expected label', () => { + const item = getLegendItemFromRawBucket({ + bucket: bucketsWithStackByField1[0], + colorPalette, + maxRiskSubAggregations, + showColor: true, + stackByField0: 'kibana.alert.rule.name', + }); + + expect(item.render != null && item.render()).toEqual(`matches everything (Risk 21)`); + }); + + it('prefers `key_as_string` over `key` when rendering the label', () => { + const item = getLegendItemFromRawBucket({ + bucket, + colorPalette, + maxRiskSubAggregations, + showColor: true, + stackByField0: '@timestamp', + }); + + expect(item.render != null && item.render()).toEqual(`${bucket.key_as_string} (Risk 21)`); + }); + it('returns the expected field', () => { expect( getLegendItemFromRawBucket({ @@ -93,6 +129,18 @@ describe('legend', () => { }).value ).toEqual('matches everything'); }); + + it('prefers `key_as_string` over `key` when populating value', () => { + expect( + getLegendItemFromRawBucket({ + bucket, + colorPalette, + maxRiskSubAggregations, + showColor: true, + stackByField0: '@timestamp', + }).value + ).toEqual(bucket.key_as_string); + }); }); describe('getLegendItemFromFlattenedBucket', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.ts index 77865b7d55013..5f705e4f0c9fd 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/legend/index.ts @@ -38,11 +38,11 @@ export const getLegendItemFromRawBucket = ({ ), render: () => getLabel({ - baseLabel: bucket.key, + baseLabel: bucket.key_as_string ?? bucket.key, // prefer key_as_string when available, because it contains a formatted date riskScore: bucket.maxRiskSubAggregation?.value, }), field: stackByField0, - value: bucket.key, + value: bucket.key_as_string ?? bucket.key, }); export const getLegendItemFromFlattenedBucket = ({ diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/mocks/mock_alert_search_response.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/mocks/mock_alert_search_response.ts index b28b55a396ad1..59f0de746dd50 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/mocks/mock_alert_search_response.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/lib/mocks/mock_alert_search_response.ts @@ -138,3 +138,120 @@ export const mockNoDataAlertSearchResponse = { }, }, }; + +/** + * This response has multiple values for `stackByField0`, but no values for `stackByField1`, even though `stackByField1` was requested + */ +export const mockNoStackByField1Response = { + took: 3, + timeout: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + total: { + value: 23, + relation: 'eq', + }, + max_score: null, + hits: [], + }, + aggregations: { + stackByField0: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'mimikatz process started', + doc_count: 9, + maxRiskSubAggregation: { + value: 99, + }, + stackByField1: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + }, + { + key: 'matches everything too', + doc_count: 8, + maxRiskSubAggregation: { + value: 21, + }, + stackByField1: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + }, + { + key: 'Threshold rule', + doc_count: 6, + maxRiskSubAggregation: { + value: 99, + }, + stackByField1: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + }, + ], + }, + }, +}; + +/** + * This response has multiple values, but ONLY for `stackByField0`, because `stackByField1` was NOT requested + */ +export const mockOnlyStackByField0Response = { + took: 1, + timeout: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + total: { + value: 30, + relation: 'eq', + }, + max_score: null, + hits: [], + }, + aggregations: { + stackByField0: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'matches everything too', + doc_count: 14, + maxRiskSubAggregation: { + value: 21, + }, + }, + { + key: 'mimikatz process started', + doc_count: 9, + maxRiskSubAggregation: { + value: 99, + }, + }, + { + key: 'Threshold rule', + doc_count: 7, + maxRiskSubAggregation: { + value: 99, + }, + }, + ], + }, + }, +}; diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/no_data/index.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/no_data/index.tsx index 2dba94d3c12fa..d60b0bbba1852 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/no_data/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/no_data/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; @@ -15,12 +15,25 @@ const NoDataLabel = styled(EuiText)` text-align: center; `; -const NoDataComponent: React.FC = () => ( +interface Props { + reason?: string; +} + +const NoDataComponent: React.FC = ({ reason }) => ( {i18n.NO_DATA_LABEL} + + {reason != null && ( + <> + + + {reason} + + + )} ); diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/translations.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/translations.ts index 886cebf434f67..8f2b627ebcbb8 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/translations.ts @@ -14,6 +14,14 @@ export const NO_DATA_LABEL = i18n.translate( } ); +export const NO_DATA_REASON_LABEL = (stackByField1: string) => + i18n.translate('xpack.securitySolution.components.alertsTreemap.noDataReasonLabel', { + values: { + stackByField1, + }, + defaultMessage: 'The {stackByField1} field was not present in any groups', + }); + export const RISK_LABEL = (riskScore: number) => i18n.translate('xpack.securitySolution.components.alertsTreemap.riskLabel', { values: { diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/types.ts b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/types.ts index b0316952487d3..62c832fd457bc 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap/types.ts @@ -25,7 +25,10 @@ export interface AlertsTreeMapAggregation { }; } -export type FlattenedBucket = Pick & { +export type FlattenedBucket = Pick< + RawBucket, + 'doc_count' | 'key' | 'key_as_string' | 'maxRiskSubAggregation' +> & { stackByField1Key?: string; stackByField1DocCount?: number; }; diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.test.tsx index 997ca736a8fa9..0db21ee27ea75 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.test.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { useLocation } from 'react-router-dom'; import { SecurityPageName } from '../../../../common/constants'; +import { useGlobalTime } from '../../containers/use_global_time'; import { DEFAULT_STACK_BY_FIELD, DEFAULT_STACK_BY_FIELD1, @@ -17,11 +18,24 @@ import { import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; import { ChartContextMenu } from '../../../detections/pages/detection_engine/chart_panels/chart_context_menu'; import { ChartSelect } from '../../../detections/pages/detection_engine/chart_panels/chart_select'; +import { TREEMAP } from '../../../detections/pages/detection_engine/chart_panels/chart_select/translations'; import { TestProviders } from '../../mock/test_providers'; import type { Props } from '.'; import { AlertsTreemapPanel } from '.'; import { mockAlertSearchResponse } from '../alerts_treemap/lib/mocks/mock_alert_search_response'; +const from = '2022-07-28T08:20:18.966Z'; +const to = '2022-07-28T08:20:18.966Z'; +jest.mock('../../containers/use_global_time', () => { + const actual = jest.requireActual('../../containers/use_global_time'); + return { + ...actual, + useGlobalTime: jest + .fn() + .mockReturnValue({ from, to, setQuery: jest.fn(), deleteQuery: jest.fn() }), + }; +}); + jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); return { ...actual, useLocation: jest.fn().mockReturnValue({ pathname: '' }) }; @@ -51,7 +65,7 @@ const defaultProps: Props = { setStackByField1={jest.fn()} /> ), - + inspectTitle: TREEMAP, isPanelExpanded: true, filters: [ { @@ -111,7 +125,7 @@ const defaultProps: Props = { describe('AlertsTreemapPanel', () => { beforeEach(() => { - jest.resetAllMocks(); + jest.clearAllMocks(); (useLocation as jest.Mock).mockReturnValue([ { pageName: SecurityPageName.alerts, detailName: undefined }, @@ -137,6 +151,16 @@ describe('AlertsTreemapPanel', () => { await waitFor(() => expect(screen.getByTestId('treemapPanel')).toBeInTheDocument()); }); + it('invokes useGlobalTime() with false to prevent global queries from being deleted when the component unmounts', async () => { + render( + + + + ); + + await waitFor(() => expect(useGlobalTime).toBeCalledWith(false)); + }); + it('renders the panel with a hidden overflow-x', async () => { render( @@ -232,6 +256,25 @@ describe('AlertsTreemapPanel', () => { await waitFor(() => expect(screen.getByTestId('progress')).toBeInTheDocument()); }); + it('does NOT render the progress bar when loading is true, but the panel is collapsed', async () => { + (useQueryAlerts as jest.Mock).mockReturnValue({ + loading: true, // <-- true when users click the page-level Refresh button + data: mockAlertSearchResponse, + setQuery: () => {}, + response: '', + request: '', + refetch: () => {}, + }); + + render( + + + + ); + + await waitFor(() => expect(screen.queryByTestId('progress')).not.toBeInTheDocument()); + }); + it('does NOT render the progress bar when data has loaded', async () => { render( diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx index dbc50ab96ac24..74532bb7d7930 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_treemap_panel/index.tsx @@ -33,6 +33,7 @@ export interface Props { addFilter?: ({ field, value }: { field: string; value: string | number }) => void; alignHeader?: 'center' | 'baseline' | 'stretch' | 'flexStart' | 'flexEnd'; chartOptionsContextMenu?: (queryId: string) => React.ReactNode; + inspectTitle: string; isPanelExpanded: boolean; filters?: Filter[]; height?: number; @@ -53,6 +54,7 @@ const AlertsTreemapPanelComponent: React.FC = ({ addFilter, alignHeader, chartOptionsContextMenu, + inspectTitle, isPanelExpanded, filters, height = DEFAULT_HEIGHT, @@ -68,7 +70,7 @@ const AlertsTreemapPanelComponent: React.FC = ({ stackByWidth, title, }: Props) => { - const { to, from, deleteQuery, setQuery } = useGlobalTime(); + const { to, from, deleteQuery, setQuery } = useGlobalTime(false); // create a unique, but stable (across re-renders) query id const uniqueQueryId = useMemo(() => `${ALERTS_TREEMAP_ID}-${uuid.v4()}`, []); @@ -155,6 +157,7 @@ const AlertsTreemapPanelComponent: React.FC = ({ alignHeader={alignHeader} hideSubtitle id={uniqueQueryId} + inspectTitle={inspectTitle} outerDirection="row" showInspectButton={chartOptionsContextMenu == null} title={title} @@ -175,7 +178,7 @@ const AlertsTreemapPanelComponent: React.FC = ({ )} - {isLoadingAlerts ? ( + {isLoadingAlerts && isPanelExpanded ? ( ) : ( <> diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.test.tsx index 0d3f911f497be..169a14fb4df70 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.test.tsx @@ -49,147 +49,60 @@ describe('parseExistingEnrichments', () => { const data = [ { category: 'threat', - field: 'threat.enrichments.indicator.first_seen', - isObjectArray: true, - originalValue: ['2021-03-21T19:40:19.000Z'], - values: ['2021-03-21T19:40:19.000Z'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.provider', - isObjectArray: true, - originalValue: ['provider'], - values: ['provider'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.reference', - isObjectArray: true, - originalValue: ['http://reference.url'], - values: ['http://reference.url'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.ip', - isObjectArray: true, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.type', - isObjectArray: true, - originalValue: ['ip'], - values: ['ip'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.atomic', - isObjectArray: true, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.field', - isObjectArray: true, - originalValue: ['host.ip'], - values: ['host.ip'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.id', - isObjectArray: true, - originalValue: ['0SIZMnoB_Blp1Ib9ZYHU'], - values: ['0SIZMnoB_Blp1Ib9ZYHU'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.index', - isObjectArray: true, - originalValue: ['filebeat-8.0.0-2021.05.28-000001'], - values: ['filebeat-8.0.0-2021.05.28-000001'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.type', + field: 'threat.enrichments', isObjectArray: true, - originalValue: ['indicator_match_rule'], - values: ['indicator_match_rule'], + originalValue: [ + '{"matched.field":["matched_field","other_matched_field"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["yourself"],"indicator.type":["custom"],"matched.atomic":["matched_atomic"],"lazer":[{"great.field":["grrrrr"]},{"great.field":["grrrrr_2"]}]}', + ], + values: [ + '{"matched.field":["matched_field","other_matched_field"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["yourself"],"indicator.type":["custom"],"matched.atomic":["matched_atomic"],"lazer":[{"great.field":["grrrrr"]},{"great.field":["grrrrr_2"]}]}', + ], }, ]; expect(parseExistingEnrichments(data)).toEqual([ [ { - category: 'indicator', - field: 'indicator.first_seen', - isObjectArray: false, - originalValue: ['2021-03-21T19:40:19.000Z'], - values: ['2021-03-21T19:40:19.000Z'], - }, - { - category: 'indicator', - field: 'indicator.provider', + category: 'matched', + field: 'matched.field', isObjectArray: false, - originalValue: ['provider'], - values: ['provider'], + originalValue: ['matched_field', 'other_matched_field'], + values: ['matched_field', 'other_matched_field'], }, { category: 'indicator', - field: 'indicator.reference', + field: 'indicator.first_seen', isObjectArray: false, - originalValue: ['http://reference.url'], - values: ['http://reference.url'], + originalValue: ['2021-02-22T17:29:25.195Z'], + values: ['2021-02-22T17:29:25.195Z'], }, { category: 'indicator', - field: 'indicator.ip', + field: 'indicator.provider', isObjectArray: false, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], + originalValue: ['yourself'], + values: ['yourself'], }, { category: 'indicator', field: 'indicator.type', isObjectArray: false, - originalValue: ['ip'], - values: ['ip'], + originalValue: ['custom'], + values: ['custom'], }, { category: 'matched', field: 'matched.atomic', isObjectArray: false, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], - }, - { - category: 'matched', - field: 'matched.field', - isObjectArray: false, - originalValue: ['host.ip'], - values: ['host.ip'], - }, - { - category: 'matched', - field: 'matched.id', - isObjectArray: false, - originalValue: ['0SIZMnoB_Blp1Ib9ZYHU'], - values: ['0SIZMnoB_Blp1Ib9ZYHU'], - }, - { - category: 'matched', - field: 'matched.index', - isObjectArray: false, - originalValue: ['filebeat-8.0.0-2021.05.28-000001'], - values: ['filebeat-8.0.0-2021.05.28-000001'], + originalValue: ['matched_atomic'], + values: ['matched_atomic'], }, { - category: 'matched', - field: 'matched.type', - isObjectArray: false, - originalValue: [ENRICHMENT_TYPES.IndicatorMatchRule], - values: [ENRICHMENT_TYPES.IndicatorMatchRule], + category: 'lazer', + field: 'lazer', + isObjectArray: true, + originalValue: ['{"great.field":["grrrrr"]}', '{"great.field":["grrrrr_2"]}'], + values: ['{"great.field":["grrrrr"]}', '{"great.field":["grrrrr_2"]}'], }, ], ]); @@ -199,221 +112,307 @@ describe('parseExistingEnrichments', () => { const data = [ { category: 'threat', - field: 'threat.enrichments.indicator.first_seen', - isObjectArray: true, - originalValue: ['2021-03-21T19:40:19.000Z', '2021-03-21T19:40:19.000Z'], - values: ['2021-03-21T19:40:19.000Z', '2021-03-21T19:40:19.000Z'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.provider', - isObjectArray: true, - originalValue: ['provider', 'other'], - values: ['provider', 'other'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.reference', - isObjectArray: true, - originalValue: ['http://reference.url', 'http://reference.url'], - values: ['http://reference.url', 'http://reference.url'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.ip', - isObjectArray: true, - originalValue: ['192.168.1.19', '192.168.1.19'], - values: ['192.168.1.19', '192.168.1.19'], - }, - { - category: 'threat', - field: 'threat.enrichments.indicator.type', - isObjectArray: true, - originalValue: ['ip', 'ip'], - values: ['ip', 'ip'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.atomic', - isObjectArray: true, - originalValue: ['192.168.1.19', '192.168.1.19'], - values: ['192.168.1.19', '192.168.1.19'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.field', - isObjectArray: true, - originalValue: ['host.ip', 'host.ip'], - values: ['host.ip', 'host.ip'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.id', - isObjectArray: true, - originalValue: ['0SIZMnoB_Blp1Ib9ZYHU', 'iiL9NHoB_Blp1Ib9yoJo'], - values: ['0SIZMnoB_Blp1Ib9ZYHU', 'iiL9NHoB_Blp1Ib9yoJo'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.index', - isObjectArray: true, - originalValue: ['filebeat-8.0.0-2021.05.28-000001', 'filebeat-8.0.0-2021.05.28-000001'], - values: ['filebeat-8.0.0-2021.05.28-000001', 'filebeat-8.0.0-2021.05.28-000001'], - }, - { - category: 'threat', - field: 'threat.enrichments.matched.type', + field: 'threat.enrichments', isObjectArray: true, - originalValue: ['indicator_match_rule', 'indicator_match_rule'], - values: ['indicator_match_rule', 'indicator_match_rule'], + originalValue: [ + '{"matched.field":["matched_field","other_matched_field"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["yourself"],"indicator.type":["custom"],"matched.atomic":["matched_atomic"],"lazer":[{"great.field":["grrrrr"]},{"great.field":["grrrrr_2"]}]}', + '{"matched.field":["matched_field_2"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["other_you"],"indicator.type":["custom"],"matched.atomic":["matched_atomic_2"],"lazer":[{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["FFEtSYIBZ61VHL7LvV2j"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.architecture"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["x86_64"]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["CFErSYIBZ61VHL7LIV1N"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + ], + values: [ + '{"matched.field":["matched_field","other_matched_field"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["yourself"],"indicator.type":["custom"],"matched.atomic":["matched_atomic"],"lazer":[{"great.field":["grrrrr"]},{"great.field":["grrrrr_2"]}]}', + '{"matched.field":["matched_field_2"],"indicator.first_seen":["2021-02-22T17:29:25.195Z"],"indicator.provider":["other_you"],"indicator.type":["custom"],"matched.atomic":["matched_atomic_2"],"lazer":[{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["FFEtSYIBZ61VHL7LvV2j"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.architecture"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["x86_64"]}', + '{"matched.field":["host.name"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["E1EtSYIBZ61VHL7Ltl3m"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + '{"matched.field":["host.hostname"],"matched.index":["im"],"matched.type":["indicator_match_rule"],"matched.id":["CFErSYIBZ61VHL7LIV1N"],"matched.atomic":["MacBook-Pro-de-Gloria.local"]}', + ], }, ]; expect(parseExistingEnrichments(data)).toEqual([ - expect.arrayContaining([ + [ + { + category: 'matched', + field: 'matched.field', + isObjectArray: false, + originalValue: ['matched_field', 'other_matched_field'], + values: ['matched_field', 'other_matched_field'], + }, { category: 'indicator', field: 'indicator.first_seen', isObjectArray: false, - originalValue: ['2021-03-21T19:40:19.000Z'], - values: ['2021-03-21T19:40:19.000Z'], + originalValue: ['2021-02-22T17:29:25.195Z'], + values: ['2021-02-22T17:29:25.195Z'], }, { category: 'indicator', field: 'indicator.provider', isObjectArray: false, - originalValue: ['provider'], - values: ['provider'], + originalValue: ['yourself'], + values: ['yourself'], }, { category: 'indicator', - field: 'indicator.reference', + field: 'indicator.type', + isObjectArray: false, + originalValue: ['custom'], + values: ['custom'], + }, + { + category: 'matched', + field: 'matched.atomic', isObjectArray: false, - originalValue: ['http://reference.url'], - values: ['http://reference.url'], + originalValue: ['matched_atomic'], + values: ['matched_atomic'], + }, + { + category: 'lazer', + field: 'lazer', + isObjectArray: true, + originalValue: ['{"great.field":["grrrrr"]}', '{"great.field":["grrrrr_2"]}'], + values: ['{"great.field":["grrrrr"]}', '{"great.field":["grrrrr_2"]}'], + }, + ], + [ + { + category: 'matched', + field: 'matched.field', + isObjectArray: false, + originalValue: ['matched_field_2'], + values: ['matched_field_2'], }, { category: 'indicator', - field: 'indicator.ip', + field: 'indicator.first_seen', isObjectArray: false, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], + originalValue: ['2021-02-22T17:29:25.195Z'], + values: ['2021-02-22T17:29:25.195Z'], + }, + { + category: 'indicator', + field: 'indicator.provider', + isObjectArray: false, + originalValue: ['other_you'], + values: ['other_you'], }, { category: 'indicator', field: 'indicator.type', isObjectArray: false, - originalValue: ['ip'], - values: ['ip'], + originalValue: ['custom'], + values: ['custom'], }, { category: 'matched', field: 'matched.atomic', isObjectArray: false, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], + originalValue: ['matched_atomic_2'], + values: ['matched_atomic_2'], + }, + { + category: 'lazer', + field: 'lazer', + isObjectArray: true, + originalValue: [ + '{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}', + ], + values: [ + '{"great.field":[{"wowoe":[{"fooooo":["grrrrr"]}],"astring":"cool","aNumber":1,"neat":true}]}', + ], }, + ], + [ { category: 'matched', field: 'matched.field', isObjectArray: false, - originalValue: ['host.ip'], - values: ['host.ip'], + originalValue: ['host.name'], + values: ['host.name'], + }, + { + category: 'matched', + field: 'matched.index', + isObjectArray: false, + originalValue: ['im'], + values: ['im'], + }, + { + category: 'matched', + field: 'matched.type', + isObjectArray: false, + originalValue: ['indicator_match_rule'], + values: ['indicator_match_rule'], }, { category: 'matched', field: 'matched.id', isObjectArray: false, - originalValue: ['0SIZMnoB_Blp1Ib9ZYHU'], - values: ['0SIZMnoB_Blp1Ib9ZYHU'], + originalValue: ['FFEtSYIBZ61VHL7LvV2j'], + values: ['FFEtSYIBZ61VHL7LvV2j'], + }, + { + category: 'matched', + field: 'matched.atomic', + isObjectArray: false, + originalValue: ['MacBook-Pro-de-Gloria.local'], + values: ['MacBook-Pro-de-Gloria.local'], + }, + ], + [ + { + category: 'matched', + field: 'matched.field', + isObjectArray: false, + originalValue: ['host.hostname'], + values: ['host.hostname'], }, { category: 'matched', field: 'matched.index', isObjectArray: false, - originalValue: ['filebeat-8.0.0-2021.05.28-000001'], - values: ['filebeat-8.0.0-2021.05.28-000001'], + originalValue: ['im'], + values: ['im'], }, { category: 'matched', field: 'matched.type', isObjectArray: false, - originalValue: [ENRICHMENT_TYPES.IndicatorMatchRule], - values: [ENRICHMENT_TYPES.IndicatorMatchRule], + originalValue: ['indicator_match_rule'], + values: ['indicator_match_rule'], }, - ]), - expect.arrayContaining([ { - category: 'indicator', - field: 'indicator.first_seen', + category: 'matched', + field: 'matched.id', isObjectArray: false, - originalValue: ['2021-03-21T19:40:19.000Z'], - values: ['2021-03-21T19:40:19.000Z'], + originalValue: ['E1EtSYIBZ61VHL7Ltl3m'], + values: ['E1EtSYIBZ61VHL7Ltl3m'], }, { - category: 'indicator', - field: 'indicator.provider', + category: 'matched', + field: 'matched.atomic', isObjectArray: false, - originalValue: ['other'], - values: ['other'], + originalValue: ['MacBook-Pro-de-Gloria.local'], + values: ['MacBook-Pro-de-Gloria.local'], }, + ], + [ { - category: 'indicator', - field: 'indicator.reference', + category: 'matched', + field: 'matched.field', isObjectArray: false, - originalValue: ['http://reference.url'], - values: ['http://reference.url'], + originalValue: ['host.architecture'], + values: ['host.architecture'], }, { - category: 'indicator', - field: 'indicator.ip', + category: 'matched', + field: 'matched.index', isObjectArray: false, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], + originalValue: ['im'], + values: ['im'], }, { - category: 'indicator', - field: 'indicator.type', + category: 'matched', + field: 'matched.type', isObjectArray: false, - originalValue: ['ip'], - values: ['ip'], + originalValue: ['indicator_match_rule'], + values: ['indicator_match_rule'], + }, + { + category: 'matched', + field: 'matched.id', + isObjectArray: false, + originalValue: ['E1EtSYIBZ61VHL7Ltl3m'], + values: ['E1EtSYIBZ61VHL7Ltl3m'], }, { category: 'matched', field: 'matched.atomic', isObjectArray: false, - originalValue: ['192.168.1.19'], - values: ['192.168.1.19'], + originalValue: ['x86_64'], + values: ['x86_64'], }, + ], + [ { category: 'matched', field: 'matched.field', isObjectArray: false, - originalValue: ['host.ip'], - values: ['host.ip'], + originalValue: ['host.name'], + values: ['host.name'], + }, + { + category: 'matched', + field: 'matched.index', + isObjectArray: false, + originalValue: ['im'], + values: ['im'], + }, + { + category: 'matched', + field: 'matched.type', + isObjectArray: false, + originalValue: ['indicator_match_rule'], + values: ['indicator_match_rule'], }, { category: 'matched', field: 'matched.id', isObjectArray: false, - originalValue: ['iiL9NHoB_Blp1Ib9yoJo'], - values: ['iiL9NHoB_Blp1Ib9yoJo'], + originalValue: ['E1EtSYIBZ61VHL7Ltl3m'], + values: ['E1EtSYIBZ61VHL7Ltl3m'], + }, + { + category: 'matched', + field: 'matched.atomic', + isObjectArray: false, + originalValue: ['MacBook-Pro-de-Gloria.local'], + values: ['MacBook-Pro-de-Gloria.local'], + }, + ], + [ + { + category: 'matched', + field: 'matched.field', + isObjectArray: false, + originalValue: ['host.hostname'], + values: ['host.hostname'], }, { category: 'matched', field: 'matched.index', isObjectArray: false, - originalValue: ['filebeat-8.0.0-2021.05.28-000001'], - values: ['filebeat-8.0.0-2021.05.28-000001'], + originalValue: ['im'], + values: ['im'], }, { category: 'matched', field: 'matched.type', isObjectArray: false, - originalValue: [ENRICHMENT_TYPES.IndicatorMatchRule], - values: [ENRICHMENT_TYPES.IndicatorMatchRule], + originalValue: ['indicator_match_rule'], + values: ['indicator_match_rule'], + }, + { + category: 'matched', + field: 'matched.id', + isObjectArray: false, + originalValue: ['CFErSYIBZ61VHL7LIV1N'], + values: ['CFErSYIBZ61VHL7LIV1N'], }, - ]), + { + category: 'matched', + field: 'matched.atomic', + isObjectArray: false, + originalValue: ['MacBook-Pro-de-Gloria.local'], + values: ['MacBook-Pro-de-Gloria.local'], + }, + ], ]); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.tsx index eee4b731b2831..f124d59581fb3 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/helpers.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import { groupBy, isArray } from 'lodash'; +import { groupBy } from 'lodash'; +import { getDataFromFieldsHits } from '../../../../../common/utils/field_formatters'; import { ENRICHMENT_DESTINATION_PATH } from '../../../../../common/constants'; import { ENRICHMENT_TYPES, @@ -31,37 +32,21 @@ export const isInvestigationTimeEnrichment = (type: string | undefined) => export const parseExistingEnrichments = ( data: TimelineEventsDetailsItem[] ): TimelineEventsDetailsItem[][] => { - const threatIndicatorFields = data.filter( - ({ field, originalValue }) => - field.startsWith(`${ENRICHMENT_DESTINATION_PATH}.`) && originalValue + const threatIndicatorField = data.find( + ({ field, originalValue }) => field === ENRICHMENT_DESTINATION_PATH && originalValue ); - if (threatIndicatorFields.length === 0) { + if (!threatIndicatorField) { return []; } - return threatIndicatorFields.reduce( - (enrichments, enrichmentData) => { + const { originalValue } = threatIndicatorField; + const enrichmentStrings = Array.isArray(originalValue) ? originalValue : [originalValue]; + + return enrichmentStrings.reduce( + (enrichments, enrichmentString) => { try { - if (isArray(enrichmentData.values)) { - for ( - let enrichmentIndex = 0; - enrichmentIndex < enrichmentData.values.length; - enrichmentIndex++ - ) { - if (!isArray(enrichments[enrichmentIndex])) { - enrichments[enrichmentIndex] = []; - } - const fieldParts = enrichmentData.field.split('.'); - enrichments[enrichmentIndex].push({ - ...enrichmentData, - isObjectArray: false, - field: enrichmentData.field.replace(`${ENRICHMENT_DESTINATION_PATH}.`, ''), - category: fieldParts.length > 3 ? fieldParts[2] : enrichmentData.category, - values: [enrichmentData.values[enrichmentIndex]], - originalValue: [enrichmentData.originalValue[enrichmentIndex]], - }); - } - } + const enrichment = getDataFromFieldsHits(JSON.parse(enrichmentString)); + enrichments.push(enrichment); } catch (e) { // omit failed parse } diff --git a/x-pack/plugins/security_solution/public/common/components/header_section/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/header_section/index.test.tsx index 9e89acc20b3f1..fe99e22c448e4 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_section/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_section/index.test.tsx @@ -11,8 +11,28 @@ import React from 'react'; import { TestProviders } from '../../mock'; import { getHeaderAlignment, HeaderSection } from '.'; +import { ModalInspectQuery } from '../inspect/modal'; + +jest.mock('../inspect/modal', () => { + const actual = jest.requireActual('../inspect/modal'); + return { + ...actual, + ModalInspectQuery: jest.fn().mockReturnValue(null), + }; +}); + +jest.mock('../inspect/use_inspect', () => ({ + useInspect: () => ({ + isShowingModal: true, + handleClick: jest.fn(), + request: 'fake request', + response: 'fake response', + }), +})); describe('HeaderSection', () => { + beforeEach(() => jest.clearAllMocks()); + test('it renders', () => { const wrapper = shallow(); @@ -181,6 +201,35 @@ describe('HeaderSection', () => { expect(wrapper.find('[data-test-subj="inspect-icon-button"]').first().exists()).toBe(false); }); + test('it defaults to using `title` for the inspect modal when `inspectTitle` is NOT provided', () => { + const title = 'Use this by default'; + + mount( + + +

{'Test children'}

+
+
+ ); + + expect((ModalInspectQuery as jest.Mock).mock.calls[0][0].title).toEqual(title); + }); + + test('it uses `inspectTitle` instead of `title` for the inspect modal when `inspectTitle` is provided', () => { + const title = `Don't use this`; + const inspectTitle = 'Use this instead'; + + mount( + + +

{'Test children'}

+
+
+ ); + + expect((ModalInspectQuery as jest.Mock).mock.calls[0][0].title).toEqual(inspectTitle); + }); + test('it does not render query-toggle-header when no arguments provided', () => { const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/common/components/header_section/index.tsx b/x-pack/plugins/security_solution/public/common/components/header_section/index.tsx index e8fe65e52d60c..153764e8ef13b 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_section/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_section/index.tsx @@ -68,6 +68,7 @@ export interface HeaderSectionProps extends HeaderProps { toggleQuery?: (status: boolean) => void; toggleStatus?: boolean; title: string | React.ReactNode; + inspectTitle?: string; titleSize?: EuiTitleSize; tooltip?: string; } @@ -99,6 +100,7 @@ const HeaderSectionComponent: React.FC = ({ hideSubtitle = false, id, inspectMultiple = false, + inspectTitle, isInspectDisabled, showInspectButton = true, split, @@ -191,7 +193,7 @@ const HeaderSectionComponent: React.FC = ({ queryId={id} multiple={inspectMultiple} showInspectButton={showInspectButton} - title={typeof title === 'string' ? title : undefined} + title={inspectTitle != null ? inspectTitle : title} />
)} diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.test.ts b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.test.ts new file mode 100644 index 0000000000000..555ad18c67231 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.test.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; + +import { TestProviders } from '../../mock'; +import { useAlertPrevalence } from './use_alert_prevalence'; +import { useGlobalTime } from '../use_global_time'; + +const from = '2022-07-28T08:20:18.966Z'; +const to = '2022-07-28T08:20:18.966Z'; +jest.mock('../use_global_time', () => { + const actual = jest.requireActual('../use_global_time'); + return { + ...actual, + useGlobalTime: jest + .fn() + .mockReturnValue({ from, to, setQuery: jest.fn(), deleteQuery: jest.fn() }), + }; +}); + +describe('useAlertPrevalence', () => { + beforeEach(() => jest.resetAllMocks()); + + it('invokes useGlobalTime() with false to prevent global queries from being deleted when the component unmounts', () => { + renderHook( + () => + useAlertPrevalence({ + field: 'host.name', + value: ['Host-byc3w6qlpo'], + timelineId: 'detections-page', + signalIndexName: null, + includeAlertIds: false, + }), + { + wrapper: TestProviders, + } + ); + + expect(useGlobalTime).toBeCalledWith(false); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts index d2ecd804e0959..918237fa5bbf0 100644 --- a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts @@ -42,7 +42,7 @@ export const useAlertPrevalence = ({ const timelineTime = useDeepEqualSelector((state) => inputsSelectors.timelineTimeRangeSelector(state) ); - const globalTime = useGlobalTime(); + const globalTime = useGlobalTime(false); const { to, from } = timelineId === TimelineId.active ? timelineTime : globalTime; const [initialQuery] = useState(() => diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.test.tsx index 82c9d447879c0..4cb954f3b14e4 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.test.tsx @@ -11,9 +11,23 @@ import { mount } from 'enzyme'; import { AlertsCountPanel } from '.'; import { useQueryToggle } from '../../../../common/containers/query_toggle'; +import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { DEFAULT_STACK_BY_FIELD, DEFAULT_STACK_BY_FIELD1 } from '../common/config'; import { TestProviders } from '../../../../common/mock'; import { ChartContextMenu } from '../../../pages/detection_engine/chart_panels/chart_context_menu'; +import { TABLE } from '../../../pages/detection_engine/chart_panels/chart_select/translations'; + +const from = '2022-07-28T08:20:18.966Z'; +const to = '2022-07-28T08:20:18.966Z'; +jest.mock('../../../../common/containers/use_global_time', () => { + const actual = jest.requireActual('../../../../common/containers/use_global_time'); + return { + ...actual, + useGlobalTime: jest + .fn() + .mockReturnValue({ from, to, setQuery: jest.fn(), deleteQuery: jest.fn() }), + }; +}); jest.mock('../../../../common/containers/query_toggle'); jest.mock('react-router-dom', () => { @@ -38,6 +52,7 @@ jest.mock('../../../containers/detection_engine/alerts/use_query', () => { describe('AlertsCountPanel', () => { const defaultProps = { + inspectTitle: TABLE, signalIndexName: 'signalIndexName', stackByField0: DEFAULT_STACK_BY_FIELD, stackByField1: DEFAULT_STACK_BY_FIELD1, @@ -64,6 +79,18 @@ describe('AlertsCountPanel', () => { }); }); + it('invokes useGlobalTime() with false to prevent global queries from being deleted when the component unmounts', async () => { + await act(async () => { + mount( + + + + ); + + expect(useGlobalTime).toBeCalledWith(false); + }); + }); + it('renders with the specified `alignHeader` alignment', async () => { await act(async () => { const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx index a609d388f0f7e..45b378e54a924 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx @@ -32,6 +32,7 @@ interface AlertsCountPanelProps { alignHeader?: 'center' | 'baseline' | 'stretch' | 'flexStart' | 'flexEnd'; chartOptionsContextMenu?: (queryId: string) => React.ReactNode; filters?: Filter[]; + inspectTitle: string; panelHeight?: number; query?: Query; setStackByField0: (stackBy: string) => void; @@ -49,6 +50,7 @@ export const AlertsCountPanel = memo( alignHeader, chartOptionsContextMenu, filters, + inspectTitle, panelHeight, query, runtimeMappings, @@ -60,7 +62,7 @@ export const AlertsCountPanel = memo( stackByWidth, title = i18n.COUNT_TABLE_TITLE, }) => { - const { to, from, deleteQuery, setQuery } = useGlobalTime(); + const { to, from, deleteQuery, setQuery } = useGlobalTime(false); // create a unique, but stable (across re-renders) query id const uniqueQueryId = useMemo(() => `${DETECTIONS_ALERTS_COUNT_ID}-${uuid.v4()}`, []); @@ -158,6 +160,7 @@ export const AlertsCountPanel = memo( void; /** Override all defaults, and only display this field */ onlyField?: AlertsStackByField; @@ -109,6 +110,7 @@ export const AlertsHistogramPanel = memo( defaultStackByOption = DEFAULT_STACK_BY_FIELD, filters, headerChildren, + inspectTitle, onFieldSelected, onlyField, paddingSize = 'm', @@ -336,6 +338,7 @@ export const AlertsHistogramPanel = memo( ( return [true, NOT_FROM_ENDPOINT_HOST_TOOLTIP]; } - if (!isResponderCapabilitiesEnabled) { + if (endpointHostInfo && !isResponderCapabilitiesEnabled) { return [true, UPGRADE_ENDPOINT_FOR_RESPONDER]; } @@ -62,24 +62,18 @@ export const ResponderContextMenuItem = memo( return [true, LOADING_ENDPOINT_DATA_TOOLTIP]; } - // if we got an error and it's a 404 (alerts can exist for endpoint that are no longer around) + // if we got an error and it's a 400 (alerts can exist for endpoint that are no longer around) // or, // the Host status is `unenrolled` if ( - (error && error.body?.statusCode === 404) || + (error && error.body?.statusCode === 400) || endpointHostInfo?.host_status === HostStatus.UNENROLLED ) { return [true, HOST_ENDPOINT_UNENROLLED_TOOLTIP]; } return [false, undefined]; - }, [ - endpointHostInfo?.host_status, - endpointId, - error, - isFetching, - isResponderCapabilitiesEnabled, - ]); + }, [endpointHostInfo, endpointId, error, isFetching, isResponderCapabilitiesEnabled]); const handleResponseActionsClick = useCallback(() => { if (endpointHostInfo) showEndpointResponseActionsConsole(endpointHostInfo.metadata); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx index 18782b2a052f8..e10bc1d666945 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx @@ -59,7 +59,7 @@ export const useHostIsolationStatus = ({ return; } - if (isMounted && error.body.statusCode === 404) { + if (isMounted && error.body.statusCode === 400) { setAgentStatus(HostStatus.UNENROLLED); } } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/chart_panels/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/chart_panels/index.tsx index 9d57590c72bff..c40ff937a4fe5 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/chart_panels/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/chart_panels/index.tsx @@ -15,6 +15,7 @@ import { useAlertsLocalStorage } from './alerts_local_storage'; import type { AlertsSettings } from './alerts_local_storage/types'; import { ChartContextMenu } from './chart_context_menu'; import { ChartSelect } from './chart_select'; +import { TABLE, TREEMAP, TREND } from './chart_select/translations'; import { AlertsTreemapPanel } from '../../../../common/components/alerts_treemap_panel'; import type { UpdateDateRange } from '../../../../common/components/charts/common'; import { AlertsHistogramPanel } from '../../../components/alerts_kpis/alerts_histogram_panel'; @@ -29,10 +30,6 @@ const TABLE_PANEL_HEIGHT = 330; // px const TRENT_CHART_HEIGHT = 127; // px const TREND_CHART_PANEL_HEIGHT = 256; // px -const AlertsCountPanelFlexItem = styled(EuiFlexItem)` - margin-left: ${({ theme }) => theme.eui.euiSizeM}; -`; - const FullHeightFlexItem = styled(EuiFlexItem)` height: 100%; `; @@ -132,6 +129,7 @@ const ChartPanelsComponent: React.FC = ({ chartOptionsContextMenu={chartOptionsContextMenu} defaultStackByOption={trendChartStackBy} filters={alertsHistogramDefaultFilters} + inspectTitle={TREND} onFieldSelected={updateCommonStackBy0} panelHeight={TREND_CHART_PANEL_HEIGHT} query={query} @@ -150,7 +148,7 @@ const ChartPanelsComponent: React.FC = ({ )} {alertViewSelection === 'table' && ( - + {isLoadingIndexPattern ? ( ) : ( @@ -158,6 +156,7 @@ const ChartPanelsComponent: React.FC = ({ alignHeader="flexStart" chartOptionsContextMenu={chartOptionsContextMenu} filters={alertsHistogramDefaultFilters} + inspectTitle={TABLE} panelHeight={TABLE_PANEL_HEIGHT} query={query} runtimeMappings={runtimeMappings} @@ -169,7 +168,7 @@ const ChartPanelsComponent: React.FC = ({ title={title} /> )} - + )} {alertViewSelection === 'treemap' && ( @@ -181,6 +180,7 @@ const ChartPanelsComponent: React.FC = ({ addFilter={addFilter} alignHeader="flexStart" chartOptionsContextMenu={chartOptionsContextMenu} + inspectTitle={TREEMAP} isPanelExpanded={isTreemapPanelExpanded} filters={alertsHistogramDefaultFilters} query={query} diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/endpoint_response_actions_console_commands.ts b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/endpoint_response_actions_console_commands.ts index a526e978142b8..399c4add348ff 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/endpoint_response_actions_console_commands.ts +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/endpoint_response_actions_console_commands.ts @@ -29,7 +29,7 @@ const pidValidator = (argData: ParsedArgData): true | string => { const emptyResult = emptyArgumentValidator(argData); if (emptyResult !== true) { return emptyResult; - } else if (Number.isInteger(Number(argData)) && Number(argData) > 0) { + } else if (Number.isSafeInteger(Number(argData)) && Number(argData) > 0) { return true; } else { return i18n.translate('xpack.securitySolution.endpointConsoleCommands.invalidPidMessage', { @@ -97,7 +97,7 @@ export const getEndpointResponseActionsConsoleCommands = ( meta: { endpointId: endpointAgentId, }, - exampleUsage: 'release --comment "isolate this host"', + exampleUsage: 'release --comment "release this host"', exampleInstruction: ENTER_OR_ADD_COMMENT_ARG_INSTRUCTION, args: { comment: { diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx index baac612acbd58..f9c8eab8dcb7a 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx @@ -138,6 +138,15 @@ describe('When using the kill-process action from response actions console', () ); }); + it('should check the pid is a safe number', async () => { + await render(); + enterConsoleCommand(renderResult, 'kill-process --pid 123123123123123123123'); + + expect(renderResult.getByTestId('test-badArgument-message').textContent).toEqual( + 'Invalid argument value: --pid. Argument must be a positive number representing the PID of a process' + ); + }); + it('should check the entityId has a given value', async () => { await render(); enterConsoleCommand(renderResult, 'kill-process --entityId'); diff --git a/x-pack/plugins/security_solution/public/threat_intelligence/pages/threat_intelligence.tsx b/x-pack/plugins/security_solution/public/threat_intelligence/pages/threat_intelligence.tsx index c558f7fc2aaae..468fe58b7be0b 100644 --- a/x-pack/plugins/security_solution/public/threat_intelligence/pages/threat_intelligence.tsx +++ b/x-pack/plugins/security_solution/public/threat_intelligence/pages/threat_intelligence.tsx @@ -6,19 +6,25 @@ */ import React from 'react'; +import type { ThreatIntelligenceSecuritySolutionContext } from '@kbn/threat-intelligence-plugin/public'; import { SecuritySolutionPageWrapper } from '../../common/components/page_wrapper'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../common/constants'; import { useKibana } from '../../common/lib/kibana'; +import { FiltersGlobal } from '../../common/components/filters_global'; const ThreatIntelligence = () => { const services = useKibana().services; const { threatIntelligence } = services; const ThreatIntelligencePlugin = threatIntelligence.getComponent(); + const securitySolutionContext: ThreatIntelligenceSecuritySolutionContext = { + getFiltersGlobalComponent: () => FiltersGlobal, + }; + return ( - + ); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts index 3c881133ff873..7d269c92aeda9 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts @@ -96,6 +96,7 @@ export const createMockTelemetryReceiver = ( .mockReturnValue(Promise.resolve(stubEndpointAlertResponse())), buildProcessTree: jest.fn().mockReturnValue(processTreeResponse), fetchTimelineEvents: jest.fn().mockReturnValue(Promise.resolve(stubFetchTimelineEvents())), + fetchValueListMetaData: jest.fn(), } as unknown as jest.Mocked; }; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.test.ts index 56020c1600728..cab2014861844 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.test.ts @@ -21,6 +21,7 @@ import { isPackagePolicyList, templateExceptionList, addDefaultAdvancedPolicyConfigSettings, + metricsResponseToValueListMetaData, } from './helpers'; import type { ESClusterInfo, ESLicense, ExceptionListItem } from './types'; import type { PolicyConfig, PolicyData } from '../../../common/endpoint/types'; @@ -797,3 +798,112 @@ describe('test advanced policy config overlap ', () => { expect(endpointPolicyConfig).toEqual(stubPolicyConfigWithAdvancedSettingsResponse); }); }); + +describe('test metrics response to value list meta data', () => { + test('can succeed when metrics response is fully populated', async () => { + const stubMetricResponses = { + listMetricsResponse: { + aggregations: { + total_value_list_count: 5, + type_breakdown: { + buckets: [ + { + key: 'keyword', + doc_count: 5, + }, + { + key: 'ip', + doc_count: 3, + }, + { + key: 'ip_range', + doc_count: 2, + }, + { + key: 'text', + doc_count: 1, + }, + ], + }, + }, + }, + itemMetricsResponse: { + aggregations: { + value_list_item_count: { + buckets: [ + { + key: 'vl-test1', + doc_count: 23, + }, + { + key: 'vl-test2', + doc_count: 45, + }, + ], + }, + }, + }, + exceptionListMetricsResponse: { + aggregations: { + vl_included_in_exception_lists_count: { value: 24 }, + }, + }, + indicatorMatchMetricsResponse: { + aggregations: { + vl_used_in_indicator_match_rule_count: { value: 6 }, + }, + }, + }; + const response = metricsResponseToValueListMetaData(stubMetricResponses); + expect(response).toEqual({ + total_list_count: 5, + types: [ + { + type: 'keyword', + count: 5, + }, + { + type: 'ip', + count: 3, + }, + { + type: 'ip_range', + count: 2, + }, + { + type: 'text', + count: 1, + }, + ], + lists: [ + { + id: 'vl-test1', + count: 23, + }, + { + id: 'vl-test2', + count: 45, + }, + ], + included_in_exception_lists_count: 24, + used_in_indicator_match_rule_count: 6, + }); + }); + test('can succeed when metrics response has no aggregation response', async () => { + const stubMetricResponses = { + listMetricsResponse: {}, + itemMetricsResponse: {}, + exceptionListMetricsResponse: {}, + indicatorMatchMetricsResponse: {}, + }; + // @ts-ignore + const response = metricsResponseToValueListMetaData(stubMetricResponses); + expect(response).toEqual({ + total_list_count: 0, + types: [], + lists: [], + included_in_exception_lists_count: 0, + used_in_indicator_match_rule_count: 0, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts index c3bb376802d12..1a78ea3352aa7 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts @@ -17,6 +17,10 @@ import type { ESLicense, ListTemplate, TelemetryEvent, + ValueListResponseAggregation, + ValueListExceptionListResponseAggregation, + ValueListItemsResponseAggregation, + ValueListIndicatorMatchResponseAggregation, } from './types'; import { LIST_DETECTION_RULE_EXCEPTION, @@ -234,3 +238,31 @@ export const extractEndpointPolicyConfig = (policyData: PolicyData | null) => { export const addDefaultAdvancedPolicyConfigSettings = (policyConfig: PolicyConfig) => { return merge(DEFAULT_ADVANCED_POLICY_CONFIG_SETTINGS, policyConfig); }; + +export const metricsResponseToValueListMetaData = ({ + listMetricsResponse, + itemMetricsResponse, + exceptionListMetricsResponse, + indicatorMatchMetricsResponse, +}: { + listMetricsResponse: ValueListResponseAggregation; + itemMetricsResponse: ValueListItemsResponseAggregation; + exceptionListMetricsResponse: ValueListExceptionListResponseAggregation; + indicatorMatchMetricsResponse: ValueListIndicatorMatchResponseAggregation; +}) => ({ + total_list_count: listMetricsResponse?.aggregations?.total_value_list_count ?? 0, + types: + listMetricsResponse?.aggregations?.type_breakdown?.buckets.map((breakdown) => ({ + type: breakdown.key, + count: breakdown.doc_count, + })) ?? [], + lists: + itemMetricsResponse?.aggregations?.value_list_item_count?.buckets.map((itemCount) => ({ + id: itemCount.key, + count: itemCount.doc_count, + })) ?? [], + included_in_exception_lists_count: + exceptionListMetricsResponse?.aggregations?.vl_included_in_exception_lists_count?.value ?? 0, + used_in_indicator_match_rule_count: + indicatorMatchMetricsResponse?.aggregations?.vl_used_in_indicator_match_rule_count?.value ?? 0, +}); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts index 50dbfccdcf3d6..ea75ed05e81f3 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -37,6 +37,7 @@ import { exceptionListItemToTelemetryEntry, trustedApplicationToTelemetryEntry, ruleExceptionListItemToTelemetryEvent, + metricsResponseToValueListMetaData, } from './helpers'; import { Fetcher } from '../../endpoint/routes/resolver/tree/utils/fetch'; import type { TreeOptions, TreeResponse } from '../../endpoint/routes/resolver/tree/utils/fetch'; @@ -49,6 +50,11 @@ import type { GetEndpointListResponse, RuleSearchResult, ExceptionListItem, + ValueListMetaData, + ValueListResponseAggregation, + ValueListItemsResponseAggregation, + ValueListExceptionListResponseAggregation, + ValueListIndicatorMatchResponseAggregation, } from './types'; export interface ITelemetryReceiver { @@ -154,6 +160,8 @@ export interface ITelemetryReceiver { fetchTimelineEvents( nodeIds: string[] ): Promise>>; + + fetchValueListMetaData(interval: number): Promise; } export class TelemetryReceiver implements ITelemetryReceiver { @@ -802,6 +810,109 @@ export class TelemetryReceiver implements ITelemetryReceiver { return this.esClient.search(query); } + public async fetchValueListMetaData(interval: number) { + if (this.esClient === undefined || this.esClient === null) { + throw Error('elasticsearch client is unavailable: cannot retrieve diagnostic alerts'); + } + + const listQuery: SearchRequest = { + expand_wildcards: ['open' as const, 'hidden' as const], + index: '.lists-*', + ignore_unavailable: true, + size: 0, // no query results required - only aggregation quantity + body: { + aggs: { + total_value_list_count: { + cardinality: { + field: 'name', + }, + }, + type_breakdown: { + terms: { + field: 'type', + size: 50, + }, + }, + }, + }, + }; + const itemQuery: SearchRequest = { + expand_wildcards: ['open' as const, 'hidden' as const], + index: '.items-*', + ignore_unavailable: true, + size: 0, // no query results required - only aggregation quantity + body: { + aggs: { + value_list_item_count: { + terms: { + field: 'list_id', + size: 100, + }, + }, + }, + }, + }; + const exceptionListQuery: SearchRequest = { + expand_wildcards: ['open' as const, 'hidden' as const], + index: `${this.kibanaIndex}*`, + ignore_unavailable: true, + size: 0, // no query results required - only aggregation quantity + body: { + query: { + bool: { + must: [{ match: { 'exception-list.entries.type': 'list' } }], + }, + }, + aggs: { + vl_included_in_exception_lists_count: { + cardinality: { + field: 'exception-list.entries.list.id', + }, + }, + }, + }, + }; + const indicatorMatchRuleQuery: SearchRequest = { + expand_wildcards: ['open' as const, 'hidden' as const], + index: `${this.kibanaIndex}*`, + ignore_unavailable: true, + size: 0, + body: { + query: { + bool: { + must: [{ prefix: { 'alert.params.threatIndex': '.items' } }], + }, + }, + aggs: { + vl_used_in_indicator_match_rule_count: { + cardinality: { + field: 'alert.params.ruleId', + }, + }, + }, + }, + }; + const [listMetrics, itemMetrics, exceptionListMetrics, indicatorMatchMetrics] = + await Promise.all([ + this.esClient.search(listQuery), + this.esClient.search(itemQuery), + this.esClient.search(exceptionListQuery), + this.esClient.search(indicatorMatchRuleQuery), + ]); + const listMetricsResponse = listMetrics as unknown as ValueListResponseAggregation; + const itemMetricsResponse = itemMetrics as unknown as ValueListItemsResponseAggregation; + const exceptionListMetricsResponse = + exceptionListMetrics as unknown as ValueListExceptionListResponseAggregation; + const indicatorMatchMetricsResponse = + indicatorMatchMetrics as unknown as ValueListIndicatorMatchResponseAggregation; + return metricsResponseToValueListMetaData({ + listMetricsResponse, + itemMetricsResponse, + exceptionListMetricsResponse, + indicatorMatchMetricsResponse, + }); + } + public async fetchClusterInfo(): Promise { if (this.esClient === undefined || this.esClient === null) { throw Error('elasticsearch client is unavailable: cannot retrieve cluster infomation'); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.test.ts index 7f31066ed90ec..8c227dd56c13e 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.test.ts @@ -42,5 +42,6 @@ describe('security list telemetry task test', () => { expect(mockTelemetryReceiver.fetchEndpointList).toHaveBeenCalledWith( ENDPOINT_EVENT_FILTERS_LIST_ID ); + expect(mockTelemetryReceiver.fetchValueListMetaData).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts index f6dc279b180bf..1788eba66e15a 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts @@ -51,9 +51,9 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) licenseInfoPromise.status === 'fulfilled' ? licenseInfoPromise.value : ({} as ESLicense | undefined); + const FETCH_VALUE_LIST_META_DATA_INTERVAL_IN_HOURS = 24; // Lists Telemetry: Trusted Applications - const trustedApps = await receiver.fetchTrustedApplications(); if (trustedApps?.data) { const trustedAppsJson = templateExceptionList( @@ -109,6 +109,13 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) } } + // Value list meta data + const valueListMetaData = await receiver.fetchValueListMetaData( + FETCH_VALUE_LIST_META_DATA_INTERVAL_IN_HOURS + ); + if (valueListMetaData?.total_list_count) { + await sender.sendOnDemand(TELEMETRY_CHANNEL_LISTS, [valueListMetaData]); + } return count; }, }; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts index 94356fff8742f..82b4fde4b5992 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts @@ -363,3 +363,52 @@ export interface TimelineTelemetryTemplate { event_id: string; timeline: TimelineTelemetryEvent[]; } + +export interface ValueListMetaData { + total_list_count: number; + types: Array<{ + type: string; + count: number; + }>; + lists: Array<{ + id: string; + count: number; + }>; + included_in_exception_lists_count: number; + used_in_indicator_match_rule_count: number; +} + +export interface ValueListResponseAggregation { + aggregations: { + total_value_list_count: number; + type_breakdown: { + buckets: Array<{ + key: string; + doc_count: number; + }>; + }; + }; +} + +export interface ValueListItemsResponseAggregation { + aggregations: { + value_list_item_count: { + buckets: Array<{ + key: string; + doc_count: number; + }>; + }; + }; +} + +export interface ValueListExceptionListResponseAggregation { + aggregations: { + vl_included_in_exception_lists_count: { value: number }; + }; +} + +export interface ValueListIndicatorMatchResponseAggregation { + aggregations: { + vl_used_in_indicator_match_rule_count: { value: number }; + }; +} diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/common/header/manage_monitors_btn.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/common/header/manage_monitors_btn.tsx index 2d0ac2654b71f..365ea6ccdd446 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/common/header/manage_monitors_btn.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/common/header/manage_monitors_btn.tsx @@ -12,30 +12,19 @@ import React from 'react'; import { useHistory } from 'react-router-dom'; import useLocalStorage from 'react-use/lib/useLocalStorage'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; import { MONITOR_MANAGEMENT_ROUTE } from '../../../../../common/constants'; import { PUBLIC_BETA_DESCRIPTION } from '../../../pages/monitor_management/service_allowed_wrapper'; -import { ClientPluginsSetup } from '../../../../plugin'; -import { useUptimeSettingsContext } from '../../../contexts/uptime_settings_context'; export const ManageMonitorsBtn = () => { const [isOpen, setIsOpen] = useLocalStorage('xpack.synthetics.monitorManagement.openTour', true); const history = useHistory(); - const { cloud } = useKibana().services; - - const { isDev } = useUptimeSettingsContext(); - const handleOnClick = () => { setIsOpen(false); history.push(MONITOR_MANAGEMENT_ROUTE + '/all'); }; - if (!cloud?.isCloudEnabled && !isDev) { - return null; - } - return ( ( enableInspectEsQueries diff --git a/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.test.ts index 0943a87c2e46e..b232da7af0e50 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.test.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { KibanaRequest } from '@kbn/core/server'; +import { KibanaRequest, SavedObjectsClientContract } from '@kbn/core/server'; import { loggerMock } from '@kbn/logging-mocks'; import { UptimeServerSetup } from '../../legacy_uptime/lib/adapters'; import { formatSyntheticsPolicy } from '../../../common/formatters/format_synthetics_policy'; @@ -50,17 +50,18 @@ describe('SyntheticsPrivateLocation', () => { username: '', } as unknown as HeartbeatConfig; + const savedObjectsClientMock = { + bulkUpdate: jest.fn(), + get: jest.fn().mockReturnValue({ + attributes: { + locations: [mockPrivateLocation], + }, + }), + } as unknown as SavedObjectsClientContract; + const serverMock: UptimeServerSetup = { uptimeEsClient: { search: jest.fn() }, logger: loggerMock.create(), - authSavedObjectsClient: { - bulkUpdate: jest.fn(), - get: jest.fn().mockReturnValue({ - attributes: { - locations: [mockPrivateLocation], - }, - }), - }, config: { service: { username: 'dev', @@ -78,6 +79,11 @@ describe('SyntheticsPrivateLocation', () => { get: jest.fn().mockReturnValue({}), }, }, + spaces: { + spacesService: { + getSpaceId: jest.fn().mockReturnValue('nonDefaultSpace'), + }, + }, } as unknown as UptimeServerSetup; it.each([ @@ -101,7 +107,11 @@ describe('SyntheticsPrivateLocation', () => { }); try { - await syntheticsPrivateLocation.createMonitor(testConfig, {} as unknown as KibanaRequest); + await syntheticsPrivateLocation.createMonitor( + testConfig, + {} as unknown as KibanaRequest, + savedObjectsClientMock + ); } catch (e) { expect(e).toEqual(new Error(error)); } @@ -128,7 +138,11 @@ describe('SyntheticsPrivateLocation', () => { }); try { - await syntheticsPrivateLocation.editMonitor(testConfig, {} as unknown as KibanaRequest); + await syntheticsPrivateLocation.editMonitor( + testConfig, + {} as unknown as KibanaRequest, + savedObjectsClientMock + ); } catch (e) { expect(e).toEqual(new Error(error)); } @@ -154,7 +168,11 @@ describe('SyntheticsPrivateLocation', () => { }, }); try { - await syntheticsPrivateLocation.deleteMonitor(testConfig, {} as unknown as KibanaRequest); + await syntheticsPrivateLocation.deleteMonitor( + testConfig, + {} as unknown as KibanaRequest, + savedObjectsClientMock + ); } catch (e) { expect(e).toEqual(new Error(e)); } diff --git a/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts b/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts index 2211e94ca6a78..78c8193f8f582 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/private_location/synthetics_private_location.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { KibanaRequest } from '@kbn/core/server'; +import { KibanaRequest, SavedObjectsClientContract } from '@kbn/core/server'; import { NewPackagePolicy } from '@kbn/fleet-plugin/common'; import { formatSyntheticsPolicy } from '../../../common/formatters/format_synthetics_policy'; import { getSyntheticsPrivateLocations } from '../../legacy_uptime/lib/saved_objects/private_locations'; @@ -24,35 +24,33 @@ export class SyntheticsPrivateLocation { this.server = _server; } - getSpaceId() { - if (!this.server.currentRequest) { - return ''; - } - - return this.server.spaces.spacesService.getSpaceId(this.server.currentRequest); + getSpaceId(request: KibanaRequest) { + return this.server.spaces.spacesService.getSpaceId(request); } - getPolicyId(config: HeartbeatConfig, { id: locId }: PrivateLocation) { + getPolicyId(config: HeartbeatConfig, { id: locId }: PrivateLocation, request: KibanaRequest) { if (config[ConfigKey.MONITOR_SOURCE_TYPE] === SourceType.PROJECT) { return `${config.id}-${locId}`; } - return `${config.id}-${locId}-${this.getSpaceId()}`; + return `${config.id}-${locId}-${this.getSpaceId(request)}`; } async generateNewPolicy( config: HeartbeatConfig, - privateLocation: PrivateLocation + privateLocation: PrivateLocation, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract ): Promise { - if (!this.server.authSavedObjectsClient) { - throw new Error('Could not find authSavedObjectsClient'); + if (!savedObjectsClient) { + throw new Error('Could not find savedObjectsClient'); } const { label: locName } = privateLocation; - const spaceId = this.getSpaceId(); + const spaceId = this.getSpaceId(request); try { const newPolicy = await this.server.fleet.packagePolicyService.buildPackagePolicyFromPackage( - this.server.authSavedObjectsClient, + savedObjectsClient, 'synthetics', this.server.logger ); @@ -99,7 +97,11 @@ export class SyntheticsPrivateLocation { } } - async createMonitor(config: HeartbeatConfig, request: KibanaRequest) { + async createMonitor( + config: HeartbeatConfig, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract + ) { const { locations } = config; await this.checkPermissions( @@ -110,7 +112,7 @@ export class SyntheticsPrivateLocation { ); const privateLocations: PrivateLocation[] = await getSyntheticsPrivateLocations( - this.server.authSavedObjectsClient! + savedObjectsClient ); const fleetManagedLocations = locations.filter((loc) => !loc.isServiceManaged); @@ -124,7 +126,7 @@ export class SyntheticsPrivateLocation { ); } - const newPolicy = await this.generateNewPolicy(config, location); + const newPolicy = await this.generateNewPolicy(config, location, request, savedObjectsClient); if (!newPolicy) { throw new Error( @@ -135,7 +137,11 @@ export class SyntheticsPrivateLocation { } try { - await this.createPolicy(newPolicy, this.getPolicyId(config, location)); + await this.createPolicy( + newPolicy, + this.getPolicyId(config, location, request), + savedObjectsClient + ); } catch (e) { this.server.logger.error(e); throw new Error( @@ -147,7 +153,11 @@ export class SyntheticsPrivateLocation { } } - async editMonitor(config: HeartbeatConfig, request: KibanaRequest) { + async editMonitor( + config: HeartbeatConfig, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract + ) { await this.checkPermissions( request, `Unable to update Synthetics package policy for monitor ${ @@ -157,19 +167,22 @@ export class SyntheticsPrivateLocation { const { locations } = config; - const allPrivateLocations = await getSyntheticsPrivateLocations( - this.server.authSavedObjectsClient! - ); + const allPrivateLocations = await getSyntheticsPrivateLocations(savedObjectsClient); const monitorPrivateLocations = locations.filter((loc) => !loc.isServiceManaged); for (const privateLocation of allPrivateLocations) { const hasLocation = monitorPrivateLocations?.some((loc) => loc.id === privateLocation.id); - const currId = this.getPolicyId(config, privateLocation); - const hasPolicy = await this.getMonitor(currId); + const currId = this.getPolicyId(config, privateLocation, request); + const hasPolicy = await this.getMonitor(currId, savedObjectsClient); try { if (hasLocation) { - const newPolicy = await this.generateNewPolicy(config, privateLocation); + const newPolicy = await this.generateNewPolicy( + config, + privateLocation, + request, + savedObjectsClient + ); if (!newPolicy) { throw new Error( @@ -180,12 +193,12 @@ export class SyntheticsPrivateLocation { } if (hasPolicy) { - await this.updatePolicy(newPolicy, currId); + await this.updatePolicy(newPolicy, currId, savedObjectsClient); } else { - await this.createPolicy(newPolicy, currId); + await this.createPolicy(newPolicy, currId, savedObjectsClient); } } else if (hasPolicy) { - const soClient = this.server.authSavedObjectsClient!; + const soClient = savedObjectsClient; const esClient = this.server.uptimeEsClient.baseESClient; try { await this.server.fleet.packagePolicyService.delete(soClient, esClient, [currId], { @@ -211,8 +224,12 @@ export class SyntheticsPrivateLocation { } } - async createPolicy(newPolicy: NewPackagePolicy, id: string) { - const soClient = this.server.authSavedObjectsClient; + async createPolicy( + newPolicy: NewPackagePolicy, + id: string, + savedObjectsClient: SavedObjectsClientContract + ) { + const soClient = savedObjectsClient; const esClient = this.server.uptimeEsClient.baseESClient; if (soClient && esClient) { return await this.server.fleet.packagePolicyService.create(soClient, esClient, newPolicy, { @@ -222,8 +239,12 @@ export class SyntheticsPrivateLocation { } } - async updatePolicy(updatedPolicy: NewPackagePolicy, id: string) { - const soClient = this.server.authSavedObjectsClient; + async updatePolicy( + updatedPolicy: NewPackagePolicy, + id: string, + savedObjectsClient: SavedObjectsClientContract + ) { + const soClient = savedObjectsClient; const esClient = this.server.uptimeEsClient.baseESClient; if (soClient && esClient) { return await this.server.fleet.packagePolicyService.update( @@ -238,9 +259,9 @@ export class SyntheticsPrivateLocation { } } - async getMonitor(id: string) { + async getMonitor(id: string, savedObjectsClient: SavedObjectsClientContract) { try { - const soClient = this.server.authSavedObjectsClient; + const soClient = savedObjectsClient; return await this.server.fleet.packagePolicyService.get(soClient!, id); } catch (e) { this.server.logger.debug(e); @@ -248,8 +269,12 @@ export class SyntheticsPrivateLocation { } } - async deleteMonitor(config: HeartbeatConfig, request: KibanaRequest) { - const soClient = this.server.authSavedObjectsClient; + async deleteMonitor( + config: HeartbeatConfig, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract + ) { + const soClient = savedObjectsClient; const esClient = this.server.uptimeEsClient.baseESClient; if (soClient && esClient) { @@ -273,7 +298,7 @@ export class SyntheticsPrivateLocation { await this.server.fleet.packagePolicyService.delete( soClient, esClient, - [this.getPolicyId(config, location)], + [this.getPolicyId(config, location, request)], { force: true, } diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts index 315ff4894cbf1..df8f5837e7d5d 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.test.ts @@ -5,7 +5,7 @@ * 2.0. */ import { loggerMock } from '@kbn/logging-mocks'; -import { KibanaRequest } from '@kbn/core/server'; +import { KibanaRequest, SavedObjectsClientContract } from '@kbn/core/server'; import { SyntheticsMonitorClient } from './synthetics_monitor_client'; import { UptimeServerSetup } from '../../legacy_uptime/lib/adapters'; import { SyntheticsService } from '../synthetics_service'; @@ -20,6 +20,10 @@ describe('SyntheticsMonitorClient', () => { const mockEsClient = { search: jest.fn(), }; + const savedObjectsClientMock = { + bulkUpdate: jest.fn(), + get: jest.fn(), + } as unknown as SavedObjectsClientContract; const mockRequest = {} as unknown as KibanaRequest; const logger = loggerMock.create(); @@ -85,7 +89,7 @@ describe('SyntheticsMonitorClient', () => { const client = new SyntheticsMonitorClient(syntheticsService, serverMock); client.privateLocationAPI.createMonitor = jest.fn(); - await client.addMonitor(monitor, id, mockRequest); + await client.addMonitor(monitor, id, mockRequest, savedObjectsClientMock); expect(syntheticsService.addConfig).toHaveBeenCalledTimes(1); expect(client.privateLocationAPI.createMonitor).toHaveBeenCalledTimes(1); @@ -98,7 +102,7 @@ describe('SyntheticsMonitorClient', () => { const client = new SyntheticsMonitorClient(syntheticsService, serverMock); client.privateLocationAPI.editMonitor = jest.fn(); - await client.editMonitor(monitor, id, mockRequest); + await client.editMonitor(monitor, id, mockRequest, savedObjectsClientMock); expect(syntheticsService.editConfig).toHaveBeenCalledTimes(1); expect(client.privateLocationAPI.editMonitor).toHaveBeenCalledTimes(1); @@ -110,7 +114,11 @@ describe('SyntheticsMonitorClient', () => { const client = new SyntheticsMonitorClient(syntheticsService, serverMock); client.privateLocationAPI.deleteMonitor = jest.fn(); - await client.deleteMonitor(monitor as unknown as SyntheticsMonitorWithId, mockRequest); + await client.deleteMonitor( + monitor as unknown as SyntheticsMonitorWithId, + mockRequest, + savedObjectsClientMock + ); expect(syntheticsService.deleteConfigs).toHaveBeenCalledTimes(1); expect(client.privateLocationAPI.deleteMonitor).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts index bd1c67de37241..67a6b69c62cc5 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_monitor/synthetics_monitor_client.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { KibanaRequest } from '@kbn/core/server'; +import { KibanaRequest, SavedObjectsClientContract } from '@kbn/core/server'; import { UptimeServerSetup } from '../../legacy_uptime/lib/adapters'; import { SyntheticsPrivateLocation } from '../private_location/synthetics_private_location'; import { SyntheticsService } from '../synthetics_service'; @@ -26,7 +26,12 @@ export class SyntheticsMonitorClient { this.privateLocationAPI = new SyntheticsPrivateLocation(server); } - async addMonitor(monitor: MonitorFields, id: string, request: KibanaRequest) { + async addMonitor( + monitor: MonitorFields, + id: string, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract + ) { await this.syntheticsService.setupIndexTemplates(); const config = formatHeartbeatRequest({ @@ -38,7 +43,7 @@ export class SyntheticsMonitorClient { const { privateLocations, publicLocations } = this.parseLocations(config); if (privateLocations.length > 0) { - await this.privateLocationAPI.createMonitor(config, request); + await this.privateLocationAPI.createMonitor(config, request, savedObjectsClient); } if (publicLocations.length > 0) { @@ -46,7 +51,12 @@ export class SyntheticsMonitorClient { } } - async editMonitor(editedMonitor: MonitorFields, id: string, request: KibanaRequest) { + async editMonitor( + editedMonitor: MonitorFields, + id: string, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract + ) { const editedConfig = formatHeartbeatRequest({ monitor: editedMonitor, monitorId: id, @@ -55,7 +65,7 @@ export class SyntheticsMonitorClient { const { publicLocations } = this.parseLocations(editedConfig); - await this.privateLocationAPI.editMonitor(editedConfig, request); + await this.privateLocationAPI.editMonitor(editedConfig, request, savedObjectsClient); if (publicLocations.length > 0) { return await this.syntheticsService.editConfig(editedConfig); @@ -64,8 +74,12 @@ export class SyntheticsMonitorClient { await this.syntheticsService.editConfig(editedConfig); } - async deleteMonitor(monitor: SyntheticsMonitorWithId, request: KibanaRequest) { - await this.privateLocationAPI.deleteMonitor(monitor, request); + async deleteMonitor( + monitor: SyntheticsMonitorWithId, + request: KibanaRequest, + savedObjectsClient: SavedObjectsClientContract + ) { + await this.privateLocationAPI.deleteMonitor(monitor, request, savedObjectsClient); return await this.syntheticsService.deleteConfigs([monitor]); } diff --git a/x-pack/plugins/threat_intelligence/common/test/utils.ts b/x-pack/plugins/threat_intelligence/common/test/utils.ts new file mode 100644 index 0000000000000..862b51ec5c35c --- /dev/null +++ b/x-pack/plugins/threat_intelligence/common/test/utils.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Use this to query elements by test-subj + * @param testSubject test subject to query elements by + * @returns + */ +export const getByTestSubj = (testSubject: string): HTMLElement => + document.querySelector(`[data-test-subj="${testSubject}"]`) as HTMLElement; diff --git a/x-pack/plugins/threat_intelligence/cypress/integration/sources/indicators.spec.ts b/x-pack/plugins/threat_intelligence/cypress/integration/sources/indicators.spec.ts index 964b51e09954d..117a7da337fa4 100644 --- a/x-pack/plugins/threat_intelligence/cypress/integration/sources/indicators.spec.ts +++ b/x-pack/plugins/threat_intelligence/cypress/integration/sources/indicators.spec.ts @@ -13,6 +13,12 @@ import { FLYOUT_TITLE, INDICATORS_TABLE, TOGGLE_FLYOUT_BUTTON, + FILTERS_GLOBAL_CONTAINER, + TIME_RANGE_PICKER, + QUERY_INPUT, + TABLE_CONTROLS, + INDICATOR_TYPE_CELL, + EMPTY_STATE, } from '../../screens/indicators'; import { login } from '../../tasks/login'; @@ -20,17 +26,36 @@ before(() => { login(); }); -describe('Indicators page', () => { +/** + * Time range extended to 15 years back to ensure fixtures are showing up correctly + * TODO: https://github.com/elastic/security-team/issues/4595 + */ +const THREAT_INTELLIGENCE_15Y_DATA = + '/app/security/threat_intelligence?indicators=(filterQuery:(language:kuery,query:%27%27),filters:!(),timeRange:(from:now-15y/d,to:now))'; + +const URL_WITH_CONTRADICTORY_FILTERS = + '/app/security/threat_intelligence?indicators=(filterQuery:(language:kuery,query:%27%27),filters:!((%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:threat.indicator.type,negate:!f,params:(query:file),type:phrase),query:(match_phrase:(threat.indicator.type:file))),(%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:threat.indicator.type,negate:!f,params:(query:url),type:phrase),query:(match_phrase:(threat.indicator.type:url)))),timeRange:(from:now/d,to:now/d))'; + +describe('Indicators page basics', () => { before(() => { - cy.visit('/app/security/threat_intelligence'); + cy.visit(THREAT_INTELLIGENCE_15Y_DATA); }); - it('should navigate to the indicators page, click on a flyout button and inspect flyout', () => { + it('should render the basic page elements', () => { cy.get(DEFAULT_LAYOUT_TITLE).should('have.text', 'Indicators'); cy.get(INDICATORS_TABLE).should('exist'); - cy.get(TOGGLE_FLYOUT_BUTTON).should('exist').first().click(); + cy.get(FILTERS_GLOBAL_CONTAINER).should('exist'); + + cy.get(`${FILTERS_GLOBAL_CONTAINER} ${TIME_RANGE_PICKER}`).should('exist'); + }); + + it('should show the indicator flyout on ioc click', () => { + // Just to know that the data is loaded. This will be replaced with some better mechanism. + cy.get(TABLE_CONTROLS).should('contain.text', 'Showing 1-25 of'); + + cy.get(TOGGLE_FLYOUT_BUTTON).first().click({ force: true }); cy.get(FLYOUT_TITLE).should('contain', 'Indicator:'); @@ -41,3 +66,49 @@ describe('Indicators page', () => { cy.get(FLYOUT_JSON).should('exist').and('contain.text', 'threat.indicator.type'); }); }); + +describe('Indicator page search', () => { + before(() => { + cy.visit(THREAT_INTELLIGENCE_15Y_DATA); + }); + + it('should narrow the results to url indicators when respective KQL search is executed', () => { + cy.get(QUERY_INPUT).should('exist').focus().type('threat.indicator.type: "url"{enter}'); + + // Check if query results are narrowed after search + cy.get(INDICATOR_TYPE_CELL).should('not.contain.text', 'file'); + + cy.get(QUERY_INPUT) + .should('exist') + .focus() + .clear() + .type('threat.indicator.type: "file"{enter}'); + + cy.get(INDICATOR_TYPE_CELL).should('not.contain.text', 'url'); + }); + + it('should go to the 2nd page', () => { + cy.get('[data-test-subj="pagination-button-1"]').click(); + + cy.get(TABLE_CONTROLS).should('contain.text', 'Showing 26-50 of'); + }); + + it('should go to page 1 when search input is cleared', () => { + cy.get(QUERY_INPUT).should('exist').focus().clear().type('{enter}'); + + cy.get(TABLE_CONTROLS).should('contain.text', 'Showing 1-25 of'); + }); + + describe('No items match search criteria', () => { + before(() => + // Contradictory filter set + cy.visit(URL_WITH_CONTRADICTORY_FILTERS) + ); + + it('should not display the table when contractictory filters are set', () => { + cy.get(FLYOUT_TABLE).should('not.exist'); + + cy.get(EMPTY_STATE).should('exist').and('contain.text', 'No results'); + }); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/cypress/plugins/index.js b/x-pack/plugins/threat_intelligence/cypress/plugins/index.js index b5c73bef307ed..954aca2ed76e4 100644 --- a/x-pack/plugins/threat_intelligence/cypress/plugins/index.js +++ b/x-pack/plugins/threat_intelligence/cypress/plugins/index.js @@ -5,7 +5,6 @@ * 2.0. */ -/// // *********************************************************** // This example plugins/index.js can be used to load plugins // @@ -19,11 +18,25 @@ // This function is called when a project is opened or re-opened (e.g. due to // the project's config changing) -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config +// eslint-disable-next-line import/no-extraneous-dependencies +const wp = require('@cypress/webpack-preprocessor'); + +module.exports = (on) => { + const options = { + webpackOptions: { + resolve: { + extensions: ['.ts', '.tsx', '.js'], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'ts-loader', + options: { transpileOnly: true }, + }, + ], + }, + }, + }; + on('file:preprocessor', wp(options)); }; diff --git a/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts b/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts index a9c928b1717b5..ccdf7c0fd4b0d 100644 --- a/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts +++ b/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts @@ -5,24 +5,30 @@ * 2.0. */ -import { TABLE_TEST_ID as FLYOUT_TABLE_TEST_ID } from '../../public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table'; -import { CODE_BLOCK_TEST_ID } from '../../public/modules/indicators/components/indicators_flyout_json/indicators_flyout_json'; -import { TABS_TEST_ID } from '../../public/modules/indicators/components/indicators_flyout/indicators_flyout'; -import { BUTTON_TEST_ID } from '../../public/modules/indicators/components/open_indicator_flyout_button/open_indicator_flyout_button'; -import { TABLE_TEST_ID as INDICATORS_TABLE_TEST_ID } from '../../public/modules/indicators/components/indicators_table/indicators_table'; -import { TITLE_TEST_ID as LAYOUT_TITLE_TEST_ID } from '../../public/components/layout'; -import { TITLE_TEST_ID as FLYOUT_TITLE_TEST_ID } from '../../public/modules/indicators/components/indicators_flyout/indicators_flyout'; +export const DEFAULT_LAYOUT_TITLE = `[data-test-subj="tiDefaultPageLayoutTitle"]`; -export const DEFAULT_LAYOUT_TITLE = `[data-test-subj="${LAYOUT_TITLE_TEST_ID}"]`; +export const INDICATORS_TABLE = `[data-test-subj="tiIndicatorsTable"]`; -export const INDICATORS_TABLE = `[data-test-subj="${INDICATORS_TABLE_TEST_ID}"]`; +export const TOGGLE_FLYOUT_BUTTON = `[data-test-subj="tiToggleIndicatorFlyoutButton"]`; -export const TOGGLE_FLYOUT_BUTTON = `[data-test-subj="${BUTTON_TEST_ID}"]`; +export const FLYOUT_TITLE = `[data-test-subj="tiIndicatorFlyoutTitle"]`; -export const FLYOUT_TITLE = `[data-test-subj="${FLYOUT_TITLE_TEST_ID}"]`; +export const FLYOUT_TABS = `[data-test-subj="tiIndicatorFlyoutTabs"]`; -export const FLYOUT_TABS = `[data-test-subj="${TABS_TEST_ID}"]`; +export const FLYOUT_TABLE = `[data-test-subj="tiFlyoutTableMemoryTable"]`; -export const FLYOUT_TABLE = `[data-test-subj="${FLYOUT_TABLE_TEST_ID}"]`; +export const FLYOUT_JSON = `[data-test-subj="tiFlyoutJsonCodeBlock"]`; -export const FLYOUT_JSON = `[data-test-subj="${CODE_BLOCK_TEST_ID}"]`; +export const FILTERS_GLOBAL_CONTAINER = '[data-test-subj="filters-global-container"]'; + +export const TIME_RANGE_PICKER = `[data-test-subj="superDatePickerToggleQuickMenuButton"]`; + +export const TIME_RANGE_LAST_YEAR = `[data-test-subj="superDatePickerCommonlyUsed_Last_1 year"]`; + +export const QUERY_INPUT = `[data-test-subj="iocListPageQueryInput"]`; + +export const EMPTY_STATE = '[data-test-subj="indicatorsTableEmptyState"]'; + +export const TABLE_CONTROLS = '[data-test-sub="dataGridControls"]'; + +export const INDICATOR_TYPE_CELL = '[data-gridcell-column-id="threat.indicator.type"]'; diff --git a/x-pack/plugins/threat_intelligence/cypress/support/commands.js b/x-pack/plugins/threat_intelligence/cypress/support/commands.js index 66f9435035571..1fec1c76430eb 100644 --- a/x-pack/plugins/threat_intelligence/cypress/support/commands.js +++ b/x-pack/plugins/threat_intelligence/cypress/support/commands.js @@ -4,29 +4,3 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/x-pack/plugins/threat_intelligence/cypress/support/index.js b/x-pack/plugins/threat_intelligence/cypress/support/index.js index 0e9350b188de5..8e4764197482d 100644 --- a/x-pack/plugins/threat_intelligence/cypress/support/index.js +++ b/x-pack/plugins/threat_intelligence/cypress/support/index.js @@ -5,6 +5,8 @@ * 2.0. */ +/* eslint-disable no-undef */ + // *********************************************************** // This example support/index.js is processed and // loaded automatically before your test files. @@ -25,3 +27,9 @@ import './commands'; // Alternatively you can use CommonJS syntax: // require('./commands') + +Cypress.on('uncaught:exception', (err) => { + if (err.message.includes('ResizeObserver')) { + return false; + } +}); diff --git a/x-pack/plugins/threat_intelligence/kibana.json b/x-pack/plugins/threat_intelligence/kibana.json index dd714b2ea1d4d..18493feca7c4f 100644 --- a/x-pack/plugins/threat_intelligence/kibana.json +++ b/x-pack/plugins/threat_intelligence/kibana.json @@ -8,5 +8,18 @@ "githubTeam": "protections-experience" }, "description": "Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats", - "requiredPlugins": ["data", "kibanaReact"] + "requiredPlugins": [ + "data", + "dataViews", + "unifiedSearch", + "kibanaUtils", + "navigation", + "kibanaReact" + ], + "requiredBundles": [ + "data", + "unifiedSearch", + "kibanaUtils", + "kibanaReact" + ] } diff --git a/x-pack/plugins/threat_intelligence/public/common/mocks/mock_use_kibana_for_filters.ts b/x-pack/plugins/threat_intelligence/public/common/mocks/mock_use_kibana_for_filters.ts new file mode 100644 index 0000000000000..cb77e0cec5523 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/common/mocks/mock_use_kibana_for_filters.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Filter } from '@kbn/es-query'; +import { BehaviorSubject } from 'rxjs'; +import * as hook from '../../hooks/use_kibana'; + +jest.mock('../../hooks/use_kibana'); + +interface MockConfig { + $filterUpdates?: BehaviorSubject; + getFilters?: jest.Mock; + setFilters?: jest.Mock; +} + +const defaultConfig = { + $filterUpdates: new BehaviorSubject(undefined), + getFilters: jest.fn().mockReturnValue([]), + setFilters: jest.fn(), +}; + +export const mockUseKibanaForFilters = ({ + $filterUpdates = defaultConfig.$filterUpdates, + getFilters = defaultConfig.getFilters, + setFilters = defaultConfig.setFilters, +}: MockConfig = defaultConfig) => { + const getFieldsForWildcard = jest.fn(); + + (hook as jest.Mocked).useKibana.mockReturnValue({ + services: { + data: { + query: { + filterManager: { + getFilters, + setFilters, + getUpdates$: () => $filterUpdates, + }, + }, + }, + dataViews: { getFieldsForWildcard }, + uiSettings: { get: () => ['mock-index'] }, + }, + } as any); + + return { getFieldsForWildcard, setFilters, getFilters, $filterUpdates }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx b/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx index 955e56f64ae2a..e398bb7ae1fdb 100644 --- a/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx +++ b/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx @@ -5,24 +5,113 @@ * 2.0. */ -import React from 'react'; -import { VFC } from 'react'; +import React, { FC } from 'react'; import { I18nProvider } from '@kbn/i18n-react'; import { coreMock } from '@kbn/core/public/mocks'; -import { KibanaContextProvider } from '../../hooks/use_kibana'; +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; +import type { IStorage } from '@kbn/kibana-utils-plugin/public'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; +import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; import { mockUiSetting } from './mock_kibana_ui_setting'; +import { KibanaContextProvider } from '../../hooks/use_kibana'; +import { Services, ThreatIntelligenceSecuritySolutionContext } from '../../types'; +import { SecuritySolutionContext } from '../../containers/security_solution_context'; -interface Props { - children: React.ReactNode; -} +const mockCoreStart = coreMock.createStart(); -export const TestProvidersComponent: VFC = ({ children }) => { - const mockCoreStart = coreMock.createStart(); - mockCoreStart.uiSettings.get.mockImplementation(mockUiSetting); +export const localStorageMock = (): IStorage => { + let store: Record = {}; + + return { + getItem: (key: string) => { + return store[key] || null; + }, + setItem: (key: string, value: unknown) => { + store[key] = value; + }, + clear() { + store = {}; + }, + removeItem(key: string) { + delete store[key]; + }, + }; +}; - return ( - - {children} - - ); +export const createTiStorageMock = () => { + const localStorage = localStorageMock(); + return { + localStorage, + storage: new Storage(localStorage), + }; }; + +const data = dataPluginMock.createStartContract(); +const { storage } = createTiStorageMock(); + +export const unifiedSearch = unifiedSearchPluginMock.createStartContract(); + +const dataServiceMock = { + ...data, + query: { + ...data.query, + savedQueries: { + ...data.query.savedQueries, + getAllSavedQueries: jest.fn(() => + Promise.resolve({ + id: '123', + attributes: { + total: 123, + }, + }) + ), + findSavedQueries: jest.fn(() => + Promise.resolve({ + total: 123, + queries: [], + }) + ), + }, + }, + search: { + ...data.search, + search: jest.fn().mockImplementation(() => ({ + subscribe: jest.fn().mockImplementation(() => ({ + error: jest.fn(), + next: jest.fn(), + unsubscribe: jest.fn(), + })), + pipe: jest.fn().mockImplementation(() => ({ + subscribe: jest.fn().mockImplementation(() => ({ + error: jest.fn(), + next: jest.fn(), + unsubscribe: jest.fn(), + })), + })), + })), + }, +}; + +const mockSecurityContext: ThreatIntelligenceSecuritySolutionContext = { + getFiltersGlobalComponent: + () => + ({ children }) => +
{children}
, +}; + +mockCoreStart.uiSettings.get.mockImplementation(mockUiSetting); + +const mockedServices = { + ...mockCoreStart, + data: dataServiceMock, + storage, + unifiedSearch, +} as unknown as Services; + +export const TestProvidersComponent: FC = ({ children }) => ( + + + {children} + + +); diff --git a/x-pack/plugins/threat_intelligence/public/components/empty_state/empty_state.stories.tsx b/x-pack/plugins/threat_intelligence/public/components/empty_state/empty_state.stories.tsx new file mode 100644 index 0000000000000..2524ae659db90 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/components/empty_state/empty_state.stories.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EmptyState } from './empty_state'; + +export default { + component: BasicEmptyState, + title: 'EmptyState', +}; + +export function BasicEmptyState() { + return ; +} diff --git a/x-pack/plugins/threat_intelligence/public/components/empty_state/empty_state.tsx b/x-pack/plugins/threat_intelligence/public/components/empty_state/empty_state.tsx new file mode 100644 index 0000000000000..b318c89ba68df --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/components/empty_state/empty_state.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiImage, EuiText, EuiTitle } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import icon from './no_results.svg'; + +const heights = { + tall: 490, + short: 250, +}; + +const panelStyle = { + maxWidth: 500, +}; + +export const EmptyState: React.FC<{ height?: keyof typeof heights }> = ({ height = 'tall' }) => { + return ( + + + + + + + + +

+ +

+
+

+ +

+
+
+ + + +
+
+
+
+
+ ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/components/empty_state/index.tsx b/x-pack/plugins/threat_intelligence/public/components/empty_state/index.tsx new file mode 100644 index 0000000000000..19f56bcb756b6 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/components/empty_state/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './empty_state'; diff --git a/x-pack/plugins/threat_intelligence/public/components/empty_state/no_results.svg b/x-pack/plugins/threat_intelligence/public/components/empty_state/no_results.svg new file mode 100644 index 0000000000000..addd06d989e85 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/components/empty_state/no_results.svg @@ -0,0 +1 @@ + diff --git a/x-pack/plugins/threat_intelligence/public/containers/filters_global.tsx b/x-pack/plugins/threat_intelligence/public/containers/filters_global.tsx new file mode 100644 index 0000000000000..96eec40008a25 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/containers/filters_global.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FC, useContext } from 'react'; +import { SecuritySolutionContext } from './security_solution_context'; + +export const FiltersGlobal: FC = ({ children }) => { + const contextValue = useContext(SecuritySolutionContext); + + if (!contextValue) { + throw new Error('FiltersGlobal can only be used within Security Solution Context'); + } + + const Component = contextValue.getFiltersGlobalComponent(); + + return {children}; +}; diff --git a/x-pack/plugins/threat_intelligence/public/containers/security_solution_context.tsx b/x-pack/plugins/threat_intelligence/public/containers/security_solution_context.tsx new file mode 100644 index 0000000000000..0dae7e9538c38 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/containers/security_solution_context.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createContext } from 'react'; +import { ThreatIntelligenceSecuritySolutionContext } from '../types'; + +export const SecuritySolutionContext = createContext< + ThreatIntelligenceSecuritySolutionContext | undefined +>(undefined); diff --git a/x-pack/plugins/threat_intelligence/public/hooks/use_integrations_page_link.tsx b/x-pack/plugins/threat_intelligence/public/hooks/use_integrations_page_link.tsx index d7346adf254d4..31bbe27ad017c 100644 --- a/x-pack/plugins/threat_intelligence/public/hooks/use_integrations_page_link.tsx +++ b/x-pack/plugins/threat_intelligence/public/hooks/use_integrations_page_link.tsx @@ -10,4 +10,4 @@ import { useKibana } from './use_kibana'; const useKibanaBasePath = (): string => useKibana().services.http.basePath.get(); export const useIntegrationsPageLink = () => - `${useKibanaBasePath()}/app/integrations/browse?q=threat%20intelligence`; + `${useKibanaBasePath()}/app/integrations/browse/threat_intel`; diff --git a/x-pack/plugins/threat_intelligence/public/index.ts b/x-pack/plugins/threat_intelligence/public/index.ts index 9242c7af8d8e4..3f9cef413aa79 100755 --- a/x-pack/plugins/threat_intelligence/public/index.ts +++ b/x-pack/plugins/threat_intelligence/public/index.ts @@ -11,4 +11,8 @@ export function plugin() { return new ThreatIntelligencePlugin(); } -export type { ThreatIntelligencePluginSetup, ThreatIntelligencePluginStart } from './types'; +export type { + ThreatIntelligencePluginSetup, + ThreatIntelligencePluginStart, + ThreatIntelligenceSecuritySolutionContext, +} from './types'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/index.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/index.tsx new file mode 100644 index 0000000000000..b337d57fe4e1f --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './indicators_table'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx index e5dc87d0cf68b..f0bb86c8ce2e3 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx @@ -40,8 +40,8 @@ export function WithIndicators() { return ( ); } + +export function WithNoIndicators() { + return ( + + ); +} diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx index aa5ad7bbc8e5b..1768c78c72675 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx @@ -13,13 +13,13 @@ import { TestProvidersComponent } from '../../../../common/mocks/test_providers' const stub = () => {}; const tableProps: IndicatorsTableProps = { - loadData: stub, onChangePage: stub, onChangeItemsPerPage: stub, indicators: [], pagination: { pageSize: 10, pageIndex: 0, pageSizeOptions: [10] }, indicatorCount: 0, firstLoad: false, + loading: false, }; const indicatorsFixture = [ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx index 6a523d5ec454d..e332212ee9d1b 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx @@ -19,6 +19,7 @@ import { Indicator, RawIndicatorFieldId } from '../../../../../common/types/indi import { UseIndicatorsValue } from '../../hooks/use_indicators'; import { cellRendererFactory, ComputedIndicatorFieldId } from './cell_renderer'; import { ActionsRowCell } from './actions_row_cell'; +import { EmptyState } from '../../../../components/empty_state'; interface Column { id: RawIndicatorFieldId | ComputedIndicatorFieldId; @@ -70,7 +71,7 @@ const columns: Column[] = [ }, ]; -export type IndicatorsTableProps = UseIndicatorsValue; +export type IndicatorsTableProps = Omit; export const TABLE_TEST_ID = 'tiIndicatorsTable'; @@ -81,6 +82,7 @@ export const IndicatorsTable: VFC = ({ onChangeItemsPerPage, pagination, firstLoad, + loading, }) => { const [visibleColumns, setVisibleColumns] = useState>( columns.map((column) => column.id) @@ -114,6 +116,10 @@ export const IndicatorsTable: VFC = ({ }, ]; + if (!loading && !indicatorCount) { + return ; + } + return (
{} }, +}; + +const Template: ComponentStory = (args) => ( + + + {' '} + + +); + +export const Basic = Template.bind({}); + +Basic.args = { + indexPatterns: [], + filterManager: {} as any, + filters: [], + filterQuery: { language: 'kuery', query: '' }, +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.test.tsx new file mode 100644 index 0000000000000..cd67f5cbeca56 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.test.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { render, screen, act, waitFor } from '@testing-library/react'; +import { QueryBar } from './query_bar'; +import userEvent from '@testing-library/user-event'; + +import { FilterManager } from '@kbn/data-plugin/public'; + +import { coreMock } from '@kbn/core/public/mocks'; +import { TestProvidersComponent, unifiedSearch } from '../../../../common/mocks/test_providers'; +import { getByTestSubj } from '../../../../../common/test/utils'; +import { setAutocomplete } from '@kbn/unified-search-plugin/public/services'; + +const mockUiSettingsForFilterManager = coreMock.createStart().uiSettings; + +const filterManager = new FilterManager(mockUiSettingsForFilterManager); + +describe('QueryBar ', () => { + const onSubmitQuery = jest.fn(); + const onSubmitDateRange = jest.fn(); + const onSavedQuery = jest.fn(); + const onChangedQuery = jest.fn(); + + beforeEach(() => { + setAutocomplete(unifiedSearch.autocomplete); + }); + + beforeEach(async () => { + await act(async () => { + render( + + + + ); + }); + + // Some parts of this are lazy loaded, we need to wait for quert input to appear before tests can be done + await waitFor(() => screen.queryByRole('input')); + }); + + it('should call onSubmitDateRange when date range is changed', async () => { + expect(getByTestSubj('superDatePickerToggleQuickMenuButton')).toBeInTheDocument(); + + await act(async () => { + userEvent.click(getByTestSubj('superDatePickerToggleQuickMenuButton')); + }); + + await act(async () => { + screen.getByText('Apply').click(); + }); + + expect(onSubmitDateRange).toHaveBeenCalled(); + }); + + it('should call onSubmitQuery when query is changed', async () => { + const queryInput = getByTestSubj('queryInput'); + + await act(async () => { + userEvent.type(queryInput, 'one_serious_query'); + }); + + expect(onChangedQuery).toHaveBeenCalledWith( + expect.objectContaining({ language: 'kuery', query: expect.any(String) }) + ); + + await act(async () => { + screen.getByText('Refresh').click(); + }); + + expect(onSubmitQuery).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.tsx new file mode 100644 index 0000000000000..c6737535c65ab --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo, useCallback } from 'react'; +import deepEqual from 'fast-deep-equal'; + +import { DataView } from '@kbn/data-views-plugin/public'; +import type { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; +import { + FilterManager, + TimeHistory, + SavedQuery, + SavedQueryTimeFilter, +} from '@kbn/data-plugin/public'; +import { SearchBar, SearchBarProps } from '@kbn/unified-search-plugin/public'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; + +interface QueryPayload { + dateRange: TimeRange; + query?: Query | AggregateQuery; +} + +/** + * User defined type guard to verify if we are dealing with Query param + * @param query query param to test + * @returns + */ +const isQuery = (query?: Query | AggregateQuery | null): query is Query => { + return !!query && Object.prototype.hasOwnProperty.call(query, 'query'); +}; + +export interface QueryBarComponentProps { + dataTestSubj?: string; + dateRangeFrom?: string; + dateRangeTo?: string; + hideSavedQuery?: boolean; + indexPatterns: DataView[]; + isLoading?: boolean; + isRefreshPaused?: boolean; + filterQuery: Query; + filterManager: FilterManager; + filters: Filter[]; + onRefresh: VoidFunction; + onChangedQuery?: (query: Query) => void; + onChangedDateRange?: (dateRange?: TimeRange) => void; + onSubmitQuery: (query: Query, timefilter?: SavedQueryTimeFilter) => void; + onSubmitDateRange: (dateRange?: TimeRange) => void; + refreshInterval?: number; + savedQuery?: SavedQuery; + onSavedQuery: (savedQuery: SavedQuery | undefined) => void; + displayStyle?: SearchBarProps['displayStyle']; +} + +export const INDICATOR_FILTER_DROP_AREA = 'indicator-filter-drop-area'; + +export const QueryBar = memo( + ({ + dateRangeFrom, + dateRangeTo, + hideSavedQuery = false, + indexPatterns, + isLoading = false, + isRefreshPaused, + filterQuery, + filterManager, + filters, + refreshInterval, + savedQuery, + dataTestSubj, + displayStyle, + onChangedQuery, + onSubmitQuery, + onChangedDateRange, + onSubmitDateRange, + onSavedQuery, + onRefresh, + }) => { + const onQuerySubmit = useCallback( + ({ query, dateRange }: QueryPayload) => { + if (isQuery(query) && !deepEqual(query, filterQuery)) { + onSubmitQuery(query); + } + + if (dateRange != null) { + onSubmitDateRange(dateRange); + } + }, + [filterQuery, onSubmitDateRange, onSubmitQuery] + ); + + const onQueryChange = useCallback( + ({ query, dateRange }: QueryPayload) => { + if (!onChangedQuery) { + return; + } + + if (isQuery(query) && !deepEqual(query, filterQuery)) { + onChangedQuery(query); + } + + if (onChangedDateRange && dateRange != null) { + onChangedDateRange(dateRange); + } + }, + [filterQuery, onChangedDateRange, onChangedQuery] + ); + + const onSavedQueryUpdated = useCallback( + (savedQueryUpdated: SavedQuery) => { + const { query: newQuery, filters: newFilters, timefilter } = savedQueryUpdated.attributes; + onSubmitQuery(newQuery, timefilter); + filterManager.setFilters(newFilters || []); + onSavedQuery(savedQueryUpdated); + }, + [filterManager, onSubmitQuery, onSavedQuery] + ); + + const onClearSavedQuery = useCallback(() => { + if (savedQuery != null) { + onSubmitQuery({ + query: '', + language: savedQuery.attributes.query.language, + }); + filterManager.setFilters([]); + onSavedQuery(undefined); + } + }, [filterManager, onSubmitQuery, onSavedQuery, savedQuery]); + + const onFiltersUpdated = useCallback( + (newFilters: Filter[]) => filterManager.setFilters(newFilters), + [filterManager] + ); + + const timeHistory = useMemo(() => new TimeHistory(new Storage(localStorage)), []); + + return ( + + ); + } +); + +QueryBar.displayName = 'QueryBar'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/index.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/index.ts new file mode 100644 index 0000000000000..d24069f8a04ab --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_filters'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.test.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.test.ts new file mode 100644 index 0000000000000..6d74dc7f3e48e --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.test.ts @@ -0,0 +1,163 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mockUseKibanaForFilters } from '../../../../common/mocks/mock_use_kibana_for_filters'; +import { renderHook, act, RenderHookResult, Renderer } from '@testing-library/react-hooks'; +import { useFilters, UseFiltersValue } from './use_filters'; + +import { useHistory, useLocation } from 'react-router-dom'; +import { Filter } from '@kbn/es-query'; + +jest.mock('react-router-dom', () => ({ + useLocation: jest.fn().mockReturnValue({ + search: '', + }), + useHistory: jest.fn().mockReturnValue({ replace: jest.fn() }), +})); + +describe('useFilters()', () => { + let hookResult: RenderHookResult>; + let mockRef: ReturnType; + + const renderUseFiltersHook = async () => { + await act(async () => { + hookResult = renderHook(() => useFilters()); + }); + }; + + describe('when mounted', () => { + beforeEach(async () => { + mockRef = mockUseKibanaForFilters(); + + await renderUseFiltersHook(); + }); + + it('should try to fetch available fields', () => { + expect(mockRef.getFieldsForWildcard).toHaveBeenCalled(); + }); + + it('should have valid initial filterQuery value', () => { + expect(hookResult.result.current.filterQuery).toMatchObject({ language: 'kuery', query: '' }); + }); + + describe('when query string is populated', () => { + it('should try to compute the initial state based on query string', async () => { + (useLocation as jest.Mock).mockReturnValue({ + search: + '?indicators=(filterQuery:(language:kuery,query:%27threat.indicator.type%20:%20"file"%20%27),filters:!(),timeRange:(from:now/d,to:now/d))', + }); + + await renderUseFiltersHook(); + + expect(hookResult.result.current.filterQuery).toMatchObject({ + language: 'kuery', + query: 'threat.indicator.type : "file" ', + }); + }); + }); + }); + + describe('when filter values change', () => { + const historyReplace = jest.fn(); + beforeEach(async () => { + mockRef = mockUseKibanaForFilters(); + + await renderUseFiltersHook(); + + (useHistory as jest.Mock).mockReturnValue({ replace: historyReplace }); + + historyReplace.mockClear(); + }); + + describe('when filters change', () => { + it('should update history entry', async () => { + const newFilterEntry = { query: { filter: 'new_filter' }, meta: {} }; + + // Make sure new filter value is returned from filter manager before signalling an update + // to subscribers + mockRef.getFilters.mockReturnValue([newFilterEntry] as Filter[]); + + // Emit the filterManager update to see how it propagates to local component state + await act(async () => { + mockRef.$filterUpdates.next(void 0); + }); + + // Internally, filters should be loaded from filterManager + expect(mockRef.getFilters).toHaveBeenCalled(); + + // Serialized into browser query string + expect(historyReplace).toHaveBeenCalledWith( + expect.objectContaining({ search: expect.stringMatching(/new_filter/) }) + ); + + // And updated in local hook state + expect(hookResult.result.current.filters).toContain(newFilterEntry); + }); + }); + + describe('when time range changes', () => { + const newTimeRange = { from: 'dawnOfTime', to: 'endOfTime' }; + + const updateTime = async () => { + // After new time range is selected + await act(async () => { + hookResult.result.current.handleSubmitTimeRange(newTimeRange); + }); + }; + + it('should update its local state', async () => { + expect(hookResult.result.current.timeRange).toBeDefined(); + expect(hookResult.result.current.timeRange).not.toEqual(newTimeRange); + + // After new time range is selected + await updateTime(); + + // Local filter state should be updated + expect(hookResult.result.current.timeRange).toEqual(newTimeRange); + }); + + it('should update history entry', async () => { + expect(historyReplace).not.toHaveBeenCalledWith( + expect.objectContaining({ search: expect.stringMatching(/dawnOfTime/) }) + ); + + // After new time range is selected + await updateTime(); + + // Query string should be updated + expect(historyReplace).toHaveBeenCalledWith( + expect.objectContaining({ search: expect.stringMatching(/dawnOfTime/) }) + ); + }); + }); + + describe('when filterQuery changes', () => { + beforeEach(async () => { + // After new time range is selected + await act(async () => { + hookResult.result.current.handleSubmitQuery({ + query: 'threat.indicator.type : *', + language: 'kuery', + }); + }); + }); + + it('should update history entry', async () => { + expect(historyReplace).toHaveBeenCalledWith( + expect.objectContaining({ search: expect.stringMatching(/threat\.indicator\.type/) }) + ); + }); + + it('should update local state', () => { + expect(hookResult.result.current.filterQuery).toMatchObject({ + language: 'kuery', + query: 'threat.indicator.type : *', + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.ts new file mode 100644 index 0000000000000..75fb2c1ed911a --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.ts @@ -0,0 +1,150 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DataViewBase, Filter, Query, TimeRange } from '@kbn/es-query'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useHistory, useLocation } from 'react-router-dom'; +import deepEqual from 'fast-deep-equal'; +import useAsync from 'react-use/lib/useAsync'; +import type { FilterManager, SavedQuery } from '@kbn/data-plugin/public'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { DEFAULT_THREAT_INDEX_KEY } from '../../../../../common/constants'; +import { useKibana } from '../../../../hooks/use_kibana'; +import { + DEFAULT_QUERY, + DEFAULT_TIME_RANGE, + encodeState, + FILTERS_QUERYSTRING_NAMESPACE, + stateFromQueryParams, +} from './utils'; + +export interface UseFiltersValue { + timeRange?: TimeRange; + indexPatterns: DataView[]; + filters: Filter[]; + filterQuery: Query; + handleSavedQuery: (savedQuery: SavedQuery | undefined) => void; + handleSubmitTimeRange: (timeRange?: TimeRange) => void; + handleSubmitQuery: (filterQuery: Query) => void; + filterManager: FilterManager; + savedQuery?: SavedQuery; +} + +/** + * Custom react hook housing logic for KQL bar + * @returns Filters and TimeRange for use with KQL bar + */ +export const useFilters = (): UseFiltersValue => { + const { pathname: browserPathName, search } = useLocation(); + const history = useHistory(); + const [savedQuery, setSavedQuery] = useState(undefined); + + const { + services: { + data: { + query: { filterManager }, + }, + dataViews, + uiSettings, + }, + } = useKibana(); + + const indexNames = useMemo(() => uiSettings.get(DEFAULT_THREAT_INDEX_KEY), [uiSettings]); + + const dynamicIndexPatternsAsyncState = useAsync(async (): Promise => { + if (indexNames.length === 0) { + return []; + } + + return [ + { + title: indexNames.join(','), + fields: await dataViews.getFieldsForWildcard({ + pattern: indexNames.join(','), + allowNoIndex: true, + }), + }, + ]; + }, [indexNames]); + + const indexPatterns = useMemo( + () => + dynamicIndexPatternsAsyncState.value?.map((dynamicIndexPattern) => ({ + title: dynamicIndexPattern.title ?? '', + id: dynamicIndexPattern.id ?? '', + fields: dynamicIndexPattern.fields, + })) || [], + [dynamicIndexPatternsAsyncState.value] + ) as DataView[]; + + // Filters are picked using the UI widgets + const [filters, setFilters] = useState([]); + + // Time range is self explanatory + const [timeRange, setTimeRange] = useState(DEFAULT_TIME_RANGE); + + // filterQuery is raw kql query that user can type in to filter results + const [filterQuery, setFilterQuery] = useState(DEFAULT_QUERY); + + // Serialize filters into query string + useEffect(() => { + const filterStateAsString = encodeState({ filters, filterQuery, timeRange }); + + if (!deepEqual(filterManager.getFilters(), filters)) { + filterManager.setFilters(filters); + } + + history.replace({ + pathname: browserPathName, + search: `${FILTERS_QUERYSTRING_NAMESPACE}=${filterStateAsString}`, + }); + }, [browserPathName, filterManager, filterQuery, filters, history, timeRange]); + + // Sync filterManager to local state (after they are changed from the ui) + useEffect(() => { + const subscription = filterManager.getUpdates$().subscribe(() => { + setFilters(filterManager.getFilters()); + }); + + return () => subscription.unsubscribe(); + }, [filterManager]); + + // Update local state with filter values from the url (on initial mount) + useEffect(() => { + const { + filters: filtersFromQuery, + timeRange: timeRangeFromQuery, + filterQuery: filterQueryFromQuery, + } = stateFromQueryParams(search); + + setTimeRange(timeRangeFromQuery); + setFilterQuery(filterQueryFromQuery); + setFilters(filtersFromQuery); + + // We only want to have it done on initial render with initial 'search' value; + // that is why 'search' is ommited from the deps array + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [filterManager]); + + const onSavedQuery = useCallback( + (newSavedQuery: SavedQuery | undefined) => setSavedQuery(newSavedQuery), + [] + ); + + return { + timeRange, + indexPatterns, + filters, + filterQuery, + handleSavedQuery: onSavedQuery, + handleSubmitTimeRange: setTimeRange, + handleSubmitQuery: setFilterQuery, + filterManager, + savedQuery, + }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.test.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.test.ts new file mode 100644 index 0000000000000..df0bffa1c85f1 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { stateFromQueryParams } from './utils'; + +describe('encodeState()', () => {}); + +describe('stateFromQueryParams()', () => { + it('should return valid state object from invalid query', () => { + expect(stateFromQueryParams('')).toMatchObject({ + filterQuery: expect.any(Object), + timeRange: expect.any(Object), + filters: expect.any(Array), + }); + }); + + it('should return valid state when indicators fields is invalid', () => { + expect(stateFromQueryParams('?indicators=')).toMatchObject({ + filterQuery: expect.any(Object), + timeRange: expect.any(Object), + filters: expect.any(Array), + }); + }); + + it('should deserialize valid query state', () => { + expect( + stateFromQueryParams( + '?indicators=(filterQuery:(language:kuery,query:%27threat.indicator.type%20:%20"file"%20or%20threat.indicator.type%20:%20"url"%20%27),filters:!((%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:_id,negate:!f,type:exists,value:exists),query:(exists:(field:_id)))),timeRange:(from:now-1y/d,to:now))' + ) + ).toMatchInlineSnapshot(` + Object { + "filterQuery": Object { + "language": "kuery", + "query": "threat.indicator.type : \\"file\\" or threat.indicator.type : \\"url\\" ", + }, + "filters": Array [ + Object { + "$state": Object { + "store": "appState", + }, + "meta": Object { + "alias": null, + "disabled": false, + "index": "", + "key": "_id", + "negate": false, + "type": "exists", + "value": "exists", + }, + "query": Object { + "exists": Object { + "field": "_id", + }, + }, + }, + ], + "timeRange": Object { + "from": "now-1y/d", + "to": "now", + }, + } + `); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.ts new file mode 100644 index 0000000000000..f020367ff3cb1 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Filter, Query, TimeRange } from '@kbn/es-query'; +import { parse } from 'query-string'; +import { decode, encode } from 'rison-node'; + +export const FILTERS_QUERYSTRING_NAMESPACE = 'indicators'; + +export const DEFAULT_TIME_RANGE = { from: 'now/d', to: 'now/d' }; + +export const DEFAULT_QUERY: Readonly = { query: '', language: 'kuery' }; + +const INITIAL_FILTERS_STATE: Readonly = { + filters: [], + timeRange: DEFAULT_TIME_RANGE, + filterQuery: DEFAULT_QUERY, +}; + +interface SerializableFilterState { + timeRange?: TimeRange; + filterQuery: Query; + filters: Filter[]; +} + +/** + * Converts filter state to query string + * @param filterState Serializable filter state to convert into query string + * @returns + */ +export const encodeState = (filterState: SerializableFilterState): string => + encode(filterState as any); + +/** + * + * @param encodedFilterState Serialized filter state to decode + * @returns + */ +const decodeState = (encodedFilterState: string): SerializableFilterState | null => + decode(encodedFilterState) as unknown as SerializableFilterState; + +/** + * Find and convert filter state stored within query string into object literal + * @param searchString Brower query string containing encoded filter information, within single query field + * @returns SerializableFilterState with all the relevant fields ready to use + */ +export const stateFromQueryParams = (searchString: string): SerializableFilterState => { + const { [FILTERS_QUERYSTRING_NAMESPACE]: filtersSerialized } = parse(searchString); + + if (!filtersSerialized) { + return INITIAL_FILTERS_STATE; + } + + if (Array.isArray(filtersSerialized)) { + throw new Error('serialized filters should not be an array'); + } + + const deserializedFilters = decodeState(filtersSerialized); + + if (!deserializedFilters) { + return INITIAL_FILTERS_STATE; + } + + return { + ...INITIAL_FILTERS_STATE, + ...deserializedFilters, + timeRange: deserializedFilters.timeRange || DEFAULT_TIME_RANGE, + }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx index 37aecb056b470..26ac398bfddc1 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx @@ -6,7 +6,7 @@ */ import { renderHook, act } from '@testing-library/react-hooks'; -import { useIndicators, RawIndicatorsResponse } from './use_indicators'; +import { useIndicators, RawIndicatorsResponse, UseIndicatorsParams } from './use_indicators'; import { BehaviorSubject, throwError } from 'rxjs'; import { IKibanaSearchResponse } from '@kbn/data-plugin/common'; import { mockSearchService } from '../../../common/mocks/mock_kibana_search_service'; @@ -16,6 +16,11 @@ jest.mock('../../../hooks/use_kibana'); const indicatorsResponse = { rawResponse: { hits: { hits: [], total: 0 } } }; +const useIndicatorsParams: UseIndicatorsParams = { + filters: [], + filterQuery: { query: '', language: 'kuery' }, +}; + describe('useIndicators()', () => { let mockSearch: ReturnType; @@ -25,7 +30,7 @@ describe('useIndicators()', () => { }); beforeEach(async () => { - renderHook(() => useIndicators()); + renderHook(() => useIndicators(useIndicatorsParams)); }); it('should query the database for threat indicators', async () => { @@ -37,11 +42,68 @@ describe('useIndicators()', () => { }); }); + describe('when filters change', () => { + beforeEach(() => { + mockSearch = mockSearchService(new BehaviorSubject(indicatorsResponse)); + }); + + it('should query the database again and reset page to 0', async () => { + const hookResult = renderHook((props) => useIndicators(props), { + initialProps: useIndicatorsParams, + }); + + expect(mockSearch.search).toHaveBeenCalledTimes(1); + expect(mockSearch.search).toHaveBeenLastCalledWith( + expect.objectContaining({ + params: expect.objectContaining({ body: expect.objectContaining({ from: 0 }) }), + }), + expect.objectContaining({ + abortSignal: expect.any(AbortSignal), + }) + ); + + // Change page + await act(async () => hookResult.result.current.onChangePage(42)); + + expect(mockSearch.search).toHaveBeenLastCalledWith( + expect.objectContaining({ + params: expect.objectContaining({ body: expect.objectContaining({ from: 42 * 25 }) }), + }), + expect.objectContaining({ + abortSignal: expect.any(AbortSignal), + }) + ); + + expect(mockSearch.search).toHaveBeenCalledTimes(2); + + // Change filters + act(() => + hookResult.rerender({ + ...useIndicatorsParams, + filterQuery: { language: 'kuery', query: "threat.indicator.type: 'file'" }, + }) + ); + + // From range should be reset to 0 + expect(mockSearch.search).toHaveBeenCalledTimes(3); + expect(mockSearch.search).toHaveBeenLastCalledWith( + expect.objectContaining({ + params: expect.objectContaining({ body: expect.objectContaining({ from: 0 }) }), + }), + expect.objectContaining({ + abortSignal: expect.any(AbortSignal), + }) + ); + }); + }); + describe('when query fails', () => { beforeEach(async () => { mockSearch = mockSearchService(throwError(() => new Error('some random error'))); - renderHook(() => useIndicators()); + renderHook((props) => useIndicators(props), { + initialProps: useIndicatorsParams, + }); }); it('should show an error', async () => { @@ -75,8 +137,9 @@ describe('useIndicators()', () => { }); it('should call mapping function on every hit', async () => { - const { result } = renderHook(() => useIndicators()); - + const { result } = renderHook((props) => useIndicators(props), { + initialProps: useIndicatorsParams, + }); expect(result.current.indicatorCount).toEqual(1); }); }); @@ -92,7 +155,7 @@ describe('useIndicators()', () => { describe('when page changes', () => { it('should run the query again with pagination parameters', async () => { - const { result } = renderHook(() => useIndicators()); + const { result } = renderHook(() => useIndicators(useIndicatorsParams)); await act(async () => { result.current.onChangePage(42); @@ -129,13 +192,13 @@ describe('useIndicators()', () => { describe('when page size changes', () => { it('should fetch the first page and update internal page size', async () => { - const { result } = renderHook(() => useIndicators()); + const { result } = renderHook(() => useIndicators(useIndicatorsParams)); await act(async () => { result.current.onChangeItemsPerPage(50); }); - expect(mockSearch.search).toHaveBeenCalledTimes(2); + expect(mockSearch.search).toHaveBeenCalledTimes(3); expect(mockSearch.search).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts index 11d373ff98f19..3b4cfc92f1a83 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.ts @@ -11,8 +11,9 @@ import { isCompleteResponse, isErrorResponse, } from '@kbn/data-plugin/common'; -import { useCallback, useEffect, useRef, useState } from 'react'; -import { Subscription } from 'rxjs'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import type { Subscription } from 'rxjs'; +import { buildEsQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { Indicator } from '../../../../common/types/indicator'; import { useKibana } from '../../../hooks/use_kibana'; import { DEFAULT_THREAT_INDEX_KEY } from '../../../../common/constants'; @@ -21,14 +22,21 @@ const PAGE_SIZES = [10, 25, 50]; export const DEFAULT_PAGE_SIZE = PAGE_SIZES[1]; +export interface UseIndicatorsParams { + filterQuery: Query; + filters: Filter[]; + timeRange?: TimeRange; +} + export interface UseIndicatorsValue { - loadData: (from: number, size: number) => void; + handleRefresh: () => void; indicators: Indicator[]; indicatorCount: number; pagination: Pagination; onChangeItemsPerPage: (value: number) => void; onChangePage: (value: number) => void; firstLoad: boolean; + loading: boolean; } export interface RawIndicatorsResponse { @@ -44,22 +52,31 @@ interface Pagination { pageSizeOptions: number[]; } -export const useIndicators = (): UseIndicatorsValue => { +const THREAT_QUERY_BASE = 'event.type: indicator and event.category : threat'; + +export const useIndicators = ({ + filters, + filterQuery, + timeRange, +}: UseIndicatorsParams): UseIndicatorsValue => { const { services: { data: { search: searchService }, uiSettings, }, } = useKibana(); + const defaultThreatIndices = useMemo( + () => uiSettings.get(DEFAULT_THREAT_INDEX_KEY), + [uiSettings] + ); - const defaultThreatIndices = uiSettings.get(DEFAULT_THREAT_INDEX_KEY); - - const searchSubscription$ = useRef(new Subscription()); + const searchSubscription$ = useRef(); const abortController = useRef(new AbortController()); const [indicators, setIndicators] = useState([]); const [indicatorCount, setIndicatorCount] = useState(0); const [firstLoad, setFirstLoad] = useState(true); + const [loading, setLoading] = useState(true); const [pagination, setPagination] = useState({ pageIndex: 0, @@ -67,10 +84,44 @@ export const useIndicators = (): UseIndicatorsValue => { pageSizeOptions: PAGE_SIZES, }); - const refresh = useCallback( + const queryToExecute = useMemo( + () => + buildEsQuery( + undefined, + [ + { + query: THREAT_QUERY_BASE, + language: 'kuery', + }, + { + query: filterQuery.query as string, + language: 'kuery', + }, + ], + [ + ...filters, + { + query: { + range: { + ['@timestamp']: { + gte: timeRange?.from, + lte: timeRange?.to, + }, + }, + }, + meta: {}, + }, + ] + ), + [filterQuery, filters, timeRange?.from, timeRange?.to] + ); + + const loadData = useCallback( async (from: number, size: number) => { abortController.current = new AbortController(); + setLoading(true); + searchSubscription$.current = searchService .search>( { @@ -80,26 +131,7 @@ export const useIndicators = (): UseIndicatorsValue => { size, from, fields: [{ field: '*', include_unmapped: true }], - query: { - bool: { - must: [ - { - term: { - 'event.category': { - value: 'threat', - }, - }, - }, - { - term: { - 'event.type': { - value: 'indicator', - }, - }, - }, - ], - }, - }, + query: queryToExecute, }, }, }, @@ -113,22 +145,24 @@ export const useIndicators = (): UseIndicatorsValue => { setIndicatorCount(response.rawResponse.hits.total || 0); if (isCompleteResponse(response)) { - searchSubscription$.current.unsubscribe(); + searchSubscription$.current?.unsubscribe(); } else if (isErrorResponse(response)) { - searchSubscription$.current.unsubscribe(); + searchSubscription$.current?.unsubscribe(); } setFirstLoad(false); + setLoading(false); }, error: (msg) => { searchService.showError(msg); - searchSubscription$.current.unsubscribe(); + searchSubscription$.current?.unsubscribe(); setFirstLoad(false); + setLoading(false); }, }); }, - [defaultThreatIndices, searchService] + [queryToExecute, defaultThreatIndices, searchService] ); const onChangeItemsPerPage = useCallback( @@ -139,32 +173,38 @@ export const useIndicators = (): UseIndicatorsValue => { pageIndex: 0, })); - refresh(0, pageSize); + loadData(0, pageSize); }, - [refresh, setPagination] + [loadData] ); const onChangePage = useCallback( async (pageIndex) => { setPagination((currentPagination) => ({ ...currentPagination, pageIndex })); - refresh(pageIndex * pagination.pageSize, pagination.pageSize); + loadData(pageIndex * pagination.pageSize, pagination.pageSize); }, - [pagination.pageSize, refresh] + [loadData, pagination.pageSize] ); + const handleRefresh = useCallback(() => { + onChangePage(0); + }, [onChangePage]); + + // Initial data load (on mount) useEffect(() => { - refresh(0, DEFAULT_PAGE_SIZE); + handleRefresh(); return () => abortController.current.abort(); - }, [refresh]); + }, [handleRefresh]); return { - loadData: refresh, indicators, indicatorCount, pagination, onChangePage, onChangeItemsPerPage, firstLoad, + loading, + handleRefresh, }; }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_total_count.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_total_count.tsx index 44e1644302c18..04c057c6a4eac 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_total_count.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_total_count.tsx @@ -23,7 +23,7 @@ export const useIndicatorsTotalCount = () => { }, } = useKibana(); const [count, setCount] = useState(0); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, setIsLoading] = useState(true); useEffect(() => { const defaultThreatIndex = uiSettings.get(DEFAULT_THREAT_INDEX_KEY); @@ -57,7 +57,6 @@ export const useIndicatorsTotalCount = () => { }, }; - setIsLoading(true); searchService .search>(req) .subscribe({ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx index aa8ae10275c40..92ea0597d6bf7 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx @@ -11,13 +11,19 @@ import { TestProvidersComponent } from '../../common/mocks/test_providers'; import { IndicatorsPage } from './indicators_page'; import { useIndicators } from './hooks/use_indicators'; import { useIndicatorsTotalCount } from './hooks/use_indicators_total_count'; -import { TABLE_TEST_ID as INDICATORS_TABLE_TEST_ID } from './components/indicators_table/indicators_table'; +import { + TABLE_TEST_ID as INDICATORS_TABLE_TEST_ID, + TABLE_TEST_ID, +} from './components/indicators_table/indicators_table'; import { EMPTY_PROMPT_TEST_ID } from '../../components/empty_page'; import { useIntegrationsPageLink } from '../../hooks/use_integrations_page_link'; import { useTIDocumentationLink } from '../../hooks/use_documentation_link'; +import { useFilters } from './hooks/use_filters'; jest.mock('./hooks/use_indicators'); jest.mock('./hooks/use_indicators_total_count'); +jest.mock('./hooks/use_filters'); + jest.mock('../../hooks/use_integrations_page_link'); jest.mock('../../hooks/use_documentation_link'); @@ -29,67 +35,95 @@ describe('', () => { indicators: [], indicatorCount: 0, firstLoad: false, + loading: true, pagination: { pageIndex: 0, pageSize: 10, pageSizeOptions: [10] }, onChangeItemsPerPage: stub, onChangePage: stub, - loadData: stub, + handleRefresh: stub, }); - }); - it('should render the contents without crashing', async () => { - ( - useIndicatorsTotalCount as jest.MockedFunction - ).mockReturnValue({ - count: 10, - isLoading: false, + (useFilters as jest.MockedFunction).mockReturnValue({ + filters: [], + filterQuery: { language: 'kuery', query: '' }, + filterManager: {} as any, + indexPatterns: [], + handleSavedQuery: stub, + handleSubmitQuery: stub, + handleSubmitTimeRange: stub, }); + }); - const { getByTestId } = render( - - - - ); + describe('checking if the page should be visible (based on indicator count)', () => { + describe('when indicator count is being loaded', () => { + it('should render nothing at all', () => { + ( + useIndicatorsTotalCount as jest.MockedFunction + ).mockReturnValue({ + count: 0, + isLoading: true, + }); + ( + useIntegrationsPageLink as jest.MockedFunction + ).mockReturnValue(''); + ( + useTIDocumentationLink as jest.MockedFunction + ).mockReturnValue(''); - expect(getByTestId(INDICATORS_TABLE_TEST_ID)).toBeInTheDocument(); - }); + const { queryByTestId } = render( + + + + ); - it('should render empty page when no indicators are found', async () => { - ( - useIndicatorsTotalCount as jest.MockedFunction - ).mockReturnValue({ - count: 0, - isLoading: false, + expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(TABLE_TEST_ID)).not.toBeInTheDocument(); + }); }); - ( - useIntegrationsPageLink as jest.MockedFunction - ).mockReturnValue(''); - (useTIDocumentationLink as jest.MockedFunction).mockReturnValue( - '' - ); - const { getByTestId } = render( - - - - ); + describe('when indicator count is loaded and there are no indicators', () => { + it('should render empty page when no indicators are found', async () => { + ( + useIndicatorsTotalCount as jest.MockedFunction + ).mockReturnValue({ + count: 0, + isLoading: false, + }); + ( + useIntegrationsPageLink as jest.MockedFunction + ).mockReturnValue(''); + ( + useTIDocumentationLink as jest.MockedFunction + ).mockReturnValue(''); - expect(getByTestId(EMPTY_PROMPT_TEST_ID)).toBeInTheDocument(); - }); + const { queryByTestId } = render( + + + + ); - it('should render indicators table when count is being loaded', async () => { - ( - useIndicatorsTotalCount as jest.MockedFunction - ).mockReturnValue({ - count: 0, - isLoading: true, + expect(queryByTestId(TABLE_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).toBeInTheDocument(); + }); }); + }); - const { getByTestId } = render( - - - - ); + describe('when loading is done and we have some indicators', () => { + it('should render indicators table', async () => { + ( + useIndicatorsTotalCount as jest.MockedFunction + ).mockReturnValue({ + count: 7, + isLoading: false, + }); - expect(getByTestId(INDICATORS_TABLE_TEST_ID)).toBeInTheDocument(); + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId(INDICATORS_TABLE_TEST_ID)).toBeInTheDocument(); + expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).not.toBeInTheDocument(); + }); }); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx index 225f0094c7278..5da38b7dae1f3 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx @@ -11,18 +11,68 @@ import { useIndicators } from './hooks/use_indicators'; import { EmptyPage } from '../../components/empty_page'; import { useIndicatorsTotalCount } from './hooks/use_indicators_total_count'; import { DefaultPageLayout } from '../../components/layout'; +import { useFilters } from './hooks/use_filters'; +import { FiltersGlobal } from '../../containers/filters_global'; +import QueryBar from './components/query_bar'; export const IndicatorsPage: VFC = () => { - const indicators = useIndicators(); const { count: indicatorsTotalCount, isLoading: isIndicatorsTotalCountLoading } = useIndicatorsTotalCount(); - const showEmptyPage = !isIndicatorsTotalCountLoading && indicatorsTotalCount === 0; + + const { + timeRange, + indexPatterns, + filters, + filterManager, + filterQuery, + handleSubmitQuery, + handleSubmitTimeRange, + handleSavedQuery, + savedQuery, + } = useFilters(); + + const { handleRefresh, ...indicators } = useIndicators({ + filters, + filterQuery, + timeRange, + }); + + // This prevents indicators table flash when total count is loading. + // TODO: Improve this with custom loader component. It would require changes to security solutions' template wrapper - to allow + // 'template' overrides. + if (isIndicatorsTotalCountLoading) { + return null; + } + + const showEmptyPage = indicatorsTotalCount === 0; return showEmptyPage ? ( ) : ( - + + + + + ); }; + +// Note: This is for lazy loading +// eslint-disable-next-line import/no-default-export +export default IndicatorsPage; diff --git a/x-pack/plugins/threat_intelligence/public/plugin.tsx b/x-pack/plugins/threat_intelligence/public/plugin.tsx index 99b028601575f..fb93ae824556a 100755 --- a/x-pack/plugins/threat_intelligence/public/plugin.tsx +++ b/x-pack/plugins/threat_intelligence/public/plugin.tsx @@ -5,34 +5,67 @@ * 2.0. */ -import React from 'react'; -import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { IndicatorsPage } from './modules/indicators/indicators_page'; +import { CoreStart, Plugin } from '@kbn/core/public'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; +import React, { Suspense } from 'react'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import { KibanaContextProvider } from './hooks/use_kibana'; import { + Services, ThreatIntelligencePluginSetup, ThreatIntelligencePluginStart, ThreatIntelligencePluginStartDeps, + ThreatIntelligenceSecuritySolutionContext, } from './types'; +import { SecuritySolutionContext } from './containers/security_solution_context'; -const createAppComponent = (services: CoreStart) => { - return () => ( - - - - ); -}; +interface AppProps { + securitySolutionContext: ThreatIntelligenceSecuritySolutionContext; +} + +const LazyIndicatorsPage = React.lazy(() => import('./modules/indicators/indicators_page')); + +/** + * This is used here: + * x-pack/plugins/security_solution/public/threat_intelligence/pages/threat_intelligence.tsx + */ +export const createApp = + (services: Services) => + () => + ({ securitySolutionContext }: AppProps) => + ( + + + + }> + + + + + + ); export class ThreatIntelligencePlugin implements Plugin { - public setup(core: CoreSetup): ThreatIntelligencePluginSetup { + public async setup(): Promise { return {}; } + public start( core: CoreStart, plugins: ThreatIntelligencePluginStartDeps ): ThreatIntelligencePluginStart { - const App = createAppComponent({ ...core, ...plugins }); - return { getComponent: () => App }; + const localPluginServices = { + storage: new Storage(localStorage), + }; + + const services = { + ...localPluginServices, + ...core, + ...plugins, + } as Services; + + return { getComponent: createApp(services) }; } + public stop() {} } diff --git a/x-pack/plugins/threat_intelligence/public/types.ts b/x-pack/plugins/threat_intelligence/public/types.ts index 0def26c6c9f19..6620f31120667 100644 --- a/x-pack/plugins/threat_intelligence/public/types.ts +++ b/x-pack/plugins/threat_intelligence/public/types.ts @@ -5,19 +5,31 @@ * 2.0. */ -import { VFC } from 'react'; +import { ComponentType, ReactElement, ReactNode } from 'react'; import { CoreStart } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; - -export type Services = { data: DataPublicPluginStart } & CoreStart; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ThreatIntelligencePluginSetup {} export interface ThreatIntelligencePluginStart { - getComponent: () => VFC; + getComponent: () => (props: { + securitySolutionContext: ThreatIntelligenceSecuritySolutionContext; + }) => ReactElement; } export interface ThreatIntelligencePluginStartDeps { data: DataPublicPluginStart; } + +export type Services = { + data: DataPublicPluginStart; + storage: Storage; + dataViews: DataViewsPublicPluginStart; +} & CoreStart; + +export interface ThreatIntelligenceSecuritySolutionContext { + getFiltersGlobalComponent: () => ComponentType<{ children: ReactNode }>; +} diff --git a/x-pack/plugins/threat_intelligence/tsconfig.json b/x-pack/plugins/threat_intelligence/tsconfig.json index a103b53ab4861..28b8567c6f995 100644 --- a/x-pack/plugins/threat_intelligence/tsconfig.json +++ b/x-pack/plugins/threat_intelligence/tsconfig.json @@ -15,6 +15,7 @@ ], "references": [ { "path": "../../../src/core/tsconfig.json" }, - { "path": "../../../src/plugins/data/tsconfig.json" } + { "path": "../../../src/plugins/data/tsconfig.json" }, + { "path": "../../../src/plugins/unified_search/tsconfig.json" } ] } diff --git a/x-pack/plugins/timelines/common/utils/field_formatters.test.ts b/x-pack/plugins/timelines/common/utils/field_formatters.test.ts index c2ecd75879b67..43babd374d991 100644 --- a/x-pack/plugins/timelines/common/utils/field_formatters.test.ts +++ b/x-pack/plugins/timelines/common/utils/field_formatters.test.ts @@ -581,6 +581,17 @@ describe('Events Details Helpers', () => { originalValue: ['a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3'], values: ['a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3'], }, + { + category: 'threat', + field: 'threat.enrichments', + isObjectArray: true, + originalValue: [ + '{"matched.field":["myhash.mysha256"],"matched.index":["logs-ti_abusech.malware"],"matched.type":["indicator_match_rule"],"feed.name":["AbuseCH malware"],"matched.atomic":["a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3"]}', + ], + values: [ + '{"matched.field":["myhash.mysha256"],"matched.index":["logs-ti_abusech.malware"],"matched.type":["indicator_match_rule"],"feed.name":["AbuseCH malware"],"matched.atomic":["a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3"]}', + ], + }, ]; const result = getDataFromFieldsHits(data); expect(result).toEqual(ruleParametersResultFields); diff --git a/x-pack/plugins/timelines/common/utils/field_formatters.ts b/x-pack/plugins/timelines/common/utils/field_formatters.ts index e3160de9e6303..49590bfea54c1 100644 --- a/x-pack/plugins/timelines/common/utils/field_formatters.ts +++ b/x-pack/plugins/timelines/common/utils/field_formatters.ts @@ -13,6 +13,7 @@ import { technicalRuleFieldMap } from '@kbn/rule-registry-plugin/common/assets/f import { experimentalRuleFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/experimental_rule_field_map'; import { EventHit, TimelineEventsDetailsItem } from '../search_strategy'; import { toObjectArrayOfStrings, toStringArray } from './to_array'; +import { ENRICHMENT_DESTINATION_PATH } from '../constants'; export const baseCategoryFields = ['@timestamp', 'labels', 'message', 'tags']; const nonFlattenedFormatParamsFields = ['related_integrations', 'threat_mapping']; @@ -46,6 +47,9 @@ export const isRuleParametersFieldOrSubfield = (field: string, prependField?: st (prependField?.includes(ALERT_RULE_PARAMETERS) || field === ALERT_RULE_PARAMETERS) && !nonFlattenedFormatParamsFields.includes(field); +export const isThreatEnrichmentFieldOrSubfield = (field: string, prependField?: string) => + prependField?.includes(ENRICHMENT_DESTINATION_PATH) || field === ENRICHMENT_DESTINATION_PATH; + export const getDataFromFieldsHits = ( fields: EventHit['fields'], prependField?: string, @@ -91,6 +95,19 @@ export const getDataFromFieldsHits = ( }, ]; } + + const threatEnrichmentObject = isThreatEnrichmentFieldOrSubfield(field, prependField) + ? [ + { + category: fieldCategory, + field: dotField, + values: strArr, + originalValue: strArr, + isObjectArray, + }, + ] + : []; + // format nested fields let nestedFields; if (isRuleParametersFieldOrSubfield(field, prependField)) { @@ -111,6 +128,7 @@ export const getDataFromFieldsHits = ( const flat: Record = [ ...accumulator, ...nestedFields, + ...threatEnrichmentObject, ].reduce( (acc, f) => ({ ...acc, diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.test.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.test.ts index 0ad98c3771014..a2107a9aff2be 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.test.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_ecs_objects.test.ts @@ -112,6 +112,76 @@ describe('buildEcsObjects', () => { type: [], }, }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.name'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.hostname'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['x86_64'], + field: ['host.architecture'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.name'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.hostname'], + type: ['indicator_match_rule'], + }, + }, ], }, timestamp: '2020-11-17T14:48:08.922Z', diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_object_recursive.test.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_object_recursive.test.ts index 3d05a42f527b4..e6865780608a5 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_object_recursive.test.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/build_object_recursive.test.ts @@ -86,6 +86,31 @@ describe('buildObjectRecursive', () => { atomic: ['matched_atomic_2'], }, }, + { + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + }, + }, + { + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + }, + }, + { + matched: { + atomic: ['x86_64'], + }, + }, + { + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + }, + }, + { + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + }, + }, ], }, }); @@ -105,6 +130,31 @@ describe('buildObjectRecursive', () => { field: ['matched_field_2'], }, }, + { + matched: { + field: ['host.name'], + }, + }, + { + matched: { + field: ['host.hostname'], + }, + }, + { + matched: { + field: ['host.architecture'], + }, + }, + { + matched: { + field: ['host.name'], + }, + }, + { + matched: { + field: ['host.hostname'], + }, + }, ], }, }); diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts index de3e3d0040245..ff2ee23643190 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts @@ -43,7 +43,14 @@ describe('formatTimelineData', () => { }, { field: 'threat.enrichments.matched.field', - value: ['matched_field', 'other_matched_field', 'matched_field_2'], + value: [ + 'matched_field', + 'other_matched_field', + 'matched_field_2', + 'host.name', + 'host.hostname', + 'host.architecture', + ], }, { field: 'source.geo.location', @@ -120,6 +127,76 @@ describe('formatTimelineData', () => { type: [], }, }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.name'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.hostname'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['x86_64'], + field: ['host.architecture'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.name'], + type: ['indicator_match_rule'], + }, + }, + { + feed: { + name: [], + }, + indicator: { + provider: [], + reference: [], + }, + matched: { + atomic: ['MacBook-Pro-de-Gloria.local'], + field: ['host.hostname'], + type: ['indicator_match_rule'], + }, + }, ], }, }, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index bab7e5067a06f..bb0fd98807068 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -13683,7 +13683,6 @@ "xpack.fleet.upgradeAgents.hourLabel": "{option} {count, plural, one {heure} other {heures}}", "xpack.fleet.upgradeAgents.scheduleUpgradeMultipleTitle": "Planifier la mise à niveau pour {count, plural, one {l'agent} other {{count} agents} =true {tous les agents sélectionnés}}", "xpack.fleet.upgradeAgents.startTimeLabel": "Date et heure sélectionnées", - "xpack.fleet.upgradeAgents.successMultiNotificationTitle": "{isMixed, select, true {{success} agents sur {total}} other {{isAllAgents, select, true {Tous les agents sélectionnés} other {{success}} }}} mis à niveau", "xpack.fleet.upgradeAgents.successSingleNotificationTitle": "{count} agent mis à niveau", "xpack.fleet.upgradeAgents.upgradeMultipleDescription": "Cette action met à niveau plusieurs agents vers la version {version}. Impossible d'annuler cette action. Voulez-vous vraiment continuer ?", "xpack.fleet.upgradeAgents.upgradeMultipleTitle": "Mettre à niveau {count, plural, one {l'agent} other {{count} agents} =true {tous les agents sélectionnés}}", @@ -22462,7 +22461,6 @@ "xpack.osquery.agents.policyLabel": "Politique", "xpack.osquery.agents.selectAgentLabel": "Sélectionner les agents ou les groupes à interroger", "xpack.osquery.agents.selectionLabel": "Agents", - "xpack.osquery.all_actions.fetchError": "Erreur lors de la récupération des actions", "xpack.osquery.appNavigation.liveQueriesLinkText": "Recherches en direct", "xpack.osquery.appNavigation.manageIntegrationButton": "Gérer l'intégration", "xpack.osquery.appNavigation.packsLinkText": "Packs", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c5d5b4eb3818c..52eb0a50093b9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -13673,7 +13673,6 @@ "xpack.fleet.upgradeAgents.hourLabel": "{option} {count, plural, other {時間}}", "xpack.fleet.upgradeAgents.scheduleUpgradeMultipleTitle": "{count, plural, other {{count}個のエージェント} =true {すべての選択されたエージェント}}のアップグレードをスケジュール", "xpack.fleet.upgradeAgents.startTimeLabel": "スケジュールされた日時", - "xpack.fleet.upgradeAgents.successMultiNotificationTitle": "{isMixed, select, true {{success}/{total}個の} other {{isAllAgents, select, true {すべての選択された} other {{success}} }}}エージェントをアップグレードしました", "xpack.fleet.upgradeAgents.successSingleNotificationTitle": "{count}個のエージェントをアップグレードしました", "xpack.fleet.upgradeAgents.upgradeMultipleDescription": "このアクションにより、複数のエージェントがバージョン{version}にアップグレードされます。このアクションは元に戻せません。続行していいですか?", "xpack.fleet.upgradeAgents.upgradeMultipleTitle": "{count, plural, other {{count}個のエージェント} =true {すべての選択されたエージェント}}をアップグレード", @@ -22541,7 +22540,6 @@ "xpack.osquery.agents.policyLabel": "ポリシー", "xpack.osquery.agents.selectAgentLabel": "クエリを実行するエージェントまたはグループを選択", "xpack.osquery.agents.selectionLabel": "エージェント", - "xpack.osquery.all_actions.fetchError": "アクションの取得中にエラーが発生しました", "xpack.osquery.appNavigation.liveQueriesLinkText": "ライブクエリ", "xpack.osquery.appNavigation.manageIntegrationButton": "統合を管理", "xpack.osquery.appNavigation.packsLinkText": "パック", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a75f0c98661de..f8d7154485730 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -13690,7 +13690,6 @@ "xpack.fleet.upgradeAgents.hourLabel": "{option} {count, plural, other {小时}}", "xpack.fleet.upgradeAgents.scheduleUpgradeMultipleTitle": "计划升级{count, plural, one {代理} other {{count} 个代理} =true {所有选定代理}}", "xpack.fleet.upgradeAgents.startTimeLabel": "计划日期和时间", - "xpack.fleet.upgradeAgents.successMultiNotificationTitle": "已升级{isMixed, select, true { {success} 个(共 {total} 个)} other {{isAllAgents, select, true {所有选定} other { {success} 个} }}}代理", "xpack.fleet.upgradeAgents.successSingleNotificationTitle": "已升级 {count} 个代理", "xpack.fleet.upgradeAgents.upgradeMultipleDescription": "此操作会将多个代理升级到版本 {version}。此操作无法撤消。是否确定要继续?", "xpack.fleet.upgradeAgents.upgradeMultipleTitle": "升级{count, plural, one {代理} other { {count} 个代理} =true {所有选定代理}}", @@ -22565,7 +22564,6 @@ "xpack.osquery.agents.policyLabel": "策略", "xpack.osquery.agents.selectAgentLabel": "选择要查询的代理或组", "xpack.osquery.agents.selectionLabel": "代理", - "xpack.osquery.all_actions.fetchError": "提取操作时出错", "xpack.osquery.appNavigation.liveQueriesLinkText": "实时查询", "xpack.osquery.appNavigation.manageIntegrationButton": "管理集成", "xpack.osquery.appNavigation.packsLinkText": "包", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_alerts_aggregations.ts b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_alerts_aggregations.ts index 530fdbde82b59..aeba9605cb9a6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_alerts_aggregations.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_alerts_aggregations.ts @@ -113,10 +113,6 @@ interface RuleAlertsAggs { error?: string; alertsChartData: AlertChartData[]; } -interface BucketAggsPerDay { - key_as_string: string; - doc_count: number; -} export async function fetchRuleAlertsAggByTimeRange({ http, @@ -146,28 +142,60 @@ export async function fetchRuleAlertsAggByTimeRange({ { range: { '@timestamp': { - // When needed, we can make this range configurable via a function argument. gte: 'now-30d', lt: 'now', }, }, }, + { + bool: { + should: [ + { + term: { + 'kibana.alert.status': 'active', + }, + }, + { + term: { + 'kibana.alert.status': 'recovered', + }, + }, + ], + }, + }, ], }, }, aggs: { - filterAggs: { + total: { filters: { filters: { - alert_active: { term: { 'kibana.alert.status': 'active' } }, - alert_recovered: { term: { 'kibana.alert.status': 'recovered' } }, + totalActiveAlerts: { + term: { + 'kibana.alert.status': 'active', + }, + }, + totalRecoveredAlerts: { + term: { + 'kibana.alert.status': 'recovered', + }, + }, + }, + }, + }, + statusPerDay: { + date_histogram: { + field: '@timestamp', + fixed_interval: '1d', + extended_bounds: { + min: 'now-30d', + max: 'now', }, }, aggs: { - status_per_day: { - date_histogram: { - field: '@timestamp', - fixed_interval: '1d', + alertStatus: { + terms: { + field: 'kibana.alert.status', }, }, }, @@ -175,29 +203,82 @@ export async function fetchRuleAlertsAggByTimeRange({ }, }), }); - const active = res?.aggregations?.filterAggs.buckets.alert_active?.doc_count ?? 0; - const recovered = res?.aggregations?.filterAggs.buckets.alert_recovered?.doc_count ?? 0; + + const active = res?.aggregations?.total.buckets.totalActiveAlerts?.doc_count ?? 0; + const recovered = res?.aggregations?.total.buckets.totalRecoveredAlerts?.doc_count ?? 0; + let maxTotalAlertPerDay = 0; + res?.aggregations?.statusPerDay.buckets.forEach( + (dayAlerts: { + key: number; + doc_count: number; + alertStatus: { + buckets: Array<{ + key: 'active' | 'recovered'; + doc_count: number; + }>; + }; + }) => { + if (dayAlerts.doc_count > maxTotalAlertPerDay) { + maxTotalAlertPerDay = dayAlerts.doc_count; + } + } + ); + const alertsChartData = [ - ...res?.aggregations?.filterAggs.buckets.alert_active.status_per_day.buckets.map( - (bucket: BucketAggsPerDay) => ({ - date: bucket.key_as_string, - status: 'active', - count: bucket.doc_count, - }) - ), - ...res?.aggregations?.filterAggs.buckets.alert_recovered.status_per_day.buckets.map( - (bucket: BucketAggsPerDay) => ({ - date: bucket.key_as_string, - status: 'recovered', - count: bucket.doc_count, - }) + ...res?.aggregations?.statusPerDay.buckets.reduce( + ( + acc: AlertChartData[], + dayAlerts: { + key: number; + doc_count: number; + alertStatus: { + buckets: Array<{ + key: 'active' | 'recovered'; + doc_count: number; + }>; + }; + } + ) => { + // We are adding this to each day to construct the 30 days bars (background bar) when there is no data for a given day or to show the delta today alerts/total alerts. + const totalDayAlerts = { + date: dayAlerts.key, + count: maxTotalAlertPerDay === 0 ? 1 : maxTotalAlertPerDay, + status: 'total', + }; + + if (dayAlerts.doc_count > 0) { + const localAlertChartData = acc; + // If there are alerts in this day, we construct the chart data + dayAlerts.alertStatus.buckets.forEach((alert) => { + localAlertChartData.push({ + date: dayAlerts.key, + count: alert.doc_count, + status: alert.key, + }); + }); + const deltaAlertsCount = maxTotalAlertPerDay - dayAlerts.doc_count; + if (deltaAlertsCount > 0) { + localAlertChartData.push({ + date: dayAlerts.key, + count: deltaAlertsCount, + status: 'total', + }); + } + return localAlertChartData; + } + return [...acc, totalDayAlerts]; + }, + [] ), ]; - return { active, recovered, - alertsChartData, + alertsChartData: [ + ...alertsChartData.filter((acd) => acd.status === 'recovered'), + ...alertsChartData.filter((acd) => acd.status === 'active'), + ...alertsChartData.filter((acd) => acd.status === 'total'), + ], }; } catch (error) { return { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/helpers.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/helpers.tsx index f9cb7c773ab1c..167c98a678f52 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/helpers.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/helpers.tsx @@ -10,7 +10,7 @@ import { AlertChartData } from './types'; export const formatChartAlertData = ( data: AlertChartData[] -): Array<{ x: string; y: number; g: string }> => +): Array<{ x: number; y: number; g: string }> => data.map((alert) => ({ x: alert.date, y: alert.count, @@ -20,10 +20,22 @@ export const formatChartAlertData = ( export const getColorSeries = ({ seriesKeys }: XYChartSeriesIdentifier) => { switch (seriesKeys[0]) { case 'active': - return LIGHT_THEME.colors.vizColors[1]; - case 'recovered': return LIGHT_THEME.colors.vizColors[2]; + case 'recovered': + return LIGHT_THEME.colors.vizColors[1]; + case 'total': + return '#f5f7fa'; default: return null; } }; + +/** + * This function may be passed to `Array.find()` to locate the `P1DT` + * configuration (sub) setting, a string array that contains two entries + * like the following example: `['P1DT', 'YYYY-MM-DD']`. + */ +export const isP1DTFormatterSetting = (formatNameFormatterPair?: string[]) => + Array.isArray(formatNameFormatterPair) && + formatNameFormatterPair[0] === 'P1DT' && + formatNameFormatterPair.length === 2; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/rule_alerts_summary.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/rule_alerts_summary.tsx index 58d75d0a6d4bb..6fc657d051594 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/rule_alerts_summary.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/rule_alerts_summary.tsx @@ -5,11 +5,19 @@ * 2.0. */ -import { BarSeries, Chart, ScaleType, Settings, TooltipType } from '@elastic/charts'; import { + BarSeries, + Chart, + FilterPredicate, + LIGHT_THEME, + ScaleType, + Settings, + TooltipType, +} from '@elastic/charts'; +import { + EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, - EuiHorizontalRule, EuiLoadingSpinner, EuiPanel, EuiSpacer, @@ -25,18 +33,30 @@ import { EUI_SPARKLINE_THEME_PARTIAL, } from '@elastic/eui/dist/eui_charts_theme'; import { useUiSetting } from '@kbn/kibana-react-plugin/public'; +import moment from 'moment'; import { useLoadRuleAlertsAggs } from '../../../../hooks/use_load_rule_alerts_aggregations'; import { useLoadRuleTypes } from '../../../../hooks/use_load_rule_types'; import { formatChartAlertData, getColorSeries } from '.'; import { RuleAlertsSummaryProps } from '.'; +import { isP1DTFormatterSetting } from './helpers'; const Y_ACCESSORS = ['y']; const X_ACCESSORS = ['x']; const G_ACCESSORS = ['g']; - +const FALLBACK_DATE_FORMAT_SCALED_P1DT = 'YYYY-MM-DD'; export const RuleAlertsSummary = ({ rule, filteredRuleTypes }: RuleAlertsSummaryProps) => { const [features, setFeatures] = useState(''); const isDarkMode = useUiSetting('theme:darkMode'); + + const scaledDateFormatPreference = useUiSetting('dateFormat:scaled'); + const maybeP1DTFormatter = Array.isArray(scaledDateFormatPreference) + ? scaledDateFormatPreference.find(isP1DTFormatterSetting) + : null; + const p1dtFormat = + Array.isArray(maybeP1DTFormatter) && maybeP1DTFormatter.length === 2 + ? maybeP1DTFormatter[1] + : FALLBACK_DATE_FORMAT_SCALED_P1DT; + const theme = useMemo( () => [ EUI_SPARKLINE_THEME_PARTIAL, @@ -57,6 +77,15 @@ export const RuleAlertsSummary = ({ rule, filteredRuleTypes }: RuleAlertsSummary features, }); const chartData = useMemo(() => formatChartAlertData(alertsChartData), [alertsChartData]); + const tooltipSettings = useMemo( + () => ({ + type: TooltipType.VerticalCursor, + headerFormatter: ({ value }: { value: number }) => { + return <>{moment(value).format(p1dtFormat)}; + }, + }), + [p1dtFormat] + ); useEffect(() => { const matchedRuleType = ruleTypes.find((type) => type.id === rule.ruleTypeId); @@ -66,8 +95,33 @@ export const RuleAlertsSummary = ({ rule, filteredRuleTypes }: RuleAlertsSummary }, [rule, ruleTypes]); if (isLoadingRuleAlertsAggs) return ; - if (errorRuleAlertsAggs) return Error; - + if (errorRuleAlertsAggs) + return ( + + + + } + body={ +

+ { + + } +

+ } + /> + ); + const isVisibleFunction: FilterPredicate = (series) => series.splitAccessors.get('g') !== 'total'; return ( @@ -82,12 +136,20 @@ export const RuleAlertsSummary = ({ rule, filteredRuleTypes }: RuleAlertsSummary /> + + + + + - + - + - +

{active}

- + - +

{recovered}

@@ -128,7 +190,6 @@ export const RuleAlertsSummary = ({ rule, filteredRuleTypes }: RuleAlertsSummary
-
@@ -145,7 +206,7 @@ export const RuleAlertsSummary = ({ rule, filteredRuleTypes }: RuleAlertsSummary - +
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/types.ts index 6ee51dfad4caa..ae4d8696572b0 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/alert_summary/types.ts @@ -12,9 +12,9 @@ export interface RuleAlertsSummaryProps { filteredRuleTypes: string[]; } export interface AlertChartData { - status: 'active' | 'recovered'; + status: 'active' | 'recovered' | 'total'; count: number; - date: string; + date: number; } export interface AlertsChartProps { diff --git a/x-pack/tasks/build.ts b/x-pack/tasks/build.ts index d0803e73d96d4..c5196e1ec86f0 100644 --- a/x-pack/tasks/build.ts +++ b/x-pack/tasks/build.ts @@ -7,7 +7,6 @@ import execa from 'execa'; import { resolve } from 'path'; -import { writeFileSync } from 'fs'; import { promisify } from 'util'; import { pipeline } from 'stream'; @@ -18,8 +17,6 @@ import gulp from 'gulp'; import del from 'del'; import vfs from 'vinyl-fs'; -import { generateNoticeFromSource } from '../../src/dev/notice'; - const asyncPipeline = promisify(pipeline); const XPACK_DIR = resolve(REPO_ROOT, 'x-pack'); @@ -102,25 +99,4 @@ async function buildCanvasShareableRuntime() { ); } -async function generateNoticeText() { - const log = new ToolingLog({ - level: 'info', - writeTo: process.stdout, - }); - - writeFileSync( - resolve(PLUGIN_BUILD_DIR, 'NOTICE.txt'), - await generateNoticeFromSource({ - productName: 'Kibana X-Pack', - log, - directory: PLUGIN_BUILD_DIR, - }) - ); -} - -export const buildTask = gulp.series( - cleanBuildTask, - buildCanvasShareableRuntime, - copySource, - generateNoticeText -); +export const buildTask = gulp.series(cleanBuildTask, buildCanvasShareableRuntime, copySource); diff --git a/x-pack/test/accessibility/apps/stack_monitoring.ts b/x-pack/test/accessibility/apps/stack_monitoring.ts index 9fbb6ed94e321..7a61ee177c116 100644 --- a/x-pack/test/accessibility/apps/stack_monitoring.ts +++ b/x-pack/test/accessibility/apps/stack_monitoring.ts @@ -5,8 +5,8 @@ * 2.0. */ -// a11y tests for spaces, space selection and space creation and feature controls - +// a11y tests for stack monitoring +import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { @@ -18,8 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaOverview = getService('monitoringKibanaOverview'); const clusterOverview = getService('monitoringClusterOverview'); - // Failing: See https://github.com/elastic/kibana/issues/136242 - describe.skip('Kibana Stack Monitoring a11y tests', () => { + describe('Kibana Stack Monitoring a11y tests', () => { before(async () => { await PageObjects.common.navigateToApp('monitoring'); await a11y.testAppSnapshot(); @@ -49,15 +48,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('alerts-modal-remind-later-button'); }); - // FLAKY: https://github.com/elastic/kibana/issues/135196 - it.skip('a11y tests for Kibana Overview', async function () { + it('a11y tests for Kibana Overview', async function () { await clusterOverview.clickKibanaOverview(); - await kibanaOverview.isOnOverview(); + expect(await kibanaOverview.isOnOverview()).to.be(true); await a11y.testAppSnapshot(); }); it('a11y tests for Kibana Instances Page', async function () { await kibanaOverview.isOnOverview(); + await retry.waitForWithTimeout( + 'Make sure Kibana instances tab is visble', + 30000, + async () => { + return await testSubjects.isDisplayed('kibanaInstancesPage'); + } + ); await kibanaOverview.clickInstanceTab(); await a11y.testAppSnapshot(); }); diff --git a/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts b/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts index f2b606ff183cd..5bf3ae04a2743 100644 --- a/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts +++ b/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts @@ -34,8 +34,8 @@ export default ({ getService }: FtrProviderContext) => { }; const expected = { - chunksLength: 12, - actionsLength: 11, + chunksLength: 13, + actionsLength: 12, noIndexChunksLength: 4, noIndexActionsLength: 3, changePointFilter: 'add_change_points', diff --git a/x-pack/test/api_integration/apis/uptime/rest/add_monitor_private_location.ts b/x-pack/test/api_integration/apis/uptime/rest/add_monitor_private_location.ts index 818d16ee017b3..7b2dc0a3d1474 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/add_monitor_private_location.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/add_monitor_private_location.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import uuid from 'uuid'; import expect from '@kbn/expect'; import { HTTPFields } from '@kbn/synthetics-plugin/common/runtime_types'; import { API_URLS } from '@kbn/synthetics-plugin/common/constants'; @@ -12,15 +13,16 @@ import { secretKeys } from '@kbn/synthetics-plugin/common/constants/monitor_mana import { PackagePolicy } from '@kbn/fleet-plugin/common'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { getFixtureJson } from './helper/get_fixture_json'; -import { comparePolicies, testSyntheticsPolicy } from './sample_data/test_policy'; +import { comparePolicies, getTestSyntheticsPolicy } from './sample_data/test_policy'; import { PrivateLocationTestService } from './services/private_location_test_service'; export default function ({ getService }: FtrProviderContext) { - // FAILING ON 8.4: https://github.com/elastic/kibana/issues/137328 + // Failing: See https://github.com/elastic/kibana/issues/137328 describe.skip('PrivateLocationMonitor', function () { this.tags('skipCloud'); - + const kibanaServer = getService('kibanaServer'); const supertestAPI = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); let testFleetPolicyID: string; @@ -28,6 +30,7 @@ export default function ({ getService }: FtrProviderContext) { let httpMonitorJson: HTTPFields; const testPrivateLocations = new PrivateLocationTestService(getService); + const security = getService('security'); before(async () => { await supertestAPI.post('/api/fleet/setup').set('kbn-xsrf', 'true').send().expect(200); @@ -113,7 +116,7 @@ export default function ({ getService }: FtrProviderContext) { expect(packagePolicy.policy_id).eql(testFleetPolicyID); - comparePolicies(packagePolicy, testSyntheticsPolicy); + comparePolicies(packagePolicy, getTestSyntheticsPolicy(httpMonitorJson.name)); }); let testFleetPolicyID2: string; @@ -152,7 +155,7 @@ export default function ({ getService }: FtrProviderContext) { expect(packagePolicy.policy_id).eql(testFleetPolicyID); - comparePolicies(packagePolicy, testSyntheticsPolicy); + comparePolicies(packagePolicy, getTestSyntheticsPolicy(httpMonitorJson.name)); packagePolicy = apiResponsePolicy.body.items.find( (pkgPolicy: PackagePolicy) => @@ -160,7 +163,7 @@ export default function ({ getService }: FtrProviderContext) { ); expect(packagePolicy.policy_id).eql(testFleetPolicyID2); - comparePolicies(packagePolicy, testSyntheticsPolicy); + comparePolicies(packagePolicy, getTestSyntheticsPolicy(httpMonitorJson.name)); }); it('deletes integration for a removed location from monitor', async () => { @@ -185,7 +188,7 @@ export default function ({ getService }: FtrProviderContext) { expect(packagePolicy.policy_id).eql(testFleetPolicyID); - comparePolicies(packagePolicy, testSyntheticsPolicy); + comparePolicies(packagePolicy, getTestSyntheticsPolicy(httpMonitorJson.name)); packagePolicy = apiResponsePolicy.body.items.find( (pkgPolicy: PackagePolicy) => @@ -212,5 +215,71 @@ export default function ({ getService }: FtrProviderContext) { expect(packagePolicy).eql(undefined); }); + + it('handles spaces', async () => { + const username = 'admin'; + const password = `${username}-password`; + const roleName = 'uptime-role'; + const SPACE_ID = `test-space-${uuid.v4()}`; + const SPACE_NAME = `test-space-name ${uuid.v4()}`; + let monitorId = ''; + const monitor = { + ...httpMonitorJson, + name: `Test monitor ${uuid.v4()}`, + locations: [ + { + id: testFleetPolicyID, + label: 'Test private location 0', + isServiceManaged: false, + }, + ], + }; + + try { + await kibanaServer.spaces.create({ id: SPACE_ID, name: SPACE_NAME }); + await security.role.create(roleName, { + kibana: [ + { + feature: { + uptime: ['all'], + fleet: ['all'], + fleetv2: ['all'], + }, + spaces: ['*'], + }, + ], + }); + await security.user.create(username, { + password, + roles: [roleName], + full_name: 'a kibana user', + }); + const apiResponse = await supertestWithoutAuth + .post(`/s/${SPACE_ID}${API_URLS.SYNTHETICS_MONITORS}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send(monitor) + .expect(200); + + expect(apiResponse.body.attributes).eql(omit(monitor, secretKeys)); + monitorId = apiResponse.body.id; + + const policyResponse = await supertestAPI.get( + '/api/fleet/package_policies?page=1&perPage=2000&kuery=ingest-package-policies.package.name%3A%20synthetics' + ); + + const packagePolicy = policyResponse.body.items.find( + (pkgPolicy: PackagePolicy) => + pkgPolicy.id === monitorId + '-' + testFleetPolicyID + `-${SPACE_ID}` + ); + + expect(packagePolicy.policy_id).eql(testFleetPolicyID); + expect(packagePolicy.name).eql(`${monitor.name}-Test private location 0-${SPACE_ID}`); + comparePolicies(packagePolicy, getTestSyntheticsPolicy(monitor.name)); + } finally { + await security.user.delete(username); + await security.role.delete(roleName); + } + }); }); } diff --git a/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts b/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts index b338437ca1d9d..6dbf36b3e99a5 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts @@ -16,7 +16,7 @@ import { PrivateLocationTestService } from './services/private_location_test_ser import { comparePolicies, getTestProjectSyntheticsPolicy } from './sample_data/test_policy'; export default function ({ getService }: FtrProviderContext) { - // FLAKY: https://github.com/elastic/kibana/issues/137124 + // Failing: See https://github.com/elastic/kibana/issues/137818 describe.skip('[PUT] /api/uptime/service/monitors', function () { this.tags('skipCloud'); @@ -727,7 +727,6 @@ export default function ({ getService }: FtrProviderContext) { label: 'Test private location 0', isServiceManaged: false, isInvalid: false, - name: 'Test private location 0', agentPolicyId: testPolicyId, id: testPolicyId, geo: { diff --git a/x-pack/test/api_integration/apis/uptime/rest/sample_data/test_policy.ts b/x-pack/test/api_integration/apis/uptime/rest/sample_data/test_policy.ts index cc007ab21bb2a..b829eb355e8db 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/sample_data/test_policy.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/sample_data/test_policy.ts @@ -9,7 +9,7 @@ import { omit, sortBy } from 'lodash'; import expect from '@kbn/expect'; import { PackagePolicy } from '@kbn/fleet-plugin/common'; -export const testSyntheticsPolicy: PackagePolicy = { +export const getTestSyntheticsPolicy = (name: string): PackagePolicy => ({ id: '5863efe0-0368-11ed-8df7-a7424c6f5167-5347cd10-0368-11ed-8df7-a7424c6f5167', version: 'WzMyNTcsMV0=', name: '5863efe0-0368-11ed-8df7-a7424c6f5167-5347cd10-0368-11ed-8df7-a7424c6f5167', @@ -35,7 +35,7 @@ export const testSyntheticsPolicy: PackagePolicy = { }, enabled: { value: true, type: 'bool' }, type: { value: 'http', type: 'text' }, - name: { value: 'test-monitor-name', type: 'text' }, + name: { value: name, type: 'text' }, schedule: { value: '"@every 5m"', type: 'text' }, urls: { value: 'https://nextjs-test-synthetics.vercel.app/api/users', type: 'text' }, 'service.name': { value: '', type: 'text' }, @@ -69,7 +69,7 @@ export const testSyntheticsPolicy: PackagePolicy = { script_source: { is_generated_script: false, file_name: 'test-file.name' }, }, type: 'http', - name: 'test-monitor-name', + name, enabled: true, urls: 'https://nextjs-test-synthetics.vercel.app/api/users', schedule: '@every 5m', @@ -238,7 +238,7 @@ export const testSyntheticsPolicy: PackagePolicy = { created_by: 'system', updated_at: '2022-07-14T11:30:23.034Z', updated_by: 'system', -}; +}); export const getTestProjectSyntheticsPolicy = ( { diff --git a/x-pack/test/functional/apps/lens/group3/annotations.ts b/x-pack/test/functional/apps/lens/group3/annotations.ts index 62e5edb564871..d6197cc2e39ab 100644 --- a/x-pack/test/functional/apps/lens/group3/annotations.ts +++ b/x-pack/test/functional/apps/lens/group3/annotations.ts @@ -13,8 +13,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const find = getService('find'); const retry = getService('retry'); const testSubjects = getService('testSubjects'); + const from = 'Sep 19, 2015 @ 06:31:44.000'; + const to = 'Sep 23, 2015 @ 18:31:44.000'; describe('lens annotations tests', () => { + before(async () => { + await PageObjects.common.setTime({ from, to }); + }); + after(async () => { + await PageObjects.common.unsetTime(); + }); + it('should show a disabled annotation layer button if there is no date histogram in data layer', async () => { await PageObjects.visualize.navigateToNewVisualization(); await PageObjects.visualize.clickVisType('lens'); diff --git a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts b/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts index adb1c42e814d5..93f4b77c44153 100644 --- a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts +++ b/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts @@ -104,7 +104,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.getDimensionTriggersTexts('lnsXY_splitDimensionPanel') ).to.eql([]); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Value count of @message.raw', + 'Count of @message.raw', ]); }); it('should duplicate the column when dragging to empty dimension in the same group', async () => { @@ -117,9 +117,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { to: 'lnsXY_yDimensionPanel > lns-empty-dimension', }); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Value count of @message.raw', - 'Value count of @message.raw [1]', - 'Value count of @message.raw [2]', + 'Count of @message.raw', + 'Count of @message.raw [1]', + 'Count of @message.raw [2]', ]); }); it('should move duplicated column to non-compatible dimension group', async () => { @@ -128,8 +128,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { to: 'lnsXY_xDimensionPanel > lns-empty-dimension', }); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Value count of @message.raw', - 'Value count of @message.raw [1]', + 'Count of @message.raw', + 'Count of @message.raw [1]', ]); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_xDimensionPanel')).to.eql([ 'Top 5 values of @message.raw', @@ -161,7 +161,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_yDimensionPanel')).to.eql( - 'Value count of @timestamp' + 'Count of @timestamp' ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_splitDimensionPanel')).to.eql( 'Top 3 values of @message.raw' @@ -303,14 +303,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dimensionKeyboardDragDrop('lnsXY_xDimensionPanel', 0, 2); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ 'Count of records', - 'Value count of @timestamp', + 'Count of @timestamp', ]); - await PageObjects.lens.assertFocusedDimension('Value count of @timestamp'); + await PageObjects.lens.assertFocusedDimension('Count of @timestamp'); }); it('should reorder elements with keyboard', async () => { await PageObjects.lens.dimensionKeyboardReorder('lnsXY_yDimensionPanel', 0, 1); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Value count of @timestamp', + 'Count of @timestamp', 'Count of records', ]); await PageObjects.lens.assertFocusedDimension('Count of records'); diff --git a/x-pack/test/functional/apps/lens/group3/geo_field.ts b/x-pack/test/functional/apps/lens/group3/geo_field.ts index bb8012ba50d23..790160a4b1bba 100644 --- a/x-pack/test/functional/apps/lens/group3/geo_field.ts +++ b/x-pack/test/functional/apps/lens/group3/geo_field.ts @@ -9,17 +9,30 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['visualize', 'lens', 'header', 'maps', 'timePicker']); + const PageObjects = getPageObjects([ + 'visualize', + 'lens', + 'header', + 'maps', + 'timePicker', + 'common', + ]); + const from = 'Sep 22, 2015 @ 00:00:00.000'; + const to = 'Sep 22, 2015 @ 04:00:00.000'; describe('lens visualize geo field tests', () => { + before(async () => { + await PageObjects.common.setTime({ from, to }); + }); + + after(async () => { + await PageObjects.common.unsetTime(); + }); + it('should visualize geo fields in maps', async () => { await PageObjects.visualize.navigateToNewVisualization(); await PageObjects.visualize.clickVisType('lens'); await PageObjects.lens.switchDataPanelIndexPattern('logstash-*'); - await PageObjects.timePicker.setAbsoluteRange( - 'Sep 22, 2015 @ 00:00:00.000', - 'Sep 22, 2015 @ 04:00:00.000' - ); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.lens.dragFieldToGeoFieldWorkspace('geo.coordinates'); diff --git a/x-pack/test/functional/services/monitoring/kibana_overview.js b/x-pack/test/functional/services/monitoring/kibana_overview.js index ce98ab5d715fa..ffd606ae40037 100644 --- a/x-pack/test/functional/services/monitoring/kibana_overview.js +++ b/x-pack/test/functional/services/monitoring/kibana_overview.js @@ -8,6 +8,7 @@ export function MonitoringKibanaOverviewProvider({ getService }) { const testSubjects = getService('testSubjects'); const retry = getService('retry'); + const find = getService('find'); const SUBJ_OVERVIEW_PAGE = 'kibanaOverviewPage'; const SUBJ_KBN_INSTANCES = 'kibanaInstancesPage'; @@ -15,6 +16,7 @@ export function MonitoringKibanaOverviewProvider({ getService }) { return new (class KibanaOverview { async isOnOverview() { const pageId = await retry.try(() => testSubjects.find(SUBJ_OVERVIEW_PAGE)); + await find.byCssSelector('[data-is-loaded="true"]'); return pageId !== null; } diff --git a/x-pack/test/security_api_integration/fixtures/user_profiles/user_profiles_consumer/server/init_routes.ts b/x-pack/test/security_api_integration/fixtures/user_profiles/user_profiles_consumer/server/init_routes.ts index 8529d034b8b2f..aa45cb7e3bb4f 100644 --- a/x-pack/test/security_api_integration/fixtures/user_profiles/user_profiles_consumer/server/init_routes.ts +++ b/x-pack/test/security_api_integration/fixtures/user_profiles/user_profiles_consumer/server/init_routes.ts @@ -18,6 +18,7 @@ export function initRoutes(core: CoreSetup) { body: schema.object({ name: schema.string(), dataPath: schema.maybe(schema.string()), + size: schema.maybe(schema.number()), requiredAppPrivileges: schema.maybe(schema.arrayOf(schema.string())), }), }, @@ -27,6 +28,7 @@ export function initRoutes(core: CoreSetup) { const profiles = await pluginDeps.security.userProfiles.suggest({ name: request.body.name, dataPath: request.body.dataPath, + size: request.body.size, requiredPrivileges: request.body.requiredAppPrivileges ? { spaceId: pluginDeps.spaces.spacesService.getSpaceId(request), diff --git a/x-pack/test/security_api_integration/tests/user_profiles/get_current.ts b/x-pack/test/security_api_integration/tests/user_profiles/get_current.ts index bb8257174392b..d7f23545aecd0 100644 --- a/x-pack/test/security_api_integration/tests/user_profiles/get_current.ts +++ b/x-pack/test/security_api_integration/tests/user_profiles/get_current.ts @@ -34,7 +34,7 @@ export default function ({ getService }: FtrProviderContext) { password: 'changeme', roles: [`viewer`], full_name: 'User With Profile', - email: 'user_with_profile@elastic.co', + email: 'user_with_profile@get_current_test', }); }); @@ -77,7 +77,7 @@ export default function ({ getService }: FtrProviderContext) { "name": "basic", "type": "basic", }, - "email": "user_with_profile@elastic.co", + "email": "user_with_profile@get_current_test", "full_name": "User With Profile", "realm_name": "default_native", "roles": Array [ @@ -101,7 +101,7 @@ export default function ({ getService }: FtrProviderContext) { "name": "basic", "type": "basic", }, - "email": "user_with_profile@elastic.co", + "email": "user_with_profile@get_current_test", "full_name": "User With Profile", "realm_name": "default_native", "roles": Array [ @@ -124,7 +124,7 @@ export default function ({ getService }: FtrProviderContext) { "name": "basic", "type": "basic", }, - "email": "user_with_profile@elastic.co", + "email": "user_with_profile@get_current_test", "full_name": "User With Profile", "realm_name": "default_native", "roles": Array [ diff --git a/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts b/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts index db3e64244e965..1e45f0edacf37 100644 --- a/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts +++ b/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts @@ -233,6 +233,72 @@ export default function ({ getService }: FtrProviderContext) { `); }); + it('can limit the amount of returned results', async () => { + const allAvailableSuggestions = await supertest + .post('/s/space-a/internal/user_profiles_consumer/_suggest') + .set('kbn-xsrf', 'xxx') + .send({ name: 'elastic', size: 10, requiredAppPrivileges: ['dashboards'] }) + .expect(200); + expect(allAvailableSuggestions.body).to.have.length(3); + expectSnapshot( + allAvailableSuggestions.body.map(({ user, data }: { user: unknown; data: unknown }) => ({ + user, + data, + })) + ).toMatchInline(` + Array [ + Object { + "data": Object {}, + "user": Object { + "email": "two@elastic.co", + "full_name": "TWO", + "username": "user_two", + }, + }, + Object { + "data": Object {}, + "user": Object { + "email": "one@elastic.co", + "full_name": "ONE", + "username": "user_one", + }, + }, + Object { + "data": Object {}, + "user": Object { + "email": "three@elastic.co", + "full_name": "THREE", + "username": "user_three", + }, + }, + ] + `); + + const singleSuggestion = await supertest + .post('/s/space-a/internal/user_profiles_consumer/_suggest') + .set('kbn-xsrf', 'xxx') + .send({ name: 'elastic', size: 1, requiredAppPrivileges: ['dashboards'] }) + .expect(200); + expect(singleSuggestion.body).to.have.length(1); + expectSnapshot( + singleSuggestion.body.map(({ user, data }: { user: unknown; data: unknown }) => ({ + user, + data, + })) + ).toMatchInline(` + Array [ + Object { + "data": Object {}, + "user": Object { + "email": "two@elastic.co", + "full_name": "TWO", + "username": "user_two", + }, + }, + ] + `); + }); + it('can get suggestions with data', async () => { // 1. Update user profile data. await supertestWithoutAuth diff --git a/x-pack/test/threat_intelligence_cypress/visual_config.ts b/x-pack/test/threat_intelligence_cypress/visual_config.ts index bbd487a08b8e2..57844f405657c 100644 --- a/x-pack/test/threat_intelligence_cypress/visual_config.ts +++ b/x-pack/test/threat_intelligence_cypress/visual_config.ts @@ -10,9 +10,9 @@ import { FtrConfigProviderContext } from '@kbn/test'; import { ThreatIntelligenceCypressVisualTestRunner } from './runner'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const securitySolutionCypressConfig = await readConfigFile(require.resolve('./config.ts')); + const tiCypressConfig = await readConfigFile(require.resolve('./config.ts')); return { - ...securitySolutionCypressConfig.getAll(), + ...tiCypressConfig.getAll(), testRunner: ThreatIntelligenceCypressVisualTestRunner, }; diff --git a/yarn.lock b/yarn.lock index 64d1d44e6b790..d9ea619f255ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3339,6 +3339,18 @@ version "0.0.0" uid "" +"@kbn/core-notifications-browser-internal@link:bazel-bin/packages/core/notifications/core-notifications-browser-internal": + version "0.0.0" + uid "" + +"@kbn/core-notifications-browser-mocks@link:bazel-bin/packages/core/notifications/core-notifications-browser-mocks": + version "0.0.0" + uid "" + +"@kbn/core-notifications-browser@link:bazel-bin/packages/core/notifications/core-notifications-browser": + version "0.0.0" + uid "" + "@kbn/core-overlays-browser-internal@link:bazel-bin/packages/core/overlays/core-overlays-browser-internal": version "0.0.0" uid "" @@ -7199,6 +7211,18 @@ version "0.0.0" uid "" +"@types/kbn__core-notifications-browser-internal@link:bazel-bin/packages/core/notifications/core-notifications-browser-internal/npm_module_types": + version "0.0.0" + uid "" + +"@types/kbn__core-notifications-browser-mocks@link:bazel-bin/packages/core/notifications/core-notifications-browser-mocks/npm_module_types": + version "0.0.0" + uid "" + +"@types/kbn__core-notifications-browser@link:bazel-bin/packages/core/notifications/core-notifications-browser/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__core-overlays-browser-internal@link:bazel-bin/packages/core/overlays/core-overlays-browser-internal/npm_module_types": version "0.0.0" uid "" @@ -8329,10 +8353,10 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== -"@types/selenium-webdriver@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.1.tgz#aefb038f0462fd880f9c9581b8b3b71ce385719c" - integrity sha512-NxxZZek50ylIACiXebKQYHD3D4One3WXOasEXWazL6aTfYbZob7ClNKxUpg8I4/oWArX87oPWvj1cHKqfel3Hg== +"@types/selenium-webdriver@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz#9c6d8d6bea08b312e890aaa5915fb2228fa62486" + integrity sha512-NCn1vqHC2hDgZmOuiDa4xgyo3FBZuqB+wXg5t8YcwnjIi2ufGTowqcnbUAKGHxY7z/OFfv4MnaVfuJ7gJ/xBsw== dependencies: "@types/ws" "*"